Redirect left/right clicks for hologram NPCs

This commit is contained in:
fullwall 2020-07-17 09:52:00 +08:00
parent f973fdde9c
commit b14f0bac9c
6 changed files with 86 additions and 17 deletions

View File

@ -97,12 +97,12 @@ public class Citizens extends JavaPlugin implements CitizensPlugin {
@Override
public NPCRegistry createAnonymousNPCRegistry(NPCDataStore store) {
return new CitizensNPCRegistry(store);
return new CitizensNPCRegistry(store, "anonymous-" + UUID.randomUUID().toString());
}
@Override
public NPCRegistry createNamedNPCRegistry(String name, NPCDataStore store) {
NPCRegistry created = new CitizensNPCRegistry(store);
NPCRegistry created = new CitizensNPCRegistry(store, name);
storedRegistries.put(name, created);
return created;
}
@ -178,6 +178,8 @@ public class Citizens extends JavaPlugin implements CitizensPlugin {
@Override
public NPCRegistry getNamedNPCRegistry(String name) {
if (name.equals(npcRegistry.getName()))
return npcRegistry;
return storedRegistries.get(name);
}
@ -306,7 +308,7 @@ public class Citizens extends JavaPlugin implements CitizensPlugin {
return;
}
npcRegistry = new CitizensNPCRegistry(saves);
npcRegistry = new CitizensNPCRegistry(saves, "citizens-global-" + UUID.randomUUID().toString());
traitFactory = new CitizensTraitFactory();
selector = new NPCSelector(this);
speechFactory = new CitizensSpeechFactory();
@ -414,7 +416,7 @@ public class Citizens extends JavaPlugin implements CitizensPlugin {
despawnNPCs();
}
this.saves = store;
this.npcRegistry = new CitizensNPCRegistry(saves);
this.npcRegistry = new CitizensNPCRegistry(saves, "citizens-global-" + UUID.randomUUID().toString());
}
private void setupEconomy() {

View File

@ -95,6 +95,7 @@ import net.citizensnpcs.api.util.Messaging;
import net.citizensnpcs.api.util.SpigotUtil;
import net.citizensnpcs.editor.Editor;
import net.citizensnpcs.npc.skin.SkinUpdateTracker;
import net.citizensnpcs.trait.ClickRedirectTrait;
import net.citizensnpcs.trait.CommandTrait;
import net.citizensnpcs.trait.Controllable;
import net.citizensnpcs.trait.CurrentLocation;
@ -261,6 +262,12 @@ public class EventListen implements Listener {
return;
Player damager = (Player) damageEvent.getDamager();
if (npc.hasTrait(ClickRedirectTrait.class)) {
npc = npc.getTrait(ClickRedirectTrait.class).getRedirectNPC();
if (npc == null)
return;
}
NPCLeftClickEvent leftClickEvent = new NPCLeftClickEvent(npc, damager);
Bukkit.getPluginManager().callEvent(leftClickEvent);
if (npc.hasTrait(CommandTrait.class)) {
@ -417,19 +424,19 @@ public class EventListen implements Listener {
+ event.getReason().name());
}
skinUpdateTracker.onNPCDespawn(event.getNPC());
if (event.getNPC().getEntity() instanceof Player && Setting.USE_SCOREBOARD_TEAMS.asBoolean()) {
String teamName = event.getNPC().data().get(NPC.SCOREBOARD_FAKE_TEAM_NAME_METADATA, "");
if (teamName.length() > 0) {
Player player = (Player) event.getNPC().getEntity();
Team team = Util.getDummyScoreboard().getTeam(teamName);
if (team != null && team.hasPlayer(player)) {
if (team.getSize() == 1) {
Util.sendTeamPacketToOnlinePlayers(team, 1);
team.unregister();
} else {
team.removePlayer(player);
}
}
if (!Setting.USE_SCOREBOARD_TEAMS.asBoolean())
return;
String teamName = event.getNPC().data().get(NPC.SCOREBOARD_FAKE_TEAM_NAME_METADATA, "");
if (teamName.isEmpty())
return;
Player player = (Player) event.getNPC().getEntity();
Team team = Util.getDummyScoreboard().getTeam(teamName);
if (team != null && team.hasPlayer(player)) {
if (team.getSize() == 1) {
Util.sendTeamPacketToOnlinePlayers(team, 1);
team.unregister();
} else {
team.removePlayer(player);
}
}
}
@ -472,6 +479,11 @@ public class EventListen implements Listener {
if (npc == null || Util.isOffHand(event)) {
return;
}
if (npc.hasTrait(ClickRedirectTrait.class)) {
npc = npc.getTrait(ClickRedirectTrait.class).getRedirectNPC();
if (npc == null)
return;
}
Player player = event.getPlayer();
NPCRightClickEvent rightClickEvent = new NPCRightClickEvent(npc, player);
Bukkit.getPluginManager().callEvent(rightClickEvent);

View File

@ -32,12 +32,19 @@ import net.citizensnpcs.trait.MountTrait;
import net.citizensnpcs.util.NMS;
public class CitizensNPCRegistry implements NPCRegistry {
private final String name;
private final TIntObjectHashMap<NPC> npcs = new TIntObjectHashMap<NPC>();
private final NPCDataStore saves;
private final Map<UUID, NPC> uniqueNPCs = Maps.newHashMap();
public CitizensNPCRegistry(NPCDataStore store) {
saves = store;
name = "";
}
public CitizensNPCRegistry(NPCDataStore store, String registryName) {
saves = store;
name = registryName;
}
@Override
@ -129,6 +136,11 @@ public class CitizensNPCRegistry implements NPCRegistry {
return null;
}
@Override
public String getName() {
return name;
}
@Override
public NPC getNPC(Entity entity) {
if (entity == null)

View File

@ -24,6 +24,7 @@ import net.citizensnpcs.api.trait.trait.Speech;
import net.citizensnpcs.trait.Age;
import net.citizensnpcs.trait.Anchors;
import net.citizensnpcs.trait.ArmorStandTrait;
import net.citizensnpcs.trait.ClickRedirectTrait;
import net.citizensnpcs.trait.CommandTrait;
import net.citizensnpcs.trait.Controllable;
import net.citizensnpcs.trait.CurrentLocation;
@ -61,6 +62,7 @@ public class CitizensTraitFactory implements TraitFactory {
registerTrait(TraitInfo.create(Age.class));
registerTrait(TraitInfo.create(ArmorStandTrait.class));
registerTrait(TraitInfo.create(Anchors.class));
registerTrait(TraitInfo.create(ClickRedirectTrait.class));
registerTrait(TraitInfo.create(CommandTrait.class));
registerTrait(TraitInfo.create(Controllable.class));
registerTrait(TraitInfo.create(CurrentLocation.class));

View File

@ -0,0 +1,40 @@
package net.citizensnpcs.trait;
import java.util.UUID;
import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.api.trait.Trait;
import net.citizensnpcs.api.trait.TraitName;
import net.citizensnpcs.api.util.DataKey;
/**
* Redirects left and right clicks to another {@link NPC}.
*/
@TraitName("clickredirecttrait")
public class ClickRedirectTrait extends Trait {
private NPC redirectNPC;
public ClickRedirectTrait() {
super("clickredirecttrait");
}
public ClickRedirectTrait(NPC npc) {
this();
this.redirectNPC = npc;
}
public NPC getRedirectNPC() {
return redirectNPC;
}
@Override
public void load(DataKey key) {
redirectNPC = CitizensAPI.getNPCRegistry().getByUniqueIdGlobal(UUID.fromString(key.getString("uuid")));
}
@Override
public void save(DataKey key) {
key.setString("uuid", redirectNPC.getUniqueId().toString());
}
}

View File

@ -50,6 +50,7 @@ public class HologramTrait extends Trait {
private NPC createHologram(String line, double heightOffset) {
NPC hologramNPC = registry.createNPC(EntityType.ARMOR_STAND, line);
hologramNPC.addTrait(new ClickRedirectTrait(npc));
ArmorStandTrait trait = hologramNPC.getTrait(ArmorStandTrait.class);
trait.setVisible(false);
trait.setSmall(true);