diff --git a/README.md b/README.md index d9a0c05..9c7d345 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ZNPCsPlus [![](https://img.shields.io/discord/1099449144948555957?label=Discord&logo=Discord&style=plastic)](https://discord.gg/MAZz6XpPcg) +# ZNPCsPlus [![](https://img.shields.io/discord/1099449144948555957?label=Discord&logo=Discord&style=plastic)](https://discord.gg/MAZz6XpPcg) [![](https://img.shields.io/jenkins/build?jobUrl=https%3A%2F%2Fci.pyr.lol%2Fjob%2FZNPCsPlus%2F&style=plastic&logo=jenkins)](https://ci.pyr.lol/job/ZNPCsPlus/) [![](https://img.shields.io/bstats/players/18244?style=plastic&label=bStats%20Players)]((https://bstats.org/plugin/bukkit/ZNPCsPlus/18244/)) [![](https://img.shields.io/bstats/servers/18244?style=plastic&label=bStats%20Servers)]((https://bstats.org/plugin/bukkit/ZNPCsPlus/18244/)) [![](https://img.shields.io/spiget/downloads/109380?style=plastic&label=Spigot%20Downloads)]((https://www.spigotmc.org/resources/znpcsplus.109380/)) [ZNPCsPlus](https://www.spigotmc.org/resources/znpcsplus.109380/) is a Spigot plugin that is used to create fake entities @@ -7,6 +7,8 @@ that players can interact with to perform actions like switching servers on a ne This plugin is a remake of a plugin called ZNPCs, we originally started because the maintainer of ZNPCs decided to announce that he was [dropping support for the plugin](https://media.discordapp.net/attachments/1093914615873806477/1098409384855474237/znpc.png). +Looking for up-to-date builds of the plugin? Check out our [Jenkins](https://ci.pyr.lol/job/ZNPCsPlus/) + ## Why is it so good? - 100% Packet Based - Nothing is ran on the main thread - Performance & stability oriented code diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java index 7524491..9e0f44b 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java @@ -105,7 +105,7 @@ public class ZNpcsPlus extends JavaPlugin { PluginManager pluginManager = Bukkit.getPluginManager(); long before = System.currentTimeMillis(); - boolean legacy = new File(getDataFolder(), "data.json").isFile(); + boolean legacy = new File(getDataFolder(), "data.json").isFile() && !new File(getDataFolder(), "data").isDirectory(); if (legacy) try { Files.move(getDataFolder().toPath(), new File(getDataFolder().getParentFile(), "ZNPCsPlusLegacy").toPath()); } catch (IOException e) { diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/commands/property/PropertySetCommand.java b/plugin/src/main/java/lol/pyr/znpcsplus/commands/property/PropertySetCommand.java index a24714e..1813ea4 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/commands/property/PropertySetCommand.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/commands/property/PropertySetCommand.java @@ -1,10 +1,8 @@ package lol.pyr.znpcsplus.commands.property; -import com.github.retrooper.packetevents.protocol.item.ItemStack; import com.github.retrooper.packetevents.protocol.world.states.WrappedBlockState; import com.github.retrooper.packetevents.protocol.world.states.type.StateType; import com.github.retrooper.packetevents.protocol.world.states.type.StateTypes; -import io.github.retrooper.packetevents.util.SpigotConversionUtil; import lol.pyr.director.adventure.command.CommandContext; import lol.pyr.director.adventure.command.CommandHandler; import lol.pyr.director.common.command.CommandExecutionException; @@ -18,6 +16,7 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Color; import org.bukkit.DyeColor; +import org.bukkit.inventory.ItemStack; import java.util.Collections; import java.util.List; @@ -43,12 +42,12 @@ public class PropertySetCommand implements CommandHandler { Object value; String valueName; if (type == ItemStack.class) { - org.bukkit.inventory.ItemStack bukkitStack = context.ensureSenderIsPlayer().getInventory().getItemInHand(); + ItemStack bukkitStack = context.ensureSenderIsPlayer().getInventory().getItemInHand(); if (bukkitStack.getAmount() == 0) { value = null; valueName = "EMPTY"; } else { - value = SpigotConversionUtil.fromBukkitItemStack(bukkitStack); + value = bukkitStack; valueName = bukkitStack.toString(); } } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/ZNpcImporter.java b/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/ZNpcImporter.java index 6c17b35..202d477 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/ZNpcImporter.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/ZNpcImporter.java @@ -27,8 +27,10 @@ import lol.pyr.znpcsplus.npc.NpcImpl; import lol.pyr.znpcsplus.npc.NpcTypeRegistryImpl; import lol.pyr.znpcsplus.packets.PacketFactory; import lol.pyr.znpcsplus.scheduling.TaskScheduler; +import lol.pyr.znpcsplus.skin.Skin; import lol.pyr.znpcsplus.skin.cache.MojangSkinCache; import lol.pyr.znpcsplus.skin.descriptor.FetchingDescriptor; +import lol.pyr.znpcsplus.skin.descriptor.PrefetchedDescriptor; import lol.pyr.znpcsplus.util.BungeeConnector; import lol.pyr.znpcsplus.util.ItemSerializationUtil; import lol.pyr.znpcsplus.util.NpcLocation; @@ -123,6 +125,9 @@ public class ZNpcImporter implements DataImporter { if (model.getSkinName() != null) { npc.setProperty(propertyRegistry.getByName("skin", SkinDescriptor.class), new FetchingDescriptor(skinCache, model.getSkinName())); } + else if (model.getSkin() != null && model.getSignature() != null) { + npc.setProperty(propertyRegistry.getByName("skin", SkinDescriptor.class), new PrefetchedDescriptor(new Skin(model.getSkin(), model.getSignature()))); + } NpcEntryImpl entry = new NpcEntryImpl(String.valueOf(model.getId()), npc); entry.enableEverything(); diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/model/ZNpcsModel.java b/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/model/ZNpcsModel.java index 8ab73a3..4502b23 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/model/ZNpcsModel.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/model/ZNpcsModel.java @@ -10,6 +10,9 @@ public class ZNpcsModel { private UUID uuid; private double hologramHeight; private String skinName; + private String skin; + private String signature; + private String glowName; private ZNpcsLocation location; private String npcType; @@ -57,4 +60,12 @@ public class ZNpcsModel { public Map getCustomizationMap() { return customizationMap; } + + public String getSkin() { + return skin; + } + + public String getSignature() { + return signature; + } } \ No newline at end of file diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/ItemStackPropertySerializer.java b/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/ItemStackPropertySerializer.java index c6f1cb5..d9f59d2 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/ItemStackPropertySerializer.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/entity/serializers/ItemStackPropertySerializer.java @@ -1,19 +1,18 @@ package lol.pyr.znpcsplus.entity.serializers; -import com.github.retrooper.packetevents.protocol.item.ItemStack; -import io.github.retrooper.packetevents.util.SpigotConversionUtil; import lol.pyr.znpcsplus.entity.PropertySerializer; import lol.pyr.znpcsplus.util.ItemSerializationUtil; +import org.bukkit.inventory.ItemStack; public class ItemStackPropertySerializer implements PropertySerializer { @Override public String serialize(ItemStack property) { - return ItemSerializationUtil.itemToB64(SpigotConversionUtil.toBukkitItemStack(property)); + return ItemSerializationUtil.itemToB64(property); } @Override public ItemStack deserialize(String property) { - return SpigotConversionUtil.fromBukkitItemStack(ItemSerializationUtil.itemFromB64(property)); + return ItemSerializationUtil.itemFromB64(property); } @Override diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionPacketListener.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionPacketListener.java index 6169b60..1f59e15 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionPacketListener.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionPacketListener.java @@ -28,6 +28,7 @@ public class InteractionPacketListener implements PacketListener { public void onPacketReceive(PacketReceiveEvent event) { if (event.getPacketType() != PacketType.Play.Client.INTERACT_ENTITY) return; Player player = (Player) event.getPlayer(); + if (player == null) return; WrapperPlayClientInteractEntity packet = new WrapperPlayClientInteractEntity(event); User user = userManager.get(player); diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/tasks/NpcProcessorTask.java b/plugin/src/main/java/lol/pyr/znpcsplus/tasks/NpcProcessorTask.java index 426a854..1e91139 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/tasks/NpcProcessorTask.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/tasks/NpcProcessorTask.java @@ -37,20 +37,20 @@ public class NpcProcessorTask extends BukkitRunnable { Player closest = null; for (Player player : Bukkit.getOnlinePlayers()) { if (!player.getWorld().equals(npc.getWorld())) { - if (npc.isShown(player)) npc.hide(player); + if (npc.isVisibleTo(player)) npc.hide(player); continue; } double distance = player.getLocation().distanceSquared(npc.getBukkitLocation()); // visibility boolean inRange = distance <= distSq; - if (!inRange && npc.isShown(player)) { + if (!inRange && npc.isVisibleTo(player)) { NpcDespawnEvent event = new NpcDespawnEvent(player, entry); Bukkit.getPluginManager().callEvent(event); if (!event.isCancelled()) npc.hide(player); } if (inRange) { - if (!npc.isShown(player)) { + if (!npc.isVisibleTo(player)) { NpcSpawnEvent event = new NpcSpawnEvent(player, entry); Bukkit.getPluginManager().callEvent(event); if (event.isCancelled()) continue;