ForgePatch/src/main/java/net/minecraftforge/event/ForgeEventFactory.java

765 lines
33 KiB
Java
Raw Normal View History

/*
* Minecraft Forge
2020-07-02 17:49:11 +00:00
* Copyright (c) 2016-2020.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation version 2.1
* of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package net.minecraftforge.event;
2012-12-13 07:27:57 +00:00
import java.io.File;
2019-05-23 23:02:15 +00:00
import java.util.*;
import java.util.function.Consumer;
2018-12-22 18:31:18 +00:00
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.brigadier.CommandDispatcher;
2020-08-13 07:13:48 +00:00
import net.minecraft.block.PortalSize;
2019-05-23 23:02:15 +00:00
import net.minecraft.block.BlockState;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.command.CommandSource;
import net.minecraft.command.Commands;
import net.minecraft.entity.Entity;
import net.minecraft.entity.Pose;
import net.minecraft.entity.EntitySize;
import net.minecraft.entity.EntityType;
2019-05-23 23:02:15 +00:00
import net.minecraft.entity.MobEntity;
import net.minecraft.entity.SpawnReason;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.EntityClassification;
import net.minecraft.entity.effect.LightningBoltEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.monster.ZombieEntity;
import net.minecraft.entity.passive.AnimalEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.PlayerEntity.SleepResult;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.entity.projectile.AbstractArrowEntity;
import net.minecraft.entity.projectile.DamagingProjectileEntity;
2020-06-19 14:58:45 +00:00
import net.minecraft.entity.projectile.FireworkRocketEntity;
2019-05-23 23:02:15 +00:00
import net.minecraft.entity.projectile.ThrowableEntity;
import net.minecraft.block.Blocks;
2012-12-13 07:27:57 +00:00
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUseContext;
2020-06-19 14:58:45 +00:00
import net.minecraft.loot.LootTable;
import net.minecraft.loot.LootTableManager;
import net.minecraft.resources.IFutureReloadListener;
import net.minecraft.resources.DataPackRegistries;
2019-05-23 23:02:15 +00:00
import net.minecraft.world.spawner.AbstractSpawner;
2016-03-02 07:38:31 +00:00
import net.minecraft.util.ActionResult;
2019-05-23 23:02:15 +00:00
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction;
import net.minecraft.util.Hand;
2016-11-13 22:09:54 +00:00
import net.minecraft.util.NonNullList;
import net.minecraft.util.RegistryKey;
import net.minecraft.util.ResourceLocation;
2016-03-08 19:43:05 +00:00
import net.minecraft.util.SoundCategory;
2016-03-08 05:06:54 +00:00
import net.minecraft.util.SoundEvent;
2016-03-01 08:31:58 +00:00
import net.minecraft.util.math.BlockPos;
2019-05-23 23:02:15 +00:00
import net.minecraft.util.math.ChunkPos;
2016-03-02 04:42:36 +00:00
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.text.ChatType;
2016-03-02 04:42:36 +00:00
import net.minecraft.util.text.ITextComponent;
import net.minecraft.world.Explosion;
2019-06-25 02:01:03 +00:00
import net.minecraft.world.GameRules;
2018-11-20 03:55:46 +00:00
import net.minecraft.world.IWorld;
import net.minecraft.world.IWorldReader;
import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
2020-08-13 07:13:48 +00:00
import net.minecraft.world.biome.MobSpawnInfo;
2020-06-24 00:56:24 +00:00
import net.minecraft.world.storage.IServerWorldInfo;
2020-06-19 14:58:45 +00:00
import net.minecraft.world.storage.PlayerData;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.client.event.ClientChatEvent;
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.ToolType;
import net.minecraftforge.common.capabilities.CapabilityDispatcher;
import net.minecraftforge.common.capabilities.ICapabilityProvider;
Added PlaceEvent and MultiPlaceEvent which fires before placing a block. Before calling "ItemStack.tryPlaceItemInWorld", a recording flag is turned on for setBlock to capture a blocksnapshot for each block that attempts to be placed. If 1 block is captured, a "BlockEvent.PlaceEvent" is fired to notify mods. If 2 or more blocks are captured, a "BlockEvent.PlaceEvent" is fired first with the first block captured followed by a "BlockEvent.MultiPlaceEvent" with all captured blocks. This extra event is required for items that have the ability to place 2 or more blocks such as a BlockBed. If either event is cancelled, the recorded block snapshot(s), item stacksize, and item meta will revert back to the captured snapshot(s). If the events are not cancelled, a notification will be sent to clients and block physics will be updated. What this means for mods is Forge will be able to capture all player block placement automatically and fire a PlaceEvent and/or MultiPlaceEvent. If for whatever reason your mod does not use the standard placement methods then you will need to fire the appropriate placement events in order to notify mods/servers. This commit also includes a new utility class called BlockSnapshot which is serializable. This new class is used in conjunction with both PlaceEvent and MultiPlaceEvent in order to record a snapshot of block space before it is altered. This allows us to restore the block(s) if an event is cancelled. The class also provides the ability to restore a snapshot to any location using the restoreToLocation method. This should be helpful to many mods that are looking to be able to capture block data then restore it to back to any location required.
2014-08-27 02:47:22 +00:00
import net.minecraftforge.common.util.BlockSnapshot;
2016-08-13 20:38:45 +00:00
import net.minecraftforge.event.brewing.PlayerBrewedPotionEvent;
import net.minecraftforge.event.brewing.PotionBrewEvent;
import net.minecraftforge.event.entity.EntityEvent;
import net.minecraftforge.event.entity.EntityMobGriefingEvent;
2015-02-21 02:03:16 +00:00
import net.minecraftforge.event.entity.EntityMountEvent;
import net.minecraftforge.event.entity.EntityStruckByLightningEvent;
import net.minecraftforge.event.entity.PlaySoundAtEntityEvent;
import net.minecraftforge.event.entity.ProjectileImpactEvent;
import net.minecraftforge.event.entity.item.ItemExpireEvent;
import net.minecraftforge.event.entity.living.AnimalTameEvent;
import net.minecraftforge.event.entity.living.LivingConversionEvent;
import net.minecraftforge.event.entity.living.LivingDestroyBlockEvent;
2016-03-02 04:42:36 +00:00
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;
2016-03-02 07:38:31 +00:00
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.PlayerEvent;
import net.minecraftforge.event.entity.player.PlayerFlyableFallEvent;
2015-10-10 22:39:27 +00:00
import net.minecraftforge.event.entity.player.PlayerSetSpawnEvent;
import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent;
import net.minecraftforge.event.entity.player.PlayerWakeUpEvent;
2016-01-09 21:39:12 +00:00
import net.minecraftforge.event.entity.player.SleepingLocationCheckEvent;
import net.minecraftforge.event.entity.player.SleepingTimeCheckEvent;
import net.minecraftforge.event.entity.player.UseHoeEvent;
2017-07-03 19:54:01 +00:00
import net.minecraftforge.event.furnace.FurnaceFuelBurnTimeEvent;
import net.minecraftforge.event.world.BlockEvent;
import net.minecraftforge.event.world.BlockEvent.BlockToolInteractEvent;
import net.minecraftforge.event.world.BlockEvent.CreateFluidSourceEvent;
import net.minecraftforge.event.world.BlockEvent.EntityMultiPlaceEvent;
import net.minecraftforge.event.world.BlockEvent.EntityPlaceEvent;
import net.minecraftforge.event.world.BlockEvent.NeighborNotifyEvent;
2019-05-23 23:02:15 +00:00
import net.minecraftforge.event.world.ChunkWatchEvent;
import net.minecraftforge.event.world.ExplosionEvent;
2019-08-02 21:12:21 +00:00
import net.minecraftforge.event.world.PistonEvent;
import net.minecraftforge.event.world.SaplingGrowTreeEvent;
import net.minecraftforge.event.world.SleepFinishedTimeEvent;
import net.minecraftforge.event.world.WorldEvent;
2018-06-11 01:12:46 +00:00
import net.minecraftforge.eventbus.api.Event;
import net.minecraftforge.eventbus.api.Event.Result;
public class ForgeEventFactory
{
Added PlaceEvent and MultiPlaceEvent which fires before placing a block. Before calling "ItemStack.tryPlaceItemInWorld", a recording flag is turned on for setBlock to capture a blocksnapshot for each block that attempts to be placed. If 1 block is captured, a "BlockEvent.PlaceEvent" is fired to notify mods. If 2 or more blocks are captured, a "BlockEvent.PlaceEvent" is fired first with the first block captured followed by a "BlockEvent.MultiPlaceEvent" with all captured blocks. This extra event is required for items that have the ability to place 2 or more blocks such as a BlockBed. If either event is cancelled, the recorded block snapshot(s), item stacksize, and item meta will revert back to the captured snapshot(s). If the events are not cancelled, a notification will be sent to clients and block physics will be updated. What this means for mods is Forge will be able to capture all player block placement automatically and fire a PlaceEvent and/or MultiPlaceEvent. If for whatever reason your mod does not use the standard placement methods then you will need to fire the appropriate placement events in order to notify mods/servers. This commit also includes a new utility class called BlockSnapshot which is serializable. This new class is used in conjunction with both PlaceEvent and MultiPlaceEvent in order to record a snapshot of block space before it is altered. This allows us to restore the block(s) if an event is cancelled. The class also provides the ability to restore a snapshot to any location using the restoreToLocation method. This should be helpful to many mods that are looking to be able to capture block data then restore it to back to any location required.
2014-08-27 02:47:22 +00:00
2019-05-23 23:02:15 +00:00
public static boolean onMultiBlockPlace(@Nullable Entity entity, List<BlockSnapshot> blockSnapshots, Direction direction)
{
BlockSnapshot snap = blockSnapshots.get(0);
2019-05-23 23:02:15 +00:00
BlockState placedAgainst = snap.getWorld().getBlockState(snap.getPos().offset(direction.getOpposite()));
EntityMultiPlaceEvent event = new EntityMultiPlaceEvent(blockSnapshots, placedAgainst, entity);
return MinecraftForge.EVENT_BUS.post(event);
}
2019-05-23 23:02:15 +00:00
public static boolean onBlockPlace(@Nullable Entity entity, @Nonnull BlockSnapshot blockSnapshot, @Nonnull Direction direction)
{
2019-05-23 23:02:15 +00:00
BlockState placedAgainst = blockSnapshot.getWorld().getBlockState(blockSnapshot.getPos().offset(direction.getOpposite()));
EntityPlaceEvent event = new BlockEvent.EntityPlaceEvent(blockSnapshot, placedAgainst, entity);
return MinecraftForge.EVENT_BUS.post(event);
}
2019-05-23 23:02:15 +00:00
public static NeighborNotifyEvent onNeighborNotify(World world, BlockPos pos, BlockState state, EnumSet<Direction> notifiedSides, boolean forceRedstoneUpdate)
2015-03-01 06:53:32 +00:00
{
2016-11-13 22:09:54 +00:00
NeighborNotifyEvent event = new NeighborNotifyEvent(world, pos, state, notifiedSides, forceRedstoneUpdate);
2015-03-01 06:53:32 +00:00
MinecraftForge.EVENT_BUS.post(event);
return event;
}
Added PlaceEvent and MultiPlaceEvent which fires before placing a block. Before calling "ItemStack.tryPlaceItemInWorld", a recording flag is turned on for setBlock to capture a blocksnapshot for each block that attempts to be placed. If 1 block is captured, a "BlockEvent.PlaceEvent" is fired to notify mods. If 2 or more blocks are captured, a "BlockEvent.PlaceEvent" is fired first with the first block captured followed by a "BlockEvent.MultiPlaceEvent" with all captured blocks. This extra event is required for items that have the ability to place 2 or more blocks such as a BlockBed. If either event is cancelled, the recorded block snapshot(s), item stacksize, and item meta will revert back to the captured snapshot(s). If the events are not cancelled, a notification will be sent to clients and block physics will be updated. What this means for mods is Forge will be able to capture all player block placement automatically and fire a PlaceEvent and/or MultiPlaceEvent. If for whatever reason your mod does not use the standard placement methods then you will need to fire the appropriate placement events in order to notify mods/servers. This commit also includes a new utility class called BlockSnapshot which is serializable. This new class is used in conjunction with both PlaceEvent and MultiPlaceEvent in order to record a snapshot of block space before it is altered. This allows us to restore the block(s) if an event is cancelled. The class also provides the ability to restore a snapshot to any location using the restoreToLocation method. This should be helpful to many mods that are looking to be able to capture block data then restore it to back to any location required.
2014-08-27 02:47:22 +00:00
2019-05-23 23:02:15 +00:00
public static boolean doPlayerHarvestCheck(PlayerEntity player, BlockState state, boolean success)
{
2016-03-02 04:42:36 +00:00
PlayerEvent.HarvestCheck event = new PlayerEvent.HarvestCheck(player, state, success);
MinecraftForge.EVENT_BUS.post(event);
2016-03-02 04:42:36 +00:00
return event.canHarvest();
}
2019-05-23 23:02:15 +00:00
public static float getBreakSpeed(PlayerEntity player, BlockState state, float original, BlockPos pos)
{
PlayerEvent.BreakSpeed event = new PlayerEvent.BreakSpeed(player, state, original, pos);
return (MinecraftForge.EVENT_BUS.post(event) ? -1 : event.getNewSpeed());
}
2019-05-23 23:02:15 +00:00
public static void onPlayerDestroyItem(PlayerEntity player, @Nonnull ItemStack stack, @Nullable Hand hand)
{
2016-03-02 04:42:36 +00:00
MinecraftForge.EVENT_BUS.post(new PlayerDestroyItemEvent(player, stack, hand));
}
public static Result canEntitySpawn(MobEntity entity, IWorld world, double x, double y, double z, AbstractSpawner spawner, SpawnReason spawnReason)
{
if (entity == null)
return Result.DEFAULT;
LivingSpawnEvent.CheckSpawn event = new LivingSpawnEvent.CheckSpawn(entity, world, x, y, z, spawner, spawnReason);
MinecraftForge.EVENT_BUS.post(event);
return event.getResult();
}
2019-05-23 23:02:15 +00:00
public static boolean canEntitySpawnSpawner(MobEntity entity, World world, float x, float y, float z, AbstractSpawner spawner)
{
Result result = canEntitySpawn(entity, world, x, y, z, spawner, SpawnReason.SPAWNER);
if (result == Result.DEFAULT)
return entity.canSpawn(world, SpawnReason.SPAWNER) && entity.isNotColliding(world); // vanilla logic (inverted)
else
return result == Result.ALLOW;
}
public static boolean doSpecialSpawn(MobEntity entity, World world, float x, float y, float z, AbstractSpawner spawner, SpawnReason spawnReason)
{
return MinecraftForge.EVENT_BUS.post(new LivingSpawnEvent.SpecialSpawn(entity, world, x, y, z, spawner, spawnReason));
}
2019-05-23 23:02:15 +00:00
public static Result canEntityDespawn(MobEntity entity)
{
AllowDespawn event = new AllowDespawn(entity);
MinecraftForge.EVENT_BUS.post(event);
return event.getResult();
}
public static int getItemBurnTime(@Nonnull ItemStack itemStack, int burnTime)
2017-07-03 19:54:01 +00:00
{
FurnaceFuelBurnTimeEvent event = new FurnaceFuelBurnTimeEvent(itemStack, burnTime);
MinecraftForge.EVENT_BUS.post(event);
return event.getBurnTime();
}
2019-05-23 23:02:15 +00:00
public static int getExperienceDrop(LivingEntity entity, PlayerEntity attackingPlayer, int originalExperience)
{
LivingExperienceDropEvent event = new LivingExperienceDropEvent(entity, attackingPlayer, originalExperience);
if (MinecraftForge.EVENT_BUS.post(event))
{
return 0;
}
return event.getDroppedExperience();
}
2014-06-22 14:11:32 +00:00
@Nullable
2020-08-13 07:13:48 +00:00
public static List<MobSpawnInfo.Spawners> getPotentialSpawns(IWorld world, EntityClassification type, BlockPos pos, List<MobSpawnInfo.Spawners> oldList)
{
WorldEvent.PotentialSpawns event = new WorldEvent.PotentialSpawns(world, type, pos, oldList);
if (MinecraftForge.EVENT_BUS.post(event))
2019-05-23 23:02:15 +00:00
return Collections.emptyList();
return event.getList();
}
2014-06-22 14:11:32 +00:00
2019-05-23 23:02:15 +00:00
public static int getMaxSpawnPackSize(MobEntity entity)
{
LivingPackSizeEvent maxCanSpawnEvent = new LivingPackSizeEvent(entity);
MinecraftForge.EVENT_BUS.post(maxCanSpawnEvent);
return maxCanSpawnEvent.getResult() == Result.ALLOW ? maxCanSpawnEvent.getMaxPackSize() : entity.getMaxSpawnedInChunk();
}
2013-09-03 20:55:11 +00:00
public static ITextComponent getPlayerDisplayName(PlayerEntity player, ITextComponent username)
2013-09-03 20:55:11 +00:00
{
PlayerEvent.NameFormat event = new PlayerEvent.NameFormat(player, username);
MinecraftForge.EVENT_BUS.post(event);
return event.getDisplayname();
2013-09-03 20:55:11 +00:00
}
public static BlockState fireFluidPlaceBlockEvent(IWorld world, BlockPos pos, BlockPos liquidPos, BlockState state)
{
BlockEvent.FluidPlaceBlockEvent event = new BlockEvent.FluidPlaceBlockEvent(world, pos, liquidPos, state);
MinecraftForge.EVENT_BUS.post(event);
return event.getNewState();
}
2019-05-23 23:02:15 +00:00
public static ItemTooltipEvent onItemTooltip(ItemStack itemStack, @Nullable PlayerEntity entityPlayer, List<ITextComponent> list, ITooltipFlag flags)
{
ItemTooltipEvent event = new ItemTooltipEvent(itemStack, entityPlayer, list, flags);
MinecraftForge.EVENT_BUS.post(event);
return event;
}
2019-05-23 23:02:15 +00:00
public static SummonAidEvent fireZombieSummonAid(ZombieEntity zombie, World world, int x, int y, int z, LivingEntity attacker, double summonChance)
{
SummonAidEvent summonEvent = new SummonAidEvent(zombie, world, x, y, z, attacker, summonChance);
MinecraftForge.EVENT_BUS.post(summonEvent);
return summonEvent;
}
2019-05-23 23:02:15 +00:00
public static boolean onEntityStruckByLightning(Entity entity, LightningBoltEntity bolt)
{
return MinecraftForge.EVENT_BUS.post(new EntityStruckByLightningEvent(entity, bolt));
}
2019-05-23 23:02:15 +00:00
public static int onItemUseStart(LivingEntity entity, ItemStack item, int duration)
{
2016-03-02 04:42:36 +00:00
LivingEntityUseItemEvent event = new LivingEntityUseItemEvent.Start(entity, item, duration);
return MinecraftForge.EVENT_BUS.post(event) ? -1 : event.getDuration();
}
2019-05-23 23:02:15 +00:00
public static int onItemUseTick(LivingEntity entity, ItemStack item, int duration)
{
2016-03-02 04:42:36 +00:00
LivingEntityUseItemEvent event = new LivingEntityUseItemEvent.Tick(entity, item, duration);
return MinecraftForge.EVENT_BUS.post(event) ? -1 : event.getDuration();
}
2019-05-23 23:02:15 +00:00
public static boolean onUseItemStop(LivingEntity entity, ItemStack item, int duration)
{
2016-03-02 04:42:36 +00:00
return MinecraftForge.EVENT_BUS.post(new LivingEntityUseItemEvent.Stop(entity, item, duration));
}
2019-05-23 23:02:15 +00:00
public static ItemStack onItemUseFinish(LivingEntity entity, ItemStack item, int duration, ItemStack result)
{
2016-03-02 04:42:36 +00:00
LivingEntityUseItemEvent.Finish event = new LivingEntityUseItemEvent.Finish(entity, item, duration, result);
MinecraftForge.EVENT_BUS.post(event);
return event.getResultStack();
}
2014-06-22 14:11:32 +00:00
2019-05-23 23:02:15 +00:00
public static void onStartEntityTracking(Entity entity, PlayerEntity player)
{
MinecraftForge.EVENT_BUS.post(new PlayerEvent.StartTracking(player, entity));
}
2014-06-22 14:11:32 +00:00
2019-05-23 23:02:15 +00:00
public static void onStopEntityTracking(Entity entity, PlayerEntity player)
{
MinecraftForge.EVENT_BUS.post(new PlayerEvent.StopTracking(player, entity));
}
2019-05-23 23:02:15 +00:00
public static void firePlayerLoadingEvent(PlayerEntity player, File playerDirectory, String uuidString)
{
2014-06-22 14:11:32 +00:00
MinecraftForge.EVENT_BUS.post(new PlayerEvent.LoadFromFile(player, playerDirectory, uuidString));
}
2019-05-23 23:02:15 +00:00
public static void firePlayerSavingEvent(PlayerEntity player, File playerDirectory, String uuidString)
{
MinecraftForge.EVENT_BUS.post(new PlayerEvent.SaveToFile(player, playerDirectory, uuidString));
}
2020-06-19 14:58:45 +00:00
public static void firePlayerLoadingEvent(PlayerEntity player, PlayerData playerFileData, String uuidString)
{
2020-06-19 14:58:45 +00:00
MinecraftForge.EVENT_BUS.post(new PlayerEvent.LoadFromFile(player, playerFileData.getPlayerDataFolder(), uuidString));
}
@Nullable
public static ITextComponent onClientChat(ChatType type, ITextComponent message, @Nullable UUID senderUUID)
{
ClientChatReceivedEvent event = new ClientChatReceivedEvent(type, message, senderUUID);
return MinecraftForge.EVENT_BUS.post(event) ? null : event.getMessage();
}
@Nonnull
public static String onClientSendMessage(String message)
{
ClientChatEvent event = new ClientChatEvent(message);
return MinecraftForge.EVENT_BUS.post(event) ? "" : event.getMessage();
}
//TODO: 1.17 Remove
@Deprecated
public static int onHoeUse(ItemUseContext context)
{
UseHoeEvent event = new UseHoeEvent(context);
if (MinecraftForge.EVENT_BUS.post(event)) return -1;
if (event.getResult() == Result.ALLOW)
{
context.getItem().damageItem(1, context.getPlayer(), player -> player.sendBreakAnimation(context.getHand()));
return 1;
}
return 0;
}
2020-08-13 07:13:48 +00:00
@Nullable
public static BlockState onToolUse(BlockState originalState, World world, BlockPos pos, PlayerEntity player, ItemStack stack, ToolType toolType)
{
BlockToolInteractEvent event = new BlockToolInteractEvent(world, pos, originalState, player, stack, toolType);
return MinecraftForge.EVENT_BUS.post(event) ? null : event.getFinalState();
}
2019-05-23 23:02:15 +00:00
public static int onApplyBonemeal(@Nonnull PlayerEntity player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull BlockState state, @Nonnull ItemStack stack)
{
BonemealEvent event = new BonemealEvent(player, world, pos, state, stack);
if (MinecraftForge.EVENT_BUS.post(event)) return -1;
if (event.getResult() == Result.ALLOW)
{
if (!world.isRemote)
stack.shrink(1);
return 1;
}
return 0;
}
@Nullable
2019-05-23 23:02:15 +00:00
public static ActionResult<ItemStack> onBucketUse(@Nonnull PlayerEntity player, @Nonnull World world, @Nonnull ItemStack stack, @Nullable RayTraceResult target)
{
FillBucketEvent event = new FillBucketEvent(player, stack, world, target);
2019-05-23 23:02:15 +00:00
if (MinecraftForge.EVENT_BUS.post(event)) return new ActionResult<ItemStack>(ActionResultType.FAIL, stack);
if (event.getResult() == Result.ALLOW)
{
if (player.abilities.isCreativeMode)
2019-05-23 23:02:15 +00:00
return new ActionResult<ItemStack>(ActionResultType.SUCCESS, stack);
stack.shrink(1);
if (stack.isEmpty())
2019-05-23 23:02:15 +00:00
return new ActionResult<ItemStack>(ActionResultType.SUCCESS, event.getFilledBucket());
2016-03-02 04:42:36 +00:00
if (!player.inventory.addItemStackToInventory(event.getFilledBucket()))
2016-05-18 12:11:56 +00:00
player.dropItem(event.getFilledBucket(), false);
2019-05-23 23:02:15 +00:00
return new ActionResult<ItemStack>(ActionResultType.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();
}
2016-03-08 19:43:05 +00:00
public static PlaySoundAtEntityEvent onPlaySoundAtEntity(Entity entity, SoundEvent name, SoundCategory category, float volume, float pitch)
{
2016-03-08 19:43:05 +00:00
PlaySoundAtEntityEvent event = new PlaySoundAtEntityEvent(entity, name, category, volume, pitch);
MinecraftForge.EVENT_BUS.post(event);
return event;
}
2019-05-23 23:02:15 +00:00
public static int onItemExpire(ItemEntity entity, @Nonnull ItemStack item)
{
if (item.isEmpty()) return -1;
ItemExpireEvent event = new ItemExpireEvent(entity, (item.isEmpty() ? 6000 : item.getItem().getEntityLifespan(item, entity.world)));
if (!MinecraftForge.EVENT_BUS.post(event)) return -1;
return event.getExtraLife();
}
2019-05-23 23:02:15 +00:00
public static int onItemPickup(ItemEntity entityItem, PlayerEntity player)
{
Event event = new EntityItemPickupEvent(player, entityItem);
if (MinecraftForge.EVENT_BUS.post(event)) return -1;
return event.getResult() == Result.ALLOW ? 1 : 0;
}
2015-02-21 02:03:16 +00:00
public static boolean canMountEntity(Entity entityMounting, Entity entityBeingMounted, boolean isMounting)
{
boolean isCanceled = MinecraftForge.EVENT_BUS.post(new EntityMountEvent(entityMounting, entityBeingMounted, entityMounting.world, isMounting));
2015-02-21 02:03:16 +00:00
if(isCanceled)
{
entityMounting.setPositionAndRotation(entityMounting.getPosX(), entityMounting.getPosY(), entityMounting.getPosZ(), entityMounting.prevRotationYaw, entityMounting.prevRotationPitch);
2015-02-21 02:03:16 +00:00
return false;
}
else
return true;
2015-02-21 02:03:16 +00:00
}
2019-05-23 23:02:15 +00:00
public static boolean onAnimalTame(AnimalEntity animal, PlayerEntity tamer)
{
return MinecraftForge.EVENT_BUS.post(new AnimalTameEvent(animal, tamer));
}
2019-05-23 23:02:15 +00:00
public static SleepResult onPlayerSleepInBed(PlayerEntity player, Optional<BlockPos> pos)
{
PlayerSleepInBedEvent event = new PlayerSleepInBedEvent(player, pos);
MinecraftForge.EVENT_BUS.post(event);
return event.getResultStatus();
}
public static void onPlayerWakeup(PlayerEntity player, boolean wakeImmediately, boolean updateWorldFlag)
{
MinecraftForge.EVENT_BUS.post(new PlayerWakeUpEvent(player, wakeImmediately, updateWorldFlag));
}
2019-05-23 23:02:15 +00:00
public static void onPlayerFall(PlayerEntity player, float distance, float multiplier)
{
MinecraftForge.EVENT_BUS.post(new PlayerFlyableFallEvent(player, distance, multiplier));
}
public static boolean onPlayerSpawnSet(PlayerEntity player, RegistryKey<World> world, BlockPos pos, boolean forced)
{
return MinecraftForge.EVENT_BUS.post(new PlayerSetSpawnEvent(player, world, pos, forced));
2015-10-10 22:39:27 +00:00
}
2019-05-23 23:02:15 +00:00
public static void onPlayerClone(PlayerEntity player, PlayerEntity 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<Entity> 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<Entity> 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.isImmuneToExplosions() || dist > 1.0F) itr.remove();
}
*/
MinecraftForge.EVENT_BUS.post(new ExplosionEvent.Detonate(world, explosion, list));
}
2014-12-07 09:52:29 +00:00
2020-06-24 00:56:24 +00:00
public static boolean onCreateWorldSpawn(World world, IServerWorldInfo settings)
2014-12-07 09:52:29 +00:00
{
return MinecraftForge.EVENT_BUS.post(new WorldEvent.CreateSpawnPosition(world, settings));
}
2019-05-23 23:02:15 +00:00
public static float onLivingHeal(LivingEntity entity, float amount)
{
LivingHealEvent event = new LivingHealEvent(entity, amount);
return (MinecraftForge.EVENT_BUS.post(event) ? 0 : event.getAmount());
}
2016-11-13 22:09:54 +00:00
public static boolean onPotionAttemptBrew(NonNullList<ItemStack> stacks)
{
NonNullList<ItemStack> tmp = NonNullList.withSize(stacks.size(), ItemStack.EMPTY);
2016-11-13 22:09:54 +00:00
for (int x = 0; x < tmp.size(); x++)
tmp.set(x, stacks.get(x).copy());
PotionBrewEvent.Pre event = new PotionBrewEvent.Pre(tmp);
if (MinecraftForge.EVENT_BUS.post(event))
{
boolean changed = false;
2016-11-13 22:09:54 +00:00
for (int x = 0; x < stacks.size(); x++)
{
2016-11-13 22:09:54 +00:00
changed |= ItemStack.areItemStacksEqual(tmp.get(x), stacks.get(x));
stacks.set(x, event.getItem(x));
}
if (changed)
onPotionBrewed(stacks);
return true;
}
return false;
}
2016-11-13 22:09:54 +00:00
public static void onPotionBrewed(NonNullList<ItemStack> brewingItemStacks)
{
MinecraftForge.EVENT_BUS.post(new PotionBrewEvent.Post(brewingItemStacks));
}
2019-05-23 23:02:15 +00:00
public static void onPlayerBrewedPotion(PlayerEntity player, ItemStack stack)
2016-08-13 20:38:45 +00:00
{
MinecraftForge.EVENT_BUS.post(new PlayerBrewedPotionEvent(player, stack));
}
@OnlyIn(Dist.CLIENT)
public static boolean renderFireOverlay(PlayerEntity player, MatrixStack mat)
{
return renderBlockOverlay(player, mat, OverlayType.FIRE, Blocks.FIRE.getDefaultState(), player.getPosition());
}
@OnlyIn(Dist.CLIENT)
public static boolean renderWaterOverlay(PlayerEntity player, MatrixStack mat)
{
return renderBlockOverlay(player, mat, OverlayType.WATER, Blocks.WATER.getDefaultState(), player.getPosition());
}
@OnlyIn(Dist.CLIENT)
public static boolean renderBlockOverlay(PlayerEntity player, MatrixStack mat, OverlayType type, BlockState block, BlockPos pos)
{
return MinecraftForge.EVENT_BUS.post(new RenderBlockOverlayEvent(player, mat, type, block, pos));
}
@Nullable
public static <T extends ICapabilityProvider> CapabilityDispatcher gatherCapabilities(Class<? extends T> type, T provider)
{
return gatherCapabilities(type, provider, null);
}
@SuppressWarnings("unchecked")
2017-10-03 03:24:11 +00:00
@Nullable
public static <T extends ICapabilityProvider> CapabilityDispatcher gatherCapabilities(Class<? extends T> type, T provider, @Nullable ICapabilityProvider parent)
2017-10-03 03:24:11 +00:00
{
return gatherCapabilities(new AttachCapabilitiesEvent<T>((Class<T>) type, provider), parent);
2017-10-03 03:24:11 +00:00
}
@Nullable
private static CapabilityDispatcher gatherCapabilities(AttachCapabilitiesEvent<?> event, @Nullable ICapabilityProvider parent)
{
MinecraftForge.EVENT_BUS.post(event);
return event.getCapabilities().size() > 0 || parent != null ? new CapabilityDispatcher(event.getCapabilities(), event.getListeners(), parent) : null;
}
2016-01-09 21:39:12 +00:00
2019-05-23 23:02:15 +00:00
public static boolean fireSleepingLocationCheck(LivingEntity player, BlockPos sleepingLocation)
2016-01-09 21:39:12 +00:00
{
SleepingLocationCheckEvent evt = new SleepingLocationCheckEvent(player, sleepingLocation);
MinecraftForge.EVENT_BUS.post(evt);
Result canContinueSleep = evt.getResult();
if (canContinueSleep == Result.DEFAULT)
2016-03-05 00:40:34 +00:00
{
return player.getBedPosition().map(pos-> {
2019-05-23 23:02:15 +00:00
BlockState state = player.world.getBlockState(pos);
return state.getBlock().isBed(state, player.world, pos, player);
}).orElse(false);
2016-03-05 00:40:34 +00:00
}
2016-01-09 21:39:12 +00:00
else
return canContinueSleep == Result.ALLOW;
}
2019-05-23 23:02:15 +00:00
public static boolean fireSleepingTimeCheck(PlayerEntity player, Optional<BlockPos> sleepingLocation)
{
SleepingTimeCheckEvent evt = new SleepingTimeCheckEvent(player, sleepingLocation);
MinecraftForge.EVENT_BUS.post(evt);
Result canContinueSleep = evt.getResult();
if (canContinueSleep == Result.DEFAULT)
return !player.world.isDaytime();
else
return canContinueSleep == Result.ALLOW;
}
2019-05-23 23:02:15 +00:00
public static ActionResult<ItemStack> onArrowNock(ItemStack item, World world, PlayerEntity player, Hand hand, boolean hasAmmo)
2016-03-02 07:38:31 +00:00
{
ArrowNockEvent event = new ArrowNockEvent(player, item, hand, world, hasAmmo);
if (MinecraftForge.EVENT_BUS.post(event))
2019-05-23 23:02:15 +00:00
return new ActionResult<ItemStack>(ActionResultType.FAIL, item);
2016-03-02 07:38:31 +00:00
return event.getAction();
}
2019-05-23 23:02:15 +00:00
public static int onArrowLoose(ItemStack stack, World world, PlayerEntity player, int charge, boolean hasAmmo)
2016-03-02 07:38:31 +00:00
{
ArrowLooseEvent event = new ArrowLooseEvent(player, stack, world, charge, hasAmmo);
if (MinecraftForge.EVENT_BUS.post(event))
return -1;
return event.getCharge();
}
public static boolean onProjectileImpact(Entity entity, RayTraceResult ray)
{
return MinecraftForge.EVENT_BUS.post(new ProjectileImpactEvent(entity, ray));
}
2019-05-23 23:02:15 +00:00
public static boolean onProjectileImpact(AbstractArrowEntity arrow, RayTraceResult ray)
{
return MinecraftForge.EVENT_BUS.post(new ProjectileImpactEvent.Arrow(arrow, ray));
}
2019-05-23 23:02:15 +00:00
public static boolean onProjectileImpact(DamagingProjectileEntity fireball, RayTraceResult ray)
{
return MinecraftForge.EVENT_BUS.post(new ProjectileImpactEvent.Fireball(fireball, ray));
}
2019-05-23 23:02:15 +00:00
public static boolean onProjectileImpact(ThrowableEntity throwable, RayTraceResult ray)
{
return MinecraftForge.EVENT_BUS.post(new ProjectileImpactEvent.Throwable(throwable, ray));
}
public static boolean onProjectileImpact(FireworkRocketEntity fireworkRocket, RayTraceResult ray)
{
return MinecraftForge.EVENT_BUS.post(new ProjectileImpactEvent.FireworkRocket(fireworkRocket, ray));
}
public static LootTable loadLootTable(ResourceLocation name, LootTable table, LootTableManager lootTableManager)
{
LootTableLoadEvent event = new LootTableLoadEvent(name, table, lootTableManager);
if (MinecraftForge.EVENT_BUS.post(event))
return LootTable.EMPTY_LOOT_TABLE;
return event.getTable();
}
public static boolean canCreateFluidSource(IWorldReader world, BlockPos pos, BlockState state, boolean def)
{
CreateFluidSourceEvent evt = new CreateFluidSourceEvent(world, pos, state);
MinecraftForge.EVENT_BUS.post(evt);
Result result = evt.getResult();
return result == Result.DEFAULT ? def : result == Result.ALLOW;
}
2020-08-13 07:13:48 +00:00
public static Optional<PortalSize> onTrySpawnPortal(IWorld world, BlockPos pos, Optional<PortalSize> size)
{
2020-08-13 07:13:48 +00:00
if (!size.isPresent()) return size;
2020-08-14 19:04:17 +00:00
return !MinecraftForge.EVENT_BUS.post(new BlockEvent.PortalSpawnEvent(world, pos, world.getBlockState(pos), size.get())) ? size : Optional.empty();
}
public static int onEnchantmentLevelSet(World world, BlockPos pos, int enchantRow, int power, ItemStack itemStack, int level)
{
net.minecraftforge.event.enchanting.EnchantmentLevelSetEvent e = new net.minecraftforge.event.enchanting.EnchantmentLevelSetEvent(world, pos, enchantRow, power, itemStack, level);
net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(e);
return e.getLevel();
}
2019-05-23 23:02:15 +00:00
public static boolean onEntityDestroyBlock(LivingEntity entity, BlockPos pos, BlockState state)
{
return !MinecraftForge.EVENT_BUS.post(new LivingDestroyBlockEvent(entity, pos, state));
}
public static boolean getMobGriefingEvent(World world, Entity entity)
{
EntityMobGriefingEvent event = new EntityMobGriefingEvent(entity);
MinecraftForge.EVENT_BUS.post(event);
Result result = event.getResult();
return result == Result.DEFAULT ? world.getGameRules().getBoolean(GameRules.MOB_GRIEFING) : result == Result.ALLOW;
}
public static boolean saplingGrowTree(IWorld world, Random rand, BlockPos pos)
{
SaplingGrowTreeEvent event = new SaplingGrowTreeEvent(world, rand, pos);
MinecraftForge.EVENT_BUS.post(event);
return event.getResult() != Result.DENY;
}
2019-05-23 23:02:15 +00:00
public static void fireChunkWatch(boolean watch, ServerPlayerEntity entity, ChunkPos chunkpos, ServerWorld world)
{
2019-05-23 23:02:15 +00:00
if (watch)
MinecraftForge.EVENT_BUS.post(new ChunkWatchEvent.Watch(entity, chunkpos, world));
else
MinecraftForge.EVENT_BUS.post(new ChunkWatchEvent.UnWatch(entity, chunkpos, world));
}
2019-08-02 21:12:21 +00:00
public static void fireChunkWatch(boolean wasLoaded, boolean load, ServerPlayerEntity entity, ChunkPos chunkpos, ServerWorld world)
{
if (wasLoaded != load)
fireChunkWatch(load, entity, chunkpos, world);
}
2019-08-02 21:12:21 +00:00
public static boolean onPistonMovePre(World world, BlockPos pos, Direction direction, boolean extending)
{
return MinecraftForge.EVENT_BUS.post(new PistonEvent.Pre(world, pos, direction, extending ? PistonEvent.PistonMoveType.EXTEND : PistonEvent.PistonMoveType.RETRACT));
}
public static boolean onPistonMovePost(World world, BlockPos pos, Direction direction, boolean extending)
{
return MinecraftForge.EVENT_BUS.post(new PistonEvent.Post(world, pos, direction, extending ? PistonEvent.PistonMoveType.EXTEND : PistonEvent.PistonMoveType.RETRACT));
}
public static long onSleepFinished(ServerWorld world, long newTime, long minTime)
{
SleepFinishedTimeEvent event = new SleepFinishedTimeEvent(world, newTime, minTime);
MinecraftForge.EVENT_BUS.post(event);
return event.getNewTime();
}
public static List<IFutureReloadListener> onResourceReload(DataPackRegistries dataPackRegistries)
{
AddReloadListenerEvent event = new AddReloadListenerEvent(dataPackRegistries);
MinecraftForge.EVENT_BUS.post(event);
return event.getListeners();
}
2020-08-13 07:13:48 +00:00
public static void onCommandRegister(CommandDispatcher<CommandSource> dispatcher, Commands.EnvironmentType environment)
{
RegisterCommandsEvent event = new RegisterCommandsEvent(dispatcher, environment);
MinecraftForge.EVENT_BUS.post(event);
}
public static net.minecraftforge.event.entity.EntityEvent.Size getEntitySizeForge(Entity player, Pose pose, EntitySize size, float eyeHeight)
{
EntityEvent.Size evt = new EntityEvent.Size(player, pose, size, eyeHeight);
MinecraftForge.EVENT_BUS.post(evt);
return evt;
}
public static boolean canLivingConvert(LivingEntity entity, EntityType<? extends LivingEntity> outcome, Consumer<Integer> timer)
{
return !MinecraftForge.EVENT_BUS.post(new LivingConversionEvent.Pre(entity, outcome, timer));
}
public static void onLivingConvert(LivingEntity entity, LivingEntity outcome)
{
MinecraftForge.EVENT_BUS.post(new LivingConversionEvent.Post(entity, outcome));
}
}