Skip to content

Commit a7248a2

Browse files
committed
Some fixes
1 parent 5172767 commit a7248a2

4 files changed

Lines changed: 167 additions & 12 deletions

File tree

spaceNPC/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ repositories {
1515
maven("https://repo.papermc.io/repository/maven-public/")
1616
maven("https://maven.pvphub.me/tofaa")
1717
maven("https://repo.codemc.io/repository/maven-releases/")
18+
maven("https://repo.viaversion.com")
1819
}
1920

2021
dependencies {
@@ -24,6 +25,7 @@ dependencies {
2425
implementation(project(":platforms:spigot"))
2526
implementation(project(":movement-engine"))
2627
implementation(project(":platforms:movement"))
28+
compileOnly("com.viaversion:viaversion-api:5.8.1") // Replace the version
2729
}
2830

2931
tasks {

spaceNPC/src/main/java/me/tofaa/entitylib/npc/NPC.java

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,24 @@
11
package me.tofaa.entitylib.npc;
22

3+
import com.github.retrooper.packetevents.PacketEvents;
34
import com.github.retrooper.packetevents.PacketEventsAPI;
5+
import com.github.retrooper.packetevents.netty.channel.ChannelHelper;
46
import com.github.retrooper.packetevents.protocol.entity.type.EntityType;
57
import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes;
8+
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
69
import com.github.retrooper.packetevents.protocol.player.GameMode;
10+
import com.github.retrooper.packetevents.protocol.player.User;
711
import com.github.retrooper.packetevents.protocol.player.UserProfile;
812
import com.github.retrooper.packetevents.protocol.world.Location;
913

1014
import java.util.*;
1115
import java.util.concurrent.ConcurrentHashMap;
1216

17+
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
1318
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerEntityHeadLook;
19+
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerPlayerInfoRemove;
20+
import io.github.retrooper.packetevents.util.viaversion.ViaVersionAccessor;
21+
import io.github.retrooper.packetevents.util.viaversion.ViaVersionUtil;
1422
import me.tofaa.entitylib.EntityLib;
1523
import me.tofaa.entitylib.meta.EntityMeta;
1624
import me.tofaa.entitylib.meta.other.ArmorStandMeta;
@@ -348,6 +356,53 @@ private void updateHologram() {
348356
}
349357
}
350358

359+
public void doStupidDogshitForOldClients(
360+
Player player
361+
) {
362+
363+
User user = PacketEvents.getAPI().getPlayerManager().getUser(player);
364+
SpaceNPC.getInstance().getServer().getScheduler().runTaskLater(SpaceNPC.getInstance(), () -> {
365+
if (!checkIfStupidDogshitPlayerIsOldClient(player ) || !getEntity().isPresent()) {
366+
return;
367+
}
368+
WrapperPlayServerPlayerInfoRemove packet = new WrapperPlayServerPlayerInfoRemove(
369+
getEntity().get().getUuid()
370+
);
371+
user.sendPacket(packet);
372+
}, 20);
373+
374+
}
375+
376+
public boolean checkIfStupidDogshitPlayerIsOldClient(
377+
Player player
378+
) {
379+
ViaVersionUtil.checkIfViaIsPresent();
380+
if (ViaVersionUtil.isAvailable()) {
381+
int pv = ViaVersionUtil.getProtocolVersion(player);
382+
if (pv < ClientVersion.V_1_18_2.getProtocolVersion()) {
383+
return true;
384+
}
385+
}
386+
387+
return false;
388+
}
389+
390+
public static void sendPacketSilentlySkipTranslation(User user, Object byteBuf) {
391+
if (ChannelHelper.isOpen(user.getChannel())) {
392+
ChannelHelper.writeAndFlushInContext(user.getChannel(), "via-encoder", byteBuf);
393+
}
394+
else {
395+
// ((ByteBuf)byteBuf).release()
396+
// W memory leak
397+
}
398+
}
399+
400+
public static void sendPacketSilentlySkipTranslation(User user, PacketWrapper<?> wrapper) {
401+
wrapper.prepareForSend(user.getChannel(), true, true);
402+
sendPacketSilentlySkipTranslation(user, wrapper.buffer);
403+
}
404+
405+
351406
public void updateHeadRotationForViewers(Location npcLocation) {
352407
if (entity == null || !spawned) return;
353408

@@ -401,6 +456,10 @@ public void removeViewer(@NotNull UUID playerId) {
401456
return Optional.ofNullable(hologram);
402457
}
403458

459+
public @NotNull Optional<WrapperEntity> getSittingEntity() {
460+
return Optional.ofNullable(sittingEntity);
461+
}
462+
404463
public @NotNull NPCOptions getOptions() {
405464
return options;
406465
}
Lines changed: 105 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,132 @@
11
package 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;
312
import org.bukkit.event.EventHandler;
413
import org.bukkit.event.Listener;
514
import org.bukkit.event.player.PlayerJoinEvent;
615
import org.bukkit.event.player.PlayerQuitEvent;
16+
import org.bukkit.event.player.PlayerTeleportEvent;
17+
18+
import java.util.UUID;
719

820
public 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
}

spaceNPC/src/main/resources/plugin.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ version: 1.0.0
33
main: me.tofaa.entitylib.npc.SpaceNPC
44
api-version: 1.21
55
depend: [packetevents]
6+
softdepend: [ViaVersion]

0 commit comments

Comments
 (0)