Merge branch '2.X' into modular-property-system

# Conflicts:
#	plugin/src/main/java/lol/pyr/znpcsplus/entity/EntityPropertyRegistryImpl.java
#	plugin/src/main/java/lol/pyr/znpcsplus/packets/V1_8PacketFactory.java
#	plugin/src/main/java/lol/pyr/znpcsplus/util/Viewable.java
This commit is contained in:
Pyrbu 2023-08-07 23:14:47 +02:00
commit 73d2ddbc0b
8 changed files with 30 additions and 13 deletions

@ -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/)) [![](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 [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 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). [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? ## Why is it so good?
- 100% Packet Based - Nothing is ran on the main thread - 100% Packet Based - Nothing is ran on the main thread
- Performance & stability oriented code - Performance & stability oriented code

@ -105,7 +105,7 @@ public class ZNpcsPlus extends JavaPlugin {
PluginManager pluginManager = Bukkit.getPluginManager(); PluginManager pluginManager = Bukkit.getPluginManager();
long before = System.currentTimeMillis(); 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 { if (legacy) try {
Files.move(getDataFolder().toPath(), new File(getDataFolder().getParentFile(), "ZNPCsPlusLegacy").toPath()); Files.move(getDataFolder().toPath(), new File(getDataFolder().getParentFile(), "ZNPCsPlusLegacy").toPath());
} catch (IOException e) { } catch (IOException e) {

@ -1,10 +1,8 @@
package lol.pyr.znpcsplus.commands.property; 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.WrappedBlockState;
import com.github.retrooper.packetevents.protocol.world.states.type.StateType; import com.github.retrooper.packetevents.protocol.world.states.type.StateType;
import com.github.retrooper.packetevents.protocol.world.states.type.StateTypes; 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.CommandContext;
import lol.pyr.director.adventure.command.CommandHandler; import lol.pyr.director.adventure.command.CommandHandler;
import lol.pyr.director.common.command.CommandExecutionException; 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 net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Color; import org.bukkit.Color;
import org.bukkit.DyeColor; import org.bukkit.DyeColor;
import org.bukkit.inventory.ItemStack;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -43,12 +42,12 @@ public class PropertySetCommand implements CommandHandler {
Object value; Object value;
String valueName; String valueName;
if (type == ItemStack.class) { if (type == ItemStack.class) {
org.bukkit.inventory.ItemStack bukkitStack = context.ensureSenderIsPlayer().getInventory().getItemInHand(); ItemStack bukkitStack = context.ensureSenderIsPlayer().getInventory().getItemInHand();
if (bukkitStack.getAmount() == 0) { if (bukkitStack.getAmount() == 0) {
value = null; value = null;
valueName = "EMPTY"; valueName = "EMPTY";
} else { } else {
value = SpigotConversionUtil.fromBukkitItemStack(bukkitStack); value = bukkitStack;
valueName = bukkitStack.toString(); valueName = bukkitStack.toString();
} }
} }

@ -27,8 +27,10 @@ import lol.pyr.znpcsplus.npc.NpcImpl;
import lol.pyr.znpcsplus.npc.NpcTypeRegistryImpl; import lol.pyr.znpcsplus.npc.NpcTypeRegistryImpl;
import lol.pyr.znpcsplus.packets.PacketFactory; import lol.pyr.znpcsplus.packets.PacketFactory;
import lol.pyr.znpcsplus.scheduling.TaskScheduler; import lol.pyr.znpcsplus.scheduling.TaskScheduler;
import lol.pyr.znpcsplus.skin.Skin;
import lol.pyr.znpcsplus.skin.cache.MojangSkinCache; import lol.pyr.znpcsplus.skin.cache.MojangSkinCache;
import lol.pyr.znpcsplus.skin.descriptor.FetchingDescriptor; 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.BungeeConnector;
import lol.pyr.znpcsplus.util.ItemSerializationUtil; import lol.pyr.znpcsplus.util.ItemSerializationUtil;
import lol.pyr.znpcsplus.util.NpcLocation; import lol.pyr.znpcsplus.util.NpcLocation;
@ -123,6 +125,9 @@ public class ZNpcImporter implements DataImporter {
if (model.getSkinName() != null) { if (model.getSkinName() != null) {
npc.setProperty(propertyRegistry.getByName("skin", SkinDescriptor.class), new FetchingDescriptor(skinCache, model.getSkinName())); 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); NpcEntryImpl entry = new NpcEntryImpl(String.valueOf(model.getId()), npc);
entry.enableEverything(); entry.enableEverything();

@ -10,6 +10,9 @@ public class ZNpcsModel {
private UUID uuid; private UUID uuid;
private double hologramHeight; private double hologramHeight;
private String skinName; private String skinName;
private String skin;
private String signature;
private String glowName; private String glowName;
private ZNpcsLocation location; private ZNpcsLocation location;
private String npcType; private String npcType;
@ -57,4 +60,12 @@ public class ZNpcsModel {
public Map<String, String[]> getCustomizationMap() { public Map<String, String[]> getCustomizationMap() {
return customizationMap; return customizationMap;
} }
public String getSkin() {
return skin;
}
public String getSignature() {
return signature;
}
} }

@ -1,19 +1,18 @@
package lol.pyr.znpcsplus.entity.serializers; 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.entity.PropertySerializer;
import lol.pyr.znpcsplus.util.ItemSerializationUtil; import lol.pyr.znpcsplus.util.ItemSerializationUtil;
import org.bukkit.inventory.ItemStack;
public class ItemStackPropertySerializer implements PropertySerializer<ItemStack> { public class ItemStackPropertySerializer implements PropertySerializer<ItemStack> {
@Override @Override
public String serialize(ItemStack property) { public String serialize(ItemStack property) {
return ItemSerializationUtil.itemToB64(SpigotConversionUtil.toBukkitItemStack(property)); return ItemSerializationUtil.itemToB64(property);
} }
@Override @Override
public ItemStack deserialize(String property) { public ItemStack deserialize(String property) {
return SpigotConversionUtil.fromBukkitItemStack(ItemSerializationUtil.itemFromB64(property)); return ItemSerializationUtil.itemFromB64(property);
} }
@Override @Override

@ -28,6 +28,7 @@ public class InteractionPacketListener implements PacketListener {
public void onPacketReceive(PacketReceiveEvent event) { public void onPacketReceive(PacketReceiveEvent event) {
if (event.getPacketType() != PacketType.Play.Client.INTERACT_ENTITY) return; if (event.getPacketType() != PacketType.Play.Client.INTERACT_ENTITY) return;
Player player = (Player) event.getPlayer(); Player player = (Player) event.getPlayer();
if (player == null) return;
WrapperPlayClientInteractEntity packet = new WrapperPlayClientInteractEntity(event); WrapperPlayClientInteractEntity packet = new WrapperPlayClientInteractEntity(event);
User user = userManager.get(player); User user = userManager.get(player);

@ -37,20 +37,20 @@ public class NpcProcessorTask extends BukkitRunnable {
Player closest = null; Player closest = null;
for (Player player : Bukkit.getOnlinePlayers()) { for (Player player : Bukkit.getOnlinePlayers()) {
if (!player.getWorld().equals(npc.getWorld())) { if (!player.getWorld().equals(npc.getWorld())) {
if (npc.isShown(player)) npc.hide(player); if (npc.isVisibleTo(player)) npc.hide(player);
continue; continue;
} }
double distance = player.getLocation().distanceSquared(npc.getBukkitLocation()); double distance = player.getLocation().distanceSquared(npc.getBukkitLocation());
// visibility // visibility
boolean inRange = distance <= distSq; boolean inRange = distance <= distSq;
if (!inRange && npc.isShown(player)) { if (!inRange && npc.isVisibleTo(player)) {
NpcDespawnEvent event = new NpcDespawnEvent(player, entry); NpcDespawnEvent event = new NpcDespawnEvent(player, entry);
Bukkit.getPluginManager().callEvent(event); Bukkit.getPluginManager().callEvent(event);
if (!event.isCancelled()) npc.hide(player); if (!event.isCancelled()) npc.hide(player);
} }
if (inRange) { if (inRange) {
if (!npc.isShown(player)) { if (!npc.isVisibleTo(player)) {
NpcSpawnEvent event = new NpcSpawnEvent(player, entry); NpcSpawnEvent event = new NpcSpawnEvent(player, entry);
Bukkit.getPluginManager().callEvent(event); Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) continue; if (event.isCancelled()) continue;