PrefabProp class
Пакет: com.hypixel.hytale.builtin.hytalegenerator.props
Файл: com/hypixel/hytale/builtin/hytalegenerator/props/PrefabProp.java
extends: Prop
Поля (32)
| Модификаторы | Тип | Имя |
|---|---|---|
|
public Bounds3i |
bounds |
|
|
return |
|
Bounds3i |
var1 |
|
int |
var10 |
|
Holder |
var10 |
|
EntityPlacementData |
var11 |
|
com.hypixel.hytale.builtin.hytalegenerator.props.deprecated.prefab.PrefabProp |
var12 |
|
Material |
var13 |
|
RotatedPosition |
var15 |
|
String |
var16 |
|
|
var16 |
|
List |
var17 |
|
WeightedMap |
var18 |
|
StaticDirectionality |
var19 |
|
PrefabBufferCall |
var2 |
|
List |
var2 |
|
com.hypixel.hytale.builtin.hytalegenerator.props.deprecated.prefab.PrefabProp |
var20 |
|
Bounds3i |
var21 |
|
RotationTuple |
var22 |
|
IPrefabBuffer |
var3 |
|
int |
var3 |
|
int |
var4 |
|
List |
var6 |
|
String |
var6 |
|
|
var6 |
|
|
var6 |
|
RotatedPosition |
var7 |
|
TransformComponent |
var8 |
|
|
var8 |
|
Vector3i |
var8 |
|
PrefabBuffer.ChildPrefab[] |
var9 |
|
Vector3d |
var9 |
Методы (11)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
public |
IntersectingColumnPredicatepublic IntersectingColumnPredicate() |
|
|
for for(IPrefabBuffer var8 : var4x) |
|
|
for for(PrefabBuffer.ChildPrefab var14 : var9) |
|
|
for for(int var7 = 0; var7 < var5x.length; var7++) |
abstract |
|
for for(int var5 = 0; var5 < this.childProps.size() |
|
|
if if(var8 == null) |
|
|
if if(var3 == null) |
|
|
if if(var5x != null) |
|
|
if if(var8 != null) |
|
|
if if(var8 != null) |
|
public boolean |
testpublic boolean test(int var1, int var2, int var3, T var4) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.hytalegenerator.props;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.BlockMask;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.EntityPlacementData;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.WeightedMap;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.bounds.Bounds3i;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.material.Material;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.material.MaterialCache;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.patterns.ConstantPattern;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.props.deprecated.directionality.RotatedPosition;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.props.deprecated.directionality.StaticDirectionality;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.props.deprecated.prefab.PrefabMoldingConfiguration;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.props.deprecated.prefab.PrefabPropUtil;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.rng.RngField;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.rng.SeedBox;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.scanners.DirectScanner;
class="kw">import com.hypixel.hytale.common.util.ExceptionUtil;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.util.FastRandom;
class="kw">import com.hypixel.hytale.math.vector.Vector3iUtil;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.Rotation;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.RotationTuple;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabRotation;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.PrefabBufferCall;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.impl.IPrefabBuffer;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.impl.PrefabBuffer;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import java.util.ArrayList;
class="kw">import java.util.List;
class="kw">import java.util.Objects;
class="kw">import java.util.Random;
class="kw">import java.util.function.Function;
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 PrefabProp class="kw">extends Prop {
@Nonnull
class="kw">private class="kw">final Bounds3i writeBounds;
@Nonnull
class="kw">private class="kw">final WeightedMap<List<IPrefabBuffer>> prefabPool;
@Nonnull
class="kw">private class="kw">final MaterialCache materialCache;
@Nonnull
class="kw">private class="kw">final RngField rngField;
@Nonnull
class="kw">private class="kw">final FastRandom random;
@Nonnull
class="kw">private class="kw">final List<com.hypixel.hytale.builtin.hytalegenerator.props.deprecated.prefab.PrefabProp> childProps;
@Nonnull
class="kw">private class="kw">final List<RotatedPosition> childPositions;
@Nonnull
class="kw">private class="kw">final Vector3i rPrefabPosition;
@Nonnull
class="kw">private class="kw">final PrefabProp.IntersectingColumnPredicate<PrefabBufferCall> rColumnPredicate;
@Nonnull
class="kw">private class="kw">final Vector3i rWorldPosition;
@Nonnull
class="kw">private class="kw">final Vector3d rEntityWorldPosition;
@Nonnull
class="kw">private class="kw">final RotatedPosition rRotatedWorldPosition;
@Nonnull
class="kw">private class="kw">final MaterialCache.MaterialKey rMaterialKey;
class="kw">public PrefabProp(
@Nonnull WeightedMap<List<IPrefabBuffer>> var1, @Nonnull MaterialCache var2, @Nonnull SeedBox var3, @Nullable Function<String, List<IPrefabBuffer>> var4
) {
this.materialCache = var2;
this.rngField = new RngField(var3.createSupplier().get());
this.random = new FastRandom();
this.childProps = new ArrayList<>(0);
this.childPositions = new ArrayList<>(0);
this.prefabPool = new WeightedMap<>();
this.writeBounds = new Bounds3i();
var1.forEach(
(var4x, var5) -> {
if (!var4x.isEmpty()) {
List var6 = new ArrayList<>();
for (IPrefabBuffer var8 : var4x) {
assert var8 != null;
if (var8 == null) {
class="kw">return;
}
var6.add(var8);
this.writeBounds.encompass(getWriteBounds(var8));
PrefabBuffer.ChildPrefab[] var9 = var8.getChildPrefabs();
int var10 = 0;
for (PrefabBuffer.ChildPrefab var14 : var9) {
RotatedPosition var15 = new RotatedPosition(var14.getX(), var14.getY(), var14.getZ(), var14.getRotation());
String var16 = var14.getPath().replace('.', '/');
var16 = var16.replace("*", "");
List var17 = var4.apply(var16);
WeightedMap var18 = new WeightedMap<>();
var18.add(var17, 1.0);
StaticDirectionality var19 = new StaticDirectionality(var14.getRotation(), ConstantPattern.INSTANCE_TRUE);
com.hypixel.hytale.builtin.hytalegenerator.props.deprecated.prefab.PrefabProp var20 = new com.hypixel.hytale.builtin.hytalegenerator.props.deprecated.prefab.PrefabProp(
var18,
new DirectScanner(),
var19,
var2,
new BlockMask(),
PrefabMoldingConfiguration.none(),
var4,
var3.child(String.valueOf(var10++)),
true
);
this.childProps.add(var20);
this.childPositions.add(var15);
Bounds3i var21 = var20.getWriteBounds_voxelGrid().clone();
var21.offset(var15.x, var15.y, var15.z);
RotationTuple var22 = RotationTuple.of(var15.rotation.getRotation(), Rotation.None, Rotation.None);
var21.applyRotationAroundVoxel(var22, Vector3iUtil.ZERO);
this.writeBounds.encompass(var21);
}
}
this.prefabPool.add(var6, var5);
}
}
);
this.rPrefabPosition = new Vector3i();
this.rColumnPredicate = new PrefabProp.IntersectingColumnPredicate<>();
this.rWorldPosition = new Vector3i();
this.rEntityWorldPosition = new Vector3d();
this.rRotatedWorldPosition = new RotatedPosition(0, 0, 0, PrefabRotation.ROTATION_0);
this.rMaterialKey = new MaterialCache.MaterialKey();
}
@Override
class="kw">public boolean generate(@Nonnull Prop.Context var1) {
if (this.prefabPool.size() == 0) {
class="kw">return true;
}
this.random.setSeed(this.rngField.get(var1.position.x, var1.position.y, var1.position.z));
PrefabBufferCall var2 = new PrefabBufferCall(this.random, PrefabRotation.ROTATION_0);
IPrefabBuffer var3 = this.pickPrefab(this.random);
if (var3 == null) {
class="kw">return true;
}
this.rPrefabPosition.set(var1.position);
this.rColumnPredicate.bounds.assign(var1.materialWriteSpace.getBounds());
this.rColumnPredicate.bounds.offsetOpposite(var1.position);
int var4 = Objects.hash(var1.position.x, var1.position.y, var1.position.z, var3.hashCode());
try {
var3.forEach(
this.rColumnPredicate,
(var2x, var3x, var4x, var5x, var6x, var7x, var8x, var9x, var10x, var11x, var12x) -> {
this.rWorldPosition.set(var2x + var1.position.x, var3x + var1.position.y, var4x + var1.position.z);
if (var1.materialWriteSpace.getBounds().contains(this.rWorldPosition)) {
this.rMaterialKey.getSolidKey().set(var5x, var7x, var8x, var9x, var6x != null ? var6x.clone() : null);
this.rMaterialKey.getFluidKey().set(var11x, (byte)var12x);
Material var13 = this.materialCache.getMaterial(this.rMaterialKey);
var1.materialWriteSpace.set(var13, this.rWorldPosition);
}
},
(var3x, var4x, var5x, var6x) -> {
if (var5x != null) {
for (int var7 = 0; var7 < var5x.length; var7++) {
TransformComponent var8 = var5x[var7].getComponent(TransformComponent.getComponentType());
if (var8 != null) {
Vector3d var9 = new Vector3d(var8.getPosition());
var6x.rotation.rotate(var9);
this.rEntityWorldPosition.set(var9).add(var1.position.x, var1.position.y, var1.position.z);
if (var1.entityWriteBuffer.getBounds().contains(this.rEntityWorldPosition)
&& var1.materialWriteSpace.getBounds().contains(this.rEntityWorldPosition)) {
Holder var10 = var5x[var7].clone();
var8 = var10.getComponent(TransformComponent.getComponentType());
if (var8 != null) {
var8.getPosition().set(this.rEntityWorldPosition);
EntityPlacementData var11 = new EntityPlacementData(new Vector3i(), PrefabRotation.ROTATION_0, var10, var4);
var1.entityWriteBuffer.addEntity(var11);
}
}
}
}
}
},
(var0, var1x, var2x, var3x, var4x, var5x, var6x, var7x, var8x, var9x) -> {},
var2
);
} catch (Exception var9) {
String var6 = "Couldn't place prefab prop.";
var6 = var6 + "\n";
var6 = var6 + ExceptionUtil.toStringWithStack(var9);
((HytaleLogger.Api)HytaleLogger.getLogger().atWarning()).log("%s", var6);
}
this.rRotatedWorldPosition.x = var1.position.x;
this.rRotatedWorldPosition.y = var1.position.y;
this.rRotatedWorldPosition.z = var1.position.z;
for (int var5 = 0; var5 < this.childProps.size(); var5++) {
com.hypixel.hytale.builtin.hytalegenerator.props.deprecated.prefab.PrefabProp var12 = this.childProps.get(var5);
RotatedPosition var7 = this.childPositions.get(var5).getRelativeTo(this.rRotatedWorldPosition);
Vector3i var8 = new Vector3i(var7.x, var7.y, var7.z);
this.rRotatedWorldPosition.rotation.rotate(var8);
var12.place(var7, var1.materialWriteSpace, var1.entityWriteBuffer);
}
class="kw">return true;
}
@Nullable
class="kw">private IPrefabBuffer pickPrefab(@Nonnull Random var1) {
List var2 = this.prefabPool.pick(var1);
if (var2.isEmpty()) {
class="kw">return null;
}
int var3 = var1.nextInt(var2.size());
class="kw">return var2.get(var3);
}
@Nonnull
class="kw">private class="kw">static Bounds3i getWriteBounds(@Nonnull IPrefabBuffer var0) {
Bounds3i var1 = PrefabPropUtil.getTotalBounds(var0);
var1.max.add(1, 1, 1);
class="kw">return var1;
}
@Nonnull
@Override
class="kw">public Bounds3i getReadBounds_voxelGrid() {
class="kw">return Bounds3i.ZERO;
}
@Nonnull
@Override
class="kw">public Bounds3i getWriteBounds_voxelGrid() {
class="kw">return this.writeBounds;
}
class="kw">private class="kw">static class IntersectingColumnPredicate<T> class="kw">implements IPrefabBuffer.ColumnPredicate<T> {
class="kw">public Bounds3i bounds = new Bounds3i();
class="kw">public IntersectingColumnPredicate() {
}
@Override
class="kw">public boolean test(int var1, int var2, int var3, T var4) {
class="kw">return var1 >= this.bounds.min.x && var1 < this.bounds.max.x && var2 >= this.bounds.min.z && var2 < this.bounds.max.z;
}
}
}