Browse Source

Bugfixes im Bezug auf Server Crash mit Entity Renderer

Kajetan Johannes Hammerle 7 years ago
parent
commit
7683abe5db
59 changed files with 1043 additions and 1127 deletions
  1. 2 2
      build.gradle
  2. 7 0
      src/main/java/me/km/ClientProxy.java
  3. 6 0
      src/main/java/me/km/CommonProxy.java
  4. 5 7
      src/main/java/me/km/KajetansMod.java
  5. 0 13
      src/main/java/me/km/TestEvents.java
  6. 0 3
      src/main/java/me/km/commands/CommandSummon.java
  7. 1 6
      src/main/java/me/km/dimensions/ModDimensions.java
  8. 118 117
      src/main/java/me/km/effects/Effect.java
  9. 23 5
      src/main/java/me/km/effects/passive/BlockBreakEffects.java
  10. 25 3
      src/main/java/me/km/effects/passive/BlockClickEffects.java
  11. 0 51
      src/main/java/me/km/effects/passive/BlockDamageEffects.java
  12. 59 38
      src/main/java/me/km/effects/passive/Breeding.java
  13. 0 44
      src/main/java/me/km/effects/passive/Brewing.java
  14. 19 30
      src/main/java/me/km/effects/passive/CakeEating.java
  15. 0 47
      src/main/java/me/km/effects/passive/CauldronFilling.java
  16. 16 3
      src/main/java/me/km/effects/passive/ContainerEvent.java
  17. 10 18
      src/main/java/me/km/effects/passive/Crafting.java
  18. 0 75
      src/main/java/me/km/effects/passive/EnderpearlEffects.java
  19. 59 59
      src/main/java/me/km/effects/passive/EntityDamageEffects.java
  20. 0 60
      src/main/java/me/km/effects/passive/EntityDeath.java
  21. 70 0
      src/main/java/me/km/effects/passive/EntityDrop.java
  22. 30 159
      src/main/java/me/km/effects/passive/Fishing.java
  23. 45 54
      src/main/java/me/km/effects/passive/GoldRiverEffects.java
  24. 45 37
      src/main/java/me/km/effects/passive/LeaveDecay.java
  25. 47 24
      src/main/java/me/km/effects/passive/LessItemLoss.java
  26. 0 83
      src/main/java/me/km/effects/passive/MagicWands.java
  27. 5 40
      src/main/java/me/km/effects/passive/Mugging.java
  28. 0 43
      src/main/java/me/km/effects/passive/PotionShooting.java
  29. 17 31
      src/main/java/me/km/effects/passive/Smelting.java
  30. 20 22
      src/main/java/me/km/effects/passive/TargetEntity.java
  31. 68 0
      src/main/java/me/km/effects/passive/ThrowableEffects.java
  32. 17 2
      src/main/java/me/km/entities/ModEntities.java
  33. 22 0
      src/main/java/me/km/events/CustomEventCaller.java
  34. 21 0
      src/main/java/me/km/events/PlayerHurtEvent.java
  35. 29 0
      src/main/java/me/km/events/ThrowableLaunchEvent.java
  36. 28 27
      src/main/java/me/km/items/ItemScroll.java
  37. 75 0
      src/main/java/me/km/items/ItemWand.java
  38. 82 0
      src/main/java/me/km/items/ItemWeapon.java
  39. 4 1
      src/main/java/me/km/items/ModItems.java
  40. 1 1
      src/main/java/me/km/playerbank/PvpEvent.java
  41. 1 1
      src/main/java/me/km/snuviscript/QuestParser.java
  42. 14 20
      src/main/java/me/km/snuviscript/QuestsEvents.java
  43. 4 1
      src/main/resources/assets/km/lang/en_US.lang
  44. 6 0
      src/main/resources/assets/km/models/item/diamond_wand.json
  45. 6 0
      src/main/resources/assets/km/models/item/emerald_wand.json
  46. 6 0
      src/main/resources/assets/km/models/item/gold_wand.json
  47. 6 0
      src/main/resources/assets/km/models/item/iron_wand.json
  48. 6 0
      src/main/resources/assets/km/models/item/lapis_wand.json
  49. 6 0
      src/main/resources/assets/km/models/item/redstone_wand.json
  50. 6 0
      src/main/resources/assets/km/models/item/stone_wand.json
  51. 6 0
      src/main/resources/assets/km/models/item/wood_wand.json
  52. BIN
      src/main/resources/assets/km/textures/items/diamond_wand.png
  53. BIN
      src/main/resources/assets/km/textures/items/emerald_wand.png
  54. BIN
      src/main/resources/assets/km/textures/items/gold_wand.png
  55. BIN
      src/main/resources/assets/km/textures/items/iron_wand.png
  56. BIN
      src/main/resources/assets/km/textures/items/lapis_wand.png
  57. BIN
      src/main/resources/assets/km/textures/items/redstone_wand.png
  58. BIN
      src/main/resources/assets/km/textures/items/stone_wand.png
  59. BIN
      src/main/resources/assets/km/textures/items/wood_wand.png

+ 2 - 2
build.gradle

@@ -21,7 +21,7 @@ compileJava {
 }
 
 minecraft {
-    version = "1.11.2-13.20.0.2228"
+    version = "1.11.2-13.20.0.2303"
     runDir = "run"
     
     // the mappings can be changed at any time, and must be in the following format.
@@ -29,7 +29,7 @@ minecraft {
     // stable_#            stables are built at the discretion of the MCP team.
     // Use non-default mappings at your own risk. they may not always work.
     // simply re-run your setup task after changing the mappings to update your workspace.
-    mappings = "snapshot_20161220"
+    mappings = "snapshot_20170525"
     // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable.
 }
 

+ 7 - 0
src/main/java/me/km/ClientProxy.java

@@ -1,5 +1,6 @@
 package me.km;
 
+import me.km.entities.ModEntities;
 import net.minecraft.block.Block;
 import net.minecraft.block.state.IBlockState;
 import net.minecraft.client.renderer.block.model.ModelBakery;
@@ -43,4 +44,10 @@ public class ClientProxy extends CommonProxy
     {
         RenderingRegistry.registerEntityRenderingHandler(c, r);
     }
+    
+    @Override
+    public void initEntities() 
+    {
+        ModEntities.initClient();
+    }
 }

+ 6 - 0
src/main/java/me/km/CommonProxy.java

@@ -1,5 +1,6 @@
 package me.km;
 
+import me.km.entities.ModEntities;
 import net.minecraft.client.renderer.entity.Render;
 import net.minecraft.entity.Entity;
 import net.minecraft.item.Item;
@@ -18,4 +19,9 @@ public class CommonProxy
     public void registerEntityRenderer(Class<? extends Entity> c, Render<? extends Entity> r)
     {
     }
+    
+    public void initEntities() 
+    {
+        ModEntities.initServer();
+    }
 }

+ 5 - 7
src/main/java/me/km/KajetansMod.java

@@ -9,7 +9,6 @@ import me.km.databank.DataBank;
 import me.km.dimensions.ModDimensions;
 import me.km.dimensions.WorldData;
 import me.km.effects.EffectUtils;
-import me.km.entities.ModEntities;
 import me.km.fluids.ModFluids;
 import me.km.items.ModItems;
 import me.km.jobsystem.JobAPI;
@@ -102,7 +101,7 @@ public class KajetansMod
         // Spielerdatenbank
         playerbank = new PlayerManager("PlayerBank", "PlayerBank", TextFormatting.RED);
         playerbank.setDataBank(new PlayerBank(playerbank, databank.getConnection()));
-        playerbank.registerEvents("me.kt.playerbank");
+        playerbank.registerEvents("me.km.playerbank");
         
         // Grundlegende Commands
         generalCommands = new Module("GeneralCommands", "Commands", TextFormatting.GOLD);
@@ -144,8 +143,8 @@ public class KajetansMod
         quest = new QuestAPI("Quests", "Quests", TextFormatting.LIGHT_PURPLE);
         quest.registerPrefix("Scripts", TextFormatting.LIGHT_PURPLE);
         quest.setDataBank(new QuestBank(quest, databank.getConnection()));
-        quest.registerCommands(e, "me.km.quests");          
-        quest.registerEvents("me.km.quests");
+        quest.registerCommands(e, "me.km.snuviscript");          
+        quest.registerEvents("me.km.snuviscript");
         
         // Jobsystem
         jobs = new JobAPI("JobSystem", "Jobs", TextFormatting.GREEN);
@@ -188,8 +187,7 @@ public class KajetansMod
     @Mod.EventHandler
     public void init(FMLInitializationEvent event) 
     {
-        ModEntities.init();
-        ModDimensions.init();
+        proxy.initEntities();
     }
 
     @Mod.EventHandler
@@ -201,7 +199,7 @@ public class KajetansMod
     /*public static void main(String[] args)
     {
         // Erstellt alle Enums für die aktiven Effekte
-        PackageHelper.getClassesInIde("me.kt.effects.active").stream()
+        PackageHelper.getClassesInIde("me.km.effects.active").stream()
             .forEach(s -> 
             {
                 StringBuilder en = new StringBuilder(s.substring(0, s.length() - 6));

+ 0 - 13
src/main/java/me/km/TestEvents.java

@@ -1,13 +0,0 @@
-package me.km;
-
-import net.minecraftforge.event.entity.player.EntityItemPickupEvent;
-import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
-
-public class TestEvents 
-{
-    @SubscribeEvent
-    public void pickupItem(EntityItemPickupEvent event) 
-    {
-        System.out.println("Item picked up!");
-    }
-}

+ 0 - 3
src/main/java/me/km/commands/CommandSummon.java

@@ -56,9 +56,6 @@ public class CommandSummon extends ModuleCommand
             }
         }
         BlockPos target = Utils.getPlayerTarget(p).add(0, 1, 0);
-        int x = target.getX();
-        int y = target.getY();
-        int z = target.getZ();   
 
         String s = arg[0];
         double d0 = target.getX();

+ 1 - 6
src/main/java/me/km/dimensions/ModDimensions.java

@@ -22,11 +22,6 @@ public class ModDimensions
     public static final DimensionType CUSTOM_NETHER = DimensionType.register("CUSTOM_NETHER", "_cnether", 2, CustomWorldProviderHell.class, false);      
     public static final DimensionType CUSTOM_THE_END = DimensionType.register("CUSTOM_THE_END", "_cend", 4, CustomWorldProviderEnd.class, false);
 
-    public static void init() 
-    {
-        
-    }
-
     public static String getWorldName(World ws)
     {
         int dim = ws.provider.getDimension();
@@ -123,7 +118,7 @@ public class ModDimensions
             worldsettings = new WorldSettings(worldinfo);
         }
 
-        WorldServer overWorld = (WorldServer) new WorldServer(ms, isavehandler, worldinfo, dim, ms.theProfiler).init();
+        WorldServer overWorld = (WorldServer) new WorldServer(ms, isavehandler, worldinfo, dim, ms.profiler).init();
         overWorld.initialize(worldsettings);
         overWorld.addEventListener(new ServerWorldEventHandler(ms, overWorld));
         overWorld.getWorldInfo().setGameType(ms.getGameType());

+ 118 - 117
src/main/java/me/km/effects/Effect.java

@@ -8,136 +8,137 @@ public enum Effect
 {
     // comments indicate, that events aren't in active oder passive effect packages
     // passive effects
-    ENCHANTER               (false),   // me.kt.custom.CustomEnchanting 
-    LESS_HUNGER             (false),   // me.kt.environment.EnvironmentTick
-    LESS_THIRST             (false),   // me.kt.environment.EnvironmentAPI
-    LESS_ENERGY_USE         (false),   // me.kt.environment.EnvironmentAPI
-    LESS_COLD               (false),   // me.kt.environment.EnvironmentAPI
-    FASTER_MANA             (false),   // me.kt.environment.EnvironmentAPI    
-    BREED_COW               (false),        
-    BREED_PIG               (false),
-    BREED_SHEEP             (false),
-    BREED_RABBIT            (false),
-    BREED_CHICKEN           (false),
-    BREED_HORSE             (false),
-    BREED_MUSHROOMCOW       (false),
-    GRAVEL_SAND_DIGGER      (false),
-    MORE_MINERALS           (false),
-    MORE_CROPS              (false),
-    TREE_PICKER             (false),
-    MORE_SAPLINGS           (false),
-    CAKE_POWER              (false),
-    SNEAKING                (false),
-    SCENT                   (false),
-    MUGGING                 (false),
-    FAST_DIGGING            (false),
-    XP_COLLECTOR            (false),
-    MORE_DROPS              (false),
-    FASTER_ARROWS           (false),
-    ARROW_SAVER             (false),
-    MORE_AXE_DAMAGE         (false),
-    MORE_HOE_DAMAGE         (false),
-    MORE_PICKAXE_DAMAGE     (false),
-    MORE_SHOVEL_DAMAGE      (false),
-    MORE_SWORD_DAMAGE       (false),
-    MORE_DAGGER_DAMAGE      (false),
-    MORE_HAMMER_DAMAGE      (false),
-    MORE_STICK_DAMAGE       (false),
-    FISHING                 (false),
-    POTION_SAVER            (false),
-    BREWING                 (false),
-    CAULDRON_FILLING        (false),
-    SMELTING                (false),
-    NO_POISON               (false),
-    LESS_FALL_DAMAGE        (false),
-    LESS_DAMAGE             (false),
-    SMITH                   (false),
-    FAST_ENDERPEARL_SHOOT   (false),
-    PEARL_SAVER             (false),
-    NO_ENDERPEARL_DAMAGE    (false),
-    GOLD_WASHER             (false),
-    GOLD_RUSH               (false),
-    USE_WAND                (false),
-    LESS_ITEM_LOSS          (false),
+    ENCHANTER               ,   // me.kt.custom.CustomEnchanting 
+    LESS_HUNGER             ,   // me.kt.environment.EnvironmentTick
+    LESS_THIRST             ,   // me.kt.environment.EnvironmentAPI
+    LESS_ENERGY_USE         ,   // me.kt.environment.EnvironmentAPI
+    LESS_COLD               ,   // me.kt.environment.EnvironmentAPI
+    FASTER_MANA             ,   // me.kt.environment.EnvironmentAPI    
+    BREED_COW               ,        
+    BREED_PIG               ,
+    BREED_SHEEP             ,
+    BREED_RABBIT            ,
+    BREED_CHICKEN           ,
+    BREED_HORSE             ,
+    BREED_MUSHROOMCOW       ,
+    GRAVEL_SAND_DIGGER      ,
+    MORE_MINERALS           ,
+    MORE_CROPS              ,
+    TREE_PICKER             ,
+    MORE_SAPLINGS           ,
+    CAKE_POWER              ,
+    SNEAKING                ,
+    SCENT                   ,
+    MUGGING                 ,
+    FAST_DIGGING            ,
+    XP_COLLECTOR            ,
+    MORE_DROPS              ,
+    FASTER_ARROWS           ,
+    ARROW_SAVER             ,
+    MORE_AXE_DAMAGE         ,
+    MORE_HOE_DAMAGE         ,
+    MORE_PICKAXE_DAMAGE     ,
+    MORE_SHOVEL_DAMAGE      ,
+    MORE_SWORD_DAMAGE       ,
+    MORE_DAGGER_DAMAGE      ,
+    MORE_HAMMER_DAMAGE      ,
+    MORE_STICK_DAMAGE       ,
+    FISHING                 ,
+    POTION_SAVER            ,
+    BREWING                 ,
+    CAULDRON_FILLING        ,
+    SMELTING                ,
+    NO_POISON               ,
+    LESS_FALL_DAMAGE        ,
+    LESS_DAMAGE             ,
+    SMITH                   ,
+    FAST_ENDERPEARL_SHOOT   ,
+    PEARL_SAVER             ,
+    NO_ENDERPEARL_DAMAGE    ,
+    GOLD_WASHER             ,
+    GOLD_RUSH               ,
+    USE_WAND                ,
+    LESS_ITEM_LOSS          ,
+    NO_ARMOR_DROPPING       ,
     
     // active effects
-    ARCANE_SHOT             (true, ArcaneShot.class),
-    BLINDING_SHOT           (true, BlindingShot.class),
-    BUNNY_HOP               (true, BunnyHop.class),
-    CALL_BACK               (true, CallBack.class),
-    CLUSTER_BOMB            (true, ClusterBomb.class),
-    DAY                     (true, Day.class),
-    DOOMED                  (true, Doomed.class),
-    EARTHQUAKE              (true, Earthquake.class),
-    ELEVATION               (true, Elevation.class),
-    ELVISH_HORN             (true, ElvishHorn.class),
-    ENDERCHEST              (true, Enderchest.class),
-    EXPLOSION               (true, Explosion.class),
-    FALL_IMMUNITY           (true, FallImmunity.class),
-    FIRE                    (true, Fire.class),
-    FIREBALL                (true, Fireball.class),
-    FIRE_SHOT               (true, FireShot.class),
-    FLYING                  (true, Flying.class),
-    FREEZE                  (true, Freeze.class),
-    GRAPPLING_HOOK          (true, GrapplingHook.class),
-    HARM                    (true, Harm.class),
-    HARVEST                 (true, Harvest.class),
-    HEAL                    (true, Heal.class),
-    HEAL_RAIN               (true, HealRain.class),
-    HEARTS                  (true, Hearts.class),
-    HEART_SEEKER            (true, HeartSeeker.class),
-    IMMORTALITY             (true, Immortality.class),
-    INVISIBILITY            (true, Invisibility.class),
-    JUMP                    (true, Jump.class),
-    KICK                    (true, Kick.class),
-    LEAF_COCOON             (true, LeafCocoon.class),
-    LOCK_PICK               (true, LockPick.class),
-    LUCKY                   (true, Lucky.class),
-    MUSKET                  (true, Musket.class),
-    NAIL_DOWN               (true, NailDown.class),
-    NAIL_TRAP               (true, NailTrap.class),
-    NET_TRAP                (true, NetTrap.class),
-    NIGHT                   (true, Night.class),
-    POISON                  (true, Poison.class),
-    POISONED_BLADE          (true, PoisonedBlade.class),
-    POISON_VOLLEY           (true, PoisonVolley.class),
-    POWER                   (true, Power.class),
-    POWER_ATTACK            (true, PowerAttack.class),
-    PULL                    (true, Pull.class),
-    PUSH                    (true, Push.class),
-    QUICK_SHOT              (true, QuickShot.class),
-    RAIN                    (true, Rain.class),
-    RAPID_FIRE              (true, RapidFire.class),
-    ROOTING                 (true, Rooting.class),
-    SHADOW                  (true, Shadow.class),
-    SHADOW_HIT              (true, ShadowHit.class),
-    SHADOW_STEP             (true, ShadowStep.class),
-    SILENCE                 (true, Silence.class),
-    SLOWING_SHOT            (true, SlowingShot.class),
-    SMOKE_BOMB              (true, SmokeBomb.class),
-    SPRINT                  (true, Sprint.class),
-    STONE                   (true, Stone.class),
-    SUN                     (true, Sun.class),
-    TELEPORT_PLAYER         (true, TeleportPlayer.class),
-    THOR                    (true, Thor.class),
-    UNLUCKY                 (true, Unlucky.class),
-    VINE_TRAP               (true, VineTrap.class),
-    WORKBENCH               (true, Workbench.class);
+    ARCANE_SHOT             (ArcaneShot.class),
+    BLINDING_SHOT           (BlindingShot.class),
+    BUNNY_HOP               (BunnyHop.class),
+    CALL_BACK               (CallBack.class),
+    CLUSTER_BOMB            (ClusterBomb.class),
+    DAY                     (Day.class),
+    DOOMED                  (Doomed.class),
+    EARTHQUAKE              (Earthquake.class),
+    ELEVATION               (Elevation.class),
+    ELVISH_HORN             (ElvishHorn.class),
+    ENDERCHEST              (Enderchest.class),
+    EXPLOSION               (Explosion.class),
+    FALL_IMMUNITY           (FallImmunity.class),
+    FIRE                    (Fire.class),
+    FIREBALL                (Fireball.class),
+    FIRE_SHOT               (FireShot.class),
+    FLYING                  (Flying.class),
+    FREEZE                  (Freeze.class),
+    GRAPPLING_HOOK          (GrapplingHook.class),
+    HARM                    (Harm.class),
+    HARVEST                 (Harvest.class),
+    HEAL                    (Heal.class),
+    HEAL_RAIN               (HealRain.class),
+    HEARTS                  (Hearts.class),
+    HEART_SEEKER            (HeartSeeker.class),
+    IMMORTALITY             (Immortality.class),
+    INVISIBILITY            (Invisibility.class),
+    JUMP                    (Jump.class),
+    KICK                    (Kick.class),
+    LEAF_COCOON             (LeafCocoon.class),
+    LOCK_PICK               (LockPick.class),
+    LUCKY                   (Lucky.class),
+    MUSKET                  (Musket.class),
+    NAIL_DOWN               (NailDown.class),
+    NAIL_TRAP               (NailTrap.class),
+    NET_TRAP                (NetTrap.class),
+    NIGHT                   (Night.class),
+    POISON                  (Poison.class),
+    POISONED_BLADE          (PoisonedBlade.class),
+    POISON_VOLLEY           (PoisonVolley.class),
+    POWER                   (Power.class),
+    POWER_ATTACK            (PowerAttack.class),
+    PULL                    (Pull.class),
+    PUSH                    (Push.class),
+    QUICK_SHOT              (QuickShot.class),
+    RAIN                    (Rain.class),
+    RAPID_FIRE              (RapidFire.class),
+    ROOTING                 (Rooting.class),
+    SHADOW                  (Shadow.class),
+    SHADOW_HIT              (ShadowHit.class),
+    SHADOW_STEP             (ShadowStep.class),
+    SILENCE                 (Silence.class),
+    SLOWING_SHOT            (SlowingShot.class),
+    SMOKE_BOMB              (SmokeBomb.class),
+    SPRINT                  (Sprint.class),
+    STONE                   (Stone.class),
+    SUN                     (Sun.class),
+    TELEPORT_PLAYER         (TeleportPlayer.class),
+    THOR                    (Thor.class),
+    UNLUCKY                 (Unlucky.class),
+    VINE_TRAP               (VineTrap.class),
+    WORKBENCH               (Workbench.class);
     
     private final ArrayList<Skill> skills;
     private final Class<? extends ActiveEffectBase> c;
     private final boolean active;
     
-    Effect(boolean active, Class<? extends ActiveEffectBase> c) 
+    Effect(Class<? extends ActiveEffectBase> c) 
     {
         skills = new ArrayList<>();
-        this.active = active;
+        this.active = c != null;
         this.c = c;
     }
     
-    Effect(boolean active) 
+    Effect()
     {
-        this(active, null);
+        this(null);
     }
     
     public void addSkill(Skill s)

+ 23 - 5
src/main/java/me/km/effects/passive/BlockBreakEffects.java

@@ -15,9 +15,11 @@ import net.minecraft.enchantment.EnchantmentHelper;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.init.Blocks;
 import net.minecraft.init.Enchantments;
+import net.minecraft.init.Items;
 import net.minecraft.item.ItemStack;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.World;
+import net.minecraftforge.event.entity.player.PlayerEvent;
 import net.minecraftforge.event.world.BlockEvent;
 import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
 
@@ -104,23 +106,39 @@ public class BlockBreakEffects extends ModuleListener
         // Tree Picker und More Saplings
         // ---------------------------------------------------------------------
         
-        if((b == Material.LEAVES || b == Material.LEAVES_2) && hand.getType() != Material.SHEARS)
+        if((b == Blocks.LEAVES || b == Blocks.LEAVES2) && hand.getItem() != Items.SHEARS)
         {
             if(Utils.randomInt(1, 25) <= EffectUtils.getEffectLevel(p, Effect.TREE_PICKER))
             {
-                Utils.dropRandomTreeItem(b);
+                Utils.dropRandomTreeItem(w, pos, state);
             }
             if(Utils.randomInt(1, 25) <=  EffectUtils.getEffectLevel(p, Effect.MORE_SAPLINGS))
             {
-                if(m == Material.LEAVES)
+                if(b == Blocks.LEAVES)
                 {
-                    new ItemStackBuilder(Material.SAPLING, 1, (short) (b.getState().getData().toItemStack().getDurability() % 4)).drop(l);
+                    new ItemStackBuilder(Blocks.SAPLING, 1, b.getMetaFromState(state) % 4).drop(w, pos);
                 }
                 else
                 {
-                    new ItemStackBuilder(Material.SAPLING, 1, (short) ((b.getState().getData().toItemStack().getDurability() % 4) + 4)).drop(l);
+                    new ItemStackBuilder(Blocks.SAPLING, 1, (b.getMetaFromState(state) % 4) + 4).drop(w, pos);
                 }
             }
         }
     }
+    
+    @SubscribeEvent(receiveCanceled = false)
+    public void onBlockDamage(PlayerEvent.BreakSpeed e)
+    {       
+        EntityPlayer p = e.getEntityPlayer();
+        if(KajetansMod.worldManager.getWorldPreferences(p.world).skills &&
+            KajetansMod.jobs.isPreferedMaterial(p, e.getState().getBlock()))
+        {
+            // Speed up with prefered blocks of current job
+            int digging = EffectUtils.getEffectLevel(p, Effect.FAST_DIGGING);
+            if(digging >= 1)
+            {
+                e.setNewSpeed(e.getOriginalSpeed() * (1 + (digging / 5)));
+            }
+        }
+    }
 }

+ 25 - 3
src/main/java/me/km/effects/passive/BlockClickEffects.java

@@ -6,10 +6,13 @@ import me.km.api.Location;
 import me.km.api.Module;
 import me.km.api.ModuleListener;
 import me.km.api.Utils;
+import me.km.effects.Effect;
+import me.km.effects.EffectUtils;
 import net.minecraft.block.Block;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.entity.player.EntityPlayerMP;
 import net.minecraft.init.Blocks;
+import net.minecraft.world.World;
 import net.minecraftforge.event.entity.player.PlayerInteractEvent;
 import net.minecraftforge.event.world.BlockEvent;
 import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
@@ -69,11 +72,21 @@ public class BlockClickEffects extends ModuleListener
     public void interact(PlayerInteractEvent.RightClickBlock e)
     {       
         Block b = e.getWorld().getBlockState(e.getPos()).getBlock();
-        if(b == Blocks.SEA_LANTERN ||
-            !KajetansMod.worldManager.getWorldPreferences(e.getWorld()).skills)
+        if(KajetansMod.worldManager.getWorldPreferences(e.getWorld()).skills)
         {
-            return;
+            if(b == Blocks.SEA_LANTERN)
+            {
+                handleTeleportBlock(e);
+            }
+            else if(b == Blocks.CAULDRON)
+            {
+                handleCauldronFilling(e);
+            }
         }
+    }
+    
+    private void handleTeleportBlock(PlayerInteractEvent.RightClickBlock e)
+    {
         Location l = new Location(e.getWorld(), e.getPos());
         Data data = blocks.get(l);
         if(data == null)
@@ -92,4 +105,13 @@ public class BlockClickEffects extends ModuleListener
             l.getWorld().setBlockToAir(l.getBlockPos());
         }
     }
+    
+    private void handleCauldronFilling(PlayerInteractEvent.RightClickBlock e)
+    {
+        if(EffectUtils.getEffectLevel(e.getEntityPlayer(), Effect.CAULDRON_FILLING) >= 1)
+        {
+            World w = e.getWorld();
+            Blocks.CAULDRON.setWaterLevel(w, e.getPos(), w.getBlockState(e.getPos()), 3);   
+        }
+    }
 }

+ 0 - 51
src/main/java/me/km/effects/passive/BlockDamageEffects.java

@@ -1,51 +0,0 @@
-package me.km.effects.passive;
-
-import me.kt.KajetansTools;
-import me.kt.api.Module;
-import me.kt.api.ModuleListener;
-import me.kt.effects.Effect;
-import me.kt.effects.EffectUtils;
-import org.bukkit.block.Block;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.block.BlockDamageEvent;
-import org.bukkit.potion.PotionEffect;
-import org.bukkit.potion.PotionEffectType;
-
-public class BlockDamageEffects extends ModuleListener
-{
-    public BlockDamageEffects(Module m) 
-    {
-        super(m);
-    }
-    
-    @EventHandler(ignoreCancelled = true)
-    public void onBlockDamage(BlockDamageEvent e)
-    {       
-        Player p = (Player) e.getPlayer();
-        if(!KajetansTools.worldManager.getWorldPreferences(p.getWorld()).skills)
-        {
-            return;
-        }
-        
-        Block b = (Block) e.getBlock();
-        
-        // OP-Effekt aus Prinzip entfernen
-        if(p.hasPotionEffect(PotionEffectType.FAST_DIGGING))
-        {           
-            if(p.getActivePotionEffects().stream()
-                .anyMatch(pe -> pe.getType().equals(PotionEffectType.FAST_DIGGING) && 
-                                pe.getDuration() > 20000))
-            {
-                p.removePotionEffect(PotionEffectType.FAST_DIGGING);
-            }
-        }
-               
-        // Speed up with prefered Blocks of current job
-        int digging = EffectUtils.getEffectLevel(p, Effect.FAST_DIGGING);
-        if(digging >= 1 && KajetansTools.jobs.isPreferedMaterial(p, b.getType()))
-        {
-            p.addPotionEffect(new PotionEffect(PotionEffectType.FAST_DIGGING, 999999, digging - 1), true);
-        }
-    }
-}

+ 59 - 38
src/main/java/me/km/effects/passive/Breeding.java

@@ -1,13 +1,26 @@
 package me.km.effects.passive;
 
-import me.kt.KajetansTools;
-import me.kt.api.Module;
-import me.kt.api.ModuleListener;
-import me.kt.effects.Effect;
-import me.kt.effects.EffectUtils;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.player.PlayerInteractEntityEvent;
+import me.km.KajetansMod;
+import me.km.api.Module;
+import me.km.api.ModuleListener;
+import me.km.effects.Effect;
+import me.km.effects.EffectUtils;
+import net.minecraft.block.Block;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.passive.EntityChicken;
+import net.minecraft.entity.passive.EntityCow;
+import net.minecraft.entity.passive.EntityHorse;
+import net.minecraft.entity.passive.EntityPig;
+import net.minecraft.entity.passive.EntityRabbit;
+import net.minecraft.entity.passive.EntitySheep;
+import net.minecraft.entity.passive.EntityMooshroom;
+import net.minecraft.entity.passive.IAnimals;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraftforge.event.entity.player.PlayerInteractEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
 
 public class Breeding extends ModuleListener
 {
@@ -16,64 +29,72 @@ public class Breeding extends ModuleListener
         super(m);
     }
     
-    @EventHandler(ignoreCancelled = true)
-    public void onEntityBreed(PlayerInteractEntityEvent e)    
+    @SubscribeEvent(receiveCanceled = false)
+    public void onEntityBreed(PlayerInteractEvent.EntityInteract e)    
     {              
-        Player p = (Player) e.getPlayer();  
-        if(!KajetansTools.worldManager.getWorldPreferences(p.getWorld()).skills)
+        if(!KajetansMod.worldManager.getWorldPreferences(e.getWorld()).skills)
         {
             return;
         }
-        switch(e.getRightClicked().getType())
+        Entity ent = e.getTarget();
+        if(ent instanceof IAnimals)
         {
-            case COW:
+            EntityPlayer p = e.getEntityPlayer();
+            Class c = ent.getClass();
+            if(c == EntityCow.class)
+            {
                 if(EffectUtils.getEffectLevel(p, Effect.BREED_COW) < 1)
                 {
-                    e.setCancelled(true);
+                    e.setCanceled(true);
                 }
-                break;
-            case PIG:
+            }
+            else if(c == EntityPig.class) 
+            {
                 if(EffectUtils.getEffectLevel(p, Effect.BREED_PIG) < 1)
                 {
-                    e.setCancelled(true);
+                    e.setCanceled(true);
                 }
-                break;
-            case SHEEP:
+            }
+            else if(c == EntitySheep.class) 
+            {
                 if(EffectUtils.getEffectLevel(p, Effect.BREED_SHEEP) < 1)
                 {
-                    e.setCancelled(true);
+                    e.setCanceled(true);
                 }
-                break;
-            case RABBIT:
+            }
+            else if(c == EntityRabbit.class) 
+            {
                 if(EffectUtils.getEffectLevel(p, Effect.BREED_RABBIT) < 1)
                 {
-                    e.setCancelled(true);
+                    e.setCanceled(true);
                 }
-                break;
-            case CHICKEN:
+            }
+            else if(c == EntityChicken.class) 
+            {
                 if(EffectUtils.getEffectLevel(p, Effect.BREED_CHICKEN) < 1)
                 {
-                    e.setCancelled(true);
+                    e.setCanceled(true);
                 }
-                break;
-            case HORSE:
+            }
+            else if(c == EntityHorse.class) 
+            {
                 if(EffectUtils.getEffectLevel(p, Effect.BREED_HORSE) < 1)
                 {
-                    switch(p.getInventory().getItemInMainHand().getType())
+                    Item item = e.getItemStack().getItem();
+                    if(item == Items.GOLDEN_CARROT || item == Items.WHEAT || item == Items.APPLE ||
+                        item == Items.SUGAR || item == Items.GOLDEN_APPLE || Block.getBlockFromItem(item) == Blocks.HAY_BLOCK) 
                     {
-                        case GOLDEN_APPLE:
-                        case GOLDEN_CARROT:
-                            e.setCancelled(true);
-                            break;
+                        e.setCanceled(true);
                     }
                 }
-                break;
-            case MUSHROOM_COW:
+            }
+            else if(c == EntityMooshroom.class)
+            {
                 if(EffectUtils.getEffectLevel(p, Effect.BREED_MUSHROOMCOW) < 1)
                 {
-                    e.setCancelled(true);
+                    e.setCanceled(true);
                 }
-                break;
+            }
         }
     }
 }

+ 0 - 44
src/main/java/me/km/effects/passive/Brewing.java

@@ -1,44 +0,0 @@
-package me.km.effects.passive;
-
-import java.util.Collection;
-import me.kt.KajetansTools;
-import me.kt.api.Module;
-import me.kt.api.ModuleListener;
-import me.kt.api.Utils;
-import me.kt.effects.Effect;
-import me.kt.effects.EffectUtils;
-import org.bukkit.Location;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.inventory.BrewEvent;
-
-public class Brewing extends ModuleListener
-{
-    public Brewing(Module m) 
-    {
-        super(m);
-    }
-    
-    @EventHandler
-    public void Brewing(BrewEvent e)
-    {  
-        Location l = e.getBlock().getLocation();
-        if(!KajetansTools.worldManager.getWorldPreferences(l.getWorld()).skills)
-        {
-            return;
-        }
-        e.setCancelled(true);
-        Collection<Player> players = Utils.getNearbyEntities(l, 4, Player.class);
-        if(!players.isEmpty())
-        {
-            for(Player p : players)
-            {
-                if(EffectUtils.getEffectLevel(p, Effect.BREWING) >= 1)
-                {
-                    e.setCancelled(false);
-                    return;
-                }
-            }
-        }
-    } 
-}

+ 19 - 30
src/main/java/me/km/effects/passive/CakeEating.java

@@ -1,17 +1,16 @@
 package me.km.effects.passive;
 
-import me.kt.KajetansTools;
-import me.kt.api.Module;
-import me.kt.api.ModuleListener;
-import me.kt.api.Utils;
-import me.kt.effects.Effect;
-import me.kt.effects.EffectUtils;
-import org.bukkit.Material;
-import org.bukkit.block.Block;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.player.PlayerInteractEvent;
-import org.bukkit.inventory.EquipmentSlot;
+import me.km.KajetansMod;
+import me.km.api.Module;
+import me.km.api.ModuleListener;
+import me.km.api.Utils;
+import me.km.effects.Effect;
+import me.km.effects.EffectUtils;
+import net.minecraft.block.Block;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.EnumHand;
+import net.minecraftforge.event.entity.player.PlayerInteractEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
 
 public class CakeEating extends ModuleListener
 {
@@ -20,28 +19,18 @@ public class CakeEating extends ModuleListener
         super(m);
     }
     
-    @EventHandler(ignoreCancelled = true)
-    public void eatCake(PlayerInteractEvent e)
+    @SubscribeEvent(receiveCanceled = false)
+    public void eatCake(PlayerInteractEvent.RightClickBlock e)
     {
-        if(!KajetansTools.worldManager.getWorldPreferences(e.getPlayer().getWorld()).skills)
+        if(e.getHand() == EnumHand.OFF_HAND || !KajetansMod.worldManager.getWorldPreferences(e.getWorld()).skills)
         {
             return;
         }
-        Block b = e.getClickedBlock();
-        if(b == null || b.getType() != Material.CAKE_BLOCK || e.getHand() == EquipmentSlot.OFF_HAND)
+        Block b = e.getWorld().getBlockState(e.getPos()).getBlock();
+        if(b == Blocks.CAKE && EffectUtils.getEffectLevel(e.getEntityPlayer(), Effect.CAKE_POWER) >= Utils.randomInt(1, 5))
         {
-            return;
-        }    
-        Player p = e.getPlayer();
-        if(p.getFoodLevel() >= 20)
-        {                             
-            return;
-        }
-        if(EffectUtils.getEffectLevel(p, Effect.CAKE_POWER) >= Utils.randomInt(1, 5))
-        {           
-            e.setCancelled(true);
-            p.setFoodLevel(p.getFoodLevel() + 2);
-            p.setSaturation(p.getSaturation() + (float) 0.4);
-        }        
+            e.setCanceled(true);
+            e.getEntityPlayer().getFoodStats().addStats(2, 0.1F);
+        }       
     }
 }

+ 0 - 47
src/main/java/me/km/effects/passive/CauldronFilling.java

@@ -1,47 +0,0 @@
-package me.km.effects.passive;
-
-import me.kt.KajetansTools;
-import me.kt.api.Module;
-import me.kt.api.ModuleListener;
-import me.kt.effects.Effect;
-import me.kt.effects.EffectUtils;
-import me.kt.skills.Skill;
-import org.bukkit.Material;
-import org.bukkit.block.Block;
-import org.bukkit.block.BlockState;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.player.PlayerInteractEvent;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.material.Cauldron;
-
-public class CauldronFilling extends ModuleListener
-{
-    public CauldronFilling(Module m) 
-    {
-        super(m);
-    }
-    
-    @EventHandler
-    public void useCauldron(PlayerInteractEvent e)
-    {
-        Block b = e.getClickedBlock();
-        if(b == null || b.getType() != Material.CAULDRON || !KajetansTools.worldManager.getWorldPreferences(b.getWorld()).skills)
-        {
-            return;
-        }    
-        Player p = e.getPlayer();
-        if(EffectUtils.getEffectLevel(p, Effect.CAULDRON_FILLING) < 1)
-        {
-            return;
-        }
-        BlockState state = b.getState();
-        Cauldron cauldron = (Cauldron) state.getData();   
-        if(cauldron.isEmpty());
-        {
-            ItemStack stack = new ItemStack(Material.CAULDRON, 1, (byte) 3);
-            state.setData(stack.getData());
-            state.update();
-        }
-    }
-}

+ 16 - 3
src/main/java/me/km/effects/passive/Anvil.java → src/main/java/me/km/effects/passive/ContainerEvent.java

@@ -6,13 +6,16 @@ import me.km.api.ModuleListener;
 import me.km.effects.Effect;
 import me.km.effects.EffectUtils;
 import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.ContainerChest;
 import net.minecraft.inventory.ContainerRepair;
+import net.minecraft.tileentity.TileEntityBrewingStand;
 import net.minecraftforge.event.entity.player.PlayerContainerEvent;
 import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
 
-public class Anvil extends ModuleListener
+public class ContainerEvent extends ModuleListener
 {
-    public Anvil(Module m)
+    public ContainerEvent(Module m)
     {
         super(m);
     }
@@ -20,7 +23,8 @@ public class Anvil extends ModuleListener
     @SubscribeEvent
     public void inAnvilMenuClick(PlayerContainerEvent.Open e)
     { 
-        if(e.getContainer() instanceof ContainerRepair)
+        Container c = e.getContainer();
+        if(c instanceof ContainerRepair)
         {
             EntityPlayer p = e.getEntityPlayer();
             if(KajetansMod.worldManager.getWorldPreferences(p.world).skills &&
@@ -29,5 +33,14 @@ public class Anvil extends ModuleListener
                 p.closeScreen();
             }
         }
+        else if((c instanceof ContainerChest) && ((ContainerChest) c).getLowerChestInventory() instanceof TileEntityBrewingStand)
+        {
+            EntityPlayer p = e.getEntityPlayer();
+            if(KajetansMod.worldManager.getWorldPreferences(p.world).skills &&
+                EffectUtils.getEffectLevel(p, Effect.BREWING) < 1)
+            {
+                p.closeScreen();
+            }
+        }
     }
 }

+ 10 - 18
src/main/java/me/km/effects/passive/Crafting.java

@@ -1,14 +1,10 @@
 package me.km.effects.passive;
 
-import me.kt.KajetansTools;
-import me.kt.api.Module;
-import me.kt.api.ModuleListener;
-import org.bukkit.Material;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.inventory.PrepareItemCraftEvent;
-import org.bukkit.inventory.CraftingInventory;
-import org.bukkit.inventory.ItemStack;
+import me.km.KajetansMod;
+import me.km.api.Module;
+import me.km.api.ModuleListener;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import net.minecraftforge.fml.common.gameevent.PlayerEvent;
 
 public class Crafting extends ModuleListener
 {
@@ -17,17 +13,13 @@ public class Crafting extends ModuleListener
         super(m);
     }
     
-    @EventHandler
-    public void PreCrafting(PrepareItemCraftEvent e)
+    @SubscribeEvent
+    public void PreCrafting(PlayerEvent.ItemCraftedEvent e)
     {  
-        CraftingInventory inv = e.getInventory();
-        if(inv.getResult() != null && 
-            e.getViewers().size() >= 1 &&
-            e.getViewers().get(0) instanceof Player &&
-            !KajetansTools.worldManager.getWorldPreferences(e.getInventory().getLocation().getWorld()).defaultProducing &&
-            !KajetansTools.jobs.hasRecipe((Player) e.getViewers().get(0), inv.getResult().getType()))
+        if(!KajetansMod.worldManager.getWorldPreferences(e.player.world).defaultProducing &&
+            !KajetansMod.jobs.hasRecipe(e.player, e.crafting.getItem()))
         {
-            inv.setResult(new ItemStack(Material.AIR));
+            e.crafting.setCount(0);
         }  
     } 
 }

+ 0 - 75
src/main/java/me/km/effects/passive/EnderpearlEffects.java

@@ -1,75 +0,0 @@
-package me.km.effects.passive;
-
-import me.kt.KajetansTools;
-import me.kt.api.Module;
-import me.kt.api.ModuleListener;
-import me.kt.api.Utils;
-import me.kt.effects.Effect;
-import me.kt.effects.EffectUtils;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.EntityType;
-import org.bukkit.entity.Player;
-import org.bukkit.entity.Projectile;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.entity.EntityDamageByEntityEvent;
-import org.bukkit.event.entity.EntityDamageEvent;
-import org.bukkit.event.entity.ProjectileLaunchEvent;
-import org.bukkit.inventory.ItemStack;
-
-public class EnderpearlEffects extends ModuleListener 
-{
-    public EnderpearlEffects(Module m)
-    {
-        super(m);
-    }
-       
-    @EventHandler(ignoreCancelled = true)
-    public void preventEnderPearlDamage(EntityDamageByEntityEvent e)
-    {
-        Entity ent = e.getEntity();
-        if(e.getCause() == EntityDamageEvent.DamageCause.FALL &&
-            ent instanceof Player && 
-            e.getDamager().getType() == EntityType.ENDER_PEARL &&
-            KajetansTools.worldManager.getWorldPreferences(ent.getWorld()).skills &&
-            EffectUtils.getEffectLevel((Player) ent, Effect.NO_ENDERPEARL_DAMAGE) >= 1)
-        {
-            e.setCancelled(true);
-        }
-    }
-    
-    @EventHandler(ignoreCancelled = true)
-    public void PlayerUsesEnderPearlEvent(ProjectileLaunchEvent e)
-    {
-        Projectile pro = e.getEntity();
-        if(Utils.randomBoolean() ||
-            pro.getType() != EntityType.ENDER_PEARL || 
-            !(pro.getShooter() instanceof Player) ||
-            !KajetansTools.worldManager.getWorldPreferences(pro.getWorld()).skills)
-        {
-            return;
-        }
-        Player p = (Player) pro.getShooter();
-        if(EffectUtils.getEffectLevel(p, Effect.PEARL_SAVER) >= 1)
-        {     
-            ItemStack stack = p.getInventory().getItemInMainHand(); 
-            stack.setAmount(stack.getAmount() + 1); 
-            p.getInventory().setItemInMainHand(stack);
-        }
-    }
-    
-    @EventHandler(ignoreCancelled = true)
-    public void EnderPearlSpeedEvent(ProjectileLaunchEvent e)
-    {       
-        Projectile pro = e.getEntity();
-        if(pro.getType() == EntityType.ENDER_PEARL &&
-            pro.getShooter() instanceof Player &&
-            KajetansTools.worldManager.getWorldPreferences(pro.getWorld()).skills)
-        {
-            int speed = EffectUtils.getEffectLevel((Player) pro.getShooter(), Effect.FAST_ENDERPEARL_SHOOT);
-            if(speed >= 1)
-            {
-                pro.setVelocity(pro.getVelocity().multiply(speed + 1));
-            }
-        }
-    }
-}

+ 59 - 59
src/main/java/me/km/effects/passive/EntityDamageEffects.java

@@ -1,21 +1,19 @@
 package me.km.effects.passive;
 
-import me.kt.KajetansTools;
-import me.kt.api.Module;
-import me.kt.api.ModuleListener;
-import me.kt.api.Utils;
-import me.kt.effects.Effect;
-import me.kt.effects.EffectUtils;
-import me.kt.nms.NmsUtilities;
-import me.kt.playerbank.PlayerData;
-import org.bukkit.entity.LivingEntity;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.entity.EntityDamageByEntityEvent;
-import org.bukkit.event.entity.EntityDamageEvent;
-import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
-import org.bukkit.potion.PotionEffect;
-import org.bukkit.potion.PotionEffectType;
+import me.km.KajetansMod;
+import me.km.api.Module;
+import me.km.api.ModuleListener;
+import me.km.api.Utils;
+import me.km.effects.Effect;
+import me.km.effects.EffectUtils;
+import me.km.events.PlayerHurtEvent;
+import me.km.playerbank.PlayerData;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.MobEffects;
+import net.minecraft.util.DamageSource;
+import net.minecraftforge.event.entity.living.LivingHurtEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
 
 public class EntityDamageEffects extends ModuleListener
 {
@@ -24,114 +22,116 @@ public class EntityDamageEffects extends ModuleListener
         super(m);
     }
     
-    @EventHandler
-    public void damageHandler(EntityDamageEvent e)
-    {           
-        if(!(e.getEntity() instanceof Player) || 
-            !KajetansTools.worldManager.getWorldPreferences(e.getEntity().getWorld()).skills)
+    @SubscribeEvent(receiveCanceled = false)
+    public void damageHandler(PlayerHurtEvent e)
+    {          
+        EntityPlayer p = e.getEntityPlayer();
+        if(!KajetansMod.worldManager.getWorldPreferences(p.world).skills)
         {
             return;
         } 
-        Player p = (Player) e.getEntity();
-        PlayerData data = KajetansTools.playerbank.getData(p);
         
         int reducer = EffectUtils.getEffectLevel(p, Effect.LESS_DAMAGE);
         if(reducer > 0)
         {
-            e.setDamage(e.getFinalDamage() / (reducer + 1));
+            e.setAmount(e.getAmount() / (reducer + 1));
         }
         
+        PlayerData data = KajetansMod.playerbank.getData(p);
         if(data.hasData("shadow"))
         {
-            NmsUtilities.setInvisible(false, p);
+            p.setInvisible(false);
             data.removeData("shadow");
         } 
         
-        DamageCause cause = e.getCause();
-        if(cause == DamageCause.POISON && 
-            EffectUtils.getEffectLevel(p, Effect.NO_POISON) >= 1)
+        DamageSource cause = e.getSource();
+        
+        if(cause.isMagicDamage() && EffectUtils.getEffectLevel(p, Effect.NO_POISON) >= 1)
         {
-            e.setCancelled(true);
+            e.setCanceled(true);
         } 
-        else if(e.getCause() == DamageCause.FALL)
+        else if(cause == DamageSource.FALL)
         {
             if(data.hasData("fallimmunity"))
             {
-                e.setCancelled(true);
+                e.setCanceled(true);
                 return;
             }
             int fall = EffectUtils.getEffectLevel(p, Effect.LESS_FALL_DAMAGE);
             if(fall >= 1)
             {
-                e.setDamage(e.getDamage() / (fall * 2 + 1));
+                e.setAmount(e.getAmount() / (fall * 2 + 1));
             }
         }
     }
     
-    @EventHandler(ignoreCancelled = true)
-    public void onEntityDamage(EntityDamageByEntityEvent e)
-    {           
-        if(!(e.getDamager() instanceof Player) || 
-            e.getCause() != EntityDamageEvent.DamageCause.ENTITY_ATTACK ||
-            !KajetansTools.worldManager.getWorldPreferences(e.getEntity().getWorld()).skills)
+    @SubscribeEvent(receiveCanceled = false)
+    public void onEntityDamage(LivingHurtEvent e)
+    {         
+        if(!KajetansMod.worldManager.getWorldPreferences(e.getEntity().world).skills)
         {
             return;
         }  
-        Player p = (Player) e.getDamager();
-        Utils.ToolTypes tt = Utils.getToolType(p.getInventory().getItemInMainHand());
-        double damageBonus = 1;
+        Entity ent = e.getSource().getEntity();
+        if(ent == null || !(ent instanceof EntityPlayer))
+        {
+            return;
+        } 
+        EntityPlayer p = (EntityPlayer) ent;
+        Utils.ToolTypes tt = Utils.getToolType(p.getHeldItemMainhand());
+        float damageBonus = 1;
         if(tt != null)
         {
             switch(tt)
             {
                 case AXE:
-                    damageBonus += 0.1d * EffectUtils.getEffectLevel(p, Effect.MORE_AXE_DAMAGE);
+                    damageBonus += 0.1f * EffectUtils.getEffectLevel(p, Effect.MORE_AXE_DAMAGE);
                     break;
                 case HOE:  
-                    damageBonus += 0.1d * EffectUtils.getEffectLevel(p, Effect.MORE_HOE_DAMAGE);
+                    damageBonus += 0.1f * EffectUtils.getEffectLevel(p, Effect.MORE_HOE_DAMAGE);
                     break;
                 case PICKAXE:
-                    damageBonus += 0.1d * EffectUtils.getEffectLevel(p, Effect.MORE_PICKAXE_DAMAGE);
+                    damageBonus += 0.1f * EffectUtils.getEffectLevel(p, Effect.MORE_PICKAXE_DAMAGE);
                     break;
                 case SHOVEL:
-                    damageBonus += 0.1d * EffectUtils.getEffectLevel(p, Effect.MORE_SHOVEL_DAMAGE);
+                    damageBonus += 0.1f * EffectUtils.getEffectLevel(p, Effect.MORE_SHOVEL_DAMAGE);
                     break;
                 case SWORD:
-                    damageBonus += 0.1d * EffectUtils.getEffectLevel(p, Effect.MORE_SWORD_DAMAGE);
+                    damageBonus += 0.1f * EffectUtils.getEffectLevel(p, Effect.MORE_SWORD_DAMAGE);
                     break;
                 case DAGGER:
-                    damageBonus += 0.1d * EffectUtils.getEffectLevel(p, Effect.MORE_DAGGER_DAMAGE);
+                    damageBonus += 0.1f * EffectUtils.getEffectLevel(p, Effect.MORE_DAGGER_DAMAGE);
                     break;
                 case HAMMER:
-                    damageBonus += 0.1d * EffectUtils.getEffectLevel(p, Effect.MORE_HAMMER_DAMAGE);
+                    damageBonus += 0.1f * EffectUtils.getEffectLevel(p, Effect.MORE_HAMMER_DAMAGE);
                     break;
                 case STICK:
-                    damageBonus += 0.1d * EffectUtils.getEffectLevel(p, Effect.MORE_STICK_DAMAGE);
+                    damageBonus += 0.1f * EffectUtils.getEffectLevel(p, Effect.MORE_STICK_DAMAGE);
                     break;
             }
         }
         
-        PlayerData data = KajetansTools.playerbank.getData(p);
+        PlayerData data = KajetansMod.playerbank.getData(p);
 
         if(data.removeData("shadowhit"))
         {
-            p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 40, 1), true);
-            p.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, 40, 0), true);
+            EffectUtils.addPotionTo(p, MobEffects.SPEED, 40, 1);
+            EffectUtils.addPotionTo(p, MobEffects.INVISIBILITY, 40, 0);
         }
         
-        if(e.getEntity() instanceof Player)
+        if(e.getEntity() instanceof EntityPlayer)
         {
-            Player victim = (Player) e.getEntity();
-            Player damager = KajetansTools.playerbank.getData(victim).getData("doomed", Player.class);
+            EntityPlayer victim = (EntityPlayer) e.getEntity();
+            EntityPlayer damager = KajetansMod.playerbank.getData(victim).getData("doomed", EntityPlayer.class);
             if(damager != null && damager.equals(p))
             {
-                damageBonus *= 1.2d;
+                damageBonus *= 1.2f;
             }
         }
         
-        if(e.getEntity() instanceof LivingEntity && data.hasData("poisonedblade"))
+        if(data.hasData("poisonedblade"))
         {
-            ((LivingEntity) e.getEntity()).addPotionEffect(new PotionEffect(PotionEffectType.POISON, 80, 1), true);
+            EffectUtils.addPotionTo(e.getEntityLiving(), MobEffects.SPEED, 80, 1);
         }
         
         double powerAttack = data.getDouble("powerattack");
@@ -141,6 +141,6 @@ public class EntityDamageEffects extends ModuleListener
             data.removeData("powerattack");
         }
         
-        e.setDamage(e.getDamage() * damageBonus);
+        e.setAmount(e.getAmount() * damageBonus);
     }
 }

+ 0 - 60
src/main/java/me/km/effects/passive/EntityDeath.java

@@ -1,60 +0,0 @@
-package me.km.effects.passive;
-
-import me.kt.KajetansTools;
-import me.kt.api.ItemStackBuilder;
-import me.kt.api.Module;
-import me.kt.api.ModuleListener;
-import me.kt.api.Utils;
-import me.kt.effects.Effect;
-import me.kt.effects.EffectUtils;
-import org.bukkit.entity.LivingEntity;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.EventPriority;
-import org.bukkit.event.entity.EntityDeathEvent;
-import org.bukkit.inventory.ItemStack;
-
-public class EntityDeath extends ModuleListener
-{
-    public EntityDeath(Module m) 
-    {
-        super(m);
-    }
-    
-    // High, da die Drops vorher noch durch SnuviScript geändert werden können
-    @EventHandler(priority = EventPriority.HIGH)
-    public void onEntityDeath(EntityDeathEvent e)
-    {
-        LivingEntity ent = e.getEntity();
-        if(!KajetansTools.worldManager.getWorldPreferences(ent.getWorld()).skills)
-        {
-            return;
-        }
-        Player p = ent.getKiller();              
-        if(p == null)
-        {
-            return;
-        }
-        int xp = EffectUtils.getEffectLevel(p, Effect.XP_COLLECTOR);
-        if(xp >= 1)
-        {
-            float i = e.getDroppedExp();
-            i *= 1 + xp / 5f;
-            e.setDroppedExp((int) i);
-        }
-
-        int drops = EffectUtils.getEffectLevel(p, Effect.MORE_DROPS);
-        if(drops >= 1)
-        {
-            int random;
-            for(ItemStack stack : e.getDrops())
-            {
-                random = Utils.randomInt(-2, drops);
-                if(random >= 1)
-                {
-                    new ItemStackBuilder(stack, random).drop(e.getEntity().getLocation());
-                }
-            }
-        }
-    }
-}

+ 70 - 0
src/main/java/me/km/effects/passive/EntityDrop.java

@@ -0,0 +1,70 @@
+package me.km.effects.passive;
+
+import me.km.KajetansMod;
+import me.km.api.Module;
+import me.km.api.ModuleListener;
+import me.km.api.Utils;
+import me.km.effects.Effect;
+import me.km.effects.EffectUtils;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraftforge.event.entity.living.LivingDropsEvent;
+import net.minecraftforge.event.entity.living.LivingExperienceDropEvent;
+import net.minecraftforge.fml.common.eventhandler.EventPriority;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+
+public class EntityDrop extends ModuleListener
+{
+    public EntityDrop(Module m) 
+    {
+        super(m);
+    }
+    
+    // low, due to changes with SnuviScript
+    @SubscribeEvent(priority = EventPriority.LOW)
+    public void onEntityDrop(LivingDropsEvent e)
+    {
+        if(!KajetansMod.worldManager.getWorldPreferences(e.getEntityLiving().world).skills)
+        {
+            return;
+        }
+        Entity killer = e.getSource().getSourceOfDamage();              
+        if(killer == null || !(killer instanceof EntityPlayer))
+        {
+            return;
+        }
+        EntityPlayer p = (EntityPlayer) killer;
+        int drops = EffectUtils.getEffectLevel(p, Effect.MORE_DROPS);
+        if(drops >= 1)
+        {
+            int random;
+            for(EntityItem item : e.getDrops())
+            {
+                random = Utils.randomInt(-2, drops);
+                if(random >= 1)
+                {
+                    item.getEntityItem().grow(random);
+                }
+            }
+        }
+    }
+    
+    // low, due to changes with SnuviScript
+    @SubscribeEvent(priority = EventPriority.LOW)
+    public void onEntityDropXp(LivingExperienceDropEvent e)
+    {
+        if(!KajetansMod.worldManager.getWorldPreferences(e.getEntityLiving().world).skills)
+        {
+            return;
+        }
+        EntityPlayer p = e.getAttackingPlayer();
+        int xp = EffectUtils.getEffectLevel(p, Effect.XP_COLLECTOR);
+        if(xp >= 1)
+        {
+            int i = e.getOriginalExperience();
+            i *= 1 + xp / 5f;
+            e.setDroppedExperience(i);
+        }
+    }
+}

+ 30 - 159
src/main/java/me/km/effects/passive/Fishing.java

@@ -1,22 +1,20 @@
 package me.km.effects.passive;
 
-import java.util.NoSuchElementException;
-import me.kt.KajetansTools;
-import me.kt.api.Module;
-import me.kt.api.ModuleListener;
-import me.kt.api.Utils;
-import me.kt.effects.Effect;
-import me.kt.effects.EffectUtils;
-import org.bukkit.Location;
-import org.bukkit.Material;
-import org.bukkit.enchantments.Enchantment;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.Item;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.player.PlayerFishEvent;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.potion.PotionEffectType;
+import java.util.Random;
+import me.km.KajetansMod;
+import me.km.api.Module;
+import me.km.api.ModuleListener;
+import me.km.api.Utils;
+import me.km.effects.Effect;
+import me.km.effects.EffectUtils;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.NonNullList;
+import net.minecraft.world.WorldServer;
+import net.minecraft.world.storage.loot.LootContext;
+import net.minecraft.world.storage.loot.LootTableList;
+import net.minecraftforge.event.entity.player.ItemFishedEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
 
 public class Fishing extends ModuleListener
 {
@@ -25,156 +23,29 @@ public class Fishing extends ModuleListener
         super(m);
     }
     
-    @EventHandler(ignoreCancelled = true)
-    public void onFishing(PlayerFishEvent e)
+    @SubscribeEvent(receiveCanceled = false)
+    public void onFishing(ItemFishedEvent e)
     {
-        Player p = e.getPlayer();
-        if(!KajetansTools.worldManager.getWorldPreferences(p.getWorld()).skills)
+        EntityPlayer p = e.getEntityPlayer();
+        if(!KajetansMod.worldManager.getWorldPreferences(p.world).skills)
         {
             return;
         }
         int fishing = EffectUtils.getEffectLevel(p, Effect.FISHING);
-        if(fishing < 1)
+        if(fishing >= 1)
         {
-            return;
-        }
-        Entity ent = e.getCaught();
-        if(ent == null || !(ent instanceof Item))
-        {
-            return;
-        }
-        
-        ItemStack tool = p.getInventory().getItemInMainHand();
-        Item item = (Item) ent;
-        Location l = item.getLocation();        
-        int random = Utils.randomInt(0, fishing);
-        Item addDrop;
-        for(int i = 0; i < random; i++)
-        {
-            addDrop = l.getWorld().dropItem(p.getLocation(), generateFish(tool, p));
-            addDrop.setVelocity(item.getVelocity());
-        }
-    }
-    
-    private ItemStack generateFish(ItemStack tool, Player p)
-    {
-        int luck = 0;
-        try
-        {
-            luck = p.getActivePotionEffects().stream()
-                    .filter((pe) -> (pe.getType().equals(PotionEffectType.LUCK)))
-                    .findFirst().get().getAmplifier() + 1;
-        }
-        catch(NoSuchElementException ex)
-        {
-        }
-        try
-        {
-            luck -= p.getActivePotionEffects().stream()
-                    .filter((pe) -> (pe.getType().equals(PotionEffectType.UNLUCK)))
-                    .findFirst().get().getAmplifier() + 1;
-        }
-        catch(NoSuchElementException ex)
-        {
-        }
-        luck *= 10;
-        
-        int luckOfSea = tool.getEnchantmentLevel(Enchantment.LUCK);
-        int junk = 100 - 20 * luckOfSea - 2 * luck;
-        int treasure = 50 + 21 * luckOfSea + 2 * luck;
-        int fish = 850 - luck;
-        if(treasure < 0)
-        {
-            treasure = 0;
-        }
-        if(junk < 0)
-        {
-            junk = 0;
-        }
-        if(fish < 0)
-        {
-            fish = 0;
-        }
-        
-        int random = Utils.randomInt(1, junk + treasure + fish);     
-        if(random <= junk) //Junk
-        {
-            random = Utils.randomInt(1, 92);
-            if(random <= 10)
-            {
-                return new ItemStack(Material.BOWL);
-            }
-            else if(random <= 12)
+            int random = Utils.randomInt(0, fishing);
+            Random rand = new Random();
+            
+            LootContext.Builder loot = new LootContext.Builder((WorldServer) p.world);
+            loot.withLuck(p.getLuck());
+            LootContext context = loot.build();
+            
+            NonNullList<ItemStack> list = e.getDrops();
+            for(int i = 0; i < random; i++)
             {
-                return new ItemStack(Material.FISHING_ROD, 1, (short) Utils.randomInt(6, 64));
+                list.addAll(p.world.getLootTableManager().getLootTableFromLocation(LootTableList.GAMEPLAY_FISHING).generateLootForPools(rand, context));
             }
-            else if(random <= 22)
-            {
-                return new ItemStack(Material.LEATHER);
-            }
-            else if(random <= 32)
-            {
-                return new ItemStack(Material.LEATHER_BOOTS, 1, (short) Utils.randomInt(6, 66));
-            }
-            else if(random <= 42)
-            {
-                return new ItemStack(Material.ROTTEN_FLESH);
-            }
-            else if(random <= 47)
-            {
-                return new ItemStack(Material.STICK);
-            }
-            else if(random <= 52)
-            {
-                return new ItemStack(Material.STRING);
-            }
-            else if(random <= 62)
-            {
-                return new ItemStack(Material.POTION);
-            }
-            else if(random <= 72)
-            {
-                return new ItemStack(Material.BONE);
-            }
-            else if(random <= 82)
-            {
-                return new ItemStack(Material.INK_SACK);
-            }
-            return new ItemStack(Material.TRIPWIRE_HOOK);
-        }
-        else if(random <= junk + treasure) // Treasure
-        {
-            random = Utils.randomInt(1, 6);
-            switch(random)
-            {
-                case 1:
-                    return Utils.randomEnchantment(new ItemStack(Material.BOW, 1, (short) Utils.randomInt(288, 384))); 
-                case 2:
-                    return Utils.randomEnchantment(new ItemStack(Material.ENCHANTED_BOOK)); 
-                case 3:
-                    return Utils.randomEnchantment(new ItemStack(Material.FISHING_ROD, 1, (short) Utils.randomInt(48, 64))); 
-                case 4:
-                    return new ItemStack(Material.NAME_TAG);
-                case 5:
-                    return new ItemStack(Material.SADDLE);
-                case 6:
-                    return new ItemStack(Material.WATER_LILY);
-            }
-        }
-        
-        random = Utils.randomInt(1, 100);
-        if(random <= 13)
-        {
-            return new ItemStack(Material.RAW_FISH, 1, (short) 3);
-        }
-        else if(random <= 15)
-        {
-            return new ItemStack(Material.RAW_FISH, 1, (short) 2);
-        }
-        else if(random <= 40)
-        {
-            return new ItemStack(Material.RAW_FISH, 1, (short) 1);
         }
-        return new ItemStack(Material.RAW_FISH);
     }
 }

+ 45 - 54
src/main/java/me/km/effects/passive/GoldRiverEffects.java

@@ -1,20 +1,24 @@
 package me.km.effects.passive;
 
-import me.kt.KajetansTools;
-import me.kt.api.ItemStackBuilder;
-import me.kt.api.Module;
-import me.kt.api.ModuleListener;
-import me.kt.api.Utils;
-import me.kt.effects.Effect;
-import me.kt.effects.EffectUtils;
-import me.kt.plots.ProtectionBank;
-import org.bukkit.Material;
-import org.bukkit.block.Block;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.block.Action;
-import org.bukkit.event.player.PlayerInteractEvent;
-import org.bukkit.inventory.EquipmentSlot;
+import me.km.KajetansMod;
+import me.km.api.Module;
+import me.km.api.ModuleListener;
+import me.km.api.Utils;
+import me.km.effects.Effect;
+import me.km.effects.EffectUtils;
+import me.km.plots.ProtectionBank;
+import me.km.utils.ItemStackBuilder;
+import net.minecraft.block.Block;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemSpade;
+import net.minecraft.util.EnumHand;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.World;
+import net.minecraftforge.event.entity.player.PlayerInteractEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
 
 public class GoldRiverEffects extends ModuleListener
 {    
@@ -23,55 +27,42 @@ public class GoldRiverEffects extends ModuleListener
         super(m);
     }
     
-    @EventHandler
-    public void GoldWashingEvent(PlayerInteractEvent e)
+    @SubscribeEvent
+    public void GoldWashingEvent(PlayerInteractEvent.RightClickBlock e)
     {
-        if(e.getHand() == EquipmentSlot.OFF_HAND || e.getAction() != Action.RIGHT_CLICK_BLOCK)
+        if(e.getHand() == EnumHand.OFF_HAND || KajetansMod.worldManager.getWorldPreferences(e.getWorld()).skills)
         {
             return;
         }
-        Block b = e.getClickedBlock();
-        Player p = e.getPlayer();
-        if(b == null || 
-            b.getType() != Material.GOLD_ORE || 
-            !b.getRelative(0, 1, 0).isLiquid() ||
-            p.getInventory().getItemInMainHand().getType() != Material.BOWL || 
-            !KajetansTools.worldManager.getWorldPreferences(b.getWorld()).skills ||
-            EffectUtils.getEffectLevel(p, Effect.GOLD_WASHER) < 1 || 
-            !KajetansTools.plots.getDataBank(ProtectionBank.class).hasTag(b.getLocation(), "gold"))
+        World w = e.getWorld();
+        BlockPos pos = e.getPos();
+        if(!KajetansMod.plots.getDataBank(ProtectionBank.class).hasTag(w, pos, "gold") ||
+            w.isAirBlock(pos))
         {
             return;
         }
-        new ItemStackBuilder(Material.GOLD_NUGGET, Utils.randomInt(1, 2)).drop(b.getLocation().add(0, 1, 0));
-        this.getModule().send(p, "Du hast Gold gefunden!");
-        if(Utils.randomInt(1, 4) == 1)
-        {
-            this.getModule().send(p, "Die Goldader ist erschöpft!");
-            b.setType(Material.STONE);                
-        }            
-    }
-    
-    @EventHandler
-    public void GoldWashingRespawnEvent(PlayerInteractEvent e)
-    {
-        if(e.getHand() == EquipmentSlot.OFF_HAND || e.getAction() != Action.RIGHT_CLICK_BLOCK)
+        EntityPlayer p = e.getEntityPlayer();
+        if(!p.isInWater())
         {
             return;
         }
-        Block b = e.getClickedBlock();
-        Player p = e.getPlayer();
-        if(b == null || 
-            b.getType() != Material.STONE || 
-            !b.getRelative(0, 1, 0).isLiquid() ||
-            Utils.getToolType(p.getInventory().getItemInMainHand()) != Utils.ToolTypes.SHOVEL ||
-            !KajetansTools.worldManager.getWorldPreferences(b.getWorld()).skills ||
-            EffectUtils.getEffectLevel(p, Effect.GOLD_RUSH) < 1 ||
-            !KajetansTools.plots.getDataBank(ProtectionBank.class).hasTag(b.getLocation(), "gold"))
+        Item item = p.getHeldItemMainhand().getItem();
+        Block b = w.getBlockState(pos).getBlock();
+        if(b == Blocks.GOLD_ORE && item == Items.BOWL && EffectUtils.getEffectLevel(p, Effect.GOLD_WASHER) >= 1)
         {
-            return;
-        }
-        this.getModule().send(p, "Du hast eine neue Goldader gefunden!");     
-        b.setType(Material.GOLD_ORE); 
-        Utils.damageItemInHand(p, 15);
+            new ItemStackBuilder(Items.GOLD_NUGGET, Utils.randomInt(1, 2)).drop(w, pos.add(0, 1, 0));
+            this.getModule().send(p, "Du hast Gold gefunden!");
+            if(Utils.randomInt(1, 4) == 1)
+            {
+                this.getModule().send(p, "Die Goldader ist erschöpft!");
+                w.setBlockState(pos, Blocks.STONE.getDefaultState());                
+            }  
+        } 
+        else if(b == Blocks.GOLD_ORE && item instanceof ItemSpade && EffectUtils.getEffectLevel(p, Effect.GOLD_RUSH) >= 1)
+        {
+            this.getModule().send(p, "Du hast eine neue Goldader gefunden!");     
+            w.setBlockState(pos, Blocks.GOLD_ORE.getDefaultState()); 
+            p.getHeldItemMainhand().damageItem(15, p);
+        }  
     }
 }

+ 45 - 37
src/main/java/me/km/effects/passive/LeaveDecay.java

@@ -1,19 +1,21 @@
 package me.km.effects.passive;
 
-import java.util.Collection;
-import me.kt.KajetansTools;
-import me.kt.api.ItemStackBuilder;
-import me.kt.api.Module;
-import me.kt.api.ModuleListener;
-import me.kt.api.Utils;
-import me.kt.effects.Effect;
-import me.kt.effects.EffectUtils;
-import org.bukkit.Location;
-import org.bukkit.Material;
-import org.bukkit.block.Block;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.block.LeavesDecayEvent;
+import java.util.List;
+import me.km.KajetansMod;
+import me.km.api.Module;
+import me.km.api.ModuleListener;
+import me.km.api.Utils;
+import me.km.effects.Effect;
+import me.km.effects.EffectUtils;
+import me.km.utils.ItemStackBuilder;
+import net.minecraft.block.Block;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.World;
+import net.minecraftforge.event.world.BlockEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
 
 public class LeaveDecay extends ModuleListener
 {
@@ -22,38 +24,44 @@ public class LeaveDecay extends ModuleListener
         super(m);
     }
     
-    @EventHandler(ignoreCancelled = true)
-    public void onLeaveDecay(LeavesDecayEvent e)
+    @SubscribeEvent(receiveCanceled = false)
+    public void onLeaveDecay(BlockEvent.HarvestDropsEvent e)
     {
-        Location l = e.getBlock().getLocation();
-        if(!KajetansTools.worldManager.getWorldPreferences(l.getWorld()).skills)
+        if(!KajetansMod.worldManager.getWorldPreferences(e.getWorld()).skills)
         {
             return;
         }
-        Collection<Player> players = Utils.getNearbyEntities(l, 15, Player.class);
-        if(players.isEmpty())
+        IBlockState state = e.getState();
+        Block b = state.getBlock();
+        if(b == Blocks.LEAVES)
         {
-            return;
-        }
-        Block b = e.getBlock();
-        players.stream().filter((p) -> Utils.randomInt(1, 25) <= EffectUtils.getEffectLevel(p, Effect.TREE_PICKER)).forEach((p) -> 
-        {
-            Utils.dropRandomTreeItem(b);
-        });
-        Material m = b.getType();
-        if(m == Material.LEAVES)
-        {
-            players.stream().filter((p) -> Utils.randomInt(1, 25) <= EffectUtils.getEffectLevel(p, Effect.MORE_SAPLINGS)).forEach((p) -> 
+            World w = e.getWorld();
+            BlockPos pos = e.getPos();
+            List<EntityPlayer> players = Utils.getNearbyPlayers(w, pos.getX(), pos.getY(), pos.getZ(), 15);
+            int i = (int) players.stream().filter((p) -> Utils.randomInt(1, 25) <= EffectUtils.getEffectLevel(p, Effect.MORE_SAPLINGS)).count();
+            if(i >= 1)
+            {
+                new ItemStackBuilder(Blocks.SAPLING, i, (Blocks.LEAVES.getMetaFromState(state) % 4)).drop(w, pos);
+            }
+            if(players.stream().anyMatch((p) -> Utils.randomInt(1, 25) <= EffectUtils.getEffectLevel(p, Effect.TREE_PICKER))) 
             {
-                new ItemStackBuilder(Material.SAPLING, 1, (short) (b.getState().getData().toItemStack().getDurability() % 4)).drop(l);
-            }); 
+                Utils.dropRandomTreeItem(w, pos, state);
+            }
         }
-        else if(m == Material.LEAVES_2)
+        else if(b == Blocks.LEAVES2)
         {
-            players.stream().filter((p) -> Utils.randomInt(1, 25) <= EffectUtils.getEffectLevel(p, Effect.MORE_SAPLINGS)).forEach((p) -> 
+            World w = e.getWorld();
+            BlockPos pos = e.getPos();
+            List<EntityPlayer> players = Utils.getNearbyPlayers(w, pos.getX(), pos.getY(), pos.getZ(), 15);
+            int i = (int) players.stream().filter((p) -> Utils.randomInt(1, 25) <= EffectUtils.getEffectLevel(p, Effect.MORE_SAPLINGS)).count();
+            if(i >= 1)
+            {
+                new ItemStackBuilder(Blocks.SAPLING, i, (Blocks.LEAVES.getMetaFromState(state) % 4) + 4).drop(w, pos);
+            }
+            if(players.stream().anyMatch((p) -> Utils.randomInt(1, 25) <= EffectUtils.getEffectLevel(p, Effect.TREE_PICKER))) 
             {
-                new ItemStackBuilder(Material.SAPLING, 1, (short) ((b.getState().getData().toItemStack().getDurability() % 4) + 4)).drop(l);
-            });        
+                Utils.dropRandomTreeItem(w, pos, state);
+            }
         }
     }      
 }

+ 47 - 24
src/main/java/me/km/effects/passive/LessItemLoss.java

@@ -1,16 +1,15 @@
 package me.km.effects.passive;
 
-import me.kt.KajetansTools;
-import me.kt.api.Module;
-import me.kt.api.ModuleListener;
-import me.kt.effects.Effect;
-import me.kt.effects.EffectUtils;
-import org.bukkit.Location;
-import org.bukkit.World;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.entity.PlayerDeathEvent;
-import org.bukkit.inventory.PlayerInventory;
+import java.util.List;
+import me.km.KajetansMod;
+import me.km.api.Module;
+import me.km.api.ModuleListener;
+import me.km.effects.Effect;
+import me.km.effects.EffectUtils;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.event.entity.player.PlayerDropsEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
 
 public class LessItemLoss extends ModuleListener
 {
@@ -19,25 +18,49 @@ public class LessItemLoss extends ModuleListener
         super(m);
     }
     
-    @EventHandler
-    public void onDeathEvent(PlayerDeathEvent e)
+    @SubscribeEvent
+    public void onDeathEvent(PlayerDropsEvent e)
     {  
-        Player p = e.getEntity();
-        if(!e.getKeepInventory() && KajetansTools.worldManager.getWorldPreferences(p.getWorld()).skills)
+        EntityPlayer p = e.getEntityPlayer();
+        if(KajetansMod.worldManager.getWorldPreferences(p.world).skills)
         {
+            e.setCanceled(true);
+            
             int level = EffectUtils.getEffectLevel(p, Effect.LESS_ITEM_LOSS);
-            if(level > 0)
+
+            ItemStack stack;
+            List<ItemStack> list = p.inventory.mainInventory;
+            for (int i = level; i < list.size(); i++)
+            {
+                stack = list.get(i);
+                if(!stack.isEmpty())
+                {
+                    p.dropItem(stack, true, false);
+                    list.set(i, ItemStack.EMPTY);
+                }
+            }
+
+            list = p.inventory.offHandInventory;
+            for (int i = 0; i < list.size(); i++)
+            {
+                stack = list.get(i);
+                if(!stack.isEmpty())
+                {
+                    p.dropItem(stack, true, false);
+                    list.set(i, ItemStack.EMPTY);
+                }
+            }
+
+            if(EffectUtils.getEffectLevel(p, Effect.NO_ARMOR_DROPPING) >= 1)
             {
-                e.setKeepInventory(true);
-                PlayerInventory pinv = p.getInventory();
-                World w = p.getWorld();
-                Location l = p.getLocation();
-                for(int i = level; i < 36; i++)
+                list = p.inventory.armorInventory;
+                for (int i = 0; i < list.size(); i++)
                 {
-                    if(pinv.getItem(i) != null)
+                    stack = list.get(i);
+                    if(!stack.isEmpty())
                     {
-                        w.dropItem(l, pinv.getItem(i));
-                        pinv.clear(i);
+                        p.dropItem(stack, true, false);
+                        list.set(i, ItemStack.EMPTY);
                     }
                 }
             }

+ 0 - 83
src/main/java/me/km/effects/passive/MagicWands.java

@@ -1,83 +0,0 @@
-package me.km.effects.passive;
-
-import me.kt.KajetansTools;
-import me.kt.api.Utils;
-import me.kt.api.Module;
-import me.kt.api.ModuleListener;
-import me.kt.effects.ActiveEffectBase;
-import java.util.List;
-import me.kt.custom.CustomItemUtils;
-import me.kt.custom.CustomMaterial;
-import me.kt.effects.Effect;
-import me.kt.effects.EffectCause;
-import me.kt.effects.EffectUtils;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.block.Action;
-import org.bukkit.event.player.PlayerInteractEvent;
-import org.bukkit.inventory.EquipmentSlot;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.meta.ItemMeta;
-
-public class MagicWands extends ModuleListener
-{          
-    public MagicWands(Module m)
-    {
-        super(m);
-    }
-   
-    @EventHandler
-    public void PlayerUsesWand(PlayerInteractEvent e)
-    {
-        Player p = e.getPlayer();
-        if(e.getHand() == EquipmentSlot.OFF_HAND ||
-            (e.getAction() != Action.RIGHT_CLICK_AIR && e.getAction() != Action.RIGHT_CLICK_BLOCK) ||
-            !KajetansTools.worldManager.getWorldPreferences(p.getWorld()).skills)
-        {
-            return;
-        }
-        ItemStack stack = p.getInventory().getItemInMainHand();
-        CustomMaterial cm = CustomMaterial.getCustomMaterial(stack);
-        if(cm != null && cm.getToolType() == Utils.ToolTypes.WAND)
-        {
-            int wand = EffectUtils.getEffectLevel(p, Effect.USE_WAND);
-            if(wand < 1)
-            {
-                this.getModule().send(p, "Du kannst keine Zauberstäbe benutzen.");
-                return;
-            }
-            ItemMeta meta = stack.getItemMeta();
-            List<String> lore = meta.getLore();
-            for(String s : lore)
-            {
-                if(s.startsWith("Effect") && s.length() > 8)
-                {
-                    Class<? extends ActiveEffectBase> c = EffectUtils.getEffectClass(s.substring(8));
-                    if(c == null)
-                    { 
-                        this.getModule().send(p, "Der Zauberstab ist korrupt.");
-                        return;
-                    }
-                    int power;
-                    switch(cm)
-                    {
-                        case WOOD_WAND:     power = 1; break;
-                        case STONE_WAND:    power = 2; break; 
-                        case REDSTONE_WAND: power = 3; break;
-                        case IRON_WAND:     power = 3; break;
-                        case LAPIS_WAND:    power = 4; break;
-                        case GOLD_WAND:     power = 5; break;
-                        case DIAMOND_WAND:  power = 5; break;
-                        case EMERALD_WAND:  power = 6; break;
-                        default:            power = 1; break;
-                    }
-                    if(ActiveEffectBase.executeEffect(c, p, power, power, EffectCause.WAND))
-                    {
-                        CustomItemUtils.lowerDurability(p, 1);
-                    }
-                }
-            }
-        }
-    }    
-}
-

+ 5 - 40
src/main/java/me/km/effects/passive/Mugging.java

@@ -2,25 +2,8 @@ package me.km.effects.passive;
 
 import java.util.ArrayList;
 import java.util.stream.Collectors;
-import me.kt.KajetansTools;
-import me.kt.api.Module;
-import me.kt.api.ModuleListener;
-import me.kt.api.Utils;
-import me.kt.custom.CustomItemUtils;
-import me.kt.custom.CustomMaterial;
-import me.kt.effects.Effect;
-import me.kt.effects.EffectUtils;
-import org.bukkit.Material;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.Monster;
-import org.bukkit.entity.Player;
-import org.bukkit.entity.Villager;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.player.PlayerInteractEntityEvent;
-import org.bukkit.inventory.EntityEquipment;
-import org.bukkit.inventory.EquipmentSlot;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.potion.PotionEffectType;
+import me.km.api.Module;
+import me.km.api.ModuleListener;
 
 public class Mugging extends ModuleListener
 {
@@ -28,26 +11,8 @@ public class Mugging extends ModuleListener
     {
         super(m);
     }
-    
-    private boolean checkForDagger(Player p)
-    {
-        CustomMaterial cm = CustomMaterial.getCustomMaterial(p.getInventory().getItemInMainHand());
-        if(cm == null)
-        {
-            return false;
-        }
-        switch(cm)
-        {
-            case WOOD_DAGGER:
-            case STONE_DAGGER:
-            case GOLD_DAGGER:
-            case IRON_DAGGER:
-            case DIAMOND_DAGGER:
-                return true;
-        }
-        return false;
-    }
-    
+    // TODO
+    /*
     @EventHandler(ignoreCancelled = true)
     public void mugging(PlayerInteractEntityEvent e)
     {
@@ -171,5 +136,5 @@ public class Mugging extends ModuleListener
             p.getInventory().addItem(loot.get(Utils.randomInt(0, loot.size() - 1)));
             this.getModule().send(p, "Der Diebstahl war erfolgreich.");
         } 
-    }
+    }*/
 }

+ 0 - 43
src/main/java/me/km/effects/passive/PotionShooting.java

@@ -1,43 +0,0 @@
-package me.km.effects.passive;
-
-import me.kt.KajetansTools;
-import me.kt.api.Module;
-import me.kt.api.ModuleListener;
-import me.kt.api.Utils;
-import me.kt.effects.Effect;
-import me.kt.effects.EffectUtils;
-import me.kt.skills.Skill;
-import org.bukkit.entity.EntityType;
-import org.bukkit.entity.Player;
-import org.bukkit.entity.Projectile;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.entity.ProjectileLaunchEvent;
-import org.bukkit.inventory.ItemStack;
-
-public class PotionShooting extends ModuleListener
-{
-    public PotionShooting(Module m) 
-    {
-        super(m);
-    }
-    
-    @EventHandler
-    public void PotionUse(ProjectileLaunchEvent e)
-    {       
-        Projectile pro = e.getEntity();
-        if((pro.getType() == EntityType.SPLASH_POTION ||
-            pro.getType() == EntityType.LINGERING_POTION) &&
-            pro.getShooter() instanceof Player &&
-            KajetansTools.worldManager.getWorldPreferences(pro.getWorld()).skills)
-        {
-            Player p = (Player) pro.getShooter();
-            int saver = EffectUtils.getEffectLevel(p, Effect.POTION_SAVER);
-            if(saver >= 1 && saver >= Utils.randomInt(1, 5))
-            {
-                ItemStack item = p.getInventory().getItemInMainHand();
-                item.setAmount(item.getAmount() + 1);
-                p.getInventory().setItemInMainHand(item);
-            }
-        }  
-    }
-}

+ 17 - 31
src/main/java/me/km/effects/passive/Smelting.java

@@ -1,17 +1,13 @@
 package me.km.effects.passive;
 
-import java.util.Collection;
-import me.kt.KajetansTools;
-import me.kt.api.Module;
-import me.kt.api.ModuleListener;
-import me.kt.api.Utils;
-import me.kt.effects.Effect;
-import me.kt.effects.EffectUtils;
-import org.bukkit.Location;
-import org.bukkit.Material;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.inventory.FurnaceSmeltEvent;
+import me.km.KajetansMod;
+import me.km.api.Module;
+import me.km.api.ModuleListener;
+import me.km.effects.Effect;
+import me.km.effects.EffectUtils;
+import net.minecraftforge.fml.common.eventhandler.Event;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import net.minecraftforge.fml.common.gameevent.PlayerEvent;
 
 public class Smelting extends ModuleListener
 {
@@ -20,26 +16,16 @@ public class Smelting extends ModuleListener
         super(m);
     }
     
-    @EventHandler
-    public void Furnace(FurnaceSmeltEvent e)
+    @SubscribeEvent
+    public void Furnace(PlayerEvent.ItemSmeltedEvent e)
     {  
-        Location l = e.getBlock().getLocation();
-        if(KajetansTools.worldManager.getWorldPreferences(l.getWorld()).defaultProducing)
+        if(!KajetansMod.worldManager.getWorldPreferences(e.player.world).defaultProducing &&
+            EffectUtils.getEffectLevel(e.player, Effect.SMELTING) < 1 &&
+            !KajetansMod.jobs.hasRecipe(e.player, e.smelting.getItem()))
         {
-            return;
-        }
-        e.setCancelled(true);
-        Collection<Player> players = Utils.getNearbyEntities(l, 3, Player.class);
-        if(players.isEmpty())
-        {
-            return;
-        }
-        final Material result = e.getResult().getType();
-        if(players.stream().anyMatch(p -> 
-                EffectUtils.getEffectLevel(p, Effect.SMELTING) >= 1 &&
-                KajetansTools.jobs.hasRecipe(p, result)))
-        {
-            e.setCancelled(false);
-        }
+            e.setResult(Event.Result.DENY);
+            e.setCanceled(true);
+            e.smelting.setCount(0);
+        } 
     } 
 }

+ 20 - 22
src/main/java/me/km/effects/passive/TargetEntity.java

@@ -1,18 +1,17 @@
 package me.km.effects.passive;
 
-import me.kt.KajetansTools;
-import me.kt.api.Module;
-import me.kt.api.ModuleListener;
-import me.kt.api.Utils;
-import me.kt.effects.Effect;
-import me.kt.effects.EffectUtils;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.Monster;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.entity.EntityTargetEvent;
-import org.bukkit.event.entity.EntityTargetLivingEntityEvent;
-import org.bukkit.potion.PotionEffectType;
+import me.km.KajetansMod;
+import me.km.api.Module;
+import me.km.api.ModuleListener;
+import me.km.api.Utils;
+import me.km.effects.Effect;
+import me.km.effects.EffectUtils;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.monster.EntityMob;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.MobEffects;
+import net.minecraftforge.event.entity.living.LivingSetAttackTargetEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
 
 public class TargetEntity extends ModuleListener
 {
@@ -21,21 +20,20 @@ public class TargetEntity extends ModuleListener
         super(m);
     }
     
-    @EventHandler(ignoreCancelled = true)
-    public void avoidTargetting(EntityTargetLivingEntityEvent e)
+    @SubscribeEvent(receiveCanceled = false)
+    public void avoidTargetting(LivingSetAttackTargetEvent e)
     {
-        Entity ent = e.getTarget();
-        if(ent == null || e.getReason() != EntityTargetEvent.TargetReason.CLOSEST_PLAYER || 
-            !(ent instanceof Player) || !KajetansTools.worldManager.getWorldPreferences(ent.getWorld()).skills)
+        EntityLivingBase ent = e.getTarget();
+        if(!(ent instanceof EntityPlayer) || !KajetansMod.worldManager.getWorldPreferences(ent.world).skills)
         {
             return;
         }
-        Player p = (Player) ent;  
-        if(EffectUtils.getEffectLevel(p, Effect.SNEAKING) >= 1 && p.hasPotionEffect(PotionEffectType.INVISIBILITY))
+        EntityPlayer p = (EntityPlayer) ent;  
+        if(EffectUtils.getEffectLevel(p, Effect.SNEAKING) >= 1 && p.isPotionActive(MobEffects.INVISIBILITY))
         {       
-            e.setCancelled(true);
+            e.setCanceled(true);
         }
-        else if(EffectUtils.getEffectLevel(p, Effect.SCENT) >= 1 && e.getEntity() instanceof Monster)
+        else if(EffectUtils.getEffectLevel(p, Effect.SCENT) >= 1 && e.getEntity() instanceof EntityMob)
         {      
             this.getModule().send(p, "Ein " + Utils.formatString(e.getEntity().getName()) + " hat dich bemerkt!");
         }

+ 68 - 0
src/main/java/me/km/effects/passive/ThrowableEffects.java

@@ -0,0 +1,68 @@
+package me.km.effects.passive;
+
+import me.km.KajetansMod;
+import me.km.api.Module;
+import me.km.api.ModuleListener;
+import me.km.api.Utils;
+import me.km.effects.Effect;
+import me.km.effects.EffectUtils;
+import me.km.events.PlayerHurtEvent;
+import me.km.events.ThrowableLaunchEvent;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.item.EntityEnderPearl;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.projectile.EntityPotion;
+import net.minecraft.entity.projectile.EntityThrowable;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+
+public class ThrowableEffects extends ModuleListener 
+{
+    public ThrowableEffects(Module m)
+    {
+        super(m);
+    }
+       
+    @SubscribeEvent(receiveCanceled = false)
+    public void preventEnderPearlDamage(PlayerHurtEvent e)
+    {        
+        Entity ent = e.getSource().getSourceOfDamage();
+        if(ent != null && ent.getClass() == EntityEnderPearl.class && 
+            KajetansMod.worldManager.getWorldPreferences(ent.world).skills &&
+            EffectUtils.getEffectLevel(e.getEntityPlayer(), Effect.NO_ENDERPEARL_DAMAGE) >= 1)
+        {
+            e.setCanceled(true);
+        }
+    }
+    
+    @SubscribeEvent(receiveCanceled = false)
+    public void useThrowableEvent(ThrowableLaunchEvent e)
+    {
+        if(!KajetansMod.worldManager.getWorldPreferences(e.getWorld()).skills)
+        {
+            return;
+        }
+        EntityThrowable ent = e.getEntityThrowable();
+        if(ent instanceof EntityEnderPearl)
+        {
+            EntityPlayer p = e.getEntityPlayer();
+            if(Utils.randomBoolean() && EffectUtils.getEffectLevel(p, Effect.PEARL_SAVER) >= 1)
+            {     
+                p.getHeldItemMainhand().grow(1);
+            }
+            int speed = EffectUtils.getEffectLevel(p, Effect.FAST_ENDERPEARL_SHOOT);
+            if(speed >= 1)
+            {
+                Utils.scaleVelocity(e.getEntityThrowable(), speed + 1);
+            }
+        }
+        else if(ent instanceof EntityPotion)
+        {
+            EntityPlayer p = e.getEntityPlayer();
+            int saver = EffectUtils.getEffectLevel(p, Effect.POTION_SAVER);
+            if(saver >= 1 && saver >= Utils.randomInt(1, 5))
+            {
+                p.getHeldItemMainhand().grow(1);
+            }
+        }
+    }
+}

+ 17 - 2
src/main/java/me/km/entities/ModEntities.java

@@ -5,18 +5,33 @@ import net.minecraft.client.renderer.entity.Render;
 import net.minecraft.entity.Entity;
 import net.minecraft.util.ResourceLocation;
 import net.minecraftforge.fml.common.registry.EntityRegistry;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
 
 public class ModEntities 
 {
-    public static void init() 
+    public static void initServer() 
+    {
+        register(1, EntityBrownBear.class, "BrownBear", "bear/brownbear");
+        register(2, EntityBlackBear.class, "BlackBear", "bear/blackbear");
+    }
+    
+    @SideOnly(Side.CLIENT)
+    public static void initClient() 
     {
         register(1, EntityBrownBear.class, "BrownBear", "bear/brownbear", new RenderBrownBear());
         register(2, EntityBlackBear.class, "BlackBear", "bear/blackbear", new RenderBlackBear());
     }
 
+    @SideOnly(Side.CLIENT)
     private static void register(int id, Class<? extends Entity> c, String name, String path, Render<? extends Entity> r) 
     {
-        EntityRegistry.registerModEntity(new ResourceLocation(KajetansMod.MODID + ":" + path), c, name, id, KajetansMod.instance, 144, 2, true);
+        register(id, c, name, path);
         KajetansMod.proxy.registerEntityRenderer(c, r);
     }
+    
+    private static void register(int id, Class<? extends Entity> c, String name, String path) 
+    {
+        EntityRegistry.registerModEntity(new ResourceLocation(KajetansMod.MODID + ":" + path), c, name, id, KajetansMod.instance, 144, 2, true);
+    }
 }

+ 22 - 0
src/main/java/me/km/events/CustomEventCaller.java

@@ -9,9 +9,11 @@ import me.km.utils.ReflectionUtils;
 import net.minecraft.entity.Entity;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.entity.projectile.EntityArrow;
+import net.minecraft.entity.projectile.EntityThrowable;
 import net.minecraftforge.common.MinecraftForge;
 import net.minecraftforge.event.entity.EntityJoinWorldEvent;
 import net.minecraftforge.event.entity.living.LivingEvent;
+import net.minecraftforge.event.entity.living.LivingHurtEvent;
 import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
 import net.minecraftforge.fml.common.gameevent.TickEvent;
 
@@ -46,6 +48,14 @@ public class CustomEventCaller
                 MinecraftForge.EVENT_BUS.post(new ArrowLaunchEvent((EntityPlayer) arrow.shootingEntity, arrow, e.getWorld()));
             }
         }
+        else if(ent instanceof EntityThrowable)
+        {
+            EntityThrowable thrown = (EntityThrowable) ent;
+            if(thrown.getThrower() instanceof EntityPlayer)
+            {
+                MinecraftForge.EVENT_BUS.post(new ThrowableLaunchEvent((EntityPlayer) thrown.getThrower(), thrown, e.getWorld()));
+            }
+        }
     }
     
     @SubscribeEvent
@@ -54,4 +64,16 @@ public class CustomEventCaller
         arrows.removeIf(arrow -> ReflectionUtils.getArrowTimeInGround(arrow) > 1);
         arrows.forEach(arrow -> MinecraftForge.EVENT_BUS.post(new ArrowHitGroundEvent(arrow)));
     }
+    
+    @SubscribeEvent
+    public void onPlayerHurt(LivingHurtEvent e)
+    {      
+        if(e.getEntityLiving() instanceof EntityPlayer)
+        {
+            PlayerHurtEvent hurt = new PlayerHurtEvent((EntityPlayer) e.getEntityLiving(), e.getSource(), e.getAmount());
+            MinecraftForge.EVENT_BUS.post(hurt);
+            e.setAmount(hurt.getAmount());
+            e.setCanceled(hurt.isCanceled());
+        }
+    } 
 }

+ 21 - 0
src/main/java/me/km/events/PlayerHurtEvent.java

@@ -0,0 +1,21 @@
+package me.km.events;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.DamageSource;
+import net.minecraftforge.event.entity.living.LivingHurtEvent;
+
+public class PlayerHurtEvent extends LivingHurtEvent
+{
+    private final EntityPlayer p;
+    
+    public PlayerHurtEvent(EntityPlayer p, DamageSource source, float amount) 
+    {
+        super(p, source, amount);
+        this.p = p;
+    }
+
+    public EntityPlayer getEntityPlayer() 
+    {
+        return p;
+    }
+}

+ 29 - 0
src/main/java/me/km/events/ThrowableLaunchEvent.java

@@ -0,0 +1,29 @@
+package me.km.events;
+
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.projectile.EntityThrowable;
+import net.minecraft.world.World;
+import net.minecraftforge.event.entity.player.PlayerEvent;
+
+public class ThrowableLaunchEvent extends PlayerEvent 
+{
+    private final EntityThrowable thrown;
+    private final World world;
+    
+    public ThrowableLaunchEvent(EntityPlayer player, EntityThrowable thrown, World world) 
+    {
+        super(player);
+        this.thrown = thrown;
+        this.world = world;
+    }
+
+    public EntityThrowable getEntityThrowable() 
+    {
+        return thrown;
+    }
+
+    public World getWorld() 
+    {
+        return world;
+    }
+}

+ 28 - 27
src/main/java/me/km/scrolls/ItemScroll.java → src/main/java/me/km/items/ItemScroll.java

@@ -1,4 +1,4 @@
-package me.km.scrolls;
+package me.km.items;
 
 import me.km.KajetansMod;
 import me.km.api.GlobalText;
@@ -6,7 +6,6 @@ import me.km.api.Utils;
 import me.km.effects.ActiveEffectBase;
 import me.km.effects.EffectCause;
 import me.km.effects.EffectUtils;
-import me.km.items.ItemBase;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.entity.player.EntityPlayerMP;
 import net.minecraft.item.ItemStack;
@@ -26,6 +25,11 @@ public class ItemScroll extends ItemBase
     @Override
     public ActionResult<ItemStack> onItemRightClick(World w, EntityPlayer p, EnumHand hand) 
     {
+        if(w.isRemote)
+        {
+            return new ActionResult(EnumActionResult.FAIL, p.getHeldItem(hand));
+        }
+        
         if(!KajetansMod.worldManager.getWorldPreferences(w).scrolls)
         {
             KajetansMod.scrolls.send(p, GlobalText.noScrolls());
@@ -33,38 +37,35 @@ public class ItemScroll extends ItemBase
         }
         
         ItemStack stack = p.getHeldItem(hand);
-        if (!w.isRemote && p instanceof EntityPlayerMP)
+        String s = stack.getDisplayName();
+        if(s.contains(" "))
         {
-            String s = stack.getDisplayName();
-            if(s.contains(" "))
+            try
             {
-                try
+                String[] parts = s.split(" ");
+                if(parts.length < 2)
                 {
-                    String[] parts = s.split(" ");
-                    if(parts.length < 2)
-                    {
-                        throw new Exception();
-                    }
-                    Class<? extends ActiveEffectBase> c = EffectUtils.getEffectClass(parts[0]);
-                    if(c == null)
-                    { 
-                        throw new Exception();
-                    }
-                    int power = Utils.romanToInt(parts[1]);
-                    if(ActiveEffectBase.executeEffect(c, (EntityPlayerMP) p, power, 0, EffectCause.SCROLL))
-                    {
-                        if(!p.isCreative())
-                        {
-                            stack.shrink(1);
-                        }
-                    }
+                    throw new Exception();
                 }
-                catch(Exception ex)
+                Class<? extends ActiveEffectBase> c = EffectUtils.getEffectClass(parts[0]);
+                if(c == null)
+                { 
+                    throw new Exception();
+                }
+                int power = Utils.romanToInt(parts[1]);
+                if(ActiveEffectBase.executeEffect(c, (EntityPlayerMP) p, power, 0, EffectCause.SCROLL))
                 {
-                    KajetansMod.scrolls.send(p, "Die Schriftrolle ist korrupt.");
-                    return new ActionResult(EnumActionResult.FAIL, stack);
+                    if(!p.isCreative())
+                    {
+                        stack.shrink(1);
+                    }
                 }
             }
+            catch(Exception ex)
+            {
+                KajetansMod.scrolls.send(p, "Die Schriftrolle ist korrupt.");
+                return new ActionResult(EnumActionResult.FAIL, stack);
+            }
         }
 
         p.addStat(StatList.getObjectUseStats(this));

+ 75 - 0
src/main/java/me/km/items/ItemWand.java

@@ -0,0 +1,75 @@
+package me.km.items;
+
+import me.km.KajetansMod;
+import me.km.api.GlobalText;
+import me.km.effects.ActiveEffectBase;
+import me.km.effects.Effect;
+import me.km.effects.EffectCause;
+import me.km.effects.EffectUtils;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
+import net.minecraft.item.ItemStack;
+import net.minecraft.stats.StatList;
+import net.minecraft.util.ActionResult;
+import net.minecraft.util.EnumActionResult;
+import net.minecraft.util.EnumHand;
+import net.minecraft.world.World;
+
+public class ItemWand extends ItemWeapon
+{
+    private final int strength;
+    
+    public ItemWand(String name, String local, ToolMaterial material, int strength) 
+    {
+        super(name, local, material, 0);
+        this.strength = strength;
+    }
+    
+    @Override
+    public ActionResult<ItemStack> onItemRightClick(World w, EntityPlayer p, EnumHand hand) 
+    {
+        if(w.isRemote)
+        {
+            return new ActionResult(EnumActionResult.FAIL, p.getHeldItem(hand));
+        }
+        
+        if(!KajetansMod.worldManager.getWorldPreferences(w).scrolls)
+        {
+            KajetansMod.effects.send(p, GlobalText.noScrolls());
+            return new ActionResult(EnumActionResult.FAIL, p.getHeldItem(hand));
+        }
+        
+        int wand = EffectUtils.getEffectLevel(p, Effect.USE_WAND);
+        if(wand < 1)
+        {
+            KajetansMod.effects.send(p, "Du kannst keine Zauberstäbe benutzen.");
+            return new ActionResult(EnumActionResult.FAIL, p.getHeldItem(hand));
+        }
+        
+        ItemStack stack = p.getHeldItem(hand);
+        String s = stack.getDisplayName();
+        try
+        {
+            Class<? extends ActiveEffectBase> c = EffectUtils.getEffectClass(s);
+            if(c == null)
+            { 
+                throw new Exception();
+            }
+            if(ActiveEffectBase.executeEffect(c, (EntityPlayerMP) p, strength, 0, EffectCause.WAND))
+            {
+                if(!p.isCreative())
+                {
+                    stack.damageItem(1, p);
+                }
+            }
+        }
+        catch(Exception ex)
+        {
+            KajetansMod.effects.send(p, "Der Zauberstab ist korrupt.");
+            return new ActionResult(EnumActionResult.FAIL, stack);
+        }
+
+        p.addStat(StatList.getObjectUseStats(this));
+        return new ActionResult(EnumActionResult.SUCCESS, stack);
+    }
+}

+ 82 - 0
src/main/java/me/km/items/ItemWeapon.java

@@ -0,0 +1,82 @@
+package me.km.items;
+
+import com.google.common.collect.Multimap;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.SharedMonsterAttributes;
+import net.minecraft.entity.ai.attributes.AttributeModifier;
+import net.minecraft.inventory.EntityEquipmentSlot;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.World;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+
+public class ItemWeapon extends ItemBase
+{
+    private final float attackDamage;
+    private final Item.ToolMaterial material;
+
+    public ItemWeapon(String name, String local, Item.ToolMaterial material, float attackDamage)
+    {
+        super(name, local);
+        this.material = material;
+        this.maxStackSize = 1;
+        super.setMaxDamage(material.getMaxUses());
+        super.setCreativeTab(CreativeTabs.COMBAT);
+        this.attackDamage = attackDamage + material.getDamageVsEntity();
+    }
+
+    @Override
+    public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker)
+    {
+        stack.damageItem(1, attacker);
+        return true;
+    }
+
+    @Override
+    public boolean onBlockDestroyed(ItemStack stack, World worldIn, IBlockState state, BlockPos pos, EntityLivingBase entityLiving)
+    {
+        if((double) state.getBlockHardness(worldIn, pos) != 0.0D)
+        {
+            stack.damageItem(2, entityLiving);
+        }
+        return true;
+    }
+    
+    @SideOnly(Side.CLIENT)
+    @Override
+    public boolean isFull3D()
+    {
+        return true;
+    }
+
+    @Override
+    public int getItemEnchantability()
+    {
+        return this.material.getEnchantability();
+    }
+
+    @Override
+    public boolean getIsRepairable(ItemStack toRepair, ItemStack repair)
+    {
+        ItemStack mat = this.material.getRepairItemStack();
+        if (!mat.isEmpty() && net.minecraftforge.oredict.OreDictionary.itemMatches(mat, repair, false)) return true;
+        return super.getIsRepairable(toRepair, repair);
+    }
+
+    
+    @Override
+    public Multimap<String, AttributeModifier> getItemAttributeModifiers(EntityEquipmentSlot equipmentSlot)
+    {
+        Multimap<String, AttributeModifier> multimap = super.getItemAttributeModifiers(equipmentSlot);
+        if (equipmentSlot == EntityEquipmentSlot.MAINHAND)
+        {
+            multimap.put(SharedMonsterAttributes.ATTACK_DAMAGE.getName(), new AttributeModifier(ATTACK_DAMAGE_MODIFIER, "Weapon modifier", this.attackDamage, 0));
+            multimap.put(SharedMonsterAttributes.ATTACK_SPEED.getName(), new AttributeModifier(ATTACK_SPEED_MODIFIER, "Weapon modifier", -2.4000000953674316D, 0));
+        }
+        return multimap;
+    }
+}

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

@@ -1,7 +1,6 @@
 package me.km.items;
 
 import me.km.KajetansMod;
-import me.km.scrolls.ItemScroll;
 import net.minecraft.creativetab.CreativeTabs;
 import net.minecraft.init.SoundEvents;
 import net.minecraft.inventory.EntityEquipmentSlot;
@@ -54,6 +53,8 @@ public class ModItems
     public static ItemArmor copperLeggings;
     public static ItemArmor copperBoots;
     
+    public static ItemWand woodenWand;
+    
     public static ItemScroll scroll;
     
     public static void init() 
@@ -72,6 +73,8 @@ public class ModItems
         copperLeggings = register(new ItemArmor(ARMOR_COPPER, EntityEquipmentSlot.LEGS, "copper_leggings", "leggingsCopper"));
         copperBoots = register(new ItemArmor(ARMOR_COPPER, EntityEquipmentSlot.FEET, "copper_boots", "bootsCopper"));
         
+        woodenWand = register(new ItemWand("wood_wand", "wandWood", Item.ToolMaterial.WOOD, 1));
+        
         scroll = register((ItemScroll) new ItemScroll("scroll", "scroll").setCreativeTab(CreativeTabs.MISC));
     }
     

+ 1 - 1
src/main/java/me/km/playerbank/PvpEvent.java

@@ -25,7 +25,7 @@ public class PvpEvent extends ModuleListener
         }
         EntityPlayer affectedPlayer = (EntityPlayer) e.getEntityLiving();
         EntityPlayer p = (EntityPlayer) e.getSource().getSourceOfDamage();    
-        if(affectedPlayer.equals(p))
+        if(p == null || affectedPlayer.equals(p))
         {
             return;
         }

+ 1 - 1
src/main/java/me/km/snuviscript/QuestParser.java

@@ -210,7 +210,7 @@ public class QuestParser
         registerFunction(list, "player.hasfly", (args, qd) -> 
                 ((EntityPlayer) args[0]).capabilities.allowFlying);
         registerFunction(list, "player.getlastdamager", (args, qd) -> 
-                ((EntityPlayer) args[0]).getLastAttacker());
+                ((EntityPlayer) args[0]).getLastDamageSource().getSourceOfDamage());
         registerConsumer(list, "player.settag", (args, qd) -> 
                 setTag(args));
         registerFunction(list, "player.gettag", (args, qd) -> 

+ 14 - 20
src/main/java/me/km/snuviscript/QuestsEvents.java

@@ -12,6 +12,7 @@ import me.km.api.ModuleListener;
 import me.km.api.Module;
 import me.km.api.Utils;
 import me.km.effects.PlayerUsesEffectEvent;
+import me.km.events.PlayerHurtEvent;
 import me.km.events.PlayerMoveEvent;
 import net.minecraft.entity.EntityLivingBase;
 import net.minecraft.entity.item.EntityItem;
@@ -30,6 +31,7 @@ import net.minecraftforge.event.entity.ThrowableImpactEvent;
 import net.minecraftforge.event.entity.item.ItemTossEvent;
 import net.minecraftforge.event.entity.living.*;
 import net.minecraftforge.event.entity.player.FillBucketEvent;
+import net.minecraftforge.event.entity.player.ItemFishedEvent;
 import net.minecraftforge.event.entity.player.PlayerDropsEvent;
 import net.minecraftforge.event.entity.player.PlayerInteractEvent;
 import net.minecraftforge.event.world.BlockEvent;
@@ -201,14 +203,9 @@ public class QuestsEvents extends ModuleListener
     }*/
     
     @SubscribeEvent
-    public void QuestPlayerDamage(LivingHurtEvent e)
+    public void QuestPlayerDamage(PlayerHurtEvent e)
     {        
-        if(!(e.getEntityLiving() instanceof EntityPlayer))
-        {
-            return;
-        }
-        EntityPlayer p = (EntityPlayer) e.getEntityLiving();   
-
+        EntityPlayer p = e.getEntityPlayer();  
         handleEvent(p, "player-hurt", (qd) -> 
         {
             if(p.getHealth() <= e.getAmount())
@@ -527,22 +524,19 @@ public class QuestsEvents extends ModuleListener
             });
         }
     }
-    // TODO, kommt mit Update
-    /*@SubscribeEvent
+    
+    @SubscribeEvent
     public void QuestFishing(ItemFishedEvent e)
     {
-        if(e.getCaught() instanceof Item)
+        handleEvent(e.getEntityPlayer(), "fishing", (qd) -> 
         {
-            handleEvent(e.getPlayer(), "fishing", (qd) -> 
-            {
-                QuestVars.setItemVars(qd, ((Item) e.getCaught()).getItemStack()); 
-                qd.setVar("cancel", e.isCancelled()); 
-            }, (qd) -> 
-            {
-                e.setCancelled(qd.getBoolean("cancel")); 
-            });
-        }
-    }*/
+            qd.setVar("drops", e.getDrops());
+            qd.setVar("cancel", e.isCanceled()); 
+        }, (qd) -> 
+        {
+            e.setCanceled(qd.getBoolean("cancel")); 
+        });
+    }
     
     @SubscribeEvent
     public void QuestUseitem(LivingEntityUseItemEvent.Start e)

+ 4 - 1
src/main/resources/assets/km/lang/en_US.lang

@@ -15,4 +15,7 @@ item.bootsCopper.name=Copper Boots
 item.scroll.name=Magic Scroll
 
 tile.oreCopper.name=Copper Ore
-tile.blockCopper.name=Copper Block
+tile.blockCopper.name=Copper Block
+
+entity.BrownBear.name=Brown Bear
+entity.BlackBear.name=Black Bear

+ 6 - 0
src/main/resources/assets/km/models/item/diamond_wand.json

@@ -0,0 +1,6 @@
+{
+    "parent": "item/handheld",
+    "textures": {
+        "layer0": "km:items/diamond_wand"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/emerald_wand.json

@@ -0,0 +1,6 @@
+{
+    "parent": "item/handheld",
+    "textures": {
+        "layer0": "km:items/emerald_wand"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/gold_wand.json

@@ -0,0 +1,6 @@
+{
+    "parent": "item/handheld",
+    "textures": {
+        "layer0": "km:items/gold_wand"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/iron_wand.json

@@ -0,0 +1,6 @@
+{
+    "parent": "item/handheld",
+    "textures": {
+        "layer0": "km:items/iron_wand"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/lapis_wand.json

@@ -0,0 +1,6 @@
+{
+    "parent": "item/handheld",
+    "textures": {
+        "layer0": "km:items/lapis_wand"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/redstone_wand.json

@@ -0,0 +1,6 @@
+{
+    "parent": "item/handheld",
+    "textures": {
+        "layer0": "km:items/redstone_wand"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/stone_wand.json

@@ -0,0 +1,6 @@
+{
+    "parent": "item/handheld",
+    "textures": {
+        "layer0": "km:items/stone_wand"
+    }
+}

+ 6 - 0
src/main/resources/assets/km/models/item/wood_wand.json

@@ -0,0 +1,6 @@
+{
+    "parent": "item/handheld",
+    "textures": {
+        "layer0": "km:items/wood_wand"
+    }
+}

BIN
src/main/resources/assets/km/textures/items/diamond_wand.png


BIN
src/main/resources/assets/km/textures/items/emerald_wand.png


BIN
src/main/resources/assets/km/textures/items/gold_wand.png


BIN
src/main/resources/assets/km/textures/items/iron_wand.png


BIN
src/main/resources/assets/km/textures/items/lapis_wand.png


BIN
src/main/resources/assets/km/textures/items/redstone_wand.png


BIN
src/main/resources/assets/km/textures/items/stone_wand.png


BIN
src/main/resources/assets/km/textures/items/wood_wand.png