Skip to content

Commit 86f23e5

Browse files
committed
New Mechanics
+Added Chinese translation. +Armor type Relics can now be repaired with Relic Shards. +Armor type Relics can now be affixed to chestplates and helmets: equip a chestplate/helmet, then shift-right click whilst holding a Relic. Note that this cannot be undone and this can only be done once per armor piece. *Item sounds for the Orbs of Regret and Tomes are now volume controlled by PlayerEx client config. *Updated Fabric Loader/API versions.
1 parent ce1560a commit 86f23e5

File tree

12 files changed

+241
-22
lines changed

12 files changed

+241
-22
lines changed

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,13 @@ All randomness and chance to drop is weighted and fully configurable.
3535
#### Misc
3636

3737
- Unwanted Relics can be smelted down into Relic Shards, which can be smashed to drop Experience Points.
38+
- Chest and Head Relics can be affixed to chestplates and helmets by equipping an armor item and right-clicking the Relic whilst crouching.
39+
- Chest and Head Relics can be repaired with Relic Shards.
3840
- Health Potions cannot be stored, they heal the instant that they are picked up.
3941
- The Dragon Stone drops from the Ender Dragon upon death (configurable). Care should be taken when handling it as using it will reset the player's attributes, Levels and Skill Points. For this sake a safety is implemented, such that it must be right-clicked twice.
4042

4143
#### Contributors/Credits
4244

4345
- [Bonsaiheldin](https://opengameart.org/content/shiny-rpg-potions-16x16)
44-
- [Joe Williamson](https://twitter.com/joecreates)
46+
- [Joe Williamson](https://twitter.com/joecreates)
47+
- [MoneySoup008](https://github.com/MoneySoup008)

gradle.properties

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
org.gradle.jvmargs=-Xmx1G
22

33
minecraft_version=1.18.2
4-
yarn_mappings=1.18.2+build.3
5-
loader_version=0.14.6
4+
yarn_mappings=1.18.2+build.4
5+
loader_version=0.14.10
66

7-
mod_version = 3.1.4
7+
mod_version = 3.1.5
88
maven_group = com.github.clevernucleus
99
archives_base_name = relicex
1010

11-
fabric_version=0.58.0+1.18.2
11+
fabric_version=0.66.0+1.18.2
1212
dataattributes_version=1.1.12
1313
opc_version=0.5.2
1414
cardinal_components_version=4.2.0
1515
placeholder_api=1.1.3+1.17.1
1616
playerex_version=3.2.7
1717
arl_version=0.1.3
1818
trinkets_version=3.3.1
19-
cloth_config_version=6.2.62
20-
modmenu_version=3.2.2
19+
cloth_config_version=6.3.81
20+
modmenu_version=3.2.4

src/main/java/com/github/clevernucleus/relicex/impl/EntityAttributeCollection.java

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.github.clevernucleus.relicex.impl;
22

3+
import java.util.ArrayList;
34
import java.util.HashMap;
5+
import java.util.List;
46
import java.util.Map;
57
import java.util.function.BiConsumer;
68
import java.util.function.Consumer;
@@ -66,7 +68,7 @@ private static float randomAttribute(EntityAttributeCollection collection) {
6668
}) + (0.3F * weight.rarity());
6769
}
6870

69-
public static void readFromNbt(NbtCompound tag, String slot, Multimap<EntityAttribute, EntityAttributeModifier> modifiers) {
71+
public static void readFromNbt(NbtCompound tag, String slot, Multimap<EntityAttribute, EntityAttributeModifier> modifiersNBT, Multimap<EntityAttribute, EntityAttributeModifier> modifiersITM) {
7072
if(!tag.contains(KEY_ATTRIBUTES, NbtType.LIST)) return;
7173
NbtList list = tag.getList(KEY_ATTRIBUTES, NbtType.COMPOUND);
7274

@@ -78,12 +80,42 @@ public static void readFromNbt(NbtCompound tag, String slot, Multimap<EntityAttr
7880
if(attribute.get() == null) continue;
7981
Operation operation = Operation.fromId((int)entry.getByte(KEY_OPERATION));
8082
EntityAttributeModifier modifier = new EntityAttributeModifier(SlotKey.from(slot).uuid(), "RelicEx Modifier", entry.getDouble(KEY_VALUE), operation);
81-
modifiers.put(attribute.get(), modifier);
83+
modifiersNBT.put(attribute.get(), modifier);
84+
}
85+
86+
for(EntityAttribute attributeITM : modifiersITM.keySet()) {
87+
var collectionITM = modifiersITM.get(attributeITM);
88+
89+
if(modifiersNBT.containsKey(attributeITM)) {
90+
List<EntityAttributeModifier> temp = new ArrayList<>();
91+
var collectionNBT = modifiersNBT.get(attributeITM);
92+
93+
for(EntityAttributeModifier modifierITM : collectionITM) {
94+
Operation operationITM = modifierITM.getOperation();
95+
96+
for(EntityAttributeModifier modifierNBT : collectionNBT) {
97+
Operation operationNBT = modifierNBT.getOperation();
98+
99+
if(operationITM == operationNBT) {
100+
EntityAttributeModifier modifier3 = new EntityAttributeModifier(modifierITM.getId(), "RelicEx Modifier", Math.max(modifierITM.getValue(), modifierNBT.getValue()), operationITM);
101+
temp.add(modifier3);
102+
} else {
103+
temp.add(modifierITM);
104+
temp.add(modifierNBT);
105+
}
106+
}
107+
}
108+
109+
modifiersNBT.removeAll(attributeITM);
110+
modifiersNBT.putAll(attributeITM, temp);
111+
} else {
112+
modifiersNBT.putAll(attributeITM, collectionITM);
113+
}
82114
}
83115
}
84116

85-
public static float getValueIfArmor(NbtCompound tag, EntityAttribute attributeIn) {
86-
if(!tag.contains(KEY_ATTRIBUTES, NbtType.LIST)) return 0.0F;
117+
public static float getValueIfArmor(NbtCompound tag, EntityAttribute attributeIn, float fallback) {
118+
if(!tag.contains(KEY_ATTRIBUTES, NbtType.LIST)) return fallback;
87119
NbtList list = tag.getList(KEY_ATTRIBUTES, NbtType.COMPOUND);
88120

89121
for(int i = 0; i < list.size(); i++) {
@@ -95,7 +127,7 @@ public static float getValueIfArmor(NbtCompound tag, EntityAttribute attributeIn
95127
return (float)entry.getDouble(KEY_VALUE);
96128
}
97129

98-
return 0.0F;
130+
return fallback;
99131
}
100132

101133
public void writeToNbt(NbtCompound tag) {

src/main/java/com/github/clevernucleus/relicex/item/ArmorRelicItem.java

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.List;
44

55
import com.github.clevernucleus.dataattributes.api.item.ItemHelper;
6+
import com.github.clevernucleus.relicex.RelicEx;
67
import com.github.clevernucleus.relicex.impl.EntityAttributeCollection;
78
import com.github.clevernucleus.relicex.impl.Rareness;
89
import com.github.clevernucleus.relicex.impl.RelicType;
@@ -15,14 +16,20 @@
1516
import net.minecraft.entity.attribute.EntityAttribute;
1617
import net.minecraft.entity.attribute.EntityAttributeModifier;
1718
import net.minecraft.entity.attribute.EntityAttributes;
19+
import net.minecraft.entity.mob.MobEntity;
20+
import net.minecraft.entity.player.PlayerEntity;
1821
import net.minecraft.item.ArmorItem;
1922
import net.minecraft.item.ArmorMaterials;
2023
import net.minecraft.item.Item;
2124
import net.minecraft.item.ItemGroup;
2225
import net.minecraft.item.ItemStack;
2326
import net.minecraft.nbt.NbtCompound;
27+
import net.minecraft.nbt.NbtList;
28+
import net.minecraft.sound.SoundCategory;
2429
import net.minecraft.sound.SoundEvent;
2530
import net.minecraft.text.Text;
31+
import net.minecraft.util.Hand;
32+
import net.minecraft.util.TypedActionResult;
2633
import net.minecraft.world.World;
2734

2835
public class ArmorRelicItem extends ArmorItem implements ItemHelper {
@@ -46,11 +53,42 @@ public void onStackCreated(ItemStack itemStack, int count) {
4653
collection.writeToNbt(tag);
4754
}
4855

56+
@Override
57+
public TypedActionResult<ItemStack> use(World world, PlayerEntity user, Hand hand) {
58+
if(!user.isSneaking()) return super.use(world, user, hand);
59+
60+
ItemStack itemStack = user.getStackInHand(hand);
61+
EquipmentSlot equipmentSlot = MobEntity.getPreferredEquipmentSlot(itemStack);
62+
ItemStack itemStack2 = user.getEquippedStack(equipmentSlot);
63+
Item item = itemStack2.getItem();
64+
65+
if(item instanceof ArmorItem && !(item instanceof ArmorRelicItem)) {
66+
NbtCompound tag2 = itemStack2.getOrCreateNbt();
67+
68+
if(!tag2.contains(EntityAttributeCollection.KEY_ATTRIBUTES)) {
69+
if(!world.isClient) {
70+
NbtCompound tag = itemStack.getOrCreateNbt();
71+
NbtList list = tag.getList(EntityAttributeCollection.KEY_ATTRIBUTES, NbtType.COMPOUND);
72+
String rareness = tag.getString(EntityAttributeCollection.KEY_RARENESS);
73+
tag2.put(EntityAttributeCollection.KEY_ATTRIBUTES, list);
74+
tag2.putString(EntityAttributeCollection.KEY_RARENESS, rareness);
75+
} else {
76+
user.playSound(this.getEquipSound(itemStack), SoundCategory.NEUTRAL, 0.75F, 1.0F);
77+
}
78+
79+
itemStack.setCount(0);
80+
return TypedActionResult.success(itemStack, world.isClient);
81+
}
82+
}
83+
84+
return super.use(world, user, hand);
85+
}
86+
4987
@Override
5088
public Multimap<EntityAttribute, EntityAttributeModifier> getAttributeModifiers(ItemStack stack, EquipmentSlot slot) {
5189
NbtCompound tag = stack.getOrCreateNbt();
5290
Multimap<EntityAttribute, EntityAttributeModifier> modifiers = ArrayListMultimap.create();
53-
EntityAttributeCollection.readFromNbt(tag, this.slot.getName(), modifiers);
91+
EntityAttributeCollection.readFromNbt(tag, this.slot.getName(), modifiers, ArrayListMultimap.create());
5492

5593
return slot == this.slot ? modifiers : super.getAttributeModifiers(stack, slot);
5694
}
@@ -62,17 +100,17 @@ public int getEnchantability() {
62100

63101
@Override
64102
public boolean canRepair(ItemStack stack, ItemStack ingredient) {
65-
return false;
103+
return ingredient.isOf(RelicEx.RELIC_SHARD);
66104
}
67105

68106
@Override
69107
public int getProtection(ItemStack itemStack) {
70-
return (int)EntityAttributeCollection.getValueIfArmor(itemStack.getOrCreateNbt(), EntityAttributes.GENERIC_ARMOR);
108+
return (int)EntityAttributeCollection.getValueIfArmor(itemStack.getOrCreateNbt(), EntityAttributes.GENERIC_ARMOR, 0.0F);
71109
}
72110

73111
@Override
74112
public float getToughness(ItemStack itemStack) {
75-
return EntityAttributeCollection.getValueIfArmor(itemStack.getOrCreateNbt(), EntityAttributes.GENERIC_ARMOR_TOUGHNESS);
113+
return EntityAttributeCollection.getValueIfArmor(itemStack.getOrCreateNbt(), EntityAttributes.GENERIC_ARMOR_TOUGHNESS, 0.0F);
76114
}
77115

78116
@Override

src/main/java/com/github/clevernucleus/relicex/item/OrbOfRegretItem.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public TypedActionResult<ItemStack> use(World world, PlayerEntity user, Hand han
5353

5454
if(!(value > 0.0D) || !(refundPoints > 0)) return super.use(world, user, hand);
5555
if(world.isClient) {
56-
user.playSound(RelicEx.LEVEL_REFUND_SOUND, SoundCategory.NEUTRAL, 0.75F, 1.0F);
56+
user.playSound(RelicEx.LEVEL_REFUND_SOUND, SoundCategory.NEUTRAL, ExAPI.getConfig().skillUpVolume(), 1.0F);
5757
} else {
5858
playerData.addRefundPoints(this.greater ? refundPoints : 1);
5959

src/main/java/com/github/clevernucleus/relicex/item/RelicItem.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.github.clevernucleus.relicex.impl.EntityAttributeCollection;
88
import com.github.clevernucleus.relicex.impl.Rareness;
99
import com.github.clevernucleus.relicex.impl.RelicType;
10+
import com.google.common.collect.ArrayListMultimap;
1011
import com.google.common.collect.Multimap;
1112

1213
import dev.emi.trinkets.api.SlotReference;
@@ -59,7 +60,7 @@ public Multimap<EntityAttribute, EntityAttributeModifier> getModifiers(ItemStack
5960
String key = slotType.getGroup() + "/" + slotType.getName();
6061
NbtCompound tag = stack.getOrCreateNbt();
6162
var modifiers = super.getModifiers(stack, slot, entity, uuid);
62-
EntityAttributeCollection.readFromNbt(tag, key, modifiers);
63+
EntityAttributeCollection.readFromNbt(tag, key, modifiers, ArrayListMultimap.create());
6364

6465
return modifiers;
6566
}

src/main/java/com/github/clevernucleus/relicex/item/TomeItem.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public TypedActionResult<ItemStack> use(World world, PlayerEntity user, Hand han
4848
ExConfig config = ExAPI.getConfig();
4949

5050
if(world.isClient) {
51-
user.playSound(RelicEx.LEVEL_REFUND_SOUND, SoundCategory.NEUTRAL, 0.75F, 1.0F);
51+
user.playSound(RelicEx.LEVEL_REFUND_SOUND, SoundCategory.NEUTRAL, ExAPI.getConfig().levelUpVolume(), 1.0F);
5252
} else {
5353
playerData.add(ExAPI.LEVEL, 1);
5454
playerData.addSkillPoints(config.skillPointsPerLevelUp());
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.github.clevernucleus.relicex.mixin;
2+
3+
import java.util.List;
4+
5+
import org.spongepowered.asm.mixin.Final;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.Shadow;
8+
9+
import com.github.clevernucleus.dataattributes.api.item.ItemHelper;
10+
import com.github.clevernucleus.relicex.impl.EntityAttributeCollection;
11+
import com.github.clevernucleus.relicex.impl.Rareness;
12+
import com.google.common.collect.ArrayListMultimap;
13+
import com.google.common.collect.Multimap;
14+
15+
import net.fabricmc.fabric.api.util.NbtType;
16+
import net.minecraft.client.item.TooltipContext;
17+
import net.minecraft.entity.EquipmentSlot;
18+
import net.minecraft.entity.attribute.EntityAttribute;
19+
import net.minecraft.entity.attribute.EntityAttributeModifier;
20+
import net.minecraft.entity.attribute.EntityAttributes;
21+
import net.minecraft.item.ArmorItem;
22+
import net.minecraft.item.Item;
23+
import net.minecraft.item.ItemStack;
24+
import net.minecraft.nbt.NbtCompound;
25+
import net.minecraft.text.Text;
26+
import net.minecraft.world.World;
27+
28+
@Mixin(ArmorItem.class)
29+
abstract class ArmorItemMixin extends Item implements ItemHelper {
30+
31+
@Shadow
32+
@Final
33+
protected EquipmentSlot slot;
34+
35+
@Shadow
36+
@Final
37+
private Multimap<EntityAttribute, EntityAttributeModifier> attributeModifiers;
38+
39+
private ArmorItemMixin(Settings settings) { super(settings); }
40+
41+
@Override
42+
public void appendTooltip(ItemStack stack, World world, List<Text> tooltip, TooltipContext context) {
43+
NbtCompound tag = stack.getNbt();
44+
45+
if(tag == null || !tag.contains(EntityAttributeCollection.KEY_RARENESS, NbtType.STRING)) return;
46+
Rareness rareness = Rareness.fromKey(tag.getString(EntityAttributeCollection.KEY_RARENESS));
47+
tooltip.add(rareness.formatted());
48+
}
49+
50+
@Override
51+
public Multimap<EntityAttribute, EntityAttributeModifier> getAttributeModifiers(ItemStack stack, EquipmentSlot slot) {
52+
NbtCompound tag = stack.getOrCreateNbt();
53+
Multimap<EntityAttribute, EntityAttributeModifier> modifiers = ArrayListMultimap.create();
54+
EntityAttributeCollection.readFromNbt(tag, this.slot.getName(), modifiers, this.attributeModifiers);
55+
56+
return slot == this.slot ? (modifiers.isEmpty() ? this.attributeModifiers : modifiers) : super.getAttributeModifiers(stack, slot);
57+
}
58+
59+
@Override
60+
public int getProtection(ItemStack itemStack) {
61+
return (int)EntityAttributeCollection.getValueIfArmor(itemStack.getOrCreateNbt(), EntityAttributes.GENERIC_ARMOR, ((ArmorItem)(Object)this).getProtection());
62+
}
63+
64+
@Override
65+
public float getToughness(ItemStack itemStack) {
66+
return (int)EntityAttributeCollection.getValueIfArmor(itemStack.getOrCreateNbt(), EntityAttributes.GENERIC_ARMOR_TOUGHNESS, ((ArmorItem)(Object)this).getToughness());
67+
}
68+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.github.clevernucleus.relicex.mixin;
2+
3+
import org.spongepowered.asm.mixin.Mixin;
4+
import org.spongepowered.asm.mixin.injection.At;
5+
import org.spongepowered.asm.mixin.injection.Redirect;
6+
7+
import com.github.clevernucleus.relicex.item.ArmorRelicItem;
8+
9+
import net.minecraft.item.Item;
10+
import net.minecraft.recipe.RepairItemRecipe;
11+
12+
@Mixin(RepairItemRecipe.class)
13+
abstract class RepairItemRecipeMixin {
14+
15+
@Redirect(method = "matches", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/Item;isDamageable()Z"))
16+
private boolean relicex_matches(Item item) {
17+
return item instanceof ArmorRelicItem ? false : item.isDamageable();
18+
}
19+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
{
2+
"text.autoconfig.relicex.title": "RelicEx Config Options",
3+
"text.autoconfig.relicex.option.chestsHaveLoot": "宝箱生成圣物物品",
4+
"text.autoconfig.relicex.option.chestsHaveLoot.@Tooltip": "若启用, 将在宝箱中生成圣物道具",
5+
"text.autoconfig.relicex.option.chestsHaveRelicChance": "宝箱生成遗物的概率",
6+
"text.autoconfig.relicex.option.chestsHaveRelicChance.@Tooltip": "将会有多少概率在宝箱中生成圣物战利品",
7+
"text.autoconfig.relicex.option.chestsHaveLesserOrbChance": "宝箱生成小遗物之球的概率",
8+
"text.autoconfig.relicex.option.chestsHaveLesserOrbChance.@Tooltip": "将会有多少概率在宝箱中生成小遗物之球",
9+
"text.autoconfig.relicex.option.chestsHaveGreaterOrbChance": "宝箱生成大遗物之球的概率",
10+
"text.autoconfig.relicex.option.chestsHaveGreaterOrbChance.@Tooltip": "将会有多少概率在宝箱中生成大遗物之球",
11+
"text.autoconfig.relicex.option.chestsHaveTomeChance": "宝箱生成巨著的概率",
12+
"text.autoconfig.relicex.option.chestsHaveTomeChance.@Tooltip": "将会有多少概率在宝箱中生成巨著",
13+
"text.autoconfig.relicex.option.dragonDropsStone": "龙血石",
14+
"text.autoconfig.relicex.option.dragonDropsStone.@Tooltip": "若启用, 末影龙会在死亡时掉落龙血石",
15+
"text.autoconfig.relicex.option.mobsDropLootChance": "怪物掉落概率",
16+
"text.autoconfig.relicex.option.mobsDropLootChance.@Tooltip": "怪物掉落圣物战利品的概率",
17+
"text.autoconfig.relicex.option.dropsOnlyFromPlayerKills": "仅玩家击杀",
18+
"text.autoconfig.relicex.option.dropsOnlyFromPlayerKills.@Tooltip": "如果启用, 怪物则仅会在玩家击杀所造成的死亡之前提下掉落圣物战利品",
19+
"text.autoconfig.relicex.option.mobDropIsRelicChance": "模组专属的强化怪物(血条超越原版怪物, 但外貌与原版怪物无异)的掉落概率",
20+
"text.autoconfig.relicex.option.mobDropIsRelicChance.@Tooltip": "将会有多少概率让强化怪物掉落圣物战利品",
21+
"text.autoconfig.relicex.option.mobDropIsPotionChance": "生命恢复药掉率",
22+
"text.autoconfig.relicex.option.mobDropIsPotionChance.@Tooltip": "将会有多少概率在击杀怪物后掉落生命恢复药(生命回复药并不是药剂, 而是一个瞬间拾取瞬间使用的道具, 有专属音效)",
23+
"text.autoconfig.relicex.option.mobDropIsLesserOrbChance": "小遗物之球掉落概率(仅模组专属强化怪掉落)",
24+
"text.autoconfig.relicex.option.mobDropIsLesserOrbChance.@Tooltip": "强化怪物掉落小遗物之球的概率",
25+
"text.autoconfig.relicex.option.mobDropIsGreaterOrbChance": "大遗物之球掉落概率(同小遗物之球)",
26+
"text.autoconfig.relicex.option.mobDropIsGreaterOrbChance.@Tooltip": "强化怪物掉落大遗物之球的概率",
27+
"text.autoconfig.relicex.option.mobDropIsTomeChance": "巨著掉率(同大小球)",
28+
"text.autoconfig.relicex.option.mobDropIsTomeChance.@Tooltip": "强化怪物掉落巨著的概率",
29+
"item.relicex.small_health_potion": "小型生命回复药",
30+
"item.relicex.medium_health_potion": "中型生命回复药",
31+
"item.relicex.large_health_potion": "大型生命回复药",
32+
"item.relicex.tome": "巨著",
33+
"item.relicex.dragon_stone": "龙血石",
34+
"item.relicex.lesser_orb_of_regret": "小遗物之球",
35+
"item.relicex.greater_orb_of_regret": "大遗物之球",
36+
"item.relicex.amulet_relic": "护身符",
37+
"item.relicex.ring_relic": "戒指",
38+
"item.relicex.head_relic": "头盔",
39+
"item.relicex.chest_relic": "胸甲",
40+
"item.relicex.relic_shard": "圣物碎片",
41+
"tooltip.relicex.worn": "穿戴时:",
42+
"tooltip.relicex.tome": "这本巨著蕴含着神秘力量(level:+1)",
43+
"tooltip.relicex.dragon_stone": "重置等级",
44+
"tooltip.relicex.greater_orb_of_regret": "重置所有等级点数",
45+
"tooltip.relicex.lesser_orb_of_regret": "重置1点等级点数",
46+
"message.relicex.dragon_stone": "准备好还俗了吗?(重复右键使用确认还俗!)",
47+
"rareness.relicex.common": "普通",
48+
"rareness.relicex.uncommon": "非同寻常",
49+
"rareness.relicex.rare": "稀有",
50+
"rareness.relicex.epic": "史诗",
51+
"rareness.relicex.mythical": "神秘",
52+
"rareness.relicex.legendary": "传说",
53+
"rareness.relicex.immortal": "不朽",
54+
"sound.relicex.level_refund": "重置等级音效",
55+
"sound.relicex.potion_use": "生命回复药音效"
56+
}

0 commit comments

Comments
 (0)