PrefabPasteEventSystem class

Пакет: com.hypixel.hytale.server.flock

Файл: com/hypixel/hytale/server/flock/FlockPlugin.java

extends: WorldEventSystem<EntityStore, PrefabPasteEvent>

Поля (1)

МодификаторыТипИмя
private final FlockPlugin plugin

Методы (2)

МодификаторыВозвратСигнатура
public void handlepublic void handle(@Nonnull Store<EntityStore> var1, @Nonnull CommandBuffer<EntityStore> var2, @Nonnull PrefabPasteEvent var3)
abstract super super(PrefabPasteEvent.class)

Исходный код

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

class="kw">import com.hypixel.fastutil.ints.Int2ObjectConcurrentHashMap;
class="kw">import com.hypixel.hytale.assetstore.AssetRegistry;
class="kw">import com.hypixel.hytale.assetstore.map.IndexedLookupTableAssetMap;
class="kw">import com.hypixel.hytale.component.AddReason;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.ComponentRegistryProxy;
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.Store;
class="kw">import com.hypixel.hytale.component.system.WorldEventSystem;
class="kw">import com.hypixel.hytale.function.consumer.TriConsumer;
class="kw">import com.hypixel.hytale.math.random.RandomExtra;
class="kw">import com.hypixel.hytale.math.shape.Box;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.math.vector.Rotation3fc;
class="kw">import com.hypixel.hytale.server.core.asset.HytaleAssetStore;
class="kw">import com.hypixel.hytale.server.core.entity.UUIDComponent;
class="kw">import com.hypixel.hytale.server.core.entity.group.EntityGroup;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.BoundingBox;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.HeadRotation;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
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.prefab.event.PrefabPasteEvent;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.flock.config.FlockAsset;
class="kw">import com.hypixel.hytale.server.flock.config.RangeSizeFlockAsset;
class="kw">import com.hypixel.hytale.server.flock.corecomponents.builders.BuilderActionFlockBeacon;
class="kw">import com.hypixel.hytale.server.flock.corecomponents.builders.BuilderActionFlockJoin;
class="kw">import com.hypixel.hytale.server.flock.corecomponents.builders.BuilderActionFlockLeave;
class="kw">import com.hypixel.hytale.server.flock.corecomponents.builders.BuilderActionFlockSetTarget;
class="kw">import com.hypixel.hytale.server.flock.corecomponents.builders.BuilderActionFlockState;
class="kw">import com.hypixel.hytale.server.flock.corecomponents.builders.BuilderBodyMotionFlock;
class="kw">import com.hypixel.hytale.server.flock.corecomponents.builders.BuilderEntityFilterFlock;
class="kw">import com.hypixel.hytale.server.flock.corecomponents.builders.BuilderSensorFlockCombatDamage;
class="kw">import com.hypixel.hytale.server.flock.corecomponents.builders.BuilderSensorFlockLeader;
class="kw">import com.hypixel.hytale.server.flock.corecomponents.builders.BuilderSensorInflictedDamage;
class="kw">import com.hypixel.hytale.server.flock.decisionmaker.conditions.FlockSizeCondition;
class="kw">import com.hypixel.hytale.server.npc.NPCPlugin;
class="kw">import com.hypixel.hytale.server.npc.decisionmaker.core.conditions.base.Condition;
class="kw">import com.hypixel.hytale.server.npc.entities.NPCEntity;
class="kw">import com.hypixel.hytale.server.npc.role.Role;
class="kw">import com.hypixel.hytale.server.npc.systems.PositionCacheSystems;
class="kw">import it.unimi.dsi.fastutil.Pair;
class="kw">import java.util.HashMap;
class="kw">import java.util.Map;
class="kw">import java.util.UUID;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3dc;

class="kw">public class FlockPlugin class="kw">extends JavaPlugin {
   class="kw">private class="kw">static FlockPlugin instance;
   class="kw">private class="kw">final Int2ObjectConcurrentHashMap<Map<UUID, UUID>> prefabFlockRemappings = new Int2ObjectConcurrentHashMap<>();
   class="kw">private ComponentType<EntityStore, Flock> flockComponentType;
   class="kw">private ComponentType<EntityStore, FlockMembership> flockMembershipComponentType;
   class="kw">private ComponentType<EntityStore, PersistentFlockData> persistentFlockDataComponentType;

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

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

   @Override
   class="kw">public void setup() {
      instance = this;
      ComponentRegistryProxy var1 = this.getEntityStoreRegistry();
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                           FlockAsset.class, new IndexedLookupTableAssetMap<>(FlockAsset[]::new)
                        )
                        .setPath("NPC/Flocks"))
                     .setCodec(FlockAsset.CODEC))
                  .setKeyFunction(FlockAsset::getId))
               .setReplaceOnRemove(RangeSizeFlockAsset::getUnknownFor))
            .build()
      );
      this.getEntityStoreRegistry().registerSystem(new FlockPlugin.PrefabPasteEventSystem(this));
      NPCPlugin.get()
         .registerCoreComponentType("Flock", BuilderBodyMotionFlock::new)
         .registerCoreComponentType("JoinFlock", BuilderActionFlockJoin::new)
         .registerCoreComponentType("LeaveFlock", BuilderActionFlockLeave::new)
         .registerCoreComponentType("FlockState", BuilderActionFlockState::new)
         .registerCoreComponentType("FlockTarget", BuilderActionFlockSetTarget::new)
         .registerCoreComponentType("FlockBeacon", BuilderActionFlockBeacon::new)
         .registerCoreComponentType("Flock", BuilderEntityFilterFlock::new)
         .registerCoreComponentType("FlockCombatDamage", BuilderSensorFlockCombatDamage::new)
         .registerCoreComponentType("InflictedDamage", BuilderSensorInflictedDamage::new)
         .registerCoreComponentType("FlockLeader", BuilderSensorFlockLeader::new);
      Condition.CODEC.register("FlockSize", FlockSizeCondition.class, FlockSizeCondition.CODEC);
      this.flockComponentType = var1.registerComponent(Flock.class, () -> {
         throw new UnsupportedOperationException("Not implemented");
      });
      var1.registerSystem(new FlockSystems.EntityRemoved(this.flockComponentType));
      var1.registerSystem(new FlockSystems.Ticking(this.flockComponentType));
      var1.registerSystem(new FlockSystems.FlockDebugSystem(this.flockComponentType));
      var1.registerSystem(new FlockSystems.PlayerChangeGameModeEventSystem());
      this.flockMembershipComponentType = var1.registerComponent(FlockMembership.class, "FlockMembership", FlockMembership.CODEC);
      this.persistentFlockDataComponentType = var1.registerComponent(PersistentFlockData.class, "FlockData", PersistentFlockData.CODEC);
      var1.registerSystem(new FlockMembershipSystems.EntityRef(this.flockMembershipComponentType));
      var1.registerSystem(new FlockMembershipSystems.RefChange(this.flockMembershipComponentType));
      var1.registerSystem(new PositionCacheSystems.OnFlockJoinSystem(NPCEntity.getComponentType(), this.flockMembershipComponentType));
      var1.registerSystem(new FlockDeathSystems.EntityDeath());
      var1.registerSystem(new FlockDeathSystems.PlayerDeath());
      var1.registerSystem(new FlockMembershipSystems.FilterPlayerFlockDamageSystem());
      var1.registerSystem(new FlockMembershipSystems.OnDamageReceived());
      var1.registerSystem(new FlockMembershipSystems.OnDamageDealt());
      var1.registerSystem(new FlockMembershipSystems.NPCAddedFromWorldGen());
   }

   @Override
   class="kw">public void start() {
   }

   @Override
   class="kw">public void shutdown() {
   }

   class="kw">public ComponentType<EntityStore, Flock> getFlockComponentType() {
      class="kw">return this.flockComponentType;
   }

   class="kw">public ComponentType<EntityStore, FlockMembership> getFlockMembershipComponentType() {
      class="kw">return this.flockMembershipComponentType;
   }

   class="kw">public ComponentType<EntityStore, PersistentFlockData> getPersistentFlockDataComponentType() {
      class="kw">return this.persistentFlockDataComponentType;
   }

   @Nonnull
   class="kw">public UUID getPrefabRemappedFlockReference(int var1, UUID var2) {
      class="kw">return this.prefabFlockRemappings.get(var1).computeIfAbsent(var2, var0 -> UUID.randomUUID());
   }

   @Nullable
   class="kw">public class="kw">static Ref<EntityStore> trySpawnFlock(
      @Nonnull Ref<EntityStore> var0,
      @Nonnull NPCEntity var1,
      @Nonnull Store<EntityStore> var2,
      int var3,
      @Nonnull Vector3dc var4,
      Rotation3fc var5,
      @Nullable FlockAsset var6,
      TriConsumer<NPCEntity, Ref<EntityStore>, Store<EntityStore>> var7
   ) {
      int var8 = var6 != null ? var6.pickFlockSize() : 1;
      class="kw">return trySpawnFlock(var0, var1, var3, var4, var5, var8, var6, null, var7, var2);
   }

   @Nullable
   class="kw">public class="kw">static Ref<EntityStore> trySpawnFlock(
      @Nonnull Ref<EntityStore> var0,
      @Nonnull NPCEntity var1,
      @Nonnull Store<EntityStore> var2,
      int var3,
      @Nonnull Vector3dc var4,
      Rotation3fc var5,
      int var6,
      TriConsumer<NPCEntity, Ref<EntityStore>, Store<EntityStore>> var7
   ) {
      class="kw">return trySpawnFlock(var0, var1, var3, var4, var5, var6, null, null, var7, var2);
   }

   @Nullable
   class="kw">public class="kw">static Ref<EntityStore> trySpawnFlock(
      @Nonnull Ref<EntityStore> var0,
      @Nonnull NPCEntity var1,
      int var2,
      @Nonnull Vector3dc var3,
      Rotation3fc var4,
      int var5,
      FlockAsset var6,
      TriConsumer<NPCEntity, Holder<EntityStore>, Store<EntityStore>> var7,
      @Nullable TriConsumer<NPCEntity, Ref<EntityStore>, Store<EntityStore>> var8,
      @Nonnull Store<EntityStore> var9
   ) {
      if (var5 > 1 && var0.isValid()) {
         Role var10 = var1.getRole();
         assert var10 != null;
         FlockMembership var11 = var9.getComponent(var0, FlockMembership.getComponentType());
         Ref var12 = var11 != null ? var11.getFlockRef() : createFlock(var9, var6, var10.getFlockAllowedRoles());
         if (var11 == null) {
            FlockMembershipSystems.join(var0, var12, var9);
         }

         BoundingBox var13 = var9.getComponent(var0, BoundingBox.getComponentType());
         assert var13 != null;
         TransformComponent var14 = var9.getComponent(var0, TransformComponent.getComponentType());
         assert var14 != null;
         Box var15 = var13.getBoundingBox();
         Rotation3f var16 = var14.getRotation();
         double var17 = var3.x();
         int var19 = MathUtil.floor(var3.y() + var15.min.y + 1.0E-6);
         double var20 = var3.z();
         double var22 = var16.yaw();
         boolean var24 = var10.isFlockSpawnTypesRandom();
         int[] var25 = var10.getFlockSpawnTypes();
         int var26 = var25 == null ? 0 : var25.length;
         int var27 = 0;
         int var28 = var2;

         for (int var29 = 1; var29 < var5; var29++) {
            if (var26 > 0) {
               if (var24) {
                  var28 = var25[RandomExtra.randomRange(var26)];
               } else {
                  var28 = var25[var27];
                  var27 = (var27 + 1) % var26;
               }
            }

            Pair var30 = NPCPlugin.get().spawnEntity(var9, var28, var3, var4, null, var7, var8);
            if (var30 != null) {
               Ref var31 = (Ref<EntityStore>)var30.first();
               if (var31 != null && var31.isValid()) {
                  BoundingBox var32 = var9.getComponent(var31, BoundingBox.getComponentType());
                  assert var32 != null;
                  TransformComponent var33 = var9.getComponent(var31, TransformComponent.getComponentType());
                  assert var33 != null;
                  HeadRotation var34 = var9.getComponent(var31, HeadRotation.getComponentType());
                  assert var34 != null;
                  double var35 = var19 - var32.getBoundingBox().min.y;
                  var33.getRotation().setYaw((float)(var22 + RandomExtra.randomRange((float) (-Math.PI / 4), (float) (Math.PI / 4))));
                  var34.getRotation().setPitch(0.0F);
                  var33.getPosition().set(var17 + RandomExtra.randomRange(-0.5, 0.5), var35, var20 + RandomExtra.randomRange(-0.5, 0.5));
                  FlockMembershipSystems.join(var31, var12, var9);
               }
            }
         }

         class="kw">return var12;
      } else {
         class="kw">return null;
      }
   }

   @Nullable
   @Deprecated
   class="kw">public class="kw">static Flock getFlock(@Nonnull ComponentAccessor<EntityStore> var0, @Nonnull Ref<EntityStore> var1) {
      FlockMembership var2 = var0.getComponent(var1, FlockMembership.getComponentType());
      if (var2 == null) {
         class="kw">return null;
      }

      Ref var3 = var2.getFlockRef();
      class="kw">return var3 != null && var3.isValid() ? var0.getComponent(var3, Flock.getComponentType()) : null;
   }

   @Nonnull
   class="kw">public class="kw">static Ref<EntityStore> createFlock(@Nonnull Store<EntityStore> var0, @Nonnull Role var1) {
      class="kw">return createFlock(var0, null, var1.getFlockAllowedRoles());
   }

   @Nonnull
   class="kw">public class="kw">static Ref<EntityStore> createFlock(@Nonnull Store<EntityStore> var0, @Nullable FlockAsset var1, @Nonnull String[] var2) {
      Holder var3 = EntityStore.REGISTRY.newHolder();
      var3.addComponent(UUIDComponent.getComponentType(), UUIDComponent.randomUUID());
      var3.addComponent(EntityGroup.getComponentType(), new EntityGroup());
      var3.addComponent(Flock.getComponentType(), new Flock(var1, var2));
      Ref var4 = var0.addEntity(var3, AddReason.SPAWN);
      if (var4 == null) {
         throw new UnsupportedOperationException("Unable to handle non-spawned flock!");
      } else {
         class="kw">return var4;
      }
   }

   @Nullable
   class="kw">public class="kw">static Ref<EntityStore> getFlockReference(@Nonnull Ref<EntityStore> var0, @Nonnull ComponentAccessor<EntityStore> var1) {
      FlockMembership var2 = var1.getComponent(var0, FlockMembership.getComponentType());
      class="kw">return var2 == null ? null : var2.getFlockRef();
   }

   class="kw">public class="kw">static boolean isFlockMember(@Nonnull Ref<EntityStore> var0, @Nonnull Store<EntityStore> var1) {
      FlockMembership var2 = var1.getComponent(var0, FlockMembership.getComponentType());
      class="kw">return var2 != null;
   }

   class="kw">private class="kw">static class="kw">final class PrefabPasteEventSystem class="kw">extends WorldEventSystem<EntityStore, PrefabPasteEvent> {
      class="kw">private class="kw">final FlockPlugin plugin;

      PrefabPasteEventSystem(@Nonnull FlockPlugin var1) {
         super(PrefabPasteEvent.class);
         this.plugin = var1;
      }

      class="kw">public void handle(@Nonnull Store<EntityStore> var1, @Nonnull CommandBuffer<EntityStore> var2, @Nonnull PrefabPasteEvent var3) {
         if (var3.isPasteStart()) {
            this.plugin.prefabFlockRemappings.put(var3.getPrefabId(), new HashMap<>());
         } else {
            this.plugin.prefabFlockRemappings.remove(var3.getPrefabId());
         }
      }
   }
}