package com.minemaarten.advancedmod.event; import java.lang.reflect.Field; import java.util.List; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.monster.EntityCreeper; import net.minecraft.entity.passive.EntityPig; import net.minecraft.item.ItemStack; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.event.entity.living.LivingDropsEvent; import com.minemaarten.advancedmod.init.ModBlocks; import com.minemaarten.advancedmod.utility.Log; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent; import cpw.mods.fml.common.gameevent.TickEvent.PlayerTickEvent; import cpw.mods.fml.relauncher.ReflectionHelper; import cpw.mods.fml.relauncher.Side; public class AdvancedModEventHandler{ /** * Using the LivingDropsEvent. Note that this is from net.minecraftforge.event, so to make this method be called, this class needs to be registered at MinecraftForge.EVENT_BUS.register(new AdvancedModEventHandler()). * @param event */ @SubscribeEvent public void addPigDrops(LivingDropsEvent event){ if(event.entityLiving instanceof EntityPig && event.entityLiving.getRNG().nextInt(3) == 0) { ItemStack stack = new ItemStack(ModBlocks.dutchFlag); event.drops.add(new EntityItem(event.entityLiving.worldObj, event.entityLiving.posX, event.entityLiving.posY, event.entityLiving.posZ, stack)); } } /** * Using the PlayerTickEvent. Note that this is from cpw.mods.fml.common.gameevent, so to make this method be called, this class needs to be registered at FMLCommonHandler.instance().bus().register(new AdvancedModEventHandler()). * @param event */ @SubscribeEvent public void onPlayerTick(PlayerTickEvent event){ if(event.side == Side.SERVER && event.phase == TickEvent.Phase.END) { List<Entity> entities = event.player.worldObj.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(event.player.posX - 3, event.player.posY - 3, event.player.posZ - 3, event.player.posX + 3, event.player.posY + 3, event.player.posZ + 3)); for(Entity entity : entities) { if(entity != event.player) { //entity.setVelocity(0, 1, 0); //This will crash when run on a dedicated server, because Entity#setVelocity is marked with @SideOnly(Side.CLIENT), and therefore stripped from a dedicated server instance. entity.motionX = 0;//The solution is to do this. entity.motionY = 1; entity.motionZ = 0; } } } } @SubscribeEvent public void onCreeperSpawn(EntityJoinWorldEvent event){ if(event.entity instanceof EntityCreeper) { ((EntityCreeper)event.entity).explosionRadius = 0; try { Field field = ReflectionHelper.findField(EntityCreeper.class, "field_82225_f", "fuseTime"); field.set(event.entity, 80); } catch(Throwable e) { Log.warn("Reflection on Creeper fuseTime failed!"); e.printStackTrace(); } } } }