Skip to content
This repository has been archived by the owner on Apr 12, 2022. It is now read-only.

Commit

Permalink
Basic Inventory Tags (#31)
Browse files Browse the repository at this point in the history
* Basic player, entity and block inventories

Lacks support for slots inside furnaces, anvils, etc

* Handle Error Cases

Especifically blocks with no inventories.

* Clearer Documentation

Default range for entities_on_cursor.
  • Loading branch information
Xenmai authored and mcmonkey4eva committed Sep 4, 2017
1 parent f14654e commit 244c354
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 16 deletions.
Expand Up @@ -17,17 +17,12 @@
import org.spongepowered.api.data.type.HandTypes;
import org.spongepowered.api.entity.ArmorEquipable;
import org.spongepowered.api.entity.Entity;
import org.spongepowered.api.entity.Equipable;
import org.spongepowered.api.entity.living.Living;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.item.ItemType;
import org.spongepowered.api.item.ItemTypes;
import org.spongepowered.api.item.inventory.Carrier;
import org.spongepowered.api.item.inventory.ItemStack;
import org.spongepowered.api.item.inventory.equipment.EquipmentType;
import org.spongepowered.api.item.inventory.equipment.EquipmentTypes;
import org.spongepowered.api.util.AABB;
import org.spongepowered.api.world.World;
import org.spongepowered.api.world.extent.EntityUniverse;

import java.util.*;

Expand Down Expand Up @@ -385,6 +380,14 @@ public String friendlyName() {
}
return new DurationTag(opt.get() / 20.0);
});
// <--[tag]
// @Name EntityTag.inventory
// @Updated 2017/06/13
// @Group Current Information
// @ReturnType InventoryTag
// @Returns the inventory this entity is carrying.
// -->
handlers.put("inventory", (dat, obj) -> new InventoryTag(((Carrier) ((EntityTag) obj).internal).getInventory()));
}

public static EntityTag getFor(Action<String> error, String text) {
Expand Down
Expand Up @@ -2,7 +2,10 @@

import com.denizenscript.denizen2core.tags.AbstractTagObject;
import com.denizenscript.denizen2core.tags.TagData;
import com.denizenscript.denizen2core.tags.objects.*;
import com.denizenscript.denizen2core.tags.objects.BooleanTag;
import com.denizenscript.denizen2core.tags.objects.IntegerTag;
import com.denizenscript.denizen2core.tags.objects.NullTag;
import com.denizenscript.denizen2core.tags.objects.TextTag;
import com.denizenscript.denizen2core.utilities.Action;
import com.denizenscript.denizen2core.utilities.CoreUtilities;
import com.denizenscript.denizen2core.utilities.Function2;
Expand All @@ -14,8 +17,12 @@
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.item.inventory.Carrier;
import org.spongepowered.api.item.inventory.Inventory;
import org.spongepowered.api.item.inventory.ItemStack;
import org.spongepowered.api.item.inventory.entity.MainPlayerInventory;
import org.spongepowered.api.item.inventory.entity.PlayerInventory;
import org.spongepowered.api.item.inventory.property.SlotIndex;
import org.spongepowered.api.item.inventory.type.CarriedInventory;
import org.spongepowered.api.item.inventory.type.OrderedInventory;
import org.spongepowered.api.world.LocatableBlock;
import org.spongepowered.api.world.World;

Expand Down Expand Up @@ -61,6 +68,41 @@ public Inventory getInternal() {
// @Example "block/0,1,2,world" .size might return "36".
// -->
handlers.put("size", (dat, obj) -> new IntegerTag(((InventoryTag) obj).internal.size()));
// @Name InventoryTag.contains[<ItemTag>]
// @Updated 2017/06/17
// @Group General Information
// @ReturnType BooleanTag
// @Returns whether the inventory contains the specified quantity or more of the specified item.
// @Example "block/0,1,2,world" .contains[diamond/3] might return "false".
// -->
handlers.put("contains", (dat, obj) -> new BooleanTag(((InventoryTag) obj).internal.contains(ItemTag.getFor(dat.error, dat.getNextModifier()).getInternal())));
// @Name InventoryTag.contains_any[<ItemTag>]
// @Updated 2017/06/17
// @Group General Information
// @ReturnType BooleanTag
// @Returns whether the inventory contains any quantity of the specified item.
// @Example "block/0,1,2,world" .contains_any[diamond] might return "true".
// -->
handlers.put("contains_any", (dat, obj) -> new BooleanTag(((InventoryTag) obj).internal.containsAny(ItemTag.getFor(dat.error, dat.getNextModifier()).getInternal())));
// @Name InventoryTag.slot[<IntegerTag>]
// @Updated 2017/06/17
// @Group General Information
// @ReturnType ItemTag
// @Returns the item in the inventory's specified slot.
// @Example "block/0,1,2,world" .slot[8] might return "diamond".
// -->
handlers.put("slot", (dat, obj) -> {
Inventory inventory = ((InventoryTag) obj).internal;
int slot = (int) IntegerTag.getFor(dat.error, dat.getNextModifier()).getInternal();
if (slot < 1 || slot > inventory.capacity()) {
if (!dat.hasFallback()) {
dat.error.run("Invalid slot index specified!");
}
return new NullTag();
}
ItemStack item = ((OrderedInventory) inventory.query(OrderedInventory.class)).peek(new SlotIndex(slot - 1)).orElseGet(ItemStack::empty);
return new ItemTag(item);
});
}

public static InventoryTag getFor(Action<String> error, String text) {
Expand Down Expand Up @@ -120,8 +162,8 @@ public String toString(boolean unks) {
if (remAs != null) {
return "shared/" + remAs;
}
if (internal instanceof PlayerInventory) {
return "player/" + ((PlayerInventory) internal).getCarrier().get().getUniqueId().toString();
if (internal instanceof MainPlayerInventory) {
return "player/" + ((PlayerInventory) (internal).parent()).getCarrier().get().getUniqueId().toString();
}
else if (internal instanceof CarriedInventory) {
Object o = ((CarriedInventory) internal).getCarrier().orElse(null);
Expand Down
@@ -1,16 +1,18 @@
package com.denizenscript.denizen2sponge.tags.objects;

import com.denizenscript.denizen2core.tags.objects.*;
import com.denizenscript.denizen2sponge.utilities.DataKeys;
import com.flowpowered.math.vector.Vector3d;
import com.denizenscript.denizen2core.tags.AbstractTagObject;
import com.denizenscript.denizen2core.tags.TagData;
import com.denizenscript.denizen2core.tags.objects.*;
import com.denizenscript.denizen2core.utilities.Action;
import com.denizenscript.denizen2core.utilities.CoreUtilities;
import com.denizenscript.denizen2core.utilities.Function2;
import com.denizenscript.denizen2sponge.utilities.DataKeys;
import com.denizenscript.denizen2sponge.utilities.UtilLocation;
import com.flowpowered.math.vector.Vector3d;
import com.flowpowered.math.vector.Vector3i;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.block.tileentity.TileEntity;
import org.spongepowered.api.block.tileentity.carrier.TileEntityCarrier;
import org.spongepowered.api.data.key.Key;
import org.spongepowered.api.data.key.Keys;
import org.spongepowered.api.entity.Entity;
Expand Down Expand Up @@ -397,6 +399,23 @@ && LengthSquared(le.sub(loc.toVector3d())) < range * range) {
outputMap.getInternal().put("location", new LocationTag(opt.get().getBlockPosition(), opt.get().getExtent()));
return outputMap;
});
// <--[tag]
// @Name LocationTag.inventory
// @Updated 2017/08/31
// @Group Properties
// @ReturnType InventoryTag
// @Returns the inventory the tile entity at this location is holding.
// -->
handlers.put("inventory", (dat, obj) -> {
Optional<TileEntity> te = ((LocationTag) obj).internal.toLocation().getTileEntity();
if (!te.isPresent()) {
if (!dat.hasFallback()) {
dat.error.run("The block at this location is not a valid tile entity, so it can't contain an inventory!");
}
return new NullTag();
}
return new InventoryTag(((TileEntityCarrier) te.get()).getInventory());
});
}

public static double LengthSquared(Location<World> loc) {
Expand Down
Expand Up @@ -10,7 +10,7 @@
import org.spongepowered.api.data.key.Keys;
import org.spongepowered.api.entity.Entity;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.entity.living.player.gamemode.GameModes;
import org.spongepowered.api.item.inventory.entity.UserInventory;
import org.spongepowered.api.item.inventory.entity.PlayerInventory;
import org.spongepowered.api.util.blockray.BlockRay;
import org.spongepowered.api.world.extent.EntityUniverse;
Expand Down Expand Up @@ -100,7 +100,8 @@ public Player getInternal() {
// @Group Current Information
// @ReturnType ListTag<EntityTag>
// @Returns a list of entities of a specified type (or any type if unspecified) intersecting with
// the line of sight of the player. Input is type:<EntityTypeTag>|range:<NumberTag>
// the line of sight of the player. If no range is specified, it defaults to the player's hand reach.
// Input is type:<EntityTypeTag>|range:<NumberTag>
// -->
handlers.put("entities_on_cursor", (dat, obj) -> {
ListTag list = new ListTag();
Expand All @@ -109,7 +110,13 @@ public Player getInternal() {
if (map.getInternal().containsKey("type")) {
requiredTypeTag = EntityTypeTag.getFor(dat.error, map.getInternal().get("type"));
}
double range = NumberTag.getFor(dat.error, map.getInternal().get("range")).getInternal();
double range;
if (map.getInternal().containsKey("range")) {
range = NumberTag.getFor(dat.error, map.getInternal().get("range")).getInternal();
}
else {
range = (Utilities.getHandReach(((PlayerTag) obj).internal));
}
Player source = ((PlayerTag) obj).getInternal();
Set<EntityUniverse.EntityHit> entHits = source.getWorld().getIntersectingEntities(source, range);
for (EntityUniverse.EntityHit entHit : entHits) {
Expand Down Expand Up @@ -159,7 +166,15 @@ public Player getInternal() {
// @ReturnType IntegerTag
// @Returns the index of the hotbar slot that is currently selected by the player.
// -->
handlers.put("selected_slot", (dat, obj) -> new IntegerTag(((PlayerInventory)((PlayerTag) obj).internal.getInventory()).getHotbar().getSelectedSlotIndex() + 1));
handlers.put("selected_slot", (dat, obj) -> new IntegerTag(((PlayerInventory) ((PlayerTag) obj).internal.getInventory()).getHotbar().getSelectedSlotIndex() + 1));
// <--[tag]
// @Name PlayerTag.inventory
// @Updated 2017/08/31
// @Group Properties
// @ReturnType InventoryTag
// @Returns the inventory this player is carrying. Equipment is not included.
// -->
handlers.put("inventory", (dat, obj) -> new InventoryTag(((UserInventory) ((PlayerTag) obj).internal.getInventory()).getMain()));
}

public static PlayerTag getFor(Action<String> error, String text) {
Expand Down

0 comments on commit 244c354

Please sign in to comment.