Fix Inventory#getViewers on the player inventory not returning the player first time their inventory is opened

By: md_5 <git@md-5.net>
This commit is contained in:
CraftBukkit/Spigot 2021-06-20 09:27:32 +10:00
parent 41524cf726
commit 66df1397b3
4 changed files with 64 additions and 62 deletions

View file

@ -246,7 +246,7 @@
+ }
+
+ if (this.oldLevel != this.experienceLevel) {
+ CraftEventFactory.callPlayerLevelChangeEvent(this.level.getCraftServer().getPlayer((EntityPlayer) this), this.oldLevel, this.experienceLevel);
+ CraftEventFactory.callPlayerLevelChangeEvent(this.getBukkitEntity(), this.oldLevel, this.experienceLevel);
+ this.oldLevel = this.experienceLevel;
+ }
+ // CraftBukkit end

View file

@ -157,7 +157,7 @@
+ }
+ String leaveMessage = EnumChatFormat.YELLOW + this.player.getName() + " left the game.";
+
+ PlayerKickEvent event = new PlayerKickEvent(this.cserver.getPlayer(this.player), s, leaveMessage);
+ PlayerKickEvent event = new PlayerKickEvent(this.player.getBukkitEntity(), s, leaveMessage);
+
+ if (this.cserver.getServer().isRunning()) {
+ this.cserver.getPluginManager().callEvent(event);
@ -1611,7 +1611,7 @@
}
+ // CraftBukkit start
+ Player player = this.cserver.getPlayer(this.player);
+ Player player = this.player.getBukkitEntity();
+ int x = packetplayinupdatesign.b().getX();
+ int y = packetplayinupdatesign.b().getY();
+ int z = packetplayinupdatesign.b().getZ();
@ -1628,7 +1628,7 @@
+ lines[i] = EnumChatFormat.a(new ChatComponentText(EnumChatFormat.a(itextfilter_a.a())).getString());
+ }
+ }
+ SignChangeEvent event = new SignChangeEvent((org.bukkit.craftbukkit.block.CraftBlock) player.getWorld().getBlockAt(x, y, z), this.cserver.getPlayer(this.player), lines);
+ SignChangeEvent event = new SignChangeEvent((org.bukkit.craftbukkit.block.CraftBlock) player.getWorld().getBlockAt(x, y, z), this.player.getBukkitEntity(), lines);
+ this.cserver.getPluginManager().callEvent(event);
+
+ if (!event.isCancelled()) {
@ -1657,7 +1657,7 @@
- this.player.getAbilities().flying = packetplayinabilities.isFlying() && this.player.getAbilities().mayfly;
+ // CraftBukkit start
+ if (this.player.getAbilities().mayfly && this.player.getAbilities().flying != packetplayinabilities.isFlying()) {
+ PlayerToggleFlightEvent event = new PlayerToggleFlightEvent(this.cserver.getPlayer(this.player), packetplayinabilities.isFlying());
+ PlayerToggleFlightEvent event = new PlayerToggleFlightEvent(this.player.getBukkitEntity(), packetplayinabilities.isFlying());
+ this.cserver.getPluginManager().callEvent(event);
+ if (!event.isCancelled()) {
+ this.player.getAbilities().flying = packetplayinabilities.isFlying(); // Actually set the player's flying status

View file

@ -1,6 +1,6 @@
--- a/net/minecraft/server/players/PlayerList.java
+++ b/net/minecraft/server/players/PlayerList.java
@@ -93,6 +93,25 @@
@@ -93,6 +93,26 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@ -14,6 +14,7 @@
+import org.bukkit.Location;
+import org.bukkit.craftbukkit.CraftServer;
+import org.bukkit.craftbukkit.CraftWorld;
+import org.bukkit.craftbukkit.entity.CraftPlayer;
+import org.bukkit.craftbukkit.util.CraftChatMessage;
+import org.bukkit.entity.Player;
+import org.bukkit.event.player.PlayerChangedWorldEvent;
@ -26,7 +27,7 @@
public abstract class PlayerList {
public static final File USERBANLIST_FILE = new File("banned-players.json");
@@ -103,14 +122,16 @@
@@ -103,14 +123,16 @@
private static final int SEND_PLAYER_INFO_INTERVAL = 600;
private static final SimpleDateFormat BAN_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z");
private final MinecraftServer server;
@ -40,13 +41,13 @@
- private final Map<UUID, ServerStatisticManager> stats;
- private final Map<UUID, AdvancementDataPlayer> advancements;
+ // CraftBukkit start
+ // private final Map<UUID, ServerStatisticManager> o;
+ // private final Map<UUID, AdvancementDataPlayer> p;
+ // private final Map<UUID, ServerStatisticManager> stats;
+ // private final Map<UUID, AdvancementDataPlayer> advancements;
+ // CraftBukkit end
public final WorldNBTStorage playerIo;
private boolean doWhiteList;
private final IRegistryCustom.Dimension registryHolder;
@@ -120,13 +141,23 @@
@@ -120,13 +142,23 @@
private static final boolean ALLOW_LOGOUTIVATOR = false;
private int sendAllPlayerInfoIn;
@ -66,13 +67,13 @@
- this.stats = Maps.newHashMap();
- this.advancements = Maps.newHashMap();
+ // CraftBukkit start
+ // this.o = Maps.newHashMap();
+ // this.p = Maps.newHashMap();
+ // this.stats = Maps.newHashMap();
+ // this.advancements = Maps.newHashMap();
+ // CraftBukkit end
this.server = minecraftserver;
this.registryHolder = iregistrycustom_dimension;
this.maxPlayers = i;
@@ -142,6 +173,12 @@
@@ -142,6 +174,12 @@
usercache.a(gameprofile);
NBTTagCompound nbttagcompound = this.a(entityplayer);
ResourceKey resourcekey;
@ -85,7 +86,7 @@
if (nbttagcompound != null) {
DataResult dataresult = DimensionManager.a(new Dynamic(DynamicOpsNBT.INSTANCE, nbttagcompound.get("Dimension")));
@@ -171,7 +208,8 @@
@@ -171,7 +209,8 @@
s1 = networkmanager.getSocketAddress().toString();
}
@ -95,7 +96,7 @@
WorldData worlddata = worldserver1.getWorldData();
entityplayer.c(nbttagcompound);
@@ -181,6 +219,7 @@
@@ -181,6 +220,7 @@
boolean flag1 = gamerules.getBoolean(GameRules.RULE_REDUCEDDEBUGINFO);
playerconnection.sendPacket(new PacketPlayOutLogin(entityplayer.getId(), entityplayer.gameMode.getGameMode(), entityplayer.gameMode.c(), BiomeManager.a(worldserver1.getSeed()), worlddata.isHardcore(), this.server.G(), this.registryHolder, worldserver1.getDimensionManager(), worldserver1.getDimensionKey(), this.getMaxPlayers(), this.viewDistance, flag1, !flag, worldserver1.isDebugWorld(), worldserver1.isFlatWorld()));
@ -103,7 +104,7 @@
playerconnection.sendPacket(new PacketPlayOutCustomPayload(PacketPlayOutCustomPayload.BRAND, (new PacketDataSerializer(Unpooled.buffer())).a(this.getServer().getServerModName())));
playerconnection.sendPacket(new PacketPlayOutServerDifficulty(worlddata.getDifficulty(), worlddata.isDifficultyLocked()));
playerconnection.sendPacket(new PacketPlayOutAbilities(entityplayer.getAbilities()));
@@ -199,19 +238,61 @@
@@ -199,19 +239,66 @@
} else {
chatmessage = new ChatMessage("multiplayer.player.joined.renamed", new Object[]{entityplayer.getScoreboardDisplayName(), s});
}
@ -119,7 +120,12 @@
+ // this.sendAll(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, new EntityPlayer[]{entityplayer})); // CraftBukkit - replaced with loop below
+
+ // CraftBukkit start
+ PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent(cserver.getPlayer(entityplayer), joinMessage);
+ CraftPlayer bukkitPlayer = entityplayer.getBukkitEntity();
+
+ // Ensure that player inventory is populated with its viewer
+ entityplayer.containerMenu.transferTo(entityplayer.containerMenu, bukkitPlayer);
+
+ PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent(bukkitPlayer, joinMessage);
+ cserver.getPluginManager().callEvent(playerJoinEvent);
+
+ if (!entityplayer.connection.connection.isConnected()) {
@ -142,35 +148,35 @@
- entityplayer.connection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, new EntityPlayer[]{(EntityPlayer) this.players.get(i)}));
+ EntityPlayer entityplayer1 = (EntityPlayer) this.players.get(i);
+
+ if (entityplayer1.getBukkitEntity().canSee(entityplayer.getBukkitEntity())) {
+ if (entityplayer1.getBukkitEntity().canSee(bukkitPlayer)) {
+ entityplayer1.connection.sendPacket(packet);
+ }
+
+ if (!entityplayer.getBukkitEntity().canSee(entityplayer1.getBukkitEntity())) {
+ if (!bukkitPlayer.canSee(entityplayer1.getBukkitEntity())) {
+ continue;
+ }
+
+ entityplayer.connection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, new EntityPlayer[] { entityplayer1}));
+ }
}
+ entityplayer.sentListPacket = true;
+ // CraftBukkit end
+
- worldserver1.addPlayerJoin(entityplayer);
- this.server.getBossBattleCustomData().a(entityplayer);
+ entityplayer.connection.sendPacket(new PacketPlayOutEntityMetadata(entityplayer.getId(), entityplayer.getDataWatcher(), true)); // CraftBukkit - BungeeCord#2321, send complete data to self on spawn
+
+ // CraftBukkit start - Only add if the player wasn't moved in the event
+ if (entityplayer.level == worldserver1 && !worldserver1.getPlayers().contains(entityplayer)) {
+ worldserver1.addPlayerJoin(entityplayer);
+ this.server.getBossBattleCustomData().a(entityplayer);
}
- worldserver1.addPlayerJoin(entityplayer);
- this.server.getBossBattleCustomData().a(entityplayer);
+ }
+
+ worldserver1 = entityplayer.getWorldServer(); // CraftBukkit - Update in case join event changed it
+ // CraftBukkit end
this.a(entityplayer, worldserver1);
if (!this.server.getResourcePack().isEmpty()) {
entityplayer.setResourcePack(this.server.getResourcePack(), this.server.getResourcePackHash(), this.server.aY(), this.server.bb());
@@ -227,8 +308,11 @@
@@ -227,8 +314,11 @@
if (nbttagcompound != null && nbttagcompound.hasKeyOfType("RootVehicle", 10)) {
NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("RootVehicle");
@ -184,7 +190,7 @@
});
if (entity != null) {
@@ -271,6 +355,8 @@
@@ -271,6 +361,8 @@
}
entityplayer.syncInventory();
@ -193,7 +199,7 @@
}
public void sendScoreboard(ScoreboardServer scoreboardserver, EntityPlayer entityplayer) {
@@ -303,30 +389,31 @@
@@ -303,30 +395,31 @@
}
public void setPlayerFileData(WorldServer worldserver) {
@ -230,7 +236,7 @@
}
@Override
@@ -354,14 +441,15 @@
@@ -354,14 +447,15 @@
}
protected void savePlayerFile(EntityPlayer entityplayer) {
@ -248,7 +254,7 @@
if (advancementdataplayer != null) {
advancementdataplayer.b();
@@ -369,10 +457,24 @@
@@ -369,10 +463,24 @@
}
@ -264,7 +270,7 @@
+ entityplayer.closeInventory();
+ }
+
+ PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(cserver.getPlayer(entityplayer), "\u00A7e" + entityplayer.getName() + " left the game");
+ PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(entityplayer.getBukkitEntity(), "\u00A7e" + entityplayer.getName() + " left the game");
+ cserver.getPluginManager().callEvent(playerQuitEvent);
+ entityplayer.getBukkitEntity().disconnect(playerQuitEvent.getQuitMessage());
+
@ -274,15 +280,15 @@
this.savePlayerFile(entityplayer);
if (entityplayer.isPassenger()) {
Entity entity = entityplayer.getRootVehicle();
@@ -396,18 +498,66 @@
@@ -396,18 +504,66 @@
if (entityplayer1 == entityplayer) {
this.playersByUUID.remove(uuid);
- this.stats.remove(uuid);
- this.advancements.remove(uuid);
+ // CraftBukkit start
+ // this.o.remove(uuid);
+ // this.p.remove(uuid);
+ // this.stats.remove(uuid);
+ // this.advancements.remove(uuid);
+ // CraftBukkit end
+ }
+
@ -347,7 +353,7 @@
GameProfileBanEntry gameprofilebanentry = (GameProfileBanEntry) this.bans.get(gameprofile);
chatmessage = new ChatMessage("multiplayer.disconnect.banned.reason", new Object[]{gameprofilebanentry.getReason()});
@@ -415,10 +565,12 @@
@@ -415,10 +571,12 @@
chatmessage.addSibling(new ChatMessage("multiplayer.disconnect.banned.expiration", new Object[]{PlayerList.BAN_DATE_FORMAT.format(gameprofilebanentry.getExpires())}));
}
@ -363,7 +369,7 @@
IpBanEntry ipbanentry = this.ipBans.get(socketaddress);
chatmessage = new ChatMessage("multiplayer.disconnect.banned_ip.reason", new Object[]{ipbanentry.getReason()});
@@ -426,13 +578,25 @@
@@ -426,13 +584,25 @@
chatmessage.addSibling(new ChatMessage("multiplayer.disconnect.banned_ip.expiration", new Object[]{PlayerList.BAN_DATE_FORMAT.format(ipbanentry.getExpires())}));
}
@ -392,7 +398,7 @@
UUID uuid = EntityHuman.a(gameprofile);
List<EntityPlayer> list = Lists.newArrayList();
@@ -459,14 +623,24 @@
@@ -459,14 +629,24 @@
}
return new EntityPlayer(this.server, this.server.F(), gameprofile);
@ -417,7 +423,7 @@
WorldServer worldserver = this.server.getWorldServer(entityplayer.getSpawnDimension());
Optional optional;
@@ -478,6 +652,11 @@
@@ -478,6 +658,11 @@
WorldServer worldserver1 = worldserver != null && optional.isPresent() ? worldserver : this.server.F();
EntityPlayer entityplayer1 = new EntityPlayer(this.server, worldserver1, entityplayer.getProfile());
@ -429,7 +435,7 @@
entityplayer1.connection = entityplayer.connection;
entityplayer1.copyFrom(entityplayer, flag);
@@ -493,49 +672,110 @@
@@ -493,49 +678,110 @@
boolean flag2 = false;
@ -465,7 +471,8 @@
+ f1 = f;
+ } else {
+ Vec3D vec3d1 = Vec3D.c((BaseBlockPosition) blockposition).d(vec3d).d();
+
- f1 = (float) MathHelper.f(MathHelper.d(vec3d1.z, vec3d1.x) * 57.2957763671875D - 90.0D);
+ f1 = (float) MathHelper.f(MathHelper.d(vec3d1.z, vec3d1.x) * 57.2957763671875D - 90.0D);
+ }
+
@ -477,8 +484,7 @@
+ entityplayer1.connection.sendPacket(new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.NO_RESPAWN_BLOCK_AVAILABLE, 0.0F));
+ }
+ }
- f1 = (float) MathHelper.f(MathHelper.d(vec3d1.z, vec3d1.x) * 57.2957763671875D - 90.0D);
+
+ if (location == null) {
+ worldserver1 = this.server.getWorldServer(World.OVERWORLD);
+ blockposition = entityplayer1.getSpawnPoint(worldserver1);
@ -490,7 +496,7 @@
- flag2 = !flag && flag3;
- } else if (blockposition != null) {
- entityplayer1.connection.sendPacket(new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.NO_RESPAWN_BLOCK_AVAILABLE, 0.0F));
+ Player respawnPlayer = cserver.getPlayer(entityplayer1);
+ Player respawnPlayer = entityplayer1.getBukkitEntity();
+ PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(respawnPlayer, location, isBedSpawn && !flag2, flag2);
+ cserver.getPluginManager().callEvent(respawnEvent);
+
@ -549,13 +555,13 @@
+
+ // Fire advancement trigger
+ entityplayer.triggerDimensionAdvancements(((CraftWorld) fromWorld).getHandle());
+
+ // Don't fire on respawn
+ if (fromWorld != location.getWorld()) {
+ PlayerChangedWorldEvent event = new PlayerChangedWorldEvent(entityplayer.getBukkitEntity(), fromWorld);
+ server.server.getPluginManager().callEvent(event);
+ }
+
+ // Save player file again if they were disconnected
+ if (entityplayer.connection.isDisconnected()) {
+ this.savePlayerFile(entityplayer);
@ -564,7 +570,7 @@
return entityplayer1;
}
@@ -548,7 +788,18 @@
@@ -548,7 +794,18 @@
public void tick() {
if (++this.sendAllPlayerInfoIn > 600) {
@ -584,7 +590,7 @@
this.sendAllPlayerInfoIn = 0;
}
@@ -565,6 +816,25 @@
@@ -565,6 +822,25 @@
}
@ -610,7 +616,7 @@
public void a(Packet<?> packet, ResourceKey<World> resourcekey) {
Iterator iterator = this.players.iterator();
@@ -667,6 +937,7 @@
@@ -667,6 +943,7 @@
entityplayer.connection.sendPacket(new PacketPlayOutEntityStatus(entityplayer, b0));
}
@ -618,7 +624,7 @@
this.server.getCommandDispatcher().a(entityplayer);
}
@@ -699,6 +970,12 @@
@@ -699,6 +976,12 @@
for (int i = 0; i < this.players.size(); ++i) {
EntityPlayer entityplayer = (EntityPlayer) this.players.get(i);
@ -631,7 +637,7 @@
if (entityplayer != entityhuman && entityplayer.level.getDimensionKey() == resourcekey) {
double d4 = d0 - entityplayer.locX();
double d5 = d1 - entityplayer.locY();
@@ -738,23 +1015,34 @@
@@ -738,23 +1021,34 @@
public void reloadWhitelist() {}
public void a(EntityPlayer entityplayer, WorldServer worldserver) {
@ -671,7 +677,7 @@
}
public int getPlayerCount() {
@@ -805,12 +1093,22 @@
@@ -805,12 +1099,22 @@
}
public void shutdown() {
@ -696,7 +702,7 @@
public void sendMessage(IChatBaseComponent ichatbasecomponent, ChatMessageType chatmessagetype, UUID uuid) {
this.server.sendMessage(ichatbasecomponent, uuid);
Iterator iterator = this.players.iterator();
@@ -838,16 +1136,23 @@
@@ -838,16 +1142,23 @@
}
@ -724,16 +730,16 @@
if (file2.exists() && file2.isFile()) {
file2.renameTo(file1);
@@ -855,7 +1160,7 @@
@@ -855,7 +1166,7 @@
}
serverstatisticmanager = new ServerStatisticManager(this.server, file1);
- this.stats.put(uuid, serverstatisticmanager);
+ // this.o.put(uuid, serverstatisticmanager); // CraftBukkit
+ // this.stats.put(uuid, serverstatisticmanager); // CraftBukkit
}
return serverstatisticmanager;
@@ -863,14 +1168,14 @@
@@ -863,14 +1174,14 @@
public AdvancementDataPlayer f(EntityPlayer entityplayer) {
UUID uuid = entityplayer.getUniqueID();
@ -746,17 +752,17 @@
advancementdataplayer = new AdvancementDataPlayer(this.server.getDataFixer(), this, this.server.getAdvancementData(), file1, entityplayer);
- this.advancements.put(uuid, advancementdataplayer);
+ // this.p.put(uuid, advancementdataplayer); // CraftBukkit
+ // this.advancements.put(uuid, advancementdataplayer); // CraftBukkit
}
advancementdataplayer.a(entityplayer);
@@ -906,13 +1211,20 @@
@@ -906,13 +1217,20 @@
}
public void reload() {
- Iterator iterator = this.advancements.values().iterator();
+ // CraftBukkit start
+ /*Iterator iterator = this.p.values().iterator();
+ /*Iterator iterator = this.advancements.values().iterator();
while (iterator.hasNext()) {
AdvancementDataPlayer advancementdataplayer = (AdvancementDataPlayer) iterator.next();

View file

@ -555,10 +555,6 @@ public final class CraftServer implements Server {
return broadcast(message, BROADCAST_CHANNEL_USERS);
}
public Player getPlayer(final EntityPlayer entity) {
return entity.getBukkitEntity();
}
@Override
@Deprecated
public List<Player> matchPlayer(String partialName) {