EnsureNetworkSendableSystem class

Пакет: com.hypixel.hytale.builtin.adventure.objectives.markers.objectivelocation

Файл: com/hypixel/hytale/builtin/adventure/objectives/markers/objectivelocation/ObjectiveLocationMarkerSystems.java

extends: HolderSystem<EntityStore>

Поля (2)

МодификаторыТипИмя
private final ComponentType<EntityStore, NetworkId> networkIdComponentType
private final Query<EntityStore> query

Методы (3)

МодификаторыВозвратСигнатура
public Query<EntityStore> getQuerypublic Query<EntityStore> getQuery()
public void onEntityAddpublic void onEntityAdd(@Nonnull Holder<EntityStore> var1, @Nonnull AddReason var2, @Nonnull Store<EntityStore> var3)
public void onEntityRemovedpublic void onEntityRemoved(@Nonnull Holder<EntityStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<EntityStore> var3)

Исходный код

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

class="kw">import com.hypixel.hytale.builtin.adventure.objectives.Objective;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.ObjectiveDataStore;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.ObjectivePlugin;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.config.ObjectiveLocationMarkerAsset;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.config.triggercondition.ObjectiveLocationTriggerCondition;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.task.ObjectiveTask;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.task.UseEntityObjectiveTask;
class="kw">import com.hypixel.hytale.builtin.weather.components.WeatherTracker;
class="kw">import com.hypixel.hytale.component.AddReason;
class="kw">import com.hypixel.hytale.component.Archetype;
class="kw">import com.hypixel.hytale.component.ArchetypeChunk;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.RemoveReason;
class="kw">import com.hypixel.hytale.component.ResourceType;
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.OrderPriority;
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.spatial.SpatialResource;
class="kw">import com.hypixel.hytale.component.system.HolderSystem;
class="kw">import com.hypixel.hytale.component.system.RefSystem;
class="kw">import com.hypixel.hytale.component.system.tick.EntityTickingSystem;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.protocol.packets.assets.TrackOrUpdateObjective;
class="kw">import com.hypixel.hytale.protocol.packets.assets.UntrackObjective;
class="kw">import com.hypixel.hytale.server.core.asset.type.model.config.Model;
class="kw">import com.hypixel.hytale.server.core.entity.UUIDComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.ModelComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.system.PlayerSpatialSystem;
class="kw">import com.hypixel.hytale.server.core.modules.entity.tracker.NetworkId;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabCopyableComponent;
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.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import java.util.Arrays;
class="kw">import java.util.HashSet;
class="kw">import java.util.Iterator;
class="kw">import java.util.List;
class="kw">import java.util.Set;
class="kw">import java.util.UUID;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;

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

   class="kw">public class="kw">static class EnsureNetworkSendableSystem class="kw">extends HolderSystem<EntityStore> {
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, NetworkId> networkIdComponentType;
      @Nonnull
      class="kw">private class="kw">final Query<EntityStore> query;

      class="kw">public EnsureNetworkSendableSystem(@Nonnull ComponentType<EntityStore, ObjectiveLocationMarker> var1, @Nonnull ComponentType<EntityStore, NetworkId> var2) {
         this.networkIdComponentType = var2;
         this.query = Query.and(var1, Query.not(var2));
      }

      @Override
      class="kw">public void onEntityAdd(@Nonnull Holder<EntityStore> var1, @Nonnull AddReason var2, @Nonnull Store<EntityStore> var3) {
         var1.addComponent(this.networkIdComponentType, new NetworkId(var3.getExternalData().takeNextNetworkId()));
      }

      @Override
      class="kw">public void onEntityRemoved(@Nonnull Holder<EntityStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<EntityStore> var3) {
      }

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

   class="kw">public class="kw">static class InitSystem class="kw">extends RefSystem<EntityStore> {
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, ObjectiveLocationMarker> objectiveLocationMarkerComponent;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, ModelComponent> modelComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, TransformComponent> transformComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, PrefabCopyableComponent> prefabCopyableComponentType;
      @Nonnull
      class="kw">private class="kw">final Query<EntityStore> query;

      class="kw">public InitSystem(
         @Nonnull ComponentType<EntityStore, ObjectiveLocationMarker> var1,
         @Nonnull ComponentType<EntityStore, ModelComponent> var2,
         @Nonnull ComponentType<EntityStore, TransformComponent> var3,
         @Nonnull ComponentType<EntityStore, PrefabCopyableComponent> var4
      ) {
         this.objectiveLocationMarkerComponent = var1;
         this.modelComponentType = var2;
         this.transformComponentType = var3;
         this.prefabCopyableComponentType = var4;
         this.query = Query.and(var1, var2, var3);
      }

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

      @Override
      class="kw">public void onEntityAdded(
         @Nonnull Ref<EntityStore> var1, @Nonnull AddReason var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
      ) {
         ObjectiveLocationMarker var5 = var3.getComponent(var1, this.objectiveLocationMarkerComponent);
         assert var5 != null;
         ObjectiveLocationMarkerAsset var6 = ObjectiveLocationMarkerAsset.getAssetMap().getAsset(var5.objectiveLocationMarkerId);
         if (var6 == null) {
            ObjectivePlugin.get()
               .getLogger()
               .at(Level.WARNING)
               .log("Failed to find ObjectiveLocationMarker '%s'. Entity removed!", var5.objectiveLocationMarkerId);
            var4.removeEntity(var1, RemoveReason.REMOVE);
         } else {
            if (var5.activeObjectiveUUID != null) {
               Objective var7 = ObjectivePlugin.get().getObjectiveDataStore().loadObjective(var5.activeObjectiveUUID, var3);
               if (var7 == null) {
                  ObjectivePlugin.get().getLogger().at(Level.WARNING).log("Failed to load Objective with UUID '%s'. Entity removed!", var5.activeObjectiveUUID);
                  var4.removeEntity(var1, RemoveReason.REMOVE);
                  class="kw">return;
               }

               var5.setActiveObjective(var7);
               var5.setUntrackPacket(new UntrackObjective(var5.activeObjectiveUUID));
            }

            TransformComponent var11 = var3.getComponent(var1, this.transformComponentType);
            assert var11 != null;
            Rotation3f var8 = var11.getRotation();
            var5.updateLocationMarkerValues(var6, var8.yaw(), var3);
            ModelComponent var9 = var3.getComponent(var1, this.modelComponentType);
            assert var9 != null;
            Model var10 = var9.getModel();
            var4.putComponent(
               var1,
               this.modelComponentType,
               new ModelComponent(
                  new Model(
                     var10.getModelAssetId(),
                     var10.getScale(),
                     var10.getRandomAttachmentIds(),
                     var10.getAttachments(),
                     var5.getArea().getBoxForEntryArea(),
                     var10.getModel(),
                     var10.getTexture(),
                     var10.getGradientSet(),
                     var10.getGradientId(),
                     var10.getEyeHeight(),
                     var10.getCrouchOffset(),
                     var10.getSittingOffset(),
                     var10.getSleepingOffset(),
                     var10.getAnimationSetMap(),
                     var10.getCamera(),
                     var10.getLight(),
                     var10.getParticles(),
                     var10.getTrails(),
                     var10.getPhysicsValues(),
                     var10.getDetailBoxes(),
                     var10.getPhobia(),
                     var10.getPhobiaModelAssetId()
                  )
               )
            );
            var4.ensureComponent(var1, this.prefabCopyableComponentType);
         }
      }

      @Override
      class="kw">public void onEntityRemove(
         @Nonnull Ref<EntityStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
      ) {
         ObjectiveLocationMarker var5 = var3.getComponent(var1, this.objectiveLocationMarkerComponent);
         assert var5 != null;
         Objective var6 = var5.getActiveObjective();
         if (var6 != null) {
            ObjectiveDataStore var7 = ObjectivePlugin.get().getObjectiveDataStore();
            var7.saveToDisk(var5.activeObjectiveUUID.toString(), var6);
            var7.unloadObjective(var5.activeObjectiveUUID);
            if (var2 == RemoveReason.REMOVE) {
               var4.run(var1x -> ObjectivePlugin.get().cancelObjective(var5.activeObjectiveUUID, var1x));
            }
         }
      }
   }

   class="kw">public class="kw">static class TickingSystem class="kw">extends EntityTickingSystem<EntityStore> {
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, ObjectiveLocationMarker> objectiveLocationMarkerComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, PlayerRef> playerRefComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, TransformComponent> transformComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, WeatherTracker> weatherTrackerComponentType;
      @Nonnull
      class="kw">private class="kw">final ComponentType<EntityStore, UUIDComponent> uuidComponentType;
      @Nonnull
      class="kw">private class="kw">final ResourceType<EntityStore, SpatialResource<Ref<EntityStore>, EntityStore>> playerSpatialComponent;
      @Nonnull
      class="kw">private class="kw">final Query<EntityStore> query;
      @Nonnull
      class="kw">private class="kw">final Set<Dependency<EntityStore>> dependencies;

      class="kw">public TickingSystem(
         @Nonnull ComponentType<EntityStore, ObjectiveLocationMarker> var1,
         @Nonnull ComponentType<EntityStore, PlayerRef> var2,
         @Nonnull ResourceType<EntityStore, SpatialResource<Ref<EntityStore>, EntityStore>> var3,
         @Nonnull ComponentType<EntityStore, TransformComponent> var4,
         @Nonnull ComponentType<EntityStore, WeatherTracker> var5,
         @Nonnull ComponentType<EntityStore, UUIDComponent> var6
      ) {
         this.objectiveLocationMarkerComponentType = var1;
         this.playerRefComponentType = var2;
         this.transformComponentType = var4;
         this.weatherTrackerComponentType = var5;
         this.uuidComponentType = var6;
         this.playerSpatialComponent = var3;
         this.query = Archetype.of(var1, var4, var6);
         this.dependencies = Set.of(new SystemDependency<>(Order.AFTER, PlayerSpatialSystem.class, OrderPriority.CLOSEST));
      }

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

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

      @Override
      class="kw">public boolean isParallel(int var1, int var2) {
         class="kw">return false;
      }

      @Override
      class="kw">public void tick(float var1, int var2, @Nonnull Store<EntityStore> var3) {
         World var4 = var3.getExternalData().getWorld();
         if (var4.getWorldConfig().isObjectiveMarkersEnabled()) {
            var3.tick(this, var1, var2);
         }
      }

      @Override
      class="kw">public void tick(
         float var1, int var2, @Nonnull ArchetypeChunk<EntityStore> var3, @Nonnull Store<EntityStore> var4, @Nonnull CommandBuffer<EntityStore> var5
      ) {
         ObjectiveLocationMarker var6 = var3.getComponent(var2, this.objectiveLocationMarkerComponentType);
         assert var6 != null;
         TransformComponent var7 = var3.getComponent(var2, this.transformComponentType);
         assert var7 != null;
         Ref var8 = var3.getReferenceTo(var2);
         Vector3d var9 = var7.getPosition();
         Objective var10 = var6.getActiveObjective();
         if (var10 == null) {
            UUIDComponent var11 = var3.getComponent(var2, this.uuidComponentType);
            assert var11 != null;
            UUID var12 = var11.getUuid();
            this.setupMarker(var4, var6, var8, var9, var12, var5);
         } else if (!var10.isCompleted()) {
            SpatialResource var22 = var4.getResource(this.playerSpatialComponent);
            List var23 = SpatialResource.getThreadLocalReferenceList();
            var6.area.getPlayersInExitArea(var22, var23, var9);
            HashSet var13 = new HashSet<>(var23.size());
            PlayerRef[] var14 = new PlayerRef[var23.size()];
            int var15 = 0;

            for (Ref var17 : var23) {
               PlayerRef var18 = var5.getComponent(var17, this.playerRefComponentType);
               if (var18 != null) {
                  UUIDComponent var19 = var5.getComponent(var17, this.uuidComponentType);
                  if (var19 != null) {
                     TransformComponent var20 = var5.getComponent(var17, this.transformComponentType);
                     if (var20 != null) {
                        WeatherTracker var21 = var5.getComponent(var17, this.weatherTrackerComponentType);
                        if (var21 != null && isPlayerInSpecificEnvironment(var6, var21, var20, var5)) {
                           var13.add(var19.getUuid());
                           if (var6.area.isPlayerInEntryArea(var20.getPosition(), var9)) {
                              var14[var15++] = var18;
                           }
                        }
                     }
                  }
               }
            }

            Set var24 = var10.getPlayerUUIDs();
            Set var25 = var10.getActivePlayerUUIDs();
            String var26 = var10.getObjectiveId();
            updateIncomingPlayers(var14, var15, var6, var24, var25, var26);
            updateOutgoingPlayers(var13, var6, var25, var26);
         } else {
            var5.removeEntity(var8, RemoveReason.REMOVE);
         }
      }

      class="kw">private void setupMarker(
         @Nonnull Store<EntityStore> var1,
         @Nonnull ObjectiveLocationMarker var2,
         @Nonnull Ref<EntityStore> var3,
         @Nonnull Vector3d var4,
         @Nonnull UUID var5,
         @Nonnull CommandBuffer<EntityStore> var6
      ) {
         if (var2.triggerConditions != null && var2.triggerConditions.length > 0) {
            SpatialResource var7 = var1.getResource(this.playerSpatialComponent);
            if (!var2.area.hasPlayerInExitArea(var7, this.playerRefComponentType, var4, var6)) {
               class="kw">return;
            }

            for (ObjectiveLocationTriggerCondition var11 : var2.triggerConditions) {
               if (!var11.isConditionMet(var6, var3, var2)) {
                  class="kw">return;
               }
            }
         }

         ObjectiveLocationMarkerAsset var12 = ObjectiveLocationMarkerAsset.getAssetMap().getAsset(var2.objectiveLocationMarkerId);
         if (var12 == null) {
            ObjectivePlugin.get()
               .getLogger()
               .at(Level.WARNING)
               .log("Could not find ObjectiveLocationMarker '%s'. Entity removed!", var2.objectiveLocationMarkerId);
            var6.removeEntity(var3, RemoveReason.REMOVE);
         } else {
            World var13 = var1.getExternalData().getWorld();
            Objective var14 = var12.getObjectiveTypeSetup().setup(new HashSet<>(), var13.getWorldConfig().getUuid(), var5, var1);
            if (var14 == null) {
               ObjectivePlugin.get()
                  .getLogger()
                  .at(Level.WARNING)
                  .log("Objective failed to setup for ObjectiveLocationMarker '%s'. Entity removed!", var2.objectiveLocationMarkerId);
               var6.removeEntity(var3, RemoveReason.REMOVE);
            } else {
               var2.setActiveObjective(var14);
               var2.activeObjectiveUUID = var14.getObjectiveUUID();
               var2.setUntrackPacket(new UntrackObjective(var2.activeObjectiveUUID));
            }
         }
      }

      class="kw">private class="kw">static void updateIncomingPlayers(
         @Nonnull PlayerRef[] var0, int var1, @Nonnull ObjectiveLocationMarker var2, @Nonnull Set<UUID> var3, @Nonnull Set<UUID> var4, @Nonnull String var5
      ) {
         if (var0.length != 0) {
            TrackOrUpdateObjective var6 = null;
            ObjectivePlugin var7 = ObjectivePlugin.get();
            HytaleLogger var8 = var7.getLogger();
            ObjectiveDataStore var9 = var7.getObjectiveDataStore();

            for (int var10 = 0; var10 < var1; var10++) {
               PlayerRef var11 = var0[var10];
               UUID var12 = var11.getUuid();
               if (var4.add(var12)) {
                  var3.add(var12);
                  var8.at(Level.FINE)
                     .log(
                        "Player '%s' joined the objective area for marker '%s', current objective '%s' with UUID '%s'",
                        var11.getUsername(),
                        var2.objectiveLocationMarkerId,
                        var5,
                        var2.activeObjectiveUUID
                     );
                  if (var6 == null) {
                     var6 = new TrackOrUpdateObjective(var2.getActiveObjective().toPacket());
                  }

                  var11.getPacketHandler().writeNoCache(var6);

                  for (ObjectiveTask var16 : var2.getActiveObjective().getCurrentTasks()) {
                     if (var16 class="kw">instanceof UseEntityObjectiveTask) {
                        var9.addEntityTaskForPlayer(var12, ((UseEntityObjectiveTask)var16).getAsset().getTaskId(), var2.activeObjectiveUUID);
                     }
                  }
               }
            }
         }
      }

      class="kw">private class="kw">static void updateOutgoingPlayers(@Nonnull Set<UUID> var0, @Nonnull ObjectiveLocationMarker var1, @Nullable Set<UUID> var2, @Nonnull String var3) {
         if (var2 != null && !var2.isEmpty()) {
            HytaleLogger var4 = ObjectivePlugin.get().getLogger();
            Iterator var5 = var2.iterator();
            Universe var6 = Universe.get();

            while (var5.hasNext()) {
               UUID var7 = var5.next();
               if (!var0.contains(var7)) {
                  var5.remove();
                  untrackEntityObjectiveForPlayer(var1, var7);
                  PlayerRef var8 = var6.getPlayer(var7);
                  var4.at(Level.FINE)
                     .log(
                        "Player '%s' left the objective area for marker '%s', current objective '%s' with UUID '%s'",
                        var8 == null ? var7 : var8.getUsername(),
                        var1.objectiveLocationMarkerId,
                        var3,
                        var1.activeObjectiveUUID
                     );
                  if (var8 != null) {
                     var8.getPacketHandler().write(var1.getUntrackPacket());
                  }
               }
            }
         }
      }

      class="kw">private class="kw">static boolean isPlayerInSpecificEnvironment(
         @Nonnull ObjectiveLocationMarker var0, @Nonnull WeatherTracker var1, @Nonnull TransformComponent var2, @Nonnull ComponentAccessor<EntityStore> var3
      ) {
         if (var0.environmentIndexes == null) {
            class="kw">return true;
         }

         var1.updateEnvironment(var2, var3);
         int var4 = var1.getEnvironmentId();
         class="kw">return Arrays.binarySearch(var0.environmentIndexes, var4) >= 0;
      }

      class="kw">private class="kw">static void untrackEntityObjectiveForPlayer(@Nonnull ObjectiveLocationMarker var0, @Nonnull UUID var1) {
         ObjectiveDataStore var2 = ObjectivePlugin.get().getObjectiveDataStore();

         for (ObjectiveTask var6 : var0.getActiveObjective().getCurrentTasks()) {
            if (var6 class="kw">instanceof UseEntityObjectiveTask var7) {
               String var8 = var7.getAsset().getTaskId();
               var2.removeEntityTaskForPlayer(var0.activeObjectiveUUID, var8, var1);
            }
         }
      }
   }
}