From 65bd477d18d97ec4dc829d3fac0dfb536f2ce5e1 Mon Sep 17 00:00:00 2001 From: ConfuzzedCat Date: Mon, 30 Mar 2026 14:20:52 +0200 Subject: [PATCH] Added resources for rest of nigiri, added Tuna fish item and loot table with fishing --- .../java/dev/confuzzedcat/sushi/Sushi.java | 4 + .../items/food/ingredients/fish/FishBase.java | 9 ++ .../items/food/ingredients/fish/TunaFish.java | 19 +++ .../sushi/items/food/nigiri/NigiriBase.java | 10 +- .../items/food/nigiri/NigiriOctopus.java | 4 + .../sushi/loot/biome/BiomeLootCondition.java | 129 ++++++++++++++++++ .../sushi/loot/biome/BiomePredicate.java | 120 ++++++++++++++++ .../sushi/loot/biome/BiomeTagPredicate.java | 110 +++++++++++++++ .../loot/weather/WeatherLootCondition.java | 104 ++++++++++++++ .../mixin/ILootTableBuilderAccessor.java | 14 ++ .../sushi/registry/NigiriOctopus.java | 6 - .../sushi/registry/SushiItems.java | 9 +- .../sushi/registry/SushiLootConditions.java | 28 ++++ .../sushi/registry/SushiLootHandler.java | 59 ++++++++ .../resources/assets/sushi/lang/en_us.json | 15 +- .../assets/sushi/models/item/fish_tuna.json | 6 + .../models/item/nigiri_aburi_salmon.json | 6 + .../sushi/models/item/nigiri_hamachi.json | 6 + .../sushi/models/item/nigiri_king_prawn.json | 6 + .../sushi/models/item/nigiri_mackerel.json | 6 + .../sushi/models/item/nigiri_octopus.json | 6 + .../sushi/models/item/nigiri_salmon.json | 6 + .../sushi/models/item/nigiri_scallop.json | 6 + .../sushi/models/item/nigiri_seabass.json | 6 + .../sushi/models/item/nigiri_surf_clam.json | 6 + .../sushi/models/item/nigiri_sweet_prawn.json | 6 + .../sushi/models/item/nigiri_tobiko.json | 6 + .../sushi/models/item/nigiri_unagi.json | 6 + .../assets/sushi/textures/item/fish_tuna.png | Bin 0 -> 136 bytes .../textures/item/nigiri_aburi_salmon.png | Bin 0 -> 136 bytes .../sushi/textures/item/nigiri_hamachi.png | Bin 0 -> 136 bytes .../sushi/textures/item/nigiri_king_prawn.png | Bin 0 -> 136 bytes .../sushi/textures/item/nigiri_mackerel.png | Bin 0 -> 136 bytes .../sushi/textures/item/nigiri_octopus.png | Bin 0 -> 136 bytes .../sushi/textures/item/nigiri_salmon.png | Bin 0 -> 136 bytes .../sushi/textures/item/nigiri_scallop.png | Bin 0 -> 136 bytes .../sushi/textures/item/nigiri_seabass.png | Bin 0 -> 136 bytes .../sushi/textures/item/nigiri_surf_clam.png | Bin 0 -> 136 bytes .../textures/item/nigiri_sweet_prawn.png | Bin 0 -> 136 bytes .../sushi/textures/item/nigiri_tobiko.png | Bin 0 -> 136 bytes .../sushi/textures/item/nigiri_unagi.png | Bin 0 -> 136 bytes src/main/resources/sushi.mixins.json | 1 + 42 files changed, 705 insertions(+), 14 deletions(-) create mode 100644 src/main/java/dev/confuzzedcat/sushi/items/food/ingredients/fish/FishBase.java create mode 100644 src/main/java/dev/confuzzedcat/sushi/items/food/ingredients/fish/TunaFish.java create mode 100644 src/main/java/dev/confuzzedcat/sushi/items/food/nigiri/NigiriOctopus.java create mode 100644 src/main/java/dev/confuzzedcat/sushi/loot/biome/BiomeLootCondition.java create mode 100644 src/main/java/dev/confuzzedcat/sushi/loot/biome/BiomePredicate.java create mode 100644 src/main/java/dev/confuzzedcat/sushi/loot/biome/BiomeTagPredicate.java create mode 100644 src/main/java/dev/confuzzedcat/sushi/loot/weather/WeatherLootCondition.java create mode 100644 src/main/java/dev/confuzzedcat/sushi/mixin/ILootTableBuilderAccessor.java delete mode 100644 src/main/java/dev/confuzzedcat/sushi/registry/NigiriOctopus.java create mode 100644 src/main/java/dev/confuzzedcat/sushi/registry/SushiLootConditions.java create mode 100644 src/main/java/dev/confuzzedcat/sushi/registry/SushiLootHandler.java create mode 100644 src/main/resources/assets/sushi/models/item/fish_tuna.json create mode 100644 src/main/resources/assets/sushi/models/item/nigiri_aburi_salmon.json create mode 100644 src/main/resources/assets/sushi/models/item/nigiri_hamachi.json create mode 100644 src/main/resources/assets/sushi/models/item/nigiri_king_prawn.json create mode 100644 src/main/resources/assets/sushi/models/item/nigiri_mackerel.json create mode 100644 src/main/resources/assets/sushi/models/item/nigiri_octopus.json create mode 100644 src/main/resources/assets/sushi/models/item/nigiri_salmon.json create mode 100644 src/main/resources/assets/sushi/models/item/nigiri_scallop.json create mode 100644 src/main/resources/assets/sushi/models/item/nigiri_seabass.json create mode 100644 src/main/resources/assets/sushi/models/item/nigiri_surf_clam.json create mode 100644 src/main/resources/assets/sushi/models/item/nigiri_sweet_prawn.json create mode 100644 src/main/resources/assets/sushi/models/item/nigiri_tobiko.json create mode 100644 src/main/resources/assets/sushi/models/item/nigiri_unagi.json create mode 100644 src/main/resources/assets/sushi/textures/item/fish_tuna.png create mode 100644 src/main/resources/assets/sushi/textures/item/nigiri_aburi_salmon.png create mode 100644 src/main/resources/assets/sushi/textures/item/nigiri_hamachi.png create mode 100644 src/main/resources/assets/sushi/textures/item/nigiri_king_prawn.png create mode 100644 src/main/resources/assets/sushi/textures/item/nigiri_mackerel.png create mode 100644 src/main/resources/assets/sushi/textures/item/nigiri_octopus.png create mode 100644 src/main/resources/assets/sushi/textures/item/nigiri_salmon.png create mode 100644 src/main/resources/assets/sushi/textures/item/nigiri_scallop.png create mode 100644 src/main/resources/assets/sushi/textures/item/nigiri_seabass.png create mode 100644 src/main/resources/assets/sushi/textures/item/nigiri_surf_clam.png create mode 100644 src/main/resources/assets/sushi/textures/item/nigiri_sweet_prawn.png create mode 100644 src/main/resources/assets/sushi/textures/item/nigiri_tobiko.png create mode 100644 src/main/resources/assets/sushi/textures/item/nigiri_unagi.png diff --git a/src/main/java/dev/confuzzedcat/sushi/Sushi.java b/src/main/java/dev/confuzzedcat/sushi/Sushi.java index 45ace0c..5ab53d2 100644 --- a/src/main/java/dev/confuzzedcat/sushi/Sushi.java +++ b/src/main/java/dev/confuzzedcat/sushi/Sushi.java @@ -1,6 +1,8 @@ package dev.confuzzedcat.sushi; import dev.confuzzedcat.sushi.registry.SushiItems; +import dev.confuzzedcat.sushi.registry.SushiLootConditions; +import dev.confuzzedcat.sushi.registry.SushiLootHandler; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup; import net.minecraft.item.ItemGroup; @@ -28,6 +30,8 @@ public class Sushi implements ModInitializer { SushiItems.init(); + SushiLootConditions.init(); + SushiLootHandler.init(); } public static Identifier id(String name) { return new Identifier(MOD_ID, name); diff --git a/src/main/java/dev/confuzzedcat/sushi/items/food/ingredients/fish/FishBase.java b/src/main/java/dev/confuzzedcat/sushi/items/food/ingredients/fish/FishBase.java new file mode 100644 index 0000000..da506a6 --- /dev/null +++ b/src/main/java/dev/confuzzedcat/sushi/items/food/ingredients/fish/FishBase.java @@ -0,0 +1,9 @@ +package dev.confuzzedcat.sushi.items.food.ingredients.fish; + +import dev.confuzzedcat.sushi.items.food.SushiFoodItemBase; + +public abstract class FishBase extends SushiFoodItemBase { + public FishBase(Settings settings) { + super(settings); + } +} diff --git a/src/main/java/dev/confuzzedcat/sushi/items/food/ingredients/fish/TunaFish.java b/src/main/java/dev/confuzzedcat/sushi/items/food/ingredients/fish/TunaFish.java new file mode 100644 index 0000000..135bed4 --- /dev/null +++ b/src/main/java/dev/confuzzedcat/sushi/items/food/ingredients/fish/TunaFish.java @@ -0,0 +1,19 @@ +package dev.confuzzedcat.sushi.items.food.ingredients.fish; + +import net.minecraft.item.FoodComponent; + +public class TunaFish extends FishBase{ + public TunaFish(Settings settings) { + super(settings); + } + + public TunaFish(){ + super(new Settings() + .food(new FoodComponent.Builder() + .hunger(1) + .saturationModifier(1) + .build() + ) + ); + } +} diff --git a/src/main/java/dev/confuzzedcat/sushi/items/food/nigiri/NigiriBase.java b/src/main/java/dev/confuzzedcat/sushi/items/food/nigiri/NigiriBase.java index b46cc42..da8f3ac 100644 --- a/src/main/java/dev/confuzzedcat/sushi/items/food/nigiri/NigiriBase.java +++ b/src/main/java/dev/confuzzedcat/sushi/items/food/nigiri/NigiriBase.java @@ -10,11 +10,11 @@ public abstract class NigiriBase extends SushiFoodItemBase { public NigiriBase(){ this(new Settings() - .food(new FoodComponent.Builder() - .hunger(1) - .saturationModifier(1) - .build() - ) + .food(new FoodComponent.Builder() + .hunger(1) + .saturationModifier(1) + .build() + ) ); } } diff --git a/src/main/java/dev/confuzzedcat/sushi/items/food/nigiri/NigiriOctopus.java b/src/main/java/dev/confuzzedcat/sushi/items/food/nigiri/NigiriOctopus.java new file mode 100644 index 0000000..3b4e097 --- /dev/null +++ b/src/main/java/dev/confuzzedcat/sushi/items/food/nigiri/NigiriOctopus.java @@ -0,0 +1,4 @@ +package dev.confuzzedcat.sushi.items.food.nigiri; + +public class NigiriOctopus extends NigiriBase { +} diff --git a/src/main/java/dev/confuzzedcat/sushi/loot/biome/BiomeLootCondition.java b/src/main/java/dev/confuzzedcat/sushi/loot/biome/BiomeLootCondition.java new file mode 100644 index 0000000..b4d68e7 --- /dev/null +++ b/src/main/java/dev/confuzzedcat/sushi/loot/biome/BiomeLootCondition.java @@ -0,0 +1,129 @@ +package dev.confuzzedcat.sushi.loot.biome; + +import com.google.common.collect.ImmutableSet; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import dev.confuzzedcat.sushi.registry.SushiLootConditions; +import net.minecraft.loot.condition.LootCondition; +import net.minecraft.loot.condition.LootConditionType; +import net.minecraft.loot.context.LootContext; +import net.minecraft.loot.context.LootContextParameter; +import net.minecraft.loot.context.LootContextParameters; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.registry.tag.TagKey; +import net.minecraft.util.JsonSerializer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.biome.Biome; + +import java.util.*; + + +public class BiomeLootCondition implements LootCondition { + + protected final BiomeTagPredicate category; + protected final BiomePredicate biome; + + public BiomeLootCondition(BiomeTagPredicate category, BiomePredicate biome) { + this.category = category; + this.biome = biome; + } + + @Override + public LootConditionType getType() { + return SushiLootConditions.MATCH_BIOME; + } + + @Override + public Set> getRequiredParameters() { + return ImmutableSet.of(); + } + + @Override + public boolean test(LootContext lootContext) { + Vec3d origin = lootContext.get(LootContextParameters.ORIGIN); + + if(origin != null) { + RegistryEntry fisherBiome = lootContext.getWorld().getBiome(new BlockPos((int) Math.floor(origin.x), (int) Math.floor(origin.y), (int) Math.floor(origin.z))); + + // Category predicate is null, check exact biome + if (category == null || category.getValid().isEmpty()) { + if (biome != null && !biome.getValid().isEmpty()) { + return biome.test(lootContext.getWorld(), fisherBiome); + } + } + + // Category predicate is not null, check it + else if (!category.getValid().isEmpty()) { + return category.test(fisherBiome); + } + } + + return false; + } + + public static LootCondition.Builder builder(RegistryKey... biomes) { + return builder(Collections.emptyList(), List.of(biomes)); + } + + public static LootCondition.Builder builder(TagKey... categories) { + return builder(Arrays.asList(categories), Collections.emptyList()); + } + + public static LootCondition.Builder builder(List> categories, List> biomes) { + List stringCats = new ArrayList<>(); + List stringBiomes = new ArrayList<>(); + + categories.forEach(category -> stringCats.add(category.id().toString())); + biomes.forEach(biome -> stringBiomes.add(biome.getValue().toString())); + + return builder(BiomeTagPredicate.builder().setValidByString(stringCats), BiomePredicate.builder().setValidFromString(stringBiomes)); + } + + public static LootCondition.Builder builder(String category, String biome) { + return builder(BiomeTagPredicate.builder().add(category), BiomePredicate.builder().add(biome)); + } + + public static LootCondition.Builder builder(BiomeTagPredicate.Builder categoryBuilder) { + return builder(categoryBuilder, BiomePredicate.builder()); + } + + public static LootCondition.Builder builder(BiomePredicate.Builder biomeBuilder) { + return builder(BiomeTagPredicate.builder(), biomeBuilder); + } + + public static LootCondition.Builder builder(BiomeTagPredicate.Builder categoryBuilder, BiomePredicate.Builder biomeBuilder) { + return () -> new BiomeLootCondition(categoryBuilder.build(), biomeBuilder.build()); + } + + public static class Serializer implements JsonSerializer { + + @Override + public void toJson(JsonObject jsonObject, BiomeLootCondition condition, JsonSerializationContext jsonSerializationContext) { + jsonObject.add("category", condition.category.toJson()); + jsonObject.add("biome", condition.biome.toJson()); + } + + @Override + public BiomeLootCondition fromJson(JsonObject obj, JsonDeserializationContext context) { + BiomeTagPredicate categoryPredicate; + BiomePredicate biomePredicate; + + if (obj.has("category")) { + categoryPredicate = BiomeTagPredicate.fromJson(obj.get("category")); + } else { + categoryPredicate = BiomeTagPredicate.EMPTY; + } + + if (obj.has("biome")) { + biomePredicate = BiomePredicate.fromJson(obj.get("biome")); + } else { + biomePredicate = BiomePredicate.EMPTY; + } + + return new BiomeLootCondition(categoryPredicate, biomePredicate); + } + } +} diff --git a/src/main/java/dev/confuzzedcat/sushi/loot/biome/BiomePredicate.java b/src/main/java/dev/confuzzedcat/sushi/loot/biome/BiomePredicate.java new file mode 100644 index 0000000..47e7232 --- /dev/null +++ b/src/main/java/dev/confuzzedcat/sushi/loot/biome/BiomePredicate.java @@ -0,0 +1,120 @@ +package dev.confuzzedcat.sushi.loot.biome; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.util.Identifier; +import net.minecraft.util.JsonHelper; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class BiomePredicate { + + public static final BiomePredicate EMPTY = new BiomePredicate(Collections.emptyList()); + private static final String VALID_KEY = "valid"; + private final List> valid; + + public BiomePredicate(List valid) { + this.valid = builder().setValidFromString(valid).valid; + } + + private BiomePredicate(Builder builder) { + this.valid = builder.valid; + } + + public static Builder builder() { + return new Builder(); + } + + public List> getValid() { + return valid; + } + + public boolean test(World world, RegistryEntry biome) { + for (RegistryKey key : valid) { + if (biome.matchesKey(key)) { + return true; + } + } + return false; + } + + public JsonElement toJson() { + JsonObject obj = new JsonObject(); + JsonArray arr = new JsonArray(); + + for(RegistryKey rKey : valid) { + arr.add(rKey.getValue().toString()); + } + + obj.add(VALID_KEY, arr); + return obj; + } + + public static BiomePredicate fromJson(JsonElement element) { + JsonObject obj = JsonHelper.asObject(element, VALID_KEY); + JsonArray arr = obj.getAsJsonArray(VALID_KEY); + + List sArr = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { + sArr.add(arr.get(i).getAsString()); + } + + return new BiomePredicate(sArr); + } + + + public static class Builder { + + private List> valid; + + private Builder() { + + } + + public Builder setValid(List> valid) { + this.valid = valid; + return this; + } + + public Builder setValidFromString(List valid) { + List> rKeys = new ArrayList<>(); + for (String str : valid) { + if (!valid.isEmpty()) { + rKeys.add(RegistryKey.of(RegistryKeys.BIOME, new Identifier(str))); + } + } + + return setValid(rKeys); + } + + public Builder add(RegistryKey biome) { + valid.add(biome); + return this; + } + + public Builder add(String biome) { + if(!biome.isEmpty()) { + valid.add(RegistryKey.of(RegistryKeys.BIOME, new Identifier(biome))); + } + + return this; + } + + public Builder of(BiomePredicate biomePredicate) { + this.valid = biomePredicate.valid; + return this; + } + + public BiomePredicate build() { + return new BiomePredicate(this); + } + } +} diff --git a/src/main/java/dev/confuzzedcat/sushi/loot/biome/BiomeTagPredicate.java b/src/main/java/dev/confuzzedcat/sushi/loot/biome/BiomeTagPredicate.java new file mode 100644 index 0000000..90d997e --- /dev/null +++ b/src/main/java/dev/confuzzedcat/sushi/loot/biome/BiomeTagPredicate.java @@ -0,0 +1,110 @@ +package dev.confuzzedcat.sushi.loot.biome; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.registry.tag.TagKey; +import net.minecraft.util.Identifier; +import net.minecraft.util.JsonHelper; +import net.minecraft.world.biome.Biome; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class BiomeTagPredicate { + + public static final BiomeTagPredicate EMPTY = new BiomeTagPredicate(Collections.emptyList()); + private static final String VALID_KEY = "valid"; + private final List> valid; + + public BiomeTagPredicate(List> valid) { this.valid = valid; } + + public BiomeTagPredicate(Builder builder) { + this.valid = builder.valid; + } + + public static Builder builder() { + return new Builder(); + } + + public List> getValid() { + return valid; + } + + public boolean test(RegistryEntry biome) { + + for(TagKey tag : valid) { + if(biome.isIn(tag)) { + return true; + } + } + + return false; + } + + public JsonElement toJson() { + JsonObject obj = new JsonObject(); + JsonArray arr = new JsonArray(); + + for(TagKey tag : valid) { + arr.add(tag.id().toString()); + } + + obj.add(VALID_KEY, arr); + return obj; + } + + public static BiomeTagPredicate fromJson(JsonElement element) { + JsonObject obj = JsonHelper.asObject(element, VALID_KEY); + JsonArray arr = obj.getAsJsonArray(VALID_KEY); + + List sArr = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { + sArr.add(arr.get(i).getAsString()); + } + + return BiomeTagPredicate.builder().setValidByString(sArr).build(); + } + + public static class Builder { + + private List> valid = new ArrayList<>(); + + private Builder() { + + } + + public Builder setValid(List> valid) { + this.valid = valid; + return this; + } + + public Builder setValidByString(List valid) { + List> tagKeys = new ArrayList<>(); + for (String str : valid) { + tagKeys.add(TagKey.of(RegistryKeys.BIOME, new Identifier(str))); + } + return setValid(tagKeys); + } + + public Builder add(String tag) { + if(!tag.isEmpty()) { + this.valid.add(TagKey.of(RegistryKeys.BIOME, new Identifier(tag))); + } + + return this; + } + + public Builder of(BiomeTagPredicate biomePredicate) { + this.valid = biomePredicate.valid; + return this; + } + + public BiomeTagPredicate build() { + return new BiomeTagPredicate(this); + } + } +} \ No newline at end of file diff --git a/src/main/java/dev/confuzzedcat/sushi/loot/weather/WeatherLootCondition.java b/src/main/java/dev/confuzzedcat/sushi/loot/weather/WeatherLootCondition.java new file mode 100644 index 0000000..89380b0 --- /dev/null +++ b/src/main/java/dev/confuzzedcat/sushi/loot/weather/WeatherLootCondition.java @@ -0,0 +1,104 @@ +package dev.confuzzedcat.sushi.loot.weather; + +import com.google.common.collect.ImmutableSet; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import dev.confuzzedcat.sushi.registry.SushiLootConditions; +import net.minecraft.entity.Entity; +import net.minecraft.loot.condition.LootCondition; +import net.minecraft.loot.condition.LootConditionType; +import net.minecraft.loot.context.LootContext; +import net.minecraft.loot.context.LootContextParameter; +import net.minecraft.loot.context.LootContextParameters; +import net.minecraft.util.JsonSerializer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; +import org.jetbrains.annotations.Nullable; + +import java.util.Set; + +public class WeatherLootCondition implements LootCondition { + + protected boolean raining = false; + protected boolean thundering = false; + protected boolean snowing = false; + + public WeatherLootCondition() { + + } + + public WeatherLootCondition(boolean raining, boolean thundering, boolean snowing) { + this.raining = raining; + this.thundering = thundering; + this.snowing = snowing; + } + + @Override + public LootConditionType getType() { + return SushiLootConditions.WEATHER; + } + + @Override + public Set> getRequiredParameters() { + return ImmutableSet.of(LootContextParameters.THIS_ENTITY, LootContextParameters.ORIGIN); + } + + @Override + public boolean test(LootContext lootContext) { + @Nullable Entity entity = lootContext.get(LootContextParameters.THIS_ENTITY); + @Nullable Vec3d pos = lootContext.get(LootContextParameters.ORIGIN); + + if(entity != null && pos != null) { + World world = entity.getWorld(); + + // If raining is required and the world is not raining, return false. + if (raining && !world.isRaining()) { + return false; + } + + // If thundering is required and the world is not raining, return false. + if (thundering && !world.isThundering()) { + return false; + } + + // same check for snowing + if (snowing) { + // >= .15 = no snow + if(world.getBiome(entity.getBlockPos()).value().doesNotSnow(new BlockPos((int) Math.floor(pos.x), (int) Math.floor(pos.y), (int) Math.floor(pos.z)))) { + return false; + } + + return world.isRaining(); + } + + // Both conditions match, return true. + return true; + } + + return false; + } + + public static LootCondition.Builder builder(boolean raining, boolean thundering, boolean snowing) { + return () -> new WeatherLootCondition(raining, thundering, snowing); + } + + public static class Serializer implements JsonSerializer { + + @Override + public void toJson(JsonObject jsonObject, WeatherLootCondition condition, JsonSerializationContext jsonSerializationContext) { + jsonObject.addProperty("raining", condition.raining); + jsonObject.addProperty("thundering", condition.thundering); + jsonObject.addProperty("snowing", condition.snowing); + } + + @Override + public WeatherLootCondition fromJson(JsonObject obj, JsonDeserializationContext context) { + return new WeatherLootCondition( + obj.has("raining") && obj.get("raining").getAsBoolean(), + obj.has("thundering") && obj.get("thundering").getAsBoolean(), + obj.has("snowing") && obj.get("snowing").getAsBoolean()); + } + } +} \ No newline at end of file diff --git a/src/main/java/dev/confuzzedcat/sushi/mixin/ILootTableBuilderAccessor.java b/src/main/java/dev/confuzzedcat/sushi/mixin/ILootTableBuilderAccessor.java new file mode 100644 index 0000000..436919f --- /dev/null +++ b/src/main/java/dev/confuzzedcat/sushi/mixin/ILootTableBuilderAccessor.java @@ -0,0 +1,14 @@ +package dev.confuzzedcat.sushi.mixin; + +import net.minecraft.loot.LootPool; +import net.minecraft.loot.LootTable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; + +@Mixin(LootTable.Builder.class) +public interface ILootTableBuilderAccessor { + @Accessor + List getPools(); +} diff --git a/src/main/java/dev/confuzzedcat/sushi/registry/NigiriOctopus.java b/src/main/java/dev/confuzzedcat/sushi/registry/NigiriOctopus.java deleted file mode 100644 index 29b0c96..0000000 --- a/src/main/java/dev/confuzzedcat/sushi/registry/NigiriOctopus.java +++ /dev/null @@ -1,6 +0,0 @@ -package dev.confuzzedcat.sushi.registry; - -import dev.confuzzedcat.sushi.items.food.nigiri.NigiriBase; - -public class NigiriOctopus extends NigiriBase { -} diff --git a/src/main/java/dev/confuzzedcat/sushi/registry/SushiItems.java b/src/main/java/dev/confuzzedcat/sushi/registry/SushiItems.java index 073b26c..ee86b1f 100644 --- a/src/main/java/dev/confuzzedcat/sushi/registry/SushiItems.java +++ b/src/main/java/dev/confuzzedcat/sushi/registry/SushiItems.java @@ -2,6 +2,7 @@ package dev.confuzzedcat.sushi.registry; import dev.confuzzedcat.sushi.Sushi; import dev.confuzzedcat.sushi.items.food.ingredients.avocadoFruit; +import dev.confuzzedcat.sushi.items.food.ingredients.fish.TunaFish; import dev.confuzzedcat.sushi.items.food.nigiri.*; import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents; import net.minecraft.item.Item; @@ -12,8 +13,12 @@ import org.slf4j.Logger; public class SushiItems { private static final Logger LOGGER = Sushi.LOGGER; - // Ingredients + /// Ingredients + // Plants public static final Item AVOCADO_FRUIT = register("avocado_fruit", new avocadoFruit()); + // Fish + public static final Item TUNA_FISH = register("fish_tuna", new TunaFish()); + // Nigiri @@ -24,7 +29,7 @@ public class SushiItems { public static final Item NIGIRI_MACKEREL = register("nigiri_mackerel", new NigiriMackerel()); public static final Item NIGIRI_SURF_CLAM = register("nigiri_surf_clam", new NigiriSurfClam()); public static final Item NIGIRI_KING_PRAWN = register("nigiri_king_prawn", new NigiriKingPrawn()); - public static final Item NIGIRI_SWEET_PRAWN = register("nigiri_sweet_prawm", new NigiriSweetPrawn()); + public static final Item NIGIRI_SWEET_PRAWN = register("nigiri_sweet_prawn", new NigiriSweetPrawn()); public static final Item NIGIRI_OCTOPUS = register("nigiri_octopus", new NigiriOctopus()); public static final Item NIGIRI_TOBIKO = register("nigiri_tobiko", new NigiriTobiko()); public static final Item NIGIRI_SCALLOP = register("nigiri_scallop", new NigiriScallop()); diff --git a/src/main/java/dev/confuzzedcat/sushi/registry/SushiLootConditions.java b/src/main/java/dev/confuzzedcat/sushi/registry/SushiLootConditions.java new file mode 100644 index 0000000..44240e7 --- /dev/null +++ b/src/main/java/dev/confuzzedcat/sushi/registry/SushiLootConditions.java @@ -0,0 +1,28 @@ +package dev.confuzzedcat.sushi.registry; + +import dev.confuzzedcat.sushi.Sushi; +import dev.confuzzedcat.sushi.loot.biome.BiomeLootCondition; +import dev.confuzzedcat.sushi.loot.weather.WeatherLootCondition; +import net.minecraft.loot.condition.LootCondition; +import net.minecraft.loot.condition.LootConditionType; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.util.JsonSerializer; +import org.slf4j.Logger; + +public class SushiLootConditions { + private static final Logger LOGGER = Sushi.LOGGER; + + public static final LootConditionType MATCH_BIOME = register("match_biome", new BiomeLootCondition.Serializer()); + public static final LootConditionType WEATHER = register("weather", new WeatherLootCondition.Serializer()); + + + private static LootConditionType register(String name, JsonSerializer serializer){ + var id = Sushi.id(name); + return Registry.register(Registries.LOOT_CONDITION_TYPE, id, new LootConditionType(serializer)); + } + public static void init() { + LOGGER.info("Initializing loot conditions for {}", Sushi.MOD_ID); + } + +} diff --git a/src/main/java/dev/confuzzedcat/sushi/registry/SushiLootHandler.java b/src/main/java/dev/confuzzedcat/sushi/registry/SushiLootHandler.java new file mode 100644 index 0000000..72da78a --- /dev/null +++ b/src/main/java/dev/confuzzedcat/sushi/registry/SushiLootHandler.java @@ -0,0 +1,59 @@ +package dev.confuzzedcat.sushi.registry; + +import dev.confuzzedcat.sushi.Sushi; +import dev.confuzzedcat.sushi.loot.biome.BiomeLootCondition; +import dev.confuzzedcat.sushi.loot.weather.WeatherLootCondition; +import dev.confuzzedcat.sushi.mixin.ILootTableBuilderAccessor; +import net.fabricmc.fabric.api.loot.v2.FabricLootPoolBuilder; +import net.fabricmc.fabric.api.loot.v2.LootTableEvents; +import net.fabricmc.fabric.api.tag.convention.v1.ConventionalBiomeTags; +import net.minecraft.loot.LootPool; +import net.minecraft.loot.entry.ItemEntry; +import net.minecraft.util.Identifier; +import org.slf4j.Logger; + +public class SushiLootHandler { + private static final Logger LOGGER = Sushi.LOGGER; + public static final Identifier FISH_LOOT_TABLE = new Identifier("gameplay/fishing/fish"); + + public static void init() { + LOGGER.info("Initializing loot tables for {}", Sushi.MOD_ID); + registerFishLootHandler(); + } + private static void registerFishLootHandler() { + LootTableEvents.MODIFY.register((resourceManager, lootManager, identifier, fabricLootSupplierBuilder, lootTableSource) -> { + if(identifier.equals(FISH_LOOT_TABLE)) { + // Get first pool, which SHOULD be the fish pool + LootPool lootPool = ((ILootTableBuilderAccessor) fabricLootSupplierBuilder).getPools().get(0); + + + LootPool.Builder lpb = FabricLootPoolBuilder.copyOf(lootPool); + + // The default fish loot table has a total weight of 100. + // An entry with a weight of 10 represents a 10% chance to get that fish compared to the standard 4, but the percentage goes down as more custom fish are added. + // In most situations, only 1-2 fish are added per biome or area, so the chance for that fish is still ~5-10%. + + // Ocean + lpb.with( + ItemEntry + .builder(SushiItems.TUNA_FISH) + .weight(10) + .conditionally( + BiomeLootCondition.builder(ConventionalBiomeTags.OCEAN) + .and(WeatherLootCondition.builder(true, false, false)) + ) + .build() + ); + + // weather + //lpb.with(ItemEntry.builder(GoFishItems.RAINY_BASS).weight(100).conditionally(WeatherCondition.builder(true, false, false)).build()); + + + ((ILootTableBuilderAccessor) fabricLootSupplierBuilder) + .getPools() + .set(0, lpb.build()); + } + }); + } + +} diff --git a/src/main/resources/assets/sushi/lang/en_us.json b/src/main/resources/assets/sushi/lang/en_us.json index 19d5494..963e25c 100644 --- a/src/main/resources/assets/sushi/lang/en_us.json +++ b/src/main/resources/assets/sushi/lang/en_us.json @@ -2,6 +2,19 @@ "itemGroup.sushi.sushi_items": "Sushi Items", "item.sushi.avocado_fruit": "Avocado Fruit", - "item.sushi.nigiri_tuna": "Tuna Nigiri" + "item.sushi.nigiri_tuna": "Tuna Nigiri", + "item.sushi.nigiri_salmon" : "Salmon Nigiri", + "item.sushi.nigiri_hamachi" : "Hamachi Nigiri", + "item.sushi.nigiri_seabass" :"Seabass Nigiri", + "item.sushi.nigiri_mackerel" : "Mackerel Nigiri", + "item.sushi.nigiri_surf_clam" :"Surf Clam Nigiri", + "item.sushi.nigiri_king_prawn" : "King Prawn Nigiri", + "item.sushi.nigiri_sweet_prawn" :"Sweet Prawn Nigiri", + "item.sushi.nigiri_octopus" : "Octopus Nigiri", + "item.sushi.nigiri_tobiko" :"Tobiko Nigiri", + "item.sushi.nigiri_scallop" : "Scallop Nigiri", + "item.sushi.nigiri_unagi" :"Unagi Nigiri", + "item.sushi.nigiri_aburi_salmon" : "Aburi Salmon Nigiri", + "item.sushi.fish_tuna" : "Tuna Fish" } \ No newline at end of file diff --git a/src/main/resources/assets/sushi/models/item/fish_tuna.json b/src/main/resources/assets/sushi/models/item/fish_tuna.json new file mode 100644 index 0000000..9454bfd --- /dev/null +++ b/src/main/resources/assets/sushi/models/item/fish_tuna.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "sushi:item/fish_tuna" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/sushi/models/item/nigiri_aburi_salmon.json b/src/main/resources/assets/sushi/models/item/nigiri_aburi_salmon.json new file mode 100644 index 0000000..ac423ca --- /dev/null +++ b/src/main/resources/assets/sushi/models/item/nigiri_aburi_salmon.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "sushi:item/nigiri_aburi_salmon" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/sushi/models/item/nigiri_hamachi.json b/src/main/resources/assets/sushi/models/item/nigiri_hamachi.json new file mode 100644 index 0000000..ba48e66 --- /dev/null +++ b/src/main/resources/assets/sushi/models/item/nigiri_hamachi.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "sushi:item/nigiri_hamachi" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/sushi/models/item/nigiri_king_prawn.json b/src/main/resources/assets/sushi/models/item/nigiri_king_prawn.json new file mode 100644 index 0000000..7ef6afd --- /dev/null +++ b/src/main/resources/assets/sushi/models/item/nigiri_king_prawn.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "sushi:item/nigiri_king_prawn" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/sushi/models/item/nigiri_mackerel.json b/src/main/resources/assets/sushi/models/item/nigiri_mackerel.json new file mode 100644 index 0000000..9f8db77 --- /dev/null +++ b/src/main/resources/assets/sushi/models/item/nigiri_mackerel.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "sushi:item/nigiri_mackerel" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/sushi/models/item/nigiri_octopus.json b/src/main/resources/assets/sushi/models/item/nigiri_octopus.json new file mode 100644 index 0000000..e7505d0 --- /dev/null +++ b/src/main/resources/assets/sushi/models/item/nigiri_octopus.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "sushi:item/nigiri_octopus" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/sushi/models/item/nigiri_salmon.json b/src/main/resources/assets/sushi/models/item/nigiri_salmon.json new file mode 100644 index 0000000..89e9fc7 --- /dev/null +++ b/src/main/resources/assets/sushi/models/item/nigiri_salmon.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "sushi:item/nigiri_salmon" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/sushi/models/item/nigiri_scallop.json b/src/main/resources/assets/sushi/models/item/nigiri_scallop.json new file mode 100644 index 0000000..264a1c6 --- /dev/null +++ b/src/main/resources/assets/sushi/models/item/nigiri_scallop.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "sushi:item/nigiri_scallop" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/sushi/models/item/nigiri_seabass.json b/src/main/resources/assets/sushi/models/item/nigiri_seabass.json new file mode 100644 index 0000000..ab62100 --- /dev/null +++ b/src/main/resources/assets/sushi/models/item/nigiri_seabass.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "sushi:item/nigiri_seabass" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/sushi/models/item/nigiri_surf_clam.json b/src/main/resources/assets/sushi/models/item/nigiri_surf_clam.json new file mode 100644 index 0000000..68a5eba --- /dev/null +++ b/src/main/resources/assets/sushi/models/item/nigiri_surf_clam.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "sushi:item/nigiri_surf_clam" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/sushi/models/item/nigiri_sweet_prawn.json b/src/main/resources/assets/sushi/models/item/nigiri_sweet_prawn.json new file mode 100644 index 0000000..bb5a19d --- /dev/null +++ b/src/main/resources/assets/sushi/models/item/nigiri_sweet_prawn.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "sushi:item/nigiri_sweet_prawn" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/sushi/models/item/nigiri_tobiko.json b/src/main/resources/assets/sushi/models/item/nigiri_tobiko.json new file mode 100644 index 0000000..e1023b8 --- /dev/null +++ b/src/main/resources/assets/sushi/models/item/nigiri_tobiko.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "sushi:item/nigiri_tobiko" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/sushi/models/item/nigiri_unagi.json b/src/main/resources/assets/sushi/models/item/nigiri_unagi.json new file mode 100644 index 0000000..5fd91dd --- /dev/null +++ b/src/main/resources/assets/sushi/models/item/nigiri_unagi.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "sushi:item/nigiri_unagi" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/sushi/textures/item/fish_tuna.png b/src/main/resources/assets/sushi/textures/item/fish_tuna.png new file mode 100644 index 0000000000000000000000000000000000000000..b0dd5f768b541004e859008bfd37c4342ca52b69 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|oIG6|Lo9le z6C_wgnB8)kvU_^|J-#GR^iHNrj)ys6R`dCJM=$KTc0=N@01xxO|Nr|hm+eq