SpawnBeacon class
Пакет: com.hypixel.hytale.server.spawning.beacons
Файл: com/hypixel/hytale/server/spawning/beacons/SpawnBeacon.java
extends: Entity
Поля (19)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
BuilderCodec<SpawnBeacon> |
CODEC |
|
ISpawnableWithModel |
var10 |
|
Vector3d |
var11 |
|
Vector3d |
var12 |
|
Rotation3f |
var13 |
|
FlockAsset |
var14 |
|
int |
var15 |
|
String |
var16 |
|
Pair |
var17 |
|
Ref |
var18 |
|
NPCEntity |
var19 |
|
Player |
var4 |
|
UUIDComponent |
var4 |
|
int |
var5 |
|
String |
var5 |
|
int |
var6 |
|
RoleSpawnParameters |
var8 |
|
FloodFillPositionSelector |
var9 |
|
int |
var9 |
Методы (11)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
|
for for(int var7 = 0; var7 < var5; var7++) |
public |
String |
getSpawnConfigIdString getSpawnConfigId() |
public |
BeaconSpawnWrapper |
getSpawnWrapperBeaconSpawnWrapper getSpawnWrapper() |
|
|
if if(var8 != null) |
|
|
if if(var10 != null) |
|
|
if if(var5 != null) |
public |
boolean |
manualTriggerboolean manualTrigger(@Nonnull Ref<EntityStore> var1, @Nonnull FloodFillPositionSelector var2, @Nonnull Ref<EntityStore> var3, @Nonnull Store<EntityStore> var4) |
protected |
void |
markUnspawnablevoid markUnspawnable(Ref<EntityStore> var1, int var2, ComponentAccessor<EntityStore> var3) |
static |
void |
postSpawnvoid postSpawn(@Nonnull NPCEntity var0, @Nonnull Ref<EntityStore> var1, @Nonnull BeaconNPCSpawn var2, Ref<EntityStore> var3, ComponentAccessor<EntityStore> var4) |
public |
void |
setSpawnWrappervoid setSpawnWrapper(@Nonnull BeaconSpawnWrapper var1) |
abstract |
|
super super(var1) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.spawning.beacons;
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.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.math.random.RandomExtra;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.protocol.GameMode;
class="kw">import com.hypixel.hytale.server.core.entity.Entity;
class="kw">import com.hypixel.hytale.server.core.entity.UUIDComponent;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.modules.entity.EntityModule;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
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 com.hypixel.hytale.server.flock.FlockPlugin;
class="kw">import com.hypixel.hytale.server.flock.config.FlockAsset;
class="kw">import com.hypixel.hytale.server.npc.NPCPlugin;
class="kw">import com.hypixel.hytale.server.npc.entities.NPCEntity;
class="kw">import com.hypixel.hytale.server.npc.role.support.MarkedEntitySupport;
class="kw">import com.hypixel.hytale.server.npc.role.support.StateSupport;
class="kw">import com.hypixel.hytale.server.npc.systems.NewSpawnStartTickingSystem;
class="kw">import com.hypixel.hytale.server.spawning.ISpawnableWithModel;
class="kw">import com.hypixel.hytale.server.spawning.SpawningContext;
class="kw">import com.hypixel.hytale.server.spawning.assets.spawns.config.BeaconNPCSpawn;
class="kw">import com.hypixel.hytale.server.spawning.assets.spawns.config.RoleSpawnParameters;
class="kw">import com.hypixel.hytale.server.spawning.util.FloodFillPositionSelector;
class="kw">import com.hypixel.hytale.server.spawning.wrappers.BeaconSpawnWrapper;
class="kw">import it.unimi.dsi.fastutil.Pair;
class="kw">import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
class="kw">import it.unimi.dsi.fastutil.ints.IntSet;
class="kw">import java.util.concurrent.ThreadLocalRandom;
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 SpawnBeacon class="kw">extends Entity {
class="kw">public class="kw">static class="kw">final BuilderCodec<SpawnBeacon> CODEC = BuilderCodec.builder(SpawnBeacon.class, SpawnBeacon::new, Entity.CODEC)
.append(new KeyedCodec<>("SpawnConfiguration", Codec.STRING), (var0, var1) -> var0.spawnConfigId = var1, var0 -> var0.spawnConfigId)
.add()
.build();
class="kw">private BeaconSpawnWrapper spawnWrapper;
class="kw">private String spawnConfigId;
class="kw">private class="kw">final IntSet unspawnableRoles = new IntOpenHashSet();
class="kw">private class="kw">final SpawningContext spawningContext = new SpawningContext();
@Nullable
class="kw">public class="kw">static ComponentType<EntityStore, SpawnBeacon> getComponentType() {
class="kw">return EntityModule.get().getComponentType(SpawnBeacon.class);
}
class="kw">public SpawnBeacon() {
}
class="kw">public SpawnBeacon(World var1) {
super(var1);
}
class="kw">public BeaconSpawnWrapper getSpawnWrapper() {
class="kw">return this.spawnWrapper;
}
class="kw">public void setSpawnWrapper(@Nonnull BeaconSpawnWrapper var1) {
this.spawnWrapper = var1;
this.spawnConfigId = var1.getSpawn().getId();
}
class="kw">public String getSpawnConfigId() {
class="kw">return this.spawnConfigId;
}
@Override
class="kw">public boolean isHiddenFromLivingEntity(@Nonnull Ref<EntityStore> var1, @Nonnull Ref<EntityStore> var2, @Nonnull ComponentAccessor<EntityStore> var3) {
Player var4 = var3.getComponent(var2, Player.getComponentType());
class="kw">return var4 == null || var4.getGameMode() != GameMode.Creative;
}
@Override
class="kw">public boolean isCollidable() {
class="kw">return false;
}
@Override
class="kw">public void moveTo(@Nonnull Ref<EntityStore> var1, double var2, double var4, double var6, @Nonnull ComponentAccessor<EntityStore> var8) {
super.moveTo(var1, var2, var4, var6, var8);
FloodFillPositionSelector var9 = var8.getComponent(var1, FloodFillPositionSelector.getComponentType());
assert var9 != null;
var9.setCalculatePositionsAfter(SpawnBeaconSystems.POSITION_CALCULATION_DELAY_RANGE[1]);
var9.forceRebuildCache();
this.unspawnableRoles.clear();
}
class="kw">public boolean manualTrigger(
@Nonnull Ref<EntityStore> var1, @Nonnull FloodFillPositionSelector var2, @Nonnull Ref<EntityStore> var3, @Nonnull Store<EntityStore> var4
) {
int var5 = RandomExtra.randomRange(this.spawnWrapper.getSpawn().getConcurrentSpawnsRange());
int var6 = 0;
for (int var7 = 0; var7 < var5; var7++) {
RoleSpawnParameters var8 = this.spawnWrapper.pickRole(ThreadLocalRandom.current());
if (var8 != null) {
int var9 = NPCPlugin.get().getIndex(var8.getId());
if (!this.unspawnableRoles.contains(var9)) {
ISpawnableWithModel var10 = (ISpawnableWithModel)NPCPlugin.get().tryGetCachedValidRole(var9);
if (var10 != null) {
this.spawningContext.setSpawnable(var10);
if (!var2.hasPositionsForRole(var9)) {
this.markUnspawnable(var1, var9, var4);
this.spawningContext.releaseFull();
} else {
Vector3d var11 = var3.getStore().getComponent(var3, TransformComponent.getComponentType()).getPosition();
if (!var2.prepareSpawnContext(var11, var5, var9, this.spawningContext, this.spawnWrapper)) {
this.spawningContext.releaseFull();
} else {
Vector3d var12 = this.spawningContext.newPosition();
Rotation3f var13 = this.spawningContext.newRotation();
FlockAsset var14 = var8.getFlockDefinition();
int var15 = var14 != null ? var14.pickFlockSize() : 1;
try {
String var16 = this.spawningContext.activeMotionControllerType;
Pair var17 = NPCPlugin.get().spawnEntity(var4, var9, var12, var13, this.spawningContext.getModel(), (var3x, var4x, var5x) -> {
var3x.setActiveMotionControllerName(var16);
postSpawn(var3x, var4x, this.spawnWrapper.getSpawn(), var3, var5x);
});
Ref var18 = (Ref<EntityStore>)var17.first();
NPCEntity var19 = (NPCEntity)var17.second();
FlockPlugin.trySpawnFlock(var18, var19, var9, var12, var13, var15, var14, null, (var3x, var4x, var5x) -> {
var3x.setActiveMotionControllerName(var16);
postSpawn(var3x, var4x, this.spawnWrapper.getSpawn(), var3, var5x);
}, var4);
var6++;
} catch (RuntimeException var23) {
LOGGER.at(Level.WARNING).log("Failed to create %s: %s", NPCPlugin.get().getName(var9), var23.getMessage());
this.markUnspawnable(var1, var9, var4);
} class="kw">finally {
this.spawningContext.releaseFull();
}
}
}
}
}
}
}
class="kw">return var6 != 0;
}
class="kw">protected void markUnspawnable(Ref<EntityStore> var1, int var2, ComponentAccessor<EntityStore> var3) {
this.unspawnableRoles.add(var2);
if (this.unspawnableRoles.size() >= this.spawnWrapper.getRoles().size()) {
UUIDComponent var4 = var3.getComponent(var1, UUIDComponent.getComponentType());
assert var4 != null;
LOGGER.at(Level.WARNING).log("Removed spawn beacon %s due to being unable to spawn any NPC types", var4.getUuid());
this.remove();
}
}
class="kw">protected class="kw">static void postSpawn(
@Nonnull NPCEntity var0, @Nonnull Ref<EntityStore> var1, @Nonnull BeaconNPCSpawn var2, Ref<EntityStore> var3, ComponentAccessor<EntityStore> var4
) {
MarkedEntitySupport.get(var1, var4).setMarkedEntity(var2.getTargetSlot(), var3, var2.isRebind(), var4);
String var5 = var2.getNpcSpawnState();
if (var5 != null) {
StateSupport.get(var1, var4).setState(var1, var5, var2.getNpcSpawnSubState(), var4);
}
NewSpawnStartTickingSystem.queueNewSpawn(var1, var1.getStore());
}
@Nonnull
@Override
class="kw">public String toString() {
class="kw">return "SpawnBeacon{spawnConfigId='" + this.spawnConfigId + "'} " + super.toString();
}
}