From 39a500436a745bca96ada2d4681c5badce1c9cd1 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Tue, 14 Jan 2025 18:19:35 -0500 Subject: [PATCH 01/11] Make scroll-filling function usable without requiring a LootContext --- .../loot/AddPerWorldPatternToScrollFunc.java | 40 +++++++++++-------- .../forge/loot/ForgeHexScrollLootMod.java | 4 +- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/loot/AddPerWorldPatternToScrollFunc.java b/Common/src/main/java/at/petrak/hexcasting/common/loot/AddPerWorldPatternToScrollFunc.java index 30c9f9737..1a972bc02 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/loot/AddPerWorldPatternToScrollFunc.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/loot/AddPerWorldPatternToScrollFunc.java @@ -3,6 +3,7 @@ import at.petrak.hexcasting.api.casting.ActionRegistryEntry; import at.petrak.hexcasting.api.mod.HexTags; import at.petrak.hexcasting.api.utils.HexUtils; +import at.petrak.hexcasting.api.utils.NBTHelper; import at.petrak.hexcasting.common.casting.PatternRegistryManifest; import at.petrak.hexcasting.common.items.storage.ItemScroll; import at.petrak.hexcasting.common.lib.HexLootFunctions; @@ -10,9 +11,12 @@ import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonObject; import com.google.gson.JsonSerializationContext; +import net.minecraft.util.RandomSource; import net.minecraft.core.Registry; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.functions.LootItemConditionalFunction; @@ -35,30 +39,32 @@ public AddPerWorldPatternToScrollFunc(LootItemCondition[] lootItemConditions) { /** * This doesn't actually have any params so extract behaviour out for the benefit of forge */ - public static ItemStack doStatic(ItemStack stack, LootContext ctx) { - var rand = ctx.getRandom(); - var perWorldKeys = new ArrayList>(); - Registry regi = IXplatAbstractions.INSTANCE.getActionRegistry(); - for (var key : regi.registryKeySet()) { - if (HexUtils.isOfTag(regi, key, HexTags.Actions.PER_WORLD_PATTERN)) { - perWorldKeys.add(key); + public static ItemStack doStatic(ItemStack stack, RandomSource rand, ServerLevel overworld) { + ResourceKey patternKey; + if (NBTHelper.hasString(stack, ItemScroll.TAG_OP_ID)) { + patternKey = ResourceKey.create( + IXplatAbstractions.INSTANCE.getActionRegistry().key(), + ResourceLocation.tryParse(NBTHelper.getString(stack, ItemScroll.TAG_OP_ID)) + ); + } else { + var perWorldKeys = new ArrayList>(); + Registry regi = IXplatAbstractions.INSTANCE.getActionRegistry(); + for (var key : regi.registryKeySet()) { + if (HexUtils.isOfTag(regi, key, HexTags.Actions.PER_WORLD_PATTERN)) { + perWorldKeys.add(key); + } } + patternKey = perWorldKeys.get(rand.nextInt(perWorldKeys.size())); + NBTHelper.putString(stack, ItemScroll.TAG_OP_ID, patternKey.location().toString()); } - var key = perWorldKeys.get(rand.nextInt(perWorldKeys.size())); - - var pat = PatternRegistryManifest.getCanonicalStrokesPerWorld(key, ctx.getLevel().getServer().overworld()); - var tag = new CompoundTag(); - tag.putString(ItemScroll.TAG_OP_ID, key.location().toString()); - tag.put(ItemScroll.TAG_PATTERN, pat.serializeToNBT()); - - stack.getOrCreateTag().merge(tag); - + var pat = PatternRegistryManifest.getCanonicalStrokesPerWorld(patternKey, overworld); + NBTHelper.put(stack, ItemScroll.TAG_PATTERN, pat.serializeToNBT()); return stack; } @Override protected ItemStack run(ItemStack stack, LootContext ctx) { - return doStatic(stack, ctx); + return doStatic(stack, ctx.getRandom(), ctx.getLevel().getServer().overworld()); } @Override diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexScrollLootMod.java b/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexScrollLootMod.java index ffae0a85c..fe1a2dda8 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexScrollLootMod.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/loot/ForgeHexScrollLootMod.java @@ -24,7 +24,7 @@ public class ForgeHexScrollLootMod extends LootModifier { Codec.INT.fieldOf("countRange").forGetter(it -> it.countRange) ).apply(inst, ForgeHexScrollLootMod::new) )); - + public final int countRange; public ForgeHexScrollLootMod(LootItemCondition[] conditionsIn, int countRange) { @@ -38,7 +38,7 @@ public ForgeHexScrollLootMod(LootItemCondition[] conditionsIn, int countRange) { int count = HexLootHandler.getScrollCount(this.countRange, context.getRandom()); for (int i = 0; i < count; i++) { var newStack = new ItemStack(HexItems.SCROLL_LARGE); - AddPerWorldPatternToScrollFunc.doStatic(newStack, context); + AddPerWorldPatternToScrollFunc.doStatic(newStack, context.getRandom(), context.getLevel().getServer().overworld()); generatedLoot.add(newStack); } return generatedLoot; From 64338324deef483d94f7edfb9de185f88c0c4a02 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Tue, 14 Jan 2025 18:23:11 -0500 Subject: [PATCH 02/11] Scrolls can now load and/or reveal the pattern on inventory tick --- .../common/items/storage/ItemScroll.java | 55 ++++++++++++++++--- 1 file changed, 47 insertions(+), 8 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemScroll.java b/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemScroll.java index 036e5129b..91a953735 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemScroll.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemScroll.java @@ -9,38 +9,45 @@ import at.petrak.hexcasting.common.entities.EntityWallScroll; import at.petrak.hexcasting.common.lib.hex.HexIotaTypes; import at.petrak.hexcasting.common.misc.PatternTooltip; +import at.petrak.hexcasting.common.loot.AddPerWorldPatternToScrollFunc; import at.petrak.hexcasting.interop.inline.InlinePatternData; +import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; import java.util.Optional; +import java.util.List; import static at.petrak.hexcasting.api.HexAPI.modLoc; /** - * TAG_OP_ID and TAG_PATTERN: "Ancient Scroll of %s" (Great Spells) + * TAG_OP_ID and TAG_PATTERN: "Ancient Scroll of %s" (per-world pattern preloaded) + *
+ * TAG_OP_ID: "Ancient Scroll of %s" (per-world pattern loaded on inv tick) *
* TAG_PATTERN: "Scroll" (custom) *
* (none): "Empty Scroll" - *
- * TAG_OP_ID: invalid */ public class ItemScroll extends Item implements IotaHolderItem { public static final String TAG_OP_ID = "op_id"; public static final String TAG_PATTERN = "pattern"; + public static final String TAG_NEEDS_PURCHASE = "needs_purchase"; public static final ResourceLocation ANCIENT_PREDICATE = modLoc("ancient"); public final int blockSize; @@ -50,6 +57,15 @@ public ItemScroll(Properties pProperties, int blockSize) { this.blockSize = blockSize; } + // this produces a scroll that will load the correct pattern for your world once it ticks + public static ItemStack withPerWorldPattern(ItemStack stack, String op_id) { + Item item = stack.getItem(); + if (item instanceof ItemScroll) + NBTHelper.putString(stack, TAG_OP_ID, op_id); + + return stack; + } + @Override public @Nullable CompoundTag readIotaTag(ItemStack stack) { @@ -133,7 +149,7 @@ public Component getName(ItemStack pStack) { return Component.translatable(descID + ".of", Component.translatable("hexcasting.action." + ResourceLocation.tryParse(ancientId))); } else if (NBTHelper.hasCompound(pStack, TAG_PATTERN)) { - var compound = NBTHelper.getCompound(pStack, ItemScroll.TAG_PATTERN); + var compound = NBTHelper.getCompound(pStack, TAG_PATTERN); var patternLabel = Component.literal(""); if (compound != null) { var pattern = HexPattern.fromNBT(compound); @@ -145,16 +161,39 @@ public Component getName(ItemStack pStack) { } } - // purposely no hover text + @Override + public void inventoryTick(ItemStack pStack, Level pLevel, Entity pEntity, int pSlotId, boolean pIsSelected) { + // the needs_purchase tag is used so you can't see the pattern on scrolls sold by a wandering trader + // once you put the scroll into your inventory, this removes the tag to reveal the pattern + if (NBTHelper.getBoolean(pStack, TAG_NEEDS_PURCHASE)) { + NBTHelper.remove(pStack, TAG_NEEDS_PURCHASE); + } + // if op_id is set but there's no stored pattern, load the pattern on inv tick + if (NBTHelper.hasString(pStack, TAG_OP_ID) && !NBTHelper.hasCompound(pStack, TAG_PATTERN) && pEntity.getServer() != null) { + AddPerWorldPatternToScrollFunc.doStatic(pStack, pLevel.getRandom(), pEntity.getServer().overworld()); + } + } + + @Override + public void appendHoverText(ItemStack pStack, @Nullable Level pLevel, List pTooltipComponents, + TooltipFlag pIsAdvanced) { + if (NBTHelper.getBoolean(pStack, TAG_NEEDS_PURCHASE)) { + var needsPurchase = Component.translatable("hexcasting.tooltip.scroll.needs_purchase"); + pTooltipComponents.add(needsPurchase.withStyle(ChatFormatting.GRAY)); + } else if (NBTHelper.hasString(pStack, TAG_OP_ID) && !NBTHelper.hasCompound(pStack, TAG_PATTERN)) { + var notLoaded = Component.translatable("hexcasting.tooltip.scroll.pattern_not_loaded"); + pTooltipComponents.add(notLoaded.withStyle(ChatFormatting.GRAY)); + } + } @Override public Optional getTooltipImage(ItemStack stack) { - var compound = NBTHelper.getCompound(stack, ItemScroll.TAG_PATTERN); - if (compound != null) { + var compound = NBTHelper.getCompound(stack, TAG_PATTERN); + if (compound != null && !NBTHelper.getBoolean(stack, TAG_NEEDS_PURCHASE)) { var pattern = HexPattern.fromNBT(compound); return Optional.of(new PatternTooltip( pattern, - NBTHelper.hasString(stack, ItemScroll.TAG_OP_ID) + NBTHelper.hasString(stack, TAG_OP_ID) ? PatternTooltipComponent.ANCIENT_BG : PatternTooltipComponent.PRISTINE_BG)); } From f11d46efe555c62f6b2265c859fd5529f08acb24 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Tue, 14 Jan 2025 18:25:47 -0500 Subject: [PATCH 03/11] Wandering traders can sell scrolls --- .../petrak/hexcasting/api/mod/HexConfig.java | 4 ++ .../mixin/MixinWanderingTrader.java | 37 +++++++++++++++++++ Common/src/main/resources/hexplat.mixins.json | 1 + .../hexcasting/fabric/FabricHexConfig.java | 9 ++++- .../hexcasting/forge/ForgeHexConfig.java | 15 +++++--- 5 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 Common/src/main/java/at/petrak/hexcasting/mixin/MixinWanderingTrader.java diff --git a/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java b/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java index 19458cbc8..845bf7209 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java @@ -74,10 +74,14 @@ public interface ServerConfigAccess { boolean trueNameHasAmbit(); + double traderScrollChance(); + int DEFAULT_MAX_OP_COUNT = 100_000; int DEFAULT_MAX_SPELL_CIRCLE_LENGTH = 1024; int DEFAULT_OP_BREAK_HARVEST_LEVEL = 3; + double DEFAULT_TRADER_SCROLL_CHANCE = 0.4; + boolean DEFAULT_VILLAGERS_DISLIKE_MIND_MURDER = true; List DEFAULT_DIM_TP_DENYLIST = List.of("twilightforest:twilight_forest"); diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinWanderingTrader.java b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinWanderingTrader.java new file mode 100644 index 000000000..6972090d5 --- /dev/null +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinWanderingTrader.java @@ -0,0 +1,37 @@ +package at.petrak.hexcasting.mixin; + +import net.minecraft.world.entity.npc.WanderingTrader; +import net.minecraft.world.item.trading.MerchantOffers; +import net.minecraft.world.item.trading.MerchantOffer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.util.RandomSource; +import net.minecraft.server.MinecraftServer; +import at.petrak.hexcasting.api.mod.HexConfig; +import at.petrak.hexcasting.api.utils.NBTHelper; +import at.petrak.hexcasting.common.lib.HexItems; +import at.petrak.hexcasting.common.loot.AddPerWorldPatternToScrollFunc; +import at.petrak.hexcasting.common.items.storage.ItemScroll; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +// Adds ancient scrolls to the wandering trader by replacing one of the 5 junk trades +@Mixin(WanderingTrader.class) +public class MixinWanderingTrader { + @Inject(method = "updateTrades", at = @At("RETURN")) + private void addNewTrades(CallbackInfo ci) { + var self = (WanderingTrader) (Object) this; + MerchantOffers offerList = self.getOffers(); + if (offerList == null) + return; + RandomSource rand = self.getRandom(); + if (rand.nextFloat() < HexConfig.server().traderScrollChance() && self.getServer() != null) { + ItemStack scroll = new ItemStack(HexItems.SCROLL_LARGE); + AddPerWorldPatternToScrollFunc.doStatic(scroll, rand, self.getServer().overworld()); + NBTHelper.putBoolean(scroll, ItemScroll.TAG_NEEDS_PURCHASE, true); + offerList.set(rand.nextInt(5), new MerchantOffer(new ItemStack(Items.EMERALD, 12), scroll, 1, 1, 1)); + } + } +} diff --git a/Common/src/main/resources/hexplat.mixins.json b/Common/src/main/resources/hexplat.mixins.json index 1d2ac1300..a70b99261 100644 --- a/Common/src/main/resources/hexplat.mixins.json +++ b/Common/src/main/resources/hexplat.mixins.json @@ -9,6 +9,7 @@ "MixinMob", "MixinRaider", "MixinVillager", + "MixinWanderingTrader", "MixinWitch", "accessor.AccessorAbstractArrow", "accessor.AccessorEntity", diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java index a49ab760f..b3eeadde6 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java @@ -184,10 +184,11 @@ public static final class Server implements HexConfig.ServerConfigAccess, Config private boolean villagersOffendedByMindMurder = DEFAULT_VILLAGERS_DISLIKE_MIND_MURDER; @ConfigEntry.Gui.Tooltip private boolean doesTrueNameHaveAmbit = DEFAULT_TRUE_NAME_HAS_AMBIT; - - @ConfigEntry.Gui.Tooltip private List tpDimDenylist = DEFAULT_DIM_TP_DENYLIST; + + @ConfigEntry.Gui.Tooltip + private double traderScrollChance = DEFAULT_TRADER_SCROLL_CHANCE; // ModMenu bad and doesn't like java objects in here so we do stupid string parsing @ConfigEntry.Gui.Tooltip @@ -281,6 +282,10 @@ public boolean trueNameHasAmbit() { return doesTrueNameHaveAmbit; } + public double traderScrollChance() { + return traderScrollChance; + } + /** * Returns -1 if none is found */ diff --git a/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java b/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java index bf219312f..43510354c 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java @@ -133,17 +133,13 @@ public boolean clickingTogglesDrawing() { public static class Server implements HexConfig.ServerConfigAccess { private static ForgeConfigSpec.IntValue opBreakHarvestLevel; private static ForgeConfigSpec.IntValue maxOpCount; - private static ForgeConfigSpec.IntValue maxSpellCircleLength; - private static ForgeConfigSpec.ConfigValue> actionDenyList; private static ForgeConfigSpec.ConfigValue> circleActionDenyList; - private static ForgeConfigSpec.BooleanValue villagersOffendedByMindMurder; - private static ForgeConfigSpec.ConfigValue> tpDimDenyList; - private static ForgeConfigSpec.BooleanValue doesTrueNameHaveAmbit; + private static ForgeConfigSpec.DoubleValue traderScrollChance; private static ForgeConfigSpec.ConfigValue> fewScrollTables; private static ForgeConfigSpec.ConfigValue> someScrollTables; @@ -171,6 +167,10 @@ public Server(ForgeConfigSpec.Builder builder) { .defineList("circleActionDenyList", List.of(), Server::isValidReslocArg); builder.pop(); + builder.push("Loot"); + traderScrollChance = builder.comment("The chance for wandering traders to sell an Ancient Scroll") + .defineInRange("traderScrollChance", DEFAULT_TRADER_SCROLL_CHANCE, 0.0, 1.0); + actionDenyList = builder.comment( "Resource locations of disallowed actions. Trying to cast one of these will result in a mishap.") .defineList("actionDenyList", List.of(), Server::isValidReslocArg); @@ -227,6 +227,11 @@ public boolean trueNameHasAmbit() { return doesTrueNameHaveAmbit.get(); } + @Override + public double traderScrollChance() { + return traderScrollChance.get(); + } + private static boolean isValidReslocArg(Object o) { return o instanceof String s && ResourceLocation.isValidResourceLocation(s); } From 04f8446e9e95d6d47cbaa5dd7f2f70a13e453f79 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Tue, 14 Jan 2025 18:26:25 -0500 Subject: [PATCH 04/11] Creative tab for scrolls --- .../hexcasting/common/lib/HexBlocks.java | 4 +-- .../common/lib/HexCreativeTabs.java | 8 +++-- .../hexcasting/common/lib/HexItems.java | 34 +++++++++++++++---- .../patchouli_books/thehexbook/book.json | 2 +- 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java index 97e58a75e..df5792dc5 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java @@ -296,14 +296,14 @@ private static T blockNoItem(String name, T block) { return block; } private static T blockItem(String name, T block) { - return blockItem(name, block, HexItems.props(), HexCreativeTabs.HEX); + return blockItem(name, block, HexItems.props(), HexCreativeTabs.MAIN); } private static T blockItem(String name, T block, @Nullable CreativeModeTab tab) { return blockItem(name, block, HexItems.props(), tab); } private static T blockItem(String name, T block, Item.Properties props) { - return blockItem(name, block, props, HexCreativeTabs.HEX); + return blockItem(name, block, props, HexCreativeTabs.MAIN); } private static T blockItem(String name, T block, Item.Properties props, @Nullable CreativeModeTab tab) { diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexCreativeTabs.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexCreativeTabs.java index 93cfd6301..03f171236 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexCreativeTabs.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexCreativeTabs.java @@ -4,6 +4,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.ItemStack; +import at.petrak.hexcasting.common.items.storage.ItemScroll; import java.util.LinkedHashMap; import java.util.Map; @@ -20,11 +21,14 @@ public static void registerCreativeTabs(BiConsumer TABS = new LinkedHashMap<>(); - public static final CreativeModeTab HEX = register("hexcasting", CreativeModeTab.builder(CreativeModeTab.Row.TOP, 7) + public static final CreativeModeTab MAIN = register("main", CreativeModeTab.builder(CreativeModeTab.Row.TOP, 7) .icon(() -> new ItemStack(HexItems.SPELLBOOK))); + public static final CreativeModeTab SCROLLS = register("scrolls", CreativeModeTab.builder(CreativeModeTab.Row.TOP, 7) + .icon(() -> ItemScroll.withPerWorldPattern(new ItemStack(HexItems.SCROLL_LARGE),""))); + private static CreativeModeTab register(String name, CreativeModeTab.Builder tabBuilder) { - var tab = tabBuilder.title(Component.translatable("itemGroup." + name)).build(); + var tab = tabBuilder.title(Component.translatable("itemGroup.hexcasting." + name)).build(); var old = TABS.put(modLoc(name), tab); if (old != null) { throw new IllegalArgumentException("Typo? Duplicate id " + name); diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java index a85889e10..7d81c959b 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java @@ -1,6 +1,9 @@ package at.petrak.hexcasting.common.lib; import at.petrak.hexcasting.api.misc.MediaConstants; +import at.petrak.hexcasting.api.utils.HexUtils; +import at.petrak.hexcasting.api.casting.ActionRegistryEntry; +import at.petrak.hexcasting.api.mod.HexTags; import at.petrak.hexcasting.common.items.ItemJewelerHammer; import at.petrak.hexcasting.common.items.ItemLens; import at.petrak.hexcasting.common.items.ItemLoreFragment; @@ -14,6 +17,8 @@ import at.petrak.hexcasting.xplat.IXplatAbstractions; import com.google.common.base.Suppliers; import net.minecraft.Util; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.food.FoodProperties; @@ -35,6 +40,7 @@ public static void registerItems(BiConsumer r) { } public static void registerItemCreativeTab(CreativeModeTab.Output r, CreativeModeTab tab) { + if (tab == HexCreativeTabs.SCROLLS) generateScrollEntries(); for (var item : ITEM_TABS.getOrDefault(tab, List.of())) { item.register(r); } @@ -93,24 +99,23 @@ public static void registerItemCreativeTab(CreativeModeTab.Output r, CreativeMod public static final Supplier BATTERY_DUST_STACK = addToTab(() -> ItemMediaBattery.withMedia( new ItemStack(HexItems.BATTERY), MediaConstants.DUST_UNIT * 64, - MediaConstants.DUST_UNIT * 64), HexCreativeTabs.HEX); + MediaConstants.DUST_UNIT * 64), HexCreativeTabs.MAIN); public static final Supplier BATTERY_SHARD_STACK = addToTab(() -> ItemMediaBattery.withMedia( new ItemStack(HexItems.BATTERY), MediaConstants.SHARD_UNIT * 64, - MediaConstants.SHARD_UNIT * 64), HexCreativeTabs.HEX); + MediaConstants.SHARD_UNIT * 64), HexCreativeTabs.MAIN); public static final Supplier BATTERY_CRYSTAL_STACK = addToTab(() -> ItemMediaBattery.withMedia( new ItemStack(HexItems.BATTERY), MediaConstants.CRYSTAL_UNIT * 64, - MediaConstants.CRYSTAL_UNIT * 64), HexCreativeTabs.HEX); + MediaConstants.CRYSTAL_UNIT * 64), HexCreativeTabs.MAIN); public static final Supplier BATTERY_QUENCHED_SHARD_STACK = addToTab(() -> ItemMediaBattery.withMedia( new ItemStack(HexItems.BATTERY), MediaConstants.QUENCHED_SHARD_UNIT * 64, - MediaConstants.QUENCHED_SHARD_UNIT * 64), HexCreativeTabs.HEX); - + MediaConstants.QUENCHED_SHARD_UNIT * 64), HexCreativeTabs.MAIN); public static final Supplier BATTERY_QUENCHED_BLOCK_STACK = addToTab(() -> ItemMediaBattery.withMedia( new ItemStack(HexItems.BATTERY), MediaConstants.QUENCHED_BLOCK_UNIT * 64, - MediaConstants.QUENCHED_BLOCK_UNIT * 64), HexCreativeTabs.HEX); + MediaConstants.QUENCHED_BLOCK_UNIT * 64), HexCreativeTabs.MAIN); public static final EnumMap DYE_PIGMENTS = Util.make(() -> { var out = new EnumMap(DyeColor.class); @@ -155,6 +160,21 @@ public static Item.Properties unstackable() { return props().stacksTo(1); } + private static void generateScrollEntries() { + var keyList = new ArrayList>(); + Registry regi = IXplatAbstractions.INSTANCE.getActionRegistry(); + for (var key : regi.registryKeySet()) + if (HexUtils.isOfTag(regi, key, HexTags.Actions.PER_WORLD_PATTERN)) + keyList.add(key); + keyList.sort( (a, b) -> a.location().compareTo(b.location()) ); + for (var key : keyList) { + addToTab(() -> ItemScroll.withPerWorldPattern( + new ItemStack(HexItems.SCROLL_LARGE), + key.location().toString() + ),HexCreativeTabs.SCROLLS); + } + } + private static T make(ResourceLocation id, T item, @Nullable CreativeModeTab tab) { var old = ITEMS.put(id, item); if (old != null) { @@ -171,7 +191,7 @@ private static T make(String id, T item, @Nullable CreativeMode } private static T make(String id, T item) { - return make(modLoc(id), item, HexCreativeTabs.HEX); + return make(modLoc(id), item, HexCreativeTabs.MAIN); } private static Supplier addToTab(Supplier stack, CreativeModeTab tab) { diff --git a/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/book.json b/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/book.json index 146a1d264..b99fbc81c 100644 --- a/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/book.json +++ b/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/book.json @@ -4,7 +4,7 @@ "version": 1, "show_progress": false, "nameplate_color": "00072b", - "creative_tab": "hexcasting:hexcasting", + "creative_tab": "hexcasting:main", "model": "hexcasting:patchouli_book", "book_texture": "hexcasting:textures/gui/patchi_book.png", "filler_texture": "hexcasting:textures/gui/patchi_filler.png", From cd4c44fa35b94c566fd188899a56d3961bac810b Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Tue, 14 Jan 2025 18:27:07 -0500 Subject: [PATCH 05/11] Assorted lang --- .../hexcasting/lang/en_us.flatten.json5 | 24 +++++++++++-------- .../hexcasting/lang/ru_ru.flatten.json5 | 5 ---- .../hexcasting/lang/zh_cn.flatten.json5 | 5 ---- 3 files changed, 14 insertions(+), 20 deletions(-) diff --git a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 index 1f578be3a..a4194b857 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 +++ b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 @@ -46,7 +46,7 @@ "": "Focus", sealed: "Sealed Focus", }, - + thought_knot: "Thought-Knot", spellbook: "Spellbook", cypher: "Cypher", @@ -252,8 +252,8 @@ }, "itemGroup.hexcasting": { - "": "Hexcasting", - creative_tab: "Hexcasting", + main: "Hex Casting", + scrolls: "Hex Casting (Scrolls)", }, "gui.hexcasting": { @@ -372,6 +372,10 @@ "": "Villagers Offended By Mind Murder", "@Tooltip": "Whether villagers should be angry at the player when other villagers are mindflayed", }, + traderScrollChance: { + "": "Wandering Trader Scroll Chance", + "@Tooltip": "The chance for wandering traders to sell an Ancient Scroll", + }, scrollInjectionsRaw: { "": "Scroll Injection Weights", "@Tooltip": "Maps the names of loot tables to the amount of per-world patterns on scrolls should go in them. There's about a 50% chance to get any scrolls in a given chest marked here; once that is met, between 1 and that many scrolls are generated.", @@ -380,11 +384,6 @@ "": "Amethyst Shard Drop Rate Change", "@Tooltip": "How much the number of amethyst shards dropped from clusters is increased/decreased.", }, - - // TODO: are these used anywhere?? - "fewScrollTables.@Tooltip": "Loot tables that a small number of Ancient Scrolls are injected into", - "someScrollTables.@Tooltip": "Loot tables that a decent number of Ancient Scrolls are injected into", - "manyScrollTables.@Tooltip": "Loot tables that a huge number of Ancient Scrolls are injected into", }, }, }, @@ -498,7 +497,7 @@ all_media: "Entire contents", infinite_media: "Infinite", }, - + // TODO: post-eigengrau make these less anticlimactic message: { cant_overcast: "That Hex needed more media than I had... I should double-check my math.", @@ -521,6 +520,11 @@ }, sealed: "Sealed", }, + + scroll: { + needs_purchase: "Purchase to show pattern", + pattern_not_loaded: "Place in inventory to load pattern", + }, abacus: { "": "%d", @@ -1476,7 +1480,7 @@ "2": "Like a $(l:items/focus)$(item)Focus/$, there exists a simple method to prevent accidental overwriting. Crafting it with a $(item)Honeycomb/$ will lacquer the current page, preventing $(l:patterns/readwrite#hexcasting:write)$(action)Scribe's Gambit/$ from modifying its contents. Also like a $(l:items/focus)$(item)Focus/$, using $(l:patterns/spells/hexcasting#hexcasting:erase)$(action)Erase Item/$ will remove the lacquer along with the page's contents.$(br2)I can also name each page individually in an anvil. Naming it will change only the name of the currently selected page, for easy browsing.", "crafting.desc": "$(italic)Wizards love words. Most of them read a great deal, and indeed one strong sign of a potential wizard is the inability to get to sleep without reading something first.", }, - + scroll: { "1": "A $(l:items/scroll)$(item)Scroll/$ is a convenient method of sharing a pattern with others. I can copy a pattern onto one with $(l:patterns/readwrite#hexcasting:write)$(action)Scribe's Gambit/$, after which it will display in a tooltip.$(br2)I can also place them on the wall as decoration or edification, like a painting, in sizes from 1x1 to 3x3 blocks. Using $(l:items/amethyst)$(item)Amethyst Dust/$ on such a scroll will have it display the stroke order.", "2": "In addition, I can also find so-called $(l:items/scroll)$(item)Ancient Scrolls/$ in the dungeons and strongholds of the world. These contain the stroke order of $(thing)Great Spells/$, powerful magicks rumored to be too powerful for the hands and minds of mortals...$(br2)If those \"mortals\" couldn't cast them, I'm not sure they deserve to know them.", diff --git a/Common/src/main/resources/assets/hexcasting/lang/ru_ru.flatten.json5 b/Common/src/main/resources/assets/hexcasting/lang/ru_ru.flatten.json5 index 3abbcc31f..087963f6f 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/ru_ru.flatten.json5 +++ b/Common/src/main/resources/assets/hexcasting/lang/ru_ru.flatten.json5 @@ -335,11 +335,6 @@ "": "Amethyst Shard Drop Rate Change", "@Tooltip": "How much the number of amethyst shards dropped from clusters is increased/decreased.", }, - - // TODO: are these used anywhere?? - "fewScrollTables.@Tooltip": "Loot tables that a small number of Ancient Scrolls are injected into", - "someScrollTables.@Tooltip": "Loot tables that a decent number of Ancient Scrolls are injected into", - "manyScrollTables.@Tooltip": "Loot tables that a huge number of Ancient Scrolls are injected into", }, }, }, diff --git a/Common/src/main/resources/assets/hexcasting/lang/zh_cn.flatten.json5 b/Common/src/main/resources/assets/hexcasting/lang/zh_cn.flatten.json5 index 3bb31e0dd..92866af53 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/zh_cn.flatten.json5 +++ b/Common/src/main/resources/assets/hexcasting/lang/zh_cn.flatten.json5 @@ -380,11 +380,6 @@ "": "紫水晶碎片掉落率变化量", "@Tooltip": "采掘紫水晶簇时紫水晶碎片掉落数量相较原版的改变量", }, - - // TODO: are these used anywhere?? - "option.server.fewScrollTables.@Tooltip": "会额外生成较少数量卷轴的战利品表", - "option.server.someScrollTables.@Tooltip": "会额外生成中等数量卷轴的战利品表", - "option.server.manyScrollTables.@Tooltip": "会额外生成较大数量卷轴的战利品表", }, }, }, From 6230aa7b1d6d40b82f0c616f833b2754cd4c9e6c Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Thu, 23 Jan 2025 18:41:07 -0500 Subject: [PATCH 06/11] Move op_id pattern-loading into ItemScroll --- .../common/items/storage/ItemScroll.java | 11 ++++++++-- .../loot/AddPerWorldPatternToScrollFunc.java | 22 ++++++------------- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemScroll.java b/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemScroll.java index 91a953735..4fadd9bf5 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemScroll.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemScroll.java @@ -9,14 +9,16 @@ import at.petrak.hexcasting.common.entities.EntityWallScroll; import at.petrak.hexcasting.common.lib.hex.HexIotaTypes; import at.petrak.hexcasting.common.misc.PatternTooltip; -import at.petrak.hexcasting.common.loot.AddPerWorldPatternToScrollFunc; +import at.petrak.hexcasting.common.casting.PatternRegistryManifest; import at.petrak.hexcasting.interop.inline.InlinePatternData; +import at.petrak.hexcasting.xplat.IXplatAbstractions; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.ResourceKey; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; @@ -170,7 +172,12 @@ public void inventoryTick(ItemStack pStack, Level pLevel, Entity pEntity, int pS } // if op_id is set but there's no stored pattern, load the pattern on inv tick if (NBTHelper.hasString(pStack, TAG_OP_ID) && !NBTHelper.hasCompound(pStack, TAG_PATTERN) && pEntity.getServer() != null) { - AddPerWorldPatternToScrollFunc.doStatic(pStack, pLevel.getRandom(), pEntity.getServer().overworld()); + var patternKey = ResourceKey.create( + IXplatAbstractions.INSTANCE.getActionRegistry().key(), + ResourceLocation.tryParse(NBTHelper.getString(pStack, TAG_OP_ID)) + ); + var pat = PatternRegistryManifest.getCanonicalStrokesPerWorld(patternKey, pEntity.getServer().overworld()); + NBTHelper.put(pStack, TAG_PATTERN, pat.serializeToNBT()); } } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/loot/AddPerWorldPatternToScrollFunc.java b/Common/src/main/java/at/petrak/hexcasting/common/loot/AddPerWorldPatternToScrollFunc.java index 1a972bc02..0d45634db 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/loot/AddPerWorldPatternToScrollFunc.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/loot/AddPerWorldPatternToScrollFunc.java @@ -40,24 +40,16 @@ public AddPerWorldPatternToScrollFunc(LootItemCondition[] lootItemConditions) { * This doesn't actually have any params so extract behaviour out for the benefit of forge */ public static ItemStack doStatic(ItemStack stack, RandomSource rand, ServerLevel overworld) { - ResourceKey patternKey; - if (NBTHelper.hasString(stack, ItemScroll.TAG_OP_ID)) { - patternKey = ResourceKey.create( - IXplatAbstractions.INSTANCE.getActionRegistry().key(), - ResourceLocation.tryParse(NBTHelper.getString(stack, ItemScroll.TAG_OP_ID)) - ); - } else { - var perWorldKeys = new ArrayList>(); - Registry regi = IXplatAbstractions.INSTANCE.getActionRegistry(); - for (var key : regi.registryKeySet()) { - if (HexUtils.isOfTag(regi, key, HexTags.Actions.PER_WORLD_PATTERN)) { - perWorldKeys.add(key); - } + var perWorldKeys = new ArrayList>(); + Registry regi = IXplatAbstractions.INSTANCE.getActionRegistry(); + for (var key : regi.registryKeySet()) { + if (HexUtils.isOfTag(regi, key, HexTags.Actions.PER_WORLD_PATTERN)) { + perWorldKeys.add(key); } - patternKey = perWorldKeys.get(rand.nextInt(perWorldKeys.size())); - NBTHelper.putString(stack, ItemScroll.TAG_OP_ID, patternKey.location().toString()); } + var patternKey = perWorldKeys.get(rand.nextInt(perWorldKeys.size())); var pat = PatternRegistryManifest.getCanonicalStrokesPerWorld(patternKey, overworld); + NBTHelper.putString(stack, ItemScroll.TAG_OP_ID, patternKey.location().toString()); NBTHelper.put(stack, ItemScroll.TAG_PATTERN, pat.serializeToNBT()); return stack; } From 3bf9689eb0448c0e63feb22646b2ab4419215c1e Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Thu, 23 Jan 2025 18:47:46 -0500 Subject: [PATCH 07/11] Clamp trader scroll chance between 0 and 1 --- .../main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java b/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java index b3eeadde6..e64af0136 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java @@ -215,6 +215,7 @@ public static final class Server implements HexConfig.ServerConfigAccess, Config public void validatePostLoad() throws ValidationException { this.maxOpCount = Math.max(this.maxOpCount, 0); this.maxSpellCircleLength = Math.max(this.maxSpellCircleLength, 4); + this.traderScrollChance = Mth.clamp(this.traderScrollChance, 0.0, 1.0); this.scrollInjections = new Object2IntOpenHashMap<>(); try { From f30d22eb281eb3dfb1392b5150f5bb622424c689 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Thu, 23 Jan 2025 19:04:06 -0500 Subject: [PATCH 08/11] Revert name change of main creative tab to unbreak addon compat --- .../at/petrak/hexcasting/common/lib/HexBlocks.java | 4 ++-- .../hexcasting/common/lib/HexCreativeTabs.java | 2 +- .../at/petrak/hexcasting/common/lib/HexItems.java | 12 ++++++------ .../assets/hexcasting/lang/en_us.flatten.json5 | 2 +- .../assets/hexcasting/lang/ru_ru.flatten.json5 | 4 ++-- .../assets/hexcasting/lang/zh_cn.flatten.json5 | 4 ++-- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java index df5792dc5..97e58a75e 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexBlocks.java @@ -296,14 +296,14 @@ private static T blockNoItem(String name, T block) { return block; } private static T blockItem(String name, T block) { - return blockItem(name, block, HexItems.props(), HexCreativeTabs.MAIN); + return blockItem(name, block, HexItems.props(), HexCreativeTabs.HEX); } private static T blockItem(String name, T block, @Nullable CreativeModeTab tab) { return blockItem(name, block, HexItems.props(), tab); } private static T blockItem(String name, T block, Item.Properties props) { - return blockItem(name, block, props, HexCreativeTabs.MAIN); + return blockItem(name, block, props, HexCreativeTabs.HEX); } private static T blockItem(String name, T block, Item.Properties props, @Nullable CreativeModeTab tab) { diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexCreativeTabs.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexCreativeTabs.java index 03f171236..03d8b2661 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexCreativeTabs.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexCreativeTabs.java @@ -21,7 +21,7 @@ public static void registerCreativeTabs(BiConsumer TABS = new LinkedHashMap<>(); - public static final CreativeModeTab MAIN = register("main", CreativeModeTab.builder(CreativeModeTab.Row.TOP, 7) + public static final CreativeModeTab HEX = register("hexcasting", CreativeModeTab.builder(CreativeModeTab.Row.TOP, 7) .icon(() -> new ItemStack(HexItems.SPELLBOOK))); public static final CreativeModeTab SCROLLS = register("scrolls", CreativeModeTab.builder(CreativeModeTab.Row.TOP, 7) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java index 7d81c959b..9f7e3d8d8 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/lib/HexItems.java @@ -99,23 +99,23 @@ public static void registerItemCreativeTab(CreativeModeTab.Output r, CreativeMod public static final Supplier BATTERY_DUST_STACK = addToTab(() -> ItemMediaBattery.withMedia( new ItemStack(HexItems.BATTERY), MediaConstants.DUST_UNIT * 64, - MediaConstants.DUST_UNIT * 64), HexCreativeTabs.MAIN); + MediaConstants.DUST_UNIT * 64), HexCreativeTabs.HEX); public static final Supplier BATTERY_SHARD_STACK = addToTab(() -> ItemMediaBattery.withMedia( new ItemStack(HexItems.BATTERY), MediaConstants.SHARD_UNIT * 64, - MediaConstants.SHARD_UNIT * 64), HexCreativeTabs.MAIN); + MediaConstants.SHARD_UNIT * 64), HexCreativeTabs.HEX); public static final Supplier BATTERY_CRYSTAL_STACK = addToTab(() -> ItemMediaBattery.withMedia( new ItemStack(HexItems.BATTERY), MediaConstants.CRYSTAL_UNIT * 64, - MediaConstants.CRYSTAL_UNIT * 64), HexCreativeTabs.MAIN); + MediaConstants.CRYSTAL_UNIT * 64), HexCreativeTabs.HEX); public static final Supplier BATTERY_QUENCHED_SHARD_STACK = addToTab(() -> ItemMediaBattery.withMedia( new ItemStack(HexItems.BATTERY), MediaConstants.QUENCHED_SHARD_UNIT * 64, - MediaConstants.QUENCHED_SHARD_UNIT * 64), HexCreativeTabs.MAIN); + MediaConstants.QUENCHED_SHARD_UNIT * 64), HexCreativeTabs.HEX); public static final Supplier BATTERY_QUENCHED_BLOCK_STACK = addToTab(() -> ItemMediaBattery.withMedia( new ItemStack(HexItems.BATTERY), MediaConstants.QUENCHED_BLOCK_UNIT * 64, - MediaConstants.QUENCHED_BLOCK_UNIT * 64), HexCreativeTabs.MAIN); + MediaConstants.QUENCHED_BLOCK_UNIT * 64), HexCreativeTabs.HEX); public static final EnumMap DYE_PIGMENTS = Util.make(() -> { var out = new EnumMap(DyeColor.class); @@ -191,7 +191,7 @@ private static T make(String id, T item, @Nullable CreativeMode } private static T make(String id, T item) { - return make(modLoc(id), item, HexCreativeTabs.MAIN); + return make(modLoc(id), item, HexCreativeTabs.HEX); } private static Supplier addToTab(Supplier stack, CreativeModeTab tab) { diff --git a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 index a4194b857..62996626f 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 +++ b/Common/src/main/resources/assets/hexcasting/lang/en_us.flatten.json5 @@ -252,7 +252,7 @@ }, "itemGroup.hexcasting": { - main: "Hex Casting", + hexcasting: "Hex Casting", scrolls: "Hex Casting (Scrolls)", }, diff --git a/Common/src/main/resources/assets/hexcasting/lang/ru_ru.flatten.json5 b/Common/src/main/resources/assets/hexcasting/lang/ru_ru.flatten.json5 index 087963f6f..45889fe33 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/ru_ru.flatten.json5 +++ b/Common/src/main/resources/assets/hexcasting/lang/ru_ru.flatten.json5 @@ -211,8 +211,8 @@ }, "itemGroup.hexcasting": { - "": "Hexcasting", - creative_tab: "Hexcasting", + hexcasting: "Hex Casting", + scrolls: "Hex Casting (Scrolls)", }, "gui.hexcasting": { diff --git a/Common/src/main/resources/assets/hexcasting/lang/zh_cn.flatten.json5 b/Common/src/main/resources/assets/hexcasting/lang/zh_cn.flatten.json5 index 92866af53..17a02792d 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/zh_cn.flatten.json5 +++ b/Common/src/main/resources/assets/hexcasting/lang/zh_cn.flatten.json5 @@ -252,8 +252,8 @@ }, "itemGroup.hexcasting": { - "": "咒法学", - creative_tab: "咒法学", + hexcasting: "咒法学", + scrolls: "咒法学", }, "gui.hexcasting": { From 213429512b9eb119f5df9376eacc67c8dab29d84 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Thu, 23 Jan 2025 21:10:30 -0500 Subject: [PATCH 09/11] Make scroll trade replace special trade instead of one of the 5 junks --- .../src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java | 2 +- .../java/at/petrak/hexcasting/mixin/MixinWanderingTrader.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java b/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java index 845bf7209..b6e6d952b 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/mod/HexConfig.java @@ -80,7 +80,7 @@ public interface ServerConfigAccess { int DEFAULT_MAX_SPELL_CIRCLE_LENGTH = 1024; int DEFAULT_OP_BREAK_HARVEST_LEVEL = 3; - double DEFAULT_TRADER_SCROLL_CHANCE = 0.4; + double DEFAULT_TRADER_SCROLL_CHANCE = 0.2; boolean DEFAULT_VILLAGERS_DISLIKE_MIND_MURDER = true; diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinWanderingTrader.java b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinWanderingTrader.java index 6972090d5..c2dbcf67b 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinWanderingTrader.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinWanderingTrader.java @@ -31,7 +31,7 @@ private void addNewTrades(CallbackInfo ci) { ItemStack scroll = new ItemStack(HexItems.SCROLL_LARGE); AddPerWorldPatternToScrollFunc.doStatic(scroll, rand, self.getServer().overworld()); NBTHelper.putBoolean(scroll, ItemScroll.TAG_NEEDS_PURCHASE, true); - offerList.set(rand.nextInt(5), new MerchantOffer(new ItemStack(Items.EMERALD, 12), scroll, 1, 1, 1)); + offerList.set(5, new MerchantOffer(new ItemStack(Items.EMERALD, 12), scroll, 1, 1, 1)); } } } From 248ca92d7fc201710c785709433109a474604103 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Fri, 24 Jan 2025 19:26:53 -0500 Subject: [PATCH 10/11] Fixed crash with invalid op_id on unloaded scroll --- .../hexcasting/common/items/storage/ItemScroll.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemScroll.java b/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemScroll.java index 4fadd9bf5..1bea5dfec 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemScroll.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemScroll.java @@ -170,12 +170,15 @@ public void inventoryTick(ItemStack pStack, Level pLevel, Entity pEntity, int pS if (NBTHelper.getBoolean(pStack, TAG_NEEDS_PURCHASE)) { NBTHelper.remove(pStack, TAG_NEEDS_PURCHASE); } - // if op_id is set but there's no stored pattern, load the pattern on inv tick + // if op_id is set but there's no stored pattern, attempt to load the pattern on inv tick if (NBTHelper.hasString(pStack, TAG_OP_ID) && !NBTHelper.hasCompound(pStack, TAG_PATTERN) && pEntity.getServer() != null) { - var patternKey = ResourceKey.create( - IXplatAbstractions.INSTANCE.getActionRegistry().key(), - ResourceLocation.tryParse(NBTHelper.getString(pStack, TAG_OP_ID)) - ); + var opID = ResourceLocation.tryParse(NBTHelper.getString(pStack, TAG_OP_ID)); + if (opID == null) { + // if the provided op_id is invalid, remove it so we don't keep trying every tick + NBTHelper.remove(pStack, TAG_OP_ID); + return; + } + var patternKey = ResourceKey.create(IXplatAbstractions.INSTANCE.getActionRegistry().key(), opID); var pat = PatternRegistryManifest.getCanonicalStrokesPerWorld(patternKey, pEntity.getServer().overworld()); NBTHelper.put(pStack, TAG_PATTERN, pat.serializeToNBT()); } From c04d6d27c9a9cec7d26509ccfc66bb58cde549d6 Mon Sep 17 00:00:00 2001 From: Robotgiggle Date: Mon, 3 Feb 2025 17:37:11 -0500 Subject: [PATCH 11/11] Cleanup --- .../java/at/petrak/hexcasting/mixin/MixinWanderingTrader.java | 2 +- .../data/hexcasting/patchouli_books/thehexbook/book.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinWanderingTrader.java b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinWanderingTrader.java index c2dbcf67b..6ccfa837f 100644 --- a/Common/src/main/java/at/petrak/hexcasting/mixin/MixinWanderingTrader.java +++ b/Common/src/main/java/at/petrak/hexcasting/mixin/MixinWanderingTrader.java @@ -17,7 +17,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -// Adds ancient scrolls to the wandering trader by replacing one of the 5 junk trades +// Adds ancient scrolls to the wandering trader by replacing the special trade in the last slot @Mixin(WanderingTrader.class) public class MixinWanderingTrader { @Inject(method = "updateTrades", at = @At("RETURN")) diff --git a/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/book.json b/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/book.json index b99fbc81c..146a1d264 100644 --- a/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/book.json +++ b/Common/src/main/resources/data/hexcasting/patchouli_books/thehexbook/book.json @@ -4,7 +4,7 @@ "version": 1, "show_progress": false, "nameplate_color": "00072b", - "creative_tab": "hexcasting:main", + "creative_tab": "hexcasting:hexcasting", "model": "hexcasting:patchouli_book", "book_texture": "hexcasting:textures/gui/patchi_book.png", "filler_texture": "hexcasting:textures/gui/patchi_filler.png",