Redirect left/right clicks for hologram NPCs
This commit is contained in:
parent
f973fdde9c
commit
b14f0bac9c
|
@ -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() {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue