add uuids to npcs & add uuid importing to znpcs importer
This commit is contained in:
parent
697fdb36e1
commit
78fbb13348
10 changed files with 80 additions and 40 deletions
|
@ -1,8 +1,11 @@
|
|||
package lol.pyr.znpcsplus.api.npc;
|
||||
|
||||
import lol.pyr.znpcsplus.api.hologram.Hologram;
|
||||
import lol.pyr.znpcsplus.api.entity.PropertyHolder;
|
||||
import lol.pyr.znpcsplus.api.hologram.Hologram;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
public interface Npc extends PropertyHolder {
|
||||
Hologram getHologram();
|
||||
UUID getUuid();
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import lol.pyr.znpcsplus.util.NpcLocation;
|
|||
import org.bukkit.World;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.UUID;
|
||||
|
||||
public interface NpcRegistry {
|
||||
Collection<? extends NpcEntry> getAll();
|
||||
|
@ -11,6 +12,7 @@ public interface NpcRegistry {
|
|||
Collection<? extends NpcEntry> getAllPlayerMade();
|
||||
Collection<String> getAllPlayerMadeIds();
|
||||
NpcEntry create(String id, World world, NpcType type, NpcLocation location);
|
||||
NpcEntry get(String id);
|
||||
NpcEntry getById(String id);
|
||||
NpcEntry getByUuid(UUID uuid);
|
||||
void delete(String id);
|
||||
}
|
||||
|
|
|
@ -30,7 +30,7 @@ public class CreateCommand implements CommandHandler {
|
|||
Player player = context.ensureSenderIsPlayer();
|
||||
|
||||
String id = context.popString();
|
||||
if (npcRegistry.get(id) != null) context.halt(Component.text("NPC with that ID already exists.", NamedTextColor.RED));
|
||||
if (npcRegistry.getById(id) != null) context.halt(Component.text("NPC with that ID already exists.", NamedTextColor.RED));
|
||||
NpcTypeImpl type = context.parse(NpcTypeImpl.class);
|
||||
|
||||
NpcEntryImpl entry = npcRegistry.create(id, player.getWorld(), type, new NpcLocation(player.getLocation()));
|
||||
|
|
|
@ -22,7 +22,7 @@ public class ListCommand implements CommandHandler {
|
|||
public void run(CommandContext context) throws CommandExecutionException {
|
||||
TextComponent.Builder component = Component.text("Npc List:\n").color(NamedTextColor.GOLD).toBuilder();
|
||||
for (String id : npcRegistry.getModifiableIds()) {
|
||||
NpcImpl npc = npcRegistry.get(id).getNpc();
|
||||
NpcImpl npc = npcRegistry.getById(id).getNpc();
|
||||
NpcLocation location = npc.getLocation();
|
||||
component.append(Component.text("ID: " + id, NamedTextColor.GREEN))
|
||||
.append(Component.text(" | ", NamedTextColor.GRAY))
|
||||
|
|
|
@ -40,10 +40,7 @@ import java.io.BufferedReader;
|
|||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
|
||||
public class ZNpcImporter implements DataImporter {
|
||||
private final ConfigManager configManager;
|
||||
|
@ -102,7 +99,8 @@ public class ZNpcImporter implements DataImporter {
|
|||
|
||||
ZNpcsLocation oldLoc = model.getLocation();
|
||||
NpcLocation location = new NpcLocation(oldLoc.getX(), oldLoc.getY(), oldLoc.getZ(), oldLoc.getYaw(), oldLoc.getPitch());
|
||||
NpcImpl npc = new NpcImpl(configManager, packetFactory, textSerializer, oldLoc.getWorld(), typeRegistry.getByName(type), location);
|
||||
UUID uuid = model.getUuid() == null ? UUID.randomUUID() : model.getUuid();
|
||||
NpcImpl npc = new NpcImpl(uuid, configManager, packetFactory, textSerializer, oldLoc.getWorld(), typeRegistry.getByName(type), location);
|
||||
|
||||
HologramImpl hologram = npc.getHologram();
|
||||
hologram.setOffset(model.getHologramHeight());
|
||||
|
|
|
@ -2,10 +2,12 @@ package lol.pyr.znpcsplus.conversion.znpcs.model;
|
|||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class ZNpcsModel {
|
||||
private int id;
|
||||
private UUID uuid;
|
||||
private double hologramHeight;
|
||||
private String skinName;
|
||||
private String glowName;
|
||||
|
@ -20,6 +22,10 @@ public class ZNpcsModel {
|
|||
return id;
|
||||
}
|
||||
|
||||
public UUID getUuid() {
|
||||
return uuid;
|
||||
}
|
||||
|
||||
public double getHologramHeight() {
|
||||
return hologramHeight;
|
||||
}
|
||||
|
|
|
@ -25,19 +25,21 @@ public class NpcImpl extends Viewable implements Npc {
|
|||
private NpcLocation location;
|
||||
private NpcTypeImpl type;
|
||||
private final HologramImpl hologram;
|
||||
private final UUID uuid;
|
||||
|
||||
private final Map<EntityPropertyImpl<?>, Object> propertyMap = new HashMap<>();
|
||||
private final List<InteractionAction> actions = new ArrayList<>();
|
||||
|
||||
protected NpcImpl(ConfigManager configManager, LegacyComponentSerializer textSerializer, World world, NpcTypeImpl type, NpcLocation location, PacketFactory packetFactory) {
|
||||
this(configManager, packetFactory, textSerializer, world.getName(), type, location);
|
||||
protected NpcImpl(UUID uuid, ConfigManager configManager, LegacyComponentSerializer textSerializer, World world, NpcTypeImpl type, NpcLocation location, PacketFactory packetFactory) {
|
||||
this(uuid, configManager, packetFactory, textSerializer, world.getName(), type, location);
|
||||
}
|
||||
|
||||
public NpcImpl(ConfigManager configManager, PacketFactory packetFactory, LegacyComponentSerializer textSerializer, String world, NpcTypeImpl type, NpcLocation location) {
|
||||
public NpcImpl(UUID uuid, ConfigManager configManager, PacketFactory packetFactory, LegacyComponentSerializer textSerializer, String world, NpcTypeImpl type, NpcLocation location) {
|
||||
this.packetFactory = packetFactory;
|
||||
this.worldName = world;
|
||||
this.type = type;
|
||||
this.location = location;
|
||||
this.uuid = uuid;
|
||||
entity = new PacketEntity(packetFactory, this, type.getType(), location);
|
||||
hologram = new HologramImpl(configManager, packetFactory, textSerializer, location.withY(location.getY() + type.getHologramOffset()));
|
||||
}
|
||||
|
@ -76,6 +78,10 @@ public class NpcImpl extends Viewable implements Npc {
|
|||
return hologram;
|
||||
}
|
||||
|
||||
public UUID getUuid() {
|
||||
return uuid;
|
||||
}
|
||||
|
||||
public World getWorld() {
|
||||
return Bukkit.getWorld(worldName);
|
||||
}
|
||||
|
|
|
@ -14,10 +14,7 @@ import lol.pyr.znpcsplus.util.NpcLocation;
|
|||
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
|
||||
import org.bukkit.World;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class NpcRegistryImpl implements NpcRegistry {
|
||||
|
@ -26,7 +23,9 @@ public class NpcRegistryImpl implements NpcRegistry {
|
|||
private final ConfigManager configManager;
|
||||
private final LegacyComponentSerializer textSerializer;
|
||||
|
||||
private final Map<String, NpcEntryImpl> npcMap = new HashMap<>();
|
||||
private final List<NpcEntryImpl> npcList = new ArrayList<>();
|
||||
private final Map<String, NpcEntryImpl> npcIdLookupMap = new HashMap<>();
|
||||
private final Map<UUID, NpcEntryImpl> npcUuidLookupMap = new HashMap<>();
|
||||
|
||||
public NpcRegistryImpl(ConfigManager configManager, ZNpcsPlus plugin, PacketFactory packetFactory, ActionRegistry actionRegistry, TaskScheduler scheduler, NpcTypeRegistryImpl typeRegistry, EntityPropertyRegistryImpl propertyRegistry, LegacyComponentSerializer textSerializer) {
|
||||
this.textSerializer = textSerializer;
|
||||
|
@ -40,49 +39,73 @@ public class NpcRegistryImpl implements NpcRegistry {
|
|||
}
|
||||
}
|
||||
|
||||
private void register(NpcEntryImpl entry) {
|
||||
unregister(npcIdLookupMap.put(entry.getId(), entry));
|
||||
unregister(npcUuidLookupMap.put(entry.getNpc().getUuid(), entry));
|
||||
npcList.add(entry);
|
||||
}
|
||||
|
||||
private void unregister(NpcEntryImpl entry) {
|
||||
if (entry == null) return;
|
||||
npcList.remove(entry);
|
||||
NpcImpl one = npcIdLookupMap.remove(entry.getId()).getNpc();
|
||||
NpcImpl two = npcUuidLookupMap.remove(entry.getNpc().getUuid()).getNpc();
|
||||
if (one != null) one.delete();
|
||||
if (two != null && !Objects.equals(one, two)) two.delete();
|
||||
}
|
||||
|
||||
private void unregisterAll() {
|
||||
for (NpcEntryImpl entry : npcList) entry.getNpc().delete();
|
||||
npcList.clear();
|
||||
npcIdLookupMap.clear();
|
||||
npcUuidLookupMap.clear();
|
||||
}
|
||||
|
||||
public void registerAll(Collection<NpcEntryImpl> entries) {
|
||||
for (NpcEntryImpl entry : entries) {
|
||||
NpcEntryImpl old = npcMap.put(entry.getId(), entry);
|
||||
if (old != null) old.getNpc().delete();
|
||||
}
|
||||
for (NpcEntryImpl entry : entries) register(entry);
|
||||
}
|
||||
|
||||
public void reload() {
|
||||
for (NpcEntryImpl entry : npcMap.values()) entry.getNpc().delete();
|
||||
npcMap.clear();
|
||||
for (NpcEntryImpl entry : storage.loadNpcs()) npcMap.put(entry.getId(), entry);
|
||||
unregisterAll();
|
||||
registerAll(storage.loadNpcs());
|
||||
}
|
||||
|
||||
public void save() {
|
||||
storage.saveNpcs(npcMap.values().stream().filter(NpcEntryImpl::isSave).collect(Collectors.toList()));
|
||||
storage.saveNpcs(npcList.stream().filter(NpcEntryImpl::isSave).collect(Collectors.toList()));
|
||||
}
|
||||
|
||||
public NpcEntryImpl get(String id) {
|
||||
return npcMap.get(id.toLowerCase());
|
||||
@Override
|
||||
public NpcEntryImpl getById(String id) {
|
||||
return npcIdLookupMap.get(id.toLowerCase());
|
||||
}
|
||||
|
||||
@Override
|
||||
public NpcEntry getByUuid(UUID uuid) {
|
||||
return npcUuidLookupMap.get(uuid);
|
||||
}
|
||||
|
||||
public Collection<NpcEntryImpl> getAll() {
|
||||
return Collections.unmodifiableCollection(npcMap.values());
|
||||
return Collections.unmodifiableCollection(npcList);
|
||||
}
|
||||
|
||||
public Collection<NpcEntryImpl> getProcessable() {
|
||||
return Collections.unmodifiableCollection(npcMap.values().stream()
|
||||
return Collections.unmodifiableCollection(npcList.stream()
|
||||
.filter(NpcEntryImpl::isProcessed)
|
||||
.collect(Collectors.toList()));
|
||||
}
|
||||
|
||||
public Collection<NpcEntryImpl> getAllModifiable() {
|
||||
return Collections.unmodifiableCollection(npcMap.values().stream()
|
||||
return Collections.unmodifiableCollection(npcList.stream()
|
||||
.filter(NpcEntryImpl::isAllowCommandModification)
|
||||
.collect(Collectors.toList()));
|
||||
}
|
||||
|
||||
public NpcEntryImpl getByEntityId(int id) {
|
||||
return getAll().stream().filter(entry -> entry.getNpc().getEntity().getEntityId() == id).findFirst().orElse(null);
|
||||
return npcList.stream().filter(entry -> entry.getNpc().getEntity().getEntityId() == id).findFirst().orElse(null);
|
||||
}
|
||||
|
||||
public Collection<String> getAllIds() {
|
||||
return Collections.unmodifiableSet(npcMap.keySet());
|
||||
return Collections.unmodifiableSet(npcIdLookupMap.keySet());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -98,7 +121,7 @@ public class NpcRegistryImpl implements NpcRegistry {
|
|||
}
|
||||
|
||||
public Collection<String> getModifiableIds() {
|
||||
return Collections.unmodifiableSet(npcMap.entrySet().stream()
|
||||
return Collections.unmodifiableSet(npcIdLookupMap.entrySet().stream()
|
||||
.filter(entry -> entry.getValue().isAllowCommandModification())
|
||||
.map(Map.Entry::getKey)
|
||||
.collect(Collectors.toSet()));
|
||||
|
@ -110,17 +133,17 @@ public class NpcRegistryImpl implements NpcRegistry {
|
|||
|
||||
public NpcEntryImpl create(String id, World world, NpcTypeImpl type, NpcLocation location) {
|
||||
id = id.toLowerCase();
|
||||
if (npcMap.containsKey(id)) throw new IllegalArgumentException("An npc with the id " + id + " already exists!");
|
||||
NpcImpl npc = new NpcImpl(configManager, textSerializer, world, type, location, packetFactory);
|
||||
if (npcIdLookupMap.containsKey(id)) throw new IllegalArgumentException("An npc with the id " + id + " already exists!");
|
||||
NpcImpl npc = new NpcImpl(UUID.randomUUID(), configManager, textSerializer, world, type, location, packetFactory);
|
||||
NpcEntryImpl entry = new NpcEntryImpl(id, npc);
|
||||
npcMap.put(id, entry);
|
||||
npcIdLookupMap.put(id, entry);
|
||||
return entry;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(String id) {
|
||||
id = id.toLowerCase();
|
||||
if (!npcMap.containsKey(id)) return;
|
||||
npcMap.remove(id).getNpc().delete();
|
||||
if (!npcIdLookupMap.containsKey(id)) return;
|
||||
npcIdLookupMap.remove(id).getNpc().delete();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ public class NpcEntryParser extends ParserType<NpcEntryImpl> {
|
|||
|
||||
@Override
|
||||
public NpcEntryImpl parse(Deque<String> deque) throws CommandExecutionException {
|
||||
NpcEntryImpl entry = npcRegistry.get(deque.pop());
|
||||
NpcEntryImpl entry = npcRegistry.getById(deque.pop());
|
||||
if (entry == null || !entry.isAllowCommandModification()) throw new CommandExecutionException();
|
||||
return entry;
|
||||
}
|
||||
|
|
|
@ -48,7 +48,8 @@ public class YamlStorage implements NpcStorage {
|
|||
List<NpcEntryImpl> npcs = new ArrayList<>(files.length);
|
||||
for (File file : files) if (file.isFile() && file.getName().toLowerCase().endsWith(".yml")) {
|
||||
YamlConfiguration config = YamlConfiguration.loadConfiguration(file);
|
||||
NpcImpl npc = new NpcImpl(configManager, packetFactory, textSerializer, config.getString("world"),
|
||||
UUID uuid = config.contains("uuid") ? UUID.fromString(config.getString("uuid")) : UUID.randomUUID();
|
||||
NpcImpl npc = new NpcImpl(uuid, configManager, packetFactory, textSerializer, config.getString("world"),
|
||||
typeRegistry.getByName(config.getString("type")), deserializeLocation(config.getConfigurationSection("location")));
|
||||
|
||||
ConfigurationSection properties = config.getConfigurationSection("properties");
|
||||
|
@ -83,6 +84,7 @@ public class YamlStorage implements NpcStorage {
|
|||
config.set("allow-commands", entry.isAllowCommandModification());
|
||||
|
||||
NpcImpl npc = entry.getNpc();
|
||||
config.set("uuid", npc.getUuid().toString());
|
||||
config.set("world", npc.getWorldName());
|
||||
config.set("location", serializeLocation(npc.getLocation()));
|
||||
config.set("type", npc.getType().getName());
|
||||
|
|
Loading…
Reference in a new issue