package com.simibubi.create.events; import com.simibubi.create.AllFluids; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionHandler; import com.simibubi.create.content.contraptions.components.structureMovement.train.CouplingPhysics; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.CapabilityMinecartController; import com.simibubi.create.content.contraptions.fluids.recipe.FluidTransferRecipes; import com.simibubi.create.content.contraptions.fluids.recipe.PotionMixingRecipeManager; import com.simibubi.create.content.contraptions.wrench.WrenchItem; import com.simibubi.create.content.curiosities.zapper.ZapperInteractionHandler; import com.simibubi.create.content.curiosities.zapper.ZapperItem; import com.simibubi.create.content.schematics.ServerSchematicLoader; import com.simibubi.create.foundation.command.AllCommands; import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.ServerSpeedProvider; import com.simibubi.create.foundation.utility.WorldAttached; import com.simibubi.create.foundation.utility.recipe.RecipeFinder; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.fluid.FluidState; import net.minecraft.item.ItemStack; import net.minecraft.tags.FluidTags; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IWorld; import net.minecraft.world.World; import net.minecraftforge.event.AddReloadListenerEvent; import net.minecraftforge.event.AttachCapabilitiesEvent; import net.minecraftforge.event.TickEvent.Phase; import net.minecraftforge.event.TickEvent.ServerTickEvent; import net.minecraftforge.event.TickEvent.WorldTickEvent; import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; import net.minecraftforge.event.entity.player.AttackEntityEvent; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.world.BlockEvent.FluidPlaceBlockEvent; import net.minecraftforge.event.world.ChunkEvent; import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.event.server.FMLServerStartingEvent; import net.minecraftforge.fml.event.server.FMLServerStoppingEvent; @EventBusSubscriber public class CommonEvents { @SubscribeEvent public static void onServerTick(ServerTickEvent event) { if (event.phase == Phase.START) return; if (Create.schematicReceiver == null) Create.schematicReceiver = new ServerSchematicLoader(); Create.schematicReceiver.tick(); Create.lagger.tick(); ServerSpeedProvider.serverTick(); } @SubscribeEvent public static void onChunkUnloaded(ChunkEvent.Unload event) { CapabilityMinecartController.onChunkUnloaded(event); } @SubscribeEvent public static void whenFluidsMeet(FluidPlaceBlockEvent event) { BlockState blockState = event.getOriginalState(); FluidState fluidState = blockState.getFluidState(); BlockPos pos = event.getPos(); IWorld world = event.getWorld(); if (fluidState.isSource() && FluidHelper.isLava(fluidState.getFluid())) return; for (Direction direction : Iterate.directions) { FluidState metFluidState = fluidState.isSource() ? fluidState : world.getFluidState(pos.offset(direction)); if (!metFluidState.isTagged(FluidTags.WATER)) continue; BlockState lavaInteraction = AllFluids.getLavaInteraction(metFluidState); if (lavaInteraction == null) continue; event.setNewState(lavaInteraction); break; } } @SubscribeEvent public static void onWorldTick(WorldTickEvent event) { if (event.phase == Phase.START) return; World world = event.world; ContraptionHandler.tick(world); CapabilityMinecartController.tick(world); CouplingPhysics.tick(world); } @SubscribeEvent public static void onUpdateLivingEntity(LivingUpdateEvent event) { LivingEntity entityLiving = event.getEntityLiving(); World world = entityLiving.world; if (world == null) return; ContraptionHandler.entitiesWhoJustDismountedGetSentToTheRightLocation(entityLiving, world); } @SubscribeEvent public static void onEntityAdded(EntityJoinWorldEvent event) { Entity entity = event.getEntity(); World world = event.getWorld(); ContraptionHandler.addSpawnedContraptionsToCollisionList(entity, world); } @SubscribeEvent public static void onEntityAttackedByPlayer(AttackEntityEvent event) { WrenchItem.wrenchInstaKillsMinecarts(event); } @SubscribeEvent public static void serverStarted(FMLServerStartingEvent event) { AllCommands.register(event.getServer().getCommandManager().getDispatcher()); } @SubscribeEvent public static void registerReloadListeners(AddReloadListenerEvent event) { event.addListener(RecipeFinder.LISTENER); event.addListener(PotionMixingRecipeManager.LISTENER); event.addListener(FluidTransferRecipes.LISTENER); } @SubscribeEvent public static void serverStopped(FMLServerStoppingEvent event) { Create.schematicReceiver.shutdown(); } @SubscribeEvent public static void onLoadWorld(WorldEvent.Load event) { IWorld world = event.getWorld(); Create.redstoneLinkNetworkHandler.onLoadWorld(world); Create.torquePropagator.onLoadWorld(world); } @SubscribeEvent public static void onUnloadWorld(WorldEvent.Unload event) { IWorld world = event.getWorld(); Create.redstoneLinkNetworkHandler.onUnloadWorld(world); Create.torquePropagator.onUnloadWorld(world); WorldAttached.invalidateWorld(world); } @SubscribeEvent public static void attachCapabilities(AttachCapabilitiesEvent event) { CapabilityMinecartController.attach(event); } @SubscribeEvent public static void startTracking(PlayerEvent.StartTracking event) { CapabilityMinecartController.startTracking(event); } public static void leftClickEmpty(ServerPlayerEntity player) { ItemStack stack = player.getHeldItemMainhand(); if (stack.getItem() instanceof ZapperItem) { ZapperInteractionHandler.trySelect(stack, player); } } }