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();
}
}
}
}