Packet-based entity

This commit is contained in:
zimzaza4
2024-07-07 02:46:46 +08:00
parent 3c9cc8ab31
commit 140b8cafd1
13 changed files with 965 additions and 129 deletions

View File

@@ -0,0 +1,22 @@
package re.imc.geysermodelengine.packet;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.events.PacketContainer;
import java.util.Collections;
public class EntityDestroyPacket implements WrapperPacket {
private final int id;
public EntityDestroyPacket(int id) {
this.id = id;
}
@Override
public PacketContainer encode() {
PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_DESTROY);
packet.getIntLists().write(0, Collections.singletonList(this.id));
return packet;
}
}

View File

@@ -0,0 +1,21 @@
package re.imc.geysermodelengine.packet;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.events.PacketContainer;
public class EntityHurtAnimationPacket implements WrapperPacket {
private final int id;
public EntityHurtAnimationPacket(int id) {
this.id = id;
}
@Override
public PacketContainer encode() {
PacketContainer packet = new PacketContainer(PacketType.Play.Server.HURT_ANIMATION);
packet.getIntegers().write(0, id);
packet.getFloat().write(0, 1f);
return packet;
}
}

View File

@@ -0,0 +1,44 @@
package re.imc.geysermodelengine.packet;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.events.PacketContainer;
import org.bukkit.Location;
import org.bukkit.entity.EntityType;
import java.util.UUID;
public class EntitySpawnPacket implements WrapperPacket {
private final int id;
private final UUID uuid;
private final EntityType type;
private final Location location;
public EntitySpawnPacket(int entityID, UUID uuid, EntityType type, Location location) {
this.id = entityID;
this.uuid = uuid;
this.type = type;
this.location = location;
}
@Override
public PacketContainer encode() {
PacketContainer packet = ProtocolLibrary.getProtocolManager()
.createPacket(PacketType.Play.Server.SPAWN_ENTITY);
packet.getIntegers()
.write(0, this.id);
packet.getUUIDs()
.write(0, this.uuid);
packet.getDoubles()
.write(0, this.location.getX())
.write(1, this.location.getY())
.write(2, this.location.getZ());
packet.getBytes()
.write(0, (byte) (this.location.getYaw() * 256.0F / 360.0F))
.write(1, (byte) (this.location.getPitch() * 256.0F / 360.0F));
packet.getEntityTypeModifier()
.writeSafely(0, type);
return packet;
}
}

View File

@@ -0,0 +1,25 @@
package re.imc.geysermodelengine.packet;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.events.PacketContainer;
import org.bukkit.Location;
public class EntityTeleportPacket implements WrapperPacket {
private final int id;
private final Location loc;
public EntityTeleportPacket(int entityID, Location location) {
this.id = entityID;
this.loc = location;
}
@Override
public PacketContainer encode() {
PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_TELEPORT);
packet.getIntegers().write(0, this.id);
packet.getDoubles().write(0, loc.getX());
packet.getDoubles().write(1, loc.getY());
packet.getDoubles().write(2, loc.getZ());
return packet;
}
}

View File

@@ -0,0 +1,9 @@
package re.imc.geysermodelengine.packet;
import com.comphenix.protocol.events.PacketContainer;
public interface WrapperPacket {
default WrapperPacket decode() { return null; };
default PacketContainer encode() { return null; };
}

View File

@@ -0,0 +1,804 @@
package re.imc.geysermodelengine.packet.entity;
import com.comphenix.protocol.ProtocolLibrary;
import io.papermc.paper.entity.TeleportFlag;
import io.papermc.paper.threadedregions.scheduler.EntityScheduler;
import net.kyori.adventure.text.Component;
import org.bukkit.*;
import org.bukkit.block.BlockFace;
import org.bukkit.block.PistonMoveReaction;
import org.bukkit.entity.*;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.metadata.MetadataValue;
import org.bukkit.permissions.Permission;
import org.bukkit.permissions.PermissionAttachment;
import org.bukkit.permissions.PermissionAttachmentInfo;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.plugin.Plugin;
import org.bukkit.util.BoundingBox;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import re.imc.geysermodelengine.packet.EntityDestroyPacket;
import re.imc.geysermodelengine.packet.EntityHurtAnimationPacket;
import re.imc.geysermodelengine.packet.EntitySpawnPacket;
import re.imc.geysermodelengine.packet.EntityTeleportPacket;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadLocalRandom;
public class PacketEntity implements Entity {
public PacketEntity(EntityType type, Set<Player> viewers, Location location) {
this.id = ThreadLocalRandom.current().nextInt(20000, 100000000);
this.uuid = UUID.randomUUID();
this.type = type;
this.viewers = viewers;
this.location = location;
}
private int id;
private UUID uuid;
private EntityType type;
private Set<Player> viewers;
private Location location;
private boolean removed = false;
@Override
public @NotNull Location getLocation() {
return location;
}
@Override
public boolean teleport(@NotNull Location location) {
this.location = location;
sendLocationPacket(viewers);
return true;
}
@Override
public void remove() {
removed = true;
sendEntityDestroyPacket(viewers);
}
@Override
public boolean isDead() {
return removed;
}
@Override
public boolean isValid() {
return !removed;
}
public void sendSpawnPacket(Collection<Player> players) {
EntitySpawnPacket packet = new EntitySpawnPacket(id, uuid, type, location);
players.forEach(player -> ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet.encode()));
}
public void sendLocationPacket(Collection<Player> players) {
EntityTeleportPacket packet = new EntityTeleportPacket(id, location);
players.forEach(player -> ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet.encode()));
}
public void sendHurtPacket(Collection<Player> players) {
EntityHurtAnimationPacket packet = new EntityHurtAnimationPacket(id);
players.forEach(player -> ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet.encode()));
}
public void sendEntityDestroyPacket(Collection<Player> players) {
EntityDestroyPacket packet = new EntityDestroyPacket(id);
players.forEach(player -> ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet.encode()));
}
// ----------------
@Override
public @Nullable Location getLocation(@Nullable Location location) {
return null;
}
@Override
public void setVelocity(@NotNull Vector vector) {
}
@Override
public @NotNull Vector getVelocity() {
return null;
}
@Override
public double getHeight() {
return 0;
}
@Override
public double getWidth() {
return 0;
}
@Override
public @NotNull BoundingBox getBoundingBox() {
return null;
}
@Override
public boolean isOnGround() {
return false;
}
@Override
public boolean isInWater() {
return false;
}
@Override
public @NotNull World getWorld() {
return null;
}
@Override
public void setRotation(float v, float v1) {
}
@Override
public boolean teleport(@NotNull Location location, PlayerTeleportEvent.@NotNull TeleportCause teleportCause, @NotNull TeleportFlag @NotNull ... teleportFlags) {
return false;
}
@Override
public boolean teleport(@NotNull Location location, PlayerTeleportEvent.@NotNull TeleportCause teleportCause) {
return false;
}
@Override
public boolean teleport(@NotNull Entity entity) {
return false;
}
@Override
public boolean teleport(@NotNull Entity entity, PlayerTeleportEvent.@NotNull TeleportCause teleportCause) {
return false;
}
@Override
public @NotNull CompletableFuture<Boolean> teleportAsync(@NotNull Location location, PlayerTeleportEvent.@NotNull TeleportCause teleportCause, @NotNull TeleportFlag @NotNull ... teleportFlags) {
return null;
}
@Override
public @NotNull List<Entity> getNearbyEntities(double v, double v1, double v2) {
return null;
}
@Override
public int getEntityId() {
return 0;
}
@Override
public int getFireTicks() {
return 0;
}
@Override
public int getMaxFireTicks() {
return 0;
}
@Override
public void setFireTicks(int i) {
}
@Override
public void setVisualFire(boolean b) {
}
@Override
public boolean isVisualFire() {
return false;
}
@Override
public int getFreezeTicks() {
return 0;
}
@Override
public int getMaxFreezeTicks() {
return 0;
}
@Override
public void setFreezeTicks(int i) {
}
@Override
public boolean isFrozen() {
return false;
}
@Override
public void setInvisible(boolean b) {
}
@Override
public boolean isInvisible() {
return false;
}
@Override
public void setNoPhysics(boolean b) {
}
@Override
public boolean hasNoPhysics() {
return false;
}
@Override
public boolean isFreezeTickingLocked() {
return false;
}
@Override
public void lockFreezeTicks(boolean b) {
}
@Override
public void sendMessage(@NotNull String s) {
}
@Override
public void sendMessage(@NotNull String... strings) {
}
@Override
public void sendMessage(@Nullable UUID uuid, @NotNull String s) {
}
@Override
public void sendMessage(@Nullable UUID uuid, @NotNull String... strings) {
}
@Override
public @NotNull Server getServer() {
return null;
}
@Override
public @NotNull String getName() {
return null;
}
@Override
public boolean isPersistent() {
return false;
}
@Override
public void setPersistent(boolean b) {
}
@Override
public @Nullable Entity getPassenger() {
return null;
}
@Override
public boolean setPassenger(@NotNull Entity entity) {
return false;
}
@Override
public @NotNull List<Entity> getPassengers() {
return null;
}
@Override
public boolean addPassenger(@NotNull Entity entity) {
return false;
}
@Override
public boolean removePassenger(@NotNull Entity entity) {
return false;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public boolean eject() {
return false;
}
@Override
public float getFallDistance() {
return 0;
}
@Override
public void setFallDistance(float v) {
}
@Override
public void setLastDamageCause(@Nullable EntityDamageEvent entityDamageEvent) {
}
@Override
public @Nullable EntityDamageEvent getLastDamageCause() {
return null;
}
@Override
public @NotNull UUID getUniqueId() {
return null;
}
@Override
public int getTicksLived() {
return 0;
}
@Override
public void setTicksLived(int i) {
}
@Override
public void playEffect(@NotNull EntityEffect entityEffect) {
}
@Override
public @NotNull EntityType getType() {
return null;
}
@Override
public @NotNull Sound getSwimSound() {
return null;
}
@Override
public @NotNull Sound getSwimSplashSound() {
return null;
}
@Override
public @NotNull Sound getSwimHighSpeedSplashSound() {
return null;
}
@Override
public boolean isInsideVehicle() {
return false;
}
@Override
public boolean leaveVehicle() {
return false;
}
@Override
public @Nullable Entity getVehicle() {
return null;
}
@Override
public void setCustomNameVisible(boolean b) {
}
@Override
public boolean isCustomNameVisible() {
return false;
}
@Override
public void setVisibleByDefault(boolean b) {
}
@Override
public boolean isVisibleByDefault() {
return false;
}
@Override
public @NotNull Set<Player> getTrackedBy() {
return null;
}
@Override
public void setGlowing(boolean b) {
}
@Override
public boolean isGlowing() {
return false;
}
@Override
public void setInvulnerable(boolean b) {
}
@Override
public boolean isInvulnerable() {
return false;
}
@Override
public boolean isSilent() {
return false;
}
@Override
public void setSilent(boolean b) {
}
@Override
public boolean hasGravity() {
return false;
}
@Override
public void setGravity(boolean b) {
}
@Override
public int getPortalCooldown() {
return 0;
}
@Override
public void setPortalCooldown(int i) {
}
@Override
public @NotNull Set<String> getScoreboardTags() {
return null;
}
@Override
public boolean addScoreboardTag(@NotNull String s) {
return false;
}
@Override
public boolean removeScoreboardTag(@NotNull String s) {
return false;
}
@Override
public @NotNull PistonMoveReaction getPistonMoveReaction() {
return null;
}
@Override
public @NotNull BlockFace getFacing() {
return null;
}
@Override
public @NotNull Pose getPose() {
return null;
}
@Override
public boolean isSneaking() {
return false;
}
@Override
public void setSneaking(boolean b) {
}
@Override
public void setPose(@NotNull Pose pose, boolean b) {
}
@Override
public boolean hasFixedPose() {
return false;
}
@Override
public @NotNull SpawnCategory getSpawnCategory() {
return null;
}
@Override
public boolean isInWorld() {
return false;
}
@Override
public @Nullable EntitySnapshot createSnapshot() {
return null;
}
@Override
public @NotNull Entity copy() {
return null;
}
@Override
public @NotNull Entity copy(@NotNull Location location) {
return null;
}
@Override
public @NotNull Spigot spigot() {
return null;
}
@Override
public @NotNull Component name() {
return null;
}
@Override
public @NotNull Component teamDisplayName() {
return null;
}
@Override
public @Nullable Location getOrigin() {
return null;
}
@Override
public boolean fromMobSpawner() {
return false;
}
@Override
public CreatureSpawnEvent.@NotNull SpawnReason getEntitySpawnReason() {
return null;
}
@Override
public boolean isUnderWater() {
return false;
}
@Override
public boolean isInRain() {
return false;
}
@Override
public boolean isInBubbleColumn() {
return false;
}
@Override
public boolean isInWaterOrRain() {
return false;
}
@Override
public boolean isInWaterOrBubbleColumn() {
return false;
}
@Override
public boolean isInWaterOrRainOrBubbleColumn() {
return false;
}
@Override
public boolean isInLava() {
return false;
}
@Override
public boolean isTicking() {
return false;
}
@Override
public @NotNull Set<Player> getTrackedPlayers() {
return null;
}
@Override
public boolean spawnAt(@NotNull Location location, CreatureSpawnEvent.@NotNull SpawnReason spawnReason) {
return false;
}
@Override
public boolean isInPowderedSnow() {
return false;
}
@Override
public double getX() {
return 0;
}
@Override
public double getY() {
return 0;
}
@Override
public double getZ() {
return 0;
}
@Override
public float getPitch() {
return 0;
}
@Override
public float getYaw() {
return 0;
}
@Override
public boolean collidesAt(@NotNull Location location) {
return false;
}
@Override
public boolean wouldCollideUsing(@NotNull BoundingBox boundingBox) {
return false;
}
@Override
public @NotNull EntityScheduler getScheduler() {
return null;
}
@Override
public @NotNull String getScoreboardEntryName() {
return null;
}
@Override
public @Nullable Component customName() {
return null;
}
@Override
public void customName(@Nullable Component component) {
}
@Override
public @Nullable String getCustomName() {
return null;
}
@Override
public void setCustomName(@Nullable String s) {
}
@Override
public void setMetadata(@NotNull String s, @NotNull MetadataValue metadataValue) {
}
@Override
public @NotNull List<MetadataValue> getMetadata(@NotNull String s) {
return null;
}
@Override
public boolean hasMetadata(@NotNull String s) {
return false;
}
@Override
public void removeMetadata(@NotNull String s, @NotNull Plugin plugin) {
}
@Override
public boolean isPermissionSet(@NotNull String s) {
return false;
}
@Override
public boolean isPermissionSet(@NotNull Permission permission) {
return false;
}
@Override
public boolean hasPermission(@NotNull String s) {
return false;
}
@Override
public boolean hasPermission(@NotNull Permission permission) {
return false;
}
@Override
public @NotNull PermissionAttachment addAttachment(@NotNull Plugin plugin, @NotNull String s, boolean b) {
return null;
}
@Override
public @NotNull PermissionAttachment addAttachment(@NotNull Plugin plugin) {
return null;
}
@Override
public @Nullable PermissionAttachment addAttachment(@NotNull Plugin plugin, @NotNull String s, boolean b, int i) {
return null;
}
@Override
public @Nullable PermissionAttachment addAttachment(@NotNull Plugin plugin, int i) {
return null;
}
@Override
public void removeAttachment(@NotNull PermissionAttachment permissionAttachment) {
}
@Override
public void recalculatePermissions() {
}
@Override
public @NotNull Set<PermissionAttachmentInfo> getEffectivePermissions() {
return null;
}
@Override
public boolean isOp() {
return false;
}
@Override
public void setOp(boolean b) {
}
@Override
public @NotNull PersistentDataContainer getPersistentDataContainer() {
return null;
}
}