SchemaGenerator class
Пакет: com.hypixel.hytale.server.npc.asset.builder
Файл: com/hypixel/hytale/server/npc/asset/builder/BuilderModifier.java
implements: SchemaConvertable<Void>, NamedSchema
Поля (9)
| Модификаторы | Тип | Имя |
|---|---|---|
|
public static final BuilderModifier.SchemaGenerator |
INSTANCE |
|
ObjectSchema |
var2 |
|
LinkedHashMap |
var3 |
|
Schema |
var4 |
|
Schema |
var5 |
|
Schema |
var6 |
|
ObjectSchema |
var7 |
|
Schema |
var8 |
|
ObjectSchema |
var9 |
Методы (2)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
public String |
getSchemaNamepublic String getSchemaName() |
|
public Schema |
toSchemapublic Schema toSchema(@Nonnull SchemaContext var1) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.npc.asset.builder;
class="kw">import com.google.gson.JsonArray;
class="kw">import com.google.gson.JsonElement;
class="kw">import com.google.gson.JsonObject;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.ExtraInfo;
class="kw">import com.hypixel.hytale.codec.schema.NamedSchema;
class="kw">import com.hypixel.hytale.codec.schema.SchemaContext;
class="kw">import com.hypixel.hytale.codec.schema.SchemaConvertable;
class="kw">import com.hypixel.hytale.codec.schema.config.ArraySchema;
class="kw">import com.hypixel.hytale.codec.schema.config.ObjectSchema;
class="kw">import com.hypixel.hytale.codec.schema.config.Schema;
class="kw">import com.hypixel.hytale.codec.schema.config.StringSchema;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.logger.sentry.SkipSentryException;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.RootInteraction;
class="kw">import com.hypixel.hytale.server.core.util.BsonUtil;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.expression.BuilderExpression;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.holder.StringHolder;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.validators.StateStringValidator;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.validators.StringNotEmptyValidator;
class="kw">import com.hypixel.hytale.server.npc.config.balancing.BalanceAsset;
class="kw">import com.hypixel.hytale.server.npc.util.expression.ExecutionContext;
class="kw">import com.hypixel.hytale.server.npc.util.expression.ForwardedModifier;
class="kw">import com.hypixel.hytale.server.npc.util.expression.Scope;
class="kw">import com.hypixel.hytale.server.npc.util.expression.StdScope;
class="kw">import com.hypixel.hytale.server.npc.util.expression.ValueType;
class="kw">import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
class="kw">import it.unimi.dsi.fastutil.objects.Object2ObjectMaps;
class="kw">import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectIterator;
class="kw">import it.unimi.dsi.fastutil.objects.Object2ObjectMap.Entry;
class="kw">import java.util.LinkedHashMap;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.function.Consumer;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">public class BuilderModifier class="kw">implements ForwardedModifier {
class="kw">public class="kw">static class="kw">final String KEY_MODIFY = "Modify";
class="kw">public class="kw">static class="kw">final String KEY_EXPORT_STATES = "_ExportStates";
class="kw">public class="kw">static class="kw">final String KEY_INTERFACE_PARAMETERS = "_InterfaceParameters";
class="kw">public class="kw">static class="kw">final String KEY_COMBAT_CONFIG = "_CombatConfig";
class="kw">public class="kw">static class="kw">final String KEY_INTERACTION_VARS = "_InteractionVars";
class="kw">public class="kw">static class="kw">final String KEY_FORWARDED_MODIFIERS = "_ForwardedModifiers";
@Nonnull
class="kw">public class="kw">static class="kw">final BuilderModifier CLEARED = new BuilderModifier(new Object2ObjectOpenHashMap(), new StatePair[0], null, null, null, null);
class="kw">private class="kw">final Object2ObjectMap<String, BuilderModifier.ExpressionHolder> builderExpressionMap;
class="kw">private class="kw">final StatePair[] exportedStateIndexes;
class="kw">private class="kw">final StateMappingHelper stateHelper;
class="kw">private class="kw">final String combatConfig;
class="kw">private class="kw">final Map<String, String> interactionVars;
@Nullable
class="kw">private class="kw">final Map<String, BuilderModifier> forwardedModifiers;
class="kw">protected BuilderModifier(
Object2ObjectMap<String, BuilderModifier.ExpressionHolder> var1,
StatePair[] var2,
StateMappingHelper var3,
String var4,
Map<String, String> var5,
@Nullable Map<String, BuilderModifier> var6
) {
this.builderExpressionMap = var1;
this.exportedStateIndexes = var2;
this.stateHelper = var3;
this.combatConfig = var4;
this.interactionVars = var5;
this.forwardedModifiers = var6;
}
class="kw">public String getCombatConfig() {
class="kw">return this.combatConfig;
}
class="kw">public Map<String, String> getInteractionVars() {
class="kw">return this.interactionVars;
}
@Nullable
class="kw">public Map<String, BuilderModifier> getForwardedModifiers() {
class="kw">return this.forwardedModifiers;
}
class="kw">public boolean isEmpty() {
class="kw">return this.builderExpressionMap.isEmpty();
}
class="kw">public int exportedStateCount() {
class="kw">return this.exportedStateIndexes.length;
}
class="kw">public void applyComponentStateMap(@Nonnull BuilderSupport var1) {
var1.setModifiedStateMap(this.stateHelper, this.exportedStateIndexes);
}
class="kw">public void popComponentStateMap(@Nonnull BuilderSupport var1) {
var1.popModifiedStateMap();
}
@Nonnull
class="kw">public Scope createScope(@Nonnull BuilderSupport var1, @Nonnull BuilderParameters var2, Scope var3) {
ExecutionContext var4 = var1.getExecutionContext();
class="kw">return this.createScope(var4, var2, var3);
}
@Nonnull
class="kw">public Scope createScope(ExecutionContext var1, @Nonnull BuilderParameters var2, @Nullable Scope var3) {
StdScope var4 = var2.createScope();
if (var3 != null) {
StdScope var5 = new StdScope(var3);
var5.merge(var4);
var4 = var5;
}
this.applyTo(var4, var2, var1);
class="kw">return var4;
}
class="kw">public void applyTo(@Nonnull StdScope var1, @Nonnull BuilderParameters var2, ExecutionContext var3) {
ObjectIterator var4 = Object2ObjectMaps.fastIterator(this.builderExpressionMap);
while (var4.hasNext()) {
Entry var5 = (Entry<String, BuilderModifier.ExpressionHolder>)var4.next();
String var6 = (String)var5.getKey();
BuilderModifier.ExpressionHolder var7 = (BuilderModifier.ExpressionHolder)var5.getValue();
ValueType var8 = var2.getParameterType(var6);
BuilderExpression var9 = var7.getExpression(var2.getInterfaceCode());
if (var9 != null) {
if (var8 == ValueType.VOID) {
throw new SkipSentryException(new IllegalStateException("Parameter " + var6 + " does not exist or is class="kw">private"));
}
if (!ValueType.isAssignableType(var9.getType(), var8)) {
throw new SkipSentryException(new IllegalStateException("Parameter " + var6 + " has type " + var9.getType() + " but should be " + var8));
}
var9.updateScope(var1, var6, var3);
}
}
}
class="kw">public class="kw">static boolean validateForwardedModifiers(
@Nonnull BuilderModifier var0,
@Nonnull BuilderParameters var1,
@Nonnull BuilderManager var2,
@Nonnull ExecutionContext var3,
String var4,
@Nonnull List<String> var5
) {
Map var6 = var0.getForwardedModifiers();
if (var6 == null) {
class="kw">return true;
}
boolean var7 = true;
for (java.util.Map.Entry var9 : var6.entrySet()) {
String var10 = var9.getKey();
BuilderModifier var11 = var9.getValue();
if (var11 != CLEARED) {
if (!var1.getForwardingSlots().contains(var10)) {
var5.add(String.format("%s: '%s' is not a forwardable component slot", var4, var10));
var7 = false;
} else {
String var12;
try {
var12 = var3.getScope().getStringSupplier(var10).get();
} catch (RuntimeException var25) {
var5.add(String.format("%s: could not resolve a component for forwarded slot '%s': %s", var4, var10, var25.getMessage()));
var7 = false;
class="kw">continue;
}
if (var12 != null && !var12.isEmpty() && !var12.equals("$Null")) {
int var13 = var2.getIndex(var12);
BuilderInfo var14 = var13 >= 0 ? var2.tryGetBuilderInfo(var13) : null;
if (var14 == null) {
var5.add(String.format("%s: forwarded slot '%s' resolves to unknown component '%s'", var4, var10, var12));
var7 = false;
} else {
BuilderParameters var15 = var14.getBuilder().getBuilderParameters();
StdScope var16 = var15.createScope();
Scope var17 = var3.setScope(var16);
try {
var11.applyTo(var16, var15, var3);
var7 &= validateForwardedModifiers(var11, var15, var2, var3, var4, var5);
} catch (RuntimeException var23) {
var5.add(String.format("%s: forwarded modifier for slot '%s' (%s): %s", var4, var10, var12, var23.getMessage()));
var7 = false;
} class="kw">finally {
var3.setScope(var17);
}
}
}
}
}
}
class="kw">return var7;
}
@Nonnull
class="kw">public class="kw">static BuilderModifier fromJSON(@Nonnull JsonObject var0, @Nonnull BuilderParameters var1, @Nonnull StateMappingHelper var2, @Nonnull ExtraInfo var3) {
JsonObject var4 = null;
JsonElement var5 = var0.get("Modify");
if (var5 != null) {
var4 = BuilderBase.expectObject(var5, "Modify");
}
class="kw">return var4 != null && !var4.entrySet().isEmpty() ? fromModifyContents(var4, var1, var2, var3, true) : EmptyBuilderModifier.INSTANCE;
}
@Nonnull
class="kw">private class="kw">static BuilderModifier fromModifyContents(
@Nonnull JsonObject var0, @Nonnull BuilderParameters var1, @Nonnull StateMappingHelper var2, @Nonnull ExtraInfo var3, boolean var4
) {
Object2ObjectMap var5 = new Object2ObjectOpenHashMap();
List var6 = new ObjectArrayList();
for (java.util.Map.Entry var8 : var0.entrySet()) {
String var9 = var8.getKey();
if (var5.containsKey(var9)) {
throw new SkipSentryException(new IllegalStateException("Duplicate entry '" + var9 + "' in 'Modify' block"));
}
if (!var9.equals("_InterfaceParameters") && !var9.equals("_CombatConfig") && !var9.equals("_InteractionVars") && !var9.equals("_ForwardedModifiers")) {
if (var9.equals("_ExportStates")) {
if (!var4) {
throw new SkipSentryException(
new IllegalStateException(String.format("%s is not allowed inside a %s block", "_ExportStates", "_ForwardedModifiers"))
);
}
if (!var8.getValue().isJsonArray()) {
throw new SkipSentryException(new IllegalStateException(String.format("%s in modifier block must be a Json Array", "_ExportStates")));
}
StateStringValidator var21 = StateStringValidator.requireMainState();
JsonArray var11 = var8.getValue().getAsJsonArray();
for (int var12 = 0; var12 < var11.size(); var12++) {
String var13 = var11.get(var12).getAsString();
if (!var21.test(var13)) {
throw new SkipSentryException(new IllegalStateException(var21.errorMessage(var13)));
}
String var14 = var21.hasSubState() ? var21.getSubState() : var2.getDefaultSubState();
var2.getAndPutSetterIndex(var21.getMainState(), var14, (var2x, var3x) -> var6.add(new StatePair(var21.getMainState(), var2x, var3x)));
}
} else {
BuilderExpression var10 = BuilderExpression.fromJSON(var8.getValue(), var1, false);
var5.put(var9, new BuilderModifier.ExpressionHolder(var10));
}
}
}
JsonElement var16 = var0.get("_InterfaceParameters");
if (var16 != null) {
JsonObject var17 = BuilderBase.expectObject(var16, "_InterfaceParameters");
for (java.util.Map.Entry var22 : var17.entrySet()) {
String var24 = var22.getKey();
JsonObject var26 = BuilderBase.expectObject(var22.getValue());
for (java.util.Map.Entry var30 : var26.entrySet()) {
BuilderModifier.ExpressionHolder var15 = (BuilderModifier.ExpressionHolder)var5.computeIfAbsent(
var30.getKey(), var0x -> new BuilderModifier.ExpressionHolder()
);
if (var15.hasInterfaceMappedExpression(var24)) {
throw new SkipSentryException(new IllegalStateException("Duplicate entry '" + var30.getKey() + "' in 'Modify' block for class="kw">interface '" + var24));
}
var15.addInterfaceMappedExpression(var24, BuilderExpression.fromJSON(var30.getValue(), var1, false));
}
}
}
String var18 = null;
JsonElement var20 = var0.get("_CombatConfig");
if (var20 != null) {
var18 = BalanceAsset.CHILD_ASSET_CODEC.decode(BsonUtil.translateJsonToBson(var20), var3);
var3.getValidationResults()._processValidationResults();
var3.getValidationResults().logOrThrowValidatorExceptions(HytaleLogger.getLogger());
}
Map var23 = null;
JsonElement var25 = var0.get("_InteractionVars");
if (var25 != null) {
var23 = RootInteraction.CHILD_ASSET_CODEC_MAP.decode(BsonUtil.translateJsonToBson(var25), var3);
var3.getValidationResults()._processValidationResults();
var3.getValidationResults().logOrThrowValidatorExceptions(HytaleLogger.getLogger());
}
Map var27 = null;
JsonElement var29 = var0.get("_ForwardedModifiers");
if (var29 != null) {
var27 = parseForwardedModifiers(var29, var1, var2, var3);
}
class="kw">return new BuilderModifier(var5, var6.toArray(StatePair[]::new), var2, var18, var23, var27);
}
@Nonnull
class="kw">private class="kw">static Map<String, BuilderModifier> parseForwardedModifiers(
@Nonnull JsonElement var0, @Nonnull BuilderParameters var1, @Nonnull StateMappingHelper var2, @Nonnull ExtraInfo var3
) {
JsonObject var4 = BuilderBase.expectObject(var0, "_ForwardedModifiers");
Map var5 = new Object2ObjectOpenHashMap();
for (java.util.Map.Entry var7 : var4.entrySet()) {
String var8 = var7.getKey();
JsonElement var9 = var7.getValue();
if (var9.isJsonPrimitive() && var9.getAsJsonPrimitive().isString() && var9.getAsString().equals("$Null")) {
var5.put(var8, CLEARED);
} else {
JsonObject var10 = BuilderBase.expectObject(var9, var8);
var5.put(var8, fromModifyContents(var10, var1, var2, var3, false));
}
}
class="kw">return var5;
}
class="kw">public class="kw">static void readModifierObject(
@Nonnull JsonObject var0,
@Nonnull BuilderParameters var1,
@Nonnull StringHolder var2,
@Nonnull Consumer<StringHolder> var3,
@Nonnull Consumer<BuilderModifier> var4,
@Nonnull StateMappingHelper var5,
@Nonnull ExtraInfo var6
) {
var2.readJSON(BuilderBase.expectKey(var0, "Reference"), StringNotEmptyValidator.get(), "Reference", var1);
BuilderModifier var7 = fromJSON(var0, var1, var5, var6);
var3.accept(var2);
var4.accept(var7);
}
@Nonnull
class="kw">public class="kw">static Schema toSchema(@Nonnull SchemaContext var0) {
class="kw">return var0.refDefinition(BuilderModifier.SchemaGenerator.INSTANCE);
}
class="kw">private class="kw">static class ExpressionHolder {
class="kw">private class="kw">final BuilderExpression expression;
class="kw">private Object2ObjectMap<String, BuilderExpression> interfaceMappedExpressions;
class="kw">public ExpressionHolder() {
this(null);
}
class="kw">public ExpressionHolder(BuilderExpression var1) {
this.expression = var1;
}
class="kw">public boolean hasInterfaceMappedExpression(String var1) {
class="kw">return this.interfaceMappedExpressions != null && this.interfaceMappedExpressions.containsKey(var1);
}
class="kw">public void addInterfaceMappedExpression(String var1, BuilderExpression var2) {
if (this.interfaceMappedExpressions == null) {
this.interfaceMappedExpressions = new Object2ObjectOpenHashMap();
}
this.interfaceMappedExpressions.put(var1, var2);
}
class="kw">public BuilderExpression getExpression(@Nullable String var1) {
class="kw">return var1 != null && this.interfaceMappedExpressions != null && this.interfaceMappedExpressions.containsKey(var1)
? (BuilderExpression)this.interfaceMappedExpressions.get(var1)
: this.expression;
}
}
class="kw">private class="kw">static class SchemaGenerator class="kw">implements SchemaConvertable<Void>, NamedSchema {
@Nonnull
class="kw">public class="kw">static class="kw">final BuilderModifier.SchemaGenerator INSTANCE = new BuilderModifier.SchemaGenerator();
class="kw">private SchemaGenerator() {
}
@Nonnull
@Override
class="kw">public String getSchemaName() {
class="kw">return "NPC:Type:BuilderModifier";
}
@Nonnull
@Override
class="kw">public Schema toSchema(@Nonnull SchemaContext var1) {
ObjectSchema var2 = new ObjectSchema();
var2.setTitle("BuilderModifier");
LinkedHashMap var3 = new LinkedHashMap<>();
var2.setProperties(var3);
var3.put("_ExportStates", new ArraySchema(new StringSchema()));
var3.put("_InterfaceParameters", new ObjectSchema());
Schema var4 = var1.refDefinition(Codec.STRING);
var4.setTitle("Reference to " + BalanceAsset.class.getSimpleName());
Schema var5 = var1.refDefinition(BalanceAsset.CHILD_ASSET_CODEC);
Schema var6 = Schema.anyOf(var4, var5);
var3.put("_CombatConfig", var6);
ObjectSchema var7 = new ObjectSchema();
var7.setTitle("Map");
Schema var8 = var1.refDefinition(RootInteraction.CHILD_ASSET_CODEC);
var7.setAdditionalProperties(var8);
var3.put("_InteractionVars", var7);
ObjectSchema var9 = new ObjectSchema();
var9.setTitle("ForwardedModifiers");
var9.setAdditionalProperties(Schema.anyOf(var1.refDefinition(INSTANCE), StringSchema.constant("$Null")));
var3.put("_ForwardedModifiers", var9);
var2.setAdditionalProperties(BuilderExpression.toSchema(var1));
class="kw">return var2;
}
}
}