From cfdc56f7b272b0af84bed18add5d054bf062824d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E9=9B=A8=E8=90=BD?= Date: Sun, 17 Nov 2024 21:56:29 +0800 Subject: [PATCH] Add karting renderer. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 秋雨落 --- build.gradle | 4 +- .../teacon/powertool/client/ClientEvents.java | 7 ++ .../renders/entity/MartingEntityRenderer.java | 24 +++- .../entity/model/MartingEntityModel.java | 5 +- .../powertool/entity/MartingEntity.java | 113 +++++++++++++++++- .../powertool/entity/PowerToolEntities.java | 6 +- .../teacon/powertool/item/MartingItem.java | 8 +- .../teacon/powertool/item/PowerToolItems.java | 7 +- .../assets/powertool/lang/en_us.json | 6 +- .../assets/powertool/lang/zh_cn.json | 8 +- .../item/{marting.json => marting_car.json} | 2 +- ...arting_blue.json => marting_car_blue.json} | 2 +- ...ting_green.json => marting_car_green.json} | 2 +- ...{marting_red.json => marting_car_red.json} | 2 +- .../textures/entity/marting_blue.png | Bin 1943 -> 0 bytes .../textures/entity/marting_green.png | Bin 1959 -> 0 bytes .../powertool/textures/entity/marting_red.png | Bin 1864 -> 0 bytes 17 files changed, 171 insertions(+), 25 deletions(-) rename src/main/resources/assets/powertool/models/item/{marting.json => marting_car.json} (99%) rename src/main/resources/assets/powertool/models/item/{marting_blue.json => marting_car_blue.json} (58%) rename src/main/resources/assets/powertool/models/item/{marting_green.json => marting_car_green.json} (59%) rename src/main/resources/assets/powertool/models/item/{marting_red.json => marting_car_red.json} (58%) delete mode 100644 src/main/resources/assets/powertool/textures/entity/marting_blue.png delete mode 100644 src/main/resources/assets/powertool/textures/entity/marting_green.png delete mode 100644 src/main/resources/assets/powertool/textures/entity/marting_red.png diff --git a/build.gradle b/build.gradle index 109b959..1a1e22a 100644 --- a/build.gradle +++ b/build.gradle @@ -103,12 +103,12 @@ neoForge { // "SCAN": For mods scan. // "REGISTRIES": For firing of registry events. // "REGISTRYDUMP": For getting the contents of all registries. - systemProperty 'forge.logging.markers', 'REGISTRIES' +// systemProperty 'forge.logging.markers', 'REGISTRIES' // Recommended logging level for the console // You can set various levels here. // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels - logLevel = org.slf4j.event.Level.DEBUG + logLevel = org.slf4j.event.Level.INFO } } diff --git a/src/main/java/org/teacon/powertool/client/ClientEvents.java b/src/main/java/org/teacon/powertool/client/ClientEvents.java index 35e3282..4c5c13e 100644 --- a/src/main/java/org/teacon/powertool/client/ClientEvents.java +++ b/src/main/java/org/teacon/powertool/client/ClientEvents.java @@ -34,6 +34,7 @@ import org.teacon.powertool.client.renders.FenceKnotRenderer; import org.teacon.powertool.client.renders.TempleRenderer; import org.teacon.powertool.client.renders.entity.MartingEntityRenderer; +import org.teacon.powertool.client.renders.entity.model.MartingEntityModel; import org.teacon.powertool.client.renders.holo_sign.HolographicSignBlockEntityRenderer; import org.teacon.powertool.client.renders.ItemDisplayBlockEntityRenderer; import org.teacon.powertool.client.renders.ItemSupplierBlockEntityRenderer; @@ -165,6 +166,12 @@ public static void renderers(EntityRenderersEvent.RegisterRenderers event) { event.registerEntityRenderer(PowerToolEntities.MARTING.get(), MartingEntityRenderer::new); } + + @SubscribeEvent + public static void on(EntityRenderersEvent.RegisterLayerDefinitions event) { + event.registerLayerDefinition(MartingEntityModel.LAYER, MartingEntityModel::createBodyLayer); + } + @SubscribeEvent public static void on(RegisterGuiLayersEvent event) { event.registerAbove(VanillaGuiLayers.CROSSHAIR, ResourceLocation.fromNamespaceAndPath(PowerTool.MODID, "cashier_hud"), (guiGraphics, partialTicks) -> { diff --git a/src/main/java/org/teacon/powertool/client/renders/entity/MartingEntityRenderer.java b/src/main/java/org/teacon/powertool/client/renders/entity/MartingEntityRenderer.java index 6d200e6..7c85ab6 100644 --- a/src/main/java/org/teacon/powertool/client/renders/entity/MartingEntityRenderer.java +++ b/src/main/java/org/teacon/powertool/client/renders/entity/MartingEntityRenderer.java @@ -1,6 +1,7 @@ package org.teacon.powertool.client.renders.entity; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider; @@ -12,23 +13,44 @@ import org.teacon.powertool.entity.MartingEntity; public class MartingEntityRenderer extends EntityRenderer { + private MartingEntityModel model; +// private final Map>> variantToModel; public MartingEntityRenderer(EntityRendererProvider.Context context) { super(context); this.model = new MartingEntityModel<>(context.bakeLayer(MartingEntityModel.LAYER)); + +// this.variantToModel = Arrays.stream(MartingEntity.Variant.values()) +// .collect( +// ImmutableMap.toImmutableMap( +// v -> v, +// v -> new Tuple<>(v.getTexture(), createModel(context, v))) +// ); } +// private MartingEntityModel createModel(EntityRendererProvider.Context context, MartingEntity.Variant variant) { +// } + @Override public @NotNull ResourceLocation getTextureLocation(@NotNull MartingEntity entity) { return entity.getVariant().getTexture(); } @Override - public void render(MartingEntity entity, float entityYaw, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight) { + public void render(@NotNull MartingEntity entity, float entityYaw, float partialTick, + @NotNull PoseStack poseStack, @NotNull MultiBufferSource bufferSource, int packedLight) { super.render(entity, entityYaw, partialTick, poseStack, bufferSource, packedLight); var buffer = bufferSource.getBuffer(model.renderType(getTextureLocation(entity))); + + poseStack.pushPose(); + poseStack.translate(0, 1.5, 0); + poseStack.mulPose(Axis.YP.rotationDegrees(180.0F - entityYaw)); + poseStack.scale(1, -1, 1); + model.renderToBuffer(poseStack, buffer, packedLight, OverlayTexture.NO_OVERLAY, FastColor.ARGB32.color(255,255,255,255)); + + poseStack.popPose(); } } diff --git a/src/main/java/org/teacon/powertool/client/renders/entity/model/MartingEntityModel.java b/src/main/java/org/teacon/powertool/client/renders/entity/model/MartingEntityModel.java index 0f60839..7bf7932 100644 --- a/src/main/java/org/teacon/powertool/client/renders/entity/model/MartingEntityModel.java +++ b/src/main/java/org/teacon/powertool/client/renders/entity/model/MartingEntityModel.java @@ -13,7 +13,10 @@ import org.teacon.powertool.entity.MartingEntity; public class MartingEntityModel extends EntityModel { - public static final ModelLayerLocation LAYER = new ModelLayerLocation(ResourceLocation.fromNamespaceAndPath(PowerTool.MODID, "marting"), "main"); + public static final ModelLayerLocation LAYER = new ModelLayerLocation(ResourceLocation.fromNamespaceAndPath(PowerTool.MODID, "marting_car"), "main"); +// public static final ModelLayerLocation LAYER_RED = new ModelLayerLocation(ResourceLocation.fromNamespaceAndPath(PowerTool.MODID, "marting_car_red"), "main"); +// public static final ModelLayerLocation LAYER_BLUE = new ModelLayerLocation(ResourceLocation.fromNamespaceAndPath(PowerTool.MODID, "marting_car_green"), "main"); +// public static final ModelLayerLocation LAYER_GREEN = new ModelLayerLocation(ResourceLocation.fromNamespaceAndPath(PowerTool.MODID, "marting_car_blue"), "main"); private final ModelPart kart; private final ModelPart seat; diff --git a/src/main/java/org/teacon/powertool/entity/MartingEntity.java b/src/main/java/org/teacon/powertool/entity/MartingEntity.java index 6e4c07c..9c1f3a4 100644 --- a/src/main/java/org/teacon/powertool/entity/MartingEntity.java +++ b/src/main/java/org/teacon/powertool/entity/MartingEntity.java @@ -1,8 +1,13 @@ package org.teacon.powertool.entity; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MoverType; import net.minecraft.world.entity.vehicle.VehicleEntity; import net.minecraft.world.item.Item; import net.minecraft.world.level.Level; @@ -12,18 +17,118 @@ import java.util.function.Supplier; +/** + * MalayP asked me to write a Karting Car. + * @author qyl27 + */ public class MartingEntity extends VehicleEntity { + + // Todo: wheel speed should depends on velocity. + public static final double WHEEL_ROTATE_DEGREE_PER_TICK = 18; // 360 / 20 + + public static final int MAX_REMAINING_LIFE_TIME_TICKS = 120 * 20; // 2 minutes + + // + private Variant variant = Variant.RED; + private int remainingLifeTimeTicks = MAX_REMAINING_LIFE_TIME_TICKS; + + // + + // + + // Rotate degrees of the steering wheel, negative for left, positive for right. + // Todo: each wheel speed depends on the steering wheel. + private static final EntityDataAccessor DATA_ID_STEERING_WHEEL_ROTATE_DEGREE = SynchedEntityData.defineId(MartingEntity.class, EntityDataSerializers.FLOAT); + + private double wheelRotateDegree = 0; // Wheels rotate degrees, client only + + // + public MartingEntity(EntityType entityType, Level level) { super(entityType, level); } + // + + public void setVariant(Variant variant) { + this.variant = variant; + } + + public Variant getVariant() { + return variant; + } + @Override protected @NotNull Item getDropItem() { return variant.getItemSupplier().get(); } + @Override + public void tick() { + if (!level().isClientSide) { + if (remainingLifeTimeTicks < 0) { + discard(); + } + + if (!getPassengers().isEmpty()) { + remainingLifeTimeTicks = MAX_REMAINING_LIFE_TIME_TICKS; + } else { + remainingLifeTimeTicks -= 1; + } + + applyGravity(); + updateInWaterStateAndDoFluidPushing(); + + move(MoverType.SELF, getDeltaMovement()); + } else { + if (!getPassengers().isEmpty()) { + wheelRotateDegree += WHEEL_ROTATE_DEGREE_PER_TICK; + wheelRotateDegree %= 360; + } + } + + super.tick(); + } + + // + + // + + @Override + protected double getDefaultGravity() { + return 0.04; + } + + @Override + public boolean canBeCollidedWith() { + return true; + } + + @Override + public boolean isPushable() { + return true; + } + + @Override + public boolean isPickable() { + return true; + } + + @Override + public boolean canCollideWith(@NotNull Entity entity) { + return canVehicleCollide(this, entity); + } + + public static boolean canVehicleCollide(@NotNull Entity vehicle, @NotNull Entity entity) { + return (entity.canBeCollidedWith() || entity.isPushable()) && !vehicle.isPassengerOfSameVehicle(entity); + } + + // + + // + @Override protected void readAdditionalSaveData(@NotNull CompoundTag compound) { var variant = compound.getString("variant"); @@ -35,10 +140,14 @@ protected void addAdditionalSaveData(@NotNull CompoundTag compound) { compound.putString("variant", variant.getName()); } - public Variant getVariant() { - return variant; + @Override + protected void defineSynchedData(SynchedEntityData.@NotNull Builder builder) { + super.defineSynchedData(builder); + builder.define(DATA_ID_STEERING_WHEEL_ROTATE_DEGREE, 0F); } + // + public enum Variant { RED("marting_red", PowerToolItems.MARTING_RED), GREEN("marting_green", PowerToolItems.MARTING_GREEN), diff --git a/src/main/java/org/teacon/powertool/entity/PowerToolEntities.java b/src/main/java/org/teacon/powertool/entity/PowerToolEntities.java index aaee206..1786206 100644 --- a/src/main/java/org/teacon/powertool/entity/PowerToolEntities.java +++ b/src/main/java/org/teacon/powertool/entity/PowerToolEntities.java @@ -42,12 +42,12 @@ public class PowerToolEntities { .clientTrackingRange(8) .build("auto_vanish_minecart")); - public static final DeferredHolder, EntityType> MARTING = ENTITIES.register("marting", + public static final DeferredHolder, EntityType> MARTING = ENTITIES.register("marting_car", () -> EntityType.Builder.of(MartingEntity::new, MobCategory.MISC) - .sized(0.98F, 0.7F) + .sized(1.5F, 0.75F) .passengerAttachments(0.1875F) .clientTrackingRange(8) - .build("marting")); + .build("marting_car")); public static final DeferredHolder, EntityDataSerializer>> BLOCK_POS_LIST = ENTITY_DATA_SERIALIZER.register( "block_pos_list", () -> EntityDataSerializer.forValueType(BlockPos.STREAM_CODEC.apply(ByteBufCodecs.collection(HashSet::new)))); diff --git a/src/main/java/org/teacon/powertool/item/MartingItem.java b/src/main/java/org/teacon/powertool/item/MartingItem.java index 9bec150..081fed9 100644 --- a/src/main/java/org/teacon/powertool/item/MartingItem.java +++ b/src/main/java/org/teacon/powertool/item/MartingItem.java @@ -15,8 +15,11 @@ public class MartingItem extends Item { public static final String TOOLTIP = "tooltip.powertool.marting"; - public MartingItem(Properties properties) { + private final MartingEntity.Variant variant; + + public MartingItem(Properties properties, MartingEntity.Variant variant) { super(properties); + this.variant = variant; } @Override @@ -31,8 +34,9 @@ public void appendHoverText(@NotNull ItemStack stack, @NotNull TooltipContext co public @NotNull InteractionResult useOn(@NotNull UseOnContext context) { var level = context.getLevel(); if (!level.isClientSide()) { - var pos = context.getClickedPos().relative(context.getClickedFace().getOpposite()); + var pos = context.getClickedPos().relative(context.getClickedFace()); var entity = new MartingEntity(PowerToolEntities.MARTING.get(), level); + entity.setVariant(variant); entity.setPos(pos.getCenter()); level.addFreshEntity(entity); } diff --git a/src/main/java/org/teacon/powertool/item/PowerToolItems.java b/src/main/java/org/teacon/powertool/item/PowerToolItems.java index 31377af..c4c5d4f 100644 --- a/src/main/java/org/teacon/powertool/item/PowerToolItems.java +++ b/src/main/java/org/teacon/powertool/item/PowerToolItems.java @@ -27,6 +27,7 @@ import org.teacon.powertool.block.CosmeticBlock; import org.teacon.powertool.block.PowerToolBlocks; import org.teacon.powertool.entity.FenceKnotEntity; +import org.teacon.powertool.entity.MartingEntity; import org.teacon.powertool.utils.VanillaUtils; import javax.annotation.ParametersAreNonnullByDefault; @@ -109,9 +110,9 @@ public class PowerToolItems { public static DeferredHolder AV_MINE_CART; public static DeferredHolder DISPLAY_MODE_TOOL; - public static Supplier MARTING_RED = ITEMS.register("marting_red", () -> new MartingItem(new Item.Properties())); - public static Supplier MARTING_GREEN = ITEMS.register("marting_green", () -> new MartingItem(new Item.Properties())); - public static Supplier MARTING_BLUE = ITEMS.register("marting_blue", () -> new MartingItem(new Item.Properties())); + public static Supplier MARTING_RED = ITEMS.register("marting_car_red", () -> new MartingItem(new Item.Properties(), MartingEntity.Variant.RED)); + public static Supplier MARTING_GREEN = ITEMS.register("marting_car_green", () -> new MartingItem(new Item.Properties(), MartingEntity.Variant.GREEN)); + public static Supplier MARTING_BLUE = ITEMS.register("marting_car_blue", () -> new MartingItem(new Item.Properties(), MartingEntity.Variant.BLUE)); public static void register(IEventBus bus) { ITEMS.register(bus); diff --git a/src/main/resources/assets/powertool/lang/en_us.json b/src/main/resources/assets/powertool/lang/en_us.json index 1279414..9697802 100644 --- a/src/main/resources/assets/powertool/lang/en_us.json +++ b/src/main/resources/assets/powertool/lang/en_us.json @@ -140,8 +140,8 @@ "powertool.gui.display_mode_disabled": "Disabled display mode on %s", "powertool.gui.display_mode_error": "Could not enable display mode on %s because it has no ability to open any screen. Or press shift key and click again to force enable display mode.", - "item.powertool.marting_red": "Marting Car (Red)", - "item.powertool.marting_green": "Marting Car (Green)", - "item.powertool.marting_blue": "Marting Car (Blue)", + "item.powertool.marting_car_red": "Marting Car (Red)", + "item.powertool.marting_car_green": "Marting Car (Green)", + "item.powertool.marting_car_blue": "Marting Car (Blue)", "tooltip.powertool.marting": "MalayP asked me to write a karting car" } \ No newline at end of file diff --git a/src/main/resources/assets/powertool/lang/zh_cn.json b/src/main/resources/assets/powertool/lang/zh_cn.json index cbb52c4..e666412 100644 --- a/src/main/resources/assets/powertool/lang/zh_cn.json +++ b/src/main/resources/assets/powertool/lang/zh_cn.json @@ -141,8 +141,8 @@ "powertool.gui.display_mode_disabled": "已在%s上禁用展示模式", "powertool.gui.display_mode_error": "无法在%s上启用展示模式,因为它无法打开任何可交互界面.按下shift键强制启用展示模式.", - "item.powertool.marting_red": "马丁车(红色)", - "item.powertool.marting_green": "马丁车(绿色)", - "item.powertool.marting_blue": "马丁车(蓝色)", - "tooltip.powertool.marting": "马雷的卡丁车,简称马丁车" + "item.powertool.marting_car_red": "马丁车(红色)", + "item.powertool.marting_car_green": "马丁车(绿色)", + "item.powertool.marting_car_blue": "马丁车(蓝色)", + "tooltip.powertool.marting": "马雷让写的卡丁车,简称马丁车" } \ No newline at end of file diff --git a/src/main/resources/assets/powertool/models/item/marting.json b/src/main/resources/assets/powertool/models/item/marting_car.json similarity index 99% rename from src/main/resources/assets/powertool/models/item/marting.json rename to src/main/resources/assets/powertool/models/item/marting_car.json index 1d4574d..ed4a106 100644 --- a/src/main/resources/assets/powertool/models/item/marting.json +++ b/src/main/resources/assets/powertool/models/item/marting_car.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench", "texture_size": [128, 128], "textures": { - "1": "powertool:entity/marting_red" + "1": "powertool:item/marting_red" }, "elements": [ { diff --git a/src/main/resources/assets/powertool/models/item/marting_blue.json b/src/main/resources/assets/powertool/models/item/marting_car_blue.json similarity index 58% rename from src/main/resources/assets/powertool/models/item/marting_blue.json rename to src/main/resources/assets/powertool/models/item/marting_car_blue.json index dca93d0..d4a6df9 100644 --- a/src/main/resources/assets/powertool/models/item/marting_blue.json +++ b/src/main/resources/assets/powertool/models/item/marting_car_blue.json @@ -1,5 +1,5 @@ { - "parent": "powertool:item/marting", + "parent": "powertool:item/marting_car", "textures": { "1": "powertool:item/marting_blue" } diff --git a/src/main/resources/assets/powertool/models/item/marting_green.json b/src/main/resources/assets/powertool/models/item/marting_car_green.json similarity index 59% rename from src/main/resources/assets/powertool/models/item/marting_green.json rename to src/main/resources/assets/powertool/models/item/marting_car_green.json index 3c6771c..d3960ad 100644 --- a/src/main/resources/assets/powertool/models/item/marting_green.json +++ b/src/main/resources/assets/powertool/models/item/marting_car_green.json @@ -1,5 +1,5 @@ { - "parent": "powertool:item/marting", + "parent": "powertool:item/marting_car", "textures": { "1": "powertool:item/marting_green" } diff --git a/src/main/resources/assets/powertool/models/item/marting_red.json b/src/main/resources/assets/powertool/models/item/marting_car_red.json similarity index 58% rename from src/main/resources/assets/powertool/models/item/marting_red.json rename to src/main/resources/assets/powertool/models/item/marting_car_red.json index b7540ec..1a23115 100644 --- a/src/main/resources/assets/powertool/models/item/marting_red.json +++ b/src/main/resources/assets/powertool/models/item/marting_car_red.json @@ -1,5 +1,5 @@ { - "parent": "powertool:item/marting", + "parent": "powertool:item/marting_car", "textures": { "1": "powertool:item/marting_red" } diff --git a/src/main/resources/assets/powertool/textures/entity/marting_blue.png b/src/main/resources/assets/powertool/textures/entity/marting_blue.png deleted file mode 100644 index af44dbcbcea18344558e29e00e8e80d147fa1762..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1943 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 QoD?o#W{g7C7`n#&3)nctB>(^b diff --git a/src/main/resources/assets/powertool/textures/entity/marting_green.png b/src/main/resources/assets/powertool/textures/entity/marting_green.png deleted file mode 100644 index abcc09847643cf5da671b8860ef63d88f61f3029..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1959 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