BlockPattern class
Пакет: com.hypixel.hytale.server.core.prefab.selection.mask
Файл: com/hypixel/hytale/server/core/prefab/selection/mask/BlockPattern.java
Поля (64)
| Модификаторы | Тип | Имя |
|---|---|---|
|
public static final Codec<BlockPattern.BlockEntry> |
CODEC |
final |
HytaleLogger |
LOGGER |
|
|
return |
|
|
var0 |
|
|
var0 |
|
|
var0 |
|
|
var0 |
|
|
var0 |
|
|
var0 |
|
|
var0 |
|
WeightedMap.Builder |
var1 |
|
List |
var1 |
|
WeightedMap.Builder |
var1 |
|
int |
var1 |
|
|
var1 |
|
|
var1 |
|
int |
var1 |
|
StringBuilder |
var1 |
|
int |
var1 |
|
|
var1 |
|
Rotation |
var10 |
|
|
var10 |
|
Rotation |
var11 |
|
|
var11 |
|
int |
var12 |
|
int |
var12 |
|
BlockPattern.BlockEntry |
var13 |
|
int |
var13 |
|
int |
var14 |
|
int |
var15 |
|
|
var15 |
|
int |
var16 |
|
|
var16 |
|
int |
var17 |
|
|
var17 |
|
int |
var18 |
|
|
var18 |
|
String |
var19 |
|
WeightedMap.Builder |
var2 |
|
RotationTuple |
var2 |
|
int |
var2 |
|
int |
var3 |
|
int |
var3 |
|
int |
var3 |
|
int |
var3 |
|
int |
var4 |
|
int |
var4 |
|
|
var5 |
|
int |
var5 |
|
int |
var5 |
|
|
var5 |
|
int |
var6 |
|
double |
var6 |
|
|
var6 |
|
int |
var6 |
|
int |
var6 |
|
String |
var7 |
|
int |
var7 |
|
BlockType |
var8 |
|
String[] |
var8 |
|
int |
var8 |
|
BlockTypeListAsset |
var9 |
|
Rotation |
var9 |
|
|
var9 |
Методы (35)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
public |
record |
BlockEntryrecord BlockEntry(String blockTypeKey, int rotation, int filler) |
abstract |
throw new |
IllegalArgumentExceptionthrow new IllegalArgumentException("Invalid Chance Value: " + var8[0], var10) |
abstract |
throw new |
IllegalArgumentExceptionthrow new IllegalArgumentException("Block with id '" + var0 + "' doesn't exist!") |
abstract |
throw new |
IllegalArgumentExceptionthrow new IllegalArgumentException("Invalid filler metadata! Missing comma") |
abstract |
throw new |
IllegalArgumentExceptionthrow new IllegalArgumentException("Invalid filler metadata! Missing second comma") |
static |
boolean |
canParseBlockboolean canParseBlock(@Nonnull String var0) |
|
public static BlockPattern.BlockEntry |
decodepublic static BlockPattern.BlockEntry decode(String var0) |
|
private String |
encodeprivate String encode() |
|
|
for for(String var5 : var0) |
public |
Integer[] |
getResolvedKeysInteger[] getResolvedKeys() |
public |
boolean |
hasInvalidBlocksboolean hasInvalidBlocks() |
|
|
if if(this.resolvedWeightedMap == null) |
|
|
if if(var6 == 0) |
|
|
if if(var12 == Integer.MIN_VALUE) |
|
|
if if(var13 != null) |
|
|
if if(var8.length > 1) |
|
|
if if(var3 != -1) |
|
|
if if(var1 == Integer.MIN_VALUE) |
|
|
if if(var3 != -1) |
|
|
if if(var1 == Integer.MIN_VALUE) |
|
|
if if(this.filler == 0 && this.rotation == 0) |
|
|
if if(this.filler != 0) |
|
|
if if(var3 == -1) |
|
|
if if(var4 == -1) |
|
|
if if(var5 == -1) |
|
|
if if(var16 == -1) |
|
|
if if(var17 == -1) |
|
|
if if(var18 == -1) |
|
|
if if(var15 == -1) |
public |
boolean |
isEmptyboolean isEmpty() |
public |
int |
nextBlockint nextBlock(Random var1) |
static |
BlockPattern |
parseBlockPattern parse(@Nonnull String var0) |
static |
int |
parseBlockint parseBlock(@Nonnull String var0) |
public |
void |
resolvevoid resolve() |
private |
String |
toString0String toString0() |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.prefab.selection.mask;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.function.FunctionCodec;
class="kw">import com.hypixel.hytale.common.map.IWeightedMap;
class="kw">import com.hypixel.hytale.common.map.WeightedMap;
class="kw">import com.hypixel.hytale.common.util.ArrayUtil;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
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.asset.type.buildertool.config.BlockTypeListAsset;
class="kw">import com.hypixel.hytale.server.core.util.FillerBlockUtil;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.util.List;
class="kw">import java.util.Locale;
class="kw">import java.util.Random;
class="kw">import java.util.logging.Level;
class="kw">import java.util.regex.Pattern;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">public class BlockPattern {
class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
class="kw">public class="kw">static class="kw">final Codec<BlockPattern> CODEC = new FunctionCodec<>(Codec.STRING, BlockPattern::parse, BlockPattern::toString);
class="kw">public class="kw">static class="kw">final BlockPattern EMPTY = new BlockPattern(parseBlockPattern("Empty"));
class="kw">public class="kw">static class="kw">final BlockPattern[] EMPTY_ARRAY = new BlockPattern[0];
class="kw">private class="kw">static class="kw">final Pattern FILLER_TEMP_REMOVER_PATTERN = Pattern.compile("(Filler=-?\\d+),(-?\\d+),(-?\\d+)");
class="kw">private class="kw">static class="kw">final String BLOCK_SEPARATOR = ",";
class="kw">private class="kw">static class="kw">final String ALT_BLOCK_SEPARATOR = ";";
class="kw">public class="kw">static class="kw">final String CHANCE_SUFFIX = "%";
class="kw">private class="kw">static class="kw">final double DEFAULT_CHANCE = 100.0;
class="kw">private class="kw">final IWeightedMap<String> weightedMap;
class="kw">private class="kw">final class="kw">transient String toString0;
class="kw">private IWeightedMap<Integer> resolvedWeightedMap;
class="kw">private IWeightedMap<BlockPattern.BlockEntry> resolvedWeightedMapBtk;
class="kw">private boolean hasInvalidBlocks;
class="kw">public BlockPattern(IWeightedMap<String> var1) {
this.weightedMap = var1;
this.toString0 = this.toString0();
}
class="kw">public Integer[] getResolvedKeys() {
this.resolve();
class="kw">return this.resolvedWeightedMap.internalKeys();
}
class="kw">public void resolve() {
if (this.resolvedWeightedMap == null) {
WeightedMap.Builder var1 = WeightedMap.builder(ArrayUtil.EMPTY_INTEGER_ARRAY);
WeightedMap.Builder var2 = WeightedMap.builder(new BlockPattern.BlockEntry[0]);
this.weightedMap.forEachEntry((var3, var4) -> {
int var6 = parseBlock(var3);
if (var6 == 0) {
String var7 = var3.contains("|") ? var3.substring(0, var3.indexOf(124)) : var3;
if (!var7.equalsIgnoreCase("Empty")) {
this.hasInvalidBlocks = true;
}
}
BlockPattern.BlockEntry var13 = tryParseBlockTypeKey(var3);
BlockType var8 = BlockType.getAssetMap().getAsset(var6);
if (var8 != null && var8.getBlockListAssetId() != null) {
BlockTypeListAsset var9 = BlockTypeListAsset.getAssetMap().getAsset(var8.getBlockListAssetId());
if (var9 != null && var9.getBlockPattern() != null) {
for (String var11 : var9.getBlockTypeKeys()) {
int var12 = BlockType.getAssetMap().getIndex(var11);
if (var12 == Integer.MIN_VALUE) {
LOGGER.at(Level.WARNING).log("BlockTypeList '%s' contains invalid block '%s' - skipping", var8.getBlockListAssetId(), var11);
} else {
var1.put(var12, var4 / var9.getBlockTypeKeys().size());
}
}
class="kw">return;
}
}
var1.put(var6, var4);
if (var13 != null) {
var2.put(var13, var4);
}
});
this.resolvedWeightedMap = var1.build();
this.resolvedWeightedMapBtk = var2.build();
}
}
class="kw">public boolean isEmpty() {
class="kw">return this.weightedMap.size() == 0;
}
class="kw">public boolean hasInvalidBlocks() {
this.resolve();
class="kw">return this.hasInvalidBlocks;
}
class="kw">public int nextBlock(Random var1) {
this.resolve();
class="kw">return this.resolvedWeightedMap.get(var1);
}
@Nullable
class="kw">public BlockPattern.BlockEntry nextBlockTypeKey(Random var1) {
this.resolve();
class="kw">return this.resolvedWeightedMapBtk.get(var1);
}
@Deprecated
class="kw">public int firstBlock() {
this.resolve();
class="kw">return this.resolvedWeightedMap.size() > 0 ? this.resolvedWeightedMap.internalKeys()[0] : 0;
}
@Override
class="kw">public String toString() {
class="kw">return this.toString0;
}
class="kw">private String toString0() {
if (this.weightedMap.size() == 1) {
class="kw">return this.weightedMap.internalKeys()[0];
}
List var1 = new ObjectArrayList();
this.weightedMap.forEachEntry((var1x, var2) -> var1.add(var2 + "%" + var1x));
class="kw">return String.join(",", var1);
}
class="kw">public class="kw">static BlockPattern parse(@Nonnull String var0) {
if (!var0.isEmpty() && !var0.equals("Empty")) {
if (var0.toLowerCase(Locale.ROOT).contains("filler=")) {
var0 = FILLER_TEMP_REMOVER_PATTERN.matcher(var0).replaceAll("$1;$2;$3");
}
var0 = var0.replace(";", ",");
class="kw">return new BlockPattern(parseBlockPattern(var0.split(",", 0)));
} else {
class="kw">return EMPTY;
}
}
@Nonnull
class="kw">private class="kw">static IWeightedMap<String> parseBlockPattern(@Nonnull String... var0) {
WeightedMap.Builder var1 = WeightedMap.builder(ArrayUtil.EMPTY_STRING_ARRAY);
for (String var5 : var0) {
if (!var5.isEmpty()) {
double var6 = 100.0;
String[] var8 = var5.split("%", 0);
if (var8.length > 1) {
try {
var6 = Double.parseDouble(var8[0]);
} catch (NumberFormatException var10) {
throw new IllegalArgumentException("Invalid Chance Value: " + var8[0], var10);
}
var5 = var8[1];
}
var1.put(var5, var6);
}
}
class="kw">return var1.build();
}
class="kw">public class="kw">static int parseBlock(@Nonnull String var0) {
int var1;
try {
var1 = Integer.parseInt(var0);
if (BlockType.getAssetMap().getAsset(var1) == null) {
throw new IllegalArgumentException("Block with id '" + var0 + "' doesn't exist!");
}
} catch (NumberFormatException var4) {
var0 = var0.replace(";", ",");
int var3 = var0.indexOf("|");
if (var3 != -1) {
var0 = var0.substring(0, var3);
}
var1 = BlockType.getAssetMap().getIndex(var0);
if (var1 == Integer.MIN_VALUE) {
LOGGER.at(Level.WARNING).log("Invalid block name '%s' - using empty block", var0);
class="kw">return 0;
}
}
class="kw">return var1;
}
class="kw">public class="kw">static boolean canParseBlock(@Nonnull String var0) {
try {
int var6 = Integer.parseInt(var0);
if (BlockType.getAssetMap().getAsset(var6) == null) {
throw new IllegalArgumentException("Block with id '" + var0 + "' doesn't exist!");
}
} catch (NumberFormatException var4) {
var0 = var0.replace(";", ",");
int var3 = var0.indexOf("|");
if (var3 != -1) {
var0 = var0.substring(0, var3);
}
int var1 = BlockType.getAssetMap().getIndex(var0);
if (var1 == Integer.MIN_VALUE) {
LOGGER.at(Level.WARNING).log("Invalid block name '%s' - using empty block", var0);
class="kw">return false;
}
}
class="kw">return true;
}
@Nullable
class="kw">public class="kw">static BlockPattern.BlockEntry tryParseBlockTypeKey(String var0) {
try {
var0 = var0.replace(";", ",");
class="kw">return BlockPattern.BlockEntry.decode(var0);
} catch (Exception var2) {
class="kw">return null;
}
}
class="kw">public record BlockEntry(String blockTypeKey, int rotation, int filler) {
@Deprecated(forRemoval = true)
class="kw">public class="kw">static class="kw">final Codec<BlockPattern.BlockEntry> CODEC = new FunctionCodec<>(
Codec.STRING, BlockPattern.BlockEntry::decode, BlockPattern.BlockEntry::encode
);
class="kw">public BlockEntry {
}
@Deprecated(forRemoval = true)
class="kw">private String encode() {
if (this.filler == 0 && this.rotation == 0) {
class="kw">return this.blockTypeKey;
}
StringBuilder var1 = new StringBuilder(this.blockTypeKey);
RotationTuple var2 = RotationTuple.get(this.rotation);
if (var2.yaw() != Rotation.None) {
var1.append("|Yaw=").append(var2.yaw().getDegrees());
}
if (var2.pitch() != Rotation.None) {
var1.append("|Pitch=").append(var2.pitch().getDegrees());
}
if (var2.roll() != Rotation.None) {
var1.append("|Roll=").append(var2.roll().getDegrees());
}
if (this.filler != 0) {
int var3 = FillerBlockUtil.unpackX(this.filler);
int var4 = FillerBlockUtil.unpackY(this.filler);
int var5 = FillerBlockUtil.unpackZ(this.filler);
var1.append("|Filler=").append(var3).append(",").append(var4).append(",").append(var5);
}
class="kw">return var1.toString();
}
@Deprecated(forRemoval = true)
class="kw">public class="kw">static BlockPattern.BlockEntry decode(String var0) {
int var1 = 0;
if (var0.contains("|Filler=")) {
int var2 = var0.indexOf("|Filler=") + "|Filler=".length();
int var3 = var0.indexOf(",", var2);
if (var3 == -1) {
throw new IllegalArgumentException("Invalid filler metadata! Missing comma");
}
int var4 = var0.indexOf(",", var3 + 1);
if (var4 == -1) {
throw new IllegalArgumentException("Invalid filler metadata! Missing second comma");
}
int var5 = var0.indexOf("|", var2);
if (var5 == -1) {
var5 = var0.length();
}
int var6 = Integer.parseInt(var0, var2, var3, 10);
int var7 = Integer.parseInt(var0, var3 + 1, var4, 10);
int var8 = Integer.parseInt(var0, var4 + 1, var5, 10);
var1 = FillerBlockUtil.pack(var6, var7, var8);
}
Rotation var9 = Rotation.None;
Rotation var10 = Rotation.None;
Rotation var11 = Rotation.None;
if (var0.contains("|Yaw=")) {
int var12 = var0.indexOf("|Yaw=") + "|Yaw=".length();
int var16 = var0.indexOf(124, var12);
if (var16 == -1) {
var16 = var0.length();
}
var9 = Rotation.ofDegrees(Integer.parseInt(var0, var12, var16, 10));
}
if (var0.contains("|Pitch=")) {
int var13 = var0.indexOf("|Pitch=") + "|Pitch=".length();
int var17 = var0.indexOf(124, var13);
if (var17 == -1) {
var17 = var0.length();
}
var10 = Rotation.ofDegrees(Integer.parseInt(var0, var13, var17, 10));
}
if (var0.contains("|Roll=")) {
int var14 = var0.indexOf("|Roll=") + "|Roll=".length();
int var18 = var0.indexOf("|", var14);
if (var18 == -1) {
var18 = var0.length();
}
var11 = Rotation.ofDegrees(Integer.parseInt(var0, var14, var18, 10));
}
int var15 = var0.indexOf("|");
if (var15 == -1) {
var15 = var0.length();
}
String var19 = var0.substring(0, var15);
class="kw">return new BlockPattern.BlockEntry(var19, RotationTuple.of(var9, var10, var11).index(), var1);
}
}
}