Skip to content

Commit

Permalink
send self-disguise update packets faster
Browse files Browse the repository at this point in the history
to reduce awkward delays
  • Loading branch information
mcmonkey4eva committed Dec 18, 2020
1 parent 5b836ee commit 5a83b4e
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 25 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package com.denizenscript.denizen.nms.interfaces;

import com.denizenscript.denizen.nms.abstracts.ImprovedOfflinePlayer;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.LocationTag;
import com.denizenscript.denizen.objects.PlayerTag;
import com.denizenscript.denizen.utilities.entity.FakeEntity;
import com.denizenscript.denizencore.objects.Mechanism;
import org.bukkit.*;
import org.bukkit.boss.BossBar;
Expand All @@ -16,7 +17,7 @@ public abstract class PlayerHelper {

public abstract void stopSound(Player player, String sound, SoundCategory category);

public EntityTag sendEntitySpawn(List<PlayerTag> players, EntityType entityType, Location location, ArrayList<Mechanism> mechanisms, int customId, UUID customUUID, boolean autoTrack) {
public FakeEntity sendEntitySpawn(List<PlayerTag> players, EntityType entityType, LocationTag location, ArrayList<Mechanism> mechanisms, int customId, UUID customUUID, boolean autoTrack) {
throw new UnsupportedOperationException();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,14 @@
import com.denizenscript.denizencore.scripts.ScriptEntry;
import com.denizenscript.denizencore.scripts.commands.AbstractCommand;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.scheduler.BukkitRunnable;

Expand Down Expand Up @@ -152,6 +154,11 @@ else if (player.isOnline()) {
}
}

public void moveFakeNow(Location position) {
NMSHandler.getEntityHelper().snapPositionTo(fake.entity.getBukkitEntity(), position.toVector());
NMSHandler.getEntityHelper().look(fake.entity.getBukkitEntity(), position.getYaw(), position.getPitch());
}

public void startFake(PlayerTag player) {
if (fake != null) {
stopFake(player);
Expand All @@ -173,8 +180,7 @@ public void run() {
cancel();
return;
}
NMSHandler.getEntityHelper().snapPositionTo(fake.entity.getBukkitEntity(), player.getLocation().toVector());
NMSHandler.getEntityHelper().look(fake.entity.getBukkitEntity(), player.getLocation().getYaw(), player.getLocation().getPitch());
moveFakeNow(player.getLocation());
}
}.runTaskTimer(Denizen.getInstance(), 1, 1);
}
Expand Down Expand Up @@ -213,9 +219,9 @@ public void sendTo(List<PlayerTag> players) {
NMSHandler.getPlayerHelper().sendEntitySpawn(players, as.getBukkitEntityType(), entity.getLocation(), as.getWaitingMechanisms(), entity.getBukkitEntity().getEntityId(), entity.getUUID(), false);
}

@EventHandler(priority = EventPriority.MONITOR)
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onJoin(PlayerJoinEvent event) {
if (!event.getPlayer().getUniqueId().equals(entity.getUUID()) || !shouldFake) {
if (!shouldFake || !event.getPlayer().getUniqueId().equals(entity.getUUID())) {
return;
}
new BukkitRunnable() {
Expand All @@ -229,9 +235,9 @@ public void run() {
}.runTaskLater(Denizen.getInstance(), 2);
}

@EventHandler(priority = EventPriority.MONITOR)
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onTeleport(PlayerTeleportEvent event) {
if (!event.getPlayer().getUniqueId().equals(entity.getUUID()) || fake == null) {
if (fake == null || !event.getPlayer().getUniqueId().equals(entity.getUUID())) {
return;
}
stopFake(new PlayerTag(event.getPlayer()));
Expand All @@ -245,6 +251,21 @@ public void run() {
}
}.runTaskLater(Denizen.getInstance(), 2);
}


@EventHandler(priority = EventPriority.MONITOR)
public void onMove(PlayerMoveEvent event) {
if (fake == null || !event.getPlayer().getUniqueId().equals(entity.getUUID())) {
return;
}
if (event.getTo() == null) {
return;
}
moveFakeNow(event.getTo());
if (fake.triggerUpdatePacket != null) {
fake.triggerUpdatePacket.run();
}
}
}

public static HashMap<UUID, HashMap<UUID, TrackedDisguise>> disguises = new HashMap<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,19 +38,19 @@ public static FakeEntity getFakeEntityFor(UUID uuid, int id) {
public EntityTag entity;
public LocationTag location;
public BukkitTask currentTask = null;
public Runnable triggerUpdatePacket;

private FakeEntity(List<PlayerTag> player, LocationTag location, int id) {
public FakeEntity(List<PlayerTag> player, LocationTag location, int id) {
this.players = player;
this.location = location;
this.id = id;
}

public static FakeEntity showFakeEntityTo(List<PlayerTag> players, EntityTag typeToSpawn, LocationTag location, DurationTag duration) {
EntityTag entTag = NMSHandler.getPlayerHelper().sendEntitySpawn(players, typeToSpawn.getBukkitEntityType(), location, typeToSpawn.getWaitingMechanisms(), -1, null, true);
entTag.isFake = true;
entTag.isFakeValid = true;
FakeEntity fakeEntity = new FakeEntity(players, location, entTag.getBukkitEntity().getEntityId());
idsToEntities.put(entTag.getUUID(), fakeEntity);
FakeEntity fakeEntity = NMSHandler.getPlayerHelper().sendEntitySpawn(players, typeToSpawn.getBukkitEntityType(), location, typeToSpawn.getWaitingMechanisms(), -1, null, true);
fakeEntity.entity.isFake = true;
fakeEntity.entity.isFakeValid = true;
idsToEntities.put(fakeEntity.entity.getUUID(), fakeEntity);
for (PlayerTag player : players) {
UUID uuid = player.getPlayerEntity().getUniqueId();
FakeEntity.FakeEntityMap playerEntities = playersToEntities.get(uuid);
Expand All @@ -60,7 +60,7 @@ public static FakeEntity showFakeEntityTo(List<PlayerTag> players, EntityTag typ
}
playerEntities.byId.put(fakeEntity.id, fakeEntity);
}
fakeEntity.updateEntity(entTag, duration);
fakeEntity.updateEntity(fakeEntity.entity, duration);
return fakeEntity;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
import com.denizenscript.denizen.nms.v1_15.impl.network.handlers.AbstractListenerPlayInImpl;
import com.denizenscript.denizen.nms.v1_15.impl.network.handlers.DenizenNetworkManagerImpl;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.LocationTag;
import com.denizenscript.denizen.objects.PlayerTag;
import com.denizenscript.denizen.utilities.entity.FakeEntity;
import com.denizenscript.denizencore.objects.Mechanism;
import com.mojang.authlib.GameProfile;
import com.denizenscript.denizen.nms.abstracts.ImprovedOfflinePlayer;
Expand Down Expand Up @@ -67,7 +69,7 @@ public void deTrackEntity(Player player, Entity entity) {
}

@Override
public EntityTag sendEntitySpawn(List<PlayerTag> players, EntityType entityType, Location location, ArrayList<Mechanism> mechanisms, int customId, UUID customUUID, boolean autoTrack) {
public FakeEntity sendEntitySpawn(List<PlayerTag> players, EntityType entityType, LocationTag location, ArrayList<Mechanism> mechanisms, int customId, UUID customUUID, boolean autoTrack) {
CraftWorld world = ((CraftWorld) location.getWorld());
net.minecraft.server.v1_15_R1.Entity nmsEntity = world.createEntity(location, entityType.getEntityClass());
if (customUUID != null) {
Expand All @@ -79,26 +81,50 @@ public EntityTag sendEntitySpawn(List<PlayerTag> players, EntityType entityType,
entity.safeAdjust(mechanism);
}
nmsEntity.dead = false;
EntityTag entTag = new EntityTag(entity.getBukkitEntity());
FakeEntity fake = new FakeEntity(players, location, entity.getBukkitEntity().getEntityId());
fake.entity = new EntityTag(entity.getBukkitEntity());
List<EntityTrackerEntry> trackers = new ArrayList<>();
for (PlayerTag player : players) {
EntityPlayer nmsPlayer = ((CraftPlayer) player.getPlayerEntity()).getHandle();
PlayerConnection conn = nmsPlayer.playerConnection;
final EntityTrackerEntry tracker = new EntityTrackerEntry(world.getHandle(), nmsEntity, 1, true, conn::sendPacket, Collections.singleton(nmsPlayer));
tracker.b(nmsPlayer);
trackers.add(tracker);
if (autoTrack) {
new BukkitRunnable() {
boolean wasOnline = true;
@Override
public void run() {
if (!entTag.isFakeValid || !player.isOnline()) {
if (!fake.entity.isFakeValid) {
trackers.remove(tracker);
cancel();
return;
}
tracker.a();
if (player.isOnline()) {
if (!wasOnline) {
trackers.add(tracker);
tracker.b(((CraftPlayer) player.getPlayerEntity()).getHandle());
wasOnline = true;
}
tracker.a();
}
else if (wasOnline) {
trackers.remove(tracker);
wasOnline = false;
}
}
}.runTaskTimer(Denizen.getInstance(), 1, 1);
}
}
return entTag;
fake.triggerUpdatePacket = new Runnable() {
@Override
public void run() {
for (EntityTrackerEntry tracker : trackers) {
tracker.a();
}
}
};
return fake;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@
import com.denizenscript.denizen.nms.v1_16.impl.network.handlers.AbstractListenerPlayInImpl;
import com.denizenscript.denizen.nms.v1_16.impl.network.handlers.DenizenNetworkManagerImpl;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.LocationTag;
import com.denizenscript.denizen.objects.PlayerTag;
import com.denizenscript.denizen.utilities.FormattedTextHelper;
import com.denizenscript.denizen.utilities.entity.FakeEntity;
import com.denizenscript.denizencore.objects.Mechanism;
import com.mojang.authlib.GameProfile;
import com.denizenscript.denizen.nms.abstracts.ImprovedOfflinePlayer;
Expand Down Expand Up @@ -71,7 +73,7 @@ public void deTrackEntity(Player player, Entity entity) {
}

@Override
public EntityTag sendEntitySpawn(List<PlayerTag> players, EntityType entityType, Location location, ArrayList<Mechanism> mechanisms, int customId, UUID customUUID, boolean autoTrack) {
public FakeEntity sendEntitySpawn(List<PlayerTag> players, EntityType entityType, LocationTag location, ArrayList<Mechanism> mechanisms, int customId, UUID customUUID, boolean autoTrack) {
CraftWorld world = ((CraftWorld) location.getWorld());
net.minecraft.server.v1_16_R3.Entity nmsEntity = world.createEntity(location, entityType.getEntityClass());
if (customUUID != null) {
Expand All @@ -83,33 +85,50 @@ public EntityTag sendEntitySpawn(List<PlayerTag> players, EntityType entityType,
entity.safeAdjust(mechanism);
}
nmsEntity.dead = false;
EntityTag entTag = new EntityTag(entity.getBukkitEntity());
FakeEntity fake = new FakeEntity(players, location, entity.getBukkitEntity().getEntityId());
fake.entity = new EntityTag(entity.getBukkitEntity());
List<EntityTrackerEntry> trackers = new ArrayList<>();
for (PlayerTag player : players) {
EntityPlayer nmsPlayer = ((CraftPlayer) player.getPlayerEntity()).getHandle();
PlayerConnection conn = nmsPlayer.playerConnection;
final EntityTrackerEntry tracker = new EntityTrackerEntry(world.getHandle(), nmsEntity, 1, true, conn::sendPacket, Collections.singleton(nmsPlayer));
tracker.b(nmsPlayer);
trackers.add(tracker);
if (autoTrack) {
new BukkitRunnable() {
boolean wasOnline = true;
@Override
public void run() {
if (!entTag.isFakeValid) {
if (!fake.entity.isFakeValid) {
trackers.remove(tracker);
cancel();
return;
}
if (player.isOnline()) {
if (!wasOnline) {
tracker.b(nmsPlayer);
trackers.add(tracker);
tracker.b(((CraftPlayer) player.getPlayerEntity()).getHandle());
wasOnline = true;
}
tracker.a();
}
else if (wasOnline) {
trackers.remove(tracker);
wasOnline = false;
}
}
}.runTaskTimer(Denizen.getInstance(), 1, 1);
}
}
return entTag;
fake.triggerUpdatePacket = new Runnable() {
@Override
public void run() {
for (EntityTrackerEntry tracker : trackers) {
tracker.a();
}
}
};
return fake;
}

@Override
Expand Down

0 comments on commit 5a83b4e

Please sign in to comment.