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/))
[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

@ -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) {

@ -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();
}
}

@ -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();

@ -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<String, String[]> getCustomizationMap() {
return customizationMap;
}
public String getSkin() {
return skin;
}
public String getSignature() {
return signature;
}
}

@ -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<ItemStack> {
@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

@ -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);

@ -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;