ActionBeacon class

Пакет: com.hypixel.hytale.server.npc.corecomponents.entity

Файл: com/hypixel/hytale/server/npc/corecomponents/entity/ActionBeacon.java

extends: ActionBase

Поля (22)

МодификаторыТипИмя
final ThreadLocal<List<Ref<EntityStore>>> PROVIDED_RECEIVERS
ModelComponent var10
Model var11
double var12
double var14
double var16
TransformComponent var18
Vector3d var19
float var20
double var21
double var23
TransformComponent var5
ThreadLocalRandom var5
Vector3d var6
Vector3f var6
Ref var7
List var7
Matrix4d var7
PositionCache var8
TransformComponent var8
Ref var9
Vector3d var9

Методы (9)

МодификаторыВозвратСигнатура
static boolean filterNPCsboolean filterNPCs(@Nonnull Ref<EntityStore> var0, @Nonnull ActionBeacon var1, @Nonnull ExecutionSupport var2, @Nonnull ComponentAccessor<EntityStore> var3)
abstract for for(int var9 = 0; var9 < this.sendList.size()
abstract for for(int var8 = 0; var8 < var7.size()
if if(this.sendCount <= 0)
if if(var5 != null)
if if(this.sendCount <= 0)
protected void sendNPCMessagevoid sendNPCMessage(@Nonnull Ref<EntityStore> var1, @Nonnull Ref<EntityStore> var2, @Nonnull Ref<EntityStore> var3, @Nonnull ComponentAccessor<EntityStore> var4)
private void sendToProvidedReceiversvoid sendToProvidedReceivers(@Nonnull Ref<EntityStore> var1, @Nonnull ExecutionSupport var2, @Nonnull Ref<EntityStore> var3, @Nonnull Store<EntityStore> var4)
abstract super super(var1)

Исходный код

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

class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.random.RandomExtra;
class="kw">import com.hypixel.hytale.server.core.asset.type.model.config.Model;
class="kw">import com.hypixel.hytale.server.core.modules.debug.DebugUtils;
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.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.npc.NPCPlugin;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderSupport;
class="kw">import com.hypixel.hytale.server.npc.components.messaging.BeaconBroadcast;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.ActionBase;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.builders.BuilderActionBeacon;
class="kw">import com.hypixel.hytale.server.npc.instructions.ExecutionSupport;
class="kw">import com.hypixel.hytale.server.npc.role.RoleDebugFlags;
class="kw">import com.hypixel.hytale.server.npc.role.support.DebugSupport;
class="kw">import com.hypixel.hytale.server.npc.role.support.PositionCache;
class="kw">import com.hypixel.hytale.server.npc.sensorinfo.InfoProvider;
class="kw">import it.unimi.dsi.fastutil.objects.ReferenceArrayList;
class="kw">import java.util.List;
class="kw">import java.util.concurrent.ThreadLocalRandom;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Matrix4d;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3f;

class="kw">public class ActionBeacon class="kw">extends ActionBase {
   class="kw">private class="kw">static class="kw">final ThreadLocal<List<Ref<EntityStore>>> PROVIDED_RECEIVERS = ThreadLocal.withInitial(ReferenceArrayList::new);
   class="kw">protected class="kw">final String message;
   class="kw">protected class="kw">final double range;
   class="kw">protected class="kw">final int[] targetGroups;
   class="kw">protected class="kw">final int targetToSendSlot;
   class="kw">protected class="kw">final double expirationTime;
   class="kw">protected class="kw">final int sendCount;
   @Nullable
   class="kw">protected class="kw">final List<Ref<EntityStore>> sendList;

   class="kw">public ActionBeacon(@Nonnull BuilderActionBeacon var1, @Nonnull BuilderSupport var2) {
      super(var1);
      this.message = var1.getMessage(var2);
      this.range = var1.getRange(var2);
      this.targetGroups = var1.getTargetGroups(var2);
      this.targetToSendSlot = var1.getTargetToSendSlot(var2);
      this.expirationTime = var1.getExpirationTime();
      this.sendCount = var1.getSendCount();
      this.sendList = this.sendCount > 0 ? new ReferenceArrayList(this.sendCount) : null;
   }

   @Override
   class="kw">public void registerWithSupport(@Nonnull ExecutionSupport var1) {
      var1.getPositionCache().requireEntityDistanceUnsorted(this.range);
   }

   @Override
   class="kw">public boolean canExecute(
      @Nonnull Ref<EntityStore> var1, @Nonnull ExecutionSupport var2, @Nullable InfoProvider var3, double var4, @Nonnull Store<EntityStore> var6
   ) {
      class="kw">return !super.canExecute(var1, var2, var3, var4, var6)
         ? false
         : this.targetToSendSlot == Integer.MIN_VALUE || var2.getMarkedEntitySupport().hasMarkedEntityInSlot(this.targetToSendSlot);
   }

   @Override
   class="kw">public boolean execute(
      @Nonnull Ref<EntityStore> var1, @Nonnull ExecutionSupport var2, @Nullable InfoProvider var3, double var4, @Nonnull Store<EntityStore> var6
   ) {
      super.execute(var1, var2, var3, var4, var6);
      Ref var7 = this.targetToSendSlot >= 0 ? var2.getMarkedEntitySupport().getMarkedEntityRef(this.targetToSendSlot) : var1;
      PositionCache var8 = var2.getPositionCache();
      if (this.sendCount <= 0) {
         var8.forEachNPCUnordered(
            this.range,
            ActionBeacon::filterNPCs,
            (var0, var1x, var2x, var3x) -> var1x.sendNPCMessage(var3x, var0, var2x, var3x.getStore()),
            this,
            var2,
            var7,
            var1,
            var6
         );
         this.sendToProvidedReceivers(var1, var2, var7, var6);
         class="kw">return true;
      }

      var8.forEachNPCUnordered(
         this.range,
         ActionBeacon::filterNPCs,
         (var0, var1x, var2x, var3x) -> RandomExtra.reservoirSample(var0, var1x.sendCount, var2x),
         this,
         var2,
         this.sendList,
         var1,
         var6
      );
      this.sendToProvidedReceivers(var1, var2, var7, var6);

      for (int var9 = 0; var9 < this.sendList.size(); var9++) {
         this.sendNPCMessage(var1, this.sendList.get(var9), var7, var6);
      }

      this.sendList.clear();
      class="kw">return true;
   }

   class="kw">private void sendToProvidedReceivers(
      @Nonnull Ref<EntityStore> var1, @Nonnull ExecutionSupport var2, @Nonnull Ref<EntityStore> var3, @Nonnull Store<EntityStore> var4
   ) {
      TransformComponent var5 = var4.getComponent(var1, TransformComponent.getComponentType());
      if (var5 != null) {
         Vector3d var6 = var5.getPosition();
         List var7 = PROVIDED_RECEIVERS.get();
         var7.clear();
         BeaconBroadcast.collectProvidedReceivers(var6, this.range, var4, var7);

         for (int var8 = 0; var8 < var7.size(); var8++) {
            Ref var9 = var7.get(var8);
            if (!var9.equals(var1) && filterNPCs(var9, this, var2, var4)) {
               if (this.sendCount <= 0) {
                  this.sendNPCMessage(var1, var9, var3, var4);
               } else {
                  RandomExtra.reservoirSample(var9, this.sendCount, this.sendList);
               }
            }
         }

         var7.clear();
      }
   }

   class="kw">protected class="kw">static boolean filterNPCs(
      @Nonnull Ref<EntityStore> var0, @Nonnull ActionBeacon var1, @Nonnull ExecutionSupport var2, @Nonnull ComponentAccessor<EntityStore> var3
   ) {
      class="kw">return BeaconBroadcast.shouldReceive(var2.getRoleIndex(), var0, var1.targetGroups, false, var3);
   }

   class="kw">protected void sendNPCMessage(
      @Nonnull Ref<EntityStore> var1, @Nonnull Ref<EntityStore> var2, @Nonnull Ref<EntityStore> var3, @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      if (DebugSupport.get(var1, var4).isDebugFlagSet(RoleDebugFlags.BeaconMessages)) {
         ((HytaleLogger.Api)NPCPlugin.get().getLogger().atInfo())
            .log("ID %d sent message '%s' with target ID %d to ID %d", var1.getIndex(), this.message, var3.getIndex(), var2.getIndex());
         ThreadLocalRandom var5 = ThreadLocalRandom.current();
         Vector3f var6 = new Vector3f(var5.nextFloat(), var5.nextFloat(), var5.nextFloat());
         Matrix4d var7 = new Matrix4d();
         var7.identity();
         TransformComponent var8 = var4.getComponent(var1, TransformComponent.getComponentType());
         assert var8 != null;
         Vector3d var9 = var8.getPosition();
         ModelComponent var10 = var4.getComponent(var1, ModelComponent.getComponentType());
         assert var10 != null;
         Model var11 = var10.getModel();
         double var12 = var9.x;
         double var14 = var9.y + (var11 != null ? var11.getEyeHeight(var1, var4) : 0.0F);
         double var16 = var9.z;
         var7.translate(var12, var14 + var5.nextFloat() * 0.5 - 0.25, var16);
         TransformComponent var18 = var4.getComponent(var2, TransformComponent.getComponentType());
         assert var18 != null;
         Vector3d var19 = var18.getPosition();
         float var20 = ModelComponent.getEyeHeight(var2, var4);
         var12 -= var19.x();
         var14 -= var19.y() + var20;
         var16 -= var19.z();
         double var21 = Math.atan2(-var16, -var12);
         var7.rotate(-(var21 + (float) (Math.PI / 2)), 0.0, 1.0, 0.0);
         double var23 = Math.atan2(Math.sqrt(var12 * var12 + var16 * var16), -var14);
         var7.rotate(-var23, 1.0, 0.0, 0.0);
         DebugUtils.addArrow(var4.getExternalData().getWorld(), var7, var6, var9.distance(var19), 5.0F, 1);
      }

      BeaconBroadcast.post(var2, this.message, var3, this.expirationTime, var4);
   }
}