CreateMod/src/main/java/com/simibubi/create/events/CommonEvents.java
2023-04-30 20:06:00 +01:00

255 lines
9.6 KiB
Java

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.interaction.controls.ControlsServerHandler;
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.wrench.WrenchItem;
import com.simibubi.create.content.curiosities.toolbox.ToolboxHandler;
import com.simibubi.create.content.curiosities.weapons.PotatoProjectileTypeManager;
import com.simibubi.create.content.curiosities.zapper.ZapperInteractionHandler;
import com.simibubi.create.content.curiosities.zapper.ZapperItem;
import com.simibubi.create.content.logistics.item.LinkedControllerServerHandler;
import com.simibubi.create.content.logistics.trains.entity.CarriageEntityHandler;
import com.simibubi.create.foundation.ModFilePackResources;
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 com.simibubi.create.foundation.worldgen.AllOreFeatureConfigEntries;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.packs.PackType;
import net.minecraft.server.packs.repository.Pack;
import net.minecraft.server.packs.repository.PackSource;
import net.minecraft.tags.FluidTags;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.FluidState;
import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent;
import net.minecraftforge.event.AddPackFindersEvent;
import net.minecraftforge.event.AddReloadListenerEvent;
import net.minecraftforge.event.AttachCapabilitiesEvent;
import net.minecraftforge.event.OnDatapackSyncEvent;
import net.minecraftforge.event.RegisterCommandsEvent;
import net.minecraftforge.event.TickEvent.Phase;
import net.minecraftforge.event.TickEvent.ServerTickEvent;
import net.minecraftforge.event.TickEvent.WorldTickEvent;
import net.minecraftforge.event.entity.EntityEvent;
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.entity.player.PlayerEvent.PlayerLoggedInEvent;
import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedOutEvent;
import net.minecraftforge.event.server.ServerStoppingEvent;
import net.minecraftforge.event.world.BiomeLoadingEvent;
import net.minecraftforge.event.world.BlockEvent.FluidPlaceBlockEvent;
import net.minecraftforge.event.world.ChunkEvent;
import net.minecraftforge.event.world.WorldEvent;
import net.minecraftforge.eventbus.api.EventPriority;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.LogicalSide;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import net.minecraftforge.forgespi.language.IModFileInfo;
import net.minecraftforge.forgespi.locating.IModFile;
import net.minecraftforge.registries.NewRegistryEvent;
@EventBusSubscriber
public class CommonEvents {
@SubscribeEvent
public static void onServerTick(ServerTickEvent event) {
if (event.phase == Phase.START)
return;
Create.SCHEMATIC_RECEIVER.tick();
Create.LAGGER.tick();
ServerSpeedProvider.serverTick();
Create.RAILWAYS.sync.serverTick();
}
@SubscribeEvent
public static void onChunkUnloaded(ChunkEvent.Unload event) {
CapabilityMinecartController.onChunkUnloaded(event);
}
@SubscribeEvent
public static void playerLoggedIn(PlayerLoggedInEvent event) {
Player player = event.getPlayer();
ToolboxHandler.playerLogin(player);
Create.RAILWAYS.playerLogin(player);
}
@SubscribeEvent
public static void playerLoggedOut(PlayerLoggedOutEvent event) {
Player player = event.getPlayer();
Create.RAILWAYS.playerLogout(player);
}
@SubscribeEvent
public static void whenFluidsMeet(FluidPlaceBlockEvent event) {
BlockState blockState = event.getOriginalState();
FluidState fluidState = blockState.getFluidState();
BlockPos pos = event.getPos();
LevelAccessor world = event.getWorld();
if (fluidState.isSource() && FluidHelper.isLava(fluidState.getType()))
return;
for (Direction direction : Iterate.directions) {
FluidState metFluidState =
fluidState.isSource() ? fluidState : world.getFluidState(pos.relative(direction));
if (!metFluidState.is(FluidTags.WATER))
continue;
BlockState lavaInteraction = AllFluids.getLavaInteraction(metFluidState);
if (lavaInteraction == null)
continue;
event.setNewState(lavaInteraction);
break;
}
}
@SubscribeEvent
public static void onServerWorldTick(WorldTickEvent event) {
if (event.phase == Phase.START)
return;
if (event.side == LogicalSide.CLIENT)
return;
Level world = event.world;
ContraptionHandler.tick(world);
CapabilityMinecartController.tick(world);
CouplingPhysics.tick(world);
LinkedControllerServerHandler.tick(world);
ControlsServerHandler.tick(world);
Create.RAILWAYS.tick(world);
}
@SubscribeEvent
public static void onUpdateLivingEntity(LivingUpdateEvent event) {
LivingEntity entityLiving = event.getEntityLiving();
Level world = entityLiving.level;
if (world == null)
return;
ContraptionHandler.entitiesWhoJustDismountedGetSentToTheRightLocation(entityLiving, world);
ToolboxHandler.entityTick(entityLiving, world);
}
@SubscribeEvent
public static void onEntityAdded(EntityJoinWorldEvent event) {
Entity entity = event.getEntity();
Level world = event.getWorld();
ContraptionHandler.addSpawnedContraptionsToCollisionList(entity, world);
}
@SubscribeEvent
public static void onEntityAttackedByPlayer(AttackEntityEvent event) {
WrenchItem.wrenchInstaKillsMinecarts(event);
}
@SubscribeEvent
public static void registerCommands(RegisterCommandsEvent event) {
AllCommands.register(event.getDispatcher());
}
@SubscribeEvent
public static void onEntityEnterSection(EntityEvent.EnteringSection event) {
CarriageEntityHandler.onEntityEnterSection(event);
}
@SubscribeEvent
public static void addReloadListeners(AddReloadListenerEvent event) {
event.addListener(RecipeFinder.LISTENER);
event.addListener(PotatoProjectileTypeManager.ReloadListener.INSTANCE);
}
@SubscribeEvent
public static void onDatapackSync(OnDatapackSyncEvent event) {
ServerPlayer player = event.getPlayer();
if (player != null) {
PotatoProjectileTypeManager.syncTo(player);
} else {
PotatoProjectileTypeManager.syncToAll();
}
}
@SubscribeEvent
public static void serverStopping(ServerStoppingEvent event) {
Create.SCHEMATIC_RECEIVER.shutdown();
}
@SubscribeEvent
public static void onLoadWorld(WorldEvent.Load event) {
LevelAccessor world = event.getWorld();
Create.REDSTONE_LINK_NETWORK_HANDLER.onLoadWorld(world);
Create.TORQUE_PROPAGATOR.onLoadWorld(world);
Create.RAILWAYS.levelLoaded(world);
}
@SubscribeEvent
public static void onUnloadWorld(WorldEvent.Unload event) {
LevelAccessor world = event.getWorld();
Create.REDSTONE_LINK_NETWORK_HANDLER.onUnloadWorld(world);
Create.TORQUE_PROPAGATOR.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);
}
@SubscribeEvent(priority = EventPriority.HIGH)
public static void onBiomeLoad(BiomeLoadingEvent event) {
AllOreFeatureConfigEntries.modifyBiomes(event);
}
public static void leftClickEmpty(ServerPlayer player) {
ItemStack stack = player.getMainHandItem();
if (stack.getItem() instanceof ZapperItem) {
ZapperInteractionHandler.trySelect(stack, player);
}
}
@EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD)
public static class ModBusEvents {
@SubscribeEvent
public static void registerCapabilities(RegisterCapabilitiesEvent event) {
event.register(CapabilityMinecartController.class);
}
@SubscribeEvent
public static void addPackFinders(AddPackFindersEvent event) {
if (event.getPackType() == PackType.CLIENT_RESOURCES) {
IModFileInfo modFileInfo = ModList.get().getModFileById(Create.ID);
if (modFileInfo == null) {
Create.LOGGER.error("Could not find Create mod file info; built-in resource packs will be missing!");
return;
}
IModFile modFile = modFileInfo.getFile();
event.addRepositorySource((consumer, constructor) -> {
consumer.accept(Pack.create(Create.asResource("legacy_copper").toString(), false, () -> new ModFilePackResources("Create Legacy Copper", modFile, "resourcepacks/legacy_copper"), constructor, Pack.Position.TOP, PackSource.DEFAULT));
});
}
}
}
}