Browse Source

overworked all snuvi events

Kajetan Johannes Hammerle 4 years ago
parent
commit
15cea724a2

+ 1 - 4
src/main/java/me/km/entities/EntityHuman.java

@@ -132,10 +132,7 @@ public class EntityHuman extends CreatureEntity {
             return false;
         }
         if(!world.isRemote) {
-            Entity ent = source.getTrueSource();
-            if(ent instanceof ModEntityPlayerMP) {
-                Server.scriptEvents.onHumanHurt((ModEntityPlayerMP) ent, this);
-            }
+            Server.scriptEvents.onHumanHurt(source.getTrueSource(), this);
         }
         return false;
     }

+ 2 - 6
src/main/java/me/km/entities/EntityItemProjectile.java

@@ -66,16 +66,12 @@ public class EntityItemProjectile extends ItemEntity implements IProjectile {
 
     private void onImpact(RayTraceResult ray) {
         if(damage == -1) {
-            if(!(owner instanceof ModEntityPlayerMP)) {
-                return;
-            }
-            ModEntityPlayerMP p = (ModEntityPlayerMP) owner;
             switch(ray.getType()) {
                 case ENTITY:
-                    Server.scriptEvents.onEntityItemProjectileHit(this, p, this.getItem(), ((EntityRayTraceResult) ray).getEntity(), null);
+                    Server.scriptEvents.onEntityItemProjectileHit(this, owner, this.getItem(), ((EntityRayTraceResult) ray).getEntity(), null);
                     break;
                 case BLOCK:
-                    Server.scriptEvents.onEntityItemProjectileHit(this, p, this.getItem(), null, ((BlockRayTraceResult) ray).getPos());
+                    Server.scriptEvents.onEntityItemProjectileHit(this, owner, this.getItem(), null, ((BlockRayTraceResult) ray).getPos());
                     break;
             }
         } else if(ray.getType() == RayTraceResult.Type.ENTITY) {

+ 4 - 11
src/main/java/me/km/items/ModItems.java

@@ -230,13 +230,6 @@ public class ModItems {
                 new Food.Builder().setAlwaysEdible().fastToEat().build()));
     }
 
-    private static Item newEffectHerb(Effect effect, int duration, int amplifier) {
-        return new Item(new Properties().group(ItemGroup.FOOD).food(
-                new Food.Builder().setAlwaysEdible().fastToEat()
-                        .effect(new EffectInstance(effect, duration, amplifier), 1.0f)
-                        .build()));
-    }
-
     private static Item newFood(int food, float saturation) {
         return new Item(new Properties().group(ItemGroup.FOOD).food(
                 new Food.Builder().hunger(food).saturation(saturation).build()));
@@ -390,13 +383,13 @@ public class ModItems {
         gear = register(r, newItem(ItemGroup.MISC), "gear");
 
         // herbs
-        herbStrong = register(r, newEffectHerb(Effects.SPEED, 6000, 1), "herb_strong");
-        herbShadow = register(r, newEffectHerb(Effects.NIGHT_VISION, 3600, 0), "herb_shadow");
+        herbStrong = register(r, newHerb(), "herb_strong");
+        herbShadow = register(r, newHerb(), "herb_shadow");
         herbXp = register(r, newHerb(), "herb_xp");
         herbSea = register(r, newHerb(), "herb_sea");
         herbGold = register(r, newHerb(), "herb_gold");
-        herbBreathing = register(r, newEffectHerb(Effects.WATER_BREATHING, 2400, 0), "herb_breathing");
-        herbFire = register(r, newEffectHerb(Effects.FIRE_RESISTANCE, 2400, 0), "herb_fire");
+        herbBreathing = register(r, newHerb(), "herb_breathing");
+        herbFire = register(r, newHerb(), "herb_fire");
 
         // skill icons
         for(int i = 1; i <= 57; i++) {

+ 6 - 0
src/main/java/me/km/overrides/ModEntityPlayerMP.java

@@ -117,4 +117,10 @@ public class ModEntityPlayerMP extends ServerPlayerEntity {
     protected int getPermissionLevel() {
         return 999;
     }
+
+    @Override
+    public void setSneaking(boolean keyDownIn) {
+        Server.scriptEvents.onSneak(attackingPlayer, keyDownIn);
+        super.setSneaking(keyDownIn);
+    }
 }

+ 35 - 32
src/main/java/me/km/snuviscript/MinecraftFunctions.java

@@ -89,6 +89,7 @@ import net.minecraft.entity.item.ExperienceBottleEntity;
 import net.minecraft.entity.item.ItemEntity;
 import net.minecraft.entity.item.ItemFrameEntity;
 import net.minecraft.entity.monster.CreeperEntity;
+import net.minecraft.entity.passive.SheepEntity;
 import net.minecraft.entity.player.PlayerEntity;
 import net.minecraft.entity.player.ServerPlayerEntity;
 import net.minecraft.entity.projectile.AbstractArrowEntity;
@@ -1246,11 +1247,10 @@ public class MinecraftFunctions {
         });
         sm.registerFunction("entity.getlocation", (sc, in) -> new Location((Entity) in[0].get(sc)));
         sm.registerFunction("entity.damage", (sc, in) -> {
-            if(in.length >= 3) {
-                ((LivingEntity) in[0].get(sc)).attackEntityFrom((DamageSource) in[2].get(sc), in[1].getFloat(sc));
-                return Void.TYPE;
-            }
-            ((LivingEntity) in[0].get(sc)).attackEntityFrom(DamageSource.GENERIC, in[1].getFloat(sc));
+            LivingEntity liv = (LivingEntity) in[0].get(sc);
+            float damage = in[1].getFloat(sc);
+            DamageSource damageSource = (in.length >= 3) ? (DamageSource) in[2].get(sc) : DamageSource.GENERIC;
+            scheduler.scheduleTask(() -> liv.attackEntityFrom(damageSource, damage));
             return Void.TYPE;
         });
         sm.registerFunction("entity.damagedirect", (sc, in) -> {
@@ -1430,10 +1430,6 @@ public class MinecraftFunctions {
             EffectInstance effect = ((LivingEntity) in[0].get(sc)).getActivePotionEffect(Mapper.getPotion(in[1].getString(sc)));
             return effect == null ? 0 : effect.getAmplifier() + 1;
         });
-        sm.registerFunction("entity.explode", (sc, in) -> {
-            ((CreeperEntity) in[0].get(sc)).ignite();
-            return Void.TYPE;
-        });
         sm.registerFunction("entity.spawnitemframe", (sc, in) -> {
             Location l = ((Location) in[0].get(sc));
             ItemFrameEntity frame = new ItemFrameEntity(l.getWorld().getWorld(), l.getBlockPos(), Direction.byName(in[1].getString(sc)));
@@ -1441,7 +1437,7 @@ public class MinecraftFunctions {
             l.getWorld().addEntity(frame);
             return Void.TYPE;
         });
-        sm.registerFunction("entity.getitemframe", (sc, in) -> ((ItemFrameEntity) in[0].get(sc)).getDisplayedItem());
+        sm.registerFunction("entity.getitemfromframe", (sc, in) -> ((ItemFrameEntity) in[0].get(sc)).getDisplayedItem());
         sm.registerFunction("entity.get", (sc, in) -> {
             Location l = (Location) in[0].get(sc);
             return Utils.getEntity(l.getWorld(), l.getX(), l.getY(), l.getZ(), in[1].getDouble(sc), getClass(in[2].getString(sc)));
@@ -1492,6 +1488,13 @@ public class MinecraftFunctions {
             return Void.TYPE;
         });
         sm.registerFunction("entity.gettype", (sc, in) -> ((Entity) in[0].get(sc)).getType().getRegistryName().getPath());
+        sm.registerFunction("entity.issneaking", (sc, in) -> ((Entity) in[0].get(sc)).isCrouching());
+        sm.registerFunction("sheep.issheared", (sc, in) -> ((SheepEntity) in[0].get(sc)).getSheared());
+        sm.registerFunction("sheep.getcolor", (sc, in) -> ((SheepEntity) in[0].get(sc)).getFleeceColor().getName());
+        sm.registerFunction("creeper.explode", (sc, in) -> {
+            ((CreeperEntity) in[0].get(sc)).ignite();
+            return Void.TYPE;
+        });
 
         // ---------------------------------------------------------------------    
         // human commands
@@ -2366,8 +2369,8 @@ public class MinecraftFunctions {
         return text;
     }
 
-    private static <T> T launchProjectile(LivingEntity p, Class<? extends T> projectile, double scale, Object data) {
-        World w = p.world;
+    private static <T> T launchProjectile(LivingEntity liv, Class<? extends T> projectile, double scale, Object data) {
+        World w = liv.world;
         Entity launch = null;
 
         if(EntityItemProjectile.class == projectile) {
@@ -2378,44 +2381,44 @@ public class MinecraftFunctions {
             if(stack.isEmpty()) {
                 throw new IllegalArgumentException("Empty ItemStack not allowed here");
             }
-            launch = new EntityItemProjectile(p, stack.copy());
-            ((EntityItemProjectile) launch).setHeadingFromThrower(p, p.rotationPitch, p.rotationYaw, 0.0f, 1.5f, 1.0f);
+            launch = new EntityItemProjectile(liv, stack.copy());
+            ((EntityItemProjectile) launch).setHeadingFromThrower(liv, liv.rotationPitch, liv.rotationYaw, 0.0f, 1.5f, 1.0f);
         } else if(SnowballEntity.class == projectile) {
-            launch = new SnowballEntity(w, p);
-            ((SnowballEntity) launch).shoot(p, p.rotationPitch, p.rotationYaw, 0.0f, 1.5f, 1.0f);
+            launch = new SnowballEntity(w, liv);
+            ((SnowballEntity) launch).shoot(liv, liv.rotationPitch, liv.rotationYaw, 0.0f, 1.5f, 1.0f);
         } else if(EggEntity.class == projectile) {
-            launch = new EggEntity(w, p);
-            ((EggEntity) launch).shoot(p, p.rotationPitch, p.rotationYaw, 0.0f, 1.5f, 1.0f);
+            launch = new EggEntity(w, liv);
+            ((EggEntity) launch).shoot(liv, liv.rotationPitch, liv.rotationYaw, 0.0f, 1.5f, 1.0f);
         } else if(EnderPearlEntity.class == projectile) {
-            launch = new EnderPearlEntity(w, p);
-            ((EnderPearlEntity) launch).shoot(p, p.rotationPitch, p.rotationYaw, 0.0f, 1.5f, 1.0f);
+            launch = new EnderPearlEntity(w, liv);
+            ((EnderPearlEntity) launch).shoot(liv, liv.rotationPitch, liv.rotationYaw, 0.0f, 1.5f, 1.0f);
         } else if(PotionEntity.class == projectile) {
-            launch = new PotionEntity(w, p);
+            launch = new PotionEntity(w, liv);
             ((PotionEntity) launch).setItem((ItemStack) data);
-            ((PotionEntity) launch).shoot(p, p.rotationPitch, p.rotationYaw, -20.0f, 0.5f, 1.0f);
+            ((PotionEntity) launch).shoot(liv, liv.rotationPitch, liv.rotationYaw, -20.0f, 0.5f, 1.0f);
         } else if(ExperienceBottleEntity.class == projectile) {
-            launch = new ExperienceBottleEntity(w, p);
-            ((ExperienceBottleEntity) launch).shoot(p, p.rotationPitch, p.rotationYaw, -20.0f, 0.7f, 1.0f);
+            launch = new ExperienceBottleEntity(w, liv);
+            ((ExperienceBottleEntity) launch).shoot(liv, liv.rotationPitch, liv.rotationYaw, -20.0f, 0.7f, 1.0f);
         } else if(AbstractArrowEntity.class.isAssignableFrom(projectile)) {
             if(SpectralArrowEntity.class == projectile) {
-                launch = new SpectralArrowEntity(w, p);
+                launch = new SpectralArrowEntity(w, liv);
             } else {
-                launch = new ArrowEntity(w, p);
+                launch = new ArrowEntity(w, liv);
                 if(data != null) {
                     ((ArrowEntity) launch).setPotionEffect((ItemStack) data);
                 }
             }
-            ((AbstractArrowEntity) launch).shoot(p, p.rotationPitch, p.rotationYaw, 0.0F, 3.0F, 1.0F);
+            ((AbstractArrowEntity) launch).shoot(liv, liv.rotationPitch, liv.rotationYaw, 0.0F, 3.0F, 1.0F);
         } else if(DamagingProjectileEntity.class.isAssignableFrom(projectile)) {
-            Vec3d v = p.getLookVec().scale(10);
+            Vec3d v = liv.getLookVec().scale(10);
             if(SmallFireballEntity.class == projectile) {
-                launch = new SmallFireballEntity(w, p, v.x, v.y, v.z);
+                launch = new SmallFireballEntity(w, liv, v.x, v.y, v.z);
             } else if(WitherSkullEntity.class == projectile) {
-                launch = new WitherSkullEntity(w, p, v.x, v.y, v.z);
+                launch = new WitherSkullEntity(w, liv, v.x, v.y, v.z);
             } else if(DragonFireballEntity.class == projectile) {
-                launch = new DragonFireballEntity(w, p, v.x, v.y, v.z);
+                launch = new DragonFireballEntity(w, liv, v.x, v.y, v.z);
             } else {
-                launch = new FireballEntity(w, p, v.x, v.y, v.z);
+                launch = new FireballEntity(w, liv, v.x, v.y, v.z);
             }
         } else {
             return null;

+ 174 - 255
src/main/java/me/km/snuviscript/ScriptEvents.java

@@ -17,27 +17,27 @@ import me.km.utils.Location;
 import net.minecraft.command.ICommandSource;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.LivingEntity;
-import net.minecraft.entity.passive.SheepEntity;
 import net.minecraft.entity.player.PlayerEntity;
 import net.minecraft.entity.player.ServerPlayerEntity;
 import net.minecraft.inventory.container.ClickType;
 import net.minecraft.item.ItemStack;
-import net.minecraft.item.Items;
 import net.minecraft.server.MinecraftServer;
 import net.minecraft.server.management.PlayerList;
-import net.minecraft.util.Hand;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.util.math.BlockRayTraceResult;
 import net.minecraft.util.math.EntityRayTraceResult;
 import net.minecraft.util.math.RayTraceResult;
 import net.minecraft.util.text.ITextComponent;
 import net.minecraft.util.text.StringTextComponent;
+import net.minecraft.world.GameRules;
 import net.minecraftforge.event.ServerChatEvent;
+import net.minecraftforge.event.entity.EntityJoinWorldEvent;
+import net.minecraftforge.event.entity.EntityMobGriefingEvent;
 import net.minecraftforge.event.entity.EntityMountEvent;
 import net.minecraftforge.event.entity.ProjectileImpactEvent;
 import net.minecraftforge.event.entity.item.ItemTossEvent;
 import net.minecraftforge.event.entity.living.*;
-import net.minecraftforge.event.entity.player.AttackEntityEvent;
+import net.minecraftforge.event.entity.living.LivingEvent.LivingJumpEvent;
 import net.minecraftforge.event.entity.player.EntityItemPickupEvent;
 import net.minecraftforge.event.entity.player.FillBucketEvent;
 import net.minecraftforge.event.entity.player.ItemFishedEvent;
@@ -48,12 +48,17 @@ import net.minecraftforge.eventbus.api.Event;
 import net.minecraftforge.eventbus.api.EventPriority;
 import net.minecraftforge.eventbus.api.SubscribeEvent;
 import net.minecraftforge.event.entity.player.PlayerEvent;
+import net.minecraftforge.eventbus.api.Event.Result;
 
 public class ScriptEvents {
     private static void setLivingEntity(Script sc, LivingEntity ent) {
         sc.setVar("living_entity", ent);
     }
 
+    private static void setItem(Script sc, ItemStack stack) {
+        sc.setVar("item_stack", stack);
+    }
+
     private final Scripts scripts;
     private final MinecraftServer server;
     private final PermissionManager perms;
@@ -64,9 +69,6 @@ public class ScriptEvents {
         this.perms = perms;
     }
 
-    // -------------------------------------------------------------------------
-    // basics
-    // -------------------------------------------------------------------------
     private void handleEvent(Event e, String event, Consumer<Script> before, Consumer<Script> after) {
         if(e.isCancelable()) {
             scripts.getScriptManager().callEvent(event, sc -> {
@@ -102,6 +104,19 @@ public class ScriptEvents {
         }
     }
 
+    @Deprecated
+    private void handlePlayerEvent(PlayerEntity p, String event, Consumer<Script> before, Consumer<Script> after) {
+        if(p != null) {
+            Script data = scripts.getScript(p);
+            if(data != null) {
+                scripts.getScriptManager().callEvent(event, data, (sc) -> {
+                    ScriptVars.setPlayerVars(sc, p);
+                    before.accept(sc);
+                }, after);
+            }
+        }
+    }
+
     private void handleEvent(PlayerEntity p, String event, Consumer<Script> before) {
         handleEvent(p, event, before, null);
     }
@@ -129,9 +144,6 @@ public class ScriptEvents {
         }
     }
 
-    // -------------------------------------------------------------------------
-    // events
-    // -------------------------------------------------------------------------
     public void onPlayerDataTick(PlayerEntity p, String var) {
         handleEvent(p, "player_data_tick", sc -> {
             sc.setVar("var", var);
@@ -151,7 +163,7 @@ public class ScriptEvents {
             sc.setVar("inv_id", (double) inv.getModId());
             sc.setVar("inv_name", text.getFormattedText());
             sc.setVar("inv_slot", (double) slot);
-            ScriptVars.setItemVars(sc, inv.getStackInSlot(slot));
+            setItem(sc, inv.getStackInSlot(slot));
             sc.setVar("cancel", false);
         }, null);
         Variable v = script.getVar("cancel");
@@ -167,11 +179,14 @@ public class ScriptEvents {
         }, null);
     }
 
-    public void onHumanHurt(PlayerEntity p, EntityHuman h) {
-        handleEvent(p, "human_hurt", sc -> ScriptVars.setEntityVars(sc, h));
+    public void onHumanHurt(Entity attacker, EntityHuman h) {
+        handleEvent(null, "human_hurt", sc -> {
+            ScriptVars.setEntityVars(sc, attacker);
+            sc.setVar("human", h);
+        });
     }
 
-    @SubscribeEvent
+    @SubscribeEvent(receiveCanceled = true)
     public void onPlayerPostRespawn(PlayerEvent.PlayerRespawnEvent e) {
         handleEvent(e.getPlayer(), "player_post_respawn", sc -> {
         });
@@ -182,7 +197,7 @@ public class ScriptEvents {
         });
     }
 
-    @SubscribeEvent
+    @SubscribeEvent(receiveCanceled = true)
     public void onOldPlayerDamage(LivingHurtEvent e) {
         if(!(e.getEntityLiving() instanceof ServerPlayerEntity)) {
             return;
@@ -210,30 +225,8 @@ public class ScriptEvents {
         });
     }
 
-    @SubscribeEvent
-    public void onOldEntityDamage(LivingHurtEvent e) {
-        PlayerEntity p = Utils.getDamager(e.getSource());
-        if(p == null) {
-            return;
-        }
-        handleEvent(p, "entity_hurt", (sc) -> {
-            sc.setVar("entity_killed", e.getEntityLiving().getHealth() <= e.getAmount());
-            ScriptVars.setEntityVars(sc, e.getEntity());
-            sc.setVar("entity_damage", (double) e.getAmount());
-            sc.setVar("entity_damage_cause", e.getSource());
-            sc.setVar("cancel", e.isCanceled());
-        }, (sc) -> {
-            try {
-                ifVarNotNull(sc, "entity_damage", v -> e.setAmount(v.getFloat(sc)));
-                ifVarNotNull(sc, "cancel", v -> e.setCanceled(v.getBoolean(sc)));
-            } catch(Exception ex) {
-                scripts.getLogger().print("invalid var in 'entity_hurt' event", ex, null, sc.getName(), sc, sc.getActiveSourceLine());
-            }
-        });
-    }
-
-    @SubscribeEvent
-    public void onEntityDamage(LivingHurtEvent e) {
+    @SubscribeEvent(receiveCanceled = true)
+    public void onLivingHurt(LivingHurtEvent e) {
         handleEvent(e, "living_hurt", (sc) -> {
             setLivingEntity(sc, e.getEntityLiving());
             sc.setVar("damage_source", e.getSource());
@@ -243,11 +236,12 @@ public class ScriptEvents {
         });
     }
 
-    @SubscribeEvent
-    public void onPlayerAttack(LivingAttackEvent e) {
+    @SubscribeEvent(receiveCanceled = true)
+    public void onLivingAttacked(LivingAttackEvent e) {
         LivingEntity liv = e.getEntityLiving();
         if(liv instanceof PlayerEntity) {
             PlayerEntity p = (PlayerEntity) liv;
+            // deprecated
             handleEvent(p, "player_is_attacked", (sc) -> {
                 sc.setVar("player_killed", p.getHealth() <= e.getAmount());
                 sc.setVar("player_damage_cause", e.getSource());
@@ -262,37 +256,15 @@ public class ScriptEvents {
             }, (sc) -> {
                 simpleCancel(sc, e, "player_is_attacked");
             });
-        } else {
-            PlayerEntity p = Utils.getDamager(e.getSource());
-            if(p != null) {
-                handleEvent(p, "player_attacks", (sc) -> {
-                    ScriptVars.setEntityVars(sc, liv);
-                    sc.setVar("cancel", e.isCanceled());
-                }, (sc) -> {
-                    simpleCancel(sc, e, "player_attacks");
-                });
-            }
-        }
-    }
-
-    @SubscribeEvent
-    public void onOldPlayerHeal(LivingHealEvent e) {
-        if(e.getEntityLiving() instanceof PlayerEntity) {
-            handleEvent((PlayerEntity) e.getEntityLiving(), "player_heal", (sc) -> {
-                sc.setVar("heal", (double) e.getAmount());
-                sc.setVar("cancel", e.isCanceled());
-            }, (sc) -> {
-                try {
-                    ifVarNotNull(sc, "heal", v -> e.setAmount(v.getFloat(sc)));
-                    ifVarNotNull(sc, "cancel", v -> e.setCanceled(v.getBoolean(sc)));
-                } catch(Exception ex) {
-                    scripts.getLogger().print("invalid var in 'player_heal' event", ex, null, sc.getName(), sc, sc.getActiveSourceLine());
-                }
-            });
         }
+        handleEvent(e, "living_is_attacked", (sc) -> {
+            setLivingEntity(sc, e.getEntityLiving());
+            sc.setVar("damage_source", e.getSource());
+            sc.setVar("damage_amount", (double) e.getAmount());
+        }, null);
     }
 
-    @SubscribeEvent
+    @SubscribeEvent(receiveCanceled = true)
     public void onLivingHeal(LivingHealEvent e) {
         handleEvent(e, "living_heal", (sc) -> {
             setLivingEntity(sc, e.getEntityLiving());
@@ -302,38 +274,16 @@ public class ScriptEvents {
         });
     }
 
-    @SubscribeEvent
-    public void onEntityDamage(LivingHealEvent e) {
-        if(e.getEntityLiving() instanceof PlayerEntity) {
-            handleEvent((PlayerEntity) e.getEntityLiving(), "player_heal", (sc) -> {
-                sc.setVar("heal", (double) e.getAmount());
-                sc.setVar("cancel", e.isCanceled());
-            }, (sc) -> {
-                try {
-                    ifVarNotNull(sc, "heal", v -> e.setAmount(v.getFloat(sc)));
-                    ifVarNotNull(sc, "cancel", v -> e.setCanceled(v.getBoolean(sc)));
-                } catch(Exception ex) {
-                    scripts.getLogger().print("invalid var in 'player_heal' event", ex, null, sc.getName(), sc, sc.getActiveSourceLine());
-                }
-            });
-        }
-    }
-
-    @SubscribeEvent
+    @SubscribeEvent(receiveCanceled = true)
     public void onLivingDeath(LivingDeathEvent e) {
+        handleEvent(e, "living_death", (sc) -> {
+            setLivingEntity(sc, e.getEntityLiving());
+            sc.setVar("damage_source", e.getSource());
+        }, null);
         if(!(e.getEntityLiving() instanceof PlayerEntity)) {
-            PlayerEntity p = Utils.getDamager(e.getSource());
-            handleEvent(p, "entity_death", (sc) -> {
-                sc.setVar("entity_damage_cause", e.getSource());
-                LivingEntity ent = e.getEntityLiving();
-                ScriptVars.setEntityVars(sc, ent);
-                sc.setVar("player_involved", p != null);
-                sc.setVar("cancel", e.isCanceled());
-            }, (sc) -> {
-                simpleCancel(sc, e, "entity_death");
-            });
             return;
         }
+        // deprecated
         PlayerEntity p = (PlayerEntity) e.getEntity();
         handleEvent(p, "player_death", (sc) -> {
             sc.setVar("clear", false);
@@ -356,36 +306,17 @@ public class ScriptEvents {
         });
     }
 
-    @SubscribeEvent
-    public void onEntityDrop(LivingDropsEvent e) {
-        try {
-            PlayerEntity p = Utils.getDamager(e.getSource());
-            handleEvent(p, "entity_drop", (sc) -> {
-                sc.setVar("drops", e.getDrops());
-                ScriptVars.setEntityVars(sc, e.getEntityLiving());
-                sc.setVar("player_involved", p != null);
-                sc.setVar("cancel", e.isCanceled());
-            }, (sc) -> {
-                simpleCancel(sc, e, "entity_drop");
-            });
-        } catch(NullPointerException ex) {
-            scripts.getLogger().print(ex);
-        }
-    }
-
-    @SubscribeEvent
-    public void onPlayerDrop(LivingDropsEvent e) {
-        if(!(e.getEntityLiving() instanceof PlayerEntity)) {
-            return;
-        }
-        handleEvent((PlayerEntity) e.getEntityLiving(), "player_drop", (sc) -> {
-            sc.setVar("cancel", e.isCanceled());
-        }, (sc) -> {
-            simpleCancel(sc, e, "player_drop");
-        });
+    @SubscribeEvent(receiveCanceled = true)
+    public void onLivingDrop(LivingDropsEvent e) {
+        handleEvent(e, "living_drop", (sc) -> {
+            setLivingEntity(sc, e.getEntityLiving());
+            sc.setVar("drops", e.getDrops());
+            sc.setVar("damage_source", e.getSource());
+            sc.setVar("looting_level", (double) e.getLootingLevel());
+        }, null);
     }
 
-    @SubscribeEvent
+    @SubscribeEvent(receiveCanceled = true)
     public void onProjectileHit(ProjectileImpactEvent e) {
         final Entity hitEntity;
         final Location loc;
@@ -404,59 +335,60 @@ public class ScriptEvents {
                 return;
         }
 
-        handleEvent(Utils.getPlayerFromProjectile(e.getEntity()), "throw_hit", (sc) -> {
+        handleEvent(e, "projectile_hit", (sc) -> {
+            sc.setVar("projectile", e.getEntity());
             sc.setVar("entity_hit", hitEntity);
             sc.setVar("loc_hit", loc);
-            ScriptVars.setEntityVars(sc, e.getEntity());
-        });
+            sc.setVar("shooter", Utils.getEntityFromProjectile(e.getEntity()));
+        }, null);
     }
 
-    public void onEntityItemProjectileHit(EntityItemProjectile ent, PlayerEntity p, ItemStack stack, Entity hitEntity, BlockPos pos) {
-        Location loc;
-        if(pos == null) {
-            loc = null;
-        } else {
-            loc = new Location(ent.world, pos);
-        }
-        handleEvent(p, "item_hit", (sc) -> {
-            ScriptVars.setEntityVars(sc, ent);
-            ScriptVars.setItemVars(sc, stack);
+    public void onEntityItemProjectileHit(EntityItemProjectile ent, LivingEntity liv, ItemStack stack, Entity hitEntity, BlockPos pos) {
+        Location loc = (pos == null) ? null : new Location(ent.world, pos);
+        handleEvent(null, "item_hit", (sc) -> {
+            sc.setVar("projectile", ent);
+            setItem(sc, stack);
             sc.setVar("entity_hit", hitEntity);
             sc.setVar("loc_hit", loc);
+            sc.setVar("shooter", liv);
         });
+        // deprecated
+        if(liv instanceof PlayerEntity) {
+            handlePlayerEvent((PlayerEntity) liv, "item_hit", (sc) -> {
+                sc.setVar("projectile", ent);
+                setItem(sc, stack);
+                sc.setVar("entity_hit", hitEntity);
+                sc.setVar("loc_hit", loc);
+                sc.setVar("shooter", liv);
+            }, null);
+        }
     }
 
-    @SubscribeEvent
-    public void onEntityShear(PlayerInteractEvent.EntityInteract e) {
-        if(e.getHand() == Hand.OFF_HAND || !(e.getTarget() instanceof SheepEntity)) {
-            return;
-        }
-        PlayerEntity p = e.getPlayer();
-        if(p.getHeldItemMainhand().getItem() != Items.SHEARS) {
-            return;
-        }
-        SheepEntity sheep = (SheepEntity) e.getTarget();
-        handleEvent(p, "entity_shear", (sc) -> {
-            ScriptVars.setEntityVars(sc, sheep);
-            sc.setVar("entity_sheared", sheep.getSheared());
-            sc.setVar("entity_color", sheep.getFleeceColor().toString());
+    @SubscribeEvent(receiveCanceled = true)
+    public void onBlockBreak(BlockEvent.BreakEvent e) {
+        handleEvent(e.getPlayer(), "block_break", (sc) -> {
+            ScriptVars.setBlockVars(sc, e.getWorld(), e.getPos());
             sc.setVar("cancel", e.isCanceled());
         }, (sc) -> {
-            simpleCancel(sc, e, "entity_shear");
+            simpleCancel(sc, e, "block_break");
         });
     }
 
-    @SubscribeEvent
-    public void onBlockBreak(BlockEvent.BreakEvent e) {
-        handleEvent(e.getPlayer(), "block_break", (sc) -> {
+    @SubscribeEvent(receiveCanceled = true)
+    public void onBlockPlace(BlockEvent.EntityPlaceEvent e) {
+        if(!(e.getEntity() instanceof PlayerEntity)) {
+            return;
+        }
+        handleEvent((PlayerEntity) e.getEntity(), "block_place", (sc) -> {
+            sc.setVar("block_type_after", e.getPlacedBlock().getBlock().getRegistryName());
             ScriptVars.setBlockVars(sc, e.getWorld(), e.getPos());
             sc.setVar("cancel", e.isCanceled());
         }, (sc) -> {
-            simpleCancel(sc, e, "block_break");
+            simpleCancel(sc, e, "block_place");
         });
     }
 
-    @SubscribeEvent
+    @SubscribeEvent(receiveCanceled = true)
     public void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent e) {
         PlayerEntity p = e.getPlayer();
         if(p == null) {
@@ -469,7 +401,7 @@ public class ScriptEvents {
         });
     }
 
-    @SubscribeEvent
+    @SubscribeEvent(receiveCanceled = true)
     public void onPlayerLogout(PlayerEvent.PlayerLoggedOutEvent e) {
         PlayerEntity p = e.getPlayer();
         if(p == null || e.getPlayer().ticksExisted < 20) {
@@ -479,7 +411,7 @@ public class ScriptEvents {
         });
     }
 
-    @SubscribeEvent
+    @SubscribeEvent(receiveCanceled = true)
     public void onBucketFill(FillBucketEvent e) {
         handleEvent(e.getPlayer(), "bucket_use", (sc) -> {
             RayTraceResult ray = e.getTarget();
@@ -496,27 +428,11 @@ public class ScriptEvents {
         });
     }
 
-    @SubscribeEvent
-    public void onBlockPlace(BlockEvent.EntityPlaceEvent e) {
-        if(!(e.getEntity() instanceof PlayerEntity)) {
-            return;
-        }
-        handleEvent((PlayerEntity) e.getEntity(), "block_place", (sc) -> {
-            sc.setVar("block_type_after", e.getPlacedBlock().getBlock().getRegistryName());
-            ScriptVars.setBlockVars(sc, e.getWorld(), e.getPos());
-            sc.setVar("cancel", e.isCanceled());
-        }, (sc) -> {
-            simpleCancel(sc, e, "block_place");
-        });
-    }
-
-    @SubscribeEvent
+    @SubscribeEvent(receiveCanceled = true)
     public void onRightClickBlock(PlayerInteractEvent.RightClickBlock e) {
-        if(e.getHand() == Hand.OFF_HAND) {
-            return;
-        }
         handleEvent(e.getPlayer(), "block_click", (sc) -> {
             sc.setVar("action", "right");
+            sc.setVar("hand", e.getHand().name());
             ScriptVars.setBlockVars(sc, e.getWorld(), e.getPos());
             sc.setVar("cancel", e.isCanceled());
         }, (sc) -> {
@@ -524,13 +440,11 @@ public class ScriptEvents {
         });
     }
 
-    @SubscribeEvent
+    @SubscribeEvent(receiveCanceled = true)
     public void onLeftClickBlock(PlayerInteractEvent.LeftClickBlock e) {
-        if(e.getHand() == Hand.OFF_HAND) {
-            return;
-        }
         handleEvent(e.getPlayer(), "block_click", (sc) -> {
             sc.setVar("action", "left");
+            sc.setVar("hand", e.getHand().name());
             ScriptVars.setBlockVars(sc, e.getWorld(), e.getPos());
             sc.setVar("cancel", e.isCanceled());
         }, (sc) -> {
@@ -540,14 +454,13 @@ public class ScriptEvents {
 
     @SubscribeEvent(receiveCanceled = true)
     public void onEntityClick(PlayerInteractEvent.EntityInteract e) {
-        if(e.getHand() != Hand.OFF_HAND) {
-            handleEvent(e.getPlayer(), "entity_click", (sc) -> {
-                ScriptVars.setEntityVars(sc, e.getTarget());
-                sc.setVar("cancel", e.isCanceled());
-            }, (sc) -> {
-                simpleCancel(sc, e, "entity_click");
-            });
-        }
+        handleEvent(e.getPlayer(), "entity_click", (sc) -> {
+            sc.setVar("hand", e.getHand().name());
+            ScriptVars.setEntityVars(sc, e.getTarget());
+            sc.setVar("cancel", e.isCanceled());
+        }, (sc) -> {
+            simpleCancel(sc, e, "entity_click");
+        });
     }
 
     public void onEmptyLeftClick(PlayerEntity p) {
@@ -555,10 +468,10 @@ public class ScriptEvents {
         });
     }
 
-    @SubscribeEvent
+    @SubscribeEvent(receiveCanceled = true)
     public void onItemClick(PlayerInteractEvent.RightClickItem e) {
         handleEvent(e.getPlayer(), "item_air_click", (sc) -> {
-            ScriptVars.setItemVars(sc, e.getItemStack());
+            setItem(sc, e.getItemStack());
             sc.setVar("hand", e.getHand().toString());
             sc.setVar("cancel", e.isCanceled());
         }, (sc) -> {
@@ -566,88 +479,78 @@ public class ScriptEvents {
         });
     }
 
-    @SubscribeEvent
+    @SubscribeEvent(receiveCanceled = true)
     public void onItemUseStart(LivingEntityUseItemEvent.Start e) {
-        if(!(e.getEntityLiving() instanceof PlayerEntity)) {
-            return;
-        }
-        handleEvent((PlayerEntity) e.getEntityLiving(), "item_use_start", (sc) -> {
+        handleEvent(e, "item_use_start", (sc) -> {
+            setLivingEntity(sc, e.getEntityLiving());
             sc.setVar("duration", (double) e.getDuration());
-            sc.setVar("cancel", e.isCanceled());
+            setItem(sc, e.getItem());
         }, (sc) -> {
-            try {
-                ifVarNotNull(sc, "duration", v -> e.setDuration(v.getInt(sc)));
-                ifVarNotNull(sc, "cancel", v -> e.setCanceled(v.getBoolean(sc)));
-            } catch(Exception ex) {
-                scripts.getLogger().print("invalid var in 'item_use_start' event", ex, null, sc.getName(), sc, sc.getActiveSourceLine());
-            }
+            handleVar(sc, "item_use_start", "duration", v -> e.setDuration(v.getInt(sc)));
         });
     }
 
-    @SubscribeEvent
+    @SubscribeEvent(receiveCanceled = true)
     public void onConsuming(LivingEntityUseItemEvent.Finish e) {
-        if(!(e.getEntityLiving() instanceof PlayerEntity)) {
-            return;
-        }
-        handleEvent((PlayerEntity) e.getEntityLiving(), "item_use_finish", (sc) -> {
-            sc.setVar("result_stack", e.getResultStack());
+        handleEvent(e, "item_use_finish", (sc) -> {
+            setLivingEntity(sc, e.getEntityLiving());
+            setItem(sc, e.getItem());
+        }, (sc) -> {
+            handleVar(sc, "item_use_finish", "item", v -> e.setResultStack((ItemStack) v.get(sc)));
         });
     }
 
-    @SubscribeEvent
+    @SubscribeEvent(receiveCanceled = true)
     public void onFishing(ItemFishedEvent e) {
         handleEvent(e.getPlayer(), "fishing", (sc) -> {
             sc.setVar("drops", e.getDrops());
+            sc.setVar("hook", e.getHookEntity());
+            sc.setVar("rod_damage", (double) e.getRodDamage());
             sc.setVar("cancel", e.isCanceled());
         }, (sc) -> {
             simpleCancel(sc, e, "fishing");
+            handleVar(sc, "fishing", "rod_damage", v -> e.damageRodBy(v.getInt(sc)));
         });
     }
 
-    @SubscribeEvent
+    @SubscribeEvent(receiveCanceled = true)
     public void onCrafting(PlayerEvent.ItemCraftedEvent e) {
         handleEvent(e.getPlayer(), "craft", (sc) -> {
-            ScriptVars.setItemVars(sc, e.getCrafting());
+            setItem(sc, e.getCrafting());
         });
     }
 
-    @SubscribeEvent
+    @SubscribeEvent(receiveCanceled = true)
     public void onItemDrop(ItemTossEvent e) {
         handleEvent(e.getPlayer(), "player_toss", (sc) -> {
-            ScriptVars.setItemVars(sc, e.getEntityItem().getItem());
+            setItem(sc, e.getEntityItem().getItem());
             sc.setVar("cancel", e.isCanceled());
         }, (sc) -> {
             simpleCancel(sc, e, "player_toss");
         });
     }
 
-    @SubscribeEvent
+    @SubscribeEvent(receiveCanceled = true)
     public void onItemPickup(EntityItemPickupEvent e) {
         handleEvent(e.getPlayer(), "player_pickup", (sc) -> {
             ScriptVars.setEntityVars(sc, e.getItem());
-            ScriptVars.setItemVars(sc, e.getItem().getItem());
+            setItem(sc, e.getItem().getItem());
             sc.setVar("cancel", e.isCanceled());
         }, (sc) -> {
             simpleCancel(sc, e, "player_pickup");
         });
     }
 
-    @SubscribeEvent
-    public void onVehicleEnter(EntityMountEvent e) {
-        if(!(e.getEntityMounting() instanceof PlayerEntity)) {
-            return;
-        }
-        PlayerEntity p = (PlayerEntity) e.getEntityMounting();
-        handleEvent(p, "entity_mount", (sc) -> {
+    @SubscribeEvent(receiveCanceled = true)
+    public void onEntityMount(EntityMountEvent e) {
+        handleEvent(e, "entity_mount", (sc) -> {
             sc.setVar("mounting", e.isMounting());
             ScriptVars.setEntityVars(sc, e.getEntityBeingMounted());
-            sc.setVar("cancel", e.isCanceled());
-        }, (sc) -> {
-            simpleCancel(sc, e, "entity_mount");
-        });
+            sc.setVar("rider", e.getEntityMounting());
+        }, null);
     }
 
-    @SubscribeEvent
+    @SubscribeEvent(receiveCanceled = true)
     public void onPlayerUsePortal(PlayerEvent.PlayerChangedDimensionEvent e) {
         handleEvent(e.getPlayer(), "portal", (sc) -> {
             sc.setVar("from", e.getFrom().getRegistryName().getPath());
@@ -660,11 +563,7 @@ public class ScriptEvents {
             sc.setVar("command", e.getName());
             sc.setVar("cancel", e.isCanceled());
         }, (sc) -> {
-            try {
-                ifVarNotNull(sc, "cancel", v -> e.setCanceled(v.getBoolean(sc)));
-            } catch(Exception ex) {
-                scripts.getLogger().print("invalid var in 'command' event", ex, null, sc.getName(), sc, sc.getActiveSourceLine());
-            }
+            handleVar(sc, "command", "cancel", v -> e.setCanceled(v.getBoolean(sc)));
         });
     }
 
@@ -685,28 +584,18 @@ public class ScriptEvents {
         });
     }
 
-    @SubscribeEvent
+    @SubscribeEvent(receiveCanceled = true)
     public void onChatEvent(ServerChatEvent e) {
         handleEvent(e.getPlayer(), "chat", (sc) -> {
-            String text = e.getMessage();
-            if(perms.hasPermission(e.getPlayer(), "color")) {
-                text = text.replace('&', '§');
-            } else {
-                text = text.replaceAll("&.", "");
-            }
-            sc.setVar("message", text);
+            sc.setVar("message", e.getMessage());
             sc.setVar("cancel", e.isCanceled());
         }, (sc) -> {
-            try {
-                ifVarNotNull(sc, "message", v -> e.setComponent(new StringTextComponent(v.getString(sc))));
-                ifVarNotNull(sc, "cancel", v -> e.setCanceled(v.getBoolean(sc)));
-            } catch(Exception ex) {
-                scripts.getLogger().print("invalid var in 'chat' event", ex, null, sc.getName(), sc, sc.getActiveSourceLine());
-            }
+            handleVar(sc, "chat", "message", v -> e.setComponent(new StringTextComponent(v.getString(sc))));
+            handleVar(sc, "chat", "cancel", v -> e.setCanceled(v.getBoolean(sc)));
         });
     }
 
-    @SubscribeEvent(priority = EventPriority.HIGHEST)
+    @SubscribeEvent(receiveCanceled = true, priority = EventPriority.HIGHEST)
     public void onExplosion(ExplosionEvent.Start e) {
         e.setCanceled(true);
         handleEvent(e, "explosion", sc -> {
@@ -747,13 +636,43 @@ public class ScriptEvents {
         });
     }
 
-    @SubscribeEvent(priority = EventPriority.HIGHEST)
-    public void onEntityHit(AttackEntityEvent e) {
-        handleEvent(e.getPlayer(), "player_attack_entity", (sc) -> {
-            ScriptVars.setEntityVars(sc, e.getTarget());
-            sc.setVar("cancel", e.isCanceled());
+    @SubscribeEvent(receiveCanceled = true)
+    public void onEntityJoinWorld(EntityJoinWorldEvent e) {
+        handleEvent(e, "entity_join", (sc) -> {
+            ScriptVars.setEntityVars(sc, e.getEntity());
+        }, null);
+    }
+
+    @SubscribeEvent(receiveCanceled = true)
+    public void onAnimalTame(AnimalTameEvent e) {
+        handleEvent(e, "animal_tame", (sc) -> {
+            sc.setVar("animal", e.getAnimal());
+            sc.setVar("tamer", e.getTamer());
+        }, null);
+    }
+
+    @SubscribeEvent(receiveCanceled = true)
+    public void onJump(LivingJumpEvent e) {
+        handleEvent(e, "living_jump", (sc) -> {
+            setLivingEntity(sc, e.getEntityLiving());
+        }, null);
+    }
+
+    public void onSneak(PlayerEntity p, boolean sneak) {
+        handleEvent(p, "player_sneak", (sc) -> {
+            sc.setVar("sneak", sneak);
+        }, null);
+    }
+
+    @SubscribeEvent(receiveCanceled = true)
+    public void onSneak(EntityMobGriefingEvent e) {
+        handleEvent(e, "mob_griefing", (sc) -> {
+            ScriptVars.setEntityVars(sc, e.getEntity());
+            sc.setVar("cancel", !e.getEntity().world.getGameRules().getBoolean(GameRules.MOB_GRIEFING));
         }, (sc) -> {
-            simpleCancel(sc, e, "player_attack_entity");
+            handleVar(sc, "mob_griefing", "cancel", (v) -> {
+                e.setResult(v.getBoolean(sc) ? Result.DENY : Result.ALLOW);
+            });
         });
     }
 }

+ 0 - 5
src/main/java/me/km/snuviscript/ScriptVars.java

@@ -5,7 +5,6 @@ import me.km.utils.Location;
 import net.minecraft.block.BlockState;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.player.PlayerEntity;
-import net.minecraft.item.ItemStack;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.IWorld;
 
@@ -33,8 +32,4 @@ public class ScriptVars {
     public static void setEntityVars(Script qd, Entity ent) {
         qd.setVar("entity", ent);
     }
-
-    public static void setItemVars(Script qd, ItemStack stack) {
-        qd.setVar("item", stack);
-    }
 }

+ 4 - 16
src/main/java/me/km/utils/Utils.java

@@ -18,25 +18,13 @@ import net.minecraft.util.math.RayTraceResult;
 import net.minecraft.world.World;
 
 public class Utils {
-    public static PlayerEntity getPlayerFromProjectile(Entity ent) {
+    public static Entity getEntityFromProjectile(Entity ent) {
         if(ent instanceof ArrowEntity) {
-            ArrowEntity arrow = (ArrowEntity) ent;
-            if(arrow.shootingEntity == null) {
-                return null;
-            }
-            return arrow.world.getPlayerByUuid(arrow.shootingEntity);
+            return ((ArrowEntity) ent).getShooter();
         } else if(ent instanceof ThrowableEntity) {
-            ThrowableEntity thrown = (ThrowableEntity) ent;
-            if(thrown.getThrower() instanceof PlayerEntity) {
-                return (PlayerEntity) thrown.getThrower();
-            }
-            return null;
+            return ((ThrowableEntity) ent).getThrower();
         } else if(ent instanceof DamagingProjectileEntity) {
-            DamagingProjectileEntity fire = (DamagingProjectileEntity) ent;
-            if(fire.shootingEntity instanceof PlayerEntity) {
-                return (PlayerEntity) fire.shootingEntity;
-            }
-            return null;
+            return ( (DamagingProjectileEntity) ent).shootingEntity;
         }
         return null;
     }