LocalSpawnControllerSystem class
Пакет: com.hypixel.hytale.server.spawning.local
Файл: com/hypixel/hytale/server/spawning/local/LocalSpawnControllerSystem.java
extends: TickingSystem<EntityStore>
Поля (85)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
double |
RUN_FREQUENCY_SECONDS |
|
|
continue |
|
Ref |
var10 |
|
byte |
var10 |
|
int |
var10 |
|
LocalSpawnController |
var11 |
|
byte |
var11 |
|
int |
var11 |
|
PlayerRef |
var12 |
|
byte |
var12 |
|
ChunkStore |
var12 |
|
TransformComponent |
var13 |
|
byte |
var13 |
|
Store |
var13 |
|
WeatherTracker |
var14 |
|
byte |
var14 |
|
int |
var14 |
|
int |
var15 |
|
int |
var15 |
|
List |
var16 |
|
int |
var16 |
|
BeaconSpawnWrapper |
var17 |
|
int |
var17 |
|
double |
var18 |
|
|
var18 |
|
int |
var18 |
|
int |
var19 |
|
int[] |
var20 |
|
int |
var21 |
|
|
var21 |
|
int |
var21 |
|
int |
var22 |
|
|
var22 |
|
int |
var22 |
|
BeaconSpawnWrapper |
var24 |
|
int |
var24 |
|
double |
var25 |
|
int |
var25 |
|
int |
var26 |
|
int[] |
var27 |
|
Ref |
var27 |
|
int |
var28 |
|
BlockSection |
var28 |
|
int |
var29 |
|
int |
var29 |
|
SpatialResource |
var30 |
|
int |
var30 |
|
WorldTimeResource |
var31 |
|
double |
var32 |
|
int |
var34 |
|
int |
var34 |
|
int |
var35 |
|
BlockType |
var35 |
|
int |
var36 |
|
Object2ByteOpenHashMap |
var37 |
|
BeaconSpawnWrapper |
var39 |
|
LocalSpawnState |
var4 |
|
Ref |
var41 |
|
LegacySpawnBeaconEntity |
var42 |
|
TransformComponent |
var43 |
|
double |
var44 |
|
double |
var45 |
|
int |
var46 |
|
double |
var47 |
|
double |
var49 |
|
List |
var5 |
|
double |
var51 |
|
int |
var53 |
|
Vector3d |
var55 |
|
double |
var56 |
|
int |
var57 |
|
Pair |
var59 |
|
LocalSpawnController |
var6 |
|
World |
var6 |
|
LegacySpawnBeaconEntity |
var60 |
|
Ref |
var61 |
|
Ref |
var62 |
|
TransformComponent |
var63 |
|
Vector3d |
var64 |
|
List |
var7 |
|
List |
var8 |
|
LightRangePredicate |
var8 |
|
byte |
var9 |
|
byte |
var9 |
|
|
var9 |
Методы (20)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
|
for for(int var31 = var21; var31 <= var22; var31++) |
|
|
for for(int var32 = var24; var32 <= var25; var32++) |
|
|
for for(int var33 = var29; var33 <= var30; var33++) |
abstract |
|
for for(int var5 = 0; var5 < var3x.size() |
abstract |
|
for for(int var9 = 0; var9 < var5.size() |
abstract |
|
for for(int var23 = 1; var23 < var16.size() |
abstract |
|
for for(int var38 = 0; var38 < var16.size() |
abstract |
|
for for(int var40 = 0; var40 < var8.size() |
abstract |
|
for for(int var58 = 0; var58 < var7.size() |
abstract |
|
for for(int var20 = ChunkUtil.chunkCoordinate(var14) |
abstract |
|
for for(int var23 = ChunkUtil.chunkCoordinate(var18) |
abstract |
|
for for(int var26 = ChunkUtil.chunkCoordinate(var16) |
static |
byte |
getCachedAverageLightValuebyte getCachedAverageLightValue(LightType var0,
@Nonnull World var1,
int var2,
int var3,
int var4,
double var5,
@Nonnull TriIntObjectDoubleToByteFunction<BlockSection> var7,
@Nonnull Object2ByteMap<LightType> var8) |
|
|
if if(var25 > var18) |
|
|
if if(var27[0] < var21) |
|
|
if if(var27[1] > var22) |
|
|
if if(var9 < 0) |
|
|
if if(var28 != null) |
|
|
if if(var34 != 0) |
static |
boolean |
spawnLightLevelMatchesboolean spawnLightLevelMatches(@Nonnull World var0, int var1, int var2, int var3, double var4, @Nonnull BeaconSpawnWrapper var6, @Nonnull Object2ByteMap<LightType> var7) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.spawning.local;
class="kw">import com.hypixel.hytale.builtin.weather.components.WeatherTracker;
class="kw">import com.hypixel.hytale.component.Archetype;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.ResourceType;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.component.spatial.SpatialResource;
class="kw">import com.hypixel.hytale.component.system.tick.TickingSystem;
class="kw">import com.hypixel.hytale.function.function.TriIntObjectDoubleToByteFunction;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.protocol.BlockMaterial;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.time.WorldTimeResource;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.BlockSection;
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.spawning.SpawningPlugin;
class="kw">import com.hypixel.hytale.server.spawning.assets.spawns.LightType;
class="kw">import com.hypixel.hytale.server.spawning.beacons.LegacySpawnBeaconEntity;
class="kw">import com.hypixel.hytale.server.spawning.util.LightRangePredicate;
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.objects.Object2ByteMap;
class="kw">import it.unimi.dsi.fastutil.objects.Object2ByteOpenHashMap;
class="kw">import java.util.List;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.joml.Vector3d;
class="kw">public class LocalSpawnControllerSystem class="kw">extends TickingSystem<EntityStore> {
class="kw">public class="kw">static class="kw">final double RUN_FREQUENCY_SECONDS = 5.0;
class="kw">private class="kw">static class="kw">final int LIGHT_LEVEL_EVALUATION_RADIUS = 4;
class="kw">private class="kw">final Archetype<EntityStore> controllerArchetype;
class="kw">private class="kw">final ComponentType<EntityStore, LocalSpawnController> spawnControllerComponentType;
class="kw">private class="kw">final ComponentType<EntityStore, TransformComponent> transformComponentype;
class="kw">private class="kw">final ComponentType<EntityStore, WeatherTracker> weatherTrackerComponentType;
class="kw">private class="kw">final ComponentType<EntityStore, LocalSpawnBeacon> localSpawnBeaconComponentType;
class="kw">private class="kw">final ComponentType<EntityStore, LegacySpawnBeaconEntity> spawnBeaconComponentType;
class="kw">private class="kw">final ResourceType<EntityStore, LocalSpawnState> localSpawnStateResourceType;
class="kw">private class="kw">final ResourceType<EntityStore, SpatialResource<Ref<EntityStore>, EntityStore>> beaconSpatialComponent;
class="kw">public LocalSpawnControllerSystem(
ComponentType<EntityStore, LocalSpawnController> var1,
ComponentType<EntityStore, TransformComponent> var2,
ComponentType<EntityStore, WeatherTracker> var3,
ComponentType<EntityStore, LocalSpawnBeacon> var4,
ComponentType<EntityStore, LegacySpawnBeaconEntity> var5,
ResourceType<EntityStore, LocalSpawnState> var6,
ResourceType<EntityStore, SpatialResource<Ref<EntityStore>, EntityStore>> var7
) {
this.spawnControllerComponentType = var1;
this.transformComponentype = var2;
this.weatherTrackerComponentType = var3;
this.localSpawnBeaconComponentType = var4;
this.spawnBeaconComponentType = var5;
this.localSpawnStateResourceType = var6;
this.beaconSpatialComponent = var7;
this.controllerArchetype = Archetype.of(var1, PlayerRef.getComponentType(), var2, var3);
}
@Override
class="kw">public void tick(float var1, int var2, @Nonnull Store<EntityStore> var3) {
LocalSpawnState var4 = var3.getResource(this.localSpawnStateResourceType);
List var5 = var4.getLocalControllerList();
var3.forEachChunk(this.controllerArchetype, (var3x, var4x) -> {
for (int var5 = 0; var5 < var3x.size(); var5++) {
LocalSpawnController var6 = var3x.getComponent(var5, this.spawnControllerComponentType);
assert var6 != null;
if (var6.tickTimeToNextRunSeconds(var1)) {
var5.add(var3x.getReferenceTo(var5));
}
}
});
if (!var5.isEmpty()) {
World var6 = var3.getExternalData().getWorld();
List var7 = var4.getLocalPendingSpawns();
List var8 = SpatialResource.getThreadLocalReferenceList();
for (int var9 = 0; var9 < var5.size(); var9++) {
Ref var10 = var5.get(var9);
LocalSpawnController var11 = var3.getComponent(var10, this.spawnControllerComponentType);
assert var11 != null;
PlayerRef var12 = var3.getComponent(var10, PlayerRef.getComponentType());
assert var12 != null;
SpawningPlugin.get().getLogger().at(Level.FINE).log("Running local spawn controller for player %s", var12.getUsername());
TransformComponent var13 = var3.getComponent(var10, this.transformComponentype);
assert var13 != null;
WeatherTracker var14 = var3.getComponent(var10, this.weatherTrackerComponentType);
assert var14 != null;
var14.updateEnvironment(var13, var3);
int var15 = var14.getEnvironmentId();
List var16 = SpawningPlugin.get().getBeaconSpawnsForEnvironment(var15);
if (var16 != null && !var16.isEmpty()) {
BeaconSpawnWrapper var17 = var16.getFirst();
double var18 = var17.getBeaconRadius();
int[] var20 = var17.getSpawn().getYRange();
int var21 = var20[0];
int var22 = var20[1];
for (int var23 = 1; var23 < var16.size(); var23++) {
BeaconSpawnWrapper var24 = var16.get(var23);
double var25 = var24.getBeaconRadius();
if (var25 > var18) {
var18 = var25;
}
int[] var27 = var24.getSpawn().getYRange();
if (var27[0] < var21) {
var21 = var27[0];
}
if (var27[1] > var22) {
var22 = var27[1];
}
}
var18 *= 2.0;
Vector3d var55 = var13.getPosition();
double var56 = var18 * var18;
int var26 = Math.abs(var21) + Math.abs(var22);
int var57 = MathUtil.floor(var55.y());
int var28 = Math.max(0, var57 - var26);
int var29 = Math.min(319, var57 + var26);
SpatialResource var30 = var3.getResource(this.beaconSpatialComponent);
var30.getSpatialStructure().ordered(var55, var18, var8);
WorldTimeResource var31 = var3.getResource(WorldTimeResource.getResourceType());
double var32 = var31.getSunlightFactor();
int var34 = MathUtil.floor(var55.x());
int var35 = MathUtil.floor(var55.y());
int var36 = MathUtil.floor(var55.z());
Object2ByteOpenHashMap var37 = new Object2ByteOpenHashMap();
var37.defaultReturnValue((byte)-1);
label134:
for (int var38 = 0; var38 < var16.size(); var38++) {
BeaconSpawnWrapper var39 = var16.get(var38);
if (var39.spawnParametersMatch(var3)) {
for (int var40 = 0; var40 < var8.size(); var40++) {
Ref var41 = var8.get(var40);
LegacySpawnBeaconEntity var42 = var3.getComponent(var41, this.spawnBeaconComponentType);
assert var42 != null;
TransformComponent var43 = var3.getComponent(var41, this.transformComponentype);
assert var43 != null;
double var44 = var43.getPosition().y();
if (!(var44 > var29) && !(var44 < var28)) {
int var46 = var42.getSpawnWrapper().getSpawnIndex();
if (var46 == var39.getSpawnIndex()) {
class="kw">continue label134;
}
}
}
for (int var58 = 0; var58 < var7.size(); var58++) {
LegacySpawnBeaconEntity var60 = var7.get(var58);
Ref var62 = var60.getReference();
TransformComponent var63 = var3.getComponent(var62, TransformComponent.getComponentType());
assert var63 != null;
Vector3d var64 = var63.getPosition();
double var45 = var64.y();
if (!(var45 > var29) && !(var45 < var28)) {
double var47 = var55.x - var64.x;
double var49 = var55.z - var64.z;
double var51 = var47 * var47 + var49 * var49;
if (!(var51 > var56)) {
int var53 = var60.getSpawnWrapper().getSpawnIndex();
if (var53 == var39.getSpawnIndex()) {
class="kw">continue label134;
}
}
}
}
if (spawnLightLevelMatches(var6, var34, var35, var36, var32, var39, var37)) {
Pair var59 = LegacySpawnBeaconEntity.create(var39, var13.getPosition(), var13.getRotation(), var3);
Ref var61 = (Ref<EntityStore>)var59.first();
if (var61 != null && var61.isValid()) {
var3.ensureComponent(var61, this.localSpawnBeaconComponentType);
SpawningPlugin.get()
.getLogger()
.at(Level.FINE)
.log("Placed spawn beacon of type %s at position %s for player %s", var39.getSpawn().getId(), var55, var12.getUsername());
var7.add((LegacySpawnBeaconEntity)var59.second());
}
}
}
}
var8.clear();
var37.clear();
var11.setTimeToNextRunSeconds(5.0);
} else {
var11.setTimeToNextRunSeconds(5.0);
}
}
var5.clear();
var7.clear();
}
}
class="kw">private class="kw">static boolean spawnLightLevelMatches(
@Nonnull World var0, int var1, int var2, int var3, double var4, @Nonnull BeaconSpawnWrapper var6, @Nonnull Object2ByteMap<LightType> var7
) {
LightRangePredicate var8 = var6.getLightRangePredicate();
if (var8.isTestLightValue()) {
byte var9 = getCachedAverageLightValue(
LightType.Light,
var0,
var1,
var2,
var3,
var4,
(var0x, var1x, var2x, var3x, var4x) -> LightRangePredicate.calculateLightValue(var3x, var0x, var1x, var2x, var4x),
var7
);
if (!var8.testLight(var9)) {
class="kw">return false;
}
}
if (var8.isTestSkyLightValue()) {
byte var10 = getCachedAverageLightValue(
LightType.SkyLight,
var0,
var1,
var2,
var3,
var4,
(var0x, var1x, var2x, var3x, var4x) -> var3x.getGlobalLight().getSkyLight(var0x, var1x, var2x),
var7
);
if (!var8.testSkyLight(var10)) {
class="kw">return false;
}
}
if (var8.isTestSunlightValue()) {
byte var11 = getCachedAverageLightValue(
LightType.Sunlight,
var0,
var1,
var2,
var3,
var4,
(var0x, var1x, var2x, var3x, var4x) -> (byte)(var3x.getGlobalLight().getSkyLight(var0x, var1x, var2x) * var4x),
var7
);
if (!var8.testSunlight(var11)) {
class="kw">return false;
}
}
if (var8.isTestRedLightValue()) {
byte var12 = getCachedAverageLightValue(
LightType.RedLight,
var0,
var1,
var2,
var3,
var4,
(var0x, var1x, var2x, var3x, var4x) -> var3x.getGlobalLight().getRedBlockLight(var0x, var1x, var2x),
var7
);
if (!var8.testRedLight(var12)) {
class="kw">return false;
}
}
if (var8.isTestGreenLightValue()) {
byte var13 = getCachedAverageLightValue(
LightType.GreenLight,
var0,
var1,
var2,
var3,
var4,
(var0x, var1x, var2x, var3x, var4x) -> var3x.getGlobalLight().getGreenBlockLight(var0x, var1x, var2x),
var7
);
if (!var8.testGreenLight(var13)) {
class="kw">return false;
}
}
if (var8.isTestBlueLightValue()) {
byte var14 = getCachedAverageLightValue(
LightType.BlueLight,
var0,
var1,
var2,
var3,
var4,
(var0x, var1x, var2x, var3x, var4x) -> var3x.getGlobalLight().getBlueBlockLight(var0x, var1x, var2x),
var7
);
class="kw">return var8.testBlueLight(var14);
} else {
class="kw">return true;
}
}
class="kw">private class="kw">static byte getCachedAverageLightValue(
LightType var0,
@Nonnull World var1,
int var2,
int var3,
int var4,
double var5,
@Nonnull TriIntObjectDoubleToByteFunction<BlockSection> var7,
@Nonnull Object2ByteMap<LightType> var8
) {
byte var9 = var8.getByte(var0);
if (var9 < 0) {
int var10 = 0;
int var11 = 0;
ChunkStore var12 = var1.getChunkStore();
Store var13 = var12.getStore();
int var14 = var2 - 4;
int var15 = var2 + 4 - 1;
int var16 = var3;
int var17 = var3 + 4 - 1;
int var18 = var4 - 4;
int var19 = var4 + 4 - 1;
for (int var20 = ChunkUtil.chunkCoordinate(var14); var20 <= ChunkUtil.chunkCoordinate(var15); var20++) {
int var21 = Math.max(var14, ChunkUtil.minBlock(var20));
int var22 = Math.min(var15, ChunkUtil.maxBlock(var20));
for (int var23 = ChunkUtil.chunkCoordinate(var18); var23 <= ChunkUtil.chunkCoordinate(var19); var23++) {
int var24 = Math.max(var18, ChunkUtil.minBlock(var23));
int var25 = Math.min(var19, ChunkUtil.maxBlock(var23));
for (int var26 = ChunkUtil.chunkCoordinate(var16); var26 <= ChunkUtil.chunkCoordinate(var17); var26++) {
Ref var27 = var12.getChunkSectionReference(var20, var26, var23);
if (var27 != null && var27.isValid()) {
BlockSection var28 = var13.getComponent(var27, BlockSection.getComponentType());
if (var28 != null) {
int var29 = Math.max(var16, ChunkUtil.minBlock(var26));
int var30 = Math.min(var17, ChunkUtil.maxBlock(var26));
for (int var31 = var21; var31 <= var22; var31++) {
for (int var32 = var24; var32 <= var25; var32++) {
for (int var33 = var29; var33 <= var30; var33++) {
int var34 = var28.get(var31, var33, var32);
if (var34 != 0) {
BlockType var35 = BlockType.getAssetMap().getAsset(var34);
if (var35 == null || var35.getMaterial() == BlockMaterial.Solid) {
class="kw">continue;
}
}
var10++;
var11 += var7.apply(var31, var33, var32, var28, var5);
}
}
}
}
}
}
}
}
var9 = var10 > 0 ? (byte)((float)var11 / var10) : 0;
var8.put(var0, var9);
}
class="kw">return var9;
}
}