11package me .tofaa .entitylib .npc ;
22
3+ import com .github .retrooper .packetevents .PacketEvents ;
4+ import com .github .retrooper .packetevents .protocol .player .ClientVersion ;
5+ import com .github .retrooper .packetevents .protocol .player .User ;
6+ import com .github .retrooper .packetevents .protocol .world .Location ;
7+ import com .github .retrooper .packetevents .wrapper .play .server .WrapperPlayServerPlayerInfo ;
8+ import com .github .retrooper .packetevents .wrapper .play .server .WrapperPlayServerPlayerInfoRemove ;
9+ import me .tofaa .entitylib .wrapper .WrapperEntity ;
10+ import org .bukkit .World ;
11+ import org .bukkit .entity .Player ;
312import org .bukkit .event .EventHandler ;
413import org .bukkit .event .Listener ;
514import org .bukkit .event .player .PlayerJoinEvent ;
615import org .bukkit .event .player .PlayerQuitEvent ;
16+ import org .bukkit .event .player .PlayerTeleportEvent ;
17+
18+ import java .util .UUID ;
719
820public class NPCPlayerListener implements Listener {
921
1022 @ EventHandler
1123 public void onPlayerJoin (PlayerJoinEvent event ) {
12- org .bukkit .World playerWorld = event .getPlayer ().getWorld ();
24+ Player player = event .getPlayer ();
25+ World playerWorld = player .getWorld ();
26+ UUID playerId = player .getUniqueId ();
27+ org .bukkit .Location playerLoc = player .getLocation ();
28+
1329 for (NPC npc : NPCRegistry .getAll ()) {
1430 if (!npc .isSpawned () || !npc .getEntity ().isPresent ()) continue ;
15-
16- org . bukkit . World npcWorld = npc .getWorld ();
31+
32+ World npcWorld = npc .getWorld ();
1733 if (npcWorld != null && npcWorld != playerWorld ) continue ;
1834
19- npc .getEntity ().get ().addViewer (event .getPlayer ().getUniqueId ());
20-
35+ double viewDistance = npc .getOptions ().getViewDistance ();
36+ Location npcLoc = npc .getPosition ();
37+ if (viewDistance > 0 && !isPlayerInRange (playerLoc , npcLoc , viewDistance )) continue ;
38+
39+ npc .getEntity ().get ().addViewer (playerId );
40+
41+ npc .getSittingEntity ().ifPresent (sitting -> sitting .addViewer (playerId ));
42+
2143 if (npc .getHologram ().isPresent ()) {
22- npc .getHologram ().get ().addViewer (event . getPlayer (). getUniqueId () );
44+ npc .getHologram ().get ().addViewer (playerId );
2345 }
46+
47+ npc .doStupidDogshitForOldClients (player );
2448 }
2549 }
2650
2751 @ EventHandler
2852 public void onPlayerQuit (PlayerQuitEvent event ) {
53+ Player player = event .getPlayer ();
54+ UUID playerId = player .getUniqueId ();
55+
2956 for (NPC npc : NPCRegistry .getAll ()) {
30- if (npc .isSpawned () && npc .getEntity ().isPresent ()) {
31- npc .getEntity ().get ().removeViewer (event .getPlayer ().getUniqueId ());
32-
33- if (npc .getHologram ().isPresent ()) {
34- npc .getHologram ().get ().removeViewer (event .getPlayer ().getUniqueId ());
35- }
57+ if (!npc .isSpawned () || !npc .getEntity ().isPresent ()) continue ;
58+
59+ npc .getEntity ().get ().removeViewer (playerId );
60+
61+ npc .getSittingEntity ().ifPresent (sitting -> sitting .removeViewer (playerId ));
62+
63+ if (npc .getHologram ().isPresent ()) {
64+ npc .getHologram ().get ().removeViewer (playerId );
3665 }
3766 }
3867 }
68+
69+ @ EventHandler
70+ public void onPlayerTeleport (PlayerTeleportEvent event ) {
71+ if (event .isCancelled ()) return ;
72+
73+ Player player = event .getPlayer ();
74+ org .bukkit .World playerWorld = player .getWorld ();
75+ UUID playerId = player .getUniqueId ();
76+ org .bukkit .Location playerLoc = event .getTo ();
77+
78+ for (NPC npc : NPCRegistry .getAll ()) {
79+ if (!npc .isSpawned () || !npc .getEntity ().isPresent ()) continue ;
80+
81+ World npcWorld = npc .getWorld ();
82+ if (npcWorld != null && npcWorld != playerWorld ) continue ;
83+
84+ double viewDistance = npc .getOptions ().getViewDistance ();
85+ Location npcLoc = npc .getPosition ();
86+ boolean inRange = viewDistance <= 0 || isPlayerInRange (playerLoc , npcLoc , viewDistance );
87+
88+ npc .getEntity ().ifPresent (entity -> {
89+ if (inRange ) {
90+ if (!entity .getViewers ().contains (playerId )) {
91+ entity .addViewer (playerId );
92+ }
93+ } else {
94+ if (entity .getViewers ().contains (playerId )) {
95+ entity .removeViewer (playerId );
96+ }
97+ }
98+ });
99+
100+ npc .getSittingEntity ().ifPresent (sitting -> {
101+ if (inRange ) {
102+ if (!sitting .getViewers ().contains (playerId )) {
103+ sitting .addViewer (playerId );
104+ }
105+ } else {
106+ if (sitting .getViewers ().contains (playerId )) {
107+ sitting .removeViewer (playerId );
108+ }
109+ }
110+ });
111+
112+ npc .getHologram ().ifPresent (hologram -> {
113+ if (inRange ) {
114+ if (!hologram .getEntity ().getViewers ().contains (playerId )) {
115+ hologram .addViewer (playerId );
116+ }
117+ } else {
118+ if (hologram .getEntity ().getViewers ().contains (playerId )) {
119+ hologram .removeViewer (playerId );
120+ }
121+ }
122+ });
123+ }
124+ }
125+
126+ private boolean isPlayerInRange (org .bukkit .Location playerLoc , Location npcLoc , double range ) {
127+ double dx = playerLoc .getX () - npcLoc .getX ();
128+ double dy = playerLoc .getY () - npcLoc .getY ();
129+ double dz = playerLoc .getZ () - npcLoc .getZ ();
130+ return (dx * dx + dy * dy + dz * dz ) <= (range * range );
131+ }
39132}
0 commit comments