Skip to content

Commit 44003b7

Browse files
authored
Merge pull request #52 from Xaidee/feature/electrum-kinetic-damage
2 parents b562bf8 + 6b31f16 commit 44003b7

File tree

19 files changed

+209
-28
lines changed

19 files changed

+209
-28
lines changed

src/generated/resources/.cache/86c4ba3fec62c329e6b7e74d87569e08181a0d37

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// 1.20.1 2024-08-28T12:15:19.5456297 Oreganized Item Tags
1+
// 1.20.1 2024-09-17T12:51:06.9601625 Oreganized Item Tags
22
3a2cbf8d34e9bde2e22d59d4437fa80361d53291 data/farmersdelight/tags/items/tools/knives.json
33
d8d286ea76e30a635512bc93d68815770003ff41 data/forge/tags/items/buckets/molten_lead.json
44
7a2d68d81bc5ee59f9a2f4ba68ddb39bfd9c875d data/forge/tags/items/glass.json
@@ -47,6 +47,7 @@ a4acb3623320f801e89e3451f8b7d9e2246f99d0 data/minecraft/tags/items/walls.json
4747
81fb1b18afaa14ae90800b23c32de565d1389bb3 data/oreganized/tags/items/crystal_glass.json
4848
f1dfddab1e3f2dec1e7ed1c3fbf9f6a7f261cf08 data/oreganized/tags/items/crystal_glass_panes.json
4949
bf2ad799074f5c44acee490bdf3d3ae81d56997b data/oreganized/tags/items/gargoyle_snack.json
50+
4d89056c908550931c1f2008f9817f5d3ff7aa68 data/oreganized/tags/items/has_kinetic_damage.json
5051
f7810c755845dc955112f7b0cedf68260ad693cc data/oreganized/tags/items/lead_source.json
5152
376b7c9ff449a4b98cb7b1f65b47d658c4e39428 data/oreganized/tags/items/lighter_than_lead.json
5253
3112fb4a1df2953e2c3572fa47f886bf8e5bd679 data/oreganized/tags/items/stone_types/glance.json

src/generated/resources/assets/oreganized/lang/en_us.json

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"advancements.story.melting_point.title": "Melting Point",
1212
"advancements.story.obtain_silver.description": "Smelt Raw Silver",
1313
"advancements.story.obtain_silver.title": "Every Stone has a Silver Lining",
14+
"attribute.oreganized.kinetic_damage": "Kinetic Damage",
1415
"block.oreganized.black_crystal_glass": "Black Crystal Glass",
1516
"block.oreganized.black_crystal_glass_pane": "Black Crystal Glass Pane",
1617
"block.oreganized.blue_crystal_glass": "Blue Crystal Glass",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"values": [
3+
"oreganized:electrum_axe",
4+
"oreganized:electrum_hoe",
5+
"oreganized:electrum_knife",
6+
"oreganized:electrum_machete",
7+
"oreganized:electrum_pickaxe",
8+
"oreganized:electrum_shovel",
9+
"oreganized:electrum_sword"
10+
]
11+
}

src/main/java/galena/oreganized/Oreganized.java

+2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import galena.oreganized.data.ORegistries;
2323
import galena.oreganized.data.OSoundDefinitions;
2424
import galena.oreganized.data.OSpriteSourceProvider;
25+
import galena.oreganized.index.OAttributes;
2526
import galena.oreganized.index.OBlocks;
2627
import galena.oreganized.index.OEffects;
2728
import galena.oreganized.index.OEntityTypes;
@@ -138,6 +139,7 @@ public Oreganized() {
138139
OStructures.STRUCTURES,
139140
OFeatures.FEATURES,
140141
OPaintingVariants.PAINTING_VARIANTS,
142+
OAttributes.ATTRIBUTES,
141143
LOOT_MODIFIERS,
142144
};
143145

src/main/java/galena/oreganized/data/OItemTags.java

+10
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,16 @@ protected void addTags(HolderLookup.Provider provider) {
104104
tag(SHIELDS_SE).add(OItems.ELECTRUM_SHIELD.get());
105105
tag(MACHETES).add(OItems.ELECTRUM_MACHETE.get());
106106

107+
tag(HAS_KINETIC_DAMAGE).add(
108+
OItems.ELECTRUM_AXE.get(),
109+
OItems.ELECTRUM_HOE.get(),
110+
OItems.ELECTRUM_KNIFE.get(),
111+
OItems.ELECTRUM_MACHETE.get(),
112+
OItems.ELECTRUM_PICKAXE.get(),
113+
OItems.ELECTRUM_SHOVEL.get(),
114+
OItems.ELECTRUM_SWORD.get()
115+
);
116+
107117
tag(OTags.Items.GARGOYLE_SNACK).addTags(INGOTS_SILVER);
108118
}
109119
}

src/main/java/galena/oreganized/data/OLang.java

+2
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ protected void addTranslations() {
7777
add("death.attack.lead_bolt.item", "%1$s was shot %2$s using %3$s");
7878
add("death.attack.molten_lead", "%1$s refused to let go of the soaring hot metal");
7979

80+
add("attribute.oreganized.kinetic_damage", "Kinetic Damage");
81+
8082
/*
8183
Automatically create translations for blocks and items based on their registry name.
8284
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package galena.oreganized.index;
2+
3+
import galena.oreganized.Oreganized;
4+
import net.minecraft.world.entity.ai.attributes.Attribute;
5+
import net.minecraft.world.entity.ai.attributes.RangedAttribute;
6+
import net.minecraftforge.fml.common.Mod;
7+
import net.minecraftforge.registries.DeferredRegister;
8+
import net.minecraftforge.registries.ForgeRegistries;
9+
import net.minecraftforge.registries.RegistryObject;
10+
11+
@Mod.EventBusSubscriber(modid = Oreganized.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD)
12+
public class OAttributes {
13+
14+
public static final DeferredRegister<Attribute> ATTRIBUTES = DeferredRegister.create(ForgeRegistries.ATTRIBUTES, Oreganized.MOD_ID);
15+
16+
public static final RegistryObject<Attribute> KINETIC_DAMAGE = register("kinetic_damage", 0.0, 0.0, 30.0);
17+
18+
private static RegistryObject<Attribute> register(String name, double defaultValue, double min, double max) {
19+
return ATTRIBUTES.register(name, () -> new RangedAttribute("attribute.%s.%s".formatted(Oreganized.MOD_ID, name), defaultValue, min, max));
20+
}
21+
22+
}

src/main/java/galena/oreganized/index/OItemTiers.java

+1-19
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,7 @@
99
public enum OItemTiers implements Tier {
1010
LEAD(0, 150, 7.0F, 1.5F, 8, () -> Ingredient.of(OTags.Items.INGOTS_LEAD)),
1111

12-
/*
13-
Electrum should be better than diamond but not the same as netherite
14-
in terms of toughness and durability, taking on some benefits
15-
from gold tools such as speed and enchantability instead.
16-
17-
Here's the tiers for diamond, gold and netherite for comparison.
18-
19-
DIAMOND(3, 1561, 8.0F, 3.0F, 10, () -> {
20-
return Ingredient.of(Items.DIAMOND);
21-
}),
22-
GOLD(0, 32, 12.0F, 0.0F, 22, () -> {
23-
return Ingredient.of(Items.GOLD_INGOT);
24-
}),
25-
NETHERITE(4, 2031, 9.0F, 4.0F, 15, () -> {
26-
return Ingredient.of(Items.NETHERITE_INGOT);
27-
});
28-
*/
29-
ELECTRUM(4,1561,11.0F,3.0F,18, () -> Ingredient.of(OTags.Items.INGOTS_ELECTRUM));
30-
12+
ELECTRUM(4,1561,8.0F,3.0F,14, () -> Ingredient.of(OTags.Items.INGOTS_ELECTRUM));
3113

3214
private final int level;
3315
private final int durability;

src/main/java/galena/oreganized/index/OItems.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,11 @@ public static Supplier<? extends Item> compat(String modid, Function<Item.Proper
6363
public static final RegistryObject<Item> BUSH_HAMMER = HELPER.createItem("bush_hammer", () -> new BushHammerItem(OItemTiers.LEAD, 2.5F, -2.8F, (new Item.Properties()).stacksTo(1)));
6464
public static final RegistryObject<Item> SCRIBE = HELPER.createItem("scribe", () -> new ScribeItem(new Item.Properties().durability(250)));
6565

66-
public static final RegistryObject<Item> ELECTRUM_SWORD = HELPER.createItem("electrum_sword", () -> new SwordItem(OItemTiers.ELECTRUM, 3, -2.2F, (new Item.Properties())));
67-
public static final RegistryObject<Item> ELECTRUM_SHOVEL = HELPER.createItem("electrum_shovel", () -> new ShovelItem(OItemTiers.ELECTRUM, 1.5F, -2.8F, (new Item.Properties())));
68-
public static final RegistryObject<Item> ELECTRUM_PICKAXE = HELPER.createItem("electrum_pickaxe", () -> new PickaxeItem(OItemTiers.ELECTRUM, 1, -2.6F, (new Item.Properties())));
69-
public static final RegistryObject<Item> ELECTRUM_AXE = HELPER.createItem("electrum_axe", () -> new AxeItem(OItemTiers.ELECTRUM, 6.0F, -2.8F, (new Item.Properties())));
70-
public static final RegistryObject<Item> ELECTRUM_HOE = HELPER.createItem("electrum_hoe", () -> new HoeItem(OItemTiers.ELECTRUM, 0, -2.8F, (new Item.Properties())));
66+
public static final RegistryObject<Item> ELECTRUM_SWORD = HELPER.createItem("electrum_sword", () -> new SwordItem(OItemTiers.ELECTRUM, 3, -2.4F, (new Item.Properties())));
67+
public static final RegistryObject<Item> ELECTRUM_SHOVEL = HELPER.createItem("electrum_shovel", () -> new ShovelItem(OItemTiers.ELECTRUM, 1.5F, -3.0F, (new Item.Properties())));
68+
public static final RegistryObject<Item> ELECTRUM_PICKAXE = HELPER.createItem("electrum_pickaxe", () -> new PickaxeItem(OItemTiers.ELECTRUM, 1, -2.8F, (new Item.Properties())));
69+
public static final RegistryObject<Item> ELECTRUM_AXE = HELPER.createItem("electrum_axe", () -> new AxeItem(OItemTiers.ELECTRUM, 5.0F, -3.0F, (new Item.Properties())));
70+
public static final RegistryObject<Item> ELECTRUM_HOE = HELPER.createItem("electrum_hoe", () -> new HoeItem(OItemTiers.ELECTRUM, -3, 0.0F, (new Item.Properties())));
7171

7272
public static final RegistryObject<Item> ELECTRUM_KNIFE = HELPER.createItem("electrum_knife", compat(FARMERS_DELIGHT_ID, it -> FarmersDelightCompat.KNIFE_FACTORY.apply(it), new Item.Properties()));
7373
public static final RegistryObject<Item> ELECTRUM_SHIELD = HELPER.createItem("electrum_shield", () -> new ShieldItem(new Item.Properties().durability(363)));

src/main/java/galena/oreganized/index/OParticleTypes.java

+3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import galena.oreganized.client.particle.LeadShrapnelParticle;
66
import galena.oreganized.client.particle.VengeanceParticleProvider;
77
import net.minecraft.client.Minecraft;
8+
import net.minecraft.client.particle.CritParticle;
89
import net.minecraft.client.particle.ParticleEngine;
910
import net.minecraft.core.particles.ParticleType;
1011
import net.minecraft.core.particles.SimpleParticleType;
@@ -26,6 +27,7 @@ public class OParticleTypes {
2627
public static final RegistryObject<SimpleParticleType> LANDING_LEAD = PARTICLES.register("landing_lead", () -> new SimpleParticleType(true));
2728
public static final RegistryObject<SimpleParticleType> LEAD_SHRAPNEL = PARTICLES.register( "lead_shrapnel", () -> new SimpleParticleType(true));
2829
public static final RegistryObject<SimpleParticleType> VENGEANCE = PARTICLES.register( "vengeance", () -> new SimpleParticleType(true));
30+
public static final RegistryObject<SimpleParticleType> KINETIC_HIT = PARTICLES.register( "kinetic_hit", () -> new SimpleParticleType(true));
2931

3032

3133
@SubscribeEvent
@@ -37,5 +39,6 @@ public static void registerParticleFactories(RegisterParticleProvidersEvent even
3739
engine.register(LANDING_LEAD.get(), CustomDrippingParticle.LeadLandProvider::new);
3840
engine.register(LEAD_SHRAPNEL.get(), LeadShrapnelParticle.Provider::new);
3941
engine.register(VENGEANCE.get(), VengeanceParticleProvider::new);
42+
engine.register(KINETIC_HIT.get(), CritParticle.DamageIndicatorProvider::new);
4043
}
4144
}

src/main/java/galena/oreganized/index/OTags.java

+2
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ public static class Items {
5454
public static final TagKey<Item> SHIELDS_SE = ItemTags.create(new ResourceLocation(SHIELD_EXPANSION_ID, "shields"));
5555
public static final TagKey<Item> MACHETES = ItemTags.create(new ResourceLocation(NETHERS_DELIGHT_ID, "tools/machetes"));
5656

57+
public static final TagKey<Item> HAS_KINETIC_DAMAGE = tag( "has_kinetic_damage");
58+
5759
public static final TagKey<Item> GARGOYLE_SNACK = tag("gargoyle_snack");
5860

5961
private static TagKey<Item> tag(String name) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package galena.oreganized.mixin;
2+
3+
import galena.oreganized.world.KineticDamage;
4+
import net.minecraft.world.entity.Entity;
5+
import net.minecraft.world.entity.LivingEntity;
6+
import net.minecraft.world.item.enchantment.EnchantmentHelper;
7+
import org.spongepowered.asm.mixin.Mixin;
8+
import org.spongepowered.asm.mixin.injection.At;
9+
import org.spongepowered.asm.mixin.injection.Inject;
10+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
11+
12+
@Mixin(EnchantmentHelper.class)
13+
public class EnchantmentHelperMixin {
14+
15+
@Inject(method = "doPostDamageEffects(Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/entity/Entity;)V", at = @At("HEAD"))
16+
private static void applyKineticDamage(LivingEntity cause, Entity target, CallbackInfo ci) {
17+
KineticDamage.apply(cause, target);
18+
}
19+
20+
}

src/main/java/galena/oreganized/network/OreganizedNetwork.java

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import galena.oreganized.Oreganized;
44
import galena.oreganized.network.packet.DoorPushingPacket;
55
import galena.oreganized.network.packet.GargoyleParticlePacket;
6+
import galena.oreganized.network.packet.KineticHitPacket;
67
import net.minecraftforge.network.NetworkRegistry;
78
import net.minecraftforge.network.simple.SimpleChannel;
89

@@ -20,5 +21,6 @@ public static void register() {
2021

2122
CHANNEL.registerMessage(id++, GargoyleParticlePacket.class, GargoyleParticlePacket::write, GargoyleParticlePacket::from, GargoyleParticlePacket::handle);
2223
CHANNEL.registerMessage(id++, DoorPushingPacket.class, DoorPushingPacket::write, DoorPushingPacket::from, DoorPushingPacket::handle);
24+
CHANNEL.registerMessage(id++, KineticHitPacket.class, KineticHitPacket::write, KineticHitPacket::from, KineticHitPacket::handle);
2325
}
2426
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package galena.oreganized.network.packet;
2+
3+
import galena.oreganized.world.KineticDamage;
4+
import net.minecraft.client.Minecraft;
5+
import net.minecraft.network.FriendlyByteBuf;
6+
import net.minecraftforge.network.NetworkEvent;
7+
8+
import java.util.function.Supplier;
9+
10+
public record KineticHitPacket(int target) {
11+
12+
public void write(FriendlyByteBuf buffer) {
13+
buffer.writeInt(target);
14+
}
15+
16+
public void handle(Supplier<NetworkEvent.Context> contextSupplier) {
17+
var context = contextSupplier.get();
18+
context.enqueueWork(() -> {
19+
var level = Minecraft.getInstance().level;
20+
if (level == null) return;
21+
22+
var target = level.getEntity(target());
23+
if (target == null) return;
24+
25+
KineticDamage.spawnParticles(target);
26+
});
27+
28+
context.setPacketHandled(true);
29+
}
30+
31+
public static KineticHitPacket from(FriendlyByteBuf buffer) {
32+
var target = buffer.readInt();
33+
return new KineticHitPacket(target);
34+
}
35+
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package galena.oreganized.world;
2+
3+
import galena.oreganized.index.OAttributes;
4+
import galena.oreganized.index.OParticleTypes;
5+
import galena.oreganized.network.OreganizedNetwork;
6+
import galena.oreganized.network.packet.KineticHitPacket;
7+
import net.minecraft.world.entity.Entity;
8+
import net.minecraft.world.entity.EquipmentSlot;
9+
import net.minecraft.world.entity.LivingEntity;
10+
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
11+
import net.minecraftforge.network.PacketDistributor;
12+
13+
public class KineticDamage {
14+
15+
public static void apply(LivingEntity cause, Entity target) {
16+
if (cause == null) return;
17+
18+
var stack = cause.getMainHandItem();
19+
var mods = stack.getAttributeModifiers(EquipmentSlot.MAINHAND).get(OAttributes.KINETIC_DAMAGE.get());
20+
21+
if (mods.isEmpty()) return;
22+
23+
var factor = Math.min(cause.getDeltaMovement().horizontalDistance() / 0.046F, 1F);
24+
25+
// ignores modifier operation, since only addition is used by oreganized this works, but may be adapted in the future
26+
var kineticDamage = factor * mods.stream().mapToDouble(AttributeModifier::getAmount).sum();
27+
var source = target.level().damageSources().generic();
28+
29+
if (kineticDamage == 0.0) return;
30+
31+
target.invulnerableTime = 0;
32+
target.hurt(source, (float) kineticDamage);
33+
OreganizedNetwork.CHANNEL.send(
34+
PacketDistributor.NEAR.with(PacketDistributor.TargetPoint.p(target.getX(), target.getY(), target.getZ(), 16.0, target.level().dimension())),
35+
new KineticHitPacket(target.getId())
36+
);
37+
}
38+
39+
public static void spawnParticles(Entity target) {
40+
var level = target.level();
41+
var count = 3 + level.random.nextInt(2) + level.random.nextInt(2);
42+
43+
for (int i = 0; i < count; i++) {
44+
level.addParticle(
45+
OParticleTypes.KINETIC_HIT.get(),
46+
target.getRandomX(0.75), target.getRandomY(), target.getRandomZ(0.75),
47+
level.random.nextGaussian() * 0.02D, level.random.nextGaussian() * 0.02D, level.random.nextGaussian() * 0.02D
48+
);
49+
}
50+
}
51+
52+
}

src/main/java/galena/oreganized/world/event/PlayerEvents.java

+29
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import galena.oreganized.content.block.MoltenLeadCauldronBlock;
66
import galena.oreganized.content.entity.GargoyleBlockEntity;
77
import galena.oreganized.content.item.ScribeItem;
8+
import galena.oreganized.index.OAttributes;
89
import galena.oreganized.index.OBlocks;
910
import galena.oreganized.index.OEffects;
1011
import galena.oreganized.index.OFluids;
@@ -19,23 +20,31 @@
1920
import net.minecraft.world.InteractionHand;
2021
import net.minecraft.world.effect.MobEffectInstance;
2122
import net.minecraft.world.effect.MobEffects;
23+
import net.minecraft.world.entity.EquipmentSlot;
2224
import net.minecraft.world.entity.LivingEntity;
25+
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
2326
import net.minecraft.world.entity.player.Player;
27+
import net.minecraft.world.item.DiggerItem;
2428
import net.minecraft.world.item.ItemStack;
2529
import net.minecraft.world.item.Items;
30+
import net.minecraft.world.item.SwordItem;
2631
import net.minecraft.world.level.Level;
2732
import net.minecraft.world.level.block.Block;
2833
import net.minecraft.world.level.block.Blocks;
2934
import net.minecraft.world.level.block.state.BlockState;
3035
import net.minecraftforge.common.ToolAction;
3136
import net.minecraftforge.common.ToolActions;
37+
import net.minecraftforge.event.ItemAttributeModifierEvent;
3238
import net.minecraftforge.event.TickEvent;
3339
import net.minecraftforge.event.entity.living.LivingEntityUseItemEvent;
3440
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
3541
import net.minecraftforge.event.level.BlockEvent;
42+
import net.minecraftforge.eventbus.api.EventPriority;
3643
import net.minecraftforge.eventbus.api.SubscribeEvent;
3744
import net.minecraftforge.fml.common.Mod;
3845

46+
import java.util.UUID;
47+
3948
@Mod.EventBusSubscriber(modid = Oreganized.MOD_ID)
4049
public class PlayerEvents {
4150

@@ -143,4 +152,24 @@ public static void onBlockBreak(final BlockEvent.BreakEvent event) {
143152
event.setExpToDrop(0);
144153
}
145154
}
155+
156+
@SubscribeEvent(priority = EventPriority.LOW)
157+
public static void onItemAttributes(ItemAttributeModifierEvent event) {
158+
var stack = event.getItemStack();
159+
var mods = event.getModifiers();
160+
161+
if (event.getSlotType() != EquipmentSlot.MAINHAND) return;
162+
163+
if (stack.is(OTags.Items.HAS_KINETIC_DAMAGE) && !mods.containsKey(OAttributes.KINETIC_DAMAGE.get())) {
164+
var damage = stack.getItem() instanceof DiggerItem item
165+
? item.getAttackDamage()
166+
: stack.getItem() instanceof SwordItem item
167+
? item.getDamage()
168+
: 2.0F;
169+
event.addModifier(OAttributes.KINETIC_DAMAGE.get(), new AttributeModifier(
170+
UUID.fromString("0191ff58-54d7-711d-8a94-692379277c23"), "Kinetic Damage", damage / 3, AttributeModifier.Operation.ADDITION)
171+
);
172+
}
173+
}
174+
146175
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"textures": [
3+
"oreganized:kinetic_damage"
4+
]
5+
}
Loading

src/main/resources/oreganized.mixins.json

+4-3
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44
"package": "galena.oreganized.mixin",
55
"compatibilityLevel": "JAVA_17",
66
"mixins": [
7-
"AbstractArrowMixin", "BlockMixin", "CrossbowMixin", "DispenserBlockMixin", "FoodDataMixin", "IceBlockMixin",
8-
"MobEffectInstanceMixin", "PillagerMixin", "PlayerMixin"
7+
"AbstractArrowMixin", "BlockMixin", "CrossbowMixin", "DispenserBlockMixin", "EnchantmentHelperMixin",
8+
"FoodDataMixin", "IceBlockMixin", "MobEffectInstanceMixin", "PillagerMixin", "PlayerMixin"
99
],
1010
"client": [
11-
"client.GuiAccessor", "client.GuiMixin", "client.HumanoidArmorLayerAccessor", "client.HumanoidArmorLayerMixin", "client.HumanoidModelMixin"
11+
"client.GuiAccessor", "client.GuiMixin", "client.HumanoidArmorLayerAccessor", "client.HumanoidArmorLayerMixin",
12+
"client.HumanoidModelMixin"
1213
],
1314
"server": [],
1415
"injectors": {

0 commit comments

Comments
 (0)