Skip to content

Commit

Permalink
chance based outputs, prepare for addons
Browse files Browse the repository at this point in the history
  • Loading branch information
JustAHuman-xD committed Apr 30, 2024
1 parent 2385113 commit 56f7023
Show file tree
Hide file tree
Showing 10 changed files with 101 additions and 97 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import me.justahuman.slimefun_essentials.client.ResourceLoader;
import me.justahuman.slimefun_essentials.client.SlimefunItemStack;
import me.justahuman.slimefun_essentials.client.SlimefunRecipeComponent;
import me.justahuman.slimefun_essentials.utils.Utils;
import net.minecraft.entity.EntityType;
import net.minecraft.fluid.Fluid;
Expand All @@ -13,7 +14,7 @@
import org.jetbrains.annotations.NotNull;

public interface IdInterpreter<T> {
default T interpretId(@NotNull String id, @NotNull T defaultValue) {
default T interpretId(@NotNull SlimefunRecipeComponent component, @NotNull String id, @NotNull T defaultValue) {
if (id.isEmpty() || id.isBlank()) {
return defaultValue;
}
Expand All @@ -22,28 +23,42 @@ default T interpretId(@NotNull String id, @NotNull T defaultValue) {
Utils.warn("Invalid Ingredient Id:" + id);
return defaultValue;
}

int chance = 100;
if (id.contains("%")) {
try {
chance = Integer.parseInt(id.substring(id.indexOf("%") + 1));
id = id.substring(0, id.indexOf("%"));
} catch (Exception ignored) {}
}

final String type = id.substring(0, id.indexOf(":"));
final String count = id.substring(id.indexOf(":") + 1);
int amount;
int amount = 1;
try {
amount = Integer.parseInt(count);
} catch (NumberFormatException ignored) {
amount = 1;
}
} catch (Exception ignored) {}

if (ResourceLoader.getSlimefunItems().containsKey(type)) {
return fromSlimefunItemStack(ResourceLoader.getSlimefunItems().get(type).copy(), amount, defaultValue);
return fromSlimefunItemStack(chance, ResourceLoader.getSlimefunItems().get(type).copy(), amount, defaultValue);
}

// Complex Item
if (type.startsWith("?")) {
int index = 0;
try {
index = Integer.parseInt(type.substring(1));
} catch (Exception ignored) {}
return fromItemStack(chance, component.getComplexStacks().get(index), amount, defaultValue);
}

// Entity
if (type.startsWith("@")) {
else if (type.startsWith("@")) {
final Identifier identifier = new Identifier("minecraft:" + type.substring(1));
if (! Registries.ENTITY_TYPE.containsId(identifier)) {
Utils.warn("Invalid Ingredient Entity Id: " + id);
return defaultValue;
}
return fromEntityType(Registries.ENTITY_TYPE.get(identifier), amount, defaultValue);
return fromEntityType(chance, Registries.ENTITY_TYPE.get(identifier), amount, defaultValue);
}
// Fluid
else if (type.startsWith("~")) {
Expand All @@ -52,12 +67,12 @@ else if (type.startsWith("~")) {
Utils.warn("Invalid Ingredient Fluid Id: " + id);
return defaultValue;
}
return fromFluid(Registries.FLUID.get(identifier), amount, defaultValue);
return fromFluid(chance, Registries.FLUID.get(identifier), amount, defaultValue);
}
// Tag
else if (type.startsWith("#")) {
final Identifier identifier = new Identifier("minecraft:" + type.substring(1));
return fromTag(TagKey.of(Registries.ITEM.getKey(), identifier), amount, defaultValue);
return fromTag(chance, TagKey.of(Registries.ITEM.getKey(), identifier), amount, defaultValue);
}
// Item (Or Mistake)
else {
Expand All @@ -66,15 +81,15 @@ else if (type.startsWith("#")) {
Utils.warn("Invalid Ingredient ItemStack Id: " + id);
return defaultValue;
}
return fromItemStack(Registries.ITEM.get(identifier).getDefaultStack().copy(), amount, defaultValue);
return fromItemStack(chance, Registries.ITEM.get(identifier).getDefaultStack().copy(), amount, defaultValue);
}
}

T fromTag(TagKey<Item> tagKey, int amount, T defaultValue);
T fromItemStack(ItemStack itemStack, int amount, T defaultValue);
default T fromSlimefunItemStack(SlimefunItemStack slimefunItemStack, int amount, T defaultValue) {
return fromItemStack(slimefunItemStack.itemStack(), amount, defaultValue);
T fromTag(int chance, TagKey<Item> tagKey, int amount, T defaultValue);
T fromItemStack(int chance, ItemStack itemStack, int amount, T defaultValue);
default T fromSlimefunItemStack(int chance, SlimefunItemStack slimefunItemStack, int amount, T defaultValue) {
return fromItemStack(chance, slimefunItemStack.itemStack(), amount, defaultValue);
}
T fromFluid(Fluid fluid, int amount, T defaultValue);
T fromEntityType(EntityType<?> entityType, int amount, T defaultValue);
T fromFluid(int chance, Fluid fluid, int amount, T defaultValue);
T fromEntityType(int chance, EntityType<?> entityType, int amount, T defaultValue);
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,17 @@ public static SlimefunRecipe deserialize(SlimefunRecipeCategory parent, JsonObje
final List<SlimefunRecipeComponent> inputs = new ArrayList<>();
final List<SlimefunRecipeComponent> outputs = new ArrayList<>();
final List<SlimefunLabel> labels = new ArrayList<>();
final JsonArray complex = JsonUtils.getArrayOrDefault(recipeObject, "complex", new JsonArray());

for (JsonElement inputElement : JsonUtils.getArrayOrDefault(recipeObject, "inputs", new JsonArray())) {
final SlimefunRecipeComponent inputRecipeElement = SlimefunRecipeComponent.deserialize(inputElement);
final SlimefunRecipeComponent inputRecipeElement = SlimefunRecipeComponent.deserialize(complex, inputElement);
if (inputRecipeElement != null) {
inputs.add(inputRecipeElement);
}
}

for (JsonElement outputElement : JsonUtils.getArrayOrDefault(recipeObject, "outputs", new JsonArray())) {
final SlimefunRecipeComponent outputRecipeElement = SlimefunRecipeComponent.deserialize(outputElement);
final SlimefunRecipeComponent outputRecipeElement = SlimefunRecipeComponent.deserialize(complex, outputElement);
if (outputRecipeElement != null) {
outputs.add(outputRecipeElement);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,16 @@ public class SlimefunRecipeCategory {
private static final Map<String, SlimefunRecipeCategory> emptyCategories = new HashMap<>();
private static final Map<String, String> toCopy = new HashMap<>();

private final SlimefunItemStack itemStack;
private final String id;
private final ItemStack itemStack;
private final String type;
private final Integer speed;
private final Integer energy;
private final List<SlimefunRecipe> childRecipes;
private SlimefunRecipe recipe = null;

public SlimefunRecipeCategory(SlimefunItemStack itemStack, String type, Integer speed, Integer energy, List<SlimefunRecipe> childRecipes) {
public SlimefunRecipeCategory(String id, ItemStack itemStack, String type, Integer speed, Integer energy, List<SlimefunRecipe> childRecipes) {
this.id = id;
this.itemStack = itemStack;
this.type = type;
this.speed = speed;
Expand All @@ -35,15 +37,11 @@ public SlimefunRecipeCategory(SlimefunItemStack itemStack, String type, Integer
}

public String id() {
return this.itemStack.id();
}

public SlimefunItemStack slimefunItem() {
return this.itemStack;
return this.id;
}

public ItemStack itemStack() {
return this.itemStack.itemStack();
return this.itemStack;
}

public String type() {
Expand All @@ -67,13 +65,15 @@ public List<SlimefunRecipe> childRecipes() {
}

public static void deserialize(String id, JsonObject categoryObject) {
final SlimefunItemStack itemStack = ResourceLoader.getSlimefunItem(id);
final ItemStack itemStack = ResourceLoader.getSlimefunItem(id) != null
? ResourceLoader.getSlimefunItem(id).itemStack()
: JsonUtils.deserializeItem(JsonUtils.getObjectOrDefault(categoryObject, "item", new JsonObject()));
final String type = JsonUtils.getStringOrDefault(categoryObject, "type", "process");
final Integer speed = JsonUtils.getIntegerOrDefault(categoryObject, "speed", null);
final Integer energy = JsonUtils.getIntegerOrDefault(categoryObject, "energy", null);
final List<SlimefunRecipe> recipes = new ArrayList<>();

final SlimefunRecipeCategory category = new SlimefunRecipeCategory(itemStack, type, speed, energy, recipes);
final SlimefunRecipeCategory category = new SlimefunRecipeCategory(id, itemStack, type, speed, energy, recipes);
for (JsonElement recipeElement : JsonUtils.getArrayOrDefault(categoryObject, "recipes", new JsonArray())) {
if (recipeElement instanceof JsonObject recipeObject) {
recipes.add(SlimefunRecipe.deserialize(category, recipeObject, energy));
Expand Down Expand Up @@ -143,14 +143,18 @@ public static SlimefunRecipeCategory fromId(String component) {
return null;
}

final String id = component.split(":")[0];
String id = component.split(":")[0];
if (id.contains("%")) {
id = id.substring(0, id.indexOf("%"));
}

if (recipeCategories.containsKey(id)) {
return recipeCategories.get(id);
} else if (emptyCategories.containsKey(id)) {
return emptyCategories.get(id);
} else if (ResourceLoader.getSlimefunItem(id) != null) {
final SlimefunItemStack itemStack = ResourceLoader.getSlimefunItem(id);
final SlimefunRecipeCategory category = new SlimefunRecipeCategory(itemStack, "empty", null, null, new ArrayList<>());
final SlimefunRecipeCategory category = new SlimefunRecipeCategory(id, itemStack.itemStack(), "empty", null, null, new ArrayList<>());
emptyCategories.put(id, category);
}
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,51 +2,50 @@

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import lombok.Getter;
import me.justahuman.slimefun_essentials.utils.JsonUtils;
import net.minecraft.item.ItemStack;

import java.util.ArrayList;
import java.util.List;

@Getter
public class SlimefunRecipeComponent {
private final List<ItemStack> complexStacks = new ArrayList<>();
private final String id;
private final List<String> multiId;

public SlimefunRecipeComponent(String id) {
this.id = id;
this.multiId = null;
public SlimefunRecipeComponent(JsonArray complex, String id) {
this(complex, id, null);
}

public SlimefunRecipeComponent(List<String> multiId) {
this.id = null;
this.multiId = multiId;
public SlimefunRecipeComponent(JsonArray complex, List<String> multiId) {
this(complex, null, multiId);
}

public JsonElement serialize() {
if (this.id != null) {
return new JsonPrimitive(this.id);
} else if (this.multiId != null) {
final JsonArray components = new JsonArray();
for (String id : this.multiId) {
components.add(id);
private SlimefunRecipeComponent(JsonArray complex, String id, List<String> multiId) {
this.id = id;
this.multiId = multiId;
for (JsonElement element : complex) {
if (element instanceof JsonObject object) {
this.complexStacks.add(JsonUtils.deserializeItem(object));
}
return components;
}
return null;
}

public static SlimefunRecipeComponent deserialize(JsonElement componentElement) {
public static SlimefunRecipeComponent deserialize(JsonArray complex, JsonElement componentElement) {
if (componentElement instanceof JsonPrimitive componentPrimitive && componentPrimitive.isString()) {
return new SlimefunRecipeComponent(componentPrimitive.getAsString());
return new SlimefunRecipeComponent(complex, componentPrimitive.getAsString());
} else if (componentElement instanceof JsonArray componentArray) {
final List<String> multiId = new ArrayList<>();
for (JsonElement idElement : componentArray) {
if (idElement instanceof JsonPrimitive idPrimitive && idPrimitive.isString()) {
multiId.add(idPrimitive.getAsString());
}
}
return new SlimefunRecipeComponent(multiId);
return new SlimefunRecipeComponent(complex, multiId);
}
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public void register(EmiRegistry emiRegistry) {
for (SlimefunRecipeCategory slimefunRecipeCategory : SlimefunRecipeCategory.getRecipeCategories().values()) {
final String workstationId = slimefunRecipeCategory.id();
final Identifier categoryIdentifier = Utils.newIdentifier(workstationId);
final EmiStack workStation = RECIPE_INTERPRETER.emiStackFromId(workstationId + ":1");
final EmiStack workStation = EmiStack.of(slimefunRecipeCategory.itemStack());
final SlimefunEmiCategory slimefunEmiCategory;
if (slimefunCategories.containsKey(workstationId)) {
slimefunEmiCategory = slimefunCategories.get(workstationId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,21 +24,6 @@ public List<EmiStack> getOutputStacks(SlimefunRecipe slimefunRecipe) {
return slimefunRecipe.outputs() != null && !slimefunRecipe.outputs().isEmpty() ? slimefunRecipe.outputs().stream().map(this::emiStackFromComponent).toList() : new ArrayList<>();
}

/**
* Returns an {@link EmiStack} based off of the provided id
* @param id The {@link String} id to retrieve the {@link EmiStack} from
* @return {@link EmiStack} represented by the id or {@link EmiStack#EMPTY} if the id is invalid
*/
public EmiStack emiStackFromId(String id) {
final EmiIngredient emiIngredient = interpretId(id, EmiStack.EMPTY);
if (emiIngredient instanceof EmiStack emiStack) {
return emiStack;
}

Utils.warn("Invalid EmiStack Id: " + id);
return EmiStack.EMPTY;
}

public EmiStack emiStackFromComponent(SlimefunRecipeComponent component) {
final EmiIngredient emiIngredient = emiIngredientFromComponent(component);
if (emiIngredient instanceof EmiStack emiStack) {
Expand All @@ -54,31 +39,31 @@ public EmiIngredient emiIngredientFromComponent(SlimefunRecipeComponent componen
if (multiId != null) {
final List<EmiIngredient> multiStack = new ArrayList<>();
for (String id : multiId) {
multiStack.add(interpretId(id, EmiStack.EMPTY));
multiStack.add(interpretId(component, id, EmiStack.EMPTY));
}
return EmiIngredient.of(multiStack, multiStack.isEmpty() ? 1 : multiStack.get(0).getAmount());
}

return interpretId(component.getId(), EmiStack.EMPTY);
return interpretId(component, component.getId(), EmiStack.EMPTY);
}

@Override
public EmiIngredient fromTag(TagKey<Item> tagKey, int amount, EmiIngredient defaultValue) {
return EmiIngredient.of(tagKey, amount);
public EmiIngredient fromTag(int chance, TagKey<Item> tagKey, int amount, EmiIngredient defaultValue) {
return EmiIngredient.of(tagKey, amount).setChance(chance / 100F);
}

@Override
public EmiIngredient fromItemStack(ItemStack itemStack, int amount, EmiIngredient defaultValue) {
return EmiStack.of(itemStack, amount);
public EmiIngredient fromItemStack(int chance, ItemStack itemStack, int amount, EmiIngredient defaultValue) {
return EmiStack.of(itemStack, amount).setChance(chance / 100F);
}

@Override
public EmiIngredient fromFluid(Fluid fluid, int amount, EmiIngredient defaultValue) {
return EmiStack.of(fluid);
public EmiIngredient fromFluid(int chance, Fluid fluid, int amount, EmiIngredient defaultValue) {
return EmiStack.of(fluid).setChance(chance / 100F);
}

@Override
public EmiIngredient fromEntityType(EntityType<?> entityType, int amount, EmiIngredient defaultValue) {
return new EntityEmiStack(entityType, amount);
public EmiIngredient fromEntityType(int chance, EntityType<?> entityType, int amount, EmiIngredient defaultValue) {
return new EntityEmiStack(entityType, amount).setChance(chance / 100F);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public void addIngredient(IRecipeSlotBuilder slotBuilder, ItemStack itemStack) {

public void addIngredients(IRecipeSlotBuilder slotBuilder, SlimefunRecipeComponent component) {
for (String id : component.getMultiId() != null ? component.getMultiId() : List.of(component.getId())) {
addIngredientObject(slotBuilder, interpretId(id, ItemStack.EMPTY));
addIngredientObject(slotBuilder, interpretId(component, id, ItemStack.EMPTY));
}
}

Expand All @@ -42,28 +42,28 @@ public void addIngredientObject(IRecipeSlotBuilder slotBuilder, Object ingredien
}

@Override
public Object fromTag(TagKey<Item> tagKey, int amount, Object defaultValue) {
public Object fromTag(int chance, TagKey<Item> tagKey, int amount, Object defaultValue) {
Optional<RegistryEntryList.Named<Item>> optional = Registries.ITEM.getEntryList(tagKey);
if (optional.isEmpty()) {
return defaultValue;
}

return optional.get().stream().map(ItemStack::new).toList();
return optional.get().stream().map(item -> new ItemStack(item, amount)).toList();
}

@Override
public Object fromItemStack(ItemStack itemStack, int amount, Object defaultValue) {
public Object fromItemStack(int chance, ItemStack itemStack, int amount, Object defaultValue) {
itemStack.setCount(amount);
return itemStack;
}

@Override
public Object fromFluid(Fluid fluid, int amount, Object defaultValue) {
public Object fromFluid(int chance, Fluid fluid, int amount, Object defaultValue) {
return new JeiFluidIngredient(fluid, amount);
}

@Override
public Object fromEntityType(EntityType<?> entityType, int amount, Object defaultValue) {
public Object fromEntityType(int chance, EntityType<?> entityType, int amount, Object defaultValue) {
// TODO: add support for entities
return defaultValue;
}
Expand Down
Loading

0 comments on commit 56f7023

Please sign in to comment.