package net.minecraftforge.event; import java.io.File; import java.util.EnumSet; import java.util.List; import java.util.Random; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.EnumCreatureType; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.monster.EntityZombie; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer.SleepResult; import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResult; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundEvent; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.Vec3d; import net.minecraft.util.text.ITextComponent; import net.minecraft.world.Explosion; import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraft.world.WorldSettings; import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.ChunkPrimer; import net.minecraft.world.chunk.IChunkGenerator; import net.minecraft.world.storage.IPlayerFileData; import net.minecraft.world.storage.SaveHandler; import net.minecraft.world.storage.loot.LootTable; import net.minecraftforge.client.event.ClientChatReceivedEvent; import net.minecraftforge.client.event.RenderBlockOverlayEvent; import net.minecraftforge.client.event.RenderBlockOverlayEvent.OverlayType; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.capabilities.CapabilityDispatcher; import net.minecraftforge.common.capabilities.ICapabilityProvider; import net.minecraftforge.common.util.BlockSnapshot; import net.minecraftforge.event.brewing.PotionBrewEvent; import net.minecraftforge.event.entity.EntityEvent; import net.minecraftforge.event.entity.EntityMountEvent; import net.minecraftforge.event.entity.EntityStruckByLightningEvent; import net.minecraftforge.event.entity.PlaySoundAtEntityEvent; import net.minecraftforge.event.entity.item.ItemExpireEvent; import net.minecraftforge.event.entity.living.LivingEntityUseItemEvent; import net.minecraftforge.event.entity.living.LivingExperienceDropEvent; import net.minecraftforge.event.entity.living.LivingHealEvent; import net.minecraftforge.event.entity.living.LivingPackSizeEvent; import net.minecraftforge.event.entity.living.LivingSpawnEvent; import net.minecraftforge.event.entity.living.LivingSpawnEvent.AllowDespawn; import net.minecraftforge.event.entity.living.ZombieEvent.SummonAidEvent; import net.minecraftforge.event.entity.player.ArrowLooseEvent; import net.minecraftforge.event.entity.player.ArrowNockEvent; import net.minecraftforge.event.entity.player.BonemealEvent; import net.minecraftforge.event.entity.player.EntityItemPickupEvent; import net.minecraftforge.event.entity.player.FillBucketEvent; import net.minecraftforge.event.entity.player.ItemTooltipEvent; import net.minecraftforge.event.entity.player.PlayerDestroyItemEvent; import net.minecraftforge.event.entity.player.PlayerDropsEvent; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerFlyableFallEvent; import net.minecraftforge.event.entity.player.PlayerSetSpawnEvent; import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent; import net.minecraftforge.event.entity.player.PlayerWakeUpEvent; import net.minecraftforge.event.entity.player.SleepingLocationCheckEvent; import net.minecraftforge.event.entity.player.UseHoeEvent; import net.minecraftforge.event.terraingen.ChunkGeneratorEvent; import net.minecraftforge.event.terraingen.PopulateChunkEvent; import net.minecraftforge.event.world.BlockEvent; import net.minecraftforge.event.world.BlockEvent.MultiPlaceEvent; import net.minecraftforge.event.world.BlockEvent.NeighborNotifyEvent; import net.minecraftforge.event.world.BlockEvent.PlaceEvent; import net.minecraftforge.event.world.ExplosionEvent; import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.fml.common.ObfuscationReflectionHelper; import net.minecraftforge.fml.common.eventhandler.Event; import net.minecraftforge.fml.common.eventhandler.Event.Result; public class ForgeEventFactory { public static MultiPlaceEvent onPlayerMultiBlockPlace(EntityPlayer player, List blockSnapshots, EnumFacing direction) { BlockSnapshot snap = blockSnapshots.get(0); IBlockState placedAgainst = snap.getWorld().getBlockState(snap.getPos().offset(direction.getOpposite())); MultiPlaceEvent event = new MultiPlaceEvent(blockSnapshots, placedAgainst, player); MinecraftForge.EVENT_BUS.post(event); return event; } public static PlaceEvent onPlayerBlockPlace(EntityPlayer player, BlockSnapshot blockSnapshot, EnumFacing direction) { IBlockState placedAgainst = blockSnapshot.getWorld().getBlockState(blockSnapshot.getPos().offset(direction.getOpposite())); PlaceEvent event = new PlaceEvent(blockSnapshot, placedAgainst, player); MinecraftForge.EVENT_BUS.post(event); return event; } public static NeighborNotifyEvent onNeighborNotify(World world, BlockPos pos, IBlockState state, EnumSet notifiedSides) { NeighborNotifyEvent event = new NeighborNotifyEvent(world, pos, state, notifiedSides); MinecraftForge.EVENT_BUS.post(event); return event; } public static boolean doPlayerHarvestCheck(EntityPlayer player, IBlockState state, boolean success) { PlayerEvent.HarvestCheck event = new PlayerEvent.HarvestCheck(player, state, success); MinecraftForge.EVENT_BUS.post(event); return event.canHarvest(); } public static float getBreakSpeed(EntityPlayer player, IBlockState state, float original, BlockPos pos) { PlayerEvent.BreakSpeed event = new PlayerEvent.BreakSpeed(player, state, original, pos); return (MinecraftForge.EVENT_BUS.post(event) ? -1 : event.getNewSpeed()); } public static void onPlayerDestroyItem(EntityPlayer player, ItemStack stack, EnumHand hand) { MinecraftForge.EVENT_BUS.post(new PlayerDestroyItemEvent(player, stack, hand)); } public static Result canEntitySpawn(EntityLiving entity, World world, float x, float y, float z) { LivingSpawnEvent.CheckSpawn event = new LivingSpawnEvent.CheckSpawn(entity, world, x, y, z); MinecraftForge.EVENT_BUS.post(event); return event.getResult(); } public static boolean doSpecialSpawn(EntityLiving entity, World world, float x, float y, float z) { return MinecraftForge.EVENT_BUS.post(new LivingSpawnEvent.SpecialSpawn(entity, world, x, y, z)); } public static Result canEntityDespawn(EntityLiving entity) { AllowDespawn event = new AllowDespawn(entity); MinecraftForge.EVENT_BUS.post(event); return event.getResult(); } public static int getExperienceDrop(EntityLivingBase entity, EntityPlayer attackingPlayer, int originalExperience) { LivingExperienceDropEvent event = new LivingExperienceDropEvent(entity, attackingPlayer, originalExperience); if (MinecraftForge.EVENT_BUS.post(event)) { return 0; } return event.getDroppedExperience(); } public static List getPotentialSpawns(WorldServer world, EnumCreatureType type, BlockPos pos, List oldList) { WorldEvent.PotentialSpawns event = new WorldEvent.PotentialSpawns(world, type, pos, oldList); if (MinecraftForge.EVENT_BUS.post(event)) { return null; } return event.getList(); } public static int getMaxSpawnPackSize(EntityLiving entity) { LivingPackSizeEvent maxCanSpawnEvent = new LivingPackSizeEvent(entity); MinecraftForge.EVENT_BUS.post(maxCanSpawnEvent); return maxCanSpawnEvent.getResult() == Result.ALLOW ? maxCanSpawnEvent.getMaxPackSize() : entity.getMaxSpawnedInChunk(); } public static String getPlayerDisplayName(EntityPlayer player, String username) { PlayerEvent.NameFormat event = new PlayerEvent.NameFormat(player, username); MinecraftForge.EVENT_BUS.post(event); return event.getDisplayname(); } public static float fireBlockHarvesting(List drops, World world, BlockPos pos, IBlockState state, int fortune, float dropChance, boolean silkTouch, EntityPlayer player) { BlockEvent.HarvestDropsEvent event = new BlockEvent.HarvestDropsEvent(world, pos, state, fortune, dropChance, drops, player, silkTouch); MinecraftForge.EVENT_BUS.post(event); return event.getDropChance(); } public static ItemTooltipEvent onItemTooltip(ItemStack itemStack, EntityPlayer entityPlayer, List toolTip, boolean showAdvancedItemTooltips) { ItemTooltipEvent event = new ItemTooltipEvent(itemStack, entityPlayer, toolTip, showAdvancedItemTooltips); MinecraftForge.EVENT_BUS.post(event); return event; } public static SummonAidEvent fireZombieSummonAid(EntityZombie zombie, World world, int x, int y, int z, EntityLivingBase attacker, double summonChance) { SummonAidEvent summonEvent = new SummonAidEvent(zombie, world, x, y, z, attacker, summonChance); MinecraftForge.EVENT_BUS.post(summonEvent); return summonEvent; } public static boolean onEntityStruckByLightning(Entity entity, EntityLightningBolt bolt) { return MinecraftForge.EVENT_BUS.post(new EntityStruckByLightningEvent(entity, bolt)); } public static int onItemUseStart(EntityLivingBase entity, ItemStack item, int duration) { LivingEntityUseItemEvent event = new LivingEntityUseItemEvent.Start(entity, item, duration); return MinecraftForge.EVENT_BUS.post(event) ? -1 : event.getDuration(); } public static int onItemUseTick(EntityLivingBase entity, ItemStack item, int duration) { LivingEntityUseItemEvent event = new LivingEntityUseItemEvent.Tick(entity, item, duration); return MinecraftForge.EVENT_BUS.post(event) ? -1 : event.getDuration(); } public static boolean onUseItemStop(EntityLivingBase entity, ItemStack item, int duration) { return MinecraftForge.EVENT_BUS.post(new LivingEntityUseItemEvent.Stop(entity, item, duration)); } public static ItemStack onItemUseFinish(EntityLivingBase entity, ItemStack item, int duration, ItemStack result) { LivingEntityUseItemEvent.Finish event = new LivingEntityUseItemEvent.Finish(entity, item, duration, result); MinecraftForge.EVENT_BUS.post(event); return event.getResultStack(); } public static void onStartEntityTracking(Entity entity, EntityPlayer player) { MinecraftForge.EVENT_BUS.post(new PlayerEvent.StartTracking(player, entity)); } public static void onStopEntityTracking(Entity entity, EntityPlayer player) { MinecraftForge.EVENT_BUS.post(new PlayerEvent.StopTracking(player, entity)); } public static void firePlayerLoadingEvent(EntityPlayer player, File playerDirectory, String uuidString) { MinecraftForge.EVENT_BUS.post(new PlayerEvent.LoadFromFile(player, playerDirectory, uuidString)); } public static void firePlayerSavingEvent(EntityPlayer player, File playerDirectory, String uuidString) { MinecraftForge.EVENT_BUS.post(new PlayerEvent.SaveToFile(player, playerDirectory, uuidString)); } public static void firePlayerLoadingEvent(EntityPlayer player, IPlayerFileData playerFileData, String uuidString) { SaveHandler sh = (SaveHandler) playerFileData; File dir = ObfuscationReflectionHelper.getPrivateValue(SaveHandler.class, sh, "playersDirectory", "field_"+"75771_c"); MinecraftForge.EVENT_BUS.post(new PlayerEvent.LoadFromFile(player, dir, uuidString)); } public static ITextComponent onClientChat(byte type, ITextComponent message) { ClientChatReceivedEvent event = new ClientChatReceivedEvent(type, message); return MinecraftForge.EVENT_BUS.post(event) ? null : event.getMessage(); } public static int onHoeUse(ItemStack stack, EntityPlayer player, World worldIn, BlockPos pos) { UseHoeEvent event = new UseHoeEvent(player, stack, worldIn, pos); if (MinecraftForge.EVENT_BUS.post(event)) return -1; if (event.getResult() == Result.ALLOW) { stack.damageItem(1, player); return 1; } return 0; } public static int onApplyBonemeal(EntityPlayer player, World world, BlockPos pos, IBlockState state, ItemStack stack) { BonemealEvent event = new BonemealEvent(player, world, pos, state); if (MinecraftForge.EVENT_BUS.post(event)) return -1; if (event.getResult() == Result.ALLOW) { if (!world.isRemote) stack.stackSize--; return 1; } return 0; } public static ActionResult onBucketUse(EntityPlayer player, World world, ItemStack stack, RayTraceResult target) { FillBucketEvent event = new FillBucketEvent(player, stack, world, target); if (MinecraftForge.EVENT_BUS.post(event)) return new ActionResult(EnumActionResult.FAIL, stack); if (event.getResult() == Result.ALLOW) { if (player.capabilities.isCreativeMode) return new ActionResult(EnumActionResult.SUCCESS, stack); if (--stack.stackSize <= 0) return new ActionResult(EnumActionResult.SUCCESS, event.getFilledBucket()); if (!player.inventory.addItemStackToInventory(event.getFilledBucket())) player.dropItem(event.getFilledBucket(), false); return new ActionResult(EnumActionResult.SUCCESS, stack); } return null; } public static boolean canEntityUpdate(Entity entity) { EntityEvent.CanUpdate event = new EntityEvent.CanUpdate(entity); MinecraftForge.EVENT_BUS.post(event); return event.getCanUpdate(); } public static PlaySoundAtEntityEvent onPlaySoundAtEntity(Entity entity, SoundEvent name, SoundCategory category, float volume, float pitch) { PlaySoundAtEntityEvent event = new PlaySoundAtEntityEvent(entity, name, category, volume, pitch); MinecraftForge.EVENT_BUS.post(event); return event; } public static int onItemExpire(EntityItem entity, ItemStack item) { if (item == null) return -1; ItemExpireEvent event = new ItemExpireEvent(entity, (item.getItem() == null ? 6000 : item.getItem().getEntityLifespan(item, entity.worldObj))); if (!MinecraftForge.EVENT_BUS.post(event)) return -1; return event.getExtraLife(); } public static int onItemPickup(EntityItem entityItem, EntityPlayer entityIn, ItemStack itemstack) { Event event = new EntityItemPickupEvent(entityIn, entityItem); if (MinecraftForge.EVENT_BUS.post(event)) return -1; return event.getResult() == Result.ALLOW ? 1 : 0; } public static void onPlayerDrops(EntityPlayer player, DamageSource cause, List capturedDrops, boolean recentlyHit) { PlayerDropsEvent event = new PlayerDropsEvent(player, cause, capturedDrops, recentlyHit); if (!MinecraftForge.EVENT_BUS.post(event)) { for (EntityItem item : capturedDrops) { player.dropItemAndGetStack(item); } } } public static boolean canMountEntity(Entity entityMounting, Entity entityBeingMounted, boolean isMounting) { boolean isCanceled = MinecraftForge.EVENT_BUS.post(new EntityMountEvent(entityMounting, entityBeingMounted, entityMounting.worldObj, isMounting)); if(isCanceled) { entityMounting.setPositionAndRotation(entityMounting.posX, entityMounting.posY, entityMounting.posZ, entityMounting.prevRotationYaw, entityMounting.prevRotationPitch); return false; } else return true; } public static SleepResult onPlayerSleepInBed(EntityPlayer player, BlockPos pos) { PlayerSleepInBedEvent event = new PlayerSleepInBedEvent(player, pos); MinecraftForge.EVENT_BUS.post(event); return event.getResultStatus(); } public static void onPlayerWakeup(EntityPlayer player, boolean wakeImmediately, boolean updateWorldFlag, boolean setSpawn) { MinecraftForge.EVENT_BUS.post(new PlayerWakeUpEvent(player, wakeImmediately, updateWorldFlag, setSpawn)); } public static void onPlayerFall(EntityPlayer player, float distance, float multiplier) { MinecraftForge.EVENT_BUS.post(new PlayerFlyableFallEvent(player, distance, multiplier)); } public static boolean onPlayerSpawnSet(EntityPlayer player, BlockPos pos, boolean forced) { return MinecraftForge.EVENT_BUS.post(new PlayerSetSpawnEvent(player, pos, forced)); } public static void onPlayerClone(EntityPlayer player, EntityPlayer oldPlayer, boolean wasDeath) { MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.entity.player.PlayerEvent.Clone(player, oldPlayer, wasDeath)); } public static boolean onExplosionStart(World world, Explosion explosion) { return MinecraftForge.EVENT_BUS.post(new ExplosionEvent.Start(world, explosion)); } public static void onExplosionDetonate(World world, Explosion explosion, List list, double diameter) { //Filter entities to only those who are effected, to prevent modders from seeing more then will be hurt. /* Enable this if we get issues with modders looping to much. Iterator itr = list.iterator(); Vec3 p = explosion.getPosition(); while (itr.hasNext()) { Entity e = itr.next(); double dist = e.getDistance(p.xCoord, p.yCoord, p.zCoord) / diameter; if (e.func_180427_aV() || dist > 1.0F) itr.remove(); } */ MinecraftForge.EVENT_BUS.post(new ExplosionEvent.Detonate(world, explosion, list)); } public static boolean onCreateWorldSpawn(World world, WorldSettings settings) { return MinecraftForge.EVENT_BUS.post(new WorldEvent.CreateSpawnPosition(world, settings)); } public static float onLivingHeal(EntityLivingBase entity, float amount) { LivingHealEvent event = new LivingHealEvent(entity, amount); return (MinecraftForge.EVENT_BUS.post(event) ? 0 : event.getAmount()); } public static boolean onPotionAttemptBrew(ItemStack[] stacks) { ItemStack[] tmp = new ItemStack[stacks.length]; for (int x = 0; x < tmp.length; x++) tmp[x] = ItemStack.copyItemStack(stacks[x]); PotionBrewEvent.Pre event = new PotionBrewEvent.Pre(tmp); if (MinecraftForge.EVENT_BUS.post(event)) { boolean changed = false; for (int x = 0; x < stacks.length; x++) { changed |= ItemStack.areItemStacksEqual(tmp[x], stacks[x]); stacks[x] = event.getItem(x); } if (changed) onPotionBrewed(stacks); return true; } return false; } public static void onPotionBrewed(ItemStack[] brewingItemStacks) { MinecraftForge.EVENT_BUS.post(new PotionBrewEvent.Post(brewingItemStacks)); } public static boolean renderFireOverlay(EntityPlayer player, float renderPartialTicks) { return renderBlockOverlay(player, renderPartialTicks, OverlayType.FIRE, Blocks.FIRE.getDefaultState(), new BlockPos(player)); } public static boolean renderWaterOverlay(EntityPlayer player, float renderPartialTicks) { return renderBlockOverlay(player, renderPartialTicks, OverlayType.WATER, Blocks.WATER.getDefaultState(), new BlockPos(player)); } public static boolean renderBlockOverlay(EntityPlayer player, float renderPartialTicks, OverlayType type, IBlockState block, BlockPos pos) { return MinecraftForge.EVENT_BUS.post(new RenderBlockOverlayEvent(player, renderPartialTicks, type, block, pos)); } public static CapabilityDispatcher gatherCapabilities(TileEntity tileEntity) { return gatherCapabilities(new AttachCapabilitiesEvent.TileEntity(tileEntity), null); } public static CapabilityDispatcher gatherCapabilities(Entity entity) { return gatherCapabilities(new AttachCapabilitiesEvent.Entity(entity), null); } public static CapabilityDispatcher gatherCapabilities(Item item, ItemStack stack, ICapabilityProvider parent) { return gatherCapabilities(new AttachCapabilitiesEvent.Item(item, stack), parent); } private static CapabilityDispatcher gatherCapabilities(AttachCapabilitiesEvent event, ICapabilityProvider parent) { MinecraftForge.EVENT_BUS.post(event); return event.getCapabilities().size() > 0 || parent != null ? new CapabilityDispatcher(event.getCapabilities(), parent) : null; } public static boolean fireSleepingLocationCheck(EntityPlayer player, BlockPos sleepingLocation) { SleepingLocationCheckEvent evt = new SleepingLocationCheckEvent(player, sleepingLocation); MinecraftForge.EVENT_BUS.post(evt); Result canContinueSleep = evt.getResult(); if (canContinueSleep == Result.DEFAULT) { IBlockState state = player.worldObj.getBlockState(player.playerLocation); return state.getBlock().isBed(state, player.worldObj, player.playerLocation, player); } else return canContinueSleep == Result.ALLOW; } public static ActionResult onArrowNock(ItemStack item, World world, EntityPlayer player, EnumHand hand, boolean hasAmmo) { ArrowNockEvent event = new ArrowNockEvent(player, item, hand, world, hasAmmo); if (MinecraftForge.EVENT_BUS.post(event)) return new ActionResult(EnumActionResult.FAIL, item); return event.getAction(); } public static int onArrowLoose(ItemStack stack, World world, EntityPlayer player, int charge, boolean hasAmmo) { ArrowLooseEvent event = new ArrowLooseEvent(player, stack, world, charge, hasAmmo); if (MinecraftForge.EVENT_BUS.post(event)) return -1; return event.getCharge(); } public static boolean onReplaceBiomeBlocks(IChunkGenerator gen, int x, int z, ChunkPrimer primer, World world) { ChunkGeneratorEvent.ReplaceBiomeBlocks event = new ChunkGeneratorEvent.ReplaceBiomeBlocks(gen, x, z, primer, world); net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(event); return event.getResult() != net.minecraftforge.fml.common.eventhandler.Event.Result.DENY; } /** * @deprecated Use {@link #onChunkPopulate(boolean, IChunkGenerator, World, Random, int, int, boolean)}
* The Random param should not be world.rand, it should be the same chunk-position-seeded rand used by the Chunk Provider. */ @Deprecated public static void onChunkPopulate(boolean pre, IChunkGenerator gen, World world, int x, int z, boolean hasVillageGenerated) { MinecraftForge.EVENT_BUS.post(pre ? new PopulateChunkEvent.Pre(gen, world, world.rand, x, z, hasVillageGenerated) : new PopulateChunkEvent.Post(gen, world, world.rand, x, z, hasVillageGenerated)); } public static void onChunkPopulate(boolean pre, IChunkGenerator gen, World world, Random rand, int x, int z, boolean hasVillageGenerated) { MinecraftForge.EVENT_BUS.post(pre ? new PopulateChunkEvent.Pre(gen, world, rand, x, z, hasVillageGenerated) : new PopulateChunkEvent.Post(gen, world, rand, x, z, hasVillageGenerated)); } public static LootTable loadLootTable(ResourceLocation name, LootTable table) { LootTableLoadEvent event = new LootTableLoadEvent(name, table); if (MinecraftForge.EVENT_BUS.post(event)) return LootTable.EMPTY_LOOT_TABLE; return event.getTable(); } }