Skip to content

Commit 4ad4c7f

Browse files
committed
Update to 2.1.0; Add player join and leave compat for customentities
1 parent b88a859 commit 4ad4c7f

File tree

24 files changed

+221
-19
lines changed

24 files changed

+221
-19
lines changed

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<modelVersion>4.0.0</modelVersion>
77
<groupId>net.sourcewriters.minecraft</groupId>
88
<artifactId>vcompat</artifactId>
9-
<version>2.0.1</version>
9+
<version>2.1.0</version>
1010
<name>vCompat</name>
1111
<distributionManagement>
1212
<repository>

src/main/java/net/sourcewriters/minecraft/vcompat/entity/Hologram.java

+16
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,22 @@ public void teleport(Location location) {
116116
* Entity handle
117117
*/
118118

119+
@Override
120+
public Hologram updateVisibility() {
121+
int amount;
122+
synchronized (entities) {
123+
amount = entities.size();
124+
}
125+
for (int index = 0; index < amount; index++) {
126+
NmsArmorStand entity;
127+
synchronized (entities) {
128+
entity = entities.get(index);
129+
}
130+
entity.updateVisibility();
131+
}
132+
return this;
133+
}
134+
119135
public Hologram show(Player... players) {
120136
int amount;
121137
synchronized (entities) {

src/main/java/net/sourcewriters/minecraft/vcompat/entity/handler/CustomEntity.java

+9
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.UUID;
44

55
import org.bukkit.Location;
6+
import org.bukkit.entity.Player;
67

78
public abstract class CustomEntity {
89

@@ -67,5 +68,13 @@ public Location getLocation() {
6768
public abstract void setInvulnerable(boolean invulnerable);
6869

6970
public abstract void teleport(Location location);
71+
72+
public abstract CustomEntity updateVisibility();
73+
74+
public abstract CustomEntity show(Player... players);
75+
76+
public abstract CustomEntity hide(Player... players);
77+
78+
public abstract boolean isShown(Player player);
7079

7180
}

src/main/java/net/sourcewriters/minecraft/vcompat/entity/handler/EntityManager.java

+45-1
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,22 @@
66
import java.util.Optional;
77
import java.util.UUID;
88

9-
public class EntityManager {
9+
import org.bukkit.entity.Player;
10+
11+
import net.sourcewriters.minecraft.vcompat.listener.PlayerListener;
12+
import net.sourcewriters.minecraft.vcompat.listener.handler.IPlayerHandler;
13+
import net.sourcewriters.minecraft.vcompat.reflection.entity.NmsPlayer;
14+
15+
public class EntityManager implements IPlayerHandler {
1016

1117
private final ArrayList<CustomEntity> entities = new ArrayList<>();
1218

19+
private boolean registered = false;
20+
21+
public EntityManager() {
22+
start();
23+
}
24+
1325
public CustomEntity create(EntityType type) {
1426
return create(REGISTRY.getBuilderOrNull(type));
1527
}
@@ -68,4 +80,36 @@ protected UUID generateId() {
6880
return current;
6981
}
7082

83+
/*
84+
* Listening
85+
*/
86+
87+
public void start() {
88+
if (registered) {
89+
return;
90+
}
91+
registered = true;
92+
PlayerListener.registerHandler(this);
93+
}
94+
95+
public void stop() {
96+
if (!registered) {
97+
return;
98+
}
99+
registered = false;
100+
PlayerListener.unregisterHandler(this);
101+
}
102+
103+
@Override
104+
public void onJoin(NmsPlayer player) {
105+
Player bukkitPlayer = player.getBukkitPlayer();
106+
CustomEntity[] entities = getAll();
107+
for (CustomEntity entity : entities) {
108+
if (!entity.isShown(bukkitPlayer)) {
109+
continue;
110+
}
111+
entity.hide(bukkitPlayer).show(bukkitPlayer);
112+
}
113+
}
114+
71115
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package net.sourcewriters.minecraft.vcompat.listener;
2+
3+
import java.util.ArrayList;
4+
import java.util.Collections;
5+
import java.util.HashSet;
6+
import java.util.List;
7+
import java.util.Set;
8+
import java.util.UUID;
9+
10+
import org.bukkit.Bukkit;
11+
import org.bukkit.entity.Player;
12+
import org.bukkit.event.EventHandler;
13+
import org.bukkit.event.EventPriority;
14+
import org.bukkit.event.Listener;
15+
import org.bukkit.event.player.PlayerJoinEvent;
16+
import org.bukkit.event.player.PlayerQuitEvent;
17+
import org.bukkit.plugin.Plugin;
18+
19+
import net.sourcewriters.minecraft.vcompat.listener.handler.IPlayerHandler;
20+
import net.sourcewriters.minecraft.vcompat.reflection.PlayerProvider;
21+
import net.sourcewriters.minecraft.vcompat.reflection.VersionControl;
22+
import net.sourcewriters.minecraft.vcompat.reflection.entity.NmsPlayer;
23+
24+
public final class PlayerListener implements Listener {
25+
26+
public static final PlayerListener INSTANCE = new PlayerListener();
27+
28+
public static void register(Plugin plugin) {
29+
Bukkit.getPluginManager().registerEvents(INSTANCE, plugin);
30+
}
31+
32+
public static void registerHandler(IPlayerHandler handler) {
33+
INSTANCE.register(handler);
34+
}
35+
36+
public static void unregisterHandler(IPlayerHandler handler) {
37+
INSTANCE.unregister(handler);
38+
}
39+
40+
private final PlayerProvider<?> provider = VersionControl.get().getPlayerProvider();
41+
42+
private final List<IPlayerHandler> handlers = Collections.synchronizedList(new ArrayList<>());
43+
private final Set<UUID> set = Collections.synchronizedSet(new HashSet<>());
44+
45+
public void register(IPlayerHandler handler) {
46+
if (handlers.contains(handler)) {
47+
return;
48+
}
49+
handlers.add(handler);
50+
}
51+
52+
public void unregister(IPlayerHandler handler) {
53+
if (!handlers.contains(handler)) {
54+
return;
55+
}
56+
handlers.remove(handler);
57+
}
58+
59+
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
60+
public void onJoin(PlayerJoinEvent event) {
61+
Player player = event.getPlayer();
62+
if (set.contains(player.getUniqueId())) {
63+
return;
64+
}
65+
set.add(player.getUniqueId());
66+
NmsPlayer nmsPlayer = provider.getPlayer(player);
67+
for (IPlayerHandler handler : handlers) {
68+
handler.onJoin(nmsPlayer);
69+
}
70+
}
71+
72+
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
73+
public void onQuit(PlayerQuitEvent event) {
74+
Player player = event.getPlayer();
75+
if (!set.contains(player.getUniqueId())) {
76+
return;
77+
}
78+
set.remove(player.getUniqueId());
79+
NmsPlayer nmsPlayer = provider.getPlayer(player);
80+
for (IPlayerHandler handler : handlers) {
81+
handler.onLeave(nmsPlayer);
82+
}
83+
}
84+
85+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package net.sourcewriters.minecraft.vcompat.listener.handler;
2+
3+
import net.sourcewriters.minecraft.vcompat.reflection.entity.NmsPlayer;
4+
5+
public interface IPlayerHandler {
6+
7+
default void onJoin(NmsPlayer player) {}
8+
9+
default void onLeave(NmsPlayer player) {}
10+
11+
}

src/main/java/net/sourcewriters/minecraft/vcompat/reflection/PlayerProvider.java

+5
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.bukkit.Bukkit;
99
import org.bukkit.entity.Player;
1010

11+
import net.sourcewriters.minecraft.vcompat.reflection.data.persistence.PersistentContainer;
1112
import net.sourcewriters.minecraft.vcompat.reflection.entity.NmsPlayer;
1213

1314
public abstract class PlayerProvider<V extends VersionControl> extends VersionHandler<V> {
@@ -30,6 +31,10 @@ public NmsPlayer getPlayer(Player player) {
3031
if (players.containsKey(player.getUniqueId())) {
3132
NmsPlayer nmsPlayer = players.get(player.getUniqueId());
3233
if (nmsPlayer.getBukkitPlayer() != player) {
34+
Object container = nmsPlayer.getDataAdapter().getHandle();
35+
if (container instanceof PersistentContainer) {
36+
((PersistentContainer<?>) container).delete();
37+
}
3338
players.put(player.getUniqueId(), nmsPlayer = createPlayer(player));
3439
}
3540
return nmsPlayer;

src/main/java/net/sourcewriters/minecraft/vcompat/reflection/data/persistence/PersistentContainer.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -142,11 +142,11 @@ protected void read(NbtCompound compound) {
142142
super.fromNbt(compound);
143143
}
144144

145-
protected void shutdown() {
145+
public void shutdown() {
146146
observer.shutdown();
147147
}
148148

149-
protected void delete() {
149+
public void delete() {
150150
lock.writeLock().lock();
151151
observer.save();
152152
super.getRoot().clear();

src/main/java/net/sourcewriters/minecraft/vcompat/reflection/entity/NmsEntity.java

+2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ public interface NmsEntity {
4242
void setLocation(Location location);
4343

4444
Location getLocation();
45+
46+
void updateVisibility();
4547

4648
boolean isShown(Player player);
4749

src/main/java/net/sourcewriters/minecraft/vcompat/reflection/provider/v1_10_R1/entity/Entity1_10_R1.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public NmsBoundingBox getBoundingBox() {
5757
@Override
5858
public void setCustomName(String name) {
5959
handle.setCustomName(name);
60+
updateVisibility();
6061
}
6162

6263
@Override
@@ -131,7 +132,8 @@ public Location getLocation() {
131132
return new Location(handle.getWorld().getWorld(), vector.x, vector.y, vector.z);
132133
}
133134

134-
private void updateVisibility() {
135+
@Override
136+
public void updateVisibility() {
135137
if (visible.isEmpty()) {
136138
return;
137139
}

src/main/java/net/sourcewriters/minecraft/vcompat/reflection/provider/v1_11_R1/entity/Entity1_11_R1.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public NmsBoundingBox getBoundingBox() {
5757
@Override
5858
public void setCustomName(String name) {
5959
handle.setCustomName(name);
60+
updateVisibility();
6061
}
6162

6263
@Override
@@ -131,7 +132,8 @@ public Location getLocation() {
131132
return new Location(handle.getWorld().getWorld(), vector.x, vector.y, vector.z);
132133
}
133134

134-
private void updateVisibility() {
135+
@Override
136+
public void updateVisibility() {
135137
if (visible.isEmpty()) {
136138
return;
137139
}

src/main/java/net/sourcewriters/minecraft/vcompat/reflection/provider/v1_12_R1/entity/Entity1_12_R1.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public NmsBoundingBox getBoundingBox() {
5757
@Override
5858
public void setCustomName(String name) {
5959
handle.setCustomName(name);
60+
updateVisibility();
6061
}
6162

6263
@Override
@@ -131,7 +132,8 @@ public Location getLocation() {
131132
return new Location(handle.getWorld().getWorld(), vector.x, vector.y, vector.z);
132133
}
133134

134-
private void updateVisibility() {
135+
@Override
136+
public void updateVisibility() {
135137
if (visible.isEmpty()) {
136138
return;
137139
}

src/main/java/net/sourcewriters/minecraft/vcompat/reflection/provider/v1_13_R1/entity/Entity1_13_R1.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public NmsBoundingBox getBoundingBox() {
5858
@Override
5959
public void setCustomName(String name) {
6060
handle.setCustomName(CraftChatMessage.fromStringOrNull(name));
61+
updateVisibility();
6162
}
6263

6364
@Override
@@ -132,7 +133,8 @@ public Location getLocation() {
132133
return new Location(handle.getWorld().getWorld(), vector.x, vector.y, vector.z);
133134
}
134135

135-
private void updateVisibility() {
136+
@Override
137+
public void updateVisibility() {
136138
if (visible.isEmpty()) {
137139
return;
138140
}

src/main/java/net/sourcewriters/minecraft/vcompat/reflection/provider/v1_13_R2/entity/Entity1_13_R2.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public NmsBoundingBox getBoundingBox() {
5858
@Override
5959
public void setCustomName(String name) {
6060
handle.setCustomName(CraftChatMessage.fromStringOrNull(name));
61+
updateVisibility();
6162
}
6263

6364
@Override
@@ -132,7 +133,8 @@ public Location getLocation() {
132133
return new Location(handle.getWorld().getWorld(), vector.x, vector.y, vector.z);
133134
}
134135

135-
private void updateVisibility() {
136+
@Override
137+
public void updateVisibility() {
136138
if (visible.isEmpty()) {
137139
return;
138140
}

src/main/java/net/sourcewriters/minecraft/vcompat/reflection/provider/v1_14_R1/entity/Entity1_14_R1.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public NmsBoundingBox getBoundingBox() {
5757
@Override
5858
public void setCustomName(String name) {
5959
handle.setCustomName(CraftChatMessage.fromStringOrNull(name));
60+
updateVisibility();
6061
}
6162

6263
@Override
@@ -131,7 +132,8 @@ public Location getLocation() {
131132
return new Location(handle.getWorld().getWorld(), vector.x, vector.y, vector.z);
132133
}
133134

134-
private void updateVisibility() {
135+
@Override
136+
public void updateVisibility() {
135137
if (visible.isEmpty()) {
136138
return;
137139
}

src/main/java/net/sourcewriters/minecraft/vcompat/reflection/provider/v1_15_R1/entity/Entity1_15_R1.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public NmsBoundingBox getBoundingBox() {
5757
@Override
5858
public void setCustomName(String name) {
5959
handle.setCustomName(CraftChatMessage.fromStringOrNull(name));
60+
updateVisibility();
6061
}
6162

6263
@Override
@@ -131,7 +132,8 @@ public Location getLocation() {
131132
return new Location(handle.getWorld().getWorld(), vector.x, vector.y, vector.z);
132133
}
133134

134-
private void updateVisibility() {
135+
@Override
136+
public void updateVisibility() {
135137
if (visible.isEmpty()) {
136138
return;
137139
}

0 commit comments

Comments
 (0)