diff --git a/src/main/java/com/atsuishio/superbwarfare/ModUtils.java b/src/main/java/com/atsuishio/superbwarfare/ModUtils.java index b8b9a0b50..f6cb2cd98 100644 --- a/src/main/java/com/atsuishio/superbwarfare/ModUtils.java +++ b/src/main/java/com/atsuishio/superbwarfare/ModUtils.java @@ -52,6 +52,7 @@ public class ModUtils { ModMenuTypes.REGISTRY.register(bus); ModVillagers.register(bus); ModRecipes.RECIPE_SERIALIZERS.register(bus); + ModArmorMaterials.MATERIALS.register(bus); // bus.addListener(this::onCommonSetup); // bus.addListener(this::onClientSetup); diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/armor/GeHelmetM35Model.java b/src/main/java/com/atsuishio/superbwarfare/client/model/armor/GeHelmetM35Model.java new file mode 100644 index 000000000..0e1491a98 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/armor/GeHelmetM35Model.java @@ -0,0 +1,24 @@ +package com.atsuishio.superbwarfare.client.model.armor; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.armor.GeHelmetM35; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.model.GeoModel; + +public class GeHelmetM35Model extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(GeHelmetM35 object) { + return null; + } + + @Override + public ResourceLocation getModelResource(GeHelmetM35 object) { + return ModUtils.loc("geo/ge_helmet_m_35.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(GeHelmetM35 object) { + return ModUtils.loc("textures/armor/ge_helmet_m_35.png"); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/armor/RuChest6b43Model.java b/src/main/java/com/atsuishio/superbwarfare/client/model/armor/RuChest6b43Model.java new file mode 100644 index 000000000..ec117273f --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/armor/RuChest6b43Model.java @@ -0,0 +1,24 @@ +package com.atsuishio.superbwarfare.client.model.armor; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.armor.RuChest6b43; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.model.GeoModel; + +public class RuChest6b43Model extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(RuChest6b43 object) { + return null; + } + + @Override + public ResourceLocation getModelResource(RuChest6b43 object) { + return ModUtils.loc("geo/ru_chest_6b43.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(RuChest6b43 object) { + return ModUtils.loc("textures/armor/ru_chest_6b43.png"); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/armor/RuHelmet6b47Model.java b/src/main/java/com/atsuishio/superbwarfare/client/model/armor/RuHelmet6b47Model.java new file mode 100644 index 000000000..908afbfcc --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/armor/RuHelmet6b47Model.java @@ -0,0 +1,24 @@ +package com.atsuishio.superbwarfare.client.model.armor; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.armor.RuHelmet6b47; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.model.GeoModel; + +public class RuHelmet6b47Model extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(RuHelmet6b47 object) { + return null; + } + + @Override + public ResourceLocation getModelResource(RuHelmet6b47 object) { + return ModUtils.loc("geo/ru_helmet_6b47.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(RuHelmet6b47 object) { + return ModUtils.loc("textures/armor/ru_helmet_6b47.png"); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/armor/UsChestIotvModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/armor/UsChestIotvModel.java new file mode 100644 index 000000000..7ebe76b0b --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/armor/UsChestIotvModel.java @@ -0,0 +1,24 @@ +package com.atsuishio.superbwarfare.client.model.armor; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.armor.UsChestIotv; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.model.GeoModel; + +public class UsChestIotvModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(UsChestIotv object) { + return null; + } + + @Override + public ResourceLocation getModelResource(UsChestIotv object) { + return ModUtils.loc("geo/us_chest_iotv.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(UsChestIotv object) { + return ModUtils.loc("textures/armor/us_chest_iotv.png"); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/model/armor/UsHelmetPastgModel.java b/src/main/java/com/atsuishio/superbwarfare/client/model/armor/UsHelmetPastgModel.java new file mode 100644 index 000000000..a9c6fcd97 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/model/armor/UsHelmetPastgModel.java @@ -0,0 +1,24 @@ +package com.atsuishio.superbwarfare.client.model.armor; + +import com.atsuishio.superbwarfare.ModUtils; +import com.atsuishio.superbwarfare.item.armor.UsHelmetPastg; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.model.GeoModel; + +public class UsHelmetPastgModel extends GeoModel { + + @Override + public ResourceLocation getAnimationResource(UsHelmetPastg object) { + return null; + } + + @Override + public ResourceLocation getModelResource(UsHelmetPastg object) { + return ModUtils.loc("geo/us_helmet_pastg.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(UsHelmetPastg object) { + return ModUtils.loc("textures/armor/us_helmet_pastg.png"); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/armor/GeHelmetM35ArmorRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/armor/GeHelmetM35ArmorRenderer.java new file mode 100644 index 000000000..c406e256a --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/armor/GeHelmetM35ArmorRenderer.java @@ -0,0 +1,21 @@ +package com.atsuishio.superbwarfare.client.renderer.armor; + +import com.atsuishio.superbwarfare.client.model.armor.GeHelmetM35Model; +import com.atsuishio.superbwarfare.item.armor.GeHelmetM35; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoArmorRenderer; + +public class GeHelmetM35ArmorRenderer extends GeoArmorRenderer { + public GeHelmetM35ArmorRenderer() { + super(new GeHelmetM35Model()); + this.head = new GeoBone(null, "", false, (double) 0, false, false); + } + + @Override + public RenderType getRenderType(GeHelmetM35 animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/armor/RuChest6b43ArmorRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/armor/RuChest6b43ArmorRenderer.java new file mode 100644 index 000000000..3573d1efb --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/armor/RuChest6b43ArmorRenderer.java @@ -0,0 +1,23 @@ +package com.atsuishio.superbwarfare.client.renderer.armor; + +import com.atsuishio.superbwarfare.client.model.armor.RuChest6b43Model; +import com.atsuishio.superbwarfare.item.armor.RuChest6b43; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoArmorRenderer; + +public class RuChest6b43ArmorRenderer extends GeoArmorRenderer { + public RuChest6b43ArmorRenderer() { + super(new RuChest6b43Model()); + this.body = new GeoBone(null, "armorBody", false, (double) 0, false, false); + this.rightArm = new GeoBone(null, "armorRightArm", false, (double) 0, false, false); + this.leftArm = new GeoBone(null, "armorLeftArm", false, (double) 0, false, false); + } + + @Override + public RenderType getRenderType(RuChest6b43 animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/armor/RuHelmet6b47ArmorRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/armor/RuHelmet6b47ArmorRenderer.java new file mode 100644 index 000000000..ffc3c5dfd --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/armor/RuHelmet6b47ArmorRenderer.java @@ -0,0 +1,21 @@ +package com.atsuishio.superbwarfare.client.renderer.armor; + +import com.atsuishio.superbwarfare.client.model.armor.RuHelmet6b47Model; +import com.atsuishio.superbwarfare.item.armor.RuHelmet6b47; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoArmorRenderer; + +public class RuHelmet6b47ArmorRenderer extends GeoArmorRenderer { + public RuHelmet6b47ArmorRenderer() { + super(new RuHelmet6b47Model()); + this.head = new GeoBone(null, "", false, (double) 0, false, false); + } + + @Override + public RenderType getRenderType(RuHelmet6b47 animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/armor/UsChestIotvArmorRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/armor/UsChestIotvArmorRenderer.java new file mode 100644 index 000000000..4f779d3ca --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/armor/UsChestIotvArmorRenderer.java @@ -0,0 +1,23 @@ +package com.atsuishio.superbwarfare.client.renderer.armor; + +import com.atsuishio.superbwarfare.client.model.armor.UsChestIotvModel; +import com.atsuishio.superbwarfare.item.armor.UsChestIotv; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoArmorRenderer; + +public class UsChestIotvArmorRenderer extends GeoArmorRenderer { + public UsChestIotvArmorRenderer() { + super(new UsChestIotvModel()); + this.body = new GeoBone(null, "armorBody", false, (double) 0, false, false); + this.rightArm = new GeoBone(null, "armorRightArm", false, (double) 0, false, false); + this.leftArm = new GeoBone(null, "armorLeftArm", false, (double) 0, false, false); + } + + @Override + public RenderType getRenderType(UsChestIotv animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/client/renderer/armor/UsHelmetPastgArmorRenderer.java b/src/main/java/com/atsuishio/superbwarfare/client/renderer/armor/UsHelmetPastgArmorRenderer.java new file mode 100644 index 000000000..f6104d53c --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/client/renderer/armor/UsHelmetPastgArmorRenderer.java @@ -0,0 +1,21 @@ +package com.atsuishio.superbwarfare.client.renderer.armor; + +import com.atsuishio.superbwarfare.client.model.armor.UsHelmetPastgModel; +import com.atsuishio.superbwarfare.item.armor.UsHelmetPastg; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.cache.object.GeoBone; +import software.bernie.geckolib.renderer.GeoArmorRenderer; + +public class UsHelmetPastgArmorRenderer extends GeoArmorRenderer { + public UsHelmetPastgArmorRenderer() { + super(new UsHelmetPastgModel()); + this.head = new GeoBone(null, "", false, (double) 0, false, false); + } + + @Override + public RenderType getRenderType(UsHelmetPastg animatable, ResourceLocation texture, MultiBufferSource bufferSource, float partialTick) { + return RenderType.entityTranslucent(getTextureLocation(animatable)); + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModArmorMaterials.java b/src/main/java/com/atsuishio/superbwarfare/init/ModArmorMaterials.java new file mode 100644 index 000000000..cd1c32e0f --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModArmorMaterials.java @@ -0,0 +1,47 @@ +package com.atsuishio.superbwarfare.init; + +import com.atsuishio.superbwarfare.ModUtils; +import net.minecraft.Util; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.crafting.Ingredient; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; + +import java.util.EnumMap; +import java.util.List; + +public class ModArmorMaterials { + + public static final DeferredRegister MATERIALS = DeferredRegister.create(BuiltInRegistries.ARMOR_MATERIAL, ModUtils.MODID); + + public static final DeferredHolder CEMENTED_CARBIDE = MATERIALS.register("cemented_carbide", () -> new ArmorMaterial( + Util.make(new EnumMap<>(ArmorItem.Type.class), p -> { + p.put(ArmorItem.Type.BOOTS, 3); + p.put(ArmorItem.Type.LEGGINGS, 6); + p.put(ArmorItem.Type.CHESTPLATE, 8); + p.put(ArmorItem.Type.HELMET, 3); + }), + 10, + SoundEvents.ARMOR_EQUIP_IRON, + () -> Ingredient.of(ModItems.CEMENTED_CARBIDE_INGOT.value()), + List.of(), + 4F, 0.05F) + ); + + public static final DeferredHolder STEEL = MATERIALS.register("steel", () -> new ArmorMaterial( + Util.make(new EnumMap<>(ArmorItem.Type.class), p -> { + p.put(ArmorItem.Type.BOOTS, 2); + p.put(ArmorItem.Type.LEGGINGS, 5); + p.put(ArmorItem.Type.CHESTPLATE, 7); + p.put(ArmorItem.Type.HELMET, 2); + }), + 9, + SoundEvents.ARMOR_EQUIP_IRON, + () -> Ingredient.of(ModItems.STEEL_INGOT.value()), + List.of(), + 1F, 0) + ); +} diff --git a/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java b/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java index 95d1247bb..93d934b75 100644 --- a/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java +++ b/src/main/java/com/atsuishio/superbwarfare/init/ModItems.java @@ -2,6 +2,7 @@ package com.atsuishio.superbwarfare.init; import com.atsuishio.superbwarfare.ModUtils; import com.atsuishio.superbwarfare.item.*; +import com.atsuishio.superbwarfare.item.armor.*; import com.atsuishio.superbwarfare.item.common.BlueprintItem; import com.atsuishio.superbwarfare.item.common.CannonShellItem; import com.atsuishio.superbwarfare.item.common.MaterialPack; @@ -138,13 +139,13 @@ public class ModItems { // public static final DeferredHolder HAMMER = ITEMS.register("hammer", Hammer::new); public static final DeferredHolder CROWBAR = ITEMS.register("crowbar", Crowbar::new); // public static final DeferredHolder DEFUSER = ITEMS.register("defuser", Defuser::new); -// public static final DeferredHolder ARMOR_PLATE = ITEMS.register("armor_plate", ArmorPlate::new); + public static final DeferredHolder ARMOR_PLATE = ITEMS.register("armor_plate", ArmorPlate::new); // -// public static final DeferredHolder RU_HELMET_6B47 = ITEMS.register("ru_helmet_6b47", RuHelmet6b47::new); -// public static final DeferredHolder RU_CHEST_6B43 = ITEMS.register("ru_chest_6b43", RuChest6b43::new); -// public static final DeferredHolder US_HELMET_PASTG = ITEMS.register("us_helmet_pastg", UsHelmetPastg::new); -// public static final DeferredHolder US_CHEST_IOTV = ITEMS.register("us_chest_iotv", UsChestIotv::new); -// public static final DeferredHolder GE_HELMET_M_35 = ITEMS.register("ge_helmet_m_35", GeHelmetM35::new); +public static final DeferredHolder RU_HELMET_6B47 = ITEMS.register("ru_helmet_6b47", RuHelmet6b47::new); + public static final DeferredHolder RU_CHEST_6B43 = ITEMS.register("ru_chest_6b43", RuChest6b43::new); + public static final DeferredHolder US_HELMET_PASTG = ITEMS.register("us_helmet_pastg", UsHelmetPastg::new); + public static final DeferredHolder US_CHEST_IOTV = ITEMS.register("us_chest_iotv", UsChestIotv::new); + public static final DeferredHolder GE_HELMET_M_35 = ITEMS.register("ge_helmet_m_35", GeHelmetM35::new); // public static final DeferredHolder MORTAR_DEPLOYER = ITEMS.register("mortar_deployer", MortarDeployer::new); public static final DeferredHolder MORTAR_BARREL = ITEMS.register("mortar_barrel", () -> new Item(new Item.Properties())); public static final DeferredHolder MORTAR_BASE_PLATE = ITEMS.register("mortar_base_plate", () -> new Item(new Item.Properties())); diff --git a/src/main/java/com/atsuishio/superbwarfare/item/ArmorPlate.java b/src/main/java/com/atsuishio/superbwarfare/item/ArmorPlate.java new file mode 100644 index 000000000..3f2765530 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/ArmorPlate.java @@ -0,0 +1,107 @@ +package com.atsuishio.superbwarfare.item; + +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.tools.NBTTool; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.UseAnim; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.List; + +public class ArmorPlate extends Item { + public ArmorPlate() { + super(new Properties()); + } + + @Override + @ParametersAreNonnullByDefault + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltipComponents, TooltipFlag tooltipFlag) { + if (NBTTool.getOrCreateTag(stack).getBoolean("Infinite")) { + tooltipComponents.add(Component.translatable("des.superbwarfare.armor_plate.infinite").withStyle(ChatFormatting.GRAY)); + } + } + + @Override + @ParametersAreNonnullByDefault + public @NotNull InteractionResultHolder use(Level worldIn, Player playerIn, InteractionHand handIn) { + ItemStack stack = playerIn.getItemInHand(handIn); + ItemStack armor = playerIn.getItemBySlot(EquipmentSlot.CHEST); + + if (armor == ItemStack.EMPTY) return InteractionResultHolder.fail(stack); + + int armorLevel = 1; + if (armor.is(ModTags.Items.MILITARY_ARMOR)) { + armorLevel = 2; + } else if (armor.is(ModTags.Items.MILITARY_ARMOR_HEAVY)) { + armorLevel = 3; + } + + // TODO 解决数据双端同步问题 + if (NBTTool.getOrCreateTag(armor).getDouble("ArmorPlate") < armorLevel * 15) { + playerIn.startUsingItem(handIn); + } + + return InteractionResultHolder.fail(stack); + } + + @Override + public @NotNull UseAnim getUseAnimation(@NotNull ItemStack stack) { + return UseAnim.BOW; + } + + @Override + @ParametersAreNonnullByDefault + public @NotNull ItemStack finishUsingItem(ItemStack pStack, Level pLevel, LivingEntity pLivingEntity) { + if (!pLevel.isClientSide) { + ItemStack armor = pLivingEntity.getItemBySlot(EquipmentSlot.CHEST); + + int armorLevel = 1; + if (armor.is(ModTags.Items.MILITARY_ARMOR)) { + armorLevel = 2; + } else if (armor.is(ModTags.Items.MILITARY_ARMOR_HEAVY)) { + armorLevel = 3; + } + + NBTTool.getOrCreateTag(armor).putDouble("ArmorPlate", Mth.clamp(NBTTool.getOrCreateTag(armor).getDouble("ArmorPlate") + 15, 0, armorLevel * 15)); + + if (pLivingEntity instanceof ServerPlayer serverPlayer) { + serverPlayer.level().playSound((Entity) null, serverPlayer.getOnPos(), SoundEvents.ARMOR_EQUIP_IRON.value(), SoundSource.PLAYERS, 0.5f, 1); + } + + if (pLivingEntity instanceof Player player && !player.isCreative() && !NBTTool.getOrCreateTag(pStack).getBoolean("Infinite")) { + pStack.shrink(1); + } + } + + return super.finishUsingItem(pStack, pLevel, pLivingEntity); + } + + @Override + @ParametersAreNonnullByDefault + public int getUseDuration(ItemStack stack, LivingEntity entity) { + return 20; + } + + public static ItemStack getInfiniteInstance() { + ItemStack stack = new ItemStack(ModItems.ARMOR_PLATE.get()); + NBTTool.getOrCreateTag(stack).putBoolean("Infinite", true); + return stack; + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/item/CustomRendererArmor.java b/src/main/java/com/atsuishio/superbwarfare/item/CustomRendererArmor.java new file mode 100644 index 000000000..c04ffa9c8 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/CustomRendererArmor.java @@ -0,0 +1,8 @@ +package com.atsuishio.superbwarfare.item; + +import net.minecraft.world.item.Item; +import software.bernie.geckolib.renderer.GeoArmorRenderer; + +public interface CustomRendererArmor { + GeoArmorRenderer getRenderer(); +} diff --git a/src/main/java/com/atsuishio/superbwarfare/item/CustomRendererItem.java b/src/main/java/com/atsuishio/superbwarfare/item/CustomRendererItem.java new file mode 100644 index 000000000..d722bcae1 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/CustomRendererItem.java @@ -0,0 +1,8 @@ +package com.atsuishio.superbwarfare.item; + +import net.minecraft.world.item.Item; +import software.bernie.geckolib.renderer.GeoItemRenderer; + +public interface CustomRendererItem { + GeoItemRenderer getRenderer(); +} diff --git a/src/main/java/com/atsuishio/superbwarfare/item/armor/ArmorRendererRegister.java b/src/main/java/com/atsuishio/superbwarfare/item/armor/ArmorRendererRegister.java new file mode 100644 index 000000000..a52434727 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/armor/ArmorRendererRegister.java @@ -0,0 +1,41 @@ +package com.atsuishio.superbwarfare.item.armor; + +import com.atsuishio.superbwarfare.init.ModItems; +import com.atsuishio.superbwarfare.item.CustomRendererArmor; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; +import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent; +import org.jetbrains.annotations.NotNull; +import software.bernie.geckolib.renderer.GeoArmorRenderer; + +import javax.annotation.ParametersAreNonnullByDefault; + +public class ArmorRendererRegister { + @SubscribeEvent + private static void registerArmorExtensions(RegisterClientExtensionsEvent event) { + + for (var item : ModItems.ITEMS.getEntries()) { + if (!(item instanceof CustomRendererArmor armor)) continue; + event.registerItem(new IClientItemExtensions() { + + private GeoArmorRenderer renderer; + + @Override + @ParametersAreNonnullByDefault + public @NotNull HumanoidModel getHumanoidArmorModel(LivingEntity livingEntity, ItemStack itemStack, EquipmentSlot equipmentSlot, HumanoidModel original) { + if (this.renderer == null) + this.renderer = armor.getRenderer(); + + // TODO other params? + this.renderer.prepForRender(livingEntity, itemStack, equipmentSlot, original); + return this.renderer; + } + + }, item); + } + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/item/armor/GeHelmetM35.java b/src/main/java/com/atsuishio/superbwarfare/item/armor/GeHelmetM35.java new file mode 100644 index 000000000..43436d6a1 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/armor/GeHelmetM35.java @@ -0,0 +1,47 @@ +package com.atsuishio.superbwarfare.item.armor; + +import com.atsuishio.superbwarfare.client.renderer.armor.GeHelmetM35ArmorRenderer; +import com.atsuishio.superbwarfare.init.ModArmorMaterials; +import com.atsuishio.superbwarfare.item.CustomRendererArmor; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.Item; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.renderer.GeoArmorRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +public class GeHelmetM35 extends ArmorItem implements GeoItem, CustomRendererArmor { + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public GeHelmetM35() { + super(ModArmorMaterials.STEEL, Type.HELMET, new Properties()); + } + + @Override + public GeoArmorRenderer getRenderer() { + return new GeHelmetM35ArmorRenderer(); + } + + // TODO attribute modifier +// @Override +// public Multimap getAttributeModifiers(EquipmentSlot slot, ItemStack stack) { +// Multimap map = super.getDefaultAttributeModifiers(slot); +// UUID uuid = new UUID(slot.toString().hashCode(), 0); +// if (slot == EquipmentSlot.HEAD) { +// map = HashMultimap.create(map); +// map.put(ModAttributes.BULLET_RESISTANCE.get(), new AttributeModifier(uuid, ModUtils.ATTRIBUTE_MODIFIER, +// 0.1 * Math.max(0, 1 - (double) stack.getDamageValue() / stack.getMaxDamage()), AttributeModifier.Operation.ADDITION)); +// } +// return map; +// } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/item/armor/RuChest6b43.java b/src/main/java/com/atsuishio/superbwarfare/item/armor/RuChest6b43.java new file mode 100644 index 000000000..2c5762427 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/armor/RuChest6b43.java @@ -0,0 +1,47 @@ +package com.atsuishio.superbwarfare.item.armor; + +import com.atsuishio.superbwarfare.client.renderer.armor.RuChest6b43ArmorRenderer; +import com.atsuishio.superbwarfare.init.ModArmorMaterials; +import com.atsuishio.superbwarfare.item.CustomRendererArmor; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.Item; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.renderer.GeoArmorRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +public class RuChest6b43 extends ArmorItem implements GeoItem, CustomRendererArmor { + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public RuChest6b43() { + super(ModArmorMaterials.CEMENTED_CARBIDE, Type.CHESTPLATE, new Properties()); + } + + @Override + public GeoArmorRenderer getRenderer() { + return new RuChest6b43ArmorRenderer(); + } + + // TODO attribute +// @Override +// public Multimap getAttributeModifiers(EquipmentSlot slot, ItemStack stack) { +// Multimap map = super.getDefaultAttributeModifiers(slot); +// UUID uuid = new UUID(slot.toString().hashCode(), 0); +// if (slot == EquipmentSlot.CHEST) { +// map = HashMultimap.create(map); +// map.put(ModAttributes.BULLET_RESISTANCE.get(), new AttributeModifier(uuid, ModUtils.ATTRIBUTE_MODIFIER, +// 0.5 * Math.max(0, 1 - (double) stack.getDamageValue() / stack.getMaxDamage()), AttributeModifier.Operation.ADDITION)); +// } +// return map; +// } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/item/armor/RuHelmet6b47.java b/src/main/java/com/atsuishio/superbwarfare/item/armor/RuHelmet6b47.java new file mode 100644 index 000000000..509cf54d0 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/armor/RuHelmet6b47.java @@ -0,0 +1,47 @@ +package com.atsuishio.superbwarfare.item.armor; + +import com.atsuishio.superbwarfare.client.renderer.armor.RuHelmet6b47ArmorRenderer; +import com.atsuishio.superbwarfare.init.ModArmorMaterials; +import com.atsuishio.superbwarfare.item.CustomRendererArmor; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.Item; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.renderer.GeoArmorRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +public class RuHelmet6b47 extends ArmorItem implements GeoItem, CustomRendererArmor { + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public RuHelmet6b47() { + super(ModArmorMaterials.CEMENTED_CARBIDE, Type.HELMET, new Properties()); + } + + @Override + public GeoArmorRenderer getRenderer() { + return new RuHelmet6b47ArmorRenderer(); + } + + // todo attribute +// @Override +// public Multimap getAttributeModifiers(EquipmentSlot slot, ItemStack stack) { +// Multimap map = super.getDefaultAttributeModifiers(slot); +// UUID uuid = new UUID(slot.toString().hashCode(), 0); +// if (slot == EquipmentSlot.HEAD) { +// map = HashMultimap.create(map); +// map.put(ModAttributes.BULLET_RESISTANCE.get(), new AttributeModifier(uuid, ModUtils.ATTRIBUTE_MODIFIER, +// 0.2 * Math.max(0, 1 - (double) stack.getDamageValue() / stack.getMaxDamage()), AttributeModifier.Operation.ADDITION)); +// } +// return map; +// } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/item/armor/UsChestIotv.java b/src/main/java/com/atsuishio/superbwarfare/item/armor/UsChestIotv.java new file mode 100644 index 000000000..824edee60 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/armor/UsChestIotv.java @@ -0,0 +1,47 @@ +package com.atsuishio.superbwarfare.item.armor; + +import com.atsuishio.superbwarfare.client.renderer.armor.UsChestIotvArmorRenderer; +import com.atsuishio.superbwarfare.init.ModArmorMaterials; +import com.atsuishio.superbwarfare.item.CustomRendererArmor; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.Item; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.renderer.GeoArmorRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +public class UsChestIotv extends ArmorItem implements GeoItem, CustomRendererArmor { + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public UsChestIotv() { + super(ModArmorMaterials.CEMENTED_CARBIDE, Type.CHESTPLATE, new Properties()); + } + + @Override + public GeoArmorRenderer getRenderer() { + return new UsChestIotvArmorRenderer(); + } + + // todo attribute +// @Override +// public Multimap getAttributeModifiers(EquipmentSlot slot, ItemStack stack) { +// Multimap map = super.getDefaultAttributeModifiers(slot); +// UUID uuid = new UUID(slot.toString().hashCode(), 0); +// if (slot == EquipmentSlot.CHEST) { +// map = HashMultimap.create(map); +// map.put(ModAttributes.BULLET_RESISTANCE.get(), new AttributeModifier(uuid, ModUtils.ATTRIBUTE_MODIFIER, +// 0.5 * Math.max(0, 1 - (double) stack.getDamageValue() / stack.getMaxDamage()), AttributeModifier.Operation.ADDITION)); +// } +// return map; +// } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/item/armor/UsHelmetPastg.java b/src/main/java/com/atsuishio/superbwarfare/item/armor/UsHelmetPastg.java new file mode 100644 index 000000000..5568f73c3 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/item/armor/UsHelmetPastg.java @@ -0,0 +1,47 @@ +package com.atsuishio.superbwarfare.item.armor; + +import com.atsuishio.superbwarfare.client.renderer.armor.UsHelmetPastgArmorRenderer; +import com.atsuishio.superbwarfare.init.ModArmorMaterials; +import com.atsuishio.superbwarfare.item.CustomRendererArmor; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.Item; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.renderer.GeoArmorRenderer; +import software.bernie.geckolib.util.GeckoLibUtil; + +public class UsHelmetPastg extends ArmorItem implements GeoItem, CustomRendererArmor { + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public UsHelmetPastg() { + super(ModArmorMaterials.CEMENTED_CARBIDE, Type.HELMET, new Properties()); + } + + @Override + public GeoArmorRenderer getRenderer() { + return new UsHelmetPastgArmorRenderer(); + } + + // todo attribute +// @Override +// public Multimap getAttributeModifiers(EquipmentSlot slot, ItemStack stack) { +// Multimap map = super.getDefaultAttributeModifiers(slot); +// UUID uuid = new UUID(slot.toString().hashCode(), 0); +// if (slot == EquipmentSlot.HEAD) { +// map = HashMultimap.create(map); +// map.put(ModAttributes.BULLET_RESISTANCE.get(), new AttributeModifier(uuid, ModUtils.ATTRIBUTE_MODIFIER, +// 0.2 * Math.max(0, 1 - (double) stack.getDamageValue() / stack.getMaxDamage()), AttributeModifier.Operation.ADDITION)); +// } +// return map; +// } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar data) { + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } +} diff --git a/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java b/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java index c1cabecea..37ac76988 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/gun/GunItem.java @@ -6,6 +6,7 @@ import com.atsuishio.superbwarfare.client.PoseTool; import com.atsuishio.superbwarfare.client.tooltip.component.GunImageComponent; import com.atsuishio.superbwarfare.init.ModItems; import com.atsuishio.superbwarfare.init.ModTags; +import com.atsuishio.superbwarfare.item.CustomRendererItem; import com.atsuishio.superbwarfare.perk.Perk; import com.atsuishio.superbwarfare.tools.AmmoType; import com.atsuishio.superbwarfare.tools.GunsTool; @@ -32,14 +33,13 @@ import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent; import org.jetbrains.annotations.NotNull; -import software.bernie.geckolib.renderer.GeoItemRenderer; import javax.annotation.ParametersAreNonnullByDefault; import java.util.Optional; import java.util.Set; @EventBusSubscriber(modid = ModUtils.MODID, bus = EventBusSubscriber.Bus.MOD) -public abstract class GunItem extends Item { +public abstract class GunItem extends Item implements CustomRendererItem { public GunItem(Properties properties) { super(properties); @@ -414,8 +414,6 @@ public abstract class GunItem extends Item { } } - public abstract GeoItemRenderer getRenderer(); - @SubscribeEvent private static void registerGunExtensions(RegisterClientExtensionsEvent event) { for (var item : ModItems.GUNS.getEntries()) {