Ensure getEntityModifier is thread safe. FIXES Ticket-6.
Don't use the world's getPlayers-method, as it's enumerating a collection that's not thread safe. This is important as getEntityModifier may be called by a client packet listener (which is async).
Dieser Commit ist enthalten in:
Ursprung
aa9616d6b0
Commit
51184dd209
@ -26,6 +26,8 @@ import java.io.Serializable;
|
|||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Server;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.WorldType;
|
import org.bukkit.WorldType;
|
||||||
import org.bukkit.craftbukkit.CraftWorld;
|
import org.bukkit.craftbukkit.CraftWorld;
|
||||||
@ -268,7 +270,6 @@ public class PacketContainer implements Serializable {
|
|||||||
|
|
||||||
final Object worldServer = ((CraftWorld) world).getHandle();
|
final Object worldServer = ((CraftWorld) world).getHandle();
|
||||||
final Class<?> nmsEntityClass = net.minecraft.server.Entity.class;
|
final Class<?> nmsEntityClass = net.minecraft.server.Entity.class;
|
||||||
final World worldCopy = world;
|
|
||||||
|
|
||||||
if (getEntity == null)
|
if (getEntity == null)
|
||||||
getEntity = FuzzyReflection.fromObject(worldServer).getMethodByParameters(
|
getEntity = FuzzyReflection.fromObject(worldServer).getMethodByParameters(
|
||||||
@ -296,12 +297,16 @@ public class PacketContainer implements Serializable {
|
|||||||
if (nmsEntity != null) {
|
if (nmsEntity != null) {
|
||||||
return nmsEntity.getBukkitEntity();
|
return nmsEntity.getBukkitEntity();
|
||||||
} else {
|
} else {
|
||||||
// Maybe it's a player that's just logged in? Try a search
|
Server server = Bukkit.getServer();
|
||||||
for (Player player : worldCopy.getPlayers()) {
|
|
||||||
|
// Maybe it's a player that has just logged in? Try a search
|
||||||
|
if (server != null) {
|
||||||
|
for (Player player : server.getOnlinePlayers()) {
|
||||||
if (player.getEntityId() == id) {
|
if (player.getEntityId() == id) {
|
||||||
return player;
|
return player;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren