NaturesAura/src/main/java/de/ellpeck/naturesaura/events/CommonEvents.java

164 lines
7.3 KiB
Java
Raw Normal View History

package de.ellpeck.naturesaura.events;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ListMultimap;
import de.ellpeck.naturesaura.Helper;
2020-09-22 15:49:06 +02:00
import de.ellpeck.naturesaura.ModConfig;
import de.ellpeck.naturesaura.NaturesAura;
2018-11-12 22:04:40 +01:00
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk;
2021-12-04 15:40:09 +01:00
import de.ellpeck.naturesaura.api.misc.ILevelData;
import de.ellpeck.naturesaura.chunk.AuraChunk;
import de.ellpeck.naturesaura.chunk.AuraChunkProvider;
2020-02-26 20:01:57 +01:00
import de.ellpeck.naturesaura.commands.CommandAura;
2020-09-22 15:49:06 +02:00
import de.ellpeck.naturesaura.gen.ModFeatures;
2021-12-04 15:40:09 +01:00
import de.ellpeck.naturesaura.misc.LevelData;
2020-01-22 23:21:52 +01:00
import de.ellpeck.naturesaura.packet.PacketHandler;
2021-12-15 16:24:53 +01:00
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ChunkHolder;
import net.minecraft.server.level.ChunkMap;
import net.minecraft.server.level.ServerChunkCache;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.chunk.LevelChunk;
import net.minecraftforge.event.AttachCapabilitiesEvent;
2020-01-21 21:04:44 +01:00
import net.minecraftforge.event.TickEvent;
2020-03-14 03:10:56 +01:00
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
2021-12-15 16:24:53 +01:00
import net.minecraftforge.event.server.ServerStartingEvent;
import net.minecraftforge.event.world.BiomeLoadingEvent;
import net.minecraftforge.event.world.ChunkEvent;
import net.minecraftforge.event.world.ChunkWatchEvent;
2019-10-20 22:30:49 +02:00
import net.minecraftforge.eventbus.api.SubscribeEvent;
2021-12-15 16:24:53 +01:00
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
2020-01-22 23:21:52 +01:00
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.UUID;
2021-12-15 16:24:53 +01:00
import static net.minecraft.world.level.levelgen.GenerationStep.Decoration;
public class CommonEvents {
2021-12-19 16:51:20 +01:00
private static final Method GET_LOADED_CHUNKS_METHOD = ObfuscationReflectionHelper.findMethod(ChunkMap.class, "m_140416_");
private static final ListMultimap<UUID, ChunkPos> PENDING_AURA_CHUNKS = ArrayListMultimap.create();
2020-01-22 23:21:52 +01:00
2020-09-22 15:49:06 +02:00
@SubscribeEvent
public void onBiomeLoad(BiomeLoadingEvent event) {
if (ModConfig.instance.auraBlooms.get()) {
2021-12-19 16:51:20 +01:00
event.getGeneration().addFeature(Decoration.VEGETAL_DECORATION, ModFeatures.Placed.AURA_BLOOM);
2020-10-19 03:05:13 +02:00
switch (event.getCategory()) {
2021-12-19 16:51:20 +01:00
case DESERT -> event.getGeneration().addFeature(Decoration.VEGETAL_DECORATION, ModFeatures.Placed.AURA_CACTUS);
2021-12-15 16:24:53 +01:00
case NETHER -> {
2021-12-19 16:51:20 +01:00
event.getGeneration().addFeature(Decoration.VEGETAL_DECORATION, ModFeatures.Placed.CRIMSON_AURA_MUSHROOM);
event.getGeneration().addFeature(Decoration.VEGETAL_DECORATION, ModFeatures.Placed.WARPED_AURA_MUSHROOM);
2021-12-15 16:24:53 +01:00
}
2021-12-19 16:51:20 +01:00
case MUSHROOM -> event.getGeneration().addFeature(Decoration.VEGETAL_DECORATION, ModFeatures.Placed.AURA_MUSHROOM);
2020-10-19 03:05:13 +02:00
}
2020-09-22 15:49:06 +02:00
}
}
@SubscribeEvent
2021-12-15 16:24:53 +01:00
public void onChunkCapsAttach(AttachCapabilitiesEvent<LevelChunk> event) {
2021-12-15 16:30:22 +01:00
var chunk = event.getObject();
event.addCapability(new ResourceLocation(NaturesAura.MOD_ID, "aura"), new AuraChunkProvider(chunk));
}
2019-02-17 22:51:05 +01:00
@SubscribeEvent
2021-12-04 15:40:09 +01:00
public void onLevelCapsAttach(AttachCapabilitiesEvent<Level> event) {
event.addCapability(new ResourceLocation(NaturesAura.MOD_ID, "data"), new LevelData());
2019-02-17 22:51:05 +01:00
}
2021-01-30 16:50:02 +01:00
@SubscribeEvent
public void onChunkUnload(ChunkEvent.Unload event) {
2021-12-15 16:30:22 +01:00
var iChunk = event.getChunk();
2021-12-15 16:24:53 +01:00
if (iChunk instanceof LevelChunk chunk) {
2021-12-23 13:27:52 +01:00
var auraChunk = chunk.getCapability(NaturesAuraAPI.CAP_AURA_CHUNK).orElse(null);
2021-01-30 16:50:02 +01:00
if (auraChunk instanceof AuraChunk) {
2021-12-15 16:30:22 +01:00
var data = (LevelData) ILevelData.getLevelData(chunk.getLevel());
2021-12-15 16:24:53 +01:00
data.auraChunksWithSpots.remove(chunk.getPos().toLong());
2021-01-30 16:50:02 +01:00
}
}
}
2020-03-14 03:10:56 +01:00
@SubscribeEvent
public void onItemUse(PlayerInteractEvent.RightClickBlock event) {
2021-12-15 16:30:22 +01:00
var player = event.getPlayer();
2021-12-04 15:40:09 +01:00
if (player.level.isClientSide)
2020-03-14 03:10:56 +01:00
return;
2021-12-15 16:30:22 +01:00
var held = event.getItemStack();
2020-03-14 03:10:56 +01:00
if (!held.isEmpty() && held.getItem().getRegistryName().getPath().contains("chisel")) {
2021-12-15 16:30:22 +01:00
var state = player.level.getBlockState(event.getPos());
2020-03-14 13:54:31 +01:00
if (NaturesAuraAPI.BOTANIST_PICKAXE_CONVERSIONS.containsKey(state)) {
2021-12-15 16:30:22 +01:00
var data = (LevelData) ILevelData.getLevelData(player.level);
2020-03-14 13:54:31 +01:00
data.addMossStone(event.getPos());
}
2020-03-14 03:10:56 +01:00
}
}
@SubscribeEvent
2021-12-15 16:24:53 +01:00
@SuppressWarnings("unchecked")
public void onLevelTick(TickEvent.WorldTickEvent event) {
if (!event.world.isClientSide && event.phase == TickEvent.Phase.END) {
if (event.world.getGameTime() % 20 == 0) {
event.world.getProfiler().push(NaturesAura.MOD_ID + ":onLevelTick");
2020-01-22 23:21:52 +01:00
try {
2021-12-15 16:30:22 +01:00
var manager = ((ServerChunkCache) event.world.getChunkSource()).chunkMap;
var chunks = (Iterable<ChunkHolder>) GET_LOADED_CHUNKS_METHOD.invoke(manager);
for (var holder : chunks) {
var chunk = holder.getTickingChunk();
if (chunk == null)
2020-01-22 23:21:52 +01:00
continue;
2021-12-23 13:27:52 +01:00
var auraChunk = (AuraChunk) chunk.getCapability(NaturesAuraAPI.CAP_AURA_CHUNK, null).orElse(null);
2020-01-22 23:21:52 +01:00
if (auraChunk != null)
auraChunk.update();
}
} catch (IllegalAccessException | InvocationTargetException e) {
NaturesAura.LOGGER.fatal(e);
}
2021-12-15 16:24:53 +01:00
event.world.getProfiler().pop();
}
}
}
@SubscribeEvent
public void onPlayerTick(TickEvent.PlayerTickEvent event) {
2021-12-04 15:40:09 +01:00
if (!event.player.level.isClientSide && event.phase == TickEvent.Phase.END) {
if (event.player.level.getGameTime() % 10 == 0) {
2021-12-15 16:30:22 +01:00
var pending = PENDING_AURA_CHUNKS.get(event.player.getUUID());
pending.removeIf(p -> this.handleChunkWatchDeferred(event.player, p));
}
2021-12-04 15:40:09 +01:00
if (event.player.level.getGameTime() % 200 != 0)
return;
2021-12-15 16:30:22 +01:00
var aura = IAuraChunk.triangulateAuraInArea(event.player.level, event.player.blockPosition(), 25);
if (aura <= 0)
Helper.addAdvancement(event.player, new ResourceLocation(NaturesAura.MOD_ID, "negative_imbalance"), "triggered_in_code");
else if (aura >= 1500000)
Helper.addAdvancement(event.player, new ResourceLocation(NaturesAura.MOD_ID, "positive_imbalance"), "triggered_in_code");
}
}
@SubscribeEvent
public void onChunkWatch(ChunkWatchEvent.Watch event) {
2021-12-15 16:24:53 +01:00
PENDING_AURA_CHUNKS.put(event.getPlayer().getUUID(), event.getPos());
}
2021-12-04 15:40:09 +01:00
private boolean handleChunkWatchDeferred(Player player, ChunkPos pos) {
2021-12-15 16:30:22 +01:00
var chunk = Helper.getLoadedChunk(player.level, pos.x, pos.z);
2021-12-29 22:00:52 +01:00
if (!(chunk instanceof LevelChunk levelChunk))
return false;
2021-12-29 22:00:52 +01:00
var auraChunk = (AuraChunk) levelChunk.getCapability(NaturesAuraAPI.CAP_AURA_CHUNK, null).orElse(null);
if (auraChunk == null)
return false;
PacketHandler.sendTo(player, auraChunk.makePacket());
return true;
}
2020-02-26 20:01:57 +01:00
@SubscribeEvent
2021-12-15 16:24:53 +01:00
public void onServerStarting(ServerStartingEvent event) {
CommandAura.register(event.getServer().getCommands().getDispatcher());
2020-02-26 20:01:57 +01:00
}
}