diff --git a/common/src/main/java/me/zimzaza4/geyserutils/common/packet/UpdateEntityScorePacket.java b/common/src/main/java/me/zimzaza4/geyserutils/common/packet/UpdateEntityScorePacket.java new file mode 100644 index 0000000..216080b --- /dev/null +++ b/common/src/main/java/me/zimzaza4/geyserutils/common/packet/UpdateEntityScorePacket.java @@ -0,0 +1,16 @@ +package me.zimzaza4.geyserutils.common.packet; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +public class UpdateEntityScorePacket extends CustomPayloadPacket { + private int entityId; + private String objective; + private int score; +} diff --git a/geyser/libs/Geyser-Standalone.jar b/geyser/libs/Geyser-Standalone.jar index ac5aefc..a8bcbf0 100644 Binary files a/geyser/libs/Geyser-Standalone.jar and b/geyser/libs/Geyser-Standalone.jar differ diff --git a/geyser/pom.xml b/geyser/pom.xml index 66f6daa..3d8a5d0 100644 --- a/geyser/pom.xml +++ b/geyser/pom.xml @@ -79,7 +79,7 @@ org.geysermc.geyser core - 2.2.3-SNAPSHOT + 2.3.0-SNAPSHOT system ${project.basedir}/libs/Geyser-Standalone.jar diff --git a/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/GeyserUtils.java b/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/GeyserUtils.java index 4a5abae..2e3088a 100644 --- a/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/GeyserUtils.java +++ b/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/GeyserUtils.java @@ -1,15 +1,18 @@ package me.zimzaza4.geyserutils.geyser; -import com.github.steveice10.mc.protocol.packet.common.clientbound.ClientboundCustomPayloadPacket; -import com.github.steveice10.mc.protocol.packet.common.serverbound.ServerboundCustomPayloadPacket; -import com.github.steveice10.packetlib.Session; -import com.github.steveice10.packetlib.event.session.PacketSendingEvent; -import com.github.steveice10.packetlib.event.session.SessionAdapter; -import com.github.steveice10.packetlib.packet.Packet; +import org.geysermc.mcprotocollib.network.packet.Packet; +import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundCustomPayloadPacket; +import org.geysermc.mcprotocollib.protocol.packet.common.serverbound.ServerboundCustomPayloadPacket; +import org.geysermc.mcprotocollib.network.Session; +import org.geysermc.mcprotocollib.network.event.session.PacketSendingEvent; +import org.geysermc.mcprotocollib.network.event.session.SessionAdapter; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.common.reflect.TypeToken; -import com.google.gson.*; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; import lombok.Getter; import me.zimzaza4.geyserutils.common.camera.data.CameraPreset; import me.zimzaza4.geyserutils.common.camera.instruction.ClearInstruction; @@ -22,11 +25,11 @@ import me.zimzaza4.geyserutils.common.packet.*; import me.zimzaza4.geyserutils.geyser.form.NpcDialogueForm; import me.zimzaza4.geyserutils.geyser.form.NpcDialogueForms; import me.zimzaza4.geyserutils.geyser.form.element.Button; +import me.zimzaza4.geyserutils.geyser.scoreboard.EntityScoreboard; import me.zimzaza4.geyserutils.geyser.translator.NPCFormResponseTranslator; import me.zimzaza4.geyserutils.geyser.util.Converter; import org.cloudburstmc.nbt.NbtMap; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; -import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; import org.cloudburstmc.protocol.bedrock.data.skin.ImageData; import org.cloudburstmc.protocol.bedrock.data.skin.SerializedSkin; import org.cloudburstmc.protocol.bedrock.packet.*; @@ -50,6 +53,7 @@ import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.skin.SkinProvider; import org.geysermc.geyser.util.DimensionUtils; +import org.geysermc.mcprotocollib.network.event.session.PacketSendingEvent; import org.jetbrains.annotations.NotNull; import javax.imageio.ImageIO; @@ -57,7 +61,10 @@ import java.io.*; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.*; -import java.util.concurrent.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; public class GeyserUtils implements Extension { @@ -75,6 +82,9 @@ public class GeyserUtils implements Extension { @Getter public static Map> CUSTOM_ENTITIES = new ConcurrentHashMap<>(); + @Getter + public static Map scoreboards = new ConcurrentHashMap<>(); + static SkinProvider.Cape EMPTY_CAPE = new SkinProvider.Cape("", "no-cape", new byte[0], -1, true); ; @@ -85,7 +95,6 @@ public class GeyserUtils implements Extension { packetManager = new PacketManager(); Registries.BEDROCK_PACKET_TRANSLATORS.register(NpcRequestPacket.class, new NPCFormResponseTranslator()); - logger().info("Loading Skins:"); loadSkins(); CameraPreset.load(); @@ -115,7 +124,7 @@ public class GeyserUtils implements Extension { file.createNewFile(); gson.toJson(new JsonArray(),new FileWriter(file)); } catch (IOException e) { - throw new RuntimeException(e); + e.printStackTrace(); } } @@ -126,11 +135,8 @@ public class GeyserUtils implements Extension { logger().info("Registered: " + s); addCustomEntity(s); } - } catch (FileNotFoundException e) { - throw new RuntimeException(e); + } catch (Exception e) { } - - } @Subscribe @@ -337,6 +343,7 @@ public class GeyserUtils implements Extension { sendSkinPacket(session, player, data); } } + } else if (customPacket instanceof CustomEntityDataPacket customEntityDataPacket) { Entity entity = (session.getEntityCache().getEntityByJavaId(customEntityDataPacket.getEntityId())); if (entity != null) { @@ -352,6 +359,12 @@ public class GeyserUtils implements Extension { Cache cache = CUSTOM_ENTITIES.get(session); cache.put(customEntityPacket.getEntityId(), customEntityPacket.getIdentifier()); + } else if (customPacket instanceof UpdateEntityScorePacket updateEntityScorePacket) { + EntityScoreboard scoreboard = scoreboards.computeIfAbsent(session, k -> new EntityScoreboard(session)); + Entity entity = (session.getEntityCache().getEntityByJavaId(updateEntityScorePacket.getEntityId())); + if (entity != null) { + scoreboard.updateScore(updateEntityScorePacket.getObjective(), entity.getGeyserId(), updateEntityScorePacket.getScore()); + } } } } diff --git a/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/scoreboard/EntityScoreboard.java b/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/scoreboard/EntityScoreboard.java new file mode 100644 index 0000000..8be192e --- /dev/null +++ b/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/scoreboard/EntityScoreboard.java @@ -0,0 +1,42 @@ +package me.zimzaza4.geyserutils.geyser.scoreboard; + +import org.cloudburstmc.protocol.bedrock.data.ScoreInfo; +import org.cloudburstmc.protocol.bedrock.packet.SetScorePacket; +import org.geysermc.geyser.scoreboard.Scoreboard; +import org.geysermc.geyser.session.GeyserSession; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class EntityScoreboard { + private final GeyserSession session; + + private final Map> objectives = new ConcurrentHashMap(); + private Scoreboard scoreboard; + + public EntityScoreboard(GeyserSession session) { + this.session = session; + this.scoreboard = session.getWorldCache().getScoreboard(); + } + + + public void updateScore(String objective, long entityId, int score) { + Scoreboard scoreboard = session.getWorldCache().getScoreboard(); + Map scores = objectives.computeIfAbsent(objective, k -> new HashMap<>()); + ScoreInfo info = scores.get(entityId); + if (info == null) { + info = new ScoreInfo(scoreboard.getNextId().getAndIncrement(), objective, score, ScoreInfo.ScorerType.ENTITY, entityId); + } + List infos = new ArrayList<>(); + infos.add(info); + SetScorePacket setScorePacket = new SetScorePacket(); + setScorePacket.setAction(SetScorePacket.Action.SET); + setScorePacket.setInfos(infos); + this.session.sendUpstreamPacket(setScorePacket); + + } + +} diff --git a/spigot/src/main/java/me/zimzaza4/geyserutils/spigot/api/PlayerUtils.java b/spigot/src/main/java/me/zimzaza4/geyserutils/spigot/api/PlayerUtils.java index 4291d8c..83ed1b6 100644 --- a/spigot/src/main/java/me/zimzaza4/geyserutils/spigot/api/PlayerUtils.java +++ b/spigot/src/main/java/me/zimzaza4/geyserutils/spigot/api/PlayerUtils.java @@ -82,4 +82,10 @@ public class PlayerUtils { player.sendPluginMessage(GeyserUtils.getInstance(), GeyserUtilsChannels.MAIN, GeyserUtils.getPacketManager().encodePacket(packet)); } + + public static void sendEntityScoreUpdate(Player player, Entity entity, String objective, int score) { + UpdateEntityScorePacket packet = new UpdateEntityScorePacket(entity.getEntityId(), objective, score); + player.sendPluginMessage(GeyserUtils.getInstance(), GeyserUtilsChannels.MAIN, GeyserUtils.getPacketManager().encodePacket(packet)); + + } }