Skip to content

Commit

Permalink
Add modifier redirects
Browse files Browse the repository at this point in the history
  • Loading branch information
KnightMiner committed May 1, 2022
1 parent 54666c9 commit c1e437a
Show file tree
Hide file tree
Showing 17 changed files with 219 additions and 55 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"redirects": [
{
"id": "tconstruct:strength"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"redirects": [
{
"id": "tconstruct:harmonious"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"redirects": [
{
"id": "tconstruct:draconic"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"redirects": [
{
"id": "tconstruct:sharpness"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"redirects": [
{
"id": "tconstruct:recapitated"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"redirects": [
{
"id": "tconstruct:maintained"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"redirects": [
{
"id": "tconstruct:writable"
}
]
}
10 changes: 0 additions & 10 deletions src/main/java/slimeknights/tconstruct/TConstruct.java
Original file line number Diff line number Diff line change
Expand Up @@ -202,16 +202,6 @@ void missingFluid(final MissingMappings<Fluid> event) {
});
}

// TODO: update
// @SubscribeEvent
// void missingModifier(final MissingMappings<Modifier> event) {
// RegistrationHelper.handleMissingMappings(event, MOD_ID, name -> switch(name) {
// case "maintained_2" -> TinkerModifiers.maintained.get();
// case "fractured" -> TinkerModifiers.sharpness.get();
// default -> null;
// });
// }


/* Utils */

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import net.minecraftforge.common.crafting.conditions.TagEmptyCondition;
import slimeknights.mantle.data.GenericDataProvider;
import slimeknights.tconstruct.common.json.ConfigEnabledCondition;
import slimeknights.tconstruct.library.json.JsonRedirect;
import slimeknights.tconstruct.library.materials.definition.IMaterial;
import slimeknights.tconstruct.library.materials.definition.Material;
import slimeknights.tconstruct.library.materials.definition.MaterialId;
Expand Down Expand Up @@ -90,17 +91,17 @@ public Set<MaterialId> getAllMaterials() {
/* Base methods */

/** Adds a material to be generated with a condition and redirect data */
protected void addMaterial(IMaterial material, @Nullable ICondition condition, MaterialJson.Redirect... redirect) {
protected void addMaterial(IMaterial material, @Nullable ICondition condition, JsonRedirect... redirect) {
allMaterials.put(material.getIdentifier(), new DataMaterial(material, condition, redirect));
}

/** Adds JSON to redirect an ID to another ID */
protected void addRedirect(MaterialId id, @Nullable ICondition condition, MaterialJson.Redirect... redirect) {
protected void addRedirect(MaterialId id, @Nullable ICondition condition, JsonRedirect... redirect) {
allMaterials.put(id, new DataMaterial(null, condition, redirect));
}

/** Adds JSON to redirect an ID to another ID */
protected void addRedirect(MaterialId id, MaterialJson.Redirect... redirect) {
protected void addRedirect(MaterialId id, JsonRedirect... redirect) {
addRedirect(id, null, redirect);
}

Expand All @@ -112,7 +113,7 @@ protected static ICondition tagExistsCondition(String name) {
}

/** Creates a normal material with a condition and a redirect */
protected void addMaterial(MaterialId location, int tier, int order, boolean craftable, boolean hidden, @Nullable ICondition condition, MaterialJson.Redirect... redirect) {
protected void addMaterial(MaterialId location, int tier, int order, boolean craftable, boolean hidden, @Nullable ICondition condition, JsonRedirect... redirect) {
addMaterial(new Material(location, tier, order, craftable, hidden), condition, redirect);
}

Expand All @@ -136,12 +137,12 @@ protected void addCompatMetalMaterial(MaterialId location, int tier, int order)
/* Redirect helpers */

/** Makes a conditional redirect to the given ID */
protected MaterialJson.Redirect conditionalRedirect(MaterialId id, @Nullable ICondition condition) {
return new MaterialJson.Redirect(id, condition);
protected JsonRedirect conditionalRedirect(MaterialId id, @Nullable ICondition condition) {
return new JsonRedirect(id, condition);
}

/** Makes an unconditional redirect to the given ID */
protected MaterialJson.Redirect redirect(MaterialId id) {
protected JsonRedirect redirect(MaterialId id) {
return conditionalRedirect(id, null);
}

Expand All @@ -155,7 +156,7 @@ protected MaterialJson.Redirect redirect(MaterialId id) {
*/
private MaterialJson convert(DataMaterial data) {
IMaterial material = data.material;
MaterialJson.Redirect[] redirect = data.redirect;
JsonRedirect[] redirect = data.redirect;
if (redirect != null && redirect.length == 0) {
redirect = null;
}
Expand All @@ -165,5 +166,5 @@ private MaterialJson convert(DataMaterial data) {
return new MaterialJson(data.condition, material.isCraftable(), material.getTier(), material.getSortOrder(), material.isHidden(), redirect);
}

private record DataMaterial(@Nullable IMaterial material, @Nullable ICondition condition, MaterialJson.Redirect[] redirect) {}
private record DataMaterial(@Nullable IMaterial material, @Nullable ICondition condition, JsonRedirect[] redirect) {}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package slimeknights.tconstruct.library.data.tinkering;

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import net.minecraft.data.DataGenerator;
import net.minecraft.data.HashCache;
import net.minecraft.server.packs.PackType;
import net.minecraftforge.common.crafting.CraftingHelper;
import net.minecraftforge.common.crafting.conditions.ICondition;
import slimeknights.mantle.data.GenericDataProvider;
import slimeknights.tconstruct.library.json.JsonRedirect;
import slimeknights.tconstruct.library.modifiers.Modifier;
import slimeknights.tconstruct.library.modifiers.ModifierId;
import slimeknights.tconstruct.library.modifiers.ModifierManager;
Expand All @@ -31,26 +33,51 @@ public AbstractModifierProvider(DataGenerator generator) {
protected abstract void addModifiers();

/** Adds a modifier to be saved */
protected void addModifier(ModifierId id, @Nullable ICondition condition, Modifier result) {
Result previous = allModifiers.putIfAbsent(id, new Result(result, condition));
protected void addModifier(ModifierId id, @Nullable ICondition condition, @Nullable Modifier result, JsonRedirect... redirects) {
if (result == null && redirects.length == 0) {
throw new IllegalArgumentException("Must hae either a modifier or a redirect");
}
if (redirects.length == 0) {
redirects = null;
}

Result previous = allModifiers.putIfAbsent(id, new Result(result, condition, redirects));
if (previous != null) {
throw new IllegalArgumentException("Duplicate modifier " + id);
}
}

/** Adds a modifier to be saved */
protected void addModifier(ModifierId id, Modifier result) {
addModifier(id, null, result);
protected void addModifier(ModifierId id, @Nullable Modifier result, JsonRedirect... redirects) {
addModifier(id, null, result, redirects);
}

/** Adds a modifier to be saved */
protected void addModifier(DynamicModifier<?> id, @Nullable ICondition condition, Modifier result) {
addModifier(id.getId(), condition, result);
protected void addModifier(DynamicModifier<?> id, @Nullable ICondition condition, @Nullable Modifier result, JsonRedirect... redirects) {
addModifier(id.getId(), condition, result, redirects);
}

/** Adds a modifier to be saved */
protected void addModifier(DynamicModifier<?> id, Modifier result) {
addModifier(id, null, result);
protected void addModifier(DynamicModifier<?> id, @Nullable Modifier result, JsonRedirect... redirects) {
addModifier(id, null, result, redirects);
}

/** Adds a modifier redirect */
protected void addRedirect(ModifierId id, JsonRedirect... redirects) {
addModifier(id, null, null, redirects);
}


/* Redirect helpers */

/** Makes a conditional redirect to the given ID */
protected JsonRedirect conditionalRedirect(ModifierId id, @Nullable ICondition condition) {
return new JsonRedirect(id, condition);
}

/** Makes an unconditional redirect to the given ID */
protected JsonRedirect redirect(ModifierId id) {
return conditionalRedirect(id, null);
}

@Override
Expand All @@ -61,13 +88,25 @@ public void run(HashCache cache) throws IOException {

/** Converts the given object to json */
private static JsonObject convert(Result result) {
JsonObject json = ModifierManager.MODIFIER_LOADERS.serialize(result.modifier()).getAsJsonObject();
JsonObject json;
if (result.modifier != null) {
json = ModifierManager.MODIFIER_LOADERS.serialize(result.modifier).getAsJsonObject();
} else {
json = new JsonObject();
}
if (result.redirects != null) {
JsonArray array = new JsonArray();
for (JsonRedirect redirect : result.redirects) {
array.add(redirect.toJson());
}
json.add("redirects", array);
}
if (result.condition != null) {
json.add("condition", CraftingHelper.serialize(result.condition));
}
return json;
}

/** Result record, as its nicer than a pair */
private record Result(Modifier modifier, @Nullable ICondition condition) {}
private record Result(@Nullable Modifier modifier, @Nullable ICondition condition, JsonRedirect[] redirects) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package slimeknights.tconstruct.library.json;

import com.google.gson.JsonObject;
import lombok.Data;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.common.crafting.CraftingHelper;
import net.minecraftforge.common.crafting.conditions.ICondition;
import slimeknights.mantle.util.JsonHelper;

import javax.annotation.Nullable;

/** Represents a redirect in a material or modifier JSON */
@SuppressWarnings("ClassCanBeRecord") // GSON does not support records
@Data
public class JsonRedirect {
private final ResourceLocation id;
@Nullable
private final ICondition condition;

/** Serializes this to JSON */
public JsonObject toJson() {
JsonObject json = new JsonObject();
json.addProperty("id", id.toString());
if (condition != null) {
json.add("condition", CraftingHelper.serialize(condition));
}
return json;
}

/** Deserializes this to JSON */
public static JsonRedirect fromJson(JsonObject json) {
ResourceLocation id = JsonHelper.getResourceLocation(json, "id");
ICondition condition = null;
if (json.has("condition")) {
condition = CraftingHelper.getCondition(json);
}
return new JsonRedirect(id, condition);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import net.minecraftforge.common.crafting.conditions.ICondition;
import net.minecraftforge.common.crafting.conditions.ICondition.IContext;
import slimeknights.tconstruct.library.exception.TinkerJSONException;
import slimeknights.tconstruct.library.json.JsonRedirect;
import slimeknights.tconstruct.library.materials.json.MaterialJson;
import slimeknights.tconstruct.library.utils.Util;

Expand Down Expand Up @@ -181,17 +182,12 @@ public UpdateMaterialsPacket getUpdatePacket() {
private IMaterial loadMaterial(ResourceLocation materialId, JsonObject jsonObject, Map<MaterialId, MaterialId> redirects) {
try {
MaterialJson materialJson = GSON.fromJson(jsonObject, MaterialJson.class);
// condition
ICondition condition = materialJson.getCondition();
if (condition != null && !condition.test(conditionContext)) {
log.debug("Skipped loading material {} as it did not match the condition", materialId);
return null;
}

// if defined, the material will redirect to another material
MaterialJson.Redirect[] redirectsJson = materialJson.getRedirect();
// processed first so a material can both conditionally redirect and fallback to a conditional material
JsonRedirect[] redirectsJson = materialJson.getRedirect();
if (redirectsJson != null) {
for (MaterialJson.Redirect redirect : redirectsJson) {
for (JsonRedirect redirect : redirectsJson) {
ICondition redirectCondition = redirect.getCondition();
if (redirectCondition == null || redirectCondition.test(conditionContext)) {
MaterialId redirectTarget = new MaterialId(redirect.getId());
Expand All @@ -202,6 +198,13 @@ private IMaterial loadMaterial(ResourceLocation materialId, JsonObject jsonObjec
}
}

// condition
ICondition condition = materialJson.getCondition();
if (condition != null && !condition.test(conditionContext)) {
log.debug("Skipped loading material {} as it did not match the condition", materialId);
return null;
}

if (materialJson.getCraftable() == null) {
throw TinkerJSONException.materialJsonWithoutCraftingInformation(materialId);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package slimeknights.tconstruct.library.materials.json;

import lombok.Data;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.common.crafting.conditions.ICondition;
import slimeknights.tconstruct.library.json.JsonRedirect;

import javax.annotation.Nullable;

Expand All @@ -19,12 +19,5 @@ public class MaterialJson {
@Nullable
private final Boolean hidden;
@Nullable
private final Redirect[] redirect;

@Data
public static class Redirect {
private final ResourceLocation id;
@Nullable
private final ICondition condition;
}
private final JsonRedirect[] redirect;
}

0 comments on commit c1e437a

Please sign in to comment.