From 36488a966bc4a03a9eb56c5fe5d733652f45116d Mon Sep 17 00:00:00 2001 From: FoundationGames <43485105+FoundationGames@users.noreply.github.com> Date: Sat, 3 Jul 2021 23:58:46 -0700 Subject: [PATCH] Add tractors, fix scaled wheel rendering, add pineapple --- gradle.properties | 2 +- .../automobile/AutomobileFrame.java | 47 +++++++++++- .../automobile/AutomobileWheel.java | 9 ++- .../automobile/render/AutomobileRenderer.java | 13 ++-- .../render/frame/PineappleFrameModel.java | 48 ++++++++++++ .../render/frame/TractorFrameModel.java | 54 ++++++++++++++ .../render/wheel/TractorWheelModel.java | 70 ++++++++++++++++++ .../automobility/entity/AutomobileEntity.java | 36 +++++---- .../entity/AutomobilityEntities.java | 8 +- .../automobility/item/AutomobileItem.java | 4 +- .../automobility/item/AutomobilityItems.java | 11 ++- .../assets/automobility/lang/en_us.json | 11 +++ .../models/block/TEST_DELETE.json | 22 ------ .../entity/automobile/frame/blue_tractor.png | Bin 0 -> 6290 bytes .../entity/automobile/frame/green_tractor.png | Bin 0 -> 6162 bytes .../entity/automobile/frame/pineapple.png | Bin 0 -> 4148 bytes .../entity/automobile/frame/pineapple_src.png | Bin 0 -> 740 bytes .../entity/automobile/frame/red_tractor.png | Bin 0 -> 6389 bytes .../entity/automobile/frame/tractor_green.png | Bin 1191 -> 0 bytes .../automobile/frame/yellow_tractor.png | Bin 0 -> 6445 bytes .../entity/automobile/wheel/tractor.png | Bin 0 -> 255 bytes 21 files changed, 276 insertions(+), 59 deletions(-) create mode 100644 src/main/java/io/github/foundationgames/automobility/automobile/render/frame/PineappleFrameModel.java create mode 100644 src/main/java/io/github/foundationgames/automobility/automobile/render/frame/TractorFrameModel.java create mode 100644 src/main/java/io/github/foundationgames/automobility/automobile/render/wheel/TractorWheelModel.java delete mode 100644 src/main/resources/assets/automobility/models/block/TEST_DELETE.json create mode 100644 src/main/resources/assets/automobility/textures/entity/automobile/frame/blue_tractor.png create mode 100644 src/main/resources/assets/automobility/textures/entity/automobile/frame/green_tractor.png create mode 100644 src/main/resources/assets/automobility/textures/entity/automobile/frame/pineapple.png create mode 100644 src/main/resources/assets/automobility/textures/entity/automobile/frame/pineapple_src.png create mode 100644 src/main/resources/assets/automobility/textures/entity/automobile/frame/red_tractor.png delete mode 100644 src/main/resources/assets/automobility/textures/entity/automobile/frame/tractor_green.png create mode 100644 src/main/resources/assets/automobility/textures/entity/automobile/frame/yellow_tractor.png create mode 100644 src/main/resources/assets/automobility/textures/entity/automobile/wheel/tractor.png diff --git a/gradle.properties b/gradle.properties index f4fb195..1f94af6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ lambdacontrols_version=1.7.1+1.17 myron_version=1.6.0 arrp_version=0.4.3 -mod_version = 0.0.0+1.17 +mod_version = 0.0.1+1.17 maven_group = io.github.foundationgames archives_base_name = automobility diff --git a/src/main/java/io/github/foundationgames/automobility/automobile/AutomobileFrame.java b/src/main/java/io/github/foundationgames/automobility/automobile/AutomobileFrame.java index 215496d..c00789f 100644 --- a/src/main/java/io/github/foundationgames/automobility/automobile/AutomobileFrame.java +++ b/src/main/java/io/github/foundationgames/automobility/automobile/AutomobileFrame.java @@ -1,10 +1,7 @@ package io.github.foundationgames.automobility.automobile; import io.github.foundationgames.automobility.Automobility; -import io.github.foundationgames.automobility.automobile.render.frame.CARRFrameModel; -import io.github.foundationgames.automobility.automobile.render.frame.DaBabyFrameModel; -import io.github.foundationgames.automobility.automobile.render.frame.ShoppingCartFrameModel; -import io.github.foundationgames.automobility.automobile.render.frame.StandardFrameModel; +import io.github.foundationgames.automobility.automobile.render.frame.*; import io.github.foundationgames.automobility.util.SimpleMapContentRegistry; import net.minecraft.client.model.Model; import net.minecraft.client.render.entity.EntityRendererFactory; @@ -37,6 +34,11 @@ public record AutomobileFrame( public static final AutomobileFrame STANDARD_RED = REGISTRY.register(standard("red")); public static final AutomobileFrame STANDARD_BLACK = REGISTRY.register(standard("black")); + public static final AutomobileFrame RED_TRACTOR = REGISTRY.register(tractor("red")); + public static final AutomobileFrame YELLOW_TRACTOR = REGISTRY.register(tractor("yellow")); + public static final AutomobileFrame GREEN_TRACTOR = REGISTRY.register(tractor("green")); + public static final AutomobileFrame BLUE_TRACTOR = REGISTRY.register(tractor("blue")); + public static final AutomobileFrame SHOPPING_CART = REGISTRY.register( new AutomobileFrame( Automobility.id("shopping_cart"), @@ -69,6 +71,22 @@ public record AutomobileFrame( ) ); + public static final AutomobileFrame PINEAPPLE = REGISTRY.register( + new AutomobileFrame( + Automobility.id("pineapple"), + 0.75f, + new FrameModel( + Automobility.id("textures/entity/automobile/frame/pineapple.png"), + PineappleFrameModel::new, + WheelBase.basic(10, 18), + 12, + 16, + 8, + 6 + ) + ) + ); + public static final AutomobileFrame DABABY = REGISTRY.register( new AutomobileFrame( Automobility.id("dababy"), @@ -101,6 +119,27 @@ private static AutomobileFrame standard(String color) { ); } + private static AutomobileFrame tractor(String color) { + return new AutomobileFrame( + Automobility.id(color+"_tractor"), + 0.9f, + new FrameModel( + Automobility.id("textures/entity/automobile/frame/"+color+"_tractor.png"), + TractorFrameModel::new, + new WheelBase( + new WheelBase.WheelPos(-2, -7, 1.8f, 0, WheelBase.WheelEnd.BACK, WheelBase.WheelSide.LEFT), + new WheelBase.WheelPos(-2, 7, 1.8f, 180, WheelBase.WheelEnd.BACK, WheelBase.WheelSide.RIGHT), + new WheelBase.WheelPos(15, -1, 1, 0, WheelBase.WheelEnd.FRONT, WheelBase.WheelSide.LEFT), + new WheelBase.WheelPos(15, 1, 1, 180, WheelBase.WheelEnd.FRONT, WheelBase.WheelSide.RIGHT) + ), + 20, + 9, + 9, + 8 + ) + ); + } + @Override public Identifier getId() { return this.id; diff --git a/src/main/java/io/github/foundationgames/automobility/automobile/AutomobileWheel.java b/src/main/java/io/github/foundationgames/automobility/automobile/AutomobileWheel.java index a12813f..26bafdf 100644 --- a/src/main/java/io/github/foundationgames/automobility/automobile/AutomobileWheel.java +++ b/src/main/java/io/github/foundationgames/automobility/automobile/AutomobileWheel.java @@ -1,10 +1,7 @@ package io.github.foundationgames.automobility.automobile; import io.github.foundationgames.automobility.Automobility; -import io.github.foundationgames.automobility.automobile.render.wheel.ConvertibleWheelModel; -import io.github.foundationgames.automobility.automobile.render.wheel.OffRoadWheelModel; -import io.github.foundationgames.automobility.automobile.render.wheel.StandardWheelModel; -import io.github.foundationgames.automobility.automobile.render.wheel.SteelWheelModel; +import io.github.foundationgames.automobility.automobile.render.wheel.*; import io.github.foundationgames.automobility.util.SimpleMapContentRegistry; import net.minecraft.client.model.Model; import net.minecraft.client.render.entity.EntityRendererFactory; @@ -34,6 +31,10 @@ public record AutomobileWheel( new AutomobileWheel(Automobility.id("steel"), 0.69f, 0.4f, new WheelModel(3.625f, 3, Automobility.id("textures/entity/automobile/wheel/steel.png"), SteelWheelModel::new)) ); + public static final AutomobileWheel TRACTOR = REGISTRY.register( + new AutomobileWheel(Automobility.id("tractor"), 1.05f, 0.69f, new WheelModel(3.625f, 3, Automobility.id("textures/entity/automobile/wheel/tractor.png"), TractorWheelModel::new)) + ); + // public static final AutomobileWheel INFLATABLE = REGISTRY.register( // new AutomobileWheel(Automobility.id("inflatable"), 0.75f, new WheelModel(4, 4, TEMP_ID, EmptyModel::new), Ability.HYDROPLANE) // ); diff --git a/src/main/java/io/github/foundationgames/automobility/automobile/render/AutomobileRenderer.java b/src/main/java/io/github/foundationgames/automobility/automobile/render/AutomobileRenderer.java index 97e725c..c0a4497 100644 --- a/src/main/java/io/github/foundationgames/automobility/automobile/render/AutomobileRenderer.java +++ b/src/main/java/io/github/foundationgames/automobility/automobile/render/AutomobileRenderer.java @@ -98,15 +98,15 @@ public static void render( if (wheelModel != null) { for (var pos : wPoses) { float scale = pos.scale(); - float wheelRadius = wheels.model().radius() * scale; + float wheelRadius = wheels.model().radius() - (wheels.model().radius() * (scale - 1)); matrices.push(); matrices.translate(-pos.forward() / 16, wheelRadius / 16, pos.right() / 16); if (pos.end() == WheelBase.WheelEnd.FRONT) matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(automobile.getSteering(tickDelta) * 27)); matrices.translate(0, raise, 0); matrices.multiply(Vec3f.POSITIVE_Z.getDegreesQuaternion(-wheelAngle)); + matrices.scale(scale, scale, scale); matrices.translate(0, -raise, 0); matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(pos.yaw())); - matrices.scale(scale, scale, scale); wheelModel.render(matrices, wheelBuffer, light, overlay, 1, 1, 1, 1); matrices.pop(); } @@ -137,11 +137,12 @@ public static void render( for (var pos : wPoses) { if (pos.end() == WheelBase.WheelEnd.BACK) { float scale = pos.scale(); + float heightOffset = wheels.model().radius(); float wheelRadius = wheels.model().radius() * scale; float wheelWidth = (wheels.model().width() / 16) * scale; - float back = (wheelRadius / 16) - Math.max(0, ((wheelRadius / 16) - (3f / 16)) * 0.75f); + float back = (wheelRadius / 16) - Math.max(0, ((wheelRadius / 16) - (3f / 16)) * 0.45f); matrices.push(); - matrices.translate((-pos.forward() / 16) + back, wheelRadius / 16, (pos.right() / 16) + (wheelWidth * (pos.side() == WheelBase.WheelSide.RIGHT ? 1 : -1))); + matrices.translate((-pos.forward() / 16) + back, heightOffset / 16, (pos.right() / 16) + (wheelWidth * (pos.side() == WheelBase.WheelSide.RIGHT ? 1 : -1))); matrices.scale(1, 1, pos.side() == WheelBase.WheelSide.RIGHT ? -1 : 1); skidEffectModel.render(matrices, skidEffectBuffer, light, overlay, r, g, b, 0.6f); matrices.pop(); @@ -153,8 +154,4 @@ public static void render( matrices.pop(); } - - public static void renderEngine() { - - } } diff --git a/src/main/java/io/github/foundationgames/automobility/automobile/render/frame/PineappleFrameModel.java b/src/main/java/io/github/foundationgames/automobility/automobile/render/frame/PineappleFrameModel.java new file mode 100644 index 0000000..58e8675 --- /dev/null +++ b/src/main/java/io/github/foundationgames/automobility/automobile/render/frame/PineappleFrameModel.java @@ -0,0 +1,48 @@ +package io.github.foundationgames.automobility.automobile.render.frame; + +import io.github.foundationgames.automobility.Automobility; +import net.minecraft.client.model.*; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.entity.EntityRendererFactory; +import net.minecraft.client.render.entity.model.EntityModelLayer; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.math.Vec3f; + +public class PineappleFrameModel extends Model { + public static final EntityModelLayer MODEL_LAYER = new EntityModelLayer(Automobility.id("automobile/frame/pineapple"), "main"); + + private final ModelPart main; + private final ModelPart stem; + + public PineappleFrameModel(EntityRendererFactory.Context ctx) { + super(RenderLayer::getEntityCutout); + this.main = ctx.getPart(MODEL_LAYER).getChild("main"); + this.stem = this.main.getChild("stem"); + setRotationAngle(stem, 0.0F, 0.0F, 0.0873F); + } + + private void setRotationAngle(ModelPart bone, float x, float y, float z) { + bone.pitch = x; + bone.yaw = y; + bone.roll = z; + } + + public static TexturedModelData createModelData() { + ModelData modelData = new ModelData(); + ModelPartData root = modelData.getRoot(); + ModelPartData partData = root.addChild("main", ModelPartBuilder.create().uv(0,0).cuboid(-4.0F, -8.0F, -5.0F, 8.0F, 7.0F, 0.0F).uv(0,11).cuboid(-4.5F, -8.0F, -4.5F, 9.0F, 8.0F, 9.0F), ModelTransform.pivot(0.0F,24.0F,0.0F)); + partData.addChild("stem", ModelPartBuilder.create().uv(0,7).cuboid(-10.0F, -10.5F, -3.0F, 1.0F, 3.0F, 1.0F), ModelTransform.pivot(8.5F,0.5F,2.5F)); + return TexturedModelData.of(modelData,64,32); + } + + @Override + public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { + matrices.push(); + matrices.translate(0, -1.5, 0); + matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(90)); + matrices.scale(2, 2, 2); + this.main.render(matrices, vertices, light, overlay, red, green, blue, alpha); + matrices.pop(); + } +} diff --git a/src/main/java/io/github/foundationgames/automobility/automobile/render/frame/TractorFrameModel.java b/src/main/java/io/github/foundationgames/automobility/automobile/render/frame/TractorFrameModel.java new file mode 100644 index 0000000..232bbcf --- /dev/null +++ b/src/main/java/io/github/foundationgames/automobility/automobile/render/frame/TractorFrameModel.java @@ -0,0 +1,54 @@ +package io.github.foundationgames.automobility.automobile.render.frame; + +import io.github.foundationgames.automobility.Automobility; +import net.minecraft.client.model.*; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.entity.EntityRendererFactory; +import net.minecraft.client.render.entity.model.EntityModelLayer; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.math.Vec3f; + +public class TractorFrameModel extends Model { + public static final EntityModelLayer MODEL_LAYER = new EntityModelLayer(Automobility.id("automobile/frame/tractor"), "main"); + + private final ModelPart main; + private final ModelPart seat_back; + private final ModelPart pipe_tip; + private final ModelPart dashboard; + + public TractorFrameModel(EntityRendererFactory.Context ctx) { + super(RenderLayer::getEntityCutout); + this.main = ctx.getPart(MODEL_LAYER).getChild("main"); + this.dashboard = this.main.getChild("dashboard"); + this.pipe_tip = this.main.getChild("pipe_tip"); + this.seat_back = this.main.getChild("seat_back"); + setRotationAngle(seat_back, -1.8326F, 0.0F, 0.0F); + setRotationAngle(pipe_tip, -0.1309F, 0.0F, 0.0F); + setRotationAngle(dashboard, 0.5672F, 0.0F, 0.0F); + } + + private void setRotationAngle(ModelPart bone, float x, float y, float z) { + bone.pitch = x; + bone.yaw = y; + bone.roll = z; + } + + public static TexturedModelData createModelData() { + ModelData modelData = new ModelData(); + ModelPartData root = modelData.getRoot(); + ModelPartData partData = root.addChild("main", ModelPartBuilder.create().uv(0,0).cuboid(-4.0F, -13.0F, -19.0F, 8.0F, 9.0F, 15.0F).uv(0,24).cuboid(-7.0F, -8.0F, -4.0F, 14.0F, 7.0F, 12.0F).uv(31,9).cuboid(-1.0F, -17.0F, -16.0F, 2.0F, 4.0F, 2.0F).uv(0,0).cuboid(-1.0F, -4.0F, -16.0F, 2.0F, 5.0F, 2.0F).uv(0,43).cuboid(-3.0F, -9.0F, -3.0F, 6.0F, 1.0F, 7.0F).uv(26,43).cuboid(-5.0F, -8.0F, 8.0F, 10.0F, 6.0F, 4.0F).uv(0,0).cuboid(-1.0F, -9.0F, 5.0F, 1.0F, 1.0F, 1.0F), ModelTransform.pivot(0.0F,24.0F,0.0F)); + partData.addChild("seat_back", ModelPartBuilder.create().uv(0,43).cuboid(-3.0F, -1.0F, -7.0F, 6.0F, 1.0F, 7.0F), ModelTransform.pivot(0.0F,-9.0F,3.0F)); + partData.addChild("pipe_tip", ModelPartBuilder.create().uv(31,0).cuboid(-0.5F, -2.0F, 0.0F, 1.0F, 2.0F, 1.0F), ModelTransform.pivot(0.0F,-17.0F,-15.5F)); + partData.addChild("dashboard", ModelPartBuilder.create().uv(31,0).cuboid(-2.0F, -3.0F, -5.0F, 4.0F, 3.0F, 5.0F), ModelTransform.pivot(0.0F,-13.0F,-4.0F)); + return TexturedModelData.of(modelData,64,64); + } + + @Override + public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { + matrices.push(); + matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(90)); + this.main.render(matrices, vertices, light, overlay, red, green, blue, alpha); + matrices.pop(); + } +} diff --git a/src/main/java/io/github/foundationgames/automobility/automobile/render/wheel/TractorWheelModel.java b/src/main/java/io/github/foundationgames/automobility/automobile/render/wheel/TractorWheelModel.java new file mode 100644 index 0000000..fe82b9b --- /dev/null +++ b/src/main/java/io/github/foundationgames/automobility/automobile/render/wheel/TractorWheelModel.java @@ -0,0 +1,70 @@ +package io.github.foundationgames.automobility.automobile.render.wheel; + +import io.github.foundationgames.automobility.Automobility; +import net.minecraft.client.model.*; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.entity.EntityRendererFactory; +import net.minecraft.client.render.entity.model.EntityModelLayer; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.util.math.Vec3f; + +public class TractorWheelModel extends Model { + public static final EntityModelLayer MODEL_LAYER = new EntityModelLayer(Automobility.id("automobile/wheel/tractor"), "main"); + + private final ModelPart main; + private final ModelPart tire_8; + private final ModelPart tire_7; + private final ModelPart tire_6; + private final ModelPart tire_5; + private final ModelPart tire_4; + private final ModelPart tire_3; + private final ModelPart tire_2; + + public TractorWheelModel(EntityRendererFactory.Context ctx) { + super(RenderLayer::getEntityCutout); + this.main = ctx.getPart(MODEL_LAYER).getChild("main"); + this.tire_2 = this.main.getChild("tire_2"); + this.tire_3 = this.main.getChild("tire_3"); + this.tire_4 = this.main.getChild("tire_4"); + this.tire_5 = this.main.getChild("tire_5"); + this.tire_6 = this.main.getChild("tire_6"); + this.tire_7 = this.main.getChild("tire_7"); + this.tire_8 = this.main.getChild("tire_8"); + setRotationAngle(tire_8, -0.7854F, 0.0F, 0.0F); + setRotationAngle(tire_7, -1.5708F, 0.0F, 0.0F); + setRotationAngle(tire_6, -2.3562F, 0.0F, 0.0F); + setRotationAngle(tire_5, 3.1416F, 0.0F, 0.0F); + setRotationAngle(tire_4, 2.3562F, 0.0F, 0.0F); + setRotationAngle(tire_3, 1.5708F, 0.0F, 0.0F); + setRotationAngle(tire_2, 0.7854F, 0.0F, 0.0F); + } + + private void setRotationAngle(ModelPart bone, float x, float y, float z) { + bone.pitch = x; + bone.yaw = y; + bone.roll = z; + } + + public static TexturedModelData createModelData() { + ModelData modelData = new ModelData(); + ModelPartData root = modelData.getRoot(); + ModelPartData partData = root.addChild("main", ModelPartBuilder.create().uv(0,0).cuboid(0.0F, -2.0F, -1.5F, 3.0F, 2.0F, 3.0F).uv(0,5).cuboid(0.5F, -6.125F, -2.5F, 2.0F, 5.0F, 5.0F), ModelTransform.pivot(0.0F,24.0F,0.0F)); + partData.addChild("tire_8", ModelPartBuilder.create().uv(0,0).cuboid(0.5F, 1.625F, -1.5F, 3.0F, 2.0F, 3.0F), ModelTransform.pivot(-0.5F,-3.625F,0.0F)); + partData.addChild("tire_7", ModelPartBuilder.create().uv(0,0).cuboid(0.5F, 1.625F, -1.5F, 3.0F, 2.0F, 3.0F), ModelTransform.pivot(-0.5F,-3.625F,0.0F)); + partData.addChild("tire_6", ModelPartBuilder.create().uv(0,0).cuboid(0.5F, 1.625F, -1.5F, 3.0F, 2.0F, 3.0F), ModelTransform.pivot(-0.5F,-3.625F,0.0F)); + partData.addChild("tire_5", ModelPartBuilder.create().uv(0,0).cuboid(0.5F, 1.625F, -1.5F, 3.0F, 2.0F, 3.0F), ModelTransform.pivot(-0.5F,-3.625F,0.0F)); + partData.addChild("tire_4", ModelPartBuilder.create().uv(0,0).cuboid(0.5F, 1.625F, -1.5F, 3.0F, 2.0F, 3.0F), ModelTransform.pivot(-0.5F,-3.625F,0.0F)); + partData.addChild("tire_3", ModelPartBuilder.create().uv(0,0).cuboid(0.5F, 1.625F, -1.5F, 3.0F, 2.0F, 3.0F), ModelTransform.pivot(-0.5F,-3.625F,0.0F)); + partData.addChild("tire_2", ModelPartBuilder.create().uv(0,0).cuboid(0.5F, 1.625F, -1.5F, 3.0F, 2.0F, 3.0F), ModelTransform.pivot(-0.5F,-3.625F,0.0F)); + return TexturedModelData.of(modelData,16,16); + } + + @Override + public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { + matrices.push(); + matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(90)); + main.render(matrices, vertices, light, overlay, red, green, blue, alpha); + matrices.pop(); + } +} diff --git a/src/main/java/io/github/foundationgames/automobility/entity/AutomobileEntity.java b/src/main/java/io/github/foundationgames/automobility/entity/AutomobileEntity.java index 72243b5..11740bc 100644 --- a/src/main/java/io/github/foundationgames/automobility/entity/AutomobileEntity.java +++ b/src/main/java/io/github/foundationgames/automobility/entity/AutomobileEntity.java @@ -17,12 +17,10 @@ import net.minecraft.block.SideShapeType; import net.minecraft.client.model.Model; import net.minecraft.client.render.entity.EntityRendererFactory; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.MovementType; +import net.minecraft.entity.*; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.vehicle.BoatEntity; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import net.minecraft.network.Packet; import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket; @@ -255,7 +253,7 @@ public boolean automobileOnGround() { @Override public boolean debris() { - return offRoad && hSpeed > 0; + return offRoad && hSpeed != 0; } @Override @@ -295,7 +293,7 @@ public void baseTick() { } } } else { - clientTick(); + slopeAngleTick(); } } @@ -303,11 +301,23 @@ private void sync(ServerPlayerEntity player) { PayloadPackets.sendSyncAutomobileDataPacket(this, player); } + public ItemStack asItem() { + var stack = new ItemStack(AutomobilityItems.AUTOMOBILE); + var automobile = stack.getOrCreateSubTag("Automobile"); + automobile.putString("frame", frame.getId().toString()); + automobile.putString("wheels", wheels.getId().toString()); + automobile.putString("engine", engine.getId().toString()); + return stack; + } + + @Nullable + @Override + public ItemStack getPickBlockStack() { + return asItem(); + } + // witness me fighting against minecraft's collision/physics public void movementTick() { - //this.wasOnGround = automobileOnGround; - //this.automobileOnGround = (verticalSpeed < 0.2 && verticalSpeed > -0.2) || isOnGround(); - // Handle the small suspension bounce effect lastSusBounceTimer = suspensionBounceTimer; if (suspensionBounceTimer > 0) suspensionBounceTimer--; @@ -422,7 +432,7 @@ public void movementTick() { if (hSpeed > 0.2) { var frontBox = getBoundingBox().offset(cumulative.multiply(0.5)); var velAdd = cumulative.add(0, 0.1, 0).multiply(3); - for (var entity : world.getEntitiesByType(TypeFilter.instanceOf(Entity.class), frontBox, entity -> entity != this)) { + for (var entity : world.getEntitiesByType(TypeFilter.instanceOf(Entity.class), frontBox, entity -> entity != this && entity != getFirstPassenger())) { if (entity instanceof LivingEntity living) { living.damage(AutomobilityEntities.AUTOMOBILE_DAMAGE_SOURCE, hSpeed * 10); } @@ -465,8 +475,6 @@ public void movementTick() { // Handles gravity verticalSpeed = Math.max(verticalSpeed - 0.08f, !automobileOnGround ? TERMINAL_VELOCITY : -0.01f); - //if (verticalSpeed == 0) System.out.println("ZERO V SPEED"); - // Store previous y displacement to use when launching off slopes prevYDisplacements.push(yDisp); if (prevYDisplacements.size() > 2) { @@ -525,7 +533,7 @@ public void movementTick() { } } - public void clientTick() { + public void slopeAngleTick() { lastGroundSlopeX = groundSlopeX; lastGroundSlopeZ = groundSlopeZ; var below = new BlockPos(Math.floor(getX()), Math.floor(getY() - 0.06), Math.floor(getZ())); @@ -700,6 +708,8 @@ public Entity getPrimaryPassenger() { @Override public ActionResult interact(PlayerEntity player, Hand hand) { if (player.getStackInHand(hand).isOf(AutomobilityItems.CROWBAR)) { + var pos = getPos().add(0, 0.3, 0); + if (!player.isCreative()) world.spawnEntity(new ItemEntity(world, pos.x, pos.y, pos.z, asItem())); this.remove(RemovalReason.KILLED); return ActionResult.success(world.isClient); } diff --git a/src/main/java/io/github/foundationgames/automobility/entity/AutomobilityEntities.java b/src/main/java/io/github/foundationgames/automobility/entity/AutomobilityEntities.java index a7ce6b9..5c10730 100644 --- a/src/main/java/io/github/foundationgames/automobility/entity/AutomobilityEntities.java +++ b/src/main/java/io/github/foundationgames/automobility/entity/AutomobilityEntities.java @@ -7,12 +7,11 @@ import io.github.foundationgames.automobility.automobile.render.engine.CreativeEngineModel; import io.github.foundationgames.automobility.automobile.render.engine.GoldEngineModel; import io.github.foundationgames.automobility.automobile.render.engine.IronEngineModel; -import io.github.foundationgames.automobility.automobile.render.frame.CARRFrameModel; -import io.github.foundationgames.automobility.automobile.render.frame.ShoppingCartFrameModel; -import io.github.foundationgames.automobility.automobile.render.frame.StandardFrameModel; +import io.github.foundationgames.automobility.automobile.render.frame.*; import io.github.foundationgames.automobility.automobile.render.wheel.OffRoadWheelModel; import io.github.foundationgames.automobility.automobile.render.wheel.StandardWheelModel; import io.github.foundationgames.automobility.automobile.render.wheel.SteelWheelModel; +import io.github.foundationgames.automobility.automobile.render.wheel.TractorWheelModel; import io.github.foundationgames.automobility.entity.render.AutomobileEntityRenderer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -46,11 +45,14 @@ public static void initClient() { EntityRendererRegistry.INSTANCE.register(AUTOMOBILE, AutomobileEntityRenderer::new); EntityModelLayerRegistry.registerModelLayer(StandardFrameModel.MODEL_LAYER, StandardFrameModel::createModelData); + EntityModelLayerRegistry.registerModelLayer(TractorFrameModel.MODEL_LAYER, TractorFrameModel::createModelData); EntityModelLayerRegistry.registerModelLayer(ShoppingCartFrameModel.MODEL_LAYER, ShoppingCartFrameModel::createModelData); EntityModelLayerRegistry.registerModelLayer(CARRFrameModel.MODEL_LAYER, CARRFrameModel::createModelData); + EntityModelLayerRegistry.registerModelLayer(PineappleFrameModel.MODEL_LAYER, PineappleFrameModel::createModelData); EntityModelLayerRegistry.registerModelLayer(StandardWheelModel.MODEL_LAYER, StandardWheelModel::createModelData); EntityModelLayerRegistry.registerModelLayer(OffRoadWheelModel.MODEL_LAYER, OffRoadWheelModel::createModelData); + EntityModelLayerRegistry.registerModelLayer(TractorWheelModel.MODEL_LAYER, TractorWheelModel::createModelData); EntityModelLayerRegistry.registerModelLayer(SteelWheelModel.MODEL_LAYER, SteelWheelModel::createModelData); EntityModelLayerRegistry.registerModelLayer(IronEngineModel.MODEL_LAYER, IronEngineModel::createModelData); diff --git a/src/main/java/io/github/foundationgames/automobility/item/AutomobileItem.java b/src/main/java/io/github/foundationgames/automobility/item/AutomobileItem.java index 240997e..1dbf2d0 100644 --- a/src/main/java/io/github/foundationgames/automobility/item/AutomobileItem.java +++ b/src/main/java/io/github/foundationgames/automobility/item/AutomobileItem.java @@ -35,12 +35,14 @@ public AutomobileItem(Settings settings) { @Override public ActionResult useOnBlock(ItemUsageContext context) { if (!context.getWorld().isClient()) { - data.read(context.getStack().getOrCreateSubTag("Automobile")); + var stack = context.getStack(); + data.read(stack.getOrCreateSubTag("Automobile")); var e = new AutomobileEntity(AutomobilityEntities.AUTOMOBILE, context.getWorld()); var pos = context.getHitPos(); e.refreshPositionAndAngles(pos.x, pos.y, pos.z, context.getPlayerFacing().asRotation(), 0); e.setComponents(data.getFrame(), data.getWheel(), data.getEngine()); context.getWorld().spawnEntity(e); + stack.decrement(1); return ActionResult.PASS; } return ActionResult.SUCCESS; diff --git a/src/main/java/io/github/foundationgames/automobility/item/AutomobilityItems.java b/src/main/java/io/github/foundationgames/automobility/item/AutomobilityItems.java index 0f29345..7e3068d 100644 --- a/src/main/java/io/github/foundationgames/automobility/item/AutomobilityItems.java +++ b/src/main/java/io/github/foundationgames/automobility/item/AutomobilityItems.java @@ -16,8 +16,8 @@ import net.minecraft.util.registry.Registry; public enum AutomobilityItems {; - public static final Item CROWBAR = register("crowbar", new TooltipItem(new TranslatableText("tooltip.item.automobility.crowbar").formatted(Formatting.BLUE), new Item.Settings().group(Automobility.GROUP))); - public static final Item AUTOMOBILE = register("automobile", new AutomobileItem(new Item.Settings().group(Automobility.PREFABS))); + public static final Item CROWBAR = register("crowbar", new TooltipItem(new TranslatableText("tooltip.item.automobility.crowbar").formatted(Formatting.BLUE), new Item.Settings().maxCount(1).group(Automobility.GROUP))); + public static final Item AUTOMOBILE = register("automobile", new AutomobileItem(new Item.Settings().maxCount(1).group(Automobility.PREFABS))); public static void init() { AutomobileItem.addPrefabs( @@ -37,8 +37,13 @@ public static void init() { new AutomobilePrefab(Automobility.id("standard_green"), AutomobileFrame.STANDARD_GREEN, AutomobileWheel.STANDARD, AutomobileEngine.IRON), new AutomobilePrefab(Automobility.id("standard_red"), AutomobileFrame.STANDARD_RED, AutomobileWheel.STANDARD, AutomobileEngine.IRON), new AutomobilePrefab(Automobility.id("standard_black"), AutomobileFrame.STANDARD_BLACK, AutomobileWheel.STANDARD, AutomobileEngine.IRON), + new AutomobilePrefab(Automobility.id("red_tractor"), AutomobileFrame.RED_TRACTOR, AutomobileWheel.TRACTOR, AutomobileEngine.COPPER), + new AutomobilePrefab(Automobility.id("yellow_tractor"), AutomobileFrame.YELLOW_TRACTOR, AutomobileWheel.TRACTOR, AutomobileEngine.COPPER), + new AutomobilePrefab(Automobility.id("green_tractor"), AutomobileFrame.GREEN_TRACTOR, AutomobileWheel.TRACTOR, AutomobileEngine.COPPER), + new AutomobilePrefab(Automobility.id("blue_tractor"), AutomobileFrame.BLUE_TRACTOR, AutomobileWheel.TRACTOR, AutomobileEngine.COPPER), new AutomobilePrefab(Automobility.id("shopping_cart"), AutomobileFrame.SHOPPING_CART, AutomobileWheel.STEEL, AutomobileEngine.COPPER), - new AutomobilePrefab(Automobility.id("c_arr"), AutomobileFrame.C_ARR, AutomobileWheel.OFF_ROAD, AutomobileEngine.GOLD) + new AutomobilePrefab(Automobility.id("c_arr"), AutomobileFrame.C_ARR, AutomobileWheel.OFF_ROAD, AutomobileEngine.GOLD), + new AutomobilePrefab(Automobility.id("pineapple"), AutomobileFrame.PINEAPPLE, AutomobileWheel.TRACTOR, AutomobileEngine.GOLD) ); } diff --git a/src/main/resources/assets/automobility/lang/en_us.json b/src/main/resources/assets/automobility/lang/en_us.json index 7617612..5a3ab87 100644 --- a/src/main/resources/assets/automobility/lang/en_us.json +++ b/src/main/resources/assets/automobility/lang/en_us.json @@ -45,8 +45,13 @@ "prefab.automobility.standard_green": "Standard Green", "prefab.automobility.standard_red": "Standard Red", "prefab.automobility.standard_black": "Standard Black", + "prefab.automobility.red_tractor": "Red Tractor", + "prefab.automobility.yellow_tractor": "Yellow Tractor", + "prefab.automobility.green_tractor": "Green Tractor", + "prefab.automobility.blue_tractor": "Blue Tractor", "prefab.automobility.shopping_cart": "Shopping Cart", "prefab.automobility.c_arr": "c:arr:", + "prefab.automobility.pineapple": "Pineapple", "tooltip.automobility.frameLabel": "Frame: ", "tooltip.automobility.wheelLabel": "Wheels: ", @@ -73,12 +78,18 @@ "frame.automobility.standard_green": "Standard Green", "frame.automobility.standard_red": "Standard Red", "frame.automobility.standard_black": "Standard Black", + "frame.automobility.red_tractor": "Red Tractor", + "frame.automobility.yellow_tractor": "Yellow Tractor", + "frame.automobility.green_tractor": "Green Tractor", + "frame.automobility.blue_tractor": "Blue Tractor", "frame.automobility.shopping_cart": "Shopping Cart", "frame.automobility.c_arr": "c:arr:", "frame.automobility.dababy": "DaBaby", + "frame.automobility.pineapple": "Pineapple", "wheel.automobility.standard": "Standard", "wheel.automobility.off_road": "Off-Road", + "wheel.automobility.tractor": "Tractor", "wheel.automobility.steel": "Steel", "wheel.automobility.convertible": "Convertible", diff --git a/src/main/resources/assets/automobility/models/block/TEST_DELETE.json b/src/main/resources/assets/automobility/models/block/TEST_DELETE.json deleted file mode 100644 index 797b388..0000000 --- a/src/main/resources/assets/automobility/models/block/TEST_DELETE.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "minecraft:block/thin_block", - "textures": { - "0": "automobility:block/snow_off_road", - "particle": "automobility:block/snow_off_road" - }, - "elements": [ - { - "from": [0, 0, 0], - "to": [16, 6, 16], - "faces": { - "north": {"uv": [0, 10, 16, 16], "texture": "#0"}, - "east": {"uv": [0, 10, 16, 16], "texture": "#0"}, - "south": {"uv": [0, 10, 16, 16], "texture": "#0"}, - "west": {"uv": [0, 10, 16, 16], "texture": "#0", "tintindex": 0}, - "up": {"uv": [0, 0, 16, 16], "texture": "#0"}, - "down": {"uv": [0, 0, 16, 16], "texture": "#0"} - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/automobility/textures/entity/automobile/frame/blue_tractor.png b/src/main/resources/assets/automobility/textures/entity/automobile/frame/blue_tractor.png new file mode 100644 index 0000000000000000000000000000000000000000..0a8fa3f22889fc19a9f0b86a004218ec129034d5 GIT binary patch literal 6290 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
};!z1`W}((UYo zTOYKM1b`3kKT8je0h!YxGN;8v1$?W(MdNZrp9WRZ2w%7ub?f)f3lRM$pLzW^IS&xG z7^Qa@FTmP%*<@UPe)_>R2r_BoVoZbz#3|f(5(I#Sg$2|5N~IDy6J&blX-2RzL1gEf z&E|O0g#PsR&=;WJ=>hfBMMsbYj5lQXb0ONIg__V6_2v46y4{DWqf5e*lnPynU{xvbu?GEQ2BSo$7j( zJ6Uxy7O!@Jxj{Q!FQx z?cUvYBsoF99gtAi7!prXc>LfQkSsv50LcO*3*gK8`>iu^ZqO|e8pcsL^jLuBY)>aE zy(UK23rmjixXl|oa3w`~6P;w>yzN91s%@<$6iKFxXZxWlS$^oG-}yyUa)gYaT@oUU zOifgBgp8n4NTYW$0Dy58I1EH3hj{^r%j%sB&^^B%SICv70(ECm$>CZ6H{)SfCYrX2 zN)DGBbStb@tNP{9cc?dg06;b~jpFJC0O0cIyQyw*bp!kR`^+O=+b-+5`Jro_UW@&l z#(SY7kbHn~VR(_7A9_xZrB18~5s``iSHX~a(;u^7QV|&gXq{)FcCVF!T^l>wvH9ki zZmh>@6C$$#qpLUnuHmp=!MXa?vs~XH{kY2tkO58;jMD}p0YPGUb5S=^nRNojy2cx9ZVc#my3Bv{knaO+dE2@5BPt_7 kf&>W?BuJ1TL4pT{zd#-|xjEuB(f|Me07*qoM6N<$f=^heT>t<8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/automobility/textures/entity/automobile/frame/pineapple.png b/src/main/resources/assets/automobility/textures/entity/automobile/frame/pineapple.png new file mode 100644 index 0000000000000000000000000000000000000000..45390ecf7625cdcbe8b43176ff2d74fc911b3856 GIT binary patch literal 4148 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

|5hf$8*x$P^$jEX)A)bR-9n!2un14Rat4MEX{= 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 Hu0mjfIZSd1 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/automobility/textures/entity/automobile/wheel/tractor.png b/src/main/resources/assets/automobility/textures/entity/automobile/wheel/tractor.png new file mode 100644 index 0000000000000000000000000000000000000000..ccd527039ffd4deed4743f435489372ead323246 GIT binary patch literal 255 zcmVm!OBeFO$8$|-yfWLqLG4S*8GJO2>nc>stFQgj)vV|xY zpgS9vQ(@xh-eCk80CFxfGZThhY~mOOV6$;bkv>Xb=JZ`8E(~CXjWh#5{#||a8$2vS zt+`Ob_3{%|IA2%hH=GR%SVntuRg@41sel;*(#*&5fk9q^o8jS$uMD652r$45!7$** zuYU|2Y>>2oYye0D$b}#=kbyW2Kz27tE}%FJ2&H{O@&Hrwco9YCt}Orn002ovPDHLk FV1f;KWIq4^ literal 0 HcmV?d00001