package mcjty.mymod.generator; import net.minecraft.entity.EntityLivingBase; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.event.entity.living.LivingDamageEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import java.util.*; public class DamageTracker { public static final DamageTracker instance = new DamageTracker(); private Map<Integer, Map<BlockPos, Set<UUID>>> tracking = new HashMap<>(); public void reset() { tracking.clear(); } public void register(Integer dimension, BlockPos pos, UUID entity) { if (!tracking.containsKey(dimension)) { tracking.put(dimension, new HashMap<>()); } Map<BlockPos, Set<UUID>> dimensionTracking = tracking.get(dimension); if (!dimensionTracking.containsKey(pos)) { dimensionTracking.put(pos, new HashSet<>()); } dimensionTracking.get(pos).add(entity); } public void remove(Integer dimension, BlockPos pos) { if (tracking.containsKey(dimension)) { tracking.get(dimension).remove(pos); } } public void clear(Integer dimension, BlockPos pos) { if (tracking.containsKey(dimension)) { Map<BlockPos, Set<UUID>> dimensionTracking = tracking.get(dimension); if (dimensionTracking.containsKey(pos)) { dimensionTracking.get(pos).clear(); } } } @SubscribeEvent public void onDamage(LivingDamageEvent event) { float amount = event.getAmount(); EntityLivingBase entity = event.getEntityLiving(); World world = entity.world; int dimension = world.provider.getDimension(); if (amount > 0 && tracking.containsKey(dimension)) { Map<BlockPos, Set<UUID>> dimensionTracking = tracking.get(dimension); for (Map.Entry<BlockPos, Set<UUID>> entry : dimensionTracking.entrySet()) { if (entry.getValue().contains(entity.getUniqueID())) { if (world.isBlockLoaded(entry.getKey())) { TileEntity tileEntity = world.getTileEntity(entry.getKey()); if (tileEntity instanceof TileGenerator) { ((TileGenerator) tileEntity).senseDamage(entity, amount); } } } } } } }