diff --git a/src/plugin/mrtransistor/AFK/AFK.java b/src/plugin/mrtransistor/AFK/AFK.java index ae17db9..7973258 100644 --- a/src/plugin/mrtransistor/AFK/AFK.java +++ b/src/plugin/mrtransistor/AFK/AFK.java @@ -3,23 +3,20 @@ package plugin.mrtransistor.AFK; import net.minecraft.server.v1_16_R3.*; import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.craftbukkit.v1_16_R3.CraftServer; +import org.bukkit.craftbukkit.v1_16_R3.entity.CraftEntity; import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.scheduler.BukkitTask; import plugin.mrtransistor.AFK.commands.RemoveAllBots; import plugin.mrtransistor.AFK.commands.RemoveBot; import plugin.mrtransistor.AFK.commands.SpawnBot; public class AFK extends JavaPlugin implements Listener { - private BukkitTask updater; - @Override public void onEnable() { saveDefaultConfig(); @@ -33,28 +30,15 @@ public class AFK extends JavaPlugin implements Listener { getCommand("removeAllBots").setExecutor(new RemoveAllBots()); getCommand("removeAllBots").setTabCompleter(new RemoveAllBots()); - this.updater = new BukkitRunnable() { - /** BUGFIX FOR HEAD ROTATION PACKET NOT BEING REGISTERED PROPERLY **/ - /*TODO: FIND THE PROBLEM THAT IS CAUSING UPDATES ON PLAYER JOIN NOT WORK*/ - @Override - public void run() { - MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer(); - for (DummyPlayer dummy : DummyPlayer.dummies) { - server.getPlayerList().sendAll(new PacketPlayOutEntityHeadRotation(dummy, (byte) (dummy.yaw * 256/360))); - } - } - }.runTaskTimer(this, 0, 5); - // Attack test - /*new BukkitRunnable(){ - + /*new BukkitRunnable() { @Override public void run() { for (DummyPlayer dummy : DummyPlayer.dummies) { - Entity targetedEntity = dummy.getTargetedEntity(); - if(targetedEntity != null){ - dummy.swingHand(EnumHand.MAIN_HAND); - dummy.attack(targetedEntity); + LivingEntity target = dummy.getTargetedLivingEntity(); + if (target != null) { + dummy.swingHand(EnumHand.MAIN_HAND, true); + dummy.attack(target); } } } @@ -65,7 +49,6 @@ public class AFK extends JavaPlugin implements Listener { @Override public void onDisable() { - updater.cancel(); int botsRemoved = 0; int numBots = DummyPlayer.dummies.size(); for (int i = 0; i < numBots; i++) { @@ -91,8 +74,14 @@ public class AFK extends JavaPlugin implements Listener { plc.sendPacket(new PacketPlayOutNamedEntitySpawn(dummy)); plc.sendPacket(new PacketPlayOutEntityMetadata(dummy.getId(), dummy.getDataWatcher(), true)); - plc.sendPacket(new PacketPlayOutEntityHeadRotation(dummy, - (byte) (dummy.yaw * 256 / 360))); + } + } + + @EventHandler + public void onPlayerDeath(PlayerDeathEvent e){ + getLogger().info("player died"); + if(((CraftEntity)e.getEntity()).getHandle() instanceof DummyPlayer){ + e.setDroppedExp(e.getEntity().getTotalExperience()); } } } diff --git a/src/plugin/mrtransistor/AFK/DummyPlayer.java b/src/plugin/mrtransistor/AFK/DummyPlayer.java index fec35b3..4d55ee8 100644 --- a/src/plugin/mrtransistor/AFK/DummyPlayer.java +++ b/src/plugin/mrtransistor/AFK/DummyPlayer.java @@ -4,14 +4,22 @@ import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; import net.minecraft.server.v1_16_R3.*; import org.bukkit.Bukkit; +import org.bukkit.GameMode; import org.bukkit.Location; +import org.bukkit.World; import org.bukkit.craftbukkit.v1_16_R3.CraftServer; import org.bukkit.craftbukkit.v1_16_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_16_R3.entity.CraftEntity; import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import org.bukkit.util.RayTraceResult; +import org.bukkit.util.Vector; import java.util.ArrayList; import java.util.UUID; +import java.util.function.Predicate; public class DummyPlayer extends EntityPlayer { public static ArrayList dummies = new ArrayList<>(); @@ -48,13 +56,14 @@ public class DummyPlayer extends EntityPlayer { worldServer.addPlayerJoin(dummy); dummy.setLocation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + dummy.setHeadRotation(location.getYaw()); + dummy.setYawPitch(location.getYaw(), location.getPitch()); worldServer.getChunkProvider().movePlayer(dummy); server.getPlayerList().sendAll(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, dummy)); server.getPlayerList().sendAll(new PacketPlayOutNamedEntitySpawn(dummy)); server.getPlayerList().sendAll(new PacketPlayOutEntityMetadata(dummy.getId(), dummy.getDataWatcher(), true)); - server.getPlayerList().sendAll(new PacketPlayOutEntityHeadRotation(dummy, (byte) (dummy.yaw * 256 / 360))); return dummy; } @@ -68,21 +77,26 @@ public class DummyPlayer extends EntityPlayer { this.playerTick(); } + //TODO: fix hitting through blocks (add block raytracing) + public LivingEntity getTargetedLivingEntity() { + Player bukkitPlayer = this.getBukkitEntity(); + World world = bukkitPlayer.getWorld(); + Location eyePos = bukkitPlayer.getEyeLocation(); + Vector eyeDirection = bukkitPlayer.getEyeLocation().getDirection(); + Predicate filter = entity -> !entity.equals(bukkitPlayer); + double reach = this.playerConnection.getPlayer().getGameMode() == GameMode.CREATIVE ? 4.5 : 3; - //TODO: add getTargetedEntity() method to allow damaging targeted entities - /*public Entity getTargetedEntity() { - WorldServer world = this.getWorldServer(); + RayTraceResult trace = world.rayTraceEntities(eyePos, eyeDirection, reach, filter); + if (trace == null) return null; + Entity hitEntity = trace.getHitEntity(); + if (hitEntity instanceof LivingEntity) + return (LivingEntity) hitEntity; + else return null; + } - - Player player = this.getBukkitEntity(); - Location eye = player.getEyeLocation(); - for(org.bukkit.entity.Entity entity : player.getNearbyEntities(10, 10, 10)) { - Vector toEntity = entity.getLocation().toVector().subtract(eye.toVector()); - double dot = toEntity.normalize().dot(eye.getDirection()); - if(dot > 0.99D) return ((CraftEntity) entity).getHandle(); - } - return null; - }*/ + public void attack(Entity entity) { + this.attack(((CraftEntity) entity).getHandle()); + } public void remove(String reason) { this.dropInventory();