2024/11/02

Add New Entity
This commit is contained in:
叁玖领域 2024-11-03 12:37:33 +08:00
parent 3cb1cc3ccc
commit 6471f956fa
18 changed files with 233 additions and 15 deletions

View File

@ -1,9 +1,10 @@
// 1.21 2024-11-01T00:08:54.8327658 Item Models: leashedplayer
// 1.21 2024-11-03T11:56:02.1200385 Item Models: leashedplayer
766c487fbf0c59e9045eeaf81daf583eb679b0e1 assets/leashedplayer/models/item/amethyst_shears.json
5846df9d85726428905701120ef34c9324c20faf assets/leashedplayer/models/item/bow_lra_pulling_0.json
845a7316b86e26f88c6932d4ef2656126503727a assets/leashedplayer/models/item/bow_lra_pulling_1.json
5bd1f9f28b91005c587f1c38fb77cd19b59495e3 assets/leashedplayer/models/item/bow_lra_pulling_2.json
83946f4d60d0fb1758d6553c36330506c8e48ada assets/leashedplayer/models/item/crossbow_leash_rope_arrow.json
bb0d76077719c83c8a8bd4346a24ea1766175125 assets/leashedplayer/models/item/fabric.json
63ec6c618a3a23eab4cab9c52d7d3250de9b516e assets/leashedplayer/models/item/kid_spawn_egg.json
114d3cc5832ef047403114504483c6f3ea07e77c assets/leashedplayer/models/item/leash_rope_arrow.json
c4748995a5fe190d20e3bd16f4b2244164ec0f83 assets/leashedplayer/models/item/spectral_leash_rope_arrow.json

View File

@ -1,2 +1,2 @@
// 1.21 2024-11-02T23:21:56.3625648 Languages: en_us for mod: leashedplayer
dad5064bbdf42ff624b9a0b7f24b17274fa247c2 assets/leashedplayer/lang/en_us.json
// 1.21 2024-11-03T11:56:02.1210394 Languages: en_us for mod: leashedplayer
e37115e9e6433f0d2a2748efc9749b10204119c7 assets/leashedplayer/lang/en_us.json

View File

@ -1,2 +1,2 @@
// 1.21 2024-11-02T23:04:02.4438077 Languages: lzh for mod: leashedplayer
b13bfd7bcb371f7da65fe06086a3db47da2de9cd assets/leashedplayer/lang/lzh.json
// 1.21 2024-11-03T11:56:02.1150382 Languages: lzh for mod: leashedplayer
a9b5a3116c6381872e174909553b8dac080dede8 assets/leashedplayer/lang/lzh.json

View File

@ -1,2 +1,2 @@
// 1.21 2024-11-02T23:21:56.3615582 Languages: zh_cn for mod: leashedplayer
2e3e8d720e46344cc2069590242ef2ab9fbdb435 assets/leashedplayer/lang/zh_cn.json
// 1.21 2024-11-03T11:56:02.119039 Languages: zh_cn for mod: leashedplayer
bc7e4095ad9239d38aff0e14e4eb8be3903980ec assets/leashedplayer/lang/zh_cn.json

View File

@ -1,2 +1,2 @@
// 1.21 2024-11-02T23:21:56.3599006 Languages: zh_tw for mod: leashedplayer
a3d780ceee5ee80b007fd0ed01c91c256f82b5a4 assets/leashedplayer/lang/zh_tw.json
// 1.21 2024-11-03T11:56:02.1180379 Languages: zh_tw for mod: leashedplayer
a4e3c3350a1a38b98fa7d7c0c2305a2c79440a50 assets/leashedplayer/lang/zh_tw.json

View File

@ -19,6 +19,7 @@
"advancement.leashedplayer.no_leash.desc": "You cannot be leashed by ANY",
"creativetab.leashedplayer.leashedplayer_tab": "Leashed Player",
"effect.leashedplayer.no_leash": "No Leash",
"entity.leashedplayer.kid_player": "Kid",
"entity.leashedplayer.leash_rope_arrow": "Leash Rope Arrow",
"entity.leashedplayer.spectral_leash_rope_arrow": "Spectral Leash Rope Arrow",
"gamerule.LP.CreateLeashFenceKnotEntityIfAbsent": "Create Leash Fence Knot Entity if absent",
@ -32,6 +33,7 @@
"item.leash_rope_arrow.description": "Arrows with ropes attached?",
"item.leashedplayer.amethyst_shears": "Amethyst Shears",
"item.leashedplayer.fabric": "Fabric",
"item.leashedplayer.kid_spawn_egg": "Kid Spawn Egg",
"item.leashedplayer.leash_rope_arrow": "Leash Rope Arrow",
"item.leashedplayer.spectral_leash_rope_arrow": "Spectral Leash Rope Arrow",
"item.minecraft.lingering_potion.effect.no_leash": "Splash No Leash Potion",

View File

@ -1,4 +1,5 @@
{
"entity.leashedplayer.kid_player": "幼",
"gamerule.LP.DefaultTalkArea.description": "阖局初置非负数,则限一顾之日下,若立聊城小在直则用其常,若用玩义直上跻之地",
"leashedplayer.chat.none_heard_you": "无人受子问",
"leashedplayer.command.chat.message.talkarea.current_config": "%s§6今聊城可知半径置§e %d§6格§f(§a默§7§e%d格§f)§r",

View File

@ -19,6 +19,7 @@
"advancement.leashedplayer.no_leash.desc": "你不会被任何东西拴住",
"creativetab.leashedplayer.leashedplayer_tab": "可拴玩家",
"effect.leashedplayer.no_leash": "禁拴",
"entity.leashedplayer.kid_player": "小孩",
"entity.leashedplayer.leash_rope_arrow": "拴绳箭",
"entity.leashedplayer.spectral_leash_rope_arrow": "拴绳光灵箭",
"gamerule.LP.CreateLeashFenceKnotEntityIfAbsent": "如果缺失则创建拴绳结",
@ -32,6 +33,7 @@
"item.leash_rope_arrow.description": "带有拴绳的箭矢?",
"item.leashedplayer.amethyst_shears": "紫水晶剪刀",
"item.leashedplayer.fabric": "Fabric",
"item.leashedplayer.kid_spawn_egg": "小孩生成蛋",
"item.leashedplayer.leash_rope_arrow": "拴绳箭",
"item.leashedplayer.spectral_leash_rope_arrow": "拴绳光灵箭",
"item.minecraft.lingering_potion.effect.no_leash": "滞留型禁拴药水",

View File

@ -19,6 +19,7 @@
"advancement.leashedplayer.no_leash.desc": "恁不會被任何拴住",
"creativetab.leashedplayer.leashedplayer_tab": "可拴玩家",
"effect.leashedplayer.no_leash": "禁拴",
"entity.leashedplayer.kid_player": "小孩",
"entity.leashedplayer.leash_rope_arrow": "拴繩箭",
"entity.leashedplayer.spectral_leash_rope_arrow": "拴繩光靈箭",
"gamerule.LP.CreateLeashFenceKnotEntityIfAbsent": "如果缺失則創建拴繩結",
@ -32,6 +33,7 @@
"item.leash_rope_arrow.description": "帶有拴繩的箭矢?",
"item.leashedplayer.amethyst_shears": "紫水晶剪刀",
"item.leashedplayer.fabric": "Fabric",
"item.leashedplayer.kid_spawn_egg": "小孩生成蛋",
"item.leashedplayer.leash_rope_arrow": "拴繩箭",
"item.leashedplayer.spectral_leash_rope_arrow": "拴繩光靈箭",
"item.minecraft.lingering_potion.effect.no_leash": "滯留型禁拴藥水",

View File

@ -0,0 +1,3 @@
{
"parent": "minecraft:item/template_spawn_egg"
}

View File

@ -1,5 +1,6 @@
package com.r3944realms.leashedplayer;
import com.r3944realms.leashedplayer.client.renders.entities.KidPlayerRenderer;
import com.r3944realms.leashedplayer.client.renders.entities.LeashRopeArrowRenderer;
import com.r3944realms.leashedplayer.client.renders.entities.SpectralLeashRopeArrowRenderer;
import com.r3944realms.leashedplayer.content.entities.ModEntityRegister;
@ -37,6 +38,7 @@ public class ClientEventHandler {
public static void RegisterRenderer(EntityRenderersEvent.RegisterRenderers event) {
event.registerEntityRenderer(ModEntityRegister.LEASH_ROPE_ARROW.get(), LeashRopeArrowRenderer::new);
event.registerEntityRenderer(ModEntityRegister.SPECTRAL_LEASH_ROPE_ARROW.get(), SpectralLeashRopeArrowRenderer::new);
event.registerEntityRenderer(ModEntityRegister.KID.get(), KidPlayerRenderer::create);
}
}

View File

@ -8,6 +8,8 @@ import com.r3944realms.leashedplayer.content.commands.TickCommand;
import com.r3944realms.leashedplayer.content.effects.ModEffectRegister;
import com.r3944realms.leashedplayer.content.effects.ModPotionRegister;
import com.r3944realms.leashedplayer.content.entities.LeashRopeArrow;
import com.r3944realms.leashedplayer.content.entities.LittlePlayer;
import com.r3944realms.leashedplayer.content.entities.ModEntityRegister;
import com.r3944realms.leashedplayer.content.items.ModItemRegister;
import com.r3944realms.leashedplayer.content.misc.LeadBreakItemBehavior;
import com.r3944realms.leashedplayer.modInterface.PlayerLeashable;
@ -25,6 +27,7 @@ import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
import net.neoforged.neoforge.event.RegisterCommandsEvent;
import net.neoforged.neoforge.event.brewing.RegisterBrewingRecipesEvent;
import net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent;
import net.neoforged.neoforge.event.tick.EntityTickEvent;
@ -78,6 +81,10 @@ public class CommonEventHandler {
DispenserBlock.registerProjectileBehavior(ModItemRegister.SPECTRAL_LEASH_ROPE_ARROW.get());
DispenserBlock.registerBehavior(ModItemRegister.AMETHYST_SHEARS.get(), new LeadBreakItemBehavior());
}
@SubscribeEvent
public static void onEntityAttributeEvent(EntityAttributeCreationEvent event) {
event.put(ModEntityRegister.KID.get(), LittlePlayer.createAttributes().build());
}
}

View File

@ -0,0 +1,106 @@
package com.r3944realms.leashedplayer.client.renders.entities;
import com.mojang.blaze3d.vertex.PoseStack;
import com.r3944realms.leashedplayer.content.entities.LittlePlayer;
import net.minecraft.client.model.HumanoidModel;
import net.minecraft.client.model.PlayerModel;
import net.minecraft.client.model.geom.ModelLayers;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.entity.*;
import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.HumanoidArm;
import net.minecraft.world.item.CrossbowItem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.UseAnim;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.api.distmarker.OnlyIn;
import org.jetbrains.annotations.NotNull;
@OnlyIn(Dist.CLIENT)
public class KidPlayerRenderer extends HumanoidMobRenderer<LittlePlayer, PlayerModel<LittlePlayer>> {
public static @NotNull KidPlayerRenderer create(@NotNull EntityRendererProvider.Context pContext) {
if (pContext instanceof PlayerContext pc) {
return new KidPlayerRenderer(pc);
}
return new KidPlayerRenderer(new PlayerContext(pContext, true));
}
public static class PlayerContext extends EntityRendererProvider.Context {
boolean isUseSlimModel;
public PlayerContext(EntityRendererProvider.Context pContext, boolean pIsSlimModel) {
super(pContext.getEntityRenderDispatcher(), pContext.getItemRenderer(), pContext.getBlockRenderDispatcher(), pContext.getItemInHandRenderer(), pContext.getResourceManager(), pContext.getModelSet(), pContext.getFont());
this.isUseSlimModel = pIsSlimModel;
}
public boolean isUseSlimModel() {
return isUseSlimModel;
}
}
public KidPlayerRenderer(PlayerContext pContext) {
super(pContext, new PlayerModel<>(pContext.bakeLayer(pContext.isUseSlimModel() ? ModelLayers.PLAYER_SLIM : ModelLayers.PLAYER), pContext.isUseSlimModel()), 0.5F);
this.addLayer(new HumanoidArmorLayer<>(this,
new HumanoidModel<>(pContext.bakeLayer(ModelLayers.PLAYER_INNER_ARMOR)),
new HumanoidModel<>(pContext.bakeLayer(ModelLayers.PLAYER_OUTER_ARMOR)),
pContext.getModelManager()
));
}
@Override
public @NotNull ResourceLocation getTextureLocation(@NotNull LittlePlayer pEntity) {
return pEntity.getSkin().texture();
}
public void render(@NotNull LittlePlayer companion, float companionYaw, float pPartialTicks, @NotNull PoseStack pMatrixStack,
@NotNull MultiBufferSource pBuffer, int pPackedLight) {
this.setModelProperties(companion);
super.render(companion, companionYaw, pPartialTicks, pMatrixStack, pBuffer, pPackedLight);
}
private void setModelProperties(LittlePlayer companion) {
PlayerModel<LittlePlayer> companionModel = this.getModel();
HumanoidModel.ArmPose humanoidmodel$armpose = getArmPose(companion, InteractionHand.MAIN_HAND);
HumanoidModel.ArmPose humanoidmodel$armpose1 = getArmPose(companion, InteractionHand.OFF_HAND);
if (companion.getMainArm() == HumanoidArm.RIGHT) {
companionModel.rightArmPose = humanoidmodel$armpose;
companionModel.leftArmPose = humanoidmodel$armpose1;
} else {
companionModel.rightArmPose = humanoidmodel$armpose1;
companionModel.leftArmPose = humanoidmodel$armpose;
}
}
private static HumanoidModel.ArmPose getArmPose(LittlePlayer companion, InteractionHand hand) {
ItemStack itemstack = companion.getItemInHand(hand);
if (itemstack.isEmpty()) {
return HumanoidModel.ArmPose.EMPTY;
} else {
if (companion.getUsedItemHand() == hand && companion.getUseItemRemainingTicks() > 0) {
UseAnim useanim = itemstack.getUseAnimation();
if (useanim == UseAnim.BOW) {
return HumanoidModel.ArmPose.BOW_AND_ARROW;
}
if (useanim == UseAnim.CROSSBOW && hand == companion.getUsedItemHand()) {
return HumanoidModel.ArmPose.CROSSBOW_CHARGE;
}
} else if (!companion.swinging && itemstack.is(Items.CROSSBOW) && CrossbowItem.isCharged(itemstack)) {
return HumanoidModel.ArmPose.CROSSBOW_HOLD;
}
return HumanoidModel.ArmPose.ITEM;
}
}
protected void scale(@NotNull LittlePlayer player, PoseStack pPoseStack, float pPartialTickTime) {
float f = 0.9375F;
pPoseStack.scale(f, f, f);
}
}

View File

@ -0,0 +1,80 @@
package com.r3944realms.leashedplayer.content.entities;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.PlayerInfo;
import net.minecraft.client.resources.DefaultPlayerSkin;
import net.minecraft.client.resources.PlayerSkin;
import net.minecraft.network.syncher.EntityDataAccessor;
import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.AgeableMob;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.ai.attributes.AttributeSupplier;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.NotNull;
import javax.annotation.Nullable;
import java.util.Objects;
import static net.minecraft.world.entity.EquipmentSlot.*;
public class LittlePlayer extends AgeableMob {
private static final EntityDataAccessor<Integer> DATA_TYPE_ID = SynchedEntityData.defineId(LittlePlayer.class, EntityDataSerializers.INT);
private static final EntityDataAccessor<Integer> BASE_HEALTH = SynchedEntityData.defineId(LittlePlayer.class,EntityDataSerializers.INT);
public EquipmentSlot[] armorTypes = new EquipmentSlot[]{FEET, LEGS,
CHEST, EquipmentSlot.HEAD};
@Nullable
private PlayerInfo playerInfo;
protected LittlePlayer(EntityType<? extends AgeableMob> pEntityType, Level pLevel) {
super(pEntityType, pLevel);
}
public static AttributeSupplier.Builder createAttributes() {
return AgeableMob.createMobAttributes()
.add(Attributes.MAX_HEALTH, 20.0D)
.add(Attributes.MOVEMENT_SPEED, 0.32D);
}
@Nullable
public PlayerInfo getPlayerInfo() {
if (this.playerInfo == null) {
try {
this.playerInfo = Objects.requireNonNull(Minecraft.getInstance().getConnection()).getPlayerInfo(this.getUUID());
} catch (Exception ignored) {
}
}
return this.playerInfo;
}
public PlayerSkin getSkin() {
PlayerInfo playerinfo = this.getPlayerInfo();
return playerinfo == null ? DefaultPlayerSkin.get(this.getUUID()) : playerinfo.getSkin();
}
@Override
public AgeableMob getBreedOffspring(@NotNull ServerLevel pLevel, @NotNull AgeableMob pOtherParent) {
return ModEntityRegister.KID.get().create(pLevel);
}
@Override
protected void defineSynchedData(SynchedEntityData.@NotNull Builder pBuilder) {
super.defineSynchedData(pBuilder);
pBuilder.define(DATA_TYPE_ID, 1);
pBuilder.define(BASE_HEALTH, 20);
}
public void setBaseHealth(int health) {
this.entityData.set(BASE_HEALTH, health);
}
public float getBaseHealth() {
return this.entityData.get(BASE_HEALTH);
}
@Override
public boolean isBaby() {
return true;
}
}

View File

@ -28,6 +28,11 @@ public class ModEntityRegister {
.updateInterval(20)
.build("spectral_leash_rope_arrow")
);
public static final DeferredHolder<EntityType<?>, EntityType<LittlePlayer>> KID = ENTITY_TYPE.register("kid_player",
() -> EntityType.Builder.of(LittlePlayer::new, MobCategory.MISC)
.sized(0.6f,1.08f)
.build("kid_player")
);
// public static final DeferredHolder<EntityType<?>, EntityType<ChainTieEntity>> CHAIN_TIE = ENTITY_TYPE.register(
// "chain_tie",
// () -> EntityType.Builder.<ChainTieEntity>of(ChainTieEntity::new, MobCategory.MISC)

View File

@ -1,18 +1,16 @@
package com.r3944realms.leashedplayer.content.items;
import com.r3944realms.leashedplayer.LeashedPlayer;
import com.r3944realms.leashedplayer.content.entities.ModEntityRegister;
import com.r3944realms.leashedplayer.content.items.type.LeadBreakerItem;
import com.r3944realms.leashedplayer.content.items.type.LeashRopeArrowItem;
import com.r3944realms.leashedplayer.content.items.type.SpectralLeashRopeArrowItem;
import com.r3944realms.leashedplayer.content.items.type.TestItem;
import net.minecraft.core.component.DataComponents;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ShearsItem;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.neoforge.common.DeferredSpawnEggItem;
import net.neoforged.neoforge.registries.DeferredRegister;
import java.util.ArrayList;
@ -35,7 +33,8 @@ public class ModItemRegister {
public static final Supplier<Item> AMETHYST_SHEARS = ModItemRegister.register("amethyst_shears",
() -> new LeadBreakerItem(new Item.Properties().durability(100).component(DataComponents.TOOL, LeadBreakerItem.createToolProperties())
.stacksTo(1)));
public static final Supplier<Item> KID_SPAWN_EGG = ModItemRegister.register("kid_spawn_egg",
() -> new DeferredSpawnEggItem(ModEntityRegister.KID, 0x3F4F1F, 0x3D0D4D, new Item.Properties()));
public static Supplier<Item> register(String name, Supplier<Item> supplier) {
return register(name, supplier, true);
}

View File

@ -31,7 +31,7 @@ public enum ModLangKeyValue {
ITEM_SPECTRAL_LEASH_ROPE_ARROW(ModItemRegister.SPECTRAL_LEASH_ROPE_ARROW, ModPartEnum.ITEM, "Spectral Leash Rope Arrow", "拴绳光灵箭", "拴繩光靈箭", true),
TEST_FABRIC_ITEM(ModItemRegister.FABRIC, ModPartEnum.ITEM, "Fabric", "Fabric", "Fabric", true),
AMETHYST_SHEARS(ModItemRegister.AMETHYST_SHEARS, ModPartEnum.ITEM, "Amethyst Shears", "紫水晶剪刀", "紫水晶剪刀", true),
KID_SPAWN_EGG(ModItemRegister.KID_SPAWN_EGG, ModPartEnum.ITEM, "Kid Spawn Egg", "小孩生成蛋", "小孩生成蛋", false),
//ITEM_DESC
DESC_ITEM_LEASH_ROPE_ARROW(LeashRopeArrowItem.descKey, ModPartEnum.DESCRIPTION, "Arrows with ropes attached?","带有拴绳的箭矢?", "帶有拴繩的箭矢?", false),
//PAINTING
@ -40,6 +40,7 @@ public enum ModLangKeyValue {
//ENTITY
LEASH_ROPE_ARROW(ModEntityRegister.getEntityNameKey("leash_rope_arrow"), ModPartEnum.ENTITY, "Leash Rope Arrow", "拴绳箭", "拴繩箭", false),
SPECTRAL_LEASH_ROPE_ARROW(ModEntityRegister.getEntityNameKey("spectral_leash_rope_arrow"), ModPartEnum.ENTITY, "Spectral Leash Rope Arrow", "拴绳光灵箭", "拴繩光靈箭", false),
kID(ModEntityRegister.getEntityNameKey("kid_player"), ModPartEnum.ENTITY, "Kid", "小孩", "小孩", "", false),
//CREATIVE_TAB
CREATIVE_TAB_NAME(ModCreativeTab.getCreativeMod(LEASHED_PLAYER_ITEM), ModPartEnum.CREATIVE_TAB, "Leashed Player","可拴玩家", "可拴玩家", false),
//COMMAND_MESSAGE

View File

@ -2,10 +2,13 @@ package com.r3944realms.leashedplayer.datagen.provider;
import com.r3944realms.leashedplayer.LeashedPlayer;
import com.r3944realms.leashedplayer.content.items.ModItemRegister;
import com.r3944realms.leashedplayer.datagen.LanguageAndOtherData.ModLangKeyValue;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.data.PackOutput;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Item;
import net.neoforged.neoforge.client.model.generators.ItemModelBuilder;
import net.neoforged.neoforge.client.model.generators.ItemModelProvider;
import net.neoforged.neoforge.client.model.generators.ModelFile;
import net.neoforged.neoforge.common.data.ExistingFileHelper;
@ -46,6 +49,7 @@ public class ModItemModelProvider extends ItemModelProvider {
getBuilder("bow_lra_pulling_2")
.parent(new ModelFile.UncheckedModelFile("item/bow"))
.texture("layer0", ResourceLocation.fromNamespaceAndPath(LeashedPlayer.MOD_ID, "item/bow_lra_pulling_2"));
spawnEgg(ModItemRegister.KID_SPAWN_EGG.get());
}
@Override
@ -55,4 +59,7 @@ public class ModItemModelProvider extends ItemModelProvider {
// 注册进阶材质物品模型非模板大量需要可以用BlockBench生成的就行了
AdvancedModItemModelRegister();
}
public ItemModelBuilder spawnEgg(Item item) {
return withExistingParent(BuiltInRegistries.ITEM.getKey(item).getPath(), mcLoc("item/template_spawn_egg"));
}
}