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);
}
}