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 19458cbc8e..b6e6d952bc 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.2; + 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/common/items/storage/ItemScroll.java b/Common/src/main/java/at/petrak/hexcasting/common/items/storage/ItemScroll.java index 036e5129b4..1bea5dfec5 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,47 @@ 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.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; 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 +59,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 +151,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 +163,47 @@ 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, attempt to load the pattern on inv tick + if (NBTHelper.hasString(pStack, TAG_OP_ID) && !NBTHelper.hasCompound(pStack, TAG_PATTERN) && pEntity.getServer() != null) { + 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()); + } + } + + @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)); } 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 93cfd63011..03d8b26615 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; @@ -23,8 +24,11 @@ public static void registerCreativeTabs(BiConsumer 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 9e921b153f..aa05c96c8a 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); } @@ -107,7 +113,6 @@ public static void registerItemCreativeTab(CreativeModeTab.Output r, CreativeMod new ItemStack(HexItems.BATTERY), MediaConstants.QUENCHED_SHARD_UNIT * 64, 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, @@ -156,6 +161,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) { 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 30c9f97370..0d45634db4 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,8 +39,7 @@ 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(); + public static ItemStack doStatic(ItemStack stack, RandomSource rand, ServerLevel overworld) { var perWorldKeys = new ArrayList>(); Registry regi = IXplatAbstractions.INSTANCE.getActionRegistry(); for (var key : regi.registryKeySet()) { @@ -44,21 +47,16 @@ public static ItemStack doStatic(ItemStack stack, LootContext ctx) { perWorldKeys.add(key); } } - 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 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; } @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/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 0000000000..6ccfa837fc --- /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 the special trade in the last slot +@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(5, new MerchantOffer(new ItemStack(Items.EMERALD, 12), scroll, 1, 1, 1)); + } + } +} 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 184276c8d5..af284b7a69 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 @@ -257,8 +257,8 @@ }, "itemGroup.hexcasting": { - "": "Hexcasting", - creative_tab: "Hexcasting", + hexcasting: "Hex Casting", + scrolls: "Hex Casting (Scrolls)", }, "gui.hexcasting": { @@ -377,6 +377,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.", @@ -401,11 +405,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", }, }, }, @@ -561,6 +560,11 @@ }, sealed: "Sealed", }, + + scroll: { + needs_purchase: "Purchase to show pattern", + pattern_not_loaded: "Place in inventory to load pattern", + }, abacus: { "": "%d", 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 3abbcc31fd..45889fe332 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": { @@ -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 eb54ea71c6..59d9b0d847 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": { @@ -380,11 +380,6 @@ "": "紫水晶碎片掉落率变化量", "@Tooltip": "采掘紫水晶簇时紫水晶碎片掉落数量相较原版的改变量", }, - - // TODO: are these used anywhere?? - "option.server.fewScrollTables.@Tooltip": "会额外生成较少数量卷轴的战利品表", - "option.server.someScrollTables.@Tooltip": "会额外生成中等数量卷轴的战利品表", - "option.server.manyScrollTables.@Tooltip": "会额外生成较大数量卷轴的战利品表", }, }, }, diff --git a/Common/src/main/resources/hexplat.mixins.json b/Common/src/main/resources/hexplat.mixins.json index 1d2ac13000..a70b99261b 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 f79bd58361..c4d365cb17 100644 --- a/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java +++ b/Fabric/src/main/java/at/petrak/hexcasting/fabric/FabricHexConfig.java @@ -185,10 +185,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 @@ -225,6 +226,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 { @@ -304,6 +306,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 a70691061d..bacdece12a 100644 --- a/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java +++ b/Forge/src/main/java/at/petrak/hexcasting/forge/ForgeHexConfig.java @@ -134,17 +134,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; @@ -172,6 +168,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); @@ -228,6 +228,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); } 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 ffae0a85ce..fe1a2dda87 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;