/* 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.core.Core; 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.entity.EntityType; import org.bukkit.event.block.BlockPhysicsEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; public class FlatteningWrapper8 implements FlatteningWrapper.IFlatteningWrapper { @Override public DyeColor getSilver() { return DyeColor.SILVER; } @Override public boolean isWater(Block block) { Material type = block.getType(); return type == Material.WATER || type == Material.STATIONARY_WATER; } @Override public boolean removeWater(Block block) { if(isWater(block)){ block.setType(Material.AIR); return true; } return false; } @Override public boolean containsBlockMeta(ItemMeta meta) { return false; } @Override public boolean hasAttributeModifier(ItemStack stack) { return false; } @Override public ItemStack onBreak(Block block) { return block.getDrops().stream().findAny().orElse(new ItemStack(Material.AIR)); } @Override public boolean doRecord(BlockPhysicsEvent e) { return e.getChangedType() != e.getBlock().getType(); } @Override public void forceLoadChunk(World world, int cX, int cZ) { // not possible in 1.8 } @Override public boolean checkPistonMoving(Block block) { return block.getType() == Material.PISTON_MOVING_PIECE; } private static final Class dataWatcher = Reflection.getClass("{nms}.DataWatcher"); private static final Reflection.FieldAccessor namedSpawnDataWatcher = Reflection.getField(REntity.namedSpawnPacket, dataWatcher, 0); private static final Class entity = Reflection.getClass("{nms}.Entity"); private static final Reflection.ConstructorInvoker dataWatcherConstructor = Reflection.getConstructor(dataWatcher, entity); @Override public void setNamedSpawnPacketDataWatcher(Object packet) { namedSpawnDataWatcher.set(packet, dataWatcherConstructor.invoke((Object) null)); } private static final Reflection.FieldAccessor spawnType = Reflection.getField(REntity.spawnPacket, int.class, Core.getVersion() > 8 ? 6 : 9); @Override public void setSpawnPacketType(Object packet, EntityType type) { switch(type) { case PRIMED_TNT: spawnType.set(packet, 50); break; case ARROW: spawnType.set(packet, 60); break; case FIREBALL: spawnType.set(packet, 63); break; } } }