正确渲染盔甲

This commit is contained in:
Light_Quanta 2025-04-04 05:31:39 +08:00
parent b9cff51b28
commit de26447164
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
7 changed files with 85 additions and 182 deletions

View file

@ -1,42 +0,0 @@
package com.atsuishio.superbwarfare.item.armor;
import com.atsuishio.superbwarfare.init.ModItems;
import com.atsuishio.superbwarfare.item.CustomRendererArmor;
import net.minecraft.client.Minecraft;
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();
var mc = Minecraft.getInstance();
this.renderer.prepForRender(livingEntity, itemStack, equipmentSlot, original, mc.levelRenderer.renderBuffers.bufferSource(), mc.getTimer().getGameTimeDeltaPartialTick(true), 0, 0, 0, 0);
return this.renderer;
}
}, item);
}
}
}

View file

@ -2,31 +2,72 @@ package com.atsuishio.superbwarfare.item.armor;
import com.atsuishio.superbwarfare.Mod; import com.atsuishio.superbwarfare.Mod;
import com.atsuishio.superbwarfare.init.ModAttributes; import com.atsuishio.superbwarfare.init.ModAttributes;
import net.minecraft.client.model.HumanoidModel;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.EquipmentSlotGroup; import net.minecraft.world.entity.EquipmentSlotGroup;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.ai.attributes.AttributeModifier; import net.minecraft.world.entity.ai.attributes.AttributeModifier;
import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ArmorItem;
import net.minecraft.world.item.ArmorMaterial; import net.minecraft.world.item.ArmorMaterial;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.component.ItemAttributeModifiers; import net.minecraft.world.item.component.ItemAttributeModifiers;
import org.jetbrains.annotations.NotNull;
import software.bernie.geckolib.animatable.GeoItem;
import software.bernie.geckolib.animatable.client.GeoRenderProvider;
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;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.function.Consumer;
import java.util.function.Supplier;
public abstract class BulletResistantArmor extends ArmorItem { public abstract class BulletResistantArmor extends ArmorItem implements GeoItem {
private float bulletResistance = 0.1f; private final Supplier<GeoArmorRenderer<? extends Item>> renderer;
private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this);
public BulletResistantArmor(Holder<ArmorMaterial> material, Type type, Properties properties) { @Override
super(material, type, properties); public AnimatableInstanceCache getAnimatableInstanceCache() {
} return this.cache;
public BulletResistantArmor(Holder<ArmorMaterial> material, Type type, Properties properties, float bulletResistance) {
super(material, type, properties);
this.bulletResistance = bulletResistance;
} }
@Override @Override
public ItemAttributeModifiers getDefaultAttributeModifiers(ItemStack stack) { public void createGeoRenderer(Consumer<GeoRenderProvider> consumer) {
consumer.accept(new GeoRenderProvider() {
private GeoArmorRenderer<? extends Item> renderer;
@Override
public <T extends LivingEntity> HumanoidModel<?> getGeoArmorRenderer(T livingEntity, ItemStack itemStack, EquipmentSlot equipmentSlot, HumanoidModel<T> original) {
if (this.renderer == null)
this.renderer = BulletResistantArmor.this.renderer.get();
return this.renderer;
}
});
}
@Override
public void registerControllers(AnimatableManager.ControllerRegistrar data) {
}
private float bulletResistance = 0.1f;
public BulletResistantArmor(Holder<ArmorMaterial> material, Type type, Properties properties, Supplier<GeoArmorRenderer<? extends Item>> renderer) {
super(material, type, properties);
this.renderer = renderer;
}
public BulletResistantArmor(Holder<ArmorMaterial> material, Type type, Properties properties, float bulletResistance, Supplier<GeoArmorRenderer<? extends Item>> renderer) {
super(material, type, properties);
this.bulletResistance = bulletResistance;
this.renderer = renderer;
}
@Override
public @NotNull ItemAttributeModifiers getDefaultAttributeModifiers(@NotNull ItemStack stack) {
var modifiers = super.getDefaultAttributeModifiers(stack); var modifiers = super.getDefaultAttributeModifiers(stack);
var list = new ArrayList<>(modifiers.modifiers()); var list = new ArrayList<>(modifiers.modifiers());
list.add(new ItemAttributeModifiers.Entry(ModAttributes.BULLET_RESISTANCE, new AttributeModifier(Mod.ATTRIBUTE_MODIFIER, list.add(new ItemAttributeModifiers.Entry(ModAttributes.BULLET_RESISTANCE, new AttributeModifier(Mod.ATTRIBUTE_MODIFIER,

View file

@ -2,33 +2,13 @@ package com.atsuishio.superbwarfare.item.armor;
import com.atsuishio.superbwarfare.client.renderer.armor.GeHelmetM35ArmorRenderer; import com.atsuishio.superbwarfare.client.renderer.armor.GeHelmetM35ArmorRenderer;
import com.atsuishio.superbwarfare.init.ModArmorMaterials; import com.atsuishio.superbwarfare.init.ModArmorMaterials;
import com.atsuishio.superbwarfare.item.CustomRendererArmor;
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 BulletResistantArmor implements GeoItem, CustomRendererArmor {
private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this);
public class GeHelmetM35 extends BulletResistantArmor {
public GeHelmetM35() { public GeHelmetM35() {
super(ModArmorMaterials.STEEL, Type.HELMET, new Properties().durability(Type.HELMET.getDurability(35))); super(ModArmorMaterials.STEEL,
} Type.HELMET,
new Properties().durability(Type.HELMET.getDurability(35)),
@Override GeHelmetM35ArmorRenderer::new
public GeoArmorRenderer<? extends Item> getRenderer() { );
return new GeHelmetM35ArmorRenderer();
}
@Override
public void registerControllers(AnimatableManager.ControllerRegistrar data) {
}
@Override
public AnimatableInstanceCache getAnimatableInstanceCache() {
return this.cache;
} }
} }

View file

@ -2,33 +2,14 @@ package com.atsuishio.superbwarfare.item.armor;
import com.atsuishio.superbwarfare.client.renderer.armor.RuChest6b43ArmorRenderer; import com.atsuishio.superbwarfare.client.renderer.armor.RuChest6b43ArmorRenderer;
import com.atsuishio.superbwarfare.init.ModArmorMaterials; import com.atsuishio.superbwarfare.init.ModArmorMaterials;
import com.atsuishio.superbwarfare.item.CustomRendererArmor;
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 BulletResistantArmor implements GeoItem, CustomRendererArmor {
private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this);
public class RuChest6b43 extends BulletResistantArmor {
public RuChest6b43() { public RuChest6b43() {
super(ModArmorMaterials.CEMENTED_CARBIDE, Type.CHESTPLATE, new Properties().durability(Type.CHESTPLATE.getDurability(50)), 0.5f); super(ModArmorMaterials.CEMENTED_CARBIDE,
} Type.CHESTPLATE,
new Properties().durability(Type.CHESTPLATE.getDurability(50)),
@Override 0.5f,
public GeoArmorRenderer<? extends Item> getRenderer() { RuChest6b43ArmorRenderer::new
return new RuChest6b43ArmorRenderer(); );
}
@Override
public void registerControllers(AnimatableManager.ControllerRegistrar data) {
}
@Override
public AnimatableInstanceCache getAnimatableInstanceCache() {
return this.cache;
} }
} }

View file

@ -2,33 +2,14 @@ package com.atsuishio.superbwarfare.item.armor;
import com.atsuishio.superbwarfare.client.renderer.armor.RuHelmet6b47ArmorRenderer; import com.atsuishio.superbwarfare.client.renderer.armor.RuHelmet6b47ArmorRenderer;
import com.atsuishio.superbwarfare.init.ModArmorMaterials; import com.atsuishio.superbwarfare.init.ModArmorMaterials;
import com.atsuishio.superbwarfare.item.CustomRendererArmor;
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 BulletResistantArmor implements GeoItem, CustomRendererArmor {
private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this);
public class RuHelmet6b47 extends BulletResistantArmor {
public RuHelmet6b47() { public RuHelmet6b47() {
super(ModArmorMaterials.CEMENTED_CARBIDE, Type.HELMET, new Properties().durability(Type.HELMET.getDurability(50)), 0.2f); super(ModArmorMaterials.CEMENTED_CARBIDE,
} Type.HELMET,
new Properties().durability(Type.HELMET.getDurability(50)),
@Override 0.2f,
public GeoArmorRenderer<? extends Item> getRenderer() { RuHelmet6b47ArmorRenderer::new
return new RuHelmet6b47ArmorRenderer(); );
}
@Override
public void registerControllers(AnimatableManager.ControllerRegistrar data) {
}
@Override
public AnimatableInstanceCache getAnimatableInstanceCache() {
return this.cache;
} }
} }

View file

@ -2,33 +2,14 @@ package com.atsuishio.superbwarfare.item.armor;
import com.atsuishio.superbwarfare.client.renderer.armor.UsChestIotvArmorRenderer; import com.atsuishio.superbwarfare.client.renderer.armor.UsChestIotvArmorRenderer;
import com.atsuishio.superbwarfare.init.ModArmorMaterials; import com.atsuishio.superbwarfare.init.ModArmorMaterials;
import com.atsuishio.superbwarfare.item.CustomRendererArmor;
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 BulletResistantArmor implements GeoItem, CustomRendererArmor {
private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this);
public class UsChestIotv extends BulletResistantArmor {
public UsChestIotv() { public UsChestIotv() {
super(ModArmorMaterials.CEMENTED_CARBIDE, Type.CHESTPLATE, new Properties().durability(Type.CHESTPLATE.getDurability(50)), 0.5f); super(ModArmorMaterials.CEMENTED_CARBIDE,
} Type.CHESTPLATE,
new Properties().durability(Type.CHESTPLATE.getDurability(50)),
@Override 0.5f,
public GeoArmorRenderer<? extends Item> getRenderer() { UsChestIotvArmorRenderer::new
return new UsChestIotvArmorRenderer(); );
}
@Override
public void registerControllers(AnimatableManager.ControllerRegistrar data) {
}
@Override
public AnimatableInstanceCache getAnimatableInstanceCache() {
return this.cache;
} }
} }

View file

@ -2,33 +2,14 @@ package com.atsuishio.superbwarfare.item.armor;
import com.atsuishio.superbwarfare.client.renderer.armor.UsHelmetPastgArmorRenderer; import com.atsuishio.superbwarfare.client.renderer.armor.UsHelmetPastgArmorRenderer;
import com.atsuishio.superbwarfare.init.ModArmorMaterials; import com.atsuishio.superbwarfare.init.ModArmorMaterials;
import com.atsuishio.superbwarfare.item.CustomRendererArmor;
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 BulletResistantArmor implements GeoItem, CustomRendererArmor {
private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this);
public class UsHelmetPastg extends BulletResistantArmor {
public UsHelmetPastg() { public UsHelmetPastg() {
super(ModArmorMaterials.CEMENTED_CARBIDE, Type.HELMET, new Properties().durability(Type.HELMET.getDurability(50)), 0.2f); super(ModArmorMaterials.CEMENTED_CARBIDE,
} Type.HELMET,
new Properties().durability(Type.HELMET.getDurability(50)),
@Override 0.2f,
public GeoArmorRenderer<? extends Item> getRenderer() { UsHelmetPastgArmorRenderer::new
return new UsHelmetPastgArmorRenderer(); );
}
@Override
public void registerControllers(AnimatableManager.ControllerRegistrar data) {
}
@Override
public AnimatableInstanceCache getAnimatableInstanceCache() {
return this.cache;
} }
} }