Updates to Core v2.6.12 (MC1.18.2) + new hologram api implementation

This commit is contained in:
Christian Koop 2022-03-18 21:53:14 +01:00
parent d53e0939d5
commit e5e136b7d3
No known key found for this signature in database
GPG Key ID: 89A8181384E010A3
4 changed files with 69 additions and 31 deletions

View File

@ -6,7 +6,7 @@
<groupId>com.songoda</groupId> <groupId>com.songoda</groupId>
<artifactId>skyblock</artifactId> <artifactId>skyblock</artifactId>
<version>2.4.0</version> <version>2.4.1-DEV</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<properties> <properties>
@ -207,7 +207,7 @@
<dependency> <dependency>
<groupId>com.songoda</groupId> <groupId>com.songoda</groupId>
<artifactId>SongodaCore</artifactId> <artifactId>SongodaCore</artifactId>
<version>2.6.5</version> <version>2.6.12</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>

View File

@ -6,18 +6,22 @@ import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import java.util.List; import java.util.List;
import java.util.UUID;
public class Hologram { public class Hologram {
private final String hologramId;
private final HologramType type; private final HologramType type;
private final Location location; private final Location location;
public Hologram(HologramType type, Location location, List<String> lines) { public Hologram(HologramType type, Location location, List<String> lines) {
this.hologramId = location.toString() + UUID.randomUUID();
this.type = type; this.type = type;
this.location = location; this.location = location;
Bukkit.getScheduler().runTask(SkyBlock.getInstance(), Bukkit.getScheduler().runTask(SkyBlock.getInstance(),
() -> HologramManager.createHologram(location, lines)); () -> HologramManager.createHologram(hologramId, location, lines));
} }
public HologramType getType() { public HologramType getType() {
@ -30,14 +34,19 @@ public class Hologram {
} }
public void remove() { public void remove() {
HologramManager.removeHologram(location); HologramManager.removeHologram(hologramId);
Bukkit.getScheduler().runTask(SkyBlock.getInstance(), Bukkit.getScheduler().runTask(SkyBlock.getInstance(), () -> HologramManager.removeHologram(hologramId));
() -> HologramManager.removeHologram(location));
} }
public void update(List<String> lines) { public void update(List<String> lines) {
Bukkit.getScheduler().runTask(SkyBlock.getInstance(), Bukkit.getScheduler().runTask(SkyBlock.getInstance(), () -> {
() -> HologramManager.updateHologram(location, lines)); if (HologramManager.isHologramLoaded(hologramId)) {
HologramManager.updateHologram(hologramId, lines);
return;
}
HologramManager.createHologram(hologramId, location, lines);
});
} }
} }

View File

@ -7,7 +7,12 @@ import com.songoda.core.utils.NMSUtils;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import java.io.*; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInput;
import java.io.DataInputStream;
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.math.BigInteger; import java.math.BigInteger;
@ -21,7 +26,7 @@ public class ItemStackUtil {
DataInputStream dataInputStream = new DataInputStream(inputStream); DataInputStream dataInputStream = new DataInputStream(inputStream);
ItemStack itemStack = null; ItemStack itemStack = null;
try { try {
Class<?> NBTTagCompoundClass = ClassMapping.NBT_TAG_COMPOUND.getClazz(); Class<?> NBTTagCompoundClass = ClassMapping.NBT_TAG_COMPOUND.getClazz();
Class<?> NMSItemStackClass = ClassMapping.ITEM_STACK.getClazz(); Class<?> NMSItemStackClass = ClassMapping.ITEM_STACK.getClazz();

View File

@ -6,8 +6,32 @@ import com.songoda.core.compatibility.ServerVersion;
import com.songoda.core.utils.BlockUtils; import com.songoda.core.utils.BlockUtils;
import com.songoda.core.utils.NMSUtils; import com.songoda.core.utils.NMSUtils;
import com.songoda.skyblock.utils.item.ItemStackUtil; import com.songoda.skyblock.utils.item.ItemStackUtil;
import org.bukkit.*; import org.bukkit.Bukkit;
import org.bukkit.block.*; import org.bukkit.ChatColor;
import org.bukkit.DyeColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.SkullType;
import org.bukkit.World;
import org.bukkit.block.Banner;
import org.bukkit.block.Barrel;
import org.bukkit.block.Beacon;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.block.BrewingStand;
import org.bukkit.block.Chest;
import org.bukkit.block.CommandBlock;
import org.bukkit.block.CreatureSpawner;
import org.bukkit.block.Dispenser;
import org.bukkit.block.Dropper;
import org.bukkit.block.EndGateway;
import org.bukkit.block.Furnace;
import org.bukkit.block.Hopper;
import org.bukkit.block.Jukebox;
import org.bukkit.block.ShulkerBox;
import org.bukkit.block.Sign;
import org.bukkit.block.Skull;
import org.bukkit.block.banner.Pattern; import org.bukkit.block.banner.Pattern;
import org.bukkit.block.banner.PatternType; import org.bukkit.block.banner.PatternType;
import org.bukkit.block.data.type.RespawnAnchor; import org.bukkit.block.data.type.RespawnAnchor;
@ -192,27 +216,27 @@ public final class BlockUtil extends BlockUtils {
blockData.setStateType(BlockStateType.SHULKERBOX.toString()); blockData.setStateType(BlockStateType.SHULKERBOX.toString());
} }
} }
if(ServerVersion.isServerVersionAtLeast(ServerVersion.V1_14)){ if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_14)) {
if (blockState instanceof Barrel) { if (blockState instanceof Barrel) {
Barrel barrel = (Barrel) blockState; Barrel barrel = (Barrel) blockState;
for (int i = 0; i < barrel.getInventory().getSize(); i++) { for (int i = 0; i < barrel.getInventory().getSize(); i++) {
ItemStack is = barrel.getInventory().getItem(i); ItemStack is = barrel.getInventory().getItem(i);
if (is != null && is.getType() != CompatibleMaterial.AIR.getMaterial()) { if (is != null && is.getType() != CompatibleMaterial.AIR.getMaterial()) {
blockData.addItem(i, ItemStackUtil.serializeItemStack(is)); blockData.addItem(i, ItemStackUtil.serializeItemStack(is));
} }
} }
blockData.setStateType(BlockStateType.BARREL.toString()); blockData.setStateType(BlockStateType.BARREL.toString());
} }
if(ServerVersion.isServerVersionAtLeast(ServerVersion.V1_16)){ if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_16)) {
if (blockState instanceof RespawnAnchor) { if (blockState instanceof RespawnAnchor) {
RespawnAnchor respawnAnchor = (RespawnAnchor) blockState; RespawnAnchor respawnAnchor = (RespawnAnchor) blockState;
blockData.setCharges(respawnAnchor.getCharges()); blockData.setCharges(respawnAnchor.getCharges());
blockData.setStateType(BlockStateType.RESPAWN_ANCHOR.toString()); blockData.setStateType(BlockStateType.RESPAWN_ANCHOR.toString());
} }
} }
} }
@ -227,14 +251,14 @@ public final class BlockUtil extends BlockUtils {
try { try {
World world = block.getWorld(); World world = block.getWorld();
Class<?> blockPositionClass = ClassMapping.BLOCK_POSITION.getClazz();; Class<?> blockPositionClass = ClassMapping.BLOCK_POSITION.getClazz();
Object worldHandle = world.getClass().getMethod("getHandle").invoke(world); Object worldHandle = world.getClass().getMethod("getHandle").invoke(world);
Object blockPosition = blockPositionClass.getConstructor(int.class, int.class, int.class).newInstance(block.getX(), block.getY(), block.getZ()); Object blockPosition = blockPositionClass.getConstructor(int.class, int.class, int.class).newInstance(block.getX(), block.getY(), block.getZ());
Object tileEntity = worldHandle.getClass().getMethod("getTileEntity", blockPositionClass).invoke(worldHandle, blockPosition); Object tileEntity = worldHandle.getClass().getMethod("getTileEntity", blockPositionClass).invoke(worldHandle, blockPosition);
Field aField = tileEntity.getClass().getDeclaredField("a"); Field aField = tileEntity.getClass().getDeclaredField("a");
aField.setAccessible(true); aField.setAccessible(true);
Object item = aField.get(tileEntity); Object item = aField.get(tileEntity);
@ -244,7 +268,7 @@ public final class BlockUtil extends BlockUtils {
ItemStack itemStack = (ItemStack) NMSUtils.getCraftClass("inventory.CraftItemStack").getMethod("asBukkitCopy", itemStackNMS.getClass()).invoke(null, itemStackNMS); ItemStack itemStack = (ItemStack) NMSUtils.getCraftClass("inventory.CraftItemStack").getMethod("asBukkitCopy", itemStackNMS.getClass()).invoke(null, itemStackNMS);
Field fField = tileEntity.getClass().getDeclaredField("f"); Field fField = tileEntity.getClass().getDeclaredField("f");
fField.setAccessible(true); fField.setAccessible(true);
int data = (int) fField.get(tileEntity); int data = (int) fField.get(tileEntity);
@ -428,10 +452,10 @@ public final class BlockUtil extends BlockUtils {
} }
} }
} }
if(ServerVersion.isServerVersionAtLeast(ServerVersion.V1_14)){ if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_14)) {
if (blockTypeState.equals(BlockStateType.BARREL)) { if (blockTypeState.equals(BlockStateType.BARREL)) {
Barrel barrel = (Barrel) state; Barrel barrel = (Barrel) state;
for (Integer slotList : blockData.getInventory().keySet()) { for (Integer slotList : blockData.getInventory().keySet()) {
if (slotList < barrel.getInventory().getSize()) { if (slotList < barrel.getInventory().getSize()) {
ItemStack is = ItemStackUtil.deserializeItemStack(blockData.getInventory().get(slotList)); ItemStack is = ItemStackUtil.deserializeItemStack(blockData.getInventory().get(slotList));
@ -440,8 +464,8 @@ public final class BlockUtil extends BlockUtils {
} }
} }
} }
if(ServerVersion.isServerVersionAtLeast(ServerVersion.V1_16)){ if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_16)) {
if (blockTypeState.equals(BlockStateType.RESPAWN_ANCHOR)) { if (blockTypeState.equals(BlockStateType.RESPAWN_ANCHOR)) {
RespawnAnchor respawnAnchor = (RespawnAnchor) state; RespawnAnchor respawnAnchor = (RespawnAnchor) state;
respawnAnchor.setCharges(blockData.getCharges()); respawnAnchor.setCharges(blockData.getCharges());
@ -490,7 +514,7 @@ public final class BlockUtil extends BlockUtils {
aField.set(tileEntity, item); aField.set(tileEntity, item);
Field fField = tileEntity.getClass().getDeclaredField("f"); Field fField = tileEntity.getClass().getDeclaredField("f");
fField.setAccessible(true); fField.setAccessible(true);
fField.set(tileEntity, data); fField.set(tileEntity, data);
tileEntity.getClass().getMethod("update").invoke(tileEntity); tileEntity.getClass().getMethod("update").invoke(tileEntity);