package tschipp.carryon.events; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MobSpawnType; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.util.BlockSnapshot; import net.minecraftforge.event.AddReloadListenerEvent; import net.minecraftforge.event.OnDatapackSyncEvent; import net.minecraftforge.event.RegisterCommandsEvent; import net.minecraftforge.event.TagsUpdatedEvent; import net.minecraftforge.event.TickEvent.Phase; import net.minecraftforge.event.TickEvent.ServerTickEvent; import net.minecraftforge.event.entity.living.LivingAttackEvent; import net.minecraftforge.event.entity.living.LivingSpawnEvent.CheckSpawn; import net.minecraftforge.event.entity.player.AttackEntityEvent; import net.minecraftforge.event.entity.player.PlayerEvent.BreakSpeed; import net.minecraftforge.event.entity.player.PlayerEvent.Clone; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.level.BlockEvent; import net.minecraftforge.event.level.BlockEvent.BreakEvent; import net.minecraftforge.event.level.BlockEvent.EntityPlaceEvent; import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.eventbus.api.Event.Result; import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import tschipp.carryon.CarryOnCommon; import tschipp.carryon.Constants; import tschipp.carryon.common.carry.CarryOnData; import tschipp.carryon.common.carry.CarryOnData.CarryType; import tschipp.carryon.common.carry.CarryOnDataManager; import tschipp.carryon.common.carry.PickupHandler; import tschipp.carryon.common.carry.PlacementHandler; import tschipp.carryon.common.scripting.ScriptReloadListener; import tschipp.carryon.config.ConfigLoader; @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE, modid = Constants.MOD_ID) public class CommonEvents { @SubscribeEvent(priority = EventPriority.HIGH) public static void onBlockClick(PlayerInteractEvent.RightClickBlock event) { if (event.isCanceled()) return; Player player = event.getEntity(); Level level = event.getLevel(); BlockPos pos = event.getPos(); if (level.isClientSide) return; boolean success = false; CarryOnData carry = CarryOnDataManager.getCarryData(player); if (!carry.isCarrying()) { if (PickupHandler.tryPickUpBlock((ServerPlayer) player, pos, level, (pState, pPos) -> { BlockEvent.BreakEvent breakEvent = new BreakEvent(level, pPos, pState, player); MinecraftForge.EVENT_BUS.post(breakEvent); return !breakEvent.isCanceled(); })) { success = true; } } else { if (carry.isCarrying(CarryType.BLOCK)) { PlacementHandler.tryPlaceBlock((ServerPlayer) player, pos, event.getFace(), (pos2, state) -> { BlockSnapshot snapshot = BlockSnapshot.create(level.dimension(), level, pos2); EntityPlaceEvent event1 = new EntityPlaceEvent(snapshot, level.getBlockState(pos), player); MinecraftForge.EVENT_BUS.post(event1); return !event1.isCanceled(); }); } else { PlacementHandler.tryPlaceEntity((ServerPlayer) player, pos, event.getFace(), (pPos, toPlace) -> { if (toPlace instanceof Mob mob) { CheckSpawn checkSpawn = new CheckSpawn(mob, level, pPos.x, pPos.y, pPos.z, null, MobSpawnType.EVENT); MinecraftForge.EVENT_BUS.post(checkSpawn); return event.getResult() != Result.DENY; } return true; }); } success = true; } if (success) { event.setUseBlock(Event.Result.DENY); event.setUseItem(Event.Result.DENY); event.setCancellationResult(InteractionResult.SUCCESS); event.setCanceled(true); } } @SubscribeEvent(priority = EventPriority.HIGH) public static void onEntityRightClick(PlayerInteractEvent.EntityInteract event) { if (event.isCanceled()) return; Player player = event.getEntity(); Level level = event.getLevel(); Entity target = event.getTarget(); if (level.isClientSide) return; CarryOnData carry = CarryOnDataManager.getCarryData(player); if (!carry.isCarrying()) { if (PickupHandler.tryPickupEntity((ServerPlayer) player, target, (toPickup) -> { EntityPickupEvent pickupEvent = new EntityPickupEvent((ServerPlayer) player, toPickup); MinecraftForge.EVENT_BUS.post(pickupEvent); return !pickupEvent.isCanceled(); })) { event.setCancellationResult(InteractionResult.SUCCESS); event.setCanceled(true); return; } } else if (carry.isCarrying(CarryType.ENTITY) || carry.isCarrying(CarryType.PLAYER)) { PlacementHandler.tryStackEntity((ServerPlayer) player, target); } } @SubscribeEvent public static void onRegisterCommands(RegisterCommandsEvent event) { CarryOnCommon.registerCommands(event.getDispatcher()); } @SubscribeEvent public static void onDatapackRegister(AddReloadListenerEvent event) { event.addListener(new ScriptReloadListener()); } @SubscribeEvent public static void onDatapackSync(OnDatapackSyncEvent event) { ServerPlayer player = event.getPlayer(); if (player == null) { for (ServerPlayer p : event.getPlayerList().getPlayers()) ScriptReloadListener.syncScriptsWithClient(p); } else ScriptReloadListener.syncScriptsWithClient(player); } @SubscribeEvent public static void onTagsUpdate(TagsUpdatedEvent event) { ConfigLoader.onConfigLoaded(); } @SubscribeEvent public static void onServerTick(ServerTickEvent event) { if (event.phase == Phase.END) for (ServerPlayer player : event.getServer().getPlayerList().getPlayers()) CarryOnCommon.onCarryTick(player); } @SubscribeEvent public static void onClone(Clone event) { if (!event.getOriginal().level.isClientSide) PlacementHandler.placeCarriedOnDeath((ServerPlayer) event.getOriginal(), (ServerPlayer) event.getEntity(), event.isWasDeath()); } @SubscribeEvent public static void harvestSpeed(BreakSpeed event) { if (!CarryOnCommon.onTryBreakBlock(event.getEntity())) event.setNewSpeed(0); } @SubscribeEvent public static void attackEntity(AttackEntityEvent event) { if(!CarryOnCommon.onAttackedByPlayer(event.getEntity())) event.setCanceled(true); } @SubscribeEvent public static void onBreakBlock(BreakEvent event) { if (!CarryOnCommon.onTryBreakBlock(event.getPlayer())) { event.setCanceled(true); } } @SubscribeEvent public static void playerAttack(LivingAttackEvent event) { if(event.getEntity() instanceof Player player) CarryOnCommon.onPlayerAttacked(player); } }