Skip to content

Commit

Permalink
Redirect left/right clicks for hologram NPCs
Browse files Browse the repository at this point in the history
  • Loading branch information
fullwall committed Jul 17, 2020
1 parent f973fdd commit b14f0ba
Show file tree
Hide file tree
Showing 6 changed files with 86 additions and 17 deletions.
10 changes: 6 additions & 4 deletions main/src/main/java/net/citizensnpcs/Citizens.java
Expand Up @@ -97,12 +97,12 @@ public void setTexture(String string, SkullMeta meta) {

@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;
}
Expand Down Expand Up @@ -178,6 +178,8 @@ public net.citizensnpcs.api.npc.NPCSelector getDefaultNPCSelector() {

@Override
public NPCRegistry getNamedNPCRegistry(String name) {
if (name.equals(npcRegistry.getName()))
return npcRegistry;
return storedRegistries.get(name);
}

Expand Down Expand Up @@ -306,7 +308,7 @@ public void onEnable() {
return;
}

npcRegistry = new CitizensNPCRegistry(saves);
npcRegistry = new CitizensNPCRegistry(saves, "citizens-global-" + UUID.randomUUID().toString());
traitFactory = new CitizensTraitFactory();
selector = new NPCSelector(this);
speechFactory = new CitizensSpeechFactory();
Expand Down Expand Up @@ -414,7 +416,7 @@ public void setDefaultNPCDataStore(NPCDataStore store) {
despawnNPCs();
}
this.saves = store;
this.npcRegistry = new CitizensNPCRegistry(saves);
this.npcRegistry = new CitizensNPCRegistry(saves, "citizens-global-" + UUID.randomUUID().toString());
}

private void setupEconomy() {
Expand Down
38 changes: 25 additions & 13 deletions main/src/main/java/net/citizensnpcs/EventListen.java
Expand Up @@ -95,6 +95,7 @@
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;
Expand Down Expand Up @@ -261,6 +262,12 @@ public void onEntityDamage(EntityDamageEvent event) {
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)) {
Expand Down Expand Up @@ -417,19 +424,19 @@ public void onNPCDespawn(NPCDespawnEvent event) {
+ 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);
}
}
}
Expand Down Expand Up @@ -472,6 +479,11 @@ public void onPlayerInteractEntity(PlayerInteractEntityEvent event) {
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);
Expand Down
12 changes: 12 additions & 0 deletions main/src/main/java/net/citizensnpcs/npc/CitizensNPCRegistry.java
Expand Up @@ -32,12 +32,19 @@
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
Expand Down Expand Up @@ -129,6 +136,11 @@ public NPC getByUniqueIdGlobal(UUID uuid) {
return null;
}

@Override
public String getName() {
return name;
}

@Override
public NPC getNPC(Entity entity) {
if (entity == null)
Expand Down
Expand Up @@ -24,6 +24,7 @@
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;
Expand Down Expand Up @@ -61,6 +62,7 @@ public CitizensTraitFactory() {
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));
Expand Down
40 changes: 40 additions & 0 deletions main/src/main/java/net/citizensnpcs/trait/ClickRedirectTrait.java
@@ -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());
}
}
Expand Up @@ -50,6 +50,7 @@ public void clear() {

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);
Expand Down

0 comments on commit b14f0ba

Please sign in to comment.