Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import com.mojang.authlib.GameProfile;
- import com.mojang.authlib.properties.Property;
- import lombok.Getter;
- import net.minecraft.server.v1_8_R3.*;
- import org.bukkit.Bukkit;
- import org.bukkit.Location;
- import org.bukkit.Material;
- import org.bukkit.block.BlockFace;
- import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity;
- import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
- import org.bukkit.craftbukkit.v1_8_R3.util.CraftChatMessage;
- import org.bukkit.entity.Player;
- import org.bukkit.event.EventHandler;
- import org.bukkit.event.Listener;
- import org.bukkit.event.player.PlayerQuitEvent;
- import org.bukkit.metadata.FixedMetadataValue;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.UUID;
- /**
- * @author Lukas
- */
- public class NPC extends ReflectUtils implements Listener {
- private static int currentEntityID = -100;
- private static int nextID() {
- currentEntityID--;
- return currentEntityID;
- }
- private Location location;
- @Getter
- private int entityID;
- private GameProfile gameProfile;
- private String displayName;
- private Look look;
- @Getter
- private Runnable runnable;
- public NPC(Location location) {
- Bukkit.getPluginManager().registerEvents(this, NPCPlugin.getPlugin());
- String value = "eyJ0aW1lc3RhbXAiOjE1MTgzNDE0MDU4ODAsInByb2ZpbGVJZCI6IjM2M2EyMjQ0MThmMTQxMjU5NGVjMDc4MzdmZjhmNjFmIiwicHJvZmlsZU5hbWUiOiJTaG9ydEJ5dGUiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzE2N2FlMWIxNmJmZjRjMmVkNDcxYzkwZDQ3Y2U1OTIwNzZkZTUwYzcwM2YxMmVkOTc1YjM1NWVjNGQ3MCJ9fX0=";
- String signature = "JfG+tPMwrKtN2nS7CXbkxOkgYJQ0IUsGkl4yP9OG5zAND1ODKxXDUMrw0jHS5kOTuQ6pHA7tAqdSZ96DlU1oBxoE/skSdRNIXzplNA/RqdKuFbVFl9ifuRCMfVN2kPBB5UQFsPDvaXY0vG5KNQSW0ORFRp1U7l+twVj9Ynuxc8aeaVJBIPnL97NdSfxFxXZ4xNrfOiF4OpDQvT2coB9ro05WkjOxFGQetP5Ne6UHn2YNMVPrmxVFMcwDIrC8nh1zIIZMr8R9szmaYmfivjtgr0Wcvgl+LS17T5CbmbQxWa77MdUH9gtSg6CbThdxlHlyNFs7qSqHNAPDjY8OrH43jZstDQBvHisRGinveuKvU33N3I0lfaZFBeUx3BeRZiESMx0BK+QKSv1TR+9wI2hdHEoEhfg/63b/DB37dhwKDwT2cpCWl4hvyDIqE4QRotWAQS762XB++k0MC0HLEtq6D2M+8WkXehDNHoELWByWGFRnOEQs4jNPr4GjmS7i2uIcCNaRplbgiouPQIw5crM0wNHZarOjdb5UaC7yqcISnlOUkQgosS234LVPspbSFlVq6nHhIEDEGAKGA6N8Wpuo8iLmcmRjuJsgcYDVR9cK0365x9bdrq6D8CY0La7tPbToo+8VpaWgod9X4qhRNfyYq02HLtXeAQ8OgiYhXHf38F0=";
- this.location = location;
- this.entityID = nextID();
- this.gameProfile = new GameProfile(UUID.randomUUID(), "ShortByte ยง8[");
- this.gameProfile.getProperties().put("textures", new Property("textures", value, signature));
- this.look = Look.INDIVIDUAL;
- this.displayName = "ShortByte ยง8[";
- this.runnable = () -> {
- for (Player p : Bukkit.getOnlinePlayers()) {
- boolean canSee = p.getWorld().equals(location.getWorld()) && p.getLocation().distanceSquared(location) < 7000;
- if (canSee && !p.hasMetadata("npc_" + this.entityID)) {
- sendPacket(p, getSpawnPackets());
- Bukkit.getScheduler().runTaskLater(NPCPlugin.getPlugin(), () -> {
- sendPacket(p, rideEntity(NPCPlugin.getPlugin().getArmorStand().getEntityId()));
- }, 2);
- p.setMetadata("npc_" + this.entityID, new FixedMetadataValue(NPCPlugin.getPlugin(), true));
- } else if (!canSee && p.hasMetadata("npc_" + this.entityID)) {
- sendPacket(p, getRemovePackets());
- p.removeMetadata("npc_" + this.entityID, NPCPlugin.getPlugin());
- } else if (canSee) {
- sendPacket(p, getLookPackets(p.getLocation()));
- // location.add(0, 0, 0.1);
- // sendPacket(p, getMovePacket());
- }
- }
- };
- }
- @EventHandler
- public void onQuit(PlayerQuitEvent event) {
- if (event.getPlayer().hasMetadata("npc_" + this.entityID))
- event.getPlayer().removeMetadata("npc_" + this.entityID, NPCPlugin.getPlugin());
- }
- public Packet<?>[] getSpawnPackets() {
- PacketPlayOutPlayerInfo tablistPacket = new PacketPlayOutPlayerInfo();
- PacketPlayOutPlayerInfo tablistRemovePacket = new PacketPlayOutPlayerInfo();
- PacketPlayOutNamedEntitySpawn spawnPacket = new PacketPlayOutNamedEntitySpawn();
- try {
- PacketPlayOutPlayerInfo.PlayerInfoData playerInfoData = tablistPacket.new PlayerInfoData(gameProfile, 1, WorldSettings.EnumGamemode.NOT_SET, CraftChatMessage.fromString(displayName)[0]);
- setField(tablistPacket, "a", PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER);
- setField(tablistPacket, "b", Collections.singletonList(playerInfoData));
- PacketPlayOutPlayerInfo.PlayerInfoData playerInfoDataRemove = tablistRemovePacket.new PlayerInfoData(gameProfile, 1, WorldSettings.EnumGamemode.NOT_SET, CraftChatMessage.fromString(displayName)[0]);
- setField(tablistRemovePacket, "a", PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER);
- setField(tablistRemovePacket, "b", Collections.singletonList(playerInfoDataRemove));
- DataWatcher watcher = new DataWatcher(null);
- watcher.a(6, (float) 20);
- watcher.a(10, (byte) 127);
- setField(spawnPacket, "a", this.entityID);
- setField(spawnPacket, "b", this.gameProfile.getId());
- setField(spawnPacket, "c", MathHelper.floor(location.getX() * 32.0D));
- setField(spawnPacket, "d", MathHelper.floor(location.getY() * 32.0D));
- setField(spawnPacket, "e", MathHelper.floor(location.getZ() * 32.0D));
- setField(spawnPacket, "f", (byte) ((int) (location.getYaw() * 256.0F / 360.0F)));
- setField(spawnPacket, "g", (byte) ((int) (location.getPitch() * 256.0F / 360.0F)));
- setField(spawnPacket, "h", 0);
- setField(spawnPacket, "i", watcher);
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- return new Packet<?>[]{tablistPacket, spawnPacket};
- }
- public Packet<?>[] getRemovePackets() {
- PacketPlayOutEntityDestroy destroy = new PacketPlayOutEntityDestroy(entityID);
- return new Packet[]{destroy};
- }
- public Packet<?>[] getLookPackets(Location point) {
- Location clone = this.location.clone();
- final double xDiff = point.getX() - this.location.getX();
- final double yDiff = point.getY() - this.location.getY();
- final double zDiff = point.getZ() - this.location.getZ();
- final double DistanceXZ = Math.sqrt(xDiff * xDiff + zDiff * zDiff);
- final double DistanceY = Math.sqrt(DistanceXZ * DistanceXZ + yDiff * yDiff);
- double newYaw = Math.acos(xDiff / DistanceXZ) * 180 / Math.PI;
- final double newPitch = Math.acos(yDiff / DistanceY) * 180 / Math.PI - 90;
- if (zDiff < 0.0)
- newYaw = newYaw + Math.abs(180 - newYaw) * 2;
- float yy = ((float) (newYaw - 90));
- float pp = ((float) newPitch);
- if (yy != this.location.getYaw() || pp != this.location.getPitch()) {
- clone.setYaw(yy);
- clone.setPitch(pp);
- }
- PacketPlayOutEntity.PacketPlayOutEntityLook packet = new PacketPlayOutEntity.PacketPlayOutEntityLook(this.entityID, (byte) ((int) (clone.getYaw() * 256.0F / 360.0F)), (byte) ((int) (clone.getPitch() * 256.0F / 360.0F)), true);
- PacketPlayOutEntityHeadRotation headPacket = new PacketPlayOutEntityHeadRotation();
- try {
- setField(headPacket, "a", this.entityID);
- setField(headPacket, "b", (byte) ((int) (clone.getYaw() * 256.0F / 360.0F)));
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- return new Packet[]{packet, headPacket};
- }
- public Packet<?>[] rideEntity(int id) {
- PacketPlayOutAttachEntity packetPlayOutAttachEntity = new PacketPlayOutAttachEntity();
- try {
- setField(packetPlayOutAttachEntity, "a", 0);
- setField(packetPlayOutAttachEntity, "b", entityID);
- setField(packetPlayOutAttachEntity, "c", id);
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- return new Packet[]{packetPlayOutAttachEntity};
- }
- public Packet<?>[] getMovePacket() {
- boolean onGround = location.getBlock().getRelative(BlockFace.DOWN).getType() != Material.AIR;
- PacketPlayOutEntityTeleport packetPlayOutEntityTeleport = new PacketPlayOutEntityTeleport(entityID, MathHelper.floor(location.getX() * 32.0D), MathHelper.floor(location.getY() * 32.0D), MathHelper.floor(location.getZ() * 32.0D),
- (byte) ((int) (location.getYaw() * 256.0F / 360.0F)), (byte) ((int) (location.getYaw() * 256.0F / 360.0F)), onGround);
- return new Packet[]{packetPlayOutEntityTeleport};
- }
- public void sendPacket(Player player, Packet<?>[] packets) {
- for (Packet<?> packet : packets)
- ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet);
- }
- public void interact(Player player){}
- public enum Look {
- INDIVIDUAL,
- NONE,
- NEAREST;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement