Create/src/main/java/com/simibubi/create/events/CommonEvents.java

163 lines
6.0 KiB
Java
Raw Normal View History

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;
2020-11-13 20:56:39 +01:00
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.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.fluid.IFluidState;
import net.minecraft.resources.IReloadableResourceManager;
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.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.FMLServerAboutToStartEvent;
import net.minecraftforge.fml.event.server.FMLServerStartingEvent;
import net.minecraftforge.fml.event.server.FMLServerStoppingEvent;
@EventBusSubscriber
2020-05-23 14:02:38 +02:00
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();
IFluidState fluidState = blockState.getFluidState();
BlockPos pos = event.getPos();
IWorld world = event.getWorld();
if (fluidState.isSource() && FluidHelper.isLava(fluidState.getFluid()))
return;
for (Direction direction : Iterate.directions) {
IFluidState 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.getCommandDispatcher());
}
@SubscribeEvent
public static void serverAboutToStart(FMLServerAboutToStartEvent event) {
IReloadableResourceManager resourceManager = event.getServer()
.getResourceManager();
resourceManager.addReloadListener(RecipeFinder.LISTENER);
resourceManager.addReloadListener(PotionMixingRecipeManager.LISTENER);
2020-11-13 20:56:39 +01:00
resourceManager.addReloadListener(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<Entity> event) {
CapabilityMinecartController.attach(event);
}
@SubscribeEvent
public static void startTracking(PlayerEvent.StartTracking event) {
CapabilityMinecartController.startTracking(event);
}
}