/* This file is a part of the SteamWar software. Copyright (C) 2021 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 com.comphenix.tinyprotocol.Reflection; import de.steamwar.fightsystem.record.REntity; import org.bukkit.DyeColor; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Waterlogged; import org.bukkit.entity.EntityType; import org.bukkit.event.block.BlockPhysicsEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BlockDataMeta; import org.bukkit.inventory.meta.ItemMeta; import java.util.Objects; public class FlatteningWrapper14 implements FlatteningWrapper.IFlatteningWrapper { @Override public DyeColor getSilver() { return DyeColor.LIGHT_GRAY; } @Override public boolean isWater(Block block) { if(block.getType() == Material.WATER) return true; BlockData data = block.getBlockData(); if(!(data instanceof Waterlogged)) return false; return ((Waterlogged) data).isWaterlogged(); } @Override public boolean removeWater(Block block) { if(block.getType() == Material.WATER){ block.setType(Material.AIR); return true; } BlockData data = block.getBlockData(); if(!(data instanceof Waterlogged)) return false; Waterlogged waterlogged = (Waterlogged) data; if(waterlogged.isWaterlogged()){ block.setType(Material.AIR); return true; } return false; } @Override public boolean containsBlockMeta(ItemMeta meta) { return meta instanceof BlockDataMeta && ((BlockDataMeta)meta).hasBlockData(); } @Override public boolean hasAttributeModifier(ItemStack stack) { return stack.hasItemMeta() && Objects.requireNonNull(stack.getItemMeta()).hasAttributeModifiers(); } @Override public Material onBreak(Material type) { switch(type){ case REDSTONE_WIRE: return Material.REDSTONE; case PISTON_HEAD: return Material.PISTON; case ICE: return Material.AIR; default: return type; } } @Override public boolean doRecord(BlockPhysicsEvent e) { return e.getBlock() == e.getSourceBlock() || e.getChangedType() == Material.AIR; } @Override public void forceLoadChunk(World world, int cX, int cZ) { world.setChunkForceLoaded(cX, cZ, true); } @Override public boolean checkPistonMoving(Block block) { return block.getType() == Material.MOVING_PISTON; } @Override public void setNamedSpawnPacketDataWatcher(Object packet) { // field not present } private static final Class entityTypes = Reflection.getClass("{nms}.EntityTypes"); private static final Reflection.FieldAccessor spawnType = Reflection.getField(REntity.spawnPacket, entityTypes, 0); private static final Object tnt = Reflection.getField(entityTypes, "TNT", entityTypes).get(null); private static final Object arrow = Reflection.getField(entityTypes, "ARROW", entityTypes).get(null); private static final Object fireball = Reflection.getField(entityTypes, "FIREBALL", entityTypes).get(null); @Override public void setSpawnPacketType(Object packet, EntityType type) { switch(type) { case PRIMED_TNT: spawnType.set(packet, tnt); break; case ARROW: spawnType.set(packet, arrow); break; case FIREBALL: spawnType.set(packet, fireball); break; } } }