2018-10-21 12:51:13 +02:00
|
|
|
package de.ellpeck.naturesaura.events;
|
|
|
|
|
2020-03-01 19:25:39 +01:00
|
|
|
import com.google.common.collect.ArrayListMultimap;
|
|
|
|
import com.google.common.collect.ListMultimap;
|
2018-12-20 21:43:19 +01:00
|
|
|
import de.ellpeck.naturesaura.Helper;
|
2018-10-21 12:51:13 +02:00
|
|
|
import de.ellpeck.naturesaura.NaturesAura;
|
2018-11-12 22:04:40 +01:00
|
|
|
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
|
2018-12-20 21:43:19 +01:00
|
|
|
import de.ellpeck.naturesaura.api.aura.chunk.IAuraChunk;
|
2021-12-04 15:40:09 +01:00
|
|
|
import de.ellpeck.naturesaura.api.misc.ILevelData;
|
2018-11-13 11:39:28 +01:00
|
|
|
import de.ellpeck.naturesaura.chunk.AuraChunk;
|
2020-02-26 20:01:57 +01:00
|
|
|
import de.ellpeck.naturesaura.commands.CommandAura;
|
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;
|
2024-03-10 15:54:58 +01:00
|
|
|
import net.minecraft.core.registries.BuiltInRegistries;
|
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.chunk.LevelChunk;
|
2024-02-03 14:56:07 +01:00
|
|
|
import net.neoforged.neoforge.event.TickEvent;
|
|
|
|
import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent;
|
|
|
|
import net.neoforged.neoforge.event.level.ChunkEvent;
|
|
|
|
import net.neoforged.neoforge.event.level.ChunkWatchEvent;
|
|
|
|
import net.neoforged.bus.api.SubscribeEvent;
|
|
|
|
import net.neoforged.fml.util.ObfuscationReflectionHelper;
|
|
|
|
import net.neoforged.neoforge.event.RegisterCommandsEvent;
|
2020-01-22 23:21:52 +01:00
|
|
|
|
|
|
|
import java.lang.reflect.InvocationTargetException;
|
|
|
|
import java.lang.reflect.Method;
|
2020-03-01 19:25:39 +01:00
|
|
|
import java.util.UUID;
|
2018-10-21 12:51:13 +02:00
|
|
|
|
|
|
|
public class CommonEvents {
|
|
|
|
|
2024-03-12 19:53:57 +01:00
|
|
|
private static final Method GET_LOADED_CHUNKS_METHOD = ObfuscationReflectionHelper.findMethod(ChunkMap.class, "getChunks");
|
2020-03-01 19:25:39 +01:00
|
|
|
private static final ListMultimap<UUID, ChunkPos> PENDING_AURA_CHUNKS = ArrayListMultimap.create();
|
2020-01-22 23:21:52 +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) {
|
2024-03-12 19:53:57 +01:00
|
|
|
var auraChunk = chunk.getData(NaturesAuraAPI.AURA_CHUNK_ATTACHMENT);
|
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) {
|
2022-08-01 16:14:37 +02:00
|
|
|
var player = event.getEntity();
|
2023-07-08 12:32:27 +02: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();
|
2024-03-10 15:54:58 +01:00
|
|
|
if (!held.isEmpty() && BuiltInRegistries.ITEM.getKey(held.getItem()).getPath().contains("chisel")) {
|
2023-07-08 12:32:27 +02:00
|
|
|
var state = player.level().getBlockState(event.getPos());
|
2020-03-14 13:54:31 +01:00
|
|
|
if (NaturesAuraAPI.BOTANIST_PICKAXE_CONVERSIONS.containsKey(state)) {
|
2023-07-08 12:32:27 +02: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
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-10-21 12:51:13 +02:00
|
|
|
@SubscribeEvent
|
2021-12-15 16:24:53 +01:00
|
|
|
@SuppressWarnings("unchecked")
|
2022-08-01 16:14:37 +02:00
|
|
|
public void onLevelTick(TickEvent.LevelTickEvent event) {
|
|
|
|
if (!event.level.isClientSide && event.phase == TickEvent.Phase.END) {
|
|
|
|
if (event.level.getGameTime() % 20 == 0) {
|
|
|
|
event.level.getProfiler().push(NaturesAura.MOD_ID + ":onLevelTick");
|
2020-01-22 23:21:52 +01:00
|
|
|
try {
|
2022-08-01 16:14:37 +02:00
|
|
|
var manager = ((ServerChunkCache) event.level.getChunkSource()).chunkMap;
|
2022-06-27 15:24:04 +02:00
|
|
|
var chunks = (Iterable<ChunkHolder>) CommonEvents.GET_LOADED_CHUNKS_METHOD.invoke(manager);
|
2021-12-15 16:30:22 +01:00
|
|
|
for (var holder : chunks) {
|
|
|
|
var chunk = holder.getTickingChunk();
|
2020-01-23 02:20:02 +01:00
|
|
|
if (chunk == null)
|
2020-01-22 23:21:52 +01:00
|
|
|
continue;
|
2024-03-12 19:53:57 +01:00
|
|
|
var auraChunk = (AuraChunk) chunk.getData(NaturesAuraAPI.AURA_CHUNK_ATTACHMENT);
|
2020-01-22 23:21:52 +01:00
|
|
|
if (auraChunk != null)
|
|
|
|
auraChunk.update();
|
|
|
|
}
|
|
|
|
} catch (IllegalAccessException | InvocationTargetException e) {
|
|
|
|
NaturesAura.LOGGER.fatal(e);
|
|
|
|
}
|
2022-08-01 16:14:37 +02:00
|
|
|
event.level.getProfiler().pop();
|
2018-10-21 12:51:13 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-10-21 13:12:03 +02:00
|
|
|
|
2018-12-20 21:43:19 +01:00
|
|
|
@SubscribeEvent
|
|
|
|
public void onPlayerTick(TickEvent.PlayerTickEvent event) {
|
2023-07-08 12:32:27 +02:00
|
|
|
if (!event.player.level().isClientSide && event.phase == TickEvent.Phase.END) {
|
|
|
|
if (event.player.level().getGameTime() % 10 == 0) {
|
2022-06-27 15:24:04 +02:00
|
|
|
var pending = CommonEvents.PENDING_AURA_CHUNKS.get(event.player.getUUID());
|
2020-03-01 19:25:39 +01:00
|
|
|
pending.removeIf(p -> this.handleChunkWatchDeferred(event.player, p));
|
|
|
|
}
|
|
|
|
|
2023-07-08 12:32:27 +02:00
|
|
|
if (event.player.level().getGameTime() % 200 != 0)
|
2018-12-20 21:43:19 +01:00
|
|
|
return;
|
|
|
|
|
2023-07-08 12:32:27 +02:00
|
|
|
var aura = IAuraChunk.triangulateAuraInArea(event.player.level(), event.player.blockPosition(), 25);
|
2018-12-20 21:43:19 +01:00
|
|
|
if (aura <= 0)
|
|
|
|
Helper.addAdvancement(event.player, new ResourceLocation(NaturesAura.MOD_ID, "negative_imbalance"), "triggered_in_code");
|
2019-02-03 22:05:56 +01:00
|
|
|
else if (aura >= 1500000)
|
2018-12-20 21:43:19 +01:00
|
|
|
Helper.addAdvancement(event.player, new ResourceLocation(NaturesAura.MOD_ID, "positive_imbalance"), "triggered_in_code");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-10-21 13:12:03 +02:00
|
|
|
@SubscribeEvent
|
|
|
|
public void onChunkWatch(ChunkWatchEvent.Watch event) {
|
2022-06-27 15:24:04 +02:00
|
|
|
CommonEvents.PENDING_AURA_CHUNKS.put(event.getPlayer().getUUID(), event.getPos());
|
2020-03-01 19:25:39 +01:00
|
|
|
}
|
|
|
|
|
2021-12-04 15:40:09 +01:00
|
|
|
private boolean handleChunkWatchDeferred(Player player, ChunkPos pos) {
|
2023-07-08 12:32:27 +02:00
|
|
|
var chunk = Helper.getLoadedChunk(player.level(), pos.x, pos.z);
|
2021-12-29 22:00:52 +01:00
|
|
|
if (!(chunk instanceof LevelChunk levelChunk))
|
2020-03-01 19:25:39 +01:00
|
|
|
return false;
|
2024-03-12 19:53:57 +01:00
|
|
|
var auraChunk = (AuraChunk) levelChunk.getData(NaturesAuraAPI.AURA_CHUNK_ATTACHMENT);
|
2020-03-01 19:25:39 +01:00
|
|
|
if (auraChunk == null)
|
|
|
|
return false;
|
|
|
|
PacketHandler.sendTo(player, auraChunk.makePacket());
|
|
|
|
return true;
|
2018-10-21 13:12:03 +02:00
|
|
|
}
|
2020-02-26 20:01:57 +01:00
|
|
|
|
|
|
|
@SubscribeEvent
|
2023-02-05 16:21:57 +01:00
|
|
|
public void onCommands(RegisterCommandsEvent event) {
|
|
|
|
CommandAura.register(event.getDispatcher());
|
2020-02-26 20:01:57 +01:00
|
|
|
}
|
2024-03-10 15:54:58 +01:00
|
|
|
|
2018-10-21 12:51:13 +02:00
|
|
|
}
|