From 5fb11fc424eb929b14e623612905e9c26d7c3bab Mon Sep 17 00:00:00 2001 From: kirderf1 Date: Sat, 20 Apr 2024 21:32:23 +0200 Subject: [PATCH] ModusHolder attachment --- .../minestuck/event/ServerEventHandler.java | 16 +-- .../captchalogue/CaptchaDeckHandler.java | 117 ++++++++++++++++-- .../mraof/minestuck/player/PlayerData.java | 86 +------------ .../mraof/minestuck/util/MSCapabilities.java | 3 + 4 files changed, 120 insertions(+), 102 deletions(-) diff --git a/src/main/java/com/mraof/minestuck/event/ServerEventHandler.java b/src/main/java/com/mraof/minestuck/event/ServerEventHandler.java index b4a4b42654..143cf45ce7 100644 --- a/src/main/java/com/mraof/minestuck/event/ServerEventHandler.java +++ b/src/main/java/com/mraof/minestuck/event/ServerEventHandler.java @@ -7,10 +7,14 @@ import com.mraof.minestuck.effects.MSEffects; import com.mraof.minestuck.entity.underling.UnderlingEntity; import com.mraof.minestuck.entry.EntryEvent; +import com.mraof.minestuck.inventory.captchalogue.CaptchaDeckHandler; import com.mraof.minestuck.inventory.captchalogue.HashMapModus; import com.mraof.minestuck.inventory.captchalogue.Modus; import com.mraof.minestuck.item.MSItems; -import com.mraof.minestuck.player.*; +import com.mraof.minestuck.player.Echeladder; +import com.mraof.minestuck.player.EnumAspect; +import com.mraof.minestuck.player.IdentifierHandler; +import com.mraof.minestuck.player.Title; import com.mraof.minestuck.skaianet.TitleSelectionHook; import com.mraof.minestuck.world.storage.MSExtraData; import net.minecraft.server.MinecraftServer; @@ -218,13 +222,9 @@ public static void playerChangedDimension(PlayerEvent.PlayerChangedDimensionEven @SubscribeEvent(priority=EventPriority.LOW, receiveCanceled=false) public static void onServerChat(ServerChatEvent event) { - ServerPlayer player = event.getPlayer(); - if(!(player instanceof FakePlayer)) - { - Modus modus = PlayerSavedData.getData(player).getModus(); - if(modus instanceof HashMapModus) - ((HashMapModus) modus).onChatMessage(event.getPlayer(), event.getMessage().getString()); - } + Modus modus = CaptchaDeckHandler.getModus(event.getPlayer()); + if(modus instanceof HashMapModus hashMapModus) + hashMapModus.onChatMessage(event.getPlayer(), event.getMessage().getString()); } @SubscribeEvent diff --git a/src/main/java/com/mraof/minestuck/inventory/captchalogue/CaptchaDeckHandler.java b/src/main/java/com/mraof/minestuck/inventory/captchalogue/CaptchaDeckHandler.java index 9e05762e08..12837eefbe 100644 --- a/src/main/java/com/mraof/minestuck/inventory/captchalogue/CaptchaDeckHandler.java +++ b/src/main/java/com/mraof/minestuck/inventory/captchalogue/CaptchaDeckHandler.java @@ -12,6 +12,7 @@ import com.mraof.minestuck.player.PlayerBoondollars; import com.mraof.minestuck.player.PlayerData; import com.mraof.minestuck.player.PlayerSavedData; +import com.mraof.minestuck.util.MSCapabilities; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; @@ -27,13 +28,17 @@ import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.LogicalSide; import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.common.util.INBTSerializable; import net.neoforged.neoforge.event.entity.living.LivingDropsEvent; -import net.neoforged.neoforge.network.PacketDistributor; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import javax.annotation.Nullable; +import java.util.List; +import java.util.Objects; +//todo this class could use some spring cleaning @Mod.EventBusSubscriber(modid = Minestuck.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE) public final class CaptchaDeckHandler { @@ -43,7 +48,7 @@ public final class CaptchaDeckHandler public static final int EMPTY_CARD = -2; @SubscribeEvent(priority = EventPriority.LOWEST) - public static void onPlayerDrops(LivingDropsEvent event) + private static void onPlayerDrops(LivingDropsEvent event) { if(event.getEntity() instanceof ServerPlayer player && !event.getEntity().level().getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY)) { @@ -51,6 +56,19 @@ public static void onPlayerDrops(LivingDropsEvent event) } } + @SubscribeEvent + private static void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) + { + ServerPlayer player = (ServerPlayer) event.getEntity(); + + ModusHolder modusHolder = getHolder(player); + if(modusHolder.modus != null) + player.connection.send(ModusDataPacket.create(modusHolder.modus)); + + if(modusHolder.modus == null && !modusHolder.givenModus) + CaptchaDeckHandler.tryGiveStartingModus(modusHolder, player); + } + public static Modus createClientModus(ResourceLocation name) { ModusType type = ModusTypes.REGISTRY.get(name); @@ -112,8 +130,10 @@ private static ItemStack changeModus(ServerPlayer player, ItemStack modusItem, @ if(oldModus == null) { - PlayerData data = PlayerSavedData.getData(player); - newModus.initModus(modusItem, player, null, data.hasGivenModus() ? 0 : MinestuckConfig.SERVER.initialModusSize.get()); + ModusHolder modusHolder = getHolder(player); + newModus.initModus(modusItem, player, null, modusHolder.givenModus + ? 0 + : MinestuckConfig.SERVER.initialModusSize.get()); } else { @@ -131,7 +151,7 @@ private static ItemStack changeModus(ServerPlayer player, ItemStack modusItem, @ } } - PlayerSavedData.getData(player).setModus(newModus); + setModus(getHolder(player), player, newModus); MSCriteriaTriggers.CHANGE_MODUS.get().trigger(player, newModus); @@ -322,11 +342,11 @@ private static void dropSylladex(ServerPlayer player) if(MinestuckConfig.SERVER.sylladexDropMode.get() == MinestuckConfig.DropMode.ALL) { player.drop(modus.getModusItem(), true, false); - PlayerSavedData.getData(player).setModus(null); + setModus(getHolder(player), player, null); } else { modus.initModus(null, player, null, size); - PacketDistributor.PLAYER.with(player).send(ModusDataPacket.create(modus)); + player.connection.send(ModusDataPacket.create(modus)); } } @@ -372,9 +392,13 @@ private static boolean hasModus(ServerPlayer player) return getModus(player) != null; } + @Nullable public static Modus getModus(ServerPlayer player) { - return PlayerSavedData.getData(player).getModus(); + PlayerData playerData = PlayerSavedData.getData(player); + if(playerData == null) + return null; + return playerData.getData(MSCapabilities.MODUS_HOLDER).modus; } private static boolean canMergeItemStacks(ItemStack stack1, ItemStack stack2) @@ -387,4 +411,79 @@ private static boolean canPlayerUseModus(ServerPlayer player) { return !player.isSpectator() && ServerEditHandler.getData(player) == null; } -} \ No newline at end of file + + private static void setModus(ModusHolder modusHolder, ServerPlayer player, @Nullable Modus modus) + { + if(modusHolder.modus == modus) + return; + + modusHolder.modus = modus; + if(modus != null) + modusHolder.givenModus = true; + player.connection.send(ModusDataPacket.create(modus)); + } + + private static void tryGiveStartingModus(ModusHolder modusHolder, ServerPlayer player) + { + List> startingTypes = StartingModusManager.getStartingModusTypes(); + + if(startingTypes.isEmpty()) + return; + + ModusType type = startingTypes.get(player.level().random.nextInt(startingTypes.size())); + if(type == null) + { + modusHolder.givenModus = true; + return; + } + + Modus modus = type.createServerSide(); + if(modus == null) + { + LOGGER.warn("Couldn't create a starting modus type {}.", ModusTypes.REGISTRY.getKey(type)); + return; + } + + modus.initModus(null, player, null, MinestuckConfig.SERVER.initialModusSize.get()); + setModus(modusHolder, player, modus); + } + + private static ModusHolder getHolder(ServerPlayer player) + { + PlayerData data = Objects.requireNonNull(PlayerSavedData.getData(player)); + return data.getData(MSCapabilities.MODUS_HOLDER); + } + + public static class ModusHolder implements INBTSerializable + { + private boolean givenModus = false; + @Nullable + private Modus modus = null; + + @Override + public CompoundTag serializeNBT() + { + CompoundTag nbt = new CompoundTag(); + + CompoundTag modusTag = writeToNBT(modus); + if(modusTag != null) + nbt.put("modus", modusTag); + else + nbt.putBoolean("given_modus", givenModus); + + return null; + } + + @Override + public void deserializeNBT(CompoundTag nbt) + { + if (nbt.contains("modus")) + { + this.modus = readFromNBT(nbt.getCompound("modus"), LogicalSide.SERVER); + givenModus = true; + } + else + givenModus = nbt.getBoolean("given_modus"); + } + } +} diff --git a/src/main/java/com/mraof/minestuck/player/PlayerData.java b/src/main/java/com/mraof/minestuck/player/PlayerData.java index d3615fbceb..3bfb948220 100644 --- a/src/main/java/com/mraof/minestuck/player/PlayerData.java +++ b/src/main/java/com/mraof/minestuck/player/PlayerData.java @@ -1,9 +1,6 @@ package com.mraof.minestuck.player; import com.mraof.minestuck.Minestuck; -import com.mraof.minestuck.MinestuckConfig; -import com.mraof.minestuck.inventory.captchalogue.*; -import com.mraof.minestuck.network.data.ModusDataPacket; import com.mraof.minestuck.world.MSDimensions; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; @@ -15,19 +12,14 @@ import net.minecraft.util.Mth; import net.minecraft.world.level.Level; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.LogicalSide; import net.neoforged.fml.common.Mod; import net.neoforged.neoforge.attachment.AttachmentHolder; import net.neoforged.neoforge.event.entity.player.PlayerEvent; -import net.neoforged.neoforge.network.PacketDistributor; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import java.util.HashMap; -import java.util.List; import java.util.Map; /** @@ -39,13 +31,10 @@ @Mod.EventBusSubscriber(modid = Minestuck.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE) public final class PlayerData extends AttachmentHolder { - private static final Logger LOGGER = LogManager.getLogger(); - @SubscribeEvent public static void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { ServerPlayer player = (ServerPlayer) event.getEntity(); - PlayerSavedData.getData(player).onPlayerLoggedIn(player); MSDimensions.sendDimensionData(player); } @@ -54,9 +43,6 @@ public static void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) private final MinecraftServer mcServer; - private boolean givenModus; - private Modus modus; - private final Map consortReputation = new HashMap<>(); PlayerData(MinecraftServer mcServer, PlayerIdentifier player) @@ -73,13 +59,6 @@ public static void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) if(nbt.contains(ATTACHMENTS_NBT_KEY, Tag.TAG_COMPOUND)) this.deserializeAttachments(nbt.getCompound(ATTACHMENTS_NBT_KEY)); - if (nbt.contains("modus")) - { - this.modus = CaptchaDeckHandler.readFromNBT(nbt.getCompound("modus"), LogicalSide.SERVER); - givenModus = true; - } - else givenModus = nbt.getBoolean("given_modus"); - ListTag list = nbt.getList("consort_reputation", Tag.TAG_COMPOUND); for(int i = 0; i < list.size(); i++) { @@ -99,10 +78,6 @@ CompoundTag writeToNBT() if(attachments != null) nbt.put(ATTACHMENTS_NBT_KEY, attachments); - if (this.modus != null) - nbt.put("modus", CaptchaDeckHandler.writeToNBT(modus)); - else nbt.putBoolean("given_modus", givenModus); - ListTag list = new ListTag(); for(Map.Entry entry : consortReputation.entrySet()) { @@ -116,34 +91,6 @@ CompoundTag writeToNBT() return nbt; } - public Modus getModus() - { - return modus; - } - - public void setModus(@Nullable Modus modus) - { - if(this.modus != modus) - { - this.modus = modus; - if(modus != null) - setGivenModus(); - ServerPlayer player = this.getPlayer(); - if(player != null) - PacketDistributor.PLAYER.with(player).send(ModusDataPacket.create(modus)); - } - } - - public boolean hasGivenModus() - { - return givenModus; - } - - private void setGivenModus() - { - givenModus = true; - } - public int getConsortReputation(ResourceKey dim) { return consortReputation.getOrDefault(dim.location(), 0); @@ -158,39 +105,8 @@ public void addConsortReputation(int amount, ResourceKey dim) consortReputation.put(dim.location(), newRep); } - private void tryGiveStartingModus(ServerPlayer player) - { - List> startingTypes = StartingModusManager.getStartingModusTypes(); - - if(startingTypes.isEmpty()) - return; - - ModusType type = startingTypes.get(player.level().random.nextInt(startingTypes.size())); - if(type == null) - { - setGivenModus(); - return; - } - - Modus modus = type.createServerSide(); - if(modus != null) - { - modus.initModus(null, player, null, MinestuckConfig.SERVER.initialModusSize.get()); - setModus(modus); - } else LOGGER.warn("Couldn't create a starting modus type {}.", ModusTypes.REGISTRY.getKey(type)); - } - - public void onPlayerLoggedIn(ServerPlayer player) - { - if(getModus() != null) - PacketDistributor.PLAYER.with(player).send(ModusDataPacket.create(getModus())); - - if(getModus() == null && !hasGivenModus()) - tryGiveStartingModus(player); - } - @Nullable - ServerPlayer getPlayer() + public ServerPlayer getPlayer() { return identifier.getPlayer(mcServer); } diff --git a/src/main/java/com/mraof/minestuck/util/MSCapabilities.java b/src/main/java/com/mraof/minestuck/util/MSCapabilities.java index 8c4103b754..eb0b17625d 100644 --- a/src/main/java/com/mraof/minestuck/util/MSCapabilities.java +++ b/src/main/java/com/mraof/minestuck/util/MSCapabilities.java @@ -8,6 +8,7 @@ import com.mraof.minestuck.computer.editmode.EditmodeLocations; import com.mraof.minestuck.entity.dialogue.DialogueComponent; import com.mraof.minestuck.fluid.MSFluidType; +import com.mraof.minestuck.inventory.captchalogue.CaptchaDeckHandler; import com.mraof.minestuck.inventory.musicplayer.MusicPlaying; import com.mraof.minestuck.player.Echeladder; import com.mraof.minestuck.player.GristCache; @@ -35,6 +36,8 @@ public final class MSCapabilities { public static final DeferredRegister> ATTACHMENT_REGISTER = DeferredRegister.create(NeoForgeRegistries.Keys.ATTACHMENT_TYPES, Minestuck.MOD_ID); + public static final Supplier> MODUS_HOLDER = ATTACHMENT_REGISTER.register("modus_holder", + () -> AttachmentType.serializable(restricted(CaptchaDeckHandler.ModusHolder::new, PlayerData.class)).build()); public static final Supplier> PLAYER_COLOR = ATTACHMENT_REGISTER.register("player_color", () -> AttachmentType.builder(restricted(() -> ColorHandler.BuiltinColors.DEFAULT_COLOR, PlayerData.class)).serialize(Codec.INT).build()); public static final Supplier> BOONDOLLARS = ATTACHMENT_REGISTER.register("boondollars",