Merge branch 'development'

This commit is contained in:
Christian Koop 2022-03-20 11:21:07 +01:00
commit 1f360aee0a
No known key found for this signature in database
GPG Key ID: 89A8181384E010A3
4 changed files with 82 additions and 37 deletions

View File

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

View File

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

View File

@ -2,12 +2,18 @@ package com.songoda.skyblock.utils.item;
import com.songoda.core.compatibility.ClassMapping;
import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.MethodMapping;
import com.songoda.core.compatibility.ServerVersion;
import com.songoda.core.utils.NMSUtils;
import org.bukkit.Material;
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.math.BigInteger;
@ -21,7 +27,7 @@ public class ItemStackUtil {
DataInputStream dataInputStream = new DataInputStream(inputStream);
ItemStack itemStack = null;
try {
Class<?> NBTTagCompoundClass = ClassMapping.NBT_TAG_COMPOUND.getClazz();
Class<?> NMSItemStackClass = ClassMapping.ITEM_STACK.getClazz();
@ -70,10 +76,15 @@ public class ItemStackUtil {
Class<?> NBTTagCompoundClass = ClassMapping.NBT_TAG_COMPOUND.getClazz();
Constructor<?> nbtTagCompoundConstructor = NBTTagCompoundClass.getConstructor();
Object NBTTagCompound = nbtTagCompoundConstructor.newInstance();
Object NMSItemStackClass = NMSUtils.getCraftClass("inventory.CraftItemStack")
.getMethod("asNMSCopy", ItemStack.class).invoke(null, item);
ClassMapping.ITEM_STACK.getClazz().getMethod("save", NBTTagCompoundClass).invoke(NMSItemStackClass,
NBTTagCompound);
Object nmsItemStack = MethodMapping.CB_ITEM_STACK__AS_NMS_COPY
.getMethod(ClassMapping.CRAFT_ITEM_STACK.getClazz())
.invoke(null, item);
MethodMapping.ITEM_STACK__SAVE
.getMethod(ClassMapping.ITEM_STACK.getClazz())
.invoke(nmsItemStack, NBTTagCompound);
ClassMapping.NBT_COMPRESSED_STREAM_TOOLS.getClazz().getMethod("a", NBTTagCompoundClass, DataOutput.class)
.invoke(null, NBTTagCompound, dataOutput);
} catch (Exception e) {

View File

@ -2,12 +2,37 @@ package com.songoda.skyblock.utils.world.block;
import com.songoda.core.compatibility.ClassMapping;
import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.MethodMapping;
import com.songoda.core.compatibility.ServerVersion;
import com.songoda.core.utils.BlockUtils;
import com.songoda.core.utils.NMSUtils;
import com.songoda.skyblock.utils.item.ItemStackUtil;
import org.bukkit.*;
import org.bukkit.block.*;
import org.bukkit.Bukkit;
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.PatternType;
import org.bukkit.block.data.type.RespawnAnchor;
@ -192,27 +217,27 @@ public final class BlockUtil extends BlockUtils {
blockData.setStateType(BlockStateType.SHULKERBOX.toString());
}
}
if(ServerVersion.isServerVersionAtLeast(ServerVersion.V1_14)){
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_14)) {
if (blockState instanceof Barrel) {
Barrel barrel = (Barrel) blockState;
for (int i = 0; i < barrel.getInventory().getSize(); i++) {
ItemStack is = barrel.getInventory().getItem(i);
if (is != null && is.getType() != CompatibleMaterial.AIR.getMaterial()) {
blockData.addItem(i, ItemStackUtil.serializeItemStack(is));
}
}
blockData.setStateType(BlockStateType.BARREL.toString());
}
if(ServerVersion.isServerVersionAtLeast(ServerVersion.V1_16)){
if (blockState instanceof RespawnAnchor) {
RespawnAnchor respawnAnchor = (RespawnAnchor) blockState;
blockData.setCharges(respawnAnchor.getCharges());
blockData.setStateType(BlockStateType.RESPAWN_ANCHOR.toString());
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_16)) {
if (blockState instanceof RespawnAnchor) {
RespawnAnchor respawnAnchor = (RespawnAnchor) blockState;
blockData.setCharges(respawnAnchor.getCharges());
blockData.setStateType(BlockStateType.RESPAWN_ANCHOR.toString());
}
}
}
@ -227,14 +252,14 @@ public final class BlockUtil extends BlockUtils {
try {
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 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);
Field aField = tileEntity.getClass().getDeclaredField("a");
aField.setAccessible(true);
aField.setAccessible(true);
Object item = aField.get(tileEntity);
@ -244,7 +269,7 @@ public final class BlockUtil extends BlockUtils {
ItemStack itemStack = (ItemStack) NMSUtils.getCraftClass("inventory.CraftItemStack").getMethod("asBukkitCopy", itemStackNMS.getClass()).invoke(null, itemStackNMS);
Field fField = tileEntity.getClass().getDeclaredField("f");
fField.setAccessible(true);
fField.setAccessible(true);
int data = (int) fField.get(tileEntity);
@ -428,10 +453,10 @@ public final class BlockUtil extends BlockUtils {
}
}
}
if(ServerVersion.isServerVersionAtLeast(ServerVersion.V1_14)){
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_14)) {
if (blockTypeState.equals(BlockStateType.BARREL)) {
Barrel barrel = (Barrel) state;
for (Integer slotList : blockData.getInventory().keySet()) {
if (slotList < barrel.getInventory().getSize()) {
ItemStack is = ItemStackUtil.deserializeItemStack(blockData.getInventory().get(slotList));
@ -440,8 +465,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)) {
RespawnAnchor respawnAnchor = (RespawnAnchor) state;
respawnAnchor.setCharges(blockData.getCharges());
@ -478,10 +503,10 @@ public final class BlockUtil extends BlockUtils {
Class<?> blockPositionClass = ClassMapping.BLOCK_POSITION.getClazz();
Object worldHandle = world.getClass().getMethod("getHandle").invoke(world);
Object worldHandle = MethodMapping.CB_GENERIC__GET_HANDLE.getMethod(world.getClass()).invoke(world);
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 itemStack = NMSUtils.getCraftClass("inventory.CraftItemStack").getMethod("asNMSCopy", is.getClass()).invoke(null, is);
Object itemStack = MethodMapping.CB_ITEM_STACK__AS_NMS_COPY.getMethod(ClassMapping.CRAFT_ITEM_STACK.getClazz()).invoke(null, is);
Object item = itemStack.getClass().getMethod("getItem").invoke(itemStack);
Object data = itemStack.getClass().getMethod("getData").invoke(itemStack);
@ -490,7 +515,7 @@ public final class BlockUtil extends BlockUtils {
aField.set(tileEntity, item);
Field fField = tileEntity.getClass().getDeclaredField("f");
fField.setAccessible(true);
fField.setAccessible(true);
fField.set(tileEntity, data);
tileEntity.getClass().getMethod("update").invoke(tileEntity);