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

Commit

Permalink
Fancified item switcherido
Browse files Browse the repository at this point in the history
  • Loading branch information
mcmonkey4eva committed May 5, 2017
1 parent 0bcdef1 commit e3e88d0
Show file tree
Hide file tree
Showing 5 changed files with 121 additions and 10 deletions.
Expand Up @@ -2,17 +2,23 @@

import com.denizenscript.denizen2core.events.ScriptEvent;
import com.denizenscript.denizen2core.tags.AbstractTagObject;
import com.denizenscript.denizen2core.tags.objects.IntegerTag;
import com.denizenscript.denizen2core.tags.objects.ListTag;
import com.denizenscript.denizen2core.tags.objects.MapTag;
import com.denizenscript.denizen2core.tags.objects.TextTag;
import com.denizenscript.denizen2core.utilities.Action;
import com.denizenscript.denizen2core.utilities.CoreUtilities;
import com.denizenscript.denizen2sponge.tags.objects.BlockTypeTag;
import com.denizenscript.denizen2sponge.tags.objects.EntityTypeTag;
import com.denizenscript.denizen2sponge.tags.objects.WorldTag;
import com.denizenscript.denizen2sponge.tags.objects.*;
import com.denizenscript.denizen2sponge.utilities.flags.FlagHelper;
import com.denizenscript.denizen2sponge.utilities.flags.FlagMap;
import org.spongepowered.api.block.BlockType;
import org.spongepowered.api.entity.EntityType;
import org.spongepowered.api.item.inventory.ItemStack;
import org.spongepowered.api.world.World;

import java.util.List;
import java.util.Optional;

public class D2SpongeEventHelper {

public static boolean checkBlockType(BlockType btype, ScriptEvent.ScriptEventData data, Action<String> error) {
Expand Down Expand Up @@ -64,18 +70,91 @@ public static boolean checkWorld(World world, ScriptEvent.ScriptEventData data,
}

public static boolean checkHandType(String htype, ScriptEvent.ScriptEventData data, Action<String> error) {
return checkHandType(htype, data, error, "hand");
return checkString(htype, data, error, "hand");
}

public static boolean checkHandType(String htype, ScriptEvent.ScriptEventData data, Action<String> error, String tname) {
public static boolean checkString(String inpStr, ScriptEvent.ScriptEventData data, Action<String> error, String tname) {
if (!data.switches.containsKey(tname)) {
return true;
}
for (AbstractTagObject ato : ListTag.getFor(error, data.switches.get(tname)).getInternal()) {
if (CoreUtilities.toLowerCase((TextTag.getFor(error, ato)).getInternal()).equals(htype)) {
if (!CoreUtilities.toLowerCase((TextTag.getFor(error, ato)).getInternal()).equals(inpStr)) {
return true;
}
}
return false;
}

// <--[explanation]
// @Name Item Switch For Events
// @Group Events
// @Description
// Some events contain an "Item:" switch.
// This is a special-case-switch with sub-options!
//
// For example, you would write "item:type:stick" to check if the item is of TYPE stick!
//
// Note that this syntax additionally allows for multiple options, as well as sub-lists for specific potential options.
// "item:type:stick&pipestone|quantity:5|flagged:best_stick_or_stone"
//
// Options:
// type: (ItemTypeTag) checks if the item type matches.
// Quantity: (IntegerTag) checks if the quantity is at least a value.
// Flagged: (TextTag) checks if the item has a flag.
// -->

public static boolean checkItem(ItemTag itm, ScriptEvent.ScriptEventData data, Action<String> error) {
return checkItem(itm, data, error, "item");
}

public static boolean checkItem(ItemTag itm, ScriptEvent.ScriptEventData data, Action<String> error, String tname) {
if (!data.switches.containsKey(tname)) {
return true;
}
for (AbstractTagObject ato : ListTag.getFor(error, data.switches.get(tname)).getInternal()) {
String val = ato.toString();
List<String> vals = CoreUtilities.split(val, ':', 1);
if (vals.size() < 2) {
continue;
}
String t = CoreUtilities.toLowerCase(vals.get(0));
String v = vals.get(1);
if (t.equals("type")) {
boolean poss = false;
for (AbstractTagObject ato_sub : ListTag.getFor(error, v).getInternal()) {
if (itm.getInternal().getItem().equals(ItemTypeTag.getFor(error, ato_sub).getInternal())) {
poss = true;
}
}
if (!poss) {
return false;
}
}
if (t.equals("quantity")) {
if (itm.getInternal().getQuantity() < IntegerTag.getFor(error, v).getInternal()) {
return false;
}
}
else if (t.equals("flagged")) {
boolean poss = false;
MapTag flags;
Optional<FlagMap> fm = itm.getInternal().get(FlagHelper.FLAGMAP);
if (fm.isPresent()) {
flags = fm.get().flags;
}
else {
flags = new MapTag();
}
for (AbstractTagObject ato_sub : ListTag.getFor(error, v).getInternal()) {
if (flags.getInternal().containsKey(CoreUtilities.toLowerCase(ato_sub.toString()))) {
poss = true;
}
}
if (!poss) {
return false;
}
}
}
return true;
}
}
Expand Up @@ -4,14 +4,18 @@
import com.denizenscript.denizen2core.tags.AbstractTagObject;
import com.denizenscript.denizen2sponge.Denizen2Sponge;
import com.denizenscript.denizen2sponge.events.D2SpongeEventHelper;
import com.denizenscript.denizen2sponge.tags.objects.ItemTag;
import com.denizenscript.denizen2sponge.tags.objects.LocationTag;
import com.denizenscript.denizen2sponge.tags.objects.PlayerTag;
import com.denizenscript.denizen2sponge.utilities.Utilities;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.data.type.HandTypes;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.block.InteractBlockEvent;
import org.spongepowered.api.event.filter.cause.Root;
import org.spongepowered.api.item.ItemTypes;
import org.spongepowered.api.item.inventory.ItemStack;
import org.spongepowered.api.util.blockray.BlockRay;
import org.spongepowered.api.util.blockray.BlockRayHit;
import org.spongepowered.api.world.World;
Expand Down Expand Up @@ -57,7 +61,9 @@ public boolean couldMatch(ScriptEventData data) {

@Override
public boolean matches(ScriptEventData data) {
return D2SpongeEventHelper.checkBlockType(location.getInternal().toLocation().getBlock().getType(), data, this::error);
return D2SpongeEventHelper.checkBlockType(location.getInternal().toLocation().getBlock().getType(), data, this::error)
&& D2SpongeEventHelper.checkItem(new ItemTag(player.getInternal()
.getItemInHand(HandTypes.MAIN_HAND).orElse(ItemStack.of(ItemTypes.NONE, 1))), data, this::error);
}

public PlayerTag player;
Expand Down
Expand Up @@ -5,12 +5,16 @@
import com.denizenscript.denizen2sponge.Denizen2Sponge;
import com.denizenscript.denizen2sponge.events.D2SpongeEventHelper;
import com.denizenscript.denizen2sponge.tags.objects.EntityTag;
import com.denizenscript.denizen2sponge.tags.objects.ItemTag;
import com.denizenscript.denizen2sponge.tags.objects.PlayerTag;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.data.type.HandTypes;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.entity.InteractEntityEvent;
import org.spongepowered.api.event.filter.cause.Root;
import org.spongepowered.api.item.ItemTypes;
import org.spongepowered.api.item.inventory.ItemStack;

import java.util.HashMap;

Expand Down Expand Up @@ -50,7 +54,9 @@ public boolean couldMatch(ScriptEventData data) {

@Override
public boolean matches(ScriptEventData data) {
return D2SpongeEventHelper.checkEntityType(entity.getInternal().getType(), data, this::error);
return D2SpongeEventHelper.checkEntityType(entity.getInternal().getType(), data, this::error)
&& D2SpongeEventHelper.checkItem(new ItemTag(player.getInternal()
.getItemInHand(HandTypes.MAIN_HAND).orElse(ItemStack.of(ItemTypes.NONE, 1))), data, this::error);
}

public PlayerTag player;
Expand Down
Expand Up @@ -6,14 +6,20 @@
import com.denizenscript.denizen2core.utilities.CoreUtilities;
import com.denizenscript.denizen2sponge.Denizen2Sponge;
import com.denizenscript.denizen2sponge.events.D2SpongeEventHelper;
import com.denizenscript.denizen2sponge.tags.objects.ItemTag;
import com.denizenscript.denizen2sponge.tags.objects.ItemTypeTag;
import com.denizenscript.denizen2sponge.tags.objects.LocationTag;
import com.denizenscript.denizen2sponge.tags.objects.PlayerTag;
import com.denizenscript.denizen2sponge.utilities.Utilities;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.data.type.HandType;
import org.spongepowered.api.data.type.HandTypes;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.block.InteractBlockEvent;
import org.spongepowered.api.event.filter.cause.Root;
import org.spongepowered.api.item.ItemTypes;
import org.spongepowered.api.item.inventory.ItemStack;
import org.spongepowered.api.util.blockray.BlockRay;
import org.spongepowered.api.util.blockray.BlockRayHit;
import org.spongepowered.api.world.World;
Expand Down Expand Up @@ -62,7 +68,9 @@ public boolean couldMatch(ScriptEventData data) {
@Override
public boolean matches(ScriptEventData data) {
return D2SpongeEventHelper.checkBlockType(location.getInternal().toLocation().getBlock().getType(), data, this::error)
&& D2SpongeEventHelper.checkHandType(hand.getInternal(), data, this::error);
&& D2SpongeEventHelper.checkHandType(hand.getInternal(), data, this::error)
&& D2SpongeEventHelper.checkItem(new ItemTag(player.getInternal()
.getItemInHand(hInternal).orElse(ItemStack.of(ItemTypes.NONE, 1))), data, this::error);
}

public PlayerTag player;
Expand All @@ -77,6 +85,8 @@ public boolean matches(ScriptEventData data) {

public TextTag hand;

public HandType hInternal;

public InteractBlockEvent.Secondary internal;

@Override
Expand Down Expand Up @@ -121,6 +131,7 @@ public void onRightClickBlock(InteractBlockEvent.Secondary evt, @Root Player pla
event.intersection_point = new LocationTag(brh.getPosition().sub(brh.getBlockPosition().toDouble()));
event.impact_normal = new LocationTag(0, 0, 0);
}
event.hInternal = evt.getHandType();
event.hand = new TextTag(CoreUtilities.toLowerCase(evt.getHandType().toString()));
event.cancelled = evt.isCancelled();
event.run();
Expand Down
Expand Up @@ -7,12 +7,16 @@
import com.denizenscript.denizen2sponge.Denizen2Sponge;
import com.denizenscript.denizen2sponge.events.D2SpongeEventHelper;
import com.denizenscript.denizen2sponge.tags.objects.EntityTag;
import com.denizenscript.denizen2sponge.tags.objects.ItemTag;
import com.denizenscript.denizen2sponge.tags.objects.PlayerTag;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.data.type.HandType;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.entity.InteractEntityEvent;
import org.spongepowered.api.event.filter.cause.Root;
import org.spongepowered.api.item.ItemTypes;
import org.spongepowered.api.item.inventory.ItemStack;

import java.util.HashMap;

Expand Down Expand Up @@ -55,7 +59,9 @@ public boolean couldMatch(ScriptEventData data) {
@Override
public boolean matches(ScriptEventData data) {
return D2SpongeEventHelper.checkEntityType(entity.getInternal().getType(), data, this::error)
&& D2SpongeEventHelper.checkHandType(hand.getInternal(), data, this::error);
&& D2SpongeEventHelper.checkHandType(hand.getInternal(), data, this::error)
&& D2SpongeEventHelper.checkItem(new ItemTag(player.getInternal()
.getItemInHand(hInternal).orElse(ItemStack.of(ItemTypes.NONE, 1))), data, this::error);
}

public PlayerTag player;
Expand All @@ -64,6 +70,8 @@ public boolean matches(ScriptEventData data) {

public TextTag hand;

public HandType hInternal;

public InteractEntityEvent.Secondary internal;

@Override
Expand Down Expand Up @@ -91,6 +99,7 @@ public void onRightClickEntity(InteractEntityEvent.Secondary evt, @Root Player p
event.internal = evt;
event.player = new PlayerTag(player);
event.entity = new EntityTag(evt.getTargetEntity());
event.hInternal = evt.getHandType();
event.hand = new TextTag(CoreUtilities.toLowerCase(evt.getHandType().toString()));
event.cancelled = evt.isCancelled();
event.run();
Expand Down

0 comments on commit e3e88d0

Please sign in to comment.