SteamWar/SpigotCore
Archiviert
13
0

Add click callback for REntityServer
Einige Prüfungen sind fehlgeschlagen
SteamWarCI Build failed

Dieser Commit ist enthalten in:
yoyosource 2023-02-03 17:59:58 +01:00
Ursprung 447fe7b6b3
Commit 740ebc0c1d

Datei anzeigen

@ -19,8 +19,10 @@
package de.steamwar.entity; package de.steamwar.entity;
import com.comphenix.tinyprotocol.Reflection;
import com.comphenix.tinyprotocol.TinyProtocol; import com.comphenix.tinyprotocol.TinyProtocol;
import de.steamwar.core.Core; import de.steamwar.core.Core;
import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -33,7 +35,9 @@ import org.bukkit.event.player.PlayerQuitEvent;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.Consumer; import java.util.function.Consumer;
@ -42,13 +46,41 @@ public class REntityServer implements Listener {
private static final HashSet<REntity> emptyEntities = new HashSet<>(0); private static final HashSet<REntity> emptyEntities = new HashSet<>(0);
private static final HashSet<Player> emptyPlayers = new HashSet<>(0); private static final HashSet<Player> emptyPlayers = new HashSet<>(0);
private static final Class<?> useEntity = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInUseEntity");
private static final Reflection.FieldAccessor<Integer> useEntityTarget = Reflection.getField(useEntity, int.class, 0);
private static final Reflection.FieldAccessor<Integer> useEntityAction = Reflection.getField(useEntity, int.class, 1);
private final HashMap<Integer, REntity> entityMap = new HashMap<>();
private final HashMap<Long, HashSet<REntity>> entities = new HashMap<>(); private final HashMap<Long, HashSet<REntity>> entities = new HashMap<>();
private final HashMap<Long, Set<Player>> players = new HashMap<>(); private final HashMap<Long, Set<Player>> players = new HashMap<>();
private final HashMap<Player, Location> lastLocation = new HashMap<>(); private final HashMap<Player, Location> lastLocation = new HashMap<>();
private final HashMap<Player, Integer> viewDistance = new HashMap<>(); private final HashMap<Player, Integer> viewDistance = new HashMap<>();
private EntityActionListener callback = null;
private BiFunction<Player, Object, Object> filter = (player, packet) -> {
if (callback == null) return packet;
int target = useEntityTarget.get(packet);
if (!entityMap.containsKey(target)) return packet;
REntity entity = entityMap.get(target);
int action = useEntityAction.get(packet);
if (action == 2) action = 0;
int finalAction = action;
Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> {
callback.onAction(player, entity, finalAction == 0 ? EntityAction.INTERACT : EntityAction.ATTACK);
}, 0);
return null;
};
public REntityServer() { public REntityServer() {
Core.getInstance().getServer().getPluginManager().registerEvents(this, Core.getInstance()); Core.getInstance().getServer().getPluginManager().registerEvents(this, Core.getInstance());
TinyProtocol.instance.addFilter(useEntity, filter);
}
public void setCallback(EntityActionListener callback) {
this.callback = callback;
} }
public void addPlayer(Player player) { public void addPlayer(Player player) {
@ -64,6 +96,7 @@ public class REntityServer implements Listener {
} }
public void close() { public void close() {
TinyProtocol.instance.removeFilter(useEntity, filter);
for(Player player : lastLocation.keySet().toArray(new Player[0])) { for(Player player : lastLocation.keySet().toArray(new Player[0])) {
removePlayer(player); removePlayer(player);
} }
@ -71,6 +104,7 @@ public class REntityServer implements Listener {
} }
void addEntity(REntity entity) { void addEntity(REntity entity) {
entityMap.put(entity.entityId, entity);
addEntityToChunk(entity); addEntityToChunk(entity);
entity.spawn(packet -> updateEntity(entity, packet)); entity.spawn(packet -> updateEntity(entity, packet));
} }
@ -104,6 +138,7 @@ public class REntityServer implements Listener {
void removeEntity(REntity entity) { void removeEntity(REntity entity) {
entity.despawn(packet -> updateEntity(entity, packet)); entity.despawn(packet -> updateEntity(entity, packet));
removeEntityFromChunk(entity); removeEntityFromChunk(entity);
entityMap.put(entity.entityId, entity);
} }
private void addEntityToChunk(REntity entity) { private void addEntityToChunk(REntity entity) {
@ -226,4 +261,13 @@ public class REntityServer implements Listener {
private long chunkToId(int x, int z) { private long chunkToId(int x, int z) {
return ((long) x << 32) + z; return ((long) x << 32) + z;
} }
public enum EntityAction {
INTERACT,
ATTACK,
}
public interface EntityActionListener {
void onAction(Player player, REntity entity, EntityAction action);
}
} }