CompanionBlockSpawnerSupport class
Пакет: com.hypixel.hytale.builtin.companionblockspawner
Файл: com/hypixel/hytale/builtin/companionblockspawner/CompanionBlockSpawnerSupport.java
Поля (28)
| Модификаторы | Тип | Имя |
|---|---|---|
|
String |
var10 |
|
NPCPlugin |
var11 |
|
Ref |
var11 |
|
BuilderInfo |
var12 |
|
Builder |
var13 |
|
SpawningContext |
var14 |
|
MovementMode |
var15 |
|
Vector3d |
var16 |
|
PersistentRef |
var17 |
|
WorldConfig |
var18 |
|
BlockModule.BlockStateInfo |
var2 |
|
Store |
var3 |
|
Store |
var4 |
|
SpawnMarkerEntity |
var4 |
|
Ref |
var4 |
|
Store |
var5 |
|
Holder |
var5 |
|
SpawnMarkerEntity |
var5 |
|
CompanionBlockSpawnerBlock |
var6 |
|
double[][] |
var6 |
|
UUIDComponent |
var6 |
|
InvalidatablePersistentRef[] |
var6 |
|
SpawnMarker |
var7 |
|
Model |
var7 |
|
IWeightedMap |
var8 |
|
Ref |
var8 |
|
SpawnMarker.SpawnConfiguration |
var9 |
|
PersistentRef |
var9 |
Методы (17)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
abstract |
return new |
Vector3dreturn new Vector3d(var2.xSpawn, var2.ySpawn, var2.zSpawn) |
static |
void |
createMarkervoid createMarker(@Nonnull World var0, @Nonnull Vector3i var1, @Nonnull Ref<ChunkStore> var2, @Nonnull CompanionBlockSpawnerRecipe var3) |
|
|
for for(double[] var10 : var6) |
|
|
for for(int var11 = 1; var11 <= 4; var11++) |
|
|
for for(int var12 = -var11; var12 <= var11; var12++) |
|
|
for for(int var13 = -var11; var13 <= var11; var13++) |
|
|
for for(InvalidatablePersistentRef var10 : var6) |
static |
int |
getMaxMarkerDistanceint getMaxMarkerDistance() |
|
|
if if(var6 == null) |
|
|
if if(var7 == null) |
|
|
if if(var16 != null) |
|
|
if if(var5 != null) |
|
|
if if(var6 != null) |
|
|
if if(var2 != null) |
static |
void |
markSpawnerDirtyvoid markSpawnerDirty(@Nonnull Store<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1) |
abstract |
|
markSpawnerDirty markSpawnerDirty(var5, var2) |
static |
void |
removeMarkervoid removeMarker(@Nonnull World var0, @Nonnull UUID var1, @Nonnull String var2) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.companionblockspawner;
class="kw">import com.hypixel.hytale.builtin.companionblockspawner.config.CompanionBlockSpawnerRecipe;
class="kw">import com.hypixel.hytale.common.map.IWeightedMap;
class="kw">import com.hypixel.hytale.component.AddReason;
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.Store;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
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.entity.nameplate.Nameplate;
class="kw">import com.hypixel.hytale.server.core.entity.reference.InvalidatablePersistentRef;
class="kw">import com.hypixel.hytale.server.core.entity.reference.PersistentRef;
class="kw">import com.hypixel.hytale.server.core.modules.block.BlockModule;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.HiddenFromAdventurePlayers;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.ModelComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.PersistentModel;
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.WorldConfig;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
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.Builder;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderInfo;
class="kw">import com.hypixel.hytale.server.npc.movement.MovementMode;
class="kw">import com.hypixel.hytale.server.spawning.ISpawnableWithModel;
class="kw">import com.hypixel.hytale.server.spawning.SpawnTestResult;
class="kw">import com.hypixel.hytale.server.spawning.SpawningContext;
class="kw">import com.hypixel.hytale.server.spawning.assets.spawnmarker.config.SpawnMarker;
class="kw">import com.hypixel.hytale.server.spawning.spawnmarkers.SpawnMarkerEntity;
class="kw">import java.util.UUID;
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">import org.joml.Vector3i;
class="kw">public class="kw">final class CompanionBlockSpawnerSupport {
@Nonnull
class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
class="kw">private class="kw">static class="kw">final int MAX_SPAWN_RADIUS = 4;
class="kw">private class="kw">static class="kw">final int MAX_DROP_BELOW_SPAWNER = 2;
class="kw">private class="kw">static class="kw">final int MAX_RISE_ABOVE_SPAWNER = 1;
class="kw">static int getMaxMarkerDistance() {
class="kw">return 4;
}
class="kw">private CompanionBlockSpawnerSupport() {
}
class="kw">public class="kw">static void createMarker(@Nonnull World var0, @Nonnull Vector3i var1, @Nonnull Ref<ChunkStore> var2, @Nonnull CompanionBlockSpawnerRecipe var3) {
Store var4 = var0.getEntityStore().getStore();
Store var5 = var0.getChunkStore().getStore();
if (!var2.isValid()) {
LOGGER.at(Level.FINE).log("Skipping deferred marker creation at %s: spawner block entity no longer valid", var1);
} else {
CompanionBlockSpawnerBlock var6 = var5.getComponent(var2, CompanionBlockSpawnerBlock.getComponentType());
if (var6 == null) {
LOGGER.at(Level.FINE).log("Skipping deferred marker creation at %s: spawner component gone", var1);
} else if (!var6.hasMarker()) {
SpawnMarker var7 = SpawnMarker.getAssetMap().getAsset(var3.getSpawnMarker());
if (var7 == null) {
LOGGER.at(Level.SEVERE).log("Companion block spawner recipe %s references unknown spawn marker '%s'", var3.getId(), var3.getSpawnMarker());
} else {
IWeightedMap var8 = var7.getWeightedConfigurations();
SpawnMarker.SpawnConfiguration var9 = var8 != null ? var8.get(ThreadLocalRandom.current()) : null;
String var10 = var9 != null ? var9.getNpc() : null;
if (var10 != null && !var10.isEmpty()) {
NPCPlugin var11 = NPCPlugin.get();
BuilderInfo var12 = var11.getRoleBuilderInfo(var11.getIndex(var10));
if (var12 != null && var12.isValid()) {
Builder var13 = var12.getBuilder();
if (var13 != null && var13.isSpawnable()) {
SpawningContext var14 = new SpawningContext();
if (!var14.setSpawnable((ISpawnableWithModel)var13)) {
LOGGER.at(Level.SEVERE).log("Companion block spawner recipe %s failed validation for NPC role '%s'", var3.getId(), var10);
} else {
MovementMode var15 = var14.breathesInAir ? MovementMode.WALK : MovementMode.UNDERWATER_WALK;
Vector3d var16 = findMarkerTile(var0, var1, var14, var15, var3, var10);
if (var16 != null) {
PersistentRef var17 = createMarkerEntity(var4, var7, var16, var1);
var6.setMarkerRef(var17);
markSpawnerDirty(var5, var2);
LOGGER.at(Level.FINE)
.log("Created companion spawn marker (uuid %s) for spawner at %s (recipe %s)", var17.getUuid(), var1, var3.getId());
WorldConfig var18 = var0.getWorldConfig();
if (!var18.isSpawningNPC() || !var18.isSpawnMarkersEnabled()) {
LOGGER.at(Level.FINE)
.log(
"Companion spawn marker created at %s but world '%s' has NPC spawning disabled (SpawningNPC=%s, SpawnMarkersEnabled=%s) - no companion will spawn until re-enabled",
var1,
var0.getName(),
var18.isSpawningNPC(),
var18.isSpawnMarkersEnabled()
);
}
}
}
} else {
LOGGER.at(Level.SEVERE).log("Companion block spawner recipe %s marker references non-spawnable NPC role '%s'", var3.getId(), var10);
}
} else {
LOGGER.at(Level.SEVERE).log("Companion block spawner recipe %s marker references unknown NPC role '%s'", var3.getId(), var10);
}
} else {
LOGGER.at(Level.FINE)
.log("Companion block spawner recipe %s marker '%s' has no concrete role to position", var3.getId(), var3.getSpawnMarker());
}
}
}
}
}
@Nullable
class="kw">private class="kw">static Vector3d findMarkerTile(
@Nonnull World var0,
@Nonnull Vector3i var1,
@Nonnull SpawningContext var2,
@Nonnull MovementMode var3,
@Nonnull CompanionBlockSpawnerRecipe var4,
@Nonnull String var5
) {
double[][] var6 = new double[][]{{var1.y - 2, var1.y + 0.5}, {var1.y + 0.5, var1.y + 1}};
for (double[] var10 : var6) {
for (int var11 = 1; var11 <= 4; var11++) {
for (int var12 = -var11; var12 <= var11; var12++) {
for (int var13 = -var11; var13 <= var11; var13++) {
if ((Math.abs(var12) == var11 || Math.abs(var13) == var11)
&& var2.set(var0, var1.x + var12 + 0.5, var1.y, var1.z + var13 + 0.5)
&& !(var2.ySpawn < var10[0])
&& !(var2.ySpawn > var10[1])) {
if (!var2.setMovementMode(var3, true)) {
LOGGER.at(Level.FINE)
.log("Companion block spawner recipe %s role '%s' is incompatible with movement mode %s", var4.getId(), var5, var3);
class="kw">return null;
}
if (var2.canSpawn(true, false) == SpawnTestResult.TEST_OK) {
class="kw">return new Vector3d(var2.xSpawn, var2.ySpawn, var2.zSpawn);
}
}
}
}
}
}
LOGGER.at(Level.FINE).log("Companion block spawner recipe %s could not find a free tile near %s", var4.getId(), var1);
class="kw">return null;
}
@Nonnull
class="kw">private class="kw">static PersistentRef createMarkerEntity(@Nonnull Store<EntityStore> var0, @Nonnull SpawnMarker var1, @Nonnull Vector3d var2, @Nonnull Vector3i var3) {
SpawnMarkerEntity var4 = new SpawnMarkerEntity();
var4.setSpawnMarker(var1);
Holder var5 = EntityStore.REGISTRY.newHolder();
var5.addComponent(SpawnMarkerEntity.getComponentType(), var4);
var5.addComponent(Nameplate.getComponentType(), new Nameplate(var1.getId()));
var5.addComponent(TransformComponent.getComponentType(), new TransformComponent(var2, Rotation3f.IDENTITY));
UUIDComponent var6 = var5.ensureAndGetComponent(UUIDComponent.getComponentType());
Model var7 = SpawnMarkerEntity.getModel(var1);
var5.addComponent(ModelComponent.getComponentType(), new ModelComponent(var7));
var5.addComponent(PersistentModel.getComponentType(), new PersistentModel(var7.toReference()));
var5.ensureComponent(HiddenFromAdventurePlayers.getComponentType());
var5.addComponent(CompanionSpawnerMarkerReference.getComponentType(), new CompanionSpawnerMarkerReference(new Vector3i(var3)));
Ref var8 = var0.addEntity(var5, AddReason.SPAWN);
PersistentRef var9 = new PersistentRef();
var9.setEntity(var8, var6.getUuid());
class="kw">return var9;
}
class="kw">public class="kw">static void removeMarker(@Nonnull World var0, @Nonnull UUID var1, @Nonnull String var2) {
Store var3 = var0.getEntityStore().getStore();
Ref var4 = var3.getExternalData().getRefFromUUID(var1);
if (var4 != null && var4.isValid()) {
LOGGER.at(Level.FINE).log("Removing companion spawn marker %s: %s", var1, var2);
SpawnMarkerEntity var5 = var3.getComponent(var4, SpawnMarkerEntity.getComponentType());
if (var5 != null) {
InvalidatablePersistentRef[] var6 = var5.getNpcReferences();
if (var6 != null) {
for (InvalidatablePersistentRef var10 : var6) {
Ref var11 = var10.getEntity(var3);
if (var11 != null && var11.isValid()) {
var3.removeEntity(var11, RemoveReason.REMOVE);
}
}
}
}
var3.removeEntity(var4, RemoveReason.REMOVE);
} else {
LOGGER.at(Level.FINE).log("Companion spawn marker %s not loaded for removal (%s); MarkerHeartbeat will clean it up on load", var1, var2);
}
}
class="kw">static void markSpawnerDirty(@Nonnull Store<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1) {
if (var1.isValid()) {
BlockModule.BlockStateInfo var2 = var0.getComponent(var1, BlockModule.BlockStateInfo.getComponentType());
if (var2 != null) {
var2.markNeedsSaving();
}
}
}
}