MemoriesPlugin class

Пакет: com.hypixel.hytale.builtin.adventure.memories

Файл: com/hypixel/hytale/builtin/adventure/memories/MemoriesPlugin.java

extends: JavaPlugin

Поля (38)

МодификаторыТипИмя
public static final BuilderCodec<MemoriesPlugin.MemoriesPluginConfig> CODEC
public static final BuilderCodec<MemoriesPlugin.RecordedMemories> CODEC
private Object2DoubleMap<String> collectionRadius
private final Set<Dependency<EntityStore>> dependencies
instance
private final ReentrantReadWriteLock lock
private final Set<Memory> memories
private final ComponentType<EntityStore, Player> playerComponentType
private final ComponentType<EntityStore, PlayerMemories> playerMemoriesComponentType
private final ComponentType<EntityStore, PlayerRef> playerRefComponentType
private final Query<EntityStore> query
ComponentRegistryProxy var1
HytaleServerConfig var1
var1
int var10
ComponentType var2
Path var2
MemoriesGameplayConfig var2
boolean var2
var2
int var2
var2
ComponentType var3
int var3
List var3
Path var3
ComponentType var4
int var4
Path var4
NPCMemoryProvider var5
int[] var5
Path var5
Player var5
PlayerRef var6
PlayerMemories var7
BuilderCodec var8
boolean var8
PacketHandler var9

Методы (36)

МодификаторыВозвратСигнатура
public MemoriesPluginConfigpublic MemoriesPluginConfig()
public PlayerAddedSystempublic PlayerAddedSystem(@Nonnull ComponentType<EntityStore, Player> var1, @Nonnull ComponentType<EntityStore, PlayerRef> var2, @Nonnull ComponentType<EntityStore, PlayerMemories> var3)
private RecordedMemoriesprivate RecordedMemories()
abstract throw new RuntimeExceptionthrow new RuntimeException("Failed to migrate legacy memories file " + var3, var8)
public void clearRecordedMemoriesvoid clearRecordedMemories()
for for(MemoryProvider var7 : this.providers)
for for(MemoryProvider var2 : this.providers)
for for(int var6 = var5.length - 1; var6 >= 0; var6--)
for for(int var9 = 0; var9 < var2; var9++)
static MemoriesPlugin getMemoriesPlugin get()
public Object2DoubleMap<String> getCollectionRadiuspublic Object2DoubleMap<String> getCollectionRadius()
public MemoriesPlugin.MemoriesPluginConfig getConfigMemoriesPlugin.MemoriesPluginConfig getConfig()
public Set<Dependency<EntityStore>> getDependenciespublic Set<Dependency<EntityStore>> getDependencies()
public int getMemoriesLevelint getMemoriesLevel(@Nonnull GameplayConfig var1)
public ComponentType<EntityStore, PlayerMemories> getPlayerMemoriesComponentTypeComponentType<EntityStore, PlayerMemories> getPlayerMemoriesComponentType()
public Query<EntityStore> getQuerypublic Query<EntityStore> getQuery()
public boolean hasRecordedMemoryboolean hasRecordedMemory(Memory var1)
if if(var1 != null)
if if(var2 == null)
if if(this.hasInitializedMemories)
if if(var2 == null)
if if(var4 >= var5[var6])
if if(var2)
if if(var1 < 0)
if if(var0 instanceof DiskUniverseResourceStorageProvider var1)
if if(var1 != null)
private void migrateLegacyMemoriesFilevoid migrateLegacyMemoriesFile()
static void migrateLegacyMemoriesFilevoid migrateLegacyMemoriesFile(@Nonnull Path var0, @Nonnull Path var1, @Nonnull HytaleLogger var2)
private void onAssetsLoadvoid onAssetsLoad()
public void onEntityAddedpublic void onEntityAdded(@Nonnull Ref<EntityStore> var1, @Nonnull AddReason var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4)
public void onEntityRemovepublic void onEntityRemove(@Nonnull Ref<EntityStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4)
public void recordAllMemoriesvoid recordAllMemories()
public boolean recordPlayerMemoriesboolean recordPlayerMemories(@Nonnull PlayerMemories var1)
public <T extends Memory> void registerMemoryProvider<T extends Memory> void registerMemoryProvider(MemoryProvider<T> var1)
public int setRecordedMemoriesCountint setRecordedMemoriesCount(int var1)
abstract super super(var1)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.adventure.memories;

class="kw">import com.hypixel.hytale.builtin.adventure.memories.commands.MemoriesCommand;
class="kw">import com.hypixel.hytale.builtin.adventure.memories.component.PlayerMemories;
class="kw">import com.hypixel.hytale.builtin.adventure.memories.interactions.MemoriesConditionInteraction;
class="kw">import com.hypixel.hytale.builtin.adventure.memories.interactions.SetMemoriesCapacityInteraction;
class="kw">import com.hypixel.hytale.builtin.adventure.memories.memories.Memory;
class="kw">import com.hypixel.hytale.builtin.adventure.memories.memories.MemoryProvider;
class="kw">import com.hypixel.hytale.builtin.adventure.memories.memories.npc.NPCMemory;
class="kw">import com.hypixel.hytale.builtin.adventure.memories.memories.npc.NPCMemoryProvider;
class="kw">import com.hypixel.hytale.builtin.adventure.memories.page.MemoriesPage;
class="kw">import com.hypixel.hytale.builtin.adventure.memories.page.MemoriesPageSupplier;
class="kw">import com.hypixel.hytale.builtin.adventure.memories.page.MemoriesUnlockedPage;
class="kw">import com.hypixel.hytale.builtin.adventure.memories.page.MemoriesUnlockedPageSuplier;
class="kw">import com.hypixel.hytale.builtin.adventure.memories.temple.ForgottenTempleConfig;
class="kw">import com.hypixel.hytale.builtin.adventure.memories.temple.TempleRespawnPlayersSystem;
class="kw">import com.hypixel.hytale.builtin.adventure.memories.window.MemoriesWindow;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
class="kw">import com.hypixel.hytale.codec.codecs.map.Object2DoubleMapCodec;
class="kw">import com.hypixel.hytale.common.util.PathUtil;
class="kw">import com.hypixel.hytale.component.AddReason;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.ComponentRegistryProxy;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.RemoveReason;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.component.dependency.Dependency;
class="kw">import com.hypixel.hytale.component.dependency.Order;
class="kw">import com.hypixel.hytale.component.dependency.SystemDependency;
class="kw">import com.hypixel.hytale.component.query.Query;
class="kw">import com.hypixel.hytale.component.system.RefSystem;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.protocol.packets.player.UpdateMemoriesCount;
class="kw">import com.hypixel.hytale.protocol.packets.player.UpdateMemoriesFeatureStatus;
class="kw">import com.hypixel.hytale.protocol.packets.window.WindowType;
class="kw">import com.hypixel.hytale.server.core.Constants;
class="kw">import com.hypixel.hytale.server.core.HytaleServer;
class="kw">import com.hypixel.hytale.server.core.HytaleServerConfig;
class="kw">import com.hypixel.hytale.server.core.Options;
class="kw">import com.hypixel.hytale.server.core.asset.type.gameplay.GameplayConfig;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.entity.entities.player.windows.Window;
class="kw">import com.hypixel.hytale.server.core.io.PacketHandler;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.player.PlayerSystems;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.Interaction;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.server.OpenCustomUIInteraction;
class="kw">import com.hypixel.hytale.server.core.plugin.JavaPlugin;
class="kw">import com.hypixel.hytale.server.core.plugin.JavaPluginInit;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import com.hypixel.hytale.server.core.universe.Universe;
class="kw">import com.hypixel.hytale.server.core.universe.resources.DefaultUniverseResourceStorageProvider;
class="kw">import com.hypixel.hytale.server.core.universe.resources.DiskUniverseResourceStorageProvider;
class="kw">import com.hypixel.hytale.server.core.universe.resources.IUniverseResourceStorageProvider;
class="kw">import com.hypixel.hytale.server.core.universe.resources.UniverseResourceType;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.core.util.Config;
class="kw">import com.hypixel.hytale.server.npc.AllNPCsLoadedEvent;
class="kw">import it.unimi.dsi.fastutil.objects.Object2DoubleMap;
class="kw">import it.unimi.dsi.fastutil.objects.Object2DoubleMaps;
class="kw">import it.unimi.dsi.fastutil.objects.Object2DoubleOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.objects.Object2ObjectRBTreeMap;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.io.IOException;
class="kw">import java.nio.file.Files;
class="kw">import java.nio.file.Path;
class="kw">import java.nio.file.StandardCopyOption;
class="kw">import java.util.Collections;
class="kw">import java.util.HashSet;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.Set;
class="kw">import java.util.Map.Entry;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.locks.ReentrantReadWriteLock;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class MemoriesPlugin class="kw">extends JavaPlugin {
   @Nonnull
   class="kw">public class="kw">static class="kw">final String MEMORIES_JSON_PATH = "memories.json";
   @Nonnull
   class="kw">public class="kw">static class="kw">final String RECORDED_MEMORIES_ID = "Memories";
   class="kw">private class="kw">static MemoriesPlugin instance;
   @Nonnull
   class="kw">private class="kw">final Config<MemoriesPlugin.MemoriesPluginConfig> config = this.withConfig(MemoriesPlugin.MemoriesPluginConfig.CODEC);
   @Nonnull
   class="kw">private class="kw">final List<MemoryProvider<?>> providers = new ObjectArrayList();
   @Nonnull
   class="kw">private class="kw">final Map<String, Set<Memory>> allMemories = new Object2ObjectRBTreeMap();
   class="kw">private ComponentType<EntityStore, PlayerMemories> playerMemoriesComponentType;
   class="kw">private UniverseResourceType<MemoriesPlugin.RecordedMemories> recordedMemoriesType;
   @Nullable
   class="kw">private MemoriesPlugin.RecordedMemories recordedMemories;
   class="kw">private boolean hasInitializedMemories;

   class="kw">public class="kw">static MemoriesPlugin get() {
      class="kw">return instance;
   }

   class="kw">public MemoriesPlugin(@Nonnull JavaPluginInit var1) {
      super(var1);
      instance = this;
   }

   @Override
   class="kw">protected void setup() {
      this.migrateLegacyMemoriesFile();
      this.recordedMemoriesType = Universe.registerResource(MemoriesPlugin.RecordedMemories.class, "Memories", MemoriesPlugin.RecordedMemories.CODEC);
      ComponentRegistryProxy var1 = this.getEntityStoreRegistry();
      this.getCommandRegistry().registerCommand(new MemoriesCommand());
      OpenCustomUIInteraction.registerCustomPageSupplier(this, MemoriesPage.class, "Memories", new MemoriesPageSupplier());
      OpenCustomUIInteraction.registerCustomPageSupplier(this, MemoriesUnlockedPage.class, "MemoriesUnlocked", new MemoriesUnlockedPageSuplier());
      Window.CLIENT_REQUESTABLE_WINDOW_TYPES.put(WindowType.Memories, MemoriesWindow::new);
      this.playerMemoriesComponentType = var1.registerComponent(PlayerMemories.class, "PlayerMemories", PlayerMemories.CODEC);
      ComponentType var2 = Player.getComponentType();
      ComponentType var3 = PlayerRef.getComponentType();
      ComponentType var4 = TransformComponent.getComponentType();
      NPCMemoryProvider var5 = new NPCMemoryProvider();
      this.registerMemoryProvider(var5);
      var1.registerSystem(new NPCMemory.GatherMemoriesSystem(var4, var2, var3, this.playerMemoriesComponentType, var5.getCollectionRadius()));

      for (MemoryProvider var7 : this.providers) {
         BuilderCodec var8 = (BuilderCodec<? class="kw">extends Memory>)var7.getCodec();
         this.getCodecRegistry(Memory.CODEC).register(var7.getId(), var8.getInnerClass(), var8);
      }

      this.getEventRegistry().register(AllNPCsLoadedEvent.class, var1x -> this.onAssetsLoad());
      var1.registerSystem(new MemoriesPlugin.PlayerAddedSystem(var2, var3, this.playerMemoriesComponentType));
      this.getCodecRegistry(Interaction.CODEC).register("SetMemoriesCapacity", SetMemoriesCapacityInteraction.class, SetMemoriesCapacityInteraction.CODEC);
      this.getCodecRegistry(GameplayConfig.PLUGIN_CODEC).register(MemoriesGameplayConfig.class, "Memories", MemoriesGameplayConfig.CODEC);
      this.getCodecRegistry(Interaction.CODEC).register("MemoriesCondition", MemoriesConditionInteraction.class, MemoriesConditionInteraction.CODEC);
      var1.registerSystem(new TempleRespawnPlayersSystem(var3, var4));
      this.getCodecRegistry(GameplayConfig.PLUGIN_CODEC).register(ForgottenTempleConfig.class, "ForgottenTemple", ForgottenTempleConfig.CODEC);
   }

   @Override
   class="kw">protected void start() {
      this.recordedMemories = Universe.get().getResource(this.recordedMemoriesType);
      this.hasInitializedMemories = true;
      this.onAssetsLoad();
   }

   @Nonnull
   class="kw">private CompletableFuture<Void> saveMemories() {
      class="kw">return Universe.get().flushResource(this.recordedMemoriesType).exceptionally(var1 -> {
         ((HytaleLogger.Api)this.getLogger().at(Level.SEVERE).withCause(var1)).log("Failed to save memories");
         class="kw">return null;
      });
   }

   class="kw">private void migrateLegacyMemoriesFile() {
      if (!Options.isBare()) {
         HytaleServerConfig var1 = HytaleServer.get().getConfig();
         if (var1 != null) {
            Path var2 = resolveDiskResourceDirectory(var1.getUniverseResourceStorageProvider());
            if (var2 == null) {
               if (Files.exists(Constants.UNIVERSE_PATH.resolve("memories.json"))) {
                  this.getLogger().at(Level.WARNING).log("Legacy memories file %s cannot migrate to a custom universe resource storage", "memories.json");
               }
            } else if (PathUtil.isInTrustedRoot(var2)) {
               migrateLegacyMemoriesFile(Constants.UNIVERSE_PATH, var2, this.getLogger());
            }
         }
      }
   }

   class="kw">private void onAssetsLoad() {
      if (this.hasInitializedMemories) {
         this.allMemories.clear();

         for (MemoryProvider var2 : this.providers) {
            for (Entry var4 : var2.getAllMemories().entrySet()) {
               this.allMemories.computeIfAbsent(var4.getKey(), var0 -> new HashSet<>()).addAll(var4.getValue());
            }
         }
      }
   }

   class="kw">public MemoriesPlugin.MemoriesPluginConfig getConfig() {
      class="kw">return this.config.get();
   }

   class="kw">public ComponentType<EntityStore, PlayerMemories> getPlayerMemoriesComponentType() {
      class="kw">return this.playerMemoriesComponentType;
   }

   class="kw">public <T class="kw">extends Memory> void registerMemoryProvider(MemoryProvider<T> var1) {
      this.providers.add(var1);
   }

   @Nonnull
   class="kw">public Map<String, Set<Memory>> getAllMemories() {
      class="kw">return this.allMemories;
   }

   class="kw">public int getMemoriesLevel(@Nonnull GameplayConfig var1) {
      MemoriesGameplayConfig var2 = MemoriesGameplayConfig.get(var1);
      int var3 = 1;
      if (var2 == null) {
         class="kw">return var3;
      }

      int var4 = this.getRecordedMemories().size();
      int[] var5 = var2.getMemoriesAmountPerLevel();

      for (int var6 = var5.length - 1; var6 >= 0; var6--) {
         if (var4 >= var5[var6]) {
            class="kw">return var6 + 2;
         }
      }

      class="kw">return var3;
   }

   class="kw">public boolean hasRecordedMemory(Memory var1) {
      this.recordedMemories.lock.readLock().lock();

      try {
         class="kw">return this.recordedMemories.memories.contains(var1);
      } class="kw">finally {
         this.recordedMemories.lock.readLock().unlock();
      }
   }

   class="kw">public boolean recordPlayerMemories(@Nonnull PlayerMemories var1) {
      this.recordedMemories.lock.writeLock().lock();

      boolean var2;
      try {
         var2 = var1.takeMemories(this.recordedMemories.memories);
      } class="kw">finally {
         this.recordedMemories.lock.writeLock().unlock();
      }

      if (var2) {
         this.saveMemories();
      }

      class="kw">return var2;
   }

   @Nonnull
   class="kw">public Set<Memory> getRecordedMemories() {
      this.recordedMemories.lock.readLock().lock();

      try {
         class="kw">return new HashSet<>(this.recordedMemories.memories);
      } class="kw">finally {
         this.recordedMemories.lock.readLock().unlock();
      }
   }

   class="kw">public void clearRecordedMemories() {
      this.recordedMemories.lock.writeLock().lock();

      try {
         this.recordedMemories.memories.clear();
      } class="kw">finally {
         this.recordedMemories.lock.writeLock().unlock();
      }

      this.saveMemories();
   }

   class="kw">public void recordAllMemories() {
      this.recordedMemories.lock.writeLock().lock();

      try {
         for (Entry var2 : this.allMemories.entrySet()) {
            this.recordedMemories.memories.addAll(var2.getValue());
         }
      } class="kw">finally {
         this.recordedMemories.lock.writeLock().unlock();
      }

      this.saveMemories();
   }

   class="kw">public int setRecordedMemoriesCount(int var1) {
      if (var1 < 0) {
         var1 = 0;
      }

      this.recordedMemories.lock.writeLock().lock();

      int var2;
      try {
         this.recordedMemories.memories.clear();
         List var3 = new ObjectArrayList();

         for (Entry var5 : this.allMemories.entrySet()) {
            var3.addAll(var5.getValue());
         }

         var2 = Math.min(var1, var3.size());

         for (int var9 = 0; var9 < var2; var9++) {
            this.recordedMemories.memories.add(var3.get(var9));
         }
      } class="kw">finally {
         this.recordedMemories.lock.writeLock().unlock();
      }

      this.saveMemories();
      class="kw">return var2;
   }

   class="kw">static void migrateLegacyMemoriesFile(@Nonnull Path var0, @Nonnull Path var1, @Nonnull HytaleLogger var2) {
      Path var3 = var0.resolve("memories.json");
      Path var4 = var0.resolve("memories.json.bak");
      if (Files.exists(var3) || Files.exists(var4)) {
         Path var5 = var1.resolve("Memories.json");
         if (Files.exists(var5)) {
            var2.at(Level.WARNING).log("Legacy memories file %s was not migrated because %s already exists", var3, var5);
         } else {
            try {
               Files.createDirectories(var1);
               if (Files.exists(var3)) {
                  Files.move(var3, var5);
               }
            } catch (IOException var8) {
               throw new RuntimeException("Failed to migrate legacy memories file " + var3, var8);
            }

            if (Files.exists(var4)) {
               try {
                  Files.move(var4, var5.resolveSibling(var5.getFileName() + ".bak"), StandardCopyOption.REPLACE_EXISTING);
               } catch (IOException var7) {
                  ((HytaleLogger.Api)var2.at(Level.WARNING).withCause(var7)).log("Failed to migrate legacy memories backup file %s", var4);
               }
            }
         }
      }
   }

   @Nullable
   class="kw">private class="kw">static Path resolveDiskResourceDirectory(@Nonnull IUniverseResourceStorageProvider var0) {
      if (var0 class="kw">instanceof DiskUniverseResourceStorageProvider var1) {
         class="kw">return var1.getPath();
      } else {
         class="kw">return var0 class="kw">instanceof DefaultUniverseResourceStorageProvider ? DefaultUniverseResourceStorageProvider.DEFAULT.getPath() : null;
      }
   }

   class="kw">public class="kw">static class MemoriesPluginConfig {
      @Nonnull
      class="kw">public class="kw">static class="kw">final BuilderCodec<MemoriesPlugin.MemoriesPluginConfig> CODEC = BuilderCodec.builder(
            MemoriesPlugin.MemoriesPluginConfig.class, MemoriesPlugin.MemoriesPluginConfig::new
         )
         .append(
            new KeyedCodec<>("CollectionRadius", new Object2DoubleMapCodec<>(Codec.STRING, Object2DoubleOpenHashMap::new)),
            (var0, var1) -> var0.collectionRadius = var1,
            var0 -> var0.collectionRadius
         )
         .add()
         .build();
      class="kw">private Object2DoubleMap<String> collectionRadius;

      class="kw">public MemoriesPluginConfig() {
      }

      @Nonnull
      class="kw">public Object2DoubleMap<String> getCollectionRadius() {
         class="kw">return (Object2DoubleMap<String>)(this.collectionRadius != null ? this.collectionRadius : Object2DoubleMaps.EMPTY_MAP);
      }
   }

   class="kw">public class="kw">static class PlayerAddedSystem class="kw">extends RefSystem<EntityStore> {
      @Nonnull
      class="kw">private class="kw">final Set<Dependency<EntityStore>> dependencies = Set.of(new SystemDependency<>(Order.AFTER, PlayerSystems.PlayerSpawnedSystem.class));
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, Player> playerComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, PlayerRef> playerRefComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, PlayerMemories> playerMemoriesComponentType;
      @Nonnull
      class="kw">private class="kw">final Query<EntityStore> query;

      class="kw">public PlayerAddedSystem(
         @Nonnull ComponentType<EntityStore, Player> var1,
         @Nonnull ComponentType<EntityStore, PlayerRef> var2,
         @Nonnull ComponentType<EntityStore, PlayerMemories> var3
      ) {
         this.playerComponentType = var1;
         this.playerRefComponentType = var2;
         this.playerMemoriesComponentType = var3;
         this.query = Query.and(var1, var2);
      }

      @Nonnull
      @Override
      class="kw">public Query<EntityStore> getQuery() {
         class="kw">return this.query;
      }

      @Nonnull
      @Override
      class="kw">public Set<Dependency<EntityStore>> getDependencies() {
         class="kw">return this.dependencies;
      }

      @Override
      class="kw">public void onEntityAdded(
         @Nonnull Ref<EntityStore> var1, @Nonnull AddReason var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
      ) {
         Player var5 = var3.getComponent(var1, this.playerComponentType);
         assert var5 != null;
         PlayerRef var6 = var3.getComponent(var1, this.playerRefComponentType);
         assert var6 != null;
         PlayerMemories var7 = var3.getComponent(var1, this.playerMemoriesComponentType);
         boolean var8 = var7 != null;
         PacketHandler var9 = var6.getPacketHandler();
         var9.writeNoCache(new UpdateMemoriesFeatureStatus(var8));
         int var10 = var7 != null ? var7.getRecordedMemories().size() : 0;
         var9.writeNoCache(new UpdateMemoriesCount(var10));
      }

      @Override
      class="kw">public void onEntityRemove(
         @Nonnull Ref<EntityStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
      ) {
      }
   }

   class="kw">private class="kw">static class RecordedMemories {
      @Nonnull
      class="kw">public class="kw">static class="kw">final BuilderCodec<MemoriesPlugin.RecordedMemories> CODEC = BuilderCodec.builder(
            MemoriesPlugin.RecordedMemories.class, MemoriesPlugin.RecordedMemories::new
         )
         .append(new KeyedCodec<>("Memories", new ArrayCodec<>(Memory.CODEC, Memory[]::new)), (var0, var1) -> {
            if (var1 != null) {
               Collections.addAll(var0.memories, var1);
            }
         }, var0 -> {
            var0.lock.readLock().lock();

            try {
               class="kw">return var0.memories.toArray(Memory[]::new);
            } class="kw">finally {
               var0.lock.readLock().unlock();
            }
         })
         .add()
         .build();
      @Nonnull
      class="kw">private class="kw">final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
      @Nonnull
      class="kw">private class="kw">final Set<Memory> memories = new HashSet<>();

      class="kw">private RecordedMemories() {
      }
   }
}