Fixed bug with PacketPlayOutEntityHeadRotation not working on PlayerJoinEvent.

Added partially working targeted entity tracing method
Added attack(org.bukkit.entity.Entity) method overload
DummyPlayers now drop all experience upon death (but no exp on remove command)
This commit is contained in:
BuildTools committed 2021-06-26 21:05:38 +03:00
1 parent b631e5cd01
commit 0ec5e04095
2 files changed
+43 -40

No files matched your search

+15 -26
View File
@@ -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());
}
}
}
+28 -14
View File
@@ -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<DummyPlayer> 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<org.bukkit.entity.Entity> 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();