Skip to content

Commit

Permalink
Respect ITEM_CLICK cancellation
Browse files Browse the repository at this point in the history
Also added hand option for CONSUME
  • Loading branch information
imDaniX committed Aug 13, 2023
1 parent a7e660b commit 7c1587d
Show file tree
Hide file tree
Showing 6 changed files with 69 additions and 60 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import fun.reactions.model.activators.ActivationContext;
import fun.reactions.model.activators.Activator;
import fun.reactions.model.environment.Variables;
import fun.reactions.module.basics.ContextManager;
import fun.reactions.module.basics.activators.BlockBreakActivator;
import fun.reactions.module.basics.activators.DamageActivator;
import fun.reactions.module.basics.activators.DropActivator;
Expand Down Expand Up @@ -62,6 +61,7 @@
import java.util.List;
import java.util.Optional;

import static fun.reactions.module.basics.ContextManager.*;
import static fun.reactions.module.basics.ItemContextManager.triggerItemHold;
import static fun.reactions.module.basics.ItemContextManager.triggerItemWear;

Expand Down Expand Up @@ -91,7 +91,7 @@ public void onAttackEvent(EntityDamageByEntityEvent event) {

@EventHandler(ignoreCancelled = true)
public void onTeleport(PlayerTeleportEvent event) {
Optional<Variables> optVars = ContextManager.triggerTeleport(
Optional<Variables> optVars = triggerTeleport(
event.getPlayer(),
event.getCause(),
event.getTo());
Expand All @@ -105,15 +105,15 @@ public void onTeleport(PlayerTeleportEvent event) {
public void onInteractAtEntity(PlayerInteractAtEntityEvent event) {
if (event.getHand() != EquipmentSlot.HAND) return;
if (event.getRightClicked().getType() != EntityType.ARMOR_STAND) return;
if (ContextManager.triggerMobClick(event.getPlayer(), (LivingEntity) event.getRightClicked()))
if (triggerMobClick(event.getPlayer(), (LivingEntity) event.getRightClicked()))
event.setCancelled(true);
}

@EventHandler
public void onChat(AsyncPlayerChatEvent event) {
// TODO: That's not really good solution
try {
Optional<Variables> optVars = ContextManager.triggerMessage(event.getPlayer(),
Optional<Variables> optVars = triggerMessage(event.getPlayer(),
MessageActivator.Source.CHAT_INPUT,
event.getMessage());
if (optVars.isEmpty()) return;
Expand All @@ -129,13 +129,13 @@ public void onChat(AsyncPlayerChatEvent event) {

@EventHandler(ignoreCancelled = true)
public void onServerCommand(ServerCommandEvent event) {
if (ContextManager.triggerPrecommand(null, event.getSender(), event.getCommand()))
if (triggerPrecommand(null, event.getSender(), event.getCommand()))
event.setCancelled(true);
}

@EventHandler(ignoreCancelled = true)
public void onPlayerCommand(PlayerCommandPreprocessEvent event) {
if (ContextManager.triggerPrecommand(event.getPlayer(), event.getPlayer(), event.getMessage().substring(1)))
if (triggerPrecommand(event.getPlayer(), event.getPlayer(), event.getMessage().substring(1)))
event.setCancelled(true);
}

Expand All @@ -153,7 +153,7 @@ public void onSignChange(SignChangeEvent event) {

@EventHandler(ignoreCancelled = true)
public void onItemHeld(PlayerItemHeldEvent event) {
if (ContextManager.triggerItemHeld(event.getPlayer(), event.getNewSlot(), event.getPreviousSlot()))
if (triggerItemHeld(event.getPlayer(), event.getNewSlot(), event.getPreviousSlot()))
event.setCancelled(true);
else {
triggerItemHold(event.getPlayer());
Expand All @@ -176,29 +176,31 @@ public void onInventoryClose(InventoryCloseEvent event) {
@EventHandler(ignoreCancelled = true)
public void onPlayerDeath(PlayerDeathEvent event) {
PlayerRespawner.addPlayerRespawn(event);
ContextManager.triggerPvpKill(event);
ContextManager.triggerPvpDeath(event);
triggerPvpKill(event);
triggerPvpDeath(event);
}

@EventHandler(ignoreCancelled = true)
public void onItemConsume(PlayerItemConsumeEvent event) {
if (ContextManager.triggerItemConsume(event))
if (triggerItemConsume(event))
event.setCancelled(true);
}

@EventHandler
public void onPlayerClickMob(PlayerInteractEntityEvent event) {
ContextManager.triggerItemClick(event);
if (triggerItemClick(event)) {
event.setCancelled(true);
}
if (!(event.getRightClicked() instanceof LivingEntity)) return;
if (event.getHand() != EquipmentSlot.HAND) return;
ContextManager.triggerMobClick(event.getPlayer(), (LivingEntity) event.getRightClicked());
triggerMobClick(event.getPlayer(), (LivingEntity) event.getRightClicked());
}

@EventHandler(ignoreCancelled = true)
public void onPlayerRespawn(PlayerRespawnEvent event) {
// TODO: Set respawn location
PlayerRespawner.triggerPlayerRespawn(event.getPlayer(), event.getRespawnLocation());
ContextManager.triggerAllRegions(event.getPlayer(), event.getRespawnLocation(), event.getPlayer().getLocation());
triggerAllRegions(event.getPlayer(), event.getRespawnLocation(), event.getPlayer().getLocation());
}

@EventHandler(ignoreCancelled = true)
Expand All @@ -217,15 +219,15 @@ public void onEntityDeath(EntityDeathEvent event) {
Player killer = EntityUtils.getKillerPlayer(event.getEntity().getLastDamageCause());
if (killer == null) return;

ContextManager.triggerMobKill(killer, event.getEntity());
triggerMobKill(killer, event.getEntity());
if (event.getEntity().hasMetadata("ReActions-money") && RaVault.isEconomyConnected()) {
int money = Rng.nextIntRanged(event.getEntity().getMetadata("ReActions-money").get(0).asString());
RaVault.creditAccount(killer.getName(), "", Double.toString(money), "");
Msg.MSG_MOBBOUNTY.print(killer, 'e', '6', RaVault.format(money, ""), event.getEntity().getType().name());
}
if (event.getEntity().hasMetadata("ReActions-activator")) {
String exec = event.getEntity().getMetadata("ReActions-activator").get(0).asString();
ContextManager.triggerFunction(killer, exec, new Variables());
triggerFunction(killer, exec, new Variables());
}

}
Expand All @@ -246,7 +248,7 @@ public void onMobGrowl(PlayerAttacksEntityEvent event) {

@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onMobDamageByPlayer(PlayerAttacksEntityEvent event) {
Optional<Variables> optVars = ContextManager.triggerMobDamage(event.getPlayer(), event.getEntity(), event.getDamage(), event.getFinalDamage(), event.getCause());
Optional<Variables> optVars = triggerMobDamage(event.getPlayer(), event.getEntity(), event.getDamage(), event.getFinalDamage(), event.getCause());
if (optVars.isEmpty()) return;
Variables vars = optVars.get();
vars.getChanged(ActivationContext.CANCEL_EVENT, Boolean::valueOf).ifPresent(event::setCancelled);
Expand All @@ -269,7 +271,7 @@ public void onPlayerDamage(EntityDamageEvent event) {
String source;
if (event instanceof EntityDamageByEntityEvent evdmg) {
source = "ENTITY";
Optional<Variables> optVars = ContextManager.triggerDamageByMob(evdmg);;
Optional<Variables> optVars = triggerDamageByMob(evdmg);;
if (optVars.isPresent()) {
Variables vars = optVars.get();
vars.getChanged(DamageActivator.Context.DAMAGE, NumberUtils::asDouble).ifPresent(event::setDamage);
Expand All @@ -279,7 +281,7 @@ public void onPlayerDamage(EntityDamageEvent event) {
source = "BLOCK";
Block blockDamager = evdmg.getDamager();
if (blockDamager != null) {
Optional<Variables> optVars = ContextManager.triggerDamageByBlock(evdmg, blockDamager);
Optional<Variables> optVars = triggerDamageByBlock(evdmg, blockDamager);
if (optVars.isPresent()) {
Variables vars = optVars.get();
vars.getChanged(DamageActivator.Context.DAMAGE, NumberUtils::asDouble).ifPresent(event::setDamage);
Expand All @@ -290,7 +292,7 @@ public void onPlayerDamage(EntityDamageEvent event) {
source = "OTHER";
}

Optional<Variables> optVars = ContextManager.triggerDamage(event, source);
Optional<Variables> optVars = triggerDamage(event, source);
if (optVars.isPresent()) {
Variables vars = optVars.get();
vars.getChanged(DamageActivator.Context.DAMAGE, NumberUtils::asDouble).ifPresent(event::setDamage);
Expand Down Expand Up @@ -333,9 +335,9 @@ public void onPlayerJoin(PlayerJoinEvent event) {
RaDebug.offPlayerDebug(player);
MoveListener.initLocation(player);

ContextManager.triggerJoin(player, !player.hasPlayedBefore());
ContextManager.triggerAllRegions(player, player.getLocation(), null);
ContextManager.triggerCuboid(player);
triggerJoin(player, !player.hasPlayedBefore());
triggerAllRegions(player, player.getLocation(), null);
triggerCuboid(player);
triggerItemHold(player);
triggerItemWear(player);
}
Expand All @@ -345,21 +347,23 @@ public void onSignClick(PlayerInteractEvent event) {
if (event.getAction() != Action.LEFT_CLICK_BLOCK && event.getAction() != Action.RIGHT_CLICK_BLOCK) return;
if (!BlockUtils.isSign(event.getClickedBlock())) return;
Sign sign = (Sign) event.getClickedBlock().getState();
if (ContextManager.triggerSign(event.getPlayer(), sign.getLines(), event.getClickedBlock().getLocation(), event.getAction() == Action.LEFT_CLICK_BLOCK))
if (triggerSign(event.getPlayer(), sign.getLines(), event.getClickedBlock().getLocation(), event.getAction() == Action.LEFT_CLICK_BLOCK))
event.setCancelled(true);
}

// TODO: Rework
@EventHandler
public void onPlayerInteract(PlayerInteractEvent event) {
ContextManager.triggerItemClick(event);
if (triggerItemClick(event)) {
event.setCancelled(true);
}
triggerItemWear(event.getPlayer());
if (
ContextManager.triggerPlate(event) ||
(ContextManager.triggerBlockClick(event) |
ContextManager.triggerButton(event)) ||
ContextManager.triggerLever(event) ||
ContextManager.triggerDoor(event)
triggerPlate(event) ||
(triggerBlockClick(event) |
triggerButton(event)) ||
triggerLever(event) ||
triggerDoor(event)
) {
event.setCancelled(true);
}
Expand All @@ -368,14 +372,14 @@ public void onPlayerInteract(PlayerInteractEvent event) {
@EventHandler(ignoreCancelled = true)
public void onPlayerTeleport(PlayerTeleportEvent event) {
Teleporter.startTeleport(event);
ContextManager.triggerCuboid(event.getPlayer());
ContextManager.triggerAllRegions(event.getPlayer(), event.getTo(), event.getFrom());
triggerCuboid(event.getPlayer());
triggerAllRegions(event.getPlayer(), event.getTo(), event.getFrom());
Teleporter.stopTeleport(event.getPlayer());
}

@EventHandler(ignoreCancelled = true)
public void onInventoryClick(InventoryClickEvent event) {
Optional<Variables> optVars = ContextManager.triggerInventoryClick(event);
Optional<Variables> optVars = triggerInventoryClick(event);
if (optVars.isEmpty()) return;
Variables vars = optVars.get();
vars.getChanged(InventoryClickActivator.Context.ITEM, VirtualItem::asItemStack).ifPresent(event::setCurrentItem);
Expand All @@ -384,7 +388,7 @@ public void onInventoryClick(InventoryClickEvent event) {

@EventHandler(ignoreCancelled = true)
public void onDrop(PlayerDropItemEvent event) {
Optional<Variables> optVars = ContextManager.triggerDrop(event.getPlayer(), event.getItemDrop(), event.getItemDrop().getPickupDelay());
Optional<Variables> optVars = triggerDrop(event.getPlayer(), event.getItemDrop(), event.getItemDrop().getPickupDelay());
if (optVars.isEmpty()) return;
Variables vars = optVars.get();
vars.getChanged(ActivationContext.CANCEL_EVENT, Boolean::valueOf).ifPresent(event::setCancelled);
Expand All @@ -394,19 +398,19 @@ public void onDrop(PlayerDropItemEvent event) {

@EventHandler(ignoreCancelled = true)
public void onFlight(PlayerToggleFlightEvent event) {
if (ContextManager.triggerFlight(event.getPlayer(), event.isFlying())) event.setCancelled(true);
if (triggerFlight(event.getPlayer(), event.isFlying())) event.setCancelled(true);
}

@EventHandler
public void onEntityClick(PlayerInteractEntityEvent event) {
if (event.getHand() != EquipmentSlot.HAND) return;
if (ContextManager.triggerEntityClick(event.getPlayer(), event.getRightClicked()))
if (triggerEntityClick(event.getPlayer(), event.getRightClicked()))
event.setCancelled(true);
}

@EventHandler(ignoreCancelled = true)
public void onBlockBreak(BlockBreakEvent event) {
Optional<Variables> optVars = ContextManager.triggerBlockBreak(event.getPlayer(), event.getBlock(), event.isDropItems());
Optional<Variables> optVars = triggerBlockBreak(event.getPlayer(), event.getBlock(), event.isDropItems());
if (optVars.isEmpty()) return;
Variables vars = optVars.get();
vars.getChanged(BlockBreakActivator.Context.DO_DROP, Boolean::parseBoolean).ifPresent(event::setDropItems);
Expand All @@ -415,13 +419,13 @@ public void onBlockBreak(BlockBreakEvent event) {

@EventHandler(ignoreCancelled = true)
public void onSneak(PlayerToggleSneakEvent event) {
ContextManager.triggerSneak(event);
triggerSneak(event);
}

@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
TemporaryOp.removeOp(event.getPlayer());
Optional<Variables> optVars = ContextManager.triggerQuit(event);
Optional<Variables> optVars = triggerQuit(event);
if (optVars.isPresent()){
optVars.get().getChanged(QuitActivator.Context.QUIT_MESSAGE).ifPresent(event::setQuitMessage);
}
Expand All @@ -430,13 +434,13 @@ public void onPlayerQuit(PlayerQuitEvent event) {

@EventHandler(ignoreCancelled = true)
public void onGameModeChange(PlayerGameModeChangeEvent event) {
if (ContextManager.triggerGamemode(event.getPlayer(), event.getNewGameMode()))
if (triggerGamemode(event.getPlayer(), event.getNewGameMode()))
event.setCancelled(true);
}

@EventHandler(ignoreCancelled = true)
public void onWeatherChange(WeatherChangeEvent event) {
if (ContextManager.triggerWeatherChange(event.getWorld().getName(), event.toWeatherState()))
if (triggerWeatherChange(event.getWorld().getName(), event.toWeatherState()))
event.setCancelled(true);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ public static boolean triggerDoor(PlayerInteractEvent event) {
}

public static boolean triggerItemConsume(PlayerItemConsumeEvent event) {
ItemConsumeActivator.Context ce = new ItemConsumeActivator.Context(event.getPlayer(), event.getItem(), event.getPlayer().getInventory().getItemInMainHand().isSimilar(event.getItem()));
ConsumeActivator.Context ce = new ConsumeActivator.Context(event.getPlayer(), event.getItem(), event.getHand());
activate(ce);
return ce.isCancelled();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ public void preRegister(@NotNull ReActions.Platform platform) {
typeOf(MobKillActivator.class, "MOB_KILL", MobKillActivator::create, MobKillActivator::load),
typeOf(MobDamageActivator.class, "MOB_DAMAGE", MobDamageActivator::create, MobDamageActivator::load),
typeOf(ItemClickActivator.class, "ITEM_CLICK", ItemClickActivator::create, ItemClickActivator::load),
typeOf(ItemConsumeActivator.class, "ITEM_CONSUME", ItemConsumeActivator::create, ItemConsumeActivator::load),
typeOf(ConsumeActivator.class, "CONSUME", ConsumeActivator::create, ConsumeActivator::load),
typeOf(ItemHoldActivator.class, "ITEM_HOLD", ItemHoldActivator::create, ItemHoldActivator::load),
typeOf(ItemHeldActivator.class, "ITEM_HELD", ItemHeldActivator::create, ItemHeldActivator::load),
typeOf(ItemWearActivator.class, "ITEM_WEAR", ItemWearActivator::create, ItemWearActivator::load),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,36 +26,41 @@
import fun.reactions.model.activators.ActivationContext;
import fun.reactions.model.activators.Activator;
import fun.reactions.model.environment.Variable;
import fun.reactions.util.enums.HandType;
import fun.reactions.util.item.ItemUtils;
import fun.reactions.util.item.VirtualItem;
import fun.reactions.util.naming.Aliased;
import fun.reactions.util.parameter.Parameters;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;

import java.util.HashMap;
import java.util.Map;

@Aliased.Names({"CONSUME", "EAT"})
public class ItemConsumeActivator extends Activator {
@Aliased.Names({"ITEM_CONSUME", "EAT"})
public class ConsumeActivator extends Activator {
private final VirtualItem item;
// TODO: Hand option
private final HandType hand;

private ItemConsumeActivator(Logic base, String item) {
private ConsumeActivator(Logic base, String item, HandType hand) {
super(base);
this.item = VirtualItem.fromString(item);
this.hand = hand;
}

public static ItemConsumeActivator create(Logic base, Parameters param) {
public static ConsumeActivator create(Logic base, Parameters param) {
String item = param.getString("item", param.origin());
return new ItemConsumeActivator(base, item);
HandType hand = param.get("hand", HandType::getByName);
return new ConsumeActivator(base, item, hand);
}

public static ItemConsumeActivator load(Logic base, ConfigurationSection cfg) {
public static ConsumeActivator load(Logic base, ConfigurationSection cfg) {
String item = cfg.getString("item", "");
return new ItemConsumeActivator(base, item);
HandType hand = HandType.getByName(cfg.getString("hand", "ANY"));
return new ConsumeActivator(base, item, hand);
}

public boolean checkContext(@NotNull ActivationContext context) {
Expand All @@ -65,35 +70,35 @@ public boolean checkContext(@NotNull ActivationContext context) {

public void saveOptions(@NotNull ConfigurationSection cfg) {
cfg.set("item", item.toString());
cfg.set("hand", hand.name());
}

public String toString() {
String sb = super.toString() + " (" +
return super.toString() + " (" +
this.item +
")";
return sb;
}

public static class Context extends ActivationContext {
private final ItemStack item;
private final boolean mainHand;
private final EquipmentSlot hand;

public Context(Player p, ItemStack item, boolean mainHand) {
public Context(Player p, ItemStack item, EquipmentSlot hand) {
super(p);
this.item = item;
this.mainHand = mainHand;
this.hand = hand;
}

@Override
public @NotNull Class<? extends Activator> getType() {
return ItemConsumeActivator.class;
return ConsumeActivator.class;
}

@Override
protected @NotNull Map<String, Variable> prepareVariables() {
Map<String, Variable> vars = new HashMap<>();
vars.put(CANCEL_EVENT, Variable.property(false));
vars.put("hand", Variable.simple(mainHand ? "MAIN" : "OFF"));
vars.put("hand", Variable.simple(hand == EquipmentSlot.HAND ? "MAIN" : "SECOND"));
if (item != null) {
vars.put("item", Variable.lazy(() -> VirtualItem.asString(item)));
vars.put("item-str", Variable.lazy(() -> ItemUtils.toDisplayString(item)));
Expand Down
Loading

0 comments on commit 7c1587d

Please sign in to comment.