Bladeren bron

Added player heads effects + Golden Heads + modified the hardened blocks tool to work better

Lucas 4 maanden geleden
bovenliggende
commit
1b3b6cc0f5

+ 13 - 3
README.md

@@ -45,6 +45,16 @@ Here are some other mods that the server has installed that you might want to kn
 
 # Added Features
 
+### Player Heads
+
+Players now drop their heads, and you can right click with a player head to gain Speed I for 10 seconds, and Regeneration II for 5 seconds.
+
+**Golden Heads**
+
+Right click while holding to give Speed I for 20 seconds, Absorption II for 60 seconds, and Regeneration II for 12.5 seconds
+
+![Golden Head Recipe](readme_images/goldenheadrecipe.png)
+
 ### Hardened Blocks
 
 These blocks can be placed, are harder to mine, and take a certain amount of direct TNT explosions to break (the TNT has to be right next to it, no splash damage).  They can be picked up with the Hardened Blocks Tool, if you placed the block.
@@ -53,19 +63,19 @@ These blocks can be placed, are harder to mine, and take a certain amount of dir
 
 Takes 2 direct TNT explosions to break
 
-![crafting-grid.png](readme_images/crafting-grid.png)
+![Upgraded Cobblestone Recipe](readme_images/crafting-grid.png)
 
 **Hardened Cobblestone**
 
 Takes 10 direct TNT explosions to break
 
-![crafting-grid(1).png](readme_images/crafting-grid%281%29.png)
+![Hardened Cobblestone Recipe](readme_images/crafting-grid%281%29.png)
 
 **Hardened Blocks Tool**
 
 Right click any hardened block with this tool to pick it up, if you placed the block originally.
 
-![crafting-grid(2).png](readme_images/crafting-grid%282%29.png)
+![Hardened Blocks Tool Recipe](readme_images/crafting-grid%282%29.png)
 
 ### Game Rules
 

+ 11 - 4
src/client/java/top/lucason/tvhs_mc_server_mod/client/TVHSModModelProvider.java

@@ -2,9 +2,10 @@ package top.lucason.tvhs_mc_server_mod.client;
 
 import net.fabricmc.fabric.api.client.datagen.v1.provider.FabricModelProvider;
 import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;
-import net.minecraft.client.data.BlockStateModelGenerator;
-import net.minecraft.client.data.ItemModelGenerator;
-import net.minecraft.client.data.Models;
+import net.minecraft.block.SkullBlock;
+import net.minecraft.client.data.*;
+import net.minecraft.util.Identifier;
+import top.lucason.tvhs_mc_server_mod.TVHSMod;
 import top.lucason.tvhs_mc_server_mod.blocks.ModBlocks;
 import top.lucason.tvhs_mc_server_mod.items.ModItems;
 
@@ -19,10 +20,16 @@ public class TVHSModModelProvider extends FabricModelProvider {
         blockStateModelGenerator.registerSimpleCubeAll(ModBlocks.UPGRADED_COBBLESTONE);
     }
 
-
     @Override
     public void generateItemModels(ItemModelGenerator itemModelGenerator) {
         itemModelGenerator.register(ModItems.HARDENED_BLOCKS_TOOL, Models.GENERATED);
+        itemModelGenerator.register(ModItems.GOLDEN_HEAD, Models.GENERATED);
+        /*
+        itemModelGenerator.output.accept(ModItems.GOLDEN_HEAD, ItemModels.special(
+                ModelIds.getMinecraftNamespacedItem("template_skull"),
+                new PlayerHeadModelRenderer.Unbaked()
+        ));
+         */
     }
 
     @Override

+ 2 - 0
src/main/generated/.cache/0b507979cee4452d4694d664575bf4f99f825b9d

@@ -1,7 +1,9 @@
 // 1.21.7	-999999999-01-01T00:00:00	tvhs_mc_server_mod/FabricDocsReferenceRecipeProvider
 c3ec7899210dd76f6318ec61318d0110ceaa8118 data/tvhs_mc_server_mod/advancement/recipes/building_blocks/hardened_cobblestone.json
 5038dedd2f94449d869f182176397c53f474f4d0 data/tvhs_mc_server_mod/advancement/recipes/building_blocks/upgraded_cobblestone.json
+806cae4d01fa70f8473dfb616115606c97f2eba3 data/tvhs_mc_server_mod/advancement/recipes/food/golden_head.json
 9e9afe761199f6561b7ea69c298344b44a6569ea data/tvhs_mc_server_mod/advancement/recipes/tools/hardened_blocks_tool.json
+ed5a1581663ba9714b775804d7df51f24195af4d data/tvhs_mc_server_mod/recipe/golden_head.json
 0646c5553751b42cae1d2b5623b67bc3377c64df data/tvhs_mc_server_mod/recipe/hardened_blocks_tool.json
 ddb587a0e1873baa0a56831665aef339499818c0 data/tvhs_mc_server_mod/recipe/hardened_cobblestone.json
 e22afe82cf7b67392e16dd63e1b14218b6609bbf data/tvhs_mc_server_mod/recipe/upgraded_cobblestone.json

+ 1 - 1
src/main/generated/.cache/2ee9fa97349dcefbbf6be0dcfb7a393cd1c17f97

@@ -1,2 +1,2 @@
 // 1.21.7	-999999999-01-01T00:00:00	tvhs_mc_server_mod/Language (en_us)
-adcfe1bafc6f81fe2f70cb115a09fa441dd218b7 assets/tvhs_mc_server_mod/lang/en_us.json
+be6dd55062159831f14ee84f18d2bedcf6920af2 assets/tvhs_mc_server_mod/lang/en_us.json

+ 2 - 0
src/main/generated/.cache/71a46b6ec25213128276461551ccccdfe1ca7beb

@@ -1,9 +1,11 @@
 // 1.21.7	-999999999-01-01T00:00:00	tvhs_mc_server_mod/TVHS Mod Model Provider
 9422161fb30de0f41898ce8fd0aecec813d36695 assets/tvhs_mc_server_mod/blockstates/hardened_cobblestone.json
 0d696d075ee62c2bcc77f5b038f5ec01a31d50d2 assets/tvhs_mc_server_mod/blockstates/upgraded_cobblestone.json
+dadfaddc3e44e45813bf57c3e8a3f7bf0b7185ed assets/tvhs_mc_server_mod/items/golden_head.json
 dd64c8b94dd598e0b7d3e83fdcb64d6f1d80ba7a assets/tvhs_mc_server_mod/items/hardened_blocks_tool.json
 005a2e3c0e14374b7ebed5b1767b89bc76b45c84 assets/tvhs_mc_server_mod/items/hardened_cobblestone.json
 c8e594959981f8aabef08ea42d9b807198d02eeb assets/tvhs_mc_server_mod/items/upgraded_cobblestone.json
 eeabf9e27fca7136469449112eb31513d8a71ad8 assets/tvhs_mc_server_mod/models/block/hardened_cobblestone.json
 c289dbfc519ed45a05a59839392f31e93c9e4215 assets/tvhs_mc_server_mod/models/block/upgraded_cobblestone.json
+9525cd8c2e6bec521582dfea0689e4e9e8d87e2e assets/tvhs_mc_server_mod/models/item/golden_head.json
 441e95b8064d09020d0f9d514559261af3ee2a52 assets/tvhs_mc_server_mod/models/item/hardened_blocks_tool.json

+ 1 - 0
src/main/generated/.cache/be5d714ce19505f61dbf77be3f279d5774886eaa

@@ -1 +1,2 @@
 // 1.21.7	-999999999-01-01T00:00:00	tvhs_mc_server_mod/Tags for minecraft:item
+4464bcc4cbbdb5412f0bc955b6f17e86bb0d4b77 data/minecraft/tags/item/skulls.json

+ 1 - 0
src/main/generated/assets/tvhs_mc_server_mod/lang/en_us.json

@@ -1,6 +1,7 @@
 {
   "block.tvhs_mc_server_mod.hardened_cobblestone": "Hardened Cobblestone",
   "block.tvhs_mc_server_mod.upgraded_cobblestone": "Upgraded Cobblestone",
+  "item.tvhs_mc_server_mod.golden_head": "Golden Head",
   "item.tvhs_mc_server_mod.hardened_blocks_tool": "Hardened Blocks Tool",
   "item.tvhs_mc_server_mod.hardened_cobblestone": "Hardened Cobblestone",
   "item.tvhs_mc_server_mod.upgraded_cobblestone": "Upgraded Cobblestone",

+ 15 - 6
src/main/java/top/lucason/tvhs_mc_server_mod/blocks/ModBlocks.java

@@ -1,13 +1,9 @@
 package top.lucason.tvhs_mc_server_mod.blocks;
 
 import com.mojang.datafixers.util.Function3;
-import com.mojang.datafixers.util.Function4;
 import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
 import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder;
-import net.minecraft.block.AbstractBlock;
-import net.minecraft.block.Block;
-import net.minecraft.block.BlockState;
-import net.minecraft.block.entity.BlockEntity;
+import net.minecraft.block.*;
 import net.minecraft.block.entity.BlockEntityType;
 import net.minecraft.item.BlockItem;
 import net.minecraft.item.Item;
@@ -21,6 +17,7 @@ import net.minecraft.util.Identifier;
 import net.minecraft.util.Pair;
 import top.lucason.tvhs_mc_server_mod.TVHSMod;
 
+import java.util.function.BiFunction;
 import java.util.function.Function;
 
 public class ModBlocks {
@@ -73,7 +70,7 @@ public class ModBlocks {
         return register(name, block, blockID, registryKeys);
     }
 
-    // for normal blocks
+    // for normal blocks (unused)
     private static Block register(
             String name,
             Function<AbstractBlock.Settings, Block> blockFactory,
@@ -85,6 +82,18 @@ public class ModBlocks {
         return register(name, block, blockID, registryKeys);
     }
 
+    // for skull blocks (unused)
+    private static Block register(
+            String name,
+            BiFunction<SkullBlock.SkullType, AbstractBlock.Settings, Block> blockFactory,
+            AbstractBlock.Settings settings
+    ) {
+        Identifier blockID = Identifier.of(TVHSMod.MOD_ID, name);
+        Pair<RegistryKey<Block>, RegistryKey<Item>> registryKeys = getRegistryKeyPair(blockID);
+        Block block = blockFactory.apply(SkullBlock.Type.PLAYER, settings.registryKey(registryKeys.getLeft()));
+        return register(name, block, blockID, registryKeys);
+    }
+
     // helper method that registers the specified block to registry
     // abstracted cuz there are two other registry methods that act differently
     private static Block register(

+ 1 - 0
src/main/java/top/lucason/tvhs_mc_server_mod/datagen/TVHSModEnglishLangProvider.java

@@ -23,5 +23,6 @@ public class TVHSModEnglishLangProvider extends FabricLanguageProvider {
         translationBuilder.add(ModBlocks.UPGRADED_COBBLESTONE, "Upgraded Cobblestone");
         translationBuilder.add(ModBlocks.UPGRADED_COBBLESTONE.asItem(), "Upgraded Cobblestone");
         translationBuilder.add(ModItems.HARDENED_BLOCKS_TOOL, "Hardened Blocks Tool");
+        translationBuilder.add(ModItems.GOLDEN_HEAD, "Golden Head");
     }
 }

+ 5 - 2
src/main/java/top/lucason/tvhs_mc_server_mod/datagen/TVHSModItemTagProvider.java

@@ -5,6 +5,10 @@ import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider;
 import net.minecraft.item.Item;
 import net.minecraft.registry.RegistryKeys;
 import net.minecraft.registry.RegistryWrapper;
+import net.minecraft.registry.tag.ItemTags;
+import net.minecraft.util.Identifier;
+import top.lucason.tvhs_mc_server_mod.TVHSMod;
+import top.lucason.tvhs_mc_server_mod.items.ModItems;
 
 import java.util.concurrent.CompletableFuture;
 
@@ -15,7 +19,6 @@ public class TVHSModItemTagProvider extends FabricTagProvider<Item> {
 
     @Override
     protected void configure(RegistryWrapper.WrapperLookup wrapperLookup) {
-        //getOrCreateTagBuilder(ItemTags.___)
-        //        .add(Items.STONE);
+
     }
 }

+ 2 - 0
src/main/java/top/lucason/tvhs_mc_server_mod/datagen/TVHSModLootTableProvider.java

@@ -2,8 +2,10 @@ package top.lucason.tvhs_mc_server_mod.datagen;
 
 import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;
 import net.fabricmc.fabric.api.datagen.v1.provider.FabricBlockLootTableProvider;
+import net.minecraft.block.Blocks;
 import net.minecraft.registry.RegistryWrapper;
 import top.lucason.tvhs_mc_server_mod.blocks.ModBlocks;
+import top.lucason.tvhs_mc_server_mod.items.ModItems;
 
 import java.util.concurrent.CompletableFuture;
 

+ 9 - 0
src/main/java/top/lucason/tvhs_mc_server_mod/datagen/TVHSModRecipeProvider.java

@@ -50,6 +50,15 @@ public class TVHSModRecipeProvider extends FabricRecipeProvider {
                         .input('s', Items.STICK)
                         .criterion(hasItem(Items.DIAMOND), conditionsFromItem(Items.DIAMOND))
                         .offerTo(exporter);
+
+                createShaped(RecipeCategory.FOOD, ModItems.GOLDEN_HEAD)
+                        .pattern("ggg")
+                        .pattern("ghg")
+                        .pattern("ggg")
+                        .input('g', Items.GOLD_INGOT)
+                        .input('h', Items.PLAYER_HEAD)
+                        .criterion(hasItem(Items.PLAYER_HEAD), conditionsFromItem(Items.PLAYER_HEAD))
+                        .offerTo(exporter);
             }
         };
     }

+ 62 - 0
src/main/java/top/lucason/tvhs_mc_server_mod/items/GoldenHeadItem.java

@@ -0,0 +1,62 @@
+package top.lucason.tvhs_mc_server_mod.items;
+
+import com.mojang.authlib.GameProfile;
+import net.minecraft.block.Blocks;
+import net.minecraft.component.DataComponentTypes;
+import net.minecraft.component.type.ProfileComponent;
+import net.minecraft.entity.effect.StatusEffectInstance;
+import net.minecraft.entity.effect.StatusEffects;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.ItemUsageContext;
+import net.minecraft.item.PlayerHeadItem;
+import net.minecraft.sound.SoundCategory;
+import net.minecraft.sound.SoundEvents;
+import net.minecraft.util.ActionResult;
+import net.minecraft.util.Hand;
+import net.minecraft.world.World;
+
+import java.util.UUID;
+
+public class GoldenHeadItem extends PlayerHeadItem {
+    public GoldenHeadItem(Item.Settings settings) {
+        super(Blocks.GRASS_BLOCK, Blocks.GRASS_BLOCK, settings);
+        getDefaultStack();
+    }
+
+    @Override
+    public ActionResult use(World world, PlayerEntity user, Hand hand) {
+        ItemStack itemStack = user.getStackInHand(hand);
+
+        if (!world.isClient) {
+            user.addStatusEffect(new StatusEffectInstance(StatusEffects.REGENERATION, 250, 1));
+            user.addStatusEffect(new StatusEffectInstance(StatusEffects.ABSORPTION, 1200, 1));
+            user.addStatusEffect(new StatusEffectInstance(StatusEffects.SPEED, 400, 0));
+
+            world.playSound(null, user.getBlockPos(), SoundEvents.ENTITY_PLAYER_BURP, SoundCategory.PLAYERS, 1.0F, 1.0F);
+
+            if (!user.getAbilities().creativeMode) {
+                itemStack.decrement(1);
+            }
+        }
+        user.swingHand(hand);
+        user.getItemCooldownManager().set(user.getStackInHand(hand), 100);
+
+        return ActionResult.SUCCESS;
+    }
+
+    @Override
+    public ActionResult useOnBlock(ItemUsageContext context) {
+        return ActionResult.PASS;
+    }
+
+    @Override
+    public ItemStack getDefaultStack() {
+        ItemStack stack = new ItemStack(this);
+
+        GameProfile profile = new GameProfile(UUID.randomUUID(), "Golden_Steve");
+        stack.set(DataComponentTypes.PROFILE, new ProfileComponent(profile));
+        return stack;
+    }
+}

+ 19 - 0
src/main/java/top/lucason/tvhs_mc_server_mod/items/HardenedBlocksModifierItem.java

@@ -3,15 +3,21 @@ package top.lucason.tvhs_mc_server_mod.items;
 import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
 import net.fabricmc.fabric.impl.screenhandler.Networking;
 import net.minecraft.block.Block;
+import net.minecraft.component.type.TooltipDisplayComponent;
 import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
 import net.minecraft.item.ItemUsageContext;
 import net.minecraft.item.ShovelItem;
+import net.minecraft.item.tooltip.TooltipData;
+import net.minecraft.item.tooltip.TooltipType;
 import net.minecraft.network.packet.CustomPayload;
 import net.minecraft.network.packet.s2c.play.EntityAnimationS2CPacket;
 import net.minecraft.server.network.ServerPlayNetworkHandler;
 import net.minecraft.server.network.ServerPlayerEntity;
 import net.minecraft.server.network.ServerPlayerInteractionManager;
+import net.minecraft.text.Text;
 import net.minecraft.util.ActionResult;
+import net.minecraft.util.Formatting;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.World;
@@ -20,6 +26,9 @@ import top.lucason.tvhs_mc_server_mod.TVHSMod;
 import top.lucason.tvhs_mc_server_mod.blocks.HardenedBlock;
 import top.lucason.tvhs_mc_server_mod.util.Utilities;
 
+import java.util.Optional;
+import java.util.function.Consumer;
+
 public class HardenedBlocksModifierItem extends Item {
     public final Identifier ID;
     public HardenedBlocksModifierItem(Item.Settings settings, Identifier ID){
@@ -41,6 +50,16 @@ public class HardenedBlocksModifierItem extends Item {
                 return ActionResult.SUCCESS;
             }
         }
+        context.getPlayer().swingHand(context.getHand());
         return super.useOnBlock(context);
     }
+
+    @Override
+    public void appendTooltip(ItemStack stack, TooltipContext context, TooltipDisplayComponent displayComponent, Consumer<Text> textConsumer, TooltipType type) {
+        textConsumer.accept(Text.of(
+                "Right click on a Hardened Block that you placed to destroy it instantly.")
+                .copy()
+                .formatted(Formatting.BLUE)
+        );
+    }
 }

+ 30 - 3
src/main/java/top/lucason/tvhs_mc_server_mod/items/ModItems.java

@@ -1,33 +1,50 @@
 package top.lucason.tvhs_mc_server_mod.items;
 
+import com.mojang.datafixers.util.Function3;
 import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
+import net.minecraft.block.AbstractBlock;
+import net.minecraft.block.Block;
+import net.minecraft.component.type.FoodComponents;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemGroups;
+import net.minecraft.item.Items;
 import net.minecraft.item.ToolMaterial;
 import net.minecraft.registry.Registries;
 import net.minecraft.registry.Registry;
 import net.minecraft.registry.RegistryKey;
 import net.minecraft.registry.RegistryKeys;
-import net.minecraft.registry.tag.BlockTags;
-import net.minecraft.registry.tag.TagBuilder;
 import net.minecraft.util.Identifier;
 import top.lucason.tvhs_mc_server_mod.TVHSMod;
+import top.lucason.tvhs_mc_server_mod.blocks.ModBlocks;
 
 import java.util.function.BiFunction;
+import java.util.function.Function;
 
 public class ModItems {
     public static final Item HARDENED_BLOCKS_TOOL = register(
             "hardened_blocks_tool",
             HardenedBlocksModifierItem::new,
-            new Item.Settings().pickaxe(ToolMaterial.DIAMOND, 3.0f, 1.0f)
+            new Item.Settings().pickaxe(ToolMaterial.DIAMOND, 0.0f, 0.0f)
     );
+
+    public static final Item GOLDEN_HEAD = register(
+            "golden_head",
+            GoldenHeadItem::new,
+            new Item.Settings().food(FoodComponents.GOLDEN_APPLE)
+    );
+
     public static void initModItems() {
         TVHSMod.LOGGER.info("Initializing TVHS Mod Items");
 
         ItemGroupEvents.modifyEntriesEvent(ItemGroups.TOOLS).register(entries -> {
             entries.add(ModItems.HARDENED_BLOCKS_TOOL);
         });
+        ItemGroupEvents.modifyEntriesEvent(ItemGroups.FOOD_AND_DRINK).register(entries -> {
+            entries.add(ModItems.GOLDEN_HEAD);
+        });
     }
+
+    // for hardened block items
     public static Item register(String name, BiFunction<Item.Settings, Identifier, Item> itemFactory, Item.Settings settings) {
         Identifier ID = Identifier.of(TVHSMod.MOD_ID, name);
         RegistryKey<Item> itemKey = RegistryKey.of(RegistryKeys.ITEM, ID);
@@ -36,4 +53,14 @@ public class ModItems {
         Registry.register(Registries.ITEM, itemKey, item);
         return item;
     }
+
+    // for normal items
+    public static Item register(String name, Function<Item.Settings, Item> itemFactory,  Item.Settings settings){
+        Identifier ID = Identifier.of(TVHSMod.MOD_ID, name);
+        RegistryKey<Item> itemKey = RegistryKey.of(RegistryKeys.ITEM, ID);
+
+        Item item = itemFactory.apply(settings.registryKey(itemKey));
+        Registry.register(Registries.ITEM, itemKey, item);
+        return item;
+    }
 }

+ 42 - 0
src/main/java/top/lucason/tvhs_mc_server_mod/mixin/PlayerHeadMixin.java

@@ -0,0 +1,42 @@
+package top.lucason.tvhs_mc_server_mod.mixin;
+
+import net.minecraft.entity.effect.StatusEffectInstance;
+import net.minecraft.entity.effect.StatusEffects;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.PlayerHeadItem;
+import net.minecraft.sound.SoundCategory;
+import net.minecraft.sound.SoundEvents;
+import net.minecraft.util.ActionResult;
+import net.minecraft.util.Hand;
+import net.minecraft.world.World;
+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.CallbackInfoReturnable;
+
+@Mixin(Item.class)
+public abstract class PlayerHeadMixin {
+    @Inject(method = "use", at = @At("HEAD"), cancellable = true)
+    private void use(World world, PlayerEntity user, Hand hand, CallbackInfoReturnable<ActionResult> cir) {
+        ItemStack stack = user.getStackInHand(hand);
+        Item thisItem = (Item)(Object) this;
+
+        if (thisItem instanceof PlayerHeadItem) {
+            if (!world.isClient) {
+                user.addStatusEffect(new StatusEffectInstance(StatusEffects.REGENERATION, 100, 1));
+                user.addStatusEffect(new StatusEffectInstance(StatusEffects.SPEED, 300, 0));
+                world.playSound(null, user.getBlockPos(), SoundEvents.ENTITY_PLAYER_BURP, SoundCategory.PLAYERS, 1.0F, 1.0F);
+
+                if (!user.getAbilities().creativeMode) {
+                    stack.decrement(1);
+                }
+            }
+
+            user.swingHand(hand);
+            user.getItemCooldownManager().set(user.getStackInHand(hand), 100);
+            cir.setReturnValue(ActionResult.SUCCESS);
+        }
+    }
+}

BIN
src/main/resources/assets/tvhs_mc_server_mod/textures/item/golden_head.png


+ 1 - 0
src/main/resources/tvhs_mc_server_mod.mixins.json

@@ -4,6 +4,7 @@
   "package": "top.lucason.tvhs_mc_server_mod.mixin",
   "compatibilityLevel": "JAVA_21",
   "mixins": [
+    "PlayerHeadMixin"
   ],
   "injectors": {
     "defaultRequire": 1