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:
commit
73d2ddbc0b
8 changed files with 30 additions and 13 deletions
|
@ -1,4 +1,4 @@
|
|||
# ZNPCsPlus [](https://discord.gg/MAZz6XpPcg)
|
||||
# ZNPCsPlus [](https://discord.gg/MAZz6XpPcg) [](https://ci.pyr.lol/job/ZNPCsPlus/)
|
||||
[]((https://bstats.org/plugin/bukkit/ZNPCsPlus/18244/)) []((https://bstats.org/plugin/bukkit/ZNPCsPlus/18244/)) []((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;
|
||||
|
|
Loading…
Reference in a new issue