start work

This commit is contained in:
Pyrbu 2023-04-23 20:24:31 +01:00
parent e23867f0ef
commit c13c6c7bf7
4 changed files with 4 additions and 247 deletions

@ -1,100 +1,4 @@
package lol.pyr.znpcsplus.npc; package lol.pyr.znpcsplus.npc;
import lol.pyr.znpcsplus.entity.PacketEntity;
import lol.pyr.znpcsplus.entity.PacketLocation;
import lol.pyr.znpcsplus.properties.NPCProperty;
import lol.pyr.znpcsplus.properties.NPCPropertyKey;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.entity.Player;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class NPC { public class NPC {
private final Set<Player> viewers = new HashSet<>();
private final String worldName;
private PacketEntity entity;
private PacketLocation location;
private NPCType type;
private final Map<NPCPropertyKey, NPCProperty> propertyMap = new HashMap<>();
public NPC(World world, NPCType type, PacketLocation location) {
this.worldName = world.getName();
this.type = type;
this.location = location;
entity = new PacketEntity(type.getType(), location); // TODO: Entity ID Provider
}
public void setType(NPCType type) {
_hideAll();
this.type = type;
entity = new PacketEntity(type.getType(), entity.getLocation());
_showAll();
}
public NPCType getType() {
return type;
}
public PacketLocation getLocation() {
return location;
}
public void setLocation(PacketLocation location) {
this.location = location;
entity.setLocation(location, viewers);
}
public World getWorld() {
return Bukkit.getWorld(worldName);
}
public void delete() {
_hideAll();
viewers.clear();
}
public void show(Player player) {
if (viewers.contains(player)) return;
_show(player);
viewers.add(player);
}
private void _show(Player player) {
entity.spawn(player);
}
public void hide(Player player) {
if (!viewers.contains(player)) return;
_hide(player);
viewers.remove(player);
}
private void _hide(Player player) {
entity.despawn(player);
}
private void _hideAll() {
for (Player viewer : viewers) _hide(viewer);
}
private void _showAll() {
for (Player viewer : viewers) _show(viewer);
}
public boolean isShown(Player player) {
return viewers.contains(player);
}
public NPCProperty getProperty(NPCPropertyKey key) {
return propertyMap.get(key);
}
public boolean hasProperty(NPCPropertyKey key) {
return propertyMap.containsKey(key);
}
} }

@ -1,36 +1,4 @@
package lol.pyr.znpcsplus.npc; package lol.pyr.znpcsplus.npc;
import com.github.retrooper.packetevents.protocol.entity.type.EntityType;
import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes;
import com.google.common.collect.ImmutableList;
import java.util.List;
public class NPCType { public class NPCType {
private final static ImmutableList<NPCType> npcTypes;
public static List<NPCType> values() {
return npcTypes;
}
private final EntityType type;
public NPCType(EntityType type) {
this.type = type;
}
public EntityType getType() {
return type;
}
static {
ImmutableList.Builder<NPCType> builder = new ImmutableList.Builder<>();
builder.add(new NPCType(EntityTypes.PLAYER));
builder.add(new NPCType(EntityTypes.CREEPER));
builder.add(new NPCType(EntityTypes.ZOMBIE));
builder.add(new NPCType(EntityTypes.SKELETON));
npcTypes = builder.build();
}
} }

@ -2,43 +2,20 @@ package lol.pyr.znpcsplus.packets;
import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.manager.server.ServerVersion; import com.github.retrooper.packetevents.manager.server.ServerVersion;
import lol.pyr.znpcsplus.entity.PacketEntity;
import lol.pyr.znpcsplus.util.LazyLoader; import lol.pyr.znpcsplus.util.LazyLoader;
import org.bukkit.entity.Player;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
public interface PacketFactory { public interface PacketFactory {
void spawnPlayer(Player player, PacketEntity entity);
void spawnEntity(Player player, PacketEntity entity);
void destroyEntity(Player player, PacketEntity entity);
void teleportEntity(Player player, PacketEntity entity);
void addTabPlayer(Player player, PacketEntity entity);
void removeTabPlayer(Player player, PacketEntity entity);
void createTeam(Player player, PacketEntity entity);
void removeTeam(Player player, PacketEntity entity);
PacketFactory factory = get(); Map<ServerVersion, LazyLoader<? extends PacketFactory>> factories = buildFactoryMap();
static PacketFactory get() { static PacketFactory get() {
if (factory != null) return factory; return factories.get(PacketEvents.getAPI().getServerManager().getVersion()).get();
ServerVersion version = PacketEvents.getAPI().getServerManager().getVersion();
Map<ServerVersion, LazyLoader<? extends PacketFactory>> factories = buildFactoryMap();
if (factories.containsKey(version)) return factories.get(version).get();
for (ServerVersion v : ServerVersion.reversedValues()) {
if (v.isNewerThan(version)) continue;
if (!factories.containsKey(v)) continue;
return factories.get(v).get();
}
throw new RuntimeException("Unsupported version!");
} }
private static Map<ServerVersion, LazyLoader<? extends PacketFactory>> buildFactoryMap() { private static Map<ServerVersion, LazyLoader<? extends PacketFactory>> buildFactoryMap() {
HashMap<ServerVersion, LazyLoader<? extends PacketFactory>> map = new HashMap<>();
map.put(ServerVersion.V_1_8, LazyLoader.of(V1_8Factory::new));
map.put(ServerVersion.V_1_14, LazyLoader.of(V1_14Factory::new));
map.put(ServerVersion.V_1_19, LazyLoader.of(V1_19Factory::new));
return map;
} }
} }

@ -1,96 +1,4 @@
package lol.pyr.znpcsplus.packets; package lol.pyr.znpcsplus.packets;
import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.protocol.entity.type.EntityType;
import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.player.GameMode;
import com.github.retrooper.packetevents.protocol.player.UserProfile;
import com.github.retrooper.packetevents.util.Vector3d;
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
import com.github.retrooper.packetevents.wrapper.play.server.*;
import lol.pyr.znpcsplus.ZNPCsPlus;
import lol.pyr.znpcsplus.entity.PacketEntity;
import lol.pyr.znpcsplus.entity.PacketLocation;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.entity.Player;
import java.util.List;
import java.util.Optional;
public class V1_8Factory implements PacketFactory { public class V1_8Factory implements PacketFactory {
@Override
public void spawnPlayer(Player player, PacketEntity entity) {
addTabPlayer(player, entity);
createTeam(player, entity);
PacketLocation location = entity.getLocation();
sendPacket(player, new WrapperPlayServerSpawnPlayer(entity.getEntityId(),
entity.getUuid(), location.toVector3d(), location.getYaw(), location.getPitch(), List.of()));
ZNPCsPlus.SCHEDULER.scheduleSyncDelayedTask(() -> removeTabPlayer(player, entity), 60);
}
@Override
public void spawnEntity(Player player, PacketEntity entity) {
PacketLocation location = entity.getLocation();
EntityType type = entity.getType();
ClientVersion clientVersion = PacketEvents.getAPI().getServerManager().getVersion().toClientVersion();
sendPacket(player, type.getLegacyId(clientVersion) == -1 ?
new WrapperPlayServerSpawnLivingEntity(entity.getEntityId(), entity.getUuid(), type, location.toVector3d(),
location.getYaw(), location.getPitch(), location.getPitch(), new Vector3d(), List.of()) :
new WrapperPlayServerSpawnEntity(entity.getEntityId(), Optional.of(entity.getUuid()), entity.getType(), location.toVector3d(),
location.getPitch(), location.getYaw(), location.getYaw(), 0, Optional.empty()));
}
@Override
public void destroyEntity(Player player, PacketEntity entity) {
sendPacket(player, new WrapperPlayServerDestroyEntities(entity.getEntityId()));
if (entity.getType() == EntityTypes.PLAYER) removeTeam(player, entity);
}
@Override
public void teleportEntity(Player player, PacketEntity entity) {
PacketLocation location = entity.getLocation();
sendPacket(player, new WrapperPlayServerEntityTeleport(entity.getEntityId(),
location.toVector3d(), location.getYaw(), location.getPitch(), true));
}
@Override
public void addTabPlayer(Player player, PacketEntity entity) {
if (entity.getType() != EntityTypes.PLAYER) return;
sendPacket(player, new WrapperPlayServerPlayerInfo(
WrapperPlayServerPlayerInfo.Action.ADD_PLAYER, new WrapperPlayServerPlayerInfo.PlayerData(Component.text(""),
new UserProfile(entity.getUuid(), Integer.toString(entity.getEntityId())), GameMode.CREATIVE, 1)));
}
@Override
public void removeTabPlayer(Player player, PacketEntity entity) {
if (entity.getType() != EntityTypes.PLAYER) return;
sendPacket(player, new WrapperPlayServerPlayerInfo(
WrapperPlayServerPlayerInfo.Action.REMOVE_PLAYER, new WrapperPlayServerPlayerInfo.PlayerData(null,
new UserProfile(entity.getUuid(), null), null, -1)));
}
@Override
public void createTeam(Player player, PacketEntity entity) {
sendPacket(player, new WrapperPlayServerTeams("npc_team_" + entity.getEntityId(), WrapperPlayServerTeams.TeamMode.CREATE, new WrapperPlayServerTeams.ScoreBoardTeamInfo(
Component.empty(),
Component.empty(),
Component.empty(),
WrapperPlayServerTeams.NameTagVisibility.NEVER,
WrapperPlayServerTeams.CollisionRule.NEVER,
NamedTextColor.WHITE,
WrapperPlayServerTeams.OptionData.NONE
)));
sendPacket(player, new WrapperPlayServerTeams("npc_team_" + entity.getEntityId(), WrapperPlayServerTeams.TeamMode.ADD_ENTITIES, (WrapperPlayServerTeams.ScoreBoardTeamInfo) null, Integer.toString(entity.getEntityId())));
}
@Override
public void removeTeam(Player player, PacketEntity entity) {
sendPacket(player, new WrapperPlayServerTeams("npc_team_" + entity.getEntityId(), WrapperPlayServerTeams.TeamMode.REMOVE, (WrapperPlayServerTeams.ScoreBoardTeamInfo) null));
}
protected void sendPacket(Player player, PacketWrapper<?> packet) {
PacketEvents.getAPI().getPlayerManager().sendPacket(player, packet);
}
} }