From 5784339941c83b152f64041d037099702caf1081 Mon Sep 17 00:00:00 2001 From: TartaricAcid Date: Fri, 1 Oct 2021 20:11:58 +0800 Subject: [PATCH] Fixed chair issues - Fixed the maid's yaw when sitting on the chair - Fixed the chair's yaw render - Fixed the y rotation of some chair model files - Fixed mounted height issues of the chair --- .../renderer/entity/EntityChairRenderer.java | 2 +- .../entity/item/EntityChair.java | 25 +++--- .../touhoulittlemaid/item/ItemChair.java | 77 ++++++++++-------- .../touhou_little_maid-1.0.0.zip | Bin 1610925 -> 1612143 bytes 4 files changed, 58 insertions(+), 46 deletions(-) diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/entity/EntityChairRenderer.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/entity/EntityChairRenderer.java index 5c44f0a6e..81e9000ae 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/entity/EntityChairRenderer.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/client/renderer/entity/EntityChairRenderer.java @@ -55,7 +55,7 @@ public ResourceLocation getTextureLocation(EntityChair entity) { @Override protected void setupRotations(EntityChair chair, MatrixStack matrixStackIn, float ageInTicks, float rotationYaw, float partialTicks) { - matrixStackIn.mulPose(Vector3f.YP.rotation(180 - chair.yRot)); + matrixStackIn.mulPose(Vector3f.YP.rotationDegrees(180 - rotationYaw)); } @Override diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/item/EntityChair.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/item/EntityChair.java index 2aad350c8..b4e822176 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/item/EntityChair.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/entity/item/EntityChair.java @@ -33,13 +33,16 @@ public class EntityChair extends AbstractEntityFromItem { public static final EntityType TYPE = EntityType.Builder.of(EntityChair::new, EntityClassification.MISC) .sized(0.875f, 0.5f).clientTrackingRange(10).build("chair"); + private static final DataParameter MODEL_ID = EntityDataManager.defineId(EntityChair.class, DataSerializers.STRING); + private static final DataParameter MOUNTED_HEIGHT = EntityDataManager.defineId(EntityChair.class, DataSerializers.FLOAT); + private static final DataParameter TAMEABLE_CAN_RIDE = EntityDataManager.defineId(EntityChair.class, DataSerializers.BOOLEAN); + private static final String MODEL_ID_TAG = "ModelId"; private static final String MOUNTED_HEIGHT_TAG = "MountedHeight"; private static final String TAMEABLE_CAN_RIDE_TAG = "TameableCanRide"; + private static final String DEFAULT_MODEL_ID = "touhou_little_maid:cushion"; - private float mountedHeight = 0.0f; - private boolean tameableCanRide = true; protected EntityChair(EntityType type, World worldIn) { super(type, worldIn); @@ -59,6 +62,8 @@ public EntityChair(World worldIn, double x, double y, double z, float yaw) { protected void defineSynchedData() { super.defineSynchedData(); this.entityData.define(MODEL_ID, DEFAULT_MODEL_ID); + this.entityData.define(MOUNTED_HEIGHT, 0f); + this.entityData.define(TAMEABLE_CAN_RIDE, true); } @Override @@ -119,7 +124,7 @@ public void positionRider(Entity passenger) { // renderYawOffset 也必须同步,因为坐上的女仆朝向受 renderYawOffset 限制 // 不同步就会导致朝向出现小问题 // Fixme: 有问题,需要修改 - this.yHeadRot = ((LivingEntity) passenger).yHeadRot; + // this.yHeadRot = ((LivingEntity) passenger).yHeadRot; } } @@ -193,20 +198,20 @@ public void setModelId(String modelId) { } public float getMountedHeight() { - return mountedHeight; + return this.entityData.get(MOUNTED_HEIGHT); } - public void setMountedHeight(float mountedHeight) { - // 防止有人恶意利用这一点,强行增加范围限制 - this.mountedHeight = MathHelper.clamp(mountedHeight, -0.5f, 2.5f); + public void setMountedHeight(float height) { + height = MathHelper.clamp(height, -0.5f, 2.5f); + this.entityData.set(MOUNTED_HEIGHT, height); } public boolean isTameableCanRide() { - return tameableCanRide; + return this.entityData.get(TAMEABLE_CAN_RIDE); } - public void setTameableCanRide(boolean tameableCanRide) { - this.tameableCanRide = tameableCanRide; + public void setTameableCanRide(boolean canRide) { + this.entityData.set(TAMEABLE_CAN_RIDE, canRide); } public boolean hasPassenger() { diff --git a/src/main/java/com/github/tartaricacid/touhoulittlemaid/item/ItemChair.java b/src/main/java/com/github/tartaricacid/touhoulittlemaid/item/ItemChair.java index a89266f9d..146ea921b 100644 --- a/src/main/java/com/github/tartaricacid/touhoulittlemaid/item/ItemChair.java +++ b/src/main/java/com/github/tartaricacid/touhoulittlemaid/item/ItemChair.java @@ -3,22 +3,23 @@ import com.github.tartaricacid.touhoulittlemaid.client.renderer.tileentity.TileEntityItemStackChairRenderer; import com.github.tartaricacid.touhoulittlemaid.entity.item.EntityChair; import com.github.tartaricacid.touhoulittlemaid.init.InitItems; +import com.google.common.base.Predicates; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.util.ITooltipFlag; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemUseContext; +import net.minecraft.entity.SpawnReason; +import net.minecraft.item.*; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.*; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.world.World; +import net.minecraft.world.server.ServerWorld; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.util.Constants; @@ -50,38 +51,44 @@ public static ItemStack setData(ItemStack stack, Data data) { } @Override - public ActionResult use(World worldIn, PlayerEntity playerIn, Hand handIn) { - return super.use(worldIn, playerIn, handIn); - } - - @Override - public ActionResultType onItemUseFirst(ItemStack stack, ItemUseContext context) { - if (context.getClickedFace() == Direction.UP) { - ItemStack itemstack = context.getItemInHand(); - float yaw = (float) MathHelper.floor((MathHelper.wrapDegrees(context.getRotation() - 180.0F) + 22.5F) / 45.0F) * 45.0F; - BlockPos pos = context.getClickedPos(); - EntityChair chair = new EntityChair(context.getLevel(), pos.getX() + 0.5, pos.above().getY(), pos.getZ() + 0.5, yaw); - Data data = Data.deserialization(stack.getOrCreateTag()); - chair.setModelId(data.getModelId()); - chair.setMountedHeight(data.getHeight()); - chair.setTameableCanRide(data.isCanRide()); - chair.setNoGravity(data.isNoGravity()); - // 应用命名 - if (itemstack.hasCustomHoverName()) { - chair.setCustomName(itemstack.getDisplayName()); + public ActionResultType useOn(ItemUseContext context) { + if (context.getClickedFace() != Direction.DOWN) { + World world = context.getLevel(); + BlockPos clickedPos = new BlockItemUseContext(context).getClickedPos(); + AxisAlignedBB boundingBox = EntityChair.TYPE.getDimensions().makeBoundingBox(Vector3d.atBottomCenterOf(clickedPos)); + if (world.noCollision(null, boundingBox, Predicates.alwaysTrue()) && world.getEntities(null, boundingBox).isEmpty()) { + ItemStack stack = context.getItemInHand(); + if (world instanceof ServerWorld) { + ServerWorld serverWorld = (ServerWorld) world; + ITextComponent customName = null; + if (stack.hasCustomHoverName()) { + customName = stack.getDisplayName(); + } + EntityChair chair = EntityChair.TYPE.create(serverWorld, stack.getTag(), customName, context.getPlayer(), clickedPos, SpawnReason.SPAWN_EGG, true, true); + if (chair == null) { + return ActionResultType.FAIL; + } + addExtraData(context, stack, chair); + world.addFreshEntity(chair); + world.playSound(null, chair.getX(), chair.getY(), chair.getZ(), SoundEvents.WOOL_PLACE, SoundCategory.BLOCKS, 0.75F, 0.8F); + } + stack.shrink(1); + return ActionResultType.sidedSuccess(world.isClientSide); } - // 物品消耗,实体生成 - if (context.getPlayer() != null && !context.getPlayer().isCreative()) { - context.getItemInHand().shrink(1); - } - if (!context.getLevel().isClientSide) { - context.getLevel().addFreshEntity(chair); - } - chair.yHeadRot = yaw; - chair.playSound(SoundEvents.WOOL_PLACE, 1.0f, 1.0f); - return ActionResultType.SUCCESS; } - return ActionResultType.PASS; + return ActionResultType.FAIL; + } + + private void addExtraData(ItemUseContext context, ItemStack stack, EntityChair chair) { + Data data = Data.deserialization(stack.getOrCreateTag()); + chair.setModelId(data.getModelId()); + chair.setMountedHeight(data.getHeight()); + chair.setTameableCanRide(data.isCanRide()); + chair.setNoGravity(data.isNoGravity()); + float yaw = (float) MathHelper.floor((MathHelper.wrapDegrees(context.getRotation() - 180) + 22.5F) / 45.0F) * 45.0F; + chair.moveTo(chair.getX(), chair.getY(), chair.getZ(), yaw, 0.0F); + chair.setYBodyRot(yaw); + chair.setYHeadRot(yaw); } @Override diff --git a/src/main/resources/assets/touhou_little_maid/tlm_custom_pack/touhou_little_maid-1.0.0.zip b/src/main/resources/assets/touhou_little_maid/tlm_custom_pack/touhou_little_maid-1.0.0.zip index 9a97f63d17845dc6481097f48d225bb194258218..3a3830ac37f69c6f02148fa2627df246441084f8 100644 GIT binary patch delta 8622 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 U(un2CaAg=@;^R~9ARqz$KV?W(BLDyZ delta 7679 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 o