diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Promise.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Promise.java deleted file mode 100644 index 393932f3..00000000 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/Promise.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2020 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.core; - -import lombok.NoArgsConstructor; - -import java.util.concurrent.atomic.AtomicBoolean; - -@NoArgsConstructor -public class Promise { - - private AtomicBoolean hasValue = new AtomicBoolean(false); - private E value; - - public void setValue(E value) { - this.value = value; - hasValue.set(true); - } - - public E getValue() { - if (hasValue.get()) { - return value; - } - - while (hasValue.get()) { - Thread.yield(); - } - return value; - } -} diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/RPlayer.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/RPlayer.java index 5efdd3f9..2575a778 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/RPlayer.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/entity/RPlayer.java @@ -22,7 +22,10 @@ package de.steamwar.entity; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; import de.steamwar.Reflection; -import de.steamwar.core.*; +import de.steamwar.core.BountifulWrapper; +import de.steamwar.core.Core; +import de.steamwar.core.FlatteningWrapper; +import de.steamwar.core.ProtocolWrapper; import de.steamwar.network.NetworkSender; import de.steamwar.network.packets.common.PlayerSkinRequestPacket; import lombok.Getter; @@ -72,22 +75,21 @@ public class RPlayer extends REntity { server.addEntity(this); } - public static final Map> SKIN_DATA_PROMISES = new LinkedHashMap>() { + public static final Map SKIN_DATA_PROMISES = new LinkedHashMap() { @Override - protected boolean removeEldestEntry(Map.Entry> eldest) { + protected boolean removeEldestEntry(Map.Entry eldest) { return size() > 100; } }; private GameProfile getGameProfile() { - Property property = SKIN_DATA_PROMISES.computeIfAbsent(uuid, __ -> { - Promise future = new Promise<>(); + Property skinData = SKIN_DATA_PROMISES.computeIfAbsent(uuid, __ -> { NetworkSender.sendOrQueue(new PlayerSkinRequestPacket(uuid)); - return future; - }).getValue(); - if (property != null) { + return new Property("textures", null, null); + }); + if (skinData.getValue() != null) { GameProfile gameProfile = new GameProfile(uuid, name); - gameProfile.getProperties().put("textures", property); + gameProfile.getProperties().put("textures", skinData); return gameProfile; } else { return new GameProfile(actualUUID, name); diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/network/CoreNetworkHandler.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/network/CoreNetworkHandler.java index 407e9e41..50ee9fcb 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/network/CoreNetworkHandler.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/network/CoreNetworkHandler.java @@ -21,7 +21,6 @@ package de.steamwar.network; import com.mojang.authlib.properties.Property; import de.steamwar.core.BountifulWrapper; -import de.steamwar.core.Promise; import de.steamwar.entity.RPlayer; import de.steamwar.network.handlers.InventoryHandler; import de.steamwar.network.packets.PacketHandler; @@ -75,8 +74,8 @@ public class CoreNetworkHandler extends PacketHandler { @Handler public void handlePlayerSkinResponse(PlayerSkinResponsePacket packet) { - Promise propertyPromise = RPlayer.SKIN_DATA_PROMISES.get(packet.getUuid()); - if (propertyPromise == null) return; - propertyPromise.setValue(new Property("textures", packet.getSkin(), packet.getSignature())); + Property property = RPlayer.SKIN_DATA_PROMISES.get(packet.getUuid()); + if (property == null) return; + RPlayer.SKIN_DATA_PROMISES.put(packet.getUuid(), new Property("textures", packet.getSkin(), packet.getSignature())); } } diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/network/NetworkSender.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/network/NetworkSender.java index 2dda8b92..8000ff23 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/network/NetworkSender.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/network/NetworkSender.java @@ -27,15 +27,12 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerQuitEvent; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; public class NetworkSender implements Listener { - private static AtomicInteger numberOfPlayers = new AtomicInteger(0); private static List queued = new ArrayList<>(); static { @@ -47,21 +44,17 @@ public class NetworkSender implements Listener { @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { - numberOfPlayers.incrementAndGet(); - if (numberOfPlayers.get() > 1) return; + if (!Bukkit.getOnlinePlayers().isEmpty()) { + return; + } Bukkit.getScheduler().runTaskLater(Core.getInstance(), () -> { queued.forEach(NetworkSender::send); queued.clear(); }, 1); } - @EventHandler - public void onPlayerQuit(PlayerQuitEvent event) { - numberOfPlayers.decrementAndGet(); - } - public static void sendOrQueue(NetworkPacket packet) { - if (numberOfPlayers.get() > 0) { + if (!Bukkit.getOnlinePlayers().isEmpty()) { send(packet); } else { queued.add(packet); diff --git a/VelocityCore/src/de/steamwar/velocitycore/network/handlers/PlayerSkinHandler.java b/VelocityCore/src/de/steamwar/velocitycore/network/handlers/PlayerSkinHandler.java index 0baf15ba..0515212e 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/network/handlers/PlayerSkinHandler.java +++ b/VelocityCore/src/de/steamwar/velocitycore/network/handlers/PlayerSkinHandler.java @@ -30,10 +30,11 @@ import com.velocitypowered.api.util.GameProfile; import de.steamwar.network.packets.PacketHandler; import de.steamwar.network.packets.common.PlayerSkinRequestPacket; import de.steamwar.network.packets.common.PlayerSkinResponsePacket; -import de.steamwar.persistent.Storage; import de.steamwar.velocitycore.VelocityCore; import de.steamwar.velocitycore.network.NetworkSender; import de.steamwar.velocitycore.network.ServerMetaInfo; +import lombok.AllArgsConstructor; +import lombok.Data; import lombok.SneakyThrows; import java.io.BufferedReader; @@ -55,15 +56,9 @@ public class PlayerSkinHandler extends PacketHandler { VelocityCore.getProxy().getEventManager().register(VelocityCore.get(), this); } - private Map skins = new LinkedHashMap<>() { + private Map skins = new LinkedHashMap<>() { @Override - protected boolean removeEldestEntry(Map.Entry eldest) { - return size() > maxCacheSize; - } - }; - private Map signatures = new LinkedHashMap<>() { - @Override - protected boolean removeEldestEntry(Map.Entry eldest) { + protected boolean removeEldestEntry(Map.Entry eldest) { return size() > maxCacheSize; } }; @@ -71,8 +66,9 @@ public class PlayerSkinHandler extends PacketHandler { @Handler @SneakyThrows public void handle(PlayerSkinRequestPacket packet) { - if (skins.containsKey(packet.getUuid()) && signatures.containsKey(packet.getUuid())) { - NetworkSender.send(((ServerMetaInfo) packet.getMetaInfos()).sender().getServer(), new PlayerSkinResponsePacket(packet.getUuid(), skins.get(packet.getUuid()), signatures.get(packet.getUuid()))); + if (skins.containsKey(packet.getUuid())) { + SkinData skinData = skins.get(packet.getUuid()); + NetworkSender.send(((ServerMetaInfo) packet.getMetaInfos()).sender().getServer(), new PlayerSkinResponsePacket(packet.getUuid(), skinData.skin, skinData.signature)); return; } @@ -98,8 +94,7 @@ public class PlayerSkinHandler extends PacketHandler { if (prop.get("name").getAsString().equals("textures")) { String skin = prop.get("value").getAsString(); String signature = prop.get("signature").getAsString(); - skins.put(packet.getUuid(), skin); - signatures.put(packet.getUuid(), signature); + skins.put(packet.getUuid(), new SkinData(skin, signature)); NetworkSender.send(((ServerMetaInfo) packet.getMetaInfos()).sender().getServer(), new PlayerSkinResponsePacket(packet.getUuid(), skin, signature)); return; } @@ -112,14 +107,15 @@ public class PlayerSkinHandler extends PacketHandler { GameProfile gameProfile = player.getGameProfile(); GameProfile.Property property = gameProfile.getProperties().stream().filter(p -> p.getName().equals("textures")).findFirst().orElse(null); if (property == null) return; - skins.put(player.getUniqueId(), property.getValue()); - signatures.put(player.getUniqueId(), property.getSignature()); + skins.put(player.getUniqueId(), new SkinData(property.getValue(), property.getSignature())); Set uuidSet = skins.keySet(); VelocityCore.getProxy().getAllServers().forEach(server -> { for (UUID uuid : uuidSet) { - NetworkSender.send(server, new PlayerSkinResponsePacket(uuid, skins.get(uuid), signatures.get(uuid))); + NetworkSender.send(server, new PlayerSkinResponsePacket(uuid, property.getValue(), property.getSignature())); } }); } + + public record SkinData(String skin, String signature) {} }