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/))
|
[]((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
|
[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;
|
||||||
|
|
Loading…
Reference in a new issue