/* * This file is a part of the SteamWar software. * * Copyright (C) 2025 SteamWar.de-Serverteam * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ package de.steamwar.fightsystem.utils; import de.steamwar.Reflection; import de.steamwar.fightsystem.Config; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; public class BlockIdWrapper8 implements BlockIdWrapper { private static final Class entityTracker = Reflection.getClass("net.minecraft.EntityTracker"); private static final Reflection.Field getEntityTracker = Reflection.getField(worldServer, entityTracker, 0); private static final Class intHashMap = Reflection.getClass("net.minecraft.IntHashMap"); private static final Reflection.Field getTrackedEntities = Reflection.getField(entityTracker, intHashMap, 0); private final Object trackers; public BlockIdWrapper8() { trackers = getTrackedEntities.get(getEntityTracker.get(getWorldHandle.invoke(Config.world))); } @Override @SuppressWarnings("deprecation") public int blockToId(Block block) { return block.getTypeId() << 4 + block.getData(); } @Override @SuppressWarnings("deprecation") public void setBlock(World world, int x, int y, int z, int blockState) { if((blockState >> 4) > 256) // Illegal blockstate / corrupted replay blockState = 0; world.getBlockAt(x, y, z).setTypeIdAndData(blockState >> 4, (byte)(blockState & 0b1111), false); } private static final Class entityTrackerEntry = Reflection.getClass("net.minecraft.EntityTrackerEntry"); private static final Reflection.Method get = Reflection.getTypedMethod(intHashMap, "get", Object.class, int.class); private static final Reflection.Method updatePlayer = Reflection.getMethod(entityTrackerEntry, "updatePlayer", entityPlayer); @Override public void trackEntity(Player player, Entity entity) { Object tracker = get.invoke(trackers, entity.getEntityId()); if(tracker != null) updatePlayer.invoke(tracker, getPlayer.invoke(player)); } private static final Reflection.Method clearPlayer = Reflection.getMethod(entityTrackerEntry, "a", entityPlayer); @Override public void untrackEntity(Player player, Entity entity) { Object tracker = get.invoke(trackers, entity.getEntityId()); if(tracker != null) clearPlayer.invoke(tracker, getPlayer.invoke(player)); } @Override @SuppressWarnings("deprecation") public Material idToMaterial(int blockState) { if((blockState >> 4) > 256) // Illegal blockstate / corrupted replay blockState = 0; return Material.getMaterial(blockState >> 4); } }