From 5c34226701b07a4aaaeff683c22a19ddd3990dae Mon Sep 17 00:00:00 2001 From: Prisma Date: Tue, 24 Jun 2025 12:35:10 -0700 Subject: [PATCH 1/6] Ratt files (don't look at the code it's bad :/) --- .../layers/ModEntityRendererClient.java | 1 + .../client/models/stand/RattModel.java | 125 +++++++++ .../models/stand/renderers/RattRenderer.java | 49 ++++ .../net/hydra/jojomod/entity/ModEntities.java | 1 + .../jojomod/entity/stand/RattEntity.java | 123 +++++++++ .../java/net/hydra/jojomod/item/ModItems.java | 2 + .../jojomod/stand/powers/PowersRatt.java | 245 ++++++++++++++++++ .../assets/roundabout/lang/en_us.json | 7 + .../roundabout/models/item/max_ratt_disc.json | 6 + .../roundabout/models/item/ratt_disc.json | 6 + .../roundabout/textures/stand/ratt/anime.png | Bin 0 -> 2012 bytes .../jojomod/registry/FabricEntities.java | 11 +- .../jojomod/registry/FabricEntityClient.java | 2 + .../hydra/jojomod/registry/FabricItems.java | 8 + .../jojomod/registry/ClientForgeEvents.java | 2 + .../hydra/jojomod/registry/ForgeEntities.java | 6 + .../hydra/jojomod/registry/ForgeEvents.java | 4 + .../hydra/jojomod/registry/ForgeItems.java | 5 + 18 files changed, 602 insertions(+), 1 deletion(-) create mode 100644 common/src/main/java/net/hydra/jojomod/client/models/stand/RattModel.java create mode 100644 common/src/main/java/net/hydra/jojomod/client/models/stand/renderers/RattRenderer.java create mode 100644 common/src/main/java/net/hydra/jojomod/entity/stand/RattEntity.java create mode 100644 common/src/main/java/net/hydra/jojomod/stand/powers/PowersRatt.java create mode 100644 common/src/main/resources/assets/roundabout/models/item/max_ratt_disc.json create mode 100644 common/src/main/resources/assets/roundabout/models/item/ratt_disc.json create mode 100644 common/src/main/resources/assets/roundabout/textures/stand/ratt/anime.png diff --git a/common/src/main/java/net/hydra/jojomod/client/models/layers/ModEntityRendererClient.java b/common/src/main/java/net/hydra/jojomod/client/models/layers/ModEntityRendererClient.java index c66e97059..bac415674 100644 --- a/common/src/main/java/net/hydra/jojomod/client/models/layers/ModEntityRendererClient.java +++ b/common/src/main/java/net/hydra/jojomod/client/models/layers/ModEntityRendererClient.java @@ -16,6 +16,7 @@ public class ModEntityRendererClient { public static final ModelLayerLocation MAGICIANS_RED_LAYER = new ModelLayerLocation(new ResourceLocation(Roundabout.MOD_ID, "magicians_red"), "main"); public static final ModelLayerLocation MAGICIANS_RED_OVA_LAYER = new ModelLayerLocation(new ResourceLocation(Roundabout.MOD_ID, "magicians_red_ova"), "main"); public static final ModelLayerLocation D4C_LAYER = new ModelLayerLocation(new ResourceLocation(Roundabout.MOD_ID, "d4c"), "main"); + public static final ModelLayerLocation RATT_LAYER = new ModelLayerLocation(new ResourceLocation(Roundabout.MOD_ID, "ratt"), "main"); public static final ModelLayerLocation SOFT_AND_WET_LAYER = new ModelLayerLocation(new ResourceLocation(Roundabout.MOD_ID, "soft_and_wet"), "main"); public static final ModelLayerLocation SOFT_AND_WET_KING_LAYER = new ModelLayerLocation(new ResourceLocation(Roundabout.MOD_ID, "soft_and_wet_king"), "main"); public static final ModelLayerLocation SOFT_AND_WET_DROWNED_LAYER = new ModelLayerLocation(new ResourceLocation(Roundabout.MOD_ID, "soft_and_wet_drowned"), "main"); diff --git a/common/src/main/java/net/hydra/jojomod/client/models/stand/RattModel.java b/common/src/main/java/net/hydra/jojomod/client/models/stand/RattModel.java new file mode 100644 index 000000000..eb16e558b --- /dev/null +++ b/common/src/main/java/net/hydra/jojomod/client/models/stand/RattModel.java @@ -0,0 +1,125 @@ +package net.hydra.jojomod.client.models.stand;// Made with Blockbench 4.12.5 +// Exported for Minecraft version 1.17 or later with Mojang mappings +// Paste this class into your mod and generate all required imports + + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.hydra.jojomod.client.models.stand.StandModel; +import net.hydra.jojomod.entity.stand.JusticeEntity; +import net.hydra.jojomod.entity.stand.RattEntity; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.Vec2; +import net.minecraft.world.phys.Vec3; + +public class RattModel extends StandModel { + // This layer location should be baked with EntityRendererProvider.Context in the entity renderer and passed into this model's constructor +// public static final ModelLayerLocation LAYER_LOCATION = new ModelLayerLocation(new ResourceLocation("modid", "ratt"), "main"); + private final ModelPart stand; + private final ModelPart Rotating; + private final ModelPart Neck; + private final ModelPart Jaw; + private final ModelPart Barrel; + private final ModelPart IDK; + private final ModelPart LeftLeg; + private final ModelPart RightLeg; + + public RattModel(ModelPart root) { + this.stand = root.getChild("stand"); + this.Rotating = this.stand.getChild("Rotating"); + this.Neck = this.Rotating.getChild("Neck"); + this.Jaw = this.Rotating.getChild("Jaw"); + this.Barrel = this.Rotating.getChild("Barrel"); + this.IDK = this.Rotating.getChild("IDK"); + this.LeftLeg = this.stand.getChild("LeftLeg"); + this.RightLeg = this.stand.getChild("RightLeg"); + } + + + + public static LayerDefinition getTexturedModelData() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + PartDefinition stand = partdefinition.addOrReplaceChild("stand", CubeListBuilder.create(), PartPose.offset(0.0F, 24.0F, 0.0F)); + + PartDefinition Rotating = stand.addOrReplaceChild("Rotating", CubeListBuilder.create().texOffs(0, 19).addBox(-3.0F, -9.0F, -3.5F, 6.0F, 8.0F, 6.0F, new CubeDeformation(0.0F)) + .texOffs(48, 24).addBox(-1.0F, -6.0F, -4.65F, 2.0F, 2.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(0, 46).addBox(-2.0F, -7.0F, -4.0F, 4.0F, 4.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -10.0F, 0.5F)); + + PartDefinition Neck = Rotating.addOrReplaceChild("Neck", CubeListBuilder.create().texOffs(38, 0).addBox(-5.5F, -2.0F, -1.0F, 7.0F, 2.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(38, 8).addBox(-5.0F, -2.1F, 0.0F, 6.0F, 2.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(42, 36).addBox(-5.0F, -1.7F, 1.75F, 6.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)) + .texOffs(38, 5).addBox(-7.0F, -2.25F, 0.0F, 10.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offset(2.0F, 1.0F, -0.5F)); + + PartDefinition Jaw = Rotating.addOrReplaceChild("Jaw", CubeListBuilder.create(), PartPose.offset(0.0F, 1.0F, -0.5F)); + + PartDefinition cube_r1 = Jaw.addOrReplaceChild("cube_r1", CubeListBuilder.create().texOffs(20, 39).addBox(-1.0F, -1.0F, 1.0F, 1.0F, 1.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(18, 39).addBox(0.5F, -1.0F, 1.0F, 1.0F, 1.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(16, 39).addBox(1.75F, -1.0F, 1.0F, 1.0F, 1.0F, 0.0F, new CubeDeformation(0.0F)) + .texOffs(38, 18).addBox(-2.25F, -1.0F, 1.0F, 1.0F, 1.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-0.25F, 0.25F, -4.25F, 0.48F, 0.0F, 0.0F)); + + PartDefinition Jaw_r1 = Jaw.addOrReplaceChild("Jaw_r1", CubeListBuilder.create().texOffs(0, 39).addBox(-2.0F, -2.0F, -3.0F, 4.0F, 3.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.25F, 0.48F, 0.0F, 0.0F)); + + PartDefinition Jaw_r2 = Jaw.addOrReplaceChild("Jaw_r2", CubeListBuilder.create().texOffs(0, 33).addBox(-3.0F, -2.0F, -3.0F, 6.0F, 2.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.48F, 0.0F, 0.0F)); + + PartDefinition Barrel = Rotating.addOrReplaceChild("Barrel", CubeListBuilder.create().texOffs(48, 18).addBox(-1.5F, -4.5F, 1.0F, 3.0F, 4.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(24, 31).addBox(-0.5F, -1.75F, 2.0F, 1.0F, 1.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(24, 19).addBox(-1.0F, -3.75F, 2.0F, 2.0F, 2.0F, 10.0F, new CubeDeformation(0.0F)) + .texOffs(0, 0).addBox(-0.5F, -3.25F, 2.0F, 1.0F, 1.0F, 18.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 0.0F, 0.0F)); + + PartDefinition IDK = Rotating.addOrReplaceChild("IDK", CubeListBuilder.create().texOffs(20, 33).addBox(-0.5F, 0.5F, -1.0F, 1.0F, 3.0F, 1.0F, new CubeDeformation(0.0F)) + .texOffs(20, 37).addBox(-0.5F, 2.5F, 0.0F, 1.0F, 1.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 0.0F, 0.0F)); + + PartDefinition LeftLeg = stand.addOrReplaceChild("LeftLeg", CubeListBuilder.create(), PartPose.offset(0.0F, -10.0F, 0.0F)); + + PartDefinition Plate_r1 = LeftLeg.addOrReplaceChild("Plate_r1", CubeListBuilder.create().texOffs(48, 39).addBox(0.0F, -3.0F, -1.0F, 1.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(5.25F, 1.75F, 0.0F, 0.0F, 0.0F, -0.3491F)); + + PartDefinition LB = LeftLeg.addOrReplaceChild("LB", CubeListBuilder.create(), PartPose.offsetAndRotation(3.75F, 1.0F, 1.25F, 0.0F, -1.5708F, 0.0F)); + + PartDefinition LBLeg_r1 = LB.addOrReplaceChild("LBLeg_r1", CubeListBuilder.create().texOffs(32, 45).addBox(-1.0F, -2.0F, -1.0F, 2.0F, 10.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.9F, 0.5F, -0.5F, -0.49F, -0.1925F, -0.3444F)); + + PartDefinition LFPlate = LeftLeg.addOrReplaceChild("LFPlate", CubeListBuilder.create().texOffs(38, 13).addBox(-1.5F, -1.25F, -2.15F, 4.0F, 1.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(7.0F, 8.25F, -4.0F)); + + PartDefinition LBPlate = LeftLeg.addOrReplaceChild("LBPlate", CubeListBuilder.create().texOffs(32, 40).addBox(-3.0F, -1.25F, -0.95F, 4.0F, 1.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(8.5F, 8.25F, 4.1F)); + + PartDefinition LF = LeftLeg.addOrReplaceChild("LF", CubeListBuilder.create(), PartPose.offset(5.5F, 4.25F, -1.9F)); + + PartDefinition LFLeg_r1 = LF.addOrReplaceChild("LFLeg_r1", CubeListBuilder.create().texOffs(16, 45).addBox(-1.0F, -2.0F, -1.0F, 2.0F, 10.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-0.85F, -2.75F, 1.4F, -0.49F, -0.1925F, -0.3444F)); + + PartDefinition RightLeg = stand.addOrReplaceChild("RightLeg", CubeListBuilder.create(), PartPose.offset(0.0F, -10.0F, 0.0F)); + + PartDefinition Plate_r2 = RightLeg.addOrReplaceChild("Plate_r2", CubeListBuilder.create().texOffs(48, 45).addBox(0.0F, -3.0F, -1.0F, 1.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-6.75F, 1.5F, 0.0F, 0.0F, 0.0F, 0.3491F)); + + PartDefinition RB = RightLeg.addOrReplaceChild("RB", CubeListBuilder.create(), PartPose.offsetAndRotation(-4.25F, 1.0F, 1.0F, 0.0F, 3.1416F, 0.0F)); + + PartDefinition Leg_r1 = RB.addOrReplaceChild("Leg_r1", CubeListBuilder.create().texOffs(24, 45).addBox(-1.0F, -2.0F, -1.0F, 2.0F, 10.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.9F, 0.5F, -0.5F, -0.49F, -0.1925F, -0.3444F)); + + PartDefinition RF = RightLeg.addOrReplaceChild("RF", CubeListBuilder.create(), PartPose.offsetAndRotation(-4.25F, 1.0F, 0.5F, 0.0F, 1.5708F, 0.0F)); + + PartDefinition Leg_r2 = RF.addOrReplaceChild("Leg_r2", CubeListBuilder.create().texOffs(40, 45).addBox(-1.0F, -2.0F, -1.0F, 2.0F, 10.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.9F, 0.5F, -0.5F, -0.49F, -0.1925F, -0.3444F)); + + PartDefinition RFPlate = RightLeg.addOrReplaceChild("RFPlate", CubeListBuilder.create().texOffs(42, 31).addBox(-10.0F, -3.0F, -5.65F, 4.0F, 1.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 10.0F, 0.0F)); + + PartDefinition RBPlate = RightLeg.addOrReplaceChild("RBPlate", CubeListBuilder.create().texOffs(16, 40).addBox(-10.0F, -3.0F, 3.15F, 4.0F, 1.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 10.0F, 0.0F)); + + return LayerDefinition.create(meshdefinition, 64, 64); + } + + + + @Override + public ModelPart root() { + return stand; + } + + @Override + public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + stand.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); + } + +} \ No newline at end of file diff --git a/common/src/main/java/net/hydra/jojomod/client/models/stand/renderers/RattRenderer.java b/common/src/main/java/net/hydra/jojomod/client/models/stand/renderers/RattRenderer.java new file mode 100644 index 000000000..b1693423f --- /dev/null +++ b/common/src/main/java/net/hydra/jojomod/client/models/stand/renderers/RattRenderer.java @@ -0,0 +1,49 @@ +package net.hydra.jojomod.client.models.stand.renderers; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.hydra.jojomod.Roundabout; +import net.hydra.jojomod.client.models.layers.ModEntityRendererClient; +import net.hydra.jojomod.client.models.stand.CinderellaModel; +import net.hydra.jojomod.client.models.stand.RattModel; +import net.hydra.jojomod.entity.stand.CinderellaEntity; +import net.hydra.jojomod.entity.stand.KillerQueenEntity; +import net.hydra.jojomod.entity.stand.RattEntity; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.Nullable; + +public class RattRenderer extends StandRenderer { + + private static final ResourceLocation PART_4_SKIN = new ResourceLocation(Roundabout.MOD_ID,"textures/stand/ratt/anime.png"); + private static final ResourceLocation MANGA_SKIN = new ResourceLocation(Roundabout.MOD_ID,"textures/stand/ratt/manga.png"); + + public RattRenderer(EntityRendererProvider.Context context) { + super(context, new RattModel<>(context.bakeLayer(ModEntityRendererClient.RATT_LAYER)), 0f); + } + + @Override public ResourceLocation getTextureLocation(RattEntity entity) { + return main_skin; + } + + private static final ResourceLocation main_skin = new ResourceLocation(Roundabout.MOD_ID,"textures/stand/ratt/anime.png"); + + + @Override + public void render(RattEntity mobEntity, float f, float g, PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i) { + float factor = 0.5F + (mobEntity.getSizePercent()/2); + if (mobEntity.isBaby()) { + matrixStack.scale(0.5f*factor, 0.5f*factor, 0.5f*factor); + } else { + matrixStack.scale(0.8f * factor, 0.8f * factor, 0.8f * factor); + } + super.render(mobEntity, f, g, matrixStack, vertexConsumerProvider, i); + } + + @Nullable + @Override + protected RenderType getRenderType(RattEntity entity, boolean showBody, boolean translucent, boolean showOutline) { + return super.getRenderType(entity, showBody, true, showOutline); + } +} diff --git a/common/src/main/java/net/hydra/jojomod/entity/ModEntities.java b/common/src/main/java/net/hydra/jojomod/entity/ModEntities.java index 33d271234..d5c0216d5 100644 --- a/common/src/main/java/net/hydra/jojomod/entity/ModEntities.java +++ b/common/src/main/java/net/hydra/jojomod/entity/ModEntities.java @@ -30,6 +30,7 @@ public class ModEntities { public static EntityType MAGICIANS_RED; public static EntityType MAGICIANS_RED_OVA; public static EntityType D4C; + public static EntityType RATT; public static EntityType GREEN_DAY; public static EntityType SOFT_AND_WET; public static EntityType SOFT_AND_WET_KING; diff --git a/common/src/main/java/net/hydra/jojomod/entity/stand/RattEntity.java b/common/src/main/java/net/hydra/jojomod/entity/stand/RattEntity.java new file mode 100644 index 000000000..fdfdc9b06 --- /dev/null +++ b/common/src/main/java/net/hydra/jojomod/entity/stand/RattEntity.java @@ -0,0 +1,123 @@ +package net.hydra.jojomod.entity.stand; + +import net.hydra.jojomod.Roundabout; +import net.hydra.jojomod.client.StandIcons; +import net.hydra.jojomod.event.index.OffsetIndex; +import net.hydra.jojomod.event.powers.StandUser; +import net.hydra.jojomod.mixin.StandUserEntity; +import net.hydra.jojomod.stand.powers.PowersRatt; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.*; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; + +public class RattEntity extends StandEntity { + public RattEntity(EntityType entityType, Level world) {super(entityType, world);} + + public static final byte + ANIME_SKIN = 1, + MANGA_SKIN = 2; + + public Component getSkinName(byte skinId) { + return getSkinNameT(skinId); + } + + public static Component getSkinNameT(byte skinId){ + if (skinId == MANGA_SKIN) { + return Component.translatable("skins.roundabout.ratt.manga"); + } + return Component.translatable("skins.roundabout.ratt.anime"); + } + + + public float DormantTime = 0; + public static float MaxDormantTime = 30; + + public Vec3 Placement; + public void setPlacement(Vec3 placement) { + Placement = placement; + } + + public int MotionState = 0; + public double MovementDelta = 0.0; + + public void setMotionState(int motionState) {MotionState = motionState;} + public int getMotionState() {return MotionState;} + /* + 0 = hovering + 1 = deployed + 2 = placed + 3 = piloted + + */ + + + + @Override + public void tick() { + super.tick(); + switch(MotionState) { + case 0 -> { + this.setOffsetType(OffsetIndex.FOLLOW); + } + case 1 -> { + this.setOffsetType(OffsetIndex.LOOSE); + + Vec3 loc = Placement; + if (loc == null) {loc = this.getStandOffsetVector(this.getUser());} + + setPos(getPosition(0).lerp(loc,MovementDelta)); + MovementDelta += (double) 1/60; + + if (getPosition(0).distanceTo(loc) <= 0.2 ) { + if (loc == Placement) {setMotionState(2);} else {setMotionState(0);} + MovementDelta = 0; + } + + + } + case 2 -> { + MovementDelta = 0; + this.setOffsetType(OffsetIndex.LOOSE); + if (Placement != null) { + setPos(Placement); + } + this.setStandRotationY(this.getStandRotationY()+1.0F); + double DormantRange = PowersRatt.DormantRange; + double ActiveRange = PowersRatt.ActiveRange; + float dist = (float) this.getUser().getPosition(0).distanceTo(getPosition(0)); + + if ( dist > DormantRange || DormantTime >= MaxDormantTime) { + MovementDelta = 0; + setMotionState(1); + setPlacement(null); + DormantTime = 0; + } else if ( dist > ActiveRange) { + DormantTime += 1; + } + + } + + + } + + } + + @Override + public void setupAnimationStates() { + super.setupAnimationStates(); + /* if (this.getUser() != null) { + if (this.getAnimation() == DEFACE) { + this.deface.startIfStopped(this.tickCount); + } else { + this.deface.stop(); + } + if (this.getAnimation() == VISAGES) { + this.visages.startIfStopped(this.tickCount); + } else { + this.visages.stop(); + } + }*/ + } +} + diff --git a/common/src/main/java/net/hydra/jojomod/item/ModItems.java b/common/src/main/java/net/hydra/jojomod/item/ModItems.java index 9c4b4e3da..bb2de58fb 100644 --- a/common/src/main/java/net/hydra/jojomod/item/ModItems.java +++ b/common/src/main/java/net/hydra/jojomod/item/ModItems.java @@ -25,6 +25,8 @@ public class ModItems { public static Item STAND_DISC_MAGICIANS_RED; public static Item STAND_DISC_D4C; public static Item MAX_STAND_DISC_D4C; + public static Item STAND_DISC_RATT; + public static Item MAX_STAND_DISC_RATT; public static Item STAND_DISC_GREEN_DAY; public static Item MAX_STAND_DISC_GREEN_DAY; public static Item STAND_DISC_SOFT_AND_WET; diff --git a/common/src/main/java/net/hydra/jojomod/stand/powers/PowersRatt.java b/common/src/main/java/net/hydra/jojomod/stand/powers/PowersRatt.java new file mode 100644 index 000000000..98504e65f --- /dev/null +++ b/common/src/main/java/net/hydra/jojomod/stand/powers/PowersRatt.java @@ -0,0 +1,245 @@ +package net.hydra.jojomod.stand.powers; + +import net.hydra.jojomod.Roundabout; +import net.hydra.jojomod.client.ClientUtil; +import net.hydra.jojomod.client.StandIcons; +import net.hydra.jojomod.entity.ModEntities; +import net.hydra.jojomod.entity.stand.D4CEntity; +import net.hydra.jojomod.entity.stand.RattEntity; +import net.hydra.jojomod.entity.stand.StandEntity; +import net.hydra.jojomod.event.index.OffsetIndex; +import net.hydra.jojomod.event.index.PowerIndex; +import net.hydra.jojomod.event.powers.StandPowers; +import net.hydra.jojomod.mixin.InputEvents; +import net.hydra.jojomod.sound.ModSounds; +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; + +public class PowersRatt extends NewDashPreset { + public PowersRatt(LivingEntity self) { + super(self); + } + + @Override + public StandPowers generateStandPowers(LivingEntity entity) { + return new PowersRatt(entity); + } + + public static float PlacementRange = 5.0F; + public static float PilotRange = 3.0F; + public static float ActiveRange = 10.0F; + public static float DormantRange = 12.5F; + + + + public boolean isRattState(int state) { + StandEntity re = getStandEntity(this.self); + if (re != null) { + return ((RattEntity) re).MotionState == state; + } + return false; + } + + + private BlockHitResult getValidPlacement(){ + Vec3 vec3d = this.getSelf().getEyePosition(0); + Vec3 vec3d2 = this.getSelf().getViewVector(0); + Vec3 vec3d3 = vec3d.add(vec3d2.x * PlacementRange, vec3d2.y * PlacementRange, vec3d2.z * PlacementRange); + BlockHitResult blockHit = this.getSelf().level().clip(new ClipContext(vec3d, vec3d3, + ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, this.getSelf())); + if (blockHit.getType() == HitResult.Type.BLOCK && blockHit.getDirection() == Direction.UP){ + return blockHit; + } + return null; + } + + + + @Override + public StandEntity getNewStandEntity(){return ModEntities.RATT.create(this.getSelf().level());} + + @Override + public void renderIcons(GuiGraphics context, int x, int y) { + ClientUtil.fx.roundabout$onGUI(context); + + RattEntity RE = ((RattEntity) getStandEntity(this.self) ); + + if (isRattState(0)) { + + ResourceLocation ScopeIcon = StandIcons.STAR_PLATINUM_SCOPE; + if (scopeLevel == 1) { + ScopeIcon = StandIcons.STAR_PLATINUM_SCOPE_1; + } + if (scopeLevel == 2) { + ScopeIcon = StandIcons.STAR_PLATINUM_SCOPE_2; + } + setSkillIcon(context, x, y, 1, ScopeIcon, PowerIndex.SKILL_1); + + setSkillIcon(context, x, y, 2, StandIcons.JUSTICE_PILOT, PowerIndex.SKILL_2); + } else if (isRattState(1)) { + setSkillIcon(context, x, y, 1, StandIcons.NONE, PowerIndex.SKILL_1); + setSkillIcon(context, x, y, 2, StandIcons.NONE, PowerIndex.SKILL_2); + } else if (isRattState(2)) { + setSkillIcon(context, x, y, 1, StandIcons.NONE, PowerIndex.SKILL_1); + setSkillIcon(context, x, y, 2, StandIcons.JUSTICE_PILOT_EXIT, PowerIndex.SKILL_2); + } else if (isRattState(3)) { + // nothing yet, will have piloting + } + + if (!isRattState(3)) { + setSkillIcon(context, x, y, 3, StandIcons.DODGE, PowerIndex.GLOBAL_DASH); + } + super.renderIcons(context, x, y); + } + + @Override + public void tick() { + } + + @Override + public void powerActivate(PowerContext context) { + + + switch (context) + { + case SKILL_1_NORMAL -> { + if (isRattState(0)) { + RattScope(); + } + } + case SKILL_2_NORMAL -> { + if (isRattState(0) ) { + Deploy(); + } else { + Recall(); + } + } + + case SKILL_3_NORMAL -> { + dash(); + } + } + } + + public void Deploy() { + RattEntity RE = ((RattEntity) getStandEntity(this.self) ); + Vec3 p = this.getRayBlock(RE.getUser(),PlacementRange); + + if (RE != null) { + if (getValidPlacement() != null) { + RE.setPlacement(p); + RE.setMotionState(1); + /* highlight Ratt for user ? */ + } + } + } + + public void Recall() { + RattEntity RE = ((RattEntity) getStandEntity(this.self)); + if (RE != null) { + RE.setPlacement(null); + RE.setMotionState(1); + } + this.setCooldown(PowerIndex.SKILL_2, 100); + } + + public void RattScope() { + /* will eventually add some sort of scope effect */ + int nl = scopeLevel + 1; + if (nl == 2) { + setScopeLevel(0); + } else { + setScopeLevel(nl); + this.getSelf().playSound(ModSounds.STAR_PLATINUM_SCOPE_EVENT, 1.0F, (float) (0.98F + (Math.random() * 0.04F))); + } + + } + + + + + @Override + public boolean tryPower(int move, boolean forced) { + return super.tryPower(move, forced); + } + + @Override + public boolean isAttackIneptVisually(byte activeP, int slot) { + switch (activeP) { + case PowerIndex.SKILL_2 -> { + return getValidPlacement() == null && isRattState(0); + } + } + return super.isAttackIneptVisually(activeP, slot); + } + + /** if = -1, not melt dodging */ + public int meltDodgeTicks = -1; + + @Override + public void tickPower() { + super.tickPower(); + } + + + @Override + public boolean canScope() { + return true; + } + + @Override + public List getSkinList() { + return Arrays.asList( + RattEntity.ANIME_SKIN + ); + } + + @Override + public boolean setPowerOther(int move, int lastMove) { + + return super.setPowerOther(move, lastMove); + } + + @Override + public void updateIntMove(int in) { + + super.updateIntMove(in); + } + + @Override + public void updateUniqueMoves() { + super.updateUniqueMoves(); + } + + + + @Override + public boolean isWip(){ + return true; + } + @Override + public Component ifWipListDevStatus(){ + return Component.translatable( "roundabout.dev_status.active").withStyle(ChatFormatting.AQUA); + } + @Override + public Component ifWipListDev(){ + return Component.literal( "Prisma").withStyle(ChatFormatting.YELLOW); + } +} \ No newline at end of file diff --git a/common/src/main/resources/assets/roundabout/lang/en_us.json b/common/src/main/resources/assets/roundabout/lang/en_us.json index 79ee0eb46..059499b0b 100644 --- a/common/src/main/resources/assets/roundabout/lang/en_us.json +++ b/common/src/main/resources/assets/roundabout/lang/en_us.json @@ -52,6 +52,8 @@ "item.roundabout.soft_and_wet_disc": "Stand Disc", "item.roundabout.cinderella_disc": "Stand Disc", "item.roundabout.hey_ya_disc": "Stand Disc", + "item.roundabout.ratt_disc": "Stand Disc", + "item.roundabout.max_ratt_disc": "Stand Disc+", "item.roundabout.max_star_platinum_disc": "Stand Disc+", "item.roundabout.magicians_red_disc": "Stand Disc", "item.roundabout.killer_queen_disc": "Stand Disc", @@ -71,6 +73,8 @@ "item.roundabout.the_world_disc.desc": "The World", "item.roundabout.justice_disc.desc": "Justice", "item.roundabout.cinderella_disc.desc": "Cinderella", + "item.roundabout.max_ratt_disc.desc": "Ratt", + "item.roundabout.ratt_disc.desc": "Ratt", "item.roundabout.hey_ya_disc.desc": "Hey Ya!", "item.roundabout.none_disc.desc": "None", @@ -924,6 +928,9 @@ "skins.roundabout.cinderella.manga": "Manga", "skins.roundabout.cinderella.zombie": "Infected", + "skins.roundabout.ratt.anime" : "Anime", + "skins.roundabout.ratt.manga" : "Manga", + "skins.roundabout.hey_ya.manga": "Manga", "skins.roundabout.hey_ya.gothic": "Gothic", "skins.roundabout.hey_ya.volume_2": "Vol 2", diff --git a/common/src/main/resources/assets/roundabout/models/item/max_ratt_disc.json b/common/src/main/resources/assets/roundabout/models/item/max_ratt_disc.json new file mode 100644 index 000000000..3f975eda4 --- /dev/null +++ b/common/src/main/resources/assets/roundabout/models/item/max_ratt_disc.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "roundabout:item/max_d4c_disc" + } +} \ No newline at end of file diff --git a/common/src/main/resources/assets/roundabout/models/item/ratt_disc.json b/common/src/main/resources/assets/roundabout/models/item/ratt_disc.json new file mode 100644 index 000000000..694e3ef4c --- /dev/null +++ b/common/src/main/resources/assets/roundabout/models/item/ratt_disc.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "roundabout:item/d4c_disc" + } +} \ No newline at end of file diff --git a/common/src/main/resources/assets/roundabout/textures/stand/ratt/anime.png b/common/src/main/resources/assets/roundabout/textures/stand/ratt/anime.png new file mode 100644 index 0000000000000000000000000000000000000000..7d20eb2f642fec09f8b2970b3ba9fa3c5e8df264 GIT binary patch literal 2012 zcmV<22P622P)Px+mPtfGRCt{2T3t+3M-={+<>#_$A(GS*w6)OIqV=Is5}KHlEcJnwredpzFDSL? zgZ&YsiH1mu#5NV{Pqa;J36+Odt5w^C#59eGBqoqhpCqd`YNSB4CRib1xw{*l9sr69dK&F-C0vcI^8= zYDiO-0jdeBkl}g8_D|+bQkDTTg_N}cN1K1;TcD%2PpS=_XPbbi^eGbAJ}Jup5v4CJ zwv@YX58!V9LKG}|&Qed^p%XkY4CuZ+Agxby!6H(Y0n}ifevl{aL;b&&H4gxwheolx zvCh!4=0OjQ+HQxGWdO*cob=N}qsnqTq$~rhk~@y7>T<3TnwE`BdDLBqv$?welmZzW#$7q@e3TtX}jGYwM0VHf&qA)kxQIs`Yey zH>e6>F+a>*kv9xI7(vT^RkWqv^OMurO0aGF_y)1ez~{m+AL(fGwIaVx|z+4eG(j zrQ+hHhFE4j(GKomuEhrhlCGHJRR(iwm`~Aqz&*y)EKmdNf-?a(NG!yLI;CLp0 zs4a*xrMS4*^@-%>ioR^b3BcI)u1QNP zI;_qM&_z)uP-(I)K*8*S#aocJnM7IRHvqsTUxarYjq|YR36*ZVfI>`PfdO=^=F7nS z{#a>JL&v_ys!jm_vM+A2^n*epiWa{PP4gw4j5Xb$pxWZT7C{-sLH0Y>nrOe=oIK0E zX8T;V*Hx!N+F#Rr(Dh(qtCb*~N{}stGDD@>rUwxEM)yA*+xo4&7g)cc(zx)}{DdS~ zRsEk~{+f}ZXEbZn*lC0)T{dx!s8kt~DD29Z1v|i^Ly5!*(wq0h+`6Rx{Qa%Fqy*0Y zcqoR`9ld=<-q2pW@#fFAQmCpfH!$INzOEzYB(Pkx0<9w8K7ZmG{%(1-KF z_^!^)28Q+m0Q5UM4VC+G3&}=^W<4VG;l4JsHEp-;S5sSQh*2RLCu9*K1{y^MfQ!Fe zcK$vK)V;=FBwXfe$8J7v!AD_Y4$xU%5 z+5E-VSg~S-tv0bo6*RSO2dNEUsc2P3mVzyo{eJgHFE>~Kut2k(_F@hw=jL0AvJ}|C zg9lMtTWd(iCy5!!3{5qKV$5S2zp{!_^z;N|LpZ3Lnh8+j7%@fw z;eC(kSs7hl1dv%gu0+S!6+5Kem)K*zMvr{Ig)v~gWr)e;%NKy!%V zGZnaWC5}gnp7f@o0Up`HCk!AhO5)U4h1SUkMvp#7l1-cjP{c@5Oyo(3NXzI!U<9-L z4D`)l#2B&l0@8CpnlL1*U>P@jD#&t&7Vn{0Jo{!rR~nttd>OH!_$ZC3M4e@Dz!PU$dsk4R27AVr>|Hm6PHDcTy1Do^~pz1CL zRxNFcP2*+%~xIY$s_3{PXt+o_)c~%c5kYhA*0QrI5Kh uv5m+3#!Z_t(|LzE%wZ05n8O^NGW-vaH!oRZ2B8N40000 RATT = + Registry.register( + BuiltInRegistries.ENTITY_TYPE, + Roundabout.location("ratt"), + EntityType.Builder.of(RattEntity::new, MobCategory.MISC). + sized(0.75f, 2.05f).clientTrackingRange(12).build(Roundabout.MOD_ID+":ratt") + ); public static final EntityType SOFT_AND_WET_DROWNED = Registry.register( BuiltInRegistries.ENTITY_TYPE, @@ -462,6 +469,7 @@ public static void register() { ModEntities.MAGICIANS_RED_OVA = MAGICIANS_RED_OVA; ModEntities.D4C = D4C; ModEntities.GREEN_DAY = GREEN_DAY; + ModEntities.RATT = RATT; ModEntities.SOFT_AND_WET = SOFT_AND_WET; ModEntities.SOFT_AND_WET_DROWNED = SOFT_AND_WET_DROWNED; ModEntities.SOFT_AND_WET_DEBUT = SOFT_AND_WET_DEBUT; @@ -548,7 +556,8 @@ public static void register() { FabricDefaultAttributeRegistry.register(MAGICIANS_RED, StandEntity.createStandAttributes()); FabricDefaultAttributeRegistry.register(MAGICIANS_RED_OVA, StandEntity.createStandAttributes()); FabricDefaultAttributeRegistry.register(D4C, StandEntity.createStandAttributes()); - FabricDefaultAttributeRegistry.register(GREEN_DAY, StandEntity.createStandAttributes()); + FabricDefaultAttributeRegistry.register(GREEN_DAY, StandEntity.createStandAttributes()); FabricDefaultAttributeRegistry.register(GREEN_DAY, StandEntity.createStandAttributes()); + FabricDefaultAttributeRegistry.register(RATT, StandEntity.createStandAttributes()); FabricDefaultAttributeRegistry.register(SOFT_AND_WET, StandEntity.createStandAttributes()); FabricDefaultAttributeRegistry.register(SOFT_AND_WET_DROWNED, StandEntity.createStandAttributes()); FabricDefaultAttributeRegistry.register(SOFT_AND_WET_DEBUT, StandEntity.createStandAttributes()); diff --git a/fabric/src/main/java/net/hydra/jojomod/registry/FabricEntityClient.java b/fabric/src/main/java/net/hydra/jojomod/registry/FabricEntityClient.java index 35f1ee471..882e06d5f 100644 --- a/fabric/src/main/java/net/hydra/jojomod/registry/FabricEntityClient.java +++ b/fabric/src/main/java/net/hydra/jojomod/registry/FabricEntityClient.java @@ -56,6 +56,7 @@ public static void register() { EntityRendererRegistry.register(FabricEntities.MAGICIANS_RED_OVA, MagiciansRedOVARenderer::new); EntityRendererRegistry.register(FabricEntities.D4C, D4CRenderer::new); EntityRendererRegistry.register(FabricEntities.GREEN_DAY, GreenDayRenderer::new); + EntityRendererRegistry.register(FabricEntities.RATT, RattRenderer::new); EntityRendererRegistry.register(FabricEntities.SOFT_AND_WET, SoftAndWetRenderer::new); EntityRendererRegistry.register(FabricEntities.SOFT_AND_WET_KING, SoftAndWetKingRenderer::new); EntityRendererRegistry.register(FabricEntities.SOFT_AND_WET_KILLER_QUEEN, SoftAndWetKillerQueenRenderer::new); @@ -117,6 +118,7 @@ public static void register() { EntityModelLayerRegistry.registerModelLayer(ModEntityRendererClient.D4C_LAYER, D4CModel::getTexturedModelData); EntityModelLayerRegistry.registerModelLayer(ModEntityRendererClient.GREEN_DAY_LAYER, GreenDayModel::getTexturedModelData); EntityModelLayerRegistry.registerModelLayer(ModEntityRendererClient.SOFT_AND_WET_LAYER, SoftAndWetModel::getTexturedModelData); + EntityModelLayerRegistry.registerModelLayer(ModEntityRendererClient.RATT_LAYER, RattModel::getTexturedModelData); EntityModelLayerRegistry.registerModelLayer(ModEntityRendererClient.SOFT_AND_WET_KING_LAYER, SoftAndWetKingModel::getTexturedModelData); EntityModelLayerRegistry.registerModelLayer(ModEntityRendererClient.SOFT_AND_WET_DROWNED_LAYER, SoftAndWetDrownedModel::getTexturedModelData); EntityModelLayerRegistry.registerModelLayer(ModEntityRendererClient.SOFT_AND_WET_DEBUT_LAYER, SoftAndWetDebutModel::getTexturedModelData); diff --git a/fabric/src/main/java/net/hydra/jojomod/registry/FabricItems.java b/fabric/src/main/java/net/hydra/jojomod/registry/FabricItems.java index 78fb67aac..1b78f9085 100644 --- a/fabric/src/main/java/net/hydra/jojomod/registry/FabricItems.java +++ b/fabric/src/main/java/net/hydra/jojomod/registry/FabricItems.java @@ -13,6 +13,7 @@ import net.hydra.jojomod.stand.powers.PowersD4C; import net.hydra.jojomod.stand.powers.PowersGreenDay; import net.hydra.jojomod.stand.powers.PowersHeyYa; +import net.hydra.jojomod.stand.powers.PowersRatt; import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; @@ -48,6 +49,10 @@ public class FabricItems { new StandDiscItem(new Item.Properties().stacksTo(1), new PowersD4C(null))); public static Item MAX_STAND_DISC_D4C = registerItem("max_d4c_disc", new MaxStandDiscItem(new Item.Properties().stacksTo(1), new PowersD4C(null))); + public static Item STAND_DISC_RATT = registerItem("ratt_disc", + new StandDiscItem(new Item.Properties().stacksTo(1), new PowersRatt(null))); + public static Item MAX_STAND_DISC_RATT = registerItem("max_ratt_disc", + new MaxStandDiscItem(new Item.Properties().stacksTo(1), new PowersRatt(null))); public static Item STAND_DISC_GREEN_DAY = registerItem("green_day_disc", new StandDiscItem(new Item.Properties().stacksTo(1), new PowersGreenDay(null))); public static Item MAX_STAND_DISC_GREEN_DAY = registerItem("max_green_day_disc", @@ -402,6 +407,9 @@ public static void register(){ ((MaxStandDiscItem)MAX_STAND_DISC_D4C).baseDisc = ((StandDiscItem)STAND_DISC_D4C); ModItems.MAX_STAND_DISC_D4C = MAX_STAND_DISC_D4C; ModItems.STAND_DISC_D4C = STAND_DISC_D4C; + ModItems.STAND_DISC_RATT = STAND_DISC_RATT; + ModItems.MAX_STAND_DISC_RATT = MAX_STAND_DISC_RATT; + ((MaxStandDiscItem)MAX_STAND_DISC_RATT).baseDisc = ((StandDiscItem)STAND_DISC_RATT); ModItems.MAX_STAND_DISC_GREEN_DAY = MAX_STAND_DISC_GREEN_DAY; ModItems.STAND_DISC_GREEN_DAY = STAND_DISC_GREEN_DAY; ((MaxStandDiscItem)MAX_STAND_DISC_GREEN_DAY).baseDisc = ((StandDiscItem)STAND_DISC_GREEN_DAY); diff --git a/forge/src/main/java/net/hydra/jojomod/registry/ClientForgeEvents.java b/forge/src/main/java/net/hydra/jojomod/registry/ClientForgeEvents.java index a1276f2cd..d99aa00b7 100644 --- a/forge/src/main/java/net/hydra/jojomod/registry/ClientForgeEvents.java +++ b/forge/src/main/java/net/hydra/jojomod/registry/ClientForgeEvents.java @@ -58,6 +58,7 @@ public static void registerRenderers(EntityRenderersEvent.RegisterRenderers even event.registerEntityRenderer(ForgeEntities.KILLER_QUEEN.get(), KillerQueenRenderer::new); event.registerEntityRenderer(ForgeEntities.D4C.get(), D4CRenderer::new); event.registerEntityRenderer(ForgeEntities.GREEN_DAY.get(), GreenDayRenderer::new); + event.registerEntityRenderer(ForgeEntities.RATT.get(), RattRenderer::new); event.registerEntityRenderer(ForgeEntities.SOFT_AND_WET.get(), SoftAndWetRenderer::new); event.registerEntityRenderer(ForgeEntities.SOFT_AND_WET_DROWNED.get(), SoftAndWetDrownedRenderer::new); event.registerEntityRenderer(ForgeEntities.SOFT_AND_WET_DEBUT.get(), SoftAndWetDebutRenderer::new); @@ -157,6 +158,7 @@ public static void registerLayerDefinitions(EntityRenderersEvent.RegisterLayerDe event.registerLayerDefinition(ModEntityRendererClient.STAND_FIRE_LAYER, StandFireRenderer::createBodyLayer); event.registerLayerDefinition(ModEntityRendererClient.MR_SPIN_LAYER, MagiciansRedSpinEffectLayer::createLayer); event.registerLayerDefinition(ModEntityRendererClient.GREEN_DAY_LAYER, GreenDayModel::getTexturedModelData); + event.registerLayerDefinition(ModEntityRendererClient.RATT_LAYER, RattModel::getTexturedModelData); ModStrayModels.SHOOTING_ARM = new SoftAndWetShootingArmModel(); ModStrayModels.HEY_YA = new HeyYaModel(); //BlockEntityRenderers.register(ModBlocks.STAND_FIRE_BLOCK_ENTITY, StandFireRenderer::new); diff --git a/forge/src/main/java/net/hydra/jojomod/registry/ForgeEntities.java b/forge/src/main/java/net/hydra/jojomod/registry/ForgeEntities.java index ef0c728cc..6ac8b11d1 100644 --- a/forge/src/main/java/net/hydra/jojomod/registry/ForgeEntities.java +++ b/forge/src/main/java/net/hydra/jojomod/registry/ForgeEntities.java @@ -202,6 +202,12 @@ public class ForgeEntities { clientTrackingRange(10). build(new ResourceLocation(Roundabout.MOD_ID, "green_day").toString()) ); + public static final RegistryObject> RATT = + ENTITY_TYPES.register("ratt", () -> + EntityType.Builder.of(RattEntity::new, MobCategory.MISC).sized(0.75F, 2.05f). + clientTrackingRange(10). + build(new ResourceLocation(Roundabout.MOD_ID, "ratt").toString()) + ); public static final RegistryObject> SOFT_AND_WET = ENTITY_TYPES.register("soft_and_wet", () -> EntityType.Builder.of(SoftAndWetEntity::new, MobCategory.MISC).sized(0.75F, 2.05f). diff --git a/forge/src/main/java/net/hydra/jojomod/registry/ForgeEvents.java b/forge/src/main/java/net/hydra/jojomod/registry/ForgeEvents.java index c8adb1898..0cf6db0de 100644 --- a/forge/src/main/java/net/hydra/jojomod/registry/ForgeEvents.java +++ b/forge/src/main/java/net/hydra/jojomod/registry/ForgeEvents.java @@ -48,6 +48,7 @@ public static void entityAttributes(EntityAttributeCreationEvent event) { event.put(ForgeEntities.JUSTICE.get(), StandEntity.createStandAttributes().build()); event.put(ForgeEntities.JUSTICE_PIRATE.get(), StandEntity.createStandAttributes().build()); event.put(ForgeEntities.D4C.get(), StandEntity.createStandAttributes().build()); + event.put(ForgeEntities.RATT.get(), StandEntity.createStandAttributes().build()); event.put(ForgeEntities.GREEN_DAY.get(), StandEntity.createStandAttributes().build()); event.put(ForgeEntities.SOFT_AND_WET.get(), StandEntity.createStandAttributes().build()); event.put(ForgeEntities.SOFT_AND_WET_KING.get(), StandEntity.createStandAttributes().build()); @@ -234,6 +235,8 @@ public static void registerRoundaboutBridge(FMLCommonSetupEvent event){ ModItems.MAX_STAND_DISC_D4C = ForgeItems.MAX_STAND_DISC_D4C.get(); ModItems.STAND_DISC_GREEN_DAY = ForgeItems.STAND_DISC_GREEN_DAY.get(); ((MaxStandDiscItem)ForgeItems.MAX_STAND_DISC_GREEN_DAY.get()).baseDisc = ((StandDiscItem)ForgeItems.STAND_DISC_GREEN_DAY.get()); + ModItems.STAND_DISC_RATT = ForgeItems.STAND_DISC_RATT.get(); + ((MaxStandDiscItem)ForgeItems.MAX_STAND_DISC_RATT.get()).baseDisc = ((StandDiscItem)ForgeItems.STAND_DISC_RATT.get()); ModItems.MAX_STAND_DISC_D4C = ForgeItems.MAX_STAND_DISC_GREEN_DAY.get(); ModItems.STAND_DISC_SOFT_AND_WET = ForgeItems.STAND_DISC_SOFT_AND_WET.get(); ((MaxStandDiscItem)ForgeItems.MAX_STAND_DISC_SOFT_AND_WET.get()).baseDisc = ((StandDiscItem)ForgeItems.STAND_DISC_SOFT_AND_WET.get()); @@ -333,6 +336,7 @@ public static void registerRoundaboutBridge(FMLCommonSetupEvent event){ ModEntities.MAGICIANS_RED_OVA = ForgeEntities.MAGICIANS_RED_OVA.get(); ModEntities.D4C = ForgeEntities.D4C.get(); ModEntities.GREEN_DAY = ForgeEntities.GREEN_DAY.get(); + ModEntities.RATT = ForgeEntities.RATT.get(); ModEntities.SOFT_AND_WET = ForgeEntities.SOFT_AND_WET.get(); ModEntities.SOFT_AND_WET_KING = ForgeEntities.SOFT_AND_WET_KING.get(); ModEntities.SOFT_AND_WET_DROWNED = ForgeEntities.SOFT_AND_WET_DROWNED.get(); diff --git a/forge/src/main/java/net/hydra/jojomod/registry/ForgeItems.java b/forge/src/main/java/net/hydra/jojomod/registry/ForgeItems.java index 8b33bf2db..4a32a8278 100644 --- a/forge/src/main/java/net/hydra/jojomod/registry/ForgeItems.java +++ b/forge/src/main/java/net/hydra/jojomod/registry/ForgeItems.java @@ -7,6 +7,7 @@ import net.hydra.jojomod.stand.powers.PowersD4C; import net.hydra.jojomod.stand.powers.PowersGreenDay; import net.hydra.jojomod.stand.powers.PowersHeyYa; +import net.hydra.jojomod.stand.powers.PowersRatt; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.item.*; import net.minecraft.world.item.alchemy.Potion; @@ -426,6 +427,10 @@ public class ForgeItems { () -> new StandDiscItem(new Item.Properties().stacksTo(1), new PowersGreenDay(null)))); public static final RegistryObject MAX_STAND_DISC_GREEN_DAY = addToWIPTab(ITEMS.register("max_green_day_disc", () -> new MaxStandDiscItem(new Item.Properties().stacksTo(1), new PowersGreenDay(null)))); + public static final RegistryObject STAND_DISC_RATT = addToWIPTab(ITEMS.register("ratt_disc", + () -> new StandDiscItem(new Item.Properties().stacksTo(1), new PowersRatt(null)))); + public static final RegistryObject MAX_STAND_DISC_RATT = addToWIPTab(ITEMS.register("max_ratt_disc", + () -> new MaxStandDiscItem(new Item.Properties().stacksTo(1), new PowersRatt(null)))); public static final RegistryObject WORTHY_ARROW = addToTab(ITEMS.register("worthy_arrow", () -> new WorthyArrowItem(new Item.Properties().stacksTo(1)))); public static final RegistryObject LUCKY_LIPSTICK = addToTab(ITEMS.register("lucky_lipstick", From e238e6e8b71bcf20a9d018eba2424f7c4559aaf0 Mon Sep 17 00:00:00 2001 From: Prisma Date: Tue, 24 Jun 2025 12:44:56 -0700 Subject: [PATCH 2/6] Ratt files (don't look at the code it's bad :/) --- .../main/java/net/hydra/jojomod/stand/powers/PowersRatt.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/src/main/java/net/hydra/jojomod/stand/powers/PowersRatt.java b/common/src/main/java/net/hydra/jojomod/stand/powers/PowersRatt.java index 98504e65f..a7f63a0d1 100644 --- a/common/src/main/java/net/hydra/jojomod/stand/powers/PowersRatt.java +++ b/common/src/main/java/net/hydra/jojomod/stand/powers/PowersRatt.java @@ -71,6 +71,8 @@ private BlockHitResult getValidPlacement(){ } + @Override + public boolean canSummonStandAsEntity() {return false;} @Override public StandEntity getNewStandEntity(){return ModEntities.RATT.create(this.getSelf().level());} From 7b8a79b5e77ecfc70d87ebc1d008d273839fb5d7 Mon Sep 17 00:00:00 2001 From: Prisma Date: Tue, 24 Jun 2025 20:51:19 -0700 Subject: [PATCH 3/6] Ratt Shoulder Model --- .../hydra/jojomod/client/ModStrayModels.java | 3 + .../models/layers/RattShoulderLayer.java | 92 +++++++++++++++++++ .../client/models/stand/RattModel.java | 17 +++- .../models/worn_stand/RattShoulderModel.java | 83 +++++++++++++++++ .../hydra/jojomod/event/powers/StandUser.java | 2 + .../hydra/jojomod/mixin/StandUserEntity.java | 23 +++++ .../jojomod/mixin/ZHumanoidMobRenderer.java | 2 + .../hydra/jojomod/mixin/ZPlayerRender.java | 6 +- .../jojomod/stand/powers/PowersRatt.java | 8 ++ .../assets/roundabout/lang/en_us.json | 3 + .../jojomod/registry/FabricEntityClient.java | 2 + .../jojomod/registry/ClientForgeEvents.java | 2 + 12 files changed, 238 insertions(+), 5 deletions(-) create mode 100644 common/src/main/java/net/hydra/jojomod/client/models/layers/RattShoulderLayer.java create mode 100644 common/src/main/java/net/hydra/jojomod/client/models/worn_stand/RattShoulderModel.java diff --git a/common/src/main/java/net/hydra/jojomod/client/ModStrayModels.java b/common/src/main/java/net/hydra/jojomod/client/ModStrayModels.java index 97f1d50b8..534ca73bf 100644 --- a/common/src/main/java/net/hydra/jojomod/client/ModStrayModels.java +++ b/common/src/main/java/net/hydra/jojomod/client/ModStrayModels.java @@ -1,9 +1,12 @@ package net.hydra.jojomod.client; +import net.hydra.jojomod.client.models.stand.RattModel; import net.hydra.jojomod.client.models.worn_stand.HeyYaModel; +import net.hydra.jojomod.client.models.worn_stand.RattShoulderModel; import net.hydra.jojomod.client.models.worn_stand.SoftAndWetShootingArmModel; public class ModStrayModels { public static SoftAndWetShootingArmModel SHOOTING_ARM; public static HeyYaModel HEY_YA; + public static RattShoulderModel RATT_SHOULDER; } diff --git a/common/src/main/java/net/hydra/jojomod/client/models/layers/RattShoulderLayer.java b/common/src/main/java/net/hydra/jojomod/client/models/layers/RattShoulderLayer.java new file mode 100644 index 000000000..8786c7ab9 --- /dev/null +++ b/common/src/main/java/net/hydra/jojomod/client/models/layers/RattShoulderLayer.java @@ -0,0 +1,92 @@ +package net.hydra.jojomod.client.models.layers; + +import com.google.common.collect.Maps; +import com.mojang.blaze3d.vertex.PoseStack; +import net.hydra.jojomod.Roundabout; +import net.hydra.jojomod.client.ClientUtil; +import net.hydra.jojomod.client.ModStrayModels; +import net.hydra.jojomod.entity.visages.JojoNPC; +import net.hydra.jojomod.event.powers.StandUser; +import net.hydra.jojomod.event.powers.TimeStop; +import net.hydra.jojomod.stand.powers.PowersHeyYa; +import net.hydra.jojomod.stand.powers.PowersRatt; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.LivingEntity; +import org.joml.Quaternionf; + +import java.util.Map; + +public class RattShoulderLayer> extends RenderLayer { + private static final Map ARMOR_LOCATION_CACHE = Maps.newHashMap(); + private final EntityRenderDispatcher dispatcher; + public RattShoulderLayer(EntityRendererProvider.Context context, LivingEntityRenderer livingEntityRenderer) { + super(livingEntityRenderer); + this.dispatcher = context.getEntityRenderDispatcher(); + } + + float scale = 1; + @Override + public void render(PoseStack poseStack, MultiBufferSource bufferSource, int packedLight, T entity, float var5, float var6, float var7, float partialTicks, float var9, float var10) { + if (ClientUtil.canSeeStands(ClientUtil.getPlayer())) { + LivingEntity livent = entity; + if (!entity.isInvisible()) { + if (entity != null) { + if (entity instanceof JojoNPC jnp && jnp.host != null) { + livent = jnp.host; + } + StandUser user = ((StandUser) livent); + int heyTicks = user.roundabout$getRattShoulderVanishTicks(); + boolean hasHeyYaOut = (user.roundabout$getActive() && user.roundabout$getStandPowers() instanceof PowersRatt); + + if (heyTicks > 0 || hasHeyYaOut) { + byte skin = user.roundabout$getStandSkin(); + if (user.roundabout$getLastStandSkin() != skin){ + user.roundabout$setLastStandSkin(skin); + heyTicks = 0; + user.roundabout$setRattShoulderVanishTicks(0); + } + + float heyFull = 0; + float fixedPartial = partialTicks - (int) partialTicks; + if (((TimeStop)entity.level()).CanTimeStopEntity(entity)){ + fixedPartial = 0; + } + if (hasHeyYaOut){ + heyFull = heyTicks+fixedPartial; + heyFull = Math.min(heyFull/10,1f); + } else { + heyFull = heyTicks-fixedPartial; + heyFull = Math.max(heyFull/10,0); + } + poseStack.pushPose(); + + // Translate to the right/left hand + getParentModel().body.translateAndRotate(poseStack); // Use leftArm for off-hand + poseStack.translate(0.37F, -0.4F, 0F); //1 1 + // The first value goes to the right (negative) and left (positive) + // The second value is correlated with up (negative) and down (positive) + // the third is further and closer, positive to head towards back negative for away + // Render your model here + + + poseStack.scale(0.3F,0.3F,0.3F); + boolean isHurt = livent.hurtTime > 0; + float r = isHurt ? 1.0F : 1.0F; + float g = isHurt ? 0.0F : 1.0F; + float b = isHurt ? 0.0F : 1.0F; + ModStrayModels.RATT_SHOULDER.render(livent, partialTicks, poseStack, bufferSource, packedLight, + r, g, b, heyFull, skin); + poseStack.popPose(); + } + } + } + } + } +} + diff --git a/common/src/main/java/net/hydra/jojomod/client/models/stand/RattModel.java b/common/src/main/java/net/hydra/jojomod/client/models/stand/RattModel.java index eb16e558b..64acdea15 100644 --- a/common/src/main/java/net/hydra/jojomod/client/models/stand/RattModel.java +++ b/common/src/main/java/net/hydra/jojomod/client/models/stand/RattModel.java @@ -5,14 +5,25 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; +import net.hydra.jojomod.Roundabout; +import net.hydra.jojomod.client.ClientUtil; +import net.hydra.jojomod.client.models.layers.animations.HeyYaAnimations; import net.hydra.jojomod.client.models.stand.StandModel; import net.hydra.jojomod.entity.stand.JusticeEntity; import net.hydra.jojomod.entity.stand.RattEntity; +import net.hydra.jojomod.event.powers.StandUser; +import net.hydra.jojomod.event.powers.TimeStop; +import net.hydra.jojomod.stand.powers.PowersHeyYa; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.PartPose; import net.minecraft.client.model.geom.builders.*; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.phys.Vec2; import net.minecraft.world.phys.Vec3; @@ -110,7 +121,11 @@ public static LayerDefinition getTexturedModelData() { return LayerDefinition.create(meshdefinition, 64, 64); } - + public static ResourceLocation base = new ResourceLocation(Roundabout.MOD_ID, + "textures/stand/ratt/anime.png"); + public ResourceLocation getTextureLocation(Entity context, byte skin){ + return base; + } @Override public ModelPart root() { diff --git a/common/src/main/java/net/hydra/jojomod/client/models/worn_stand/RattShoulderModel.java b/common/src/main/java/net/hydra/jojomod/client/models/worn_stand/RattShoulderModel.java new file mode 100644 index 000000000..a473beb33 --- /dev/null +++ b/common/src/main/java/net/hydra/jojomod/client/models/worn_stand/RattShoulderModel.java @@ -0,0 +1,83 @@ +package net.hydra.jojomod.client.models.worn_stand; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.hydra.jojomod.Roundabout; +import net.hydra.jojomod.client.ClientUtil; +import net.hydra.jojomod.client.models.PsuedoHierarchicalModel; +import net.hydra.jojomod.client.models.layers.animations.HeyYaAnimations; +import net.hydra.jojomod.client.models.stand.RattModel; +import net.hydra.jojomod.event.powers.StandUser; +import net.hydra.jojomod.event.powers.TimeStop; +import net.hydra.jojomod.stand.powers.PowersHeyYa; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.*; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; + +public class RattShoulderModel extends PsuedoHierarchicalModel { + // This layer location should be baked with EntityRendererProvider.Context in the entity renderer and passed into this model's constructor + private final ModelPart stand; + private final ModelPart Root; + + public RattShoulderModel() { + super(RenderType::entityTranslucent); + + this.Root = createBodyLayer().bakeRoot(); + this.stand = Root.getChild("stand"); + } + + public static LayerDefinition createBodyLayer() { + return RattModel.getTexturedModelData(); + } + @Override + public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + stand.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); + } + + @Override + public ModelPart root() { + return Root; + } + + @Override + public void setupAnim(Entity var1, float pAgeInTicks) { + + } + public static ResourceLocation base = new ResourceLocation(Roundabout.MOD_ID, + "textures/stand/ratt/anime.png"); + + public ResourceLocation getTextureLocation(Entity context, byte skin){ + switch (skin) + { + default -> {return base;} + } + } + + + public void render(Entity context, PoseStack poseStack, MultiBufferSource bufferSource, int light) { + VertexConsumer consumer = bufferSource.getBuffer(RenderType.entityCutoutNoCull(getTextureLocation(context, (byte)0))); + root().render(poseStack, consumer, light, OverlayTexture.NO_OVERLAY); + } + public void render(Entity context, float partialTicks, PoseStack poseStack, MultiBufferSource bufferSource, + int light, float r, float g, float b, float alpha, byte skin) { + if (context instanceof LivingEntity LE) { + this.root().getAllParts().forEach(ModelPart::resetPose); + if (((TimeStop)context.level()).CanTimeStopEntity(context) || ClientUtil.checkIfGamePaused()){ + partialTicks = 0; + } + StandUser user = ((StandUser) LE); + VertexConsumer consumer = bufferSource.getBuffer(RenderType.entityTranslucent(getTextureLocation(context, skin))); + + root().render(poseStack, consumer, light, OverlayTexture.NO_OVERLAY, r, g, b, alpha); + } + } + +} + diff --git a/common/src/main/java/net/hydra/jojomod/event/powers/StandUser.java b/common/src/main/java/net/hydra/jojomod/event/powers/StandUser.java index 847bfb8f3..7581ea4af 100644 --- a/common/src/main/java/net/hydra/jojomod/event/powers/StandUser.java +++ b/common/src/main/java/net/hydra/jojomod/event/powers/StandUser.java @@ -90,6 +90,8 @@ public interface StandUser { AnimationState roundabout$getHeyYaAnimation2(); int roundabout$getHeyYaVanishTicks(); void roundabout$setHeyYaVanishTicks(int set); + int roundabout$getRattShoulderVanishTicks(); + void roundabout$setRattShoulderVanishTicks(int set); boolean roundabout$getActive(); boolean roundabout$getMainhandOverride(); diff --git a/common/src/main/java/net/hydra/jojomod/mixin/StandUserEntity.java b/common/src/main/java/net/hydra/jojomod/mixin/StandUserEntity.java index ac7fa17f5..de4f4bbec 100644 --- a/common/src/main/java/net/hydra/jojomod/mixin/StandUserEntity.java +++ b/common/src/main/java/net/hydra/jojomod/mixin/StandUserEntity.java @@ -27,6 +27,7 @@ import net.hydra.jojomod.networking.ModPacketHandler; import net.hydra.jojomod.sound.ModSounds; import net.hydra.jojomod.stand.powers.PowersHeyYa; +import net.hydra.jojomod.stand.powers.PowersRatt; import net.hydra.jojomod.util.MainUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.BlockParticleOption; @@ -1772,6 +1773,22 @@ public float roundaboutGetMaxStoredDamage(){ roundabout$heyYaVanishTicks = Mth.clamp(set,0,10); } + @Unique + public int roundabout$RattShoulderVanishTicks = 0; + + @Unique + @Override + public int roundabout$getRattShoulderVanishTicks(){ + return roundabout$RattShoulderVanishTicks; + } + @Unique + @Override + public void roundabout$setRattShoulderVanishTicks(int set){ + roundabout$RattShoulderVanishTicks = Mth.clamp(set,0,10); + } + + + @Unique public AnimationState roundabout$heyYaAnimation2 = new AnimationState(); @@ -3334,6 +3351,12 @@ protected int decreaseAirSupply(int $$0) { } else { roundabout$setHeyYaVanishTicks(roundabout$getHeyYaVanishTicks()-1); } + /** RattShoulder fade ticks*/ + if (roundabout$getActive() && roundabout$getStandPowers() instanceof PowersRatt){ + roundabout$setRattShoulderVanishTicks(roundabout$getRattShoulderVanishTicks()+1); + } else { + roundabout$setRattShoulderVanishTicks(roundabout$getRattShoulderVanishTicks()-1); + } /**Soft and Wet Bubble Encase launch*/ diff --git a/common/src/main/java/net/hydra/jojomod/mixin/ZHumanoidMobRenderer.java b/common/src/main/java/net/hydra/jojomod/mixin/ZHumanoidMobRenderer.java index c92d2ab88..40c55b4ef 100644 --- a/common/src/main/java/net/hydra/jojomod/mixin/ZHumanoidMobRenderer.java +++ b/common/src/main/java/net/hydra/jojomod/mixin/ZHumanoidMobRenderer.java @@ -2,6 +2,7 @@ import net.hydra.jojomod.client.FacelessLayer; import net.hydra.jojomod.client.models.layers.HeyYaLayer; +import net.hydra.jojomod.client.models.layers.RattShoulderLayer; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.HumanoidMobRenderer; @@ -22,6 +23,7 @@ public ZHumanoidMobRenderer(EntityRendererProvider.Context $$0, M $$1, float $$2 private void roundabout$renderHumanoidMobRenderer(EntityRendererProvider.Context $$0, HumanoidModel $$1, float $$2, float $$3, float $$4, float $$5, CallbackInfo ci) { this.addLayer(new FacelessLayer<>($$0, this)); this.addLayer(new HeyYaLayer<>($$0, this)); + this.addLayer(new RattShoulderLayer<>($$0, this)); } } diff --git a/common/src/main/java/net/hydra/jojomod/mixin/ZPlayerRender.java b/common/src/main/java/net/hydra/jojomod/mixin/ZPlayerRender.java index 6155927b8..34d79a612 100644 --- a/common/src/main/java/net/hydra/jojomod/mixin/ZPlayerRender.java +++ b/common/src/main/java/net/hydra/jojomod/mixin/ZPlayerRender.java @@ -4,14 +4,11 @@ import net.hydra.jojomod.Roundabout; import net.hydra.jojomod.access.*; import net.hydra.jojomod.client.*; -import net.hydra.jojomod.client.models.layers.HeyYaLayer; -import net.hydra.jojomod.client.models.layers.ShootingArmLayer; +import net.hydra.jojomod.client.models.layers.*; import net.hydra.jojomod.client.models.layers.visages.VisagePartLayer; import net.hydra.jojomod.client.models.visages.OVAEnyaModel; import net.hydra.jojomod.client.models.visages.renderers.OVAEnyaRenderer; import net.hydra.jojomod.entity.ModEntities; -import net.hydra.jojomod.client.models.layers.StoneLayer; -import net.hydra.jojomod.client.models.layers.KnifeLayer; import net.hydra.jojomod.entity.visages.JojoNPC; import net.hydra.jojomod.client.models.visages.PlayerLikeModel; import net.hydra.jojomod.client.models.visages.renderers.PlayerLikeRenderer; @@ -78,6 +75,7 @@ private void roundaboutRenderKnives(EntityRendererProvider.Context $$0, boolean this.addLayer(new FacelessLayer<>($$0, this)); this.addLayer(new ShootingArmLayer<>($$0, this)); this.addLayer(new HeyYaLayer<>($$0, this)); + this.addLayer(new RattShoulderLayer<>($$0, this)); this.addLayer(new VisagePartLayer<>($$0, this)); /**Access to slim and not slim models simultaneously*/ roundabout$otherModel = new PlayerModel<>($$0.bakeLayer($$1 ? ModelLayers.PLAYER : ModelLayers.PLAYER_SLIM), $$1); diff --git a/common/src/main/java/net/hydra/jojomod/stand/powers/PowersRatt.java b/common/src/main/java/net/hydra/jojomod/stand/powers/PowersRatt.java index a7f63a0d1..ff17932cd 100644 --- a/common/src/main/java/net/hydra/jojomod/stand/powers/PowersRatt.java +++ b/common/src/main/java/net/hydra/jojomod/stand/powers/PowersRatt.java @@ -232,6 +232,14 @@ public void updateUniqueMoves() { + public Component getPosName(byte posID) { + if (posID == 1) { + return Component.translatable("idle.roundabout.ratt_1"); + } else { + return Component.translatable("idle.roundabout.ratt_2"); + } + } + @Override public boolean isWip(){ return true; diff --git a/common/src/main/resources/assets/roundabout/lang/en_us.json b/common/src/main/resources/assets/roundabout/lang/en_us.json index d4f9b6a3e..f3b04218d 100644 --- a/common/src/main/resources/assets/roundabout/lang/en_us.json +++ b/common/src/main/resources/assets/roundabout/lang/en_us.json @@ -835,6 +835,9 @@ "idle.roundabout.hey_ya_1": "Forward", "idle.roundabout.hey_ya_2": "Facing", + "idle.roundabout.ratt_1": "Head", + "idle.roundabout.ratt_2": "Shoulder", + "skins.roundabout.star_platinum.base": "Part 3", "skins.roundabout.star_platinum.manga": "Manga", "skins.roundabout.star_platinum.manga_purple": "Manga Purple", diff --git a/fabric/src/main/java/net/hydra/jojomod/registry/FabricEntityClient.java b/fabric/src/main/java/net/hydra/jojomod/registry/FabricEntityClient.java index 882e06d5f..2e96dc0f8 100644 --- a/fabric/src/main/java/net/hydra/jojomod/registry/FabricEntityClient.java +++ b/fabric/src/main/java/net/hydra/jojomod/registry/FabricEntityClient.java @@ -12,6 +12,7 @@ import net.hydra.jojomod.client.models.visages.*; import net.hydra.jojomod.client.models.visages.renderers.*; import net.hydra.jojomod.client.models.worn_stand.HeyYaModel; +import net.hydra.jojomod.client.models.worn_stand.RattShoulderModel; import net.hydra.jojomod.client.models.worn_stand.SoftAndWetShootingArmModel; import net.hydra.jojomod.client.models.substand.renderers.D4CCloneRenderer; import net.hydra.jojomod.client.models.substand.renderers.FogCloneRenderer; @@ -155,5 +156,6 @@ public static void register() { ModStrayModels.SHOOTING_ARM = new SoftAndWetShootingArmModel(); ModStrayModels.HEY_YA = new HeyYaModel(); + ModStrayModels.RATT_SHOULDER = new RattShoulderModel(); } } \ No newline at end of file diff --git a/forge/src/main/java/net/hydra/jojomod/registry/ClientForgeEvents.java b/forge/src/main/java/net/hydra/jojomod/registry/ClientForgeEvents.java index 64db09687..c8a3a3f91 100644 --- a/forge/src/main/java/net/hydra/jojomod/registry/ClientForgeEvents.java +++ b/forge/src/main/java/net/hydra/jojomod/registry/ClientForgeEvents.java @@ -16,6 +16,7 @@ import net.hydra.jojomod.client.models.visages.*; import net.hydra.jojomod.client.models.visages.renderers.*; import net.hydra.jojomod.client.models.worn_stand.HeyYaModel; +import net.hydra.jojomod.client.models.worn_stand.RattShoulderModel; import net.hydra.jojomod.client.models.worn_stand.SoftAndWetShootingArmModel; import net.hydra.jojomod.client.models.substand.renderers.D4CCloneRenderer; import net.hydra.jojomod.client.models.substand.renderers.FogCloneRenderer; @@ -161,6 +162,7 @@ public static void registerLayerDefinitions(EntityRenderersEvent.RegisterLayerDe event.registerLayerDefinition(ModEntityRendererClient.RATT_LAYER, RattModel::getTexturedModelData); ModStrayModels.SHOOTING_ARM = new SoftAndWetShootingArmModel(); ModStrayModels.HEY_YA = new HeyYaModel(); + ModStrayModels.RATT_SHOULDER = new RattShoulderModel(); //BlockEntityRenderers.register(ModBlocks.STAND_FIRE_BLOCK_ENTITY, StandFireRenderer::new); } @SubscribeEvent From f0694a7259dfb6ba4f9df12c0498ec78967db995 Mon Sep 17 00:00:00 2001 From: Prisma Date: Thu, 26 Jun 2025 23:04:40 -0700 Subject: [PATCH 4/6] Shoulder Ratt and Ratt Scope tweaks --- .../models/layers/RattShoulderLayer.java | 86 ++++++++++++++--- .../jojomod/entity/stand/RattEntity.java | 2 - .../hydra/jojomod/mixin/ZPlayerRender.java | 11 ++- .../jojomod/stand/powers/PowersRatt.java | 93 +++++++------------ 4 files changed, 113 insertions(+), 79 deletions(-) diff --git a/common/src/main/java/net/hydra/jojomod/client/models/layers/RattShoulderLayer.java b/common/src/main/java/net/hydra/jojomod/client/models/layers/RattShoulderLayer.java index 8786c7ab9..1d1d6da51 100644 --- a/common/src/main/java/net/hydra/jojomod/client/models/layers/RattShoulderLayer.java +++ b/common/src/main/java/net/hydra/jojomod/client/models/layers/RattShoulderLayer.java @@ -3,11 +3,14 @@ import com.google.common.collect.Maps; import com.mojang.blaze3d.vertex.PoseStack; import net.hydra.jojomod.Roundabout; +import net.hydra.jojomod.access.IPlayerEntity; import net.hydra.jojomod.client.ClientUtil; import net.hydra.jojomod.client.ModStrayModels; import net.hydra.jojomod.entity.visages.JojoNPC; import net.hydra.jojomod.event.powers.StandUser; import net.hydra.jojomod.event.powers.TimeStop; +import net.hydra.jojomod.item.MaskItem; +import net.hydra.jojomod.mixin.PlayerEntity; import net.hydra.jojomod.stand.powers.PowersHeyYa; import net.hydra.jojomod.stand.powers.PowersRatt; import net.minecraft.client.model.HumanoidModel; @@ -17,8 +20,13 @@ import net.minecraft.client.renderer.entity.LivingEntityRenderer; import net.minecraft.client.renderer.entity.layers.RenderLayer; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import org.joml.Quaternionf; +import org.joml.Vector3f; import java.util.Map; @@ -43,7 +51,7 @@ public void render(PoseStack poseStack, MultiBufferSource bufferSource, int pack StandUser user = ((StandUser) livent); int heyTicks = user.roundabout$getRattShoulderVanishTicks(); boolean hasHeyYaOut = (user.roundabout$getActive() && user.roundabout$getStandPowers() instanceof PowersRatt); - + /* all of this code is copied from hey ya! */ if (heyTicks > 0 || hasHeyYaOut) { byte skin = user.roundabout$getStandSkin(); if (user.roundabout$getLastStandSkin() != skin){ @@ -66,27 +74,75 @@ public void render(PoseStack poseStack, MultiBufferSource bufferSource, int pack } poseStack.pushPose(); - // Translate to the right/left hand - getParentModel().body.translateAndRotate(poseStack); // Use leftArm for off-hand - poseStack.translate(0.37F, -0.4F, 0F); //1 1 + if (hasHeyYaOut) { + /* idlePos == 0 is shoulder, 1 is head */ + if (((PowersRatt) user.roundabout$getStandPowers()).scopeLevel != 0) { + getParentModel().rightArm.translateAndRotate(poseStack); + poseStack.scale(0.35F, 0.35F, 0.35F); + poseStack.rotateAround(new Quaternionf().fromAxisAngleDeg(new Vector3f(1, 0, 0), -90), 0, 0, -1); + poseStack.translate(0.35F, -1.3F, 0.6F); + // poseStack.translate(0.3F, 0F, -3F); + } else { + if (user.roundabout$getIdlePos() == 0) { + getParentModel().body.translateAndRotate(poseStack); + poseStack.translate(0.35F, -0.4F, 0F); + /* additional check for armor, cancels the check if you have a visage */ + boolean bl1 = false; + if (user instanceof Player) { + ItemStack chestplate = ((Player) user).getInventory().getArmor(2); + String name = chestplate.getItem().toString(); + if (!name.equals("air") && !getUserVisage(((Entity) user))) { + poseStack.translate(0.0F, -0.1F, 0.0F); + bl1 = true; + } + } + if (!bl1) { + poseStack.translate(0.05F, 0.05F, 0.0F); + poseStack.rotateAround(new Quaternionf().fromAxisAngleDeg(new Vector3f(0, 0, 1), 10), 0, 0, 0); + } + } else { + getParentModel().head.translateAndRotate(poseStack); + poseStack.translate(0F, -0.9F, 0F); + /* additional check for armor, cancels the check if you have a visage */ + if (user instanceof Player) { + ItemStack chestplate = ((Player) user).getInventory().getArmor(3); + String name = chestplate.getItem().toString(); + if (!name.equals("air") && !getUserVisage(((Entity) user))) { + poseStack.translate(0.0F, -0.1F, 0.0F); + } + } + } + poseStack.scale(0.3F, 0.3F, 0.3F); + } // The first value goes to the right (negative) and left (positive) // The second value is correlated with up (negative) and down (positive) - // the third is further and closer, positive to head towards back negative for away - // Render your model here + // the third is further and closer, positive is back negative is forward + } + boolean isHurt = livent.hurtTime > 0; + float r = isHurt ? 1.0F : 1.0F; + float g = isHurt ? 0.0F : 1.0F; + float b = isHurt ? 0.0F : 1.0F; + ModStrayModels.RATT_SHOULDER.render(livent, partialTicks, poseStack, bufferSource, packedLight, + r, g, b, heyFull, skin); + poseStack.popPose(); - poseStack.scale(0.3F,0.3F,0.3F); - boolean isHurt = livent.hurtTime > 0; - float r = isHurt ? 1.0F : 1.0F; - float g = isHurt ? 0.0F : 1.0F; - float b = isHurt ? 0.0F : 1.0F; - ModStrayModels.RATT_SHOULDER.render(livent, partialTicks, poseStack, bufferSource, packedLight, - r, g, b, heyFull, skin); - poseStack.popPose(); } } } } } -} + public boolean getUserVisage(Entity entity) { + if (entity instanceof Player play) { + IPlayerEntity pl = ((IPlayerEntity) play); + ItemStack visage = pl.roundabout$getMaskSlot(); + if (visage != null && !visage.isEmpty()) { + if (visage.getItem() instanceof MaskItem MI) { + return true; + } + } + } + return false; + } +} diff --git a/common/src/main/java/net/hydra/jojomod/entity/stand/RattEntity.java b/common/src/main/java/net/hydra/jojomod/entity/stand/RattEntity.java index fdfdc9b06..bf7ea9f2f 100644 --- a/common/src/main/java/net/hydra/jojomod/entity/stand/RattEntity.java +++ b/common/src/main/java/net/hydra/jojomod/entity/stand/RattEntity.java @@ -51,8 +51,6 @@ public void setPlacement(Vec3 placement) { */ - - @Override public void tick() { super.tick(); diff --git a/common/src/main/java/net/hydra/jojomod/mixin/ZPlayerRender.java b/common/src/main/java/net/hydra/jojomod/mixin/ZPlayerRender.java index 34d79a612..b75e46893 100644 --- a/common/src/main/java/net/hydra/jojomod/mixin/ZPlayerRender.java +++ b/common/src/main/java/net/hydra/jojomod/mixin/ZPlayerRender.java @@ -22,6 +22,7 @@ import net.hydra.jojomod.event.powers.visagedata.VisageData; import net.hydra.jojomod.item.MaskItem; import net.hydra.jojomod.item.ModItems; +import net.hydra.jojomod.stand.powers.PowersRatt; import net.minecraft.client.Minecraft; import net.minecraft.client.model.*; import net.minecraft.client.model.geom.ModelLayers; @@ -127,10 +128,18 @@ private void setModelProperties(AbstractClientPlayer $$0) { setModelProperties($$0); } - @Inject(method = "getArmPose", at = @At(value = "HEAD")) + @Inject(method = "getArmPose", at = @At(value = "HEAD"),cancellable = true) private static void roundabout$GetArmPose(AbstractClientPlayer $$0, InteractionHand $$1, CallbackInfoReturnable ci) { ACP = $$0; IH = $$1; + // ratt scope spyglass hand position + if ($$1.equals(InteractionHand.MAIN_HAND)) { + if (((StandUser) (Player) $$0).roundabout$getStandPowers() instanceof PowersRatt) { + if (((StandUser) (Player) $$0).roundabout$getStandPowers().scopeLevel != 0) { + ci.setReturnValue(HumanoidModel.ArmPose.SPYGLASS); + } + } + } } @ModifyVariable(method = "getArmPose", at = @At(value = "STORE"),ordinal = 0) private static ItemStack roundabout$GetArmPose2(ItemStack $$0) { diff --git a/common/src/main/java/net/hydra/jojomod/stand/powers/PowersRatt.java b/common/src/main/java/net/hydra/jojomod/stand/powers/PowersRatt.java index ff17932cd..28c03c083 100644 --- a/common/src/main/java/net/hydra/jojomod/stand/powers/PowersRatt.java +++ b/common/src/main/java/net/hydra/jojomod/stand/powers/PowersRatt.java @@ -48,15 +48,14 @@ public StandPowers generateStandPowers(LivingEntity entity) { public static float DormantRange = 12.5F; - - public boolean isRattState(int state) { - StandEntity re = getStandEntity(this.self); - if (re != null) { - return ((RattEntity) re).MotionState == state; - } - return false; - } - + public byte RATT_STATE; + public static final byte + SHOULDER = 0, + MOVING = 1, + PLACED = 2; + public byte getRattState() {return RATT_STATE;} + public void setRattState(byte i) {RATT_STATE = i;} + public boolean isRattState(byte i) {return RATT_STATE == i;} private BlockHitResult getValidPlacement(){ Vec3 vec3d = this.getSelf().getEyePosition(0); @@ -71,6 +70,7 @@ private BlockHitResult getValidPlacement(){ } + @Override public boolean canSummonStandAsEntity() {return false;} @@ -81,34 +81,27 @@ private BlockHitResult getValidPlacement(){ public void renderIcons(GuiGraphics context, int x, int y) { ClientUtil.fx.roundabout$onGUI(context); - RattEntity RE = ((RattEntity) getStandEntity(this.self) ); - - if (isRattState(0)) { - - ResourceLocation ScopeIcon = StandIcons.STAR_PLATINUM_SCOPE; - if (scopeLevel == 1) { - ScopeIcon = StandIcons.STAR_PLATINUM_SCOPE_1; + switch(getRattState()) { + case SHOULDER -> { + ResourceLocation ScopeIcon = StandIcons.STAR_PLATINUM_SCOPE; + if (scopeLevel == 1) { + ScopeIcon = StandIcons.STAR_PLATINUM_SCOPE_1; + } + if (scopeLevel == 2) { + ScopeIcon = StandIcons.STAR_PLATINUM_SCOPE_2; + } + setSkillIcon(context, x, y, 1, ScopeIcon, PowerIndex.SKILL_1); + setSkillIcon(context,x,y,2,StandIcons.JUSTICE_PILOT,PowerIndex.SKILL_2); + } + case MOVING -> { + setSkillIcon(context,x,y,2,StandIcons.JUSTICE_PILOT_EXIT,PowerIndex.SKILL_2); } - if (scopeLevel == 2) { - ScopeIcon = StandIcons.STAR_PLATINUM_SCOPE_2; + case PLACED -> { + setSkillIcon(context,x,y,2,StandIcons.JUSTICE_PILOT_EXIT,PowerIndex.SKILL_2); } - setSkillIcon(context, x, y, 1, ScopeIcon, PowerIndex.SKILL_1); - - setSkillIcon(context, x, y, 2, StandIcons.JUSTICE_PILOT, PowerIndex.SKILL_2); - } else if (isRattState(1)) { - setSkillIcon(context, x, y, 1, StandIcons.NONE, PowerIndex.SKILL_1); - setSkillIcon(context, x, y, 2, StandIcons.NONE, PowerIndex.SKILL_2); - } else if (isRattState(2)) { - setSkillIcon(context, x, y, 1, StandIcons.NONE, PowerIndex.SKILL_1); - setSkillIcon(context, x, y, 2, StandIcons.JUSTICE_PILOT_EXIT, PowerIndex.SKILL_2); - } else if (isRattState(3)) { - // nothing yet, will have piloting } + setSkillIcon(context,x,y,2,StandIcons.DODGE,PowerIndex.GLOBAL_DASH); - if (!isRattState(3)) { - setSkillIcon(context, x, y, 3, StandIcons.DODGE, PowerIndex.GLOBAL_DASH); - } - super.renderIcons(context, x, y); } @Override @@ -122,15 +115,15 @@ public void powerActivate(PowerContext context) { switch (context) { case SKILL_1_NORMAL -> { - if (isRattState(0)) { + if (isRattState(SHOULDER)) { RattScope(); } } case SKILL_2_NORMAL -> { - if (isRattState(0) ) { - Deploy(); + if (isRattState(SHOULDER) ) { + Roundabout.LOGGER.info("Deploy"); } else { - Recall(); + Roundabout.LOGGER.info("Recall"); } } @@ -140,28 +133,6 @@ public void powerActivate(PowerContext context) { } } - public void Deploy() { - RattEntity RE = ((RattEntity) getStandEntity(this.self) ); - Vec3 p = this.getRayBlock(RE.getUser(),PlacementRange); - - if (RE != null) { - if (getValidPlacement() != null) { - RE.setPlacement(p); - RE.setMotionState(1); - /* highlight Ratt for user ? */ - } - } - } - - public void Recall() { - RattEntity RE = ((RattEntity) getStandEntity(this.self)); - if (RE != null) { - RE.setPlacement(null); - RE.setMotionState(1); - } - this.setCooldown(PowerIndex.SKILL_2, 100); - } - public void RattScope() { /* will eventually add some sort of scope effect */ int nl = scopeLevel + 1; @@ -186,7 +157,7 @@ public boolean tryPower(int move, boolean forced) { public boolean isAttackIneptVisually(byte activeP, int slot) { switch (activeP) { case PowerIndex.SKILL_2 -> { - return getValidPlacement() == null && isRattState(0); + return getValidPlacement() == null && isRattState(SHOULDER); } } return super.isAttackIneptVisually(activeP, slot); @@ -203,7 +174,7 @@ public void tickPower() { @Override public boolean canScope() { - return true; + return getStandUserSelf().roundabout$getActive(); } @Override From 5977c137fe26426a5cb2fe9875f04fdc0ab6551e Mon Sep 17 00:00:00 2001 From: Prisma Date: Sat, 28 Jun 2025 22:57:25 -0700 Subject: [PATCH 5/6] Ratt Placement and trying to make sounds --- .../models/layers/RattShoulderLayer.java | 6 +- .../jojomod/entity/stand/RattEntity.java | 100 +++++------- .../hydra/jojomod/mixin/StandUserEntity.java | 6 +- .../net/hydra/jojomod/sound/ModSounds.java | 5 + .../jojomod/stand/powers/PowersRatt.java | 154 ++++++++++++------ .../assets/roundabout/lang/en_us.json | 3 + .../assets/roundabout/sounds/ratt_scope.ogg | Bin 0 -> 8114 bytes .../assets/roundabout/sounds/ratt_summon.ogg | Bin 0 -> 21461 bytes .../hydra/jojomod/registry/FabricSounds.java | 2 + .../hydra/jojomod/registry/ForgeSounds.java | 3 +- 10 files changed, 165 insertions(+), 114 deletions(-) create mode 100644 common/src/main/resources/assets/roundabout/sounds/ratt_scope.ogg create mode 100644 common/src/main/resources/assets/roundabout/sounds/ratt_summon.ogg diff --git a/common/src/main/java/net/hydra/jojomod/client/models/layers/RattShoulderLayer.java b/common/src/main/java/net/hydra/jojomod/client/models/layers/RattShoulderLayer.java index 1d1d6da51..4b25336bd 100644 --- a/common/src/main/java/net/hydra/jojomod/client/models/layers/RattShoulderLayer.java +++ b/common/src/main/java/net/hydra/jojomod/client/models/layers/RattShoulderLayer.java @@ -123,8 +123,10 @@ public void render(PoseStack poseStack, MultiBufferSource bufferSource, int pack float r = isHurt ? 1.0F : 1.0F; float g = isHurt ? 0.0F : 1.0F; float b = isHurt ? 0.0F : 1.0F; - ModStrayModels.RATT_SHOULDER.render(livent, partialTicks, poseStack, bufferSource, packedLight, - r, g, b, heyFull, skin); + if (user.roundabout$getRattShoulderVanishTicks() != 0) { + ModStrayModels.RATT_SHOULDER.render(livent, partialTicks, poseStack, bufferSource, packedLight, + r, g, b, heyFull, skin); + } poseStack.popPose(); } diff --git a/common/src/main/java/net/hydra/jojomod/entity/stand/RattEntity.java b/common/src/main/java/net/hydra/jojomod/entity/stand/RattEntity.java index bf7ea9f2f..aa63a369c 100644 --- a/common/src/main/java/net/hydra/jojomod/entity/stand/RattEntity.java +++ b/common/src/main/java/net/hydra/jojomod/entity/stand/RattEntity.java @@ -3,6 +3,8 @@ import net.hydra.jojomod.Roundabout; import net.hydra.jojomod.client.StandIcons; import net.hydra.jojomod.event.index.OffsetIndex; +import net.hydra.jojomod.event.index.PowerIndex; +import net.hydra.jojomod.event.powers.StandPowers; import net.hydra.jojomod.event.powers.StandUser; import net.hydra.jojomod.mixin.StandUserEntity; import net.hydra.jojomod.stand.powers.PowersRatt; @@ -29,78 +31,62 @@ public static Component getSkinNameT(byte skinId){ return Component.translatable("skins.roundabout.ratt.anime"); } - - public float DormantTime = 0; - public static float MaxDormantTime = 30; - - public Vec3 Placement; - public void setPlacement(Vec3 placement) { - Placement = placement; - } - - public int MotionState = 0; - public double MovementDelta = 0.0; - - public void setMotionState(int motionState) {MotionState = motionState;} - public int getMotionState() {return MotionState;} - /* - 0 = hovering - 1 = deployed - 2 = placed - 3 = piloted - - */ + public byte MotionState = PowersRatt.SHOULDER; + public Vec3 Placement = null; @Override public void tick() { - super.tick(); - switch(MotionState) { - case 0 -> { - this.setOffsetType(OffsetIndex.FOLLOW); - } - case 1 -> { - this.setOffsetType(OffsetIndex.LOOSE); - - Vec3 loc = Placement; - if (loc == null) {loc = this.getStandOffsetVector(this.getUser());} - setPos(getPosition(0).lerp(loc,MovementDelta)); - MovementDelta += (double) 1/60; + switch (MotionState) { + case PowersRatt.SHOULDER -> { + // I'm going to either not summon RattEntity or just send him to the shadow realm (0,-1000,0) + UpdateState(OffsetIndex.FOLLOW); + } - if (getPosition(0).distanceTo(loc) <= 0.2 ) { - if (loc == Placement) {setMotionState(2);} else {setMotionState(0);} - MovementDelta = 0; + case PowersRatt.MOVING -> { + UpdateState(OffsetIndex.LOOSE); + Vec3 target = getStandOffsetVector(getUser()); + if (Placement != null) { + target = Placement; } + UpdatePos(target); - } - case 2 -> { - MovementDelta = 0; - this.setOffsetType(OffsetIndex.LOOSE); - if (Placement != null) { - setPos(Placement); - } - this.setStandRotationY(this.getStandRotationY()+1.0F); - double DormantRange = PowersRatt.DormantRange; - double ActiveRange = PowersRatt.ActiveRange; - float dist = (float) this.getUser().getPosition(0).distanceTo(getPosition(0)); - - if ( dist > DormantRange || DormantTime >= MaxDormantTime) { - MovementDelta = 0; - setMotionState(1); - setPlacement(null); - DormantTime = 0; - } else if ( dist > ActiveRange) { - DormantTime += 1; - } + if (getPosition(0).distanceTo(target) < 0.2) { + UpdatePos(target); + if (target == Placement) { + MotionState = PowersRatt.PLACED; + } else { + MotionState = PowersRatt.SHOULDER; + } + } } - + case PowersRatt.PLACED -> { + UpdateState(OffsetIndex.LOOSE); + if (!getPosition(0).equals(Placement)) { + UpdatePos(Placement); + } + } } + super.tick(); + } + public void UpdatePos(Vec3 v) { + if (this.getUser() != null) { + ((StandUser) this.getUser()).roundabout$getStandPowers().tryPosPowerPacket(PowerIndex.POWER_2,v); + } + } + public void UpdateState(byte s) { + if (this.getUser() != null) { + ((StandUser) this.getUser()).roundabout$getStandPowers().tryIntPowerPacket(PowerIndex.POWER_2,(int) s); + } } + + + @Override public void setupAnimationStates() { super.setupAnimationStates(); diff --git a/common/src/main/java/net/hydra/jojomod/mixin/StandUserEntity.java b/common/src/main/java/net/hydra/jojomod/mixin/StandUserEntity.java index de4f4bbec..200a2773f 100644 --- a/common/src/main/java/net/hydra/jojomod/mixin/StandUserEntity.java +++ b/common/src/main/java/net/hydra/jojomod/mixin/StandUserEntity.java @@ -3352,10 +3352,12 @@ protected int decreaseAirSupply(int $$0) { roundabout$setHeyYaVanishTicks(roundabout$getHeyYaVanishTicks()-1); } /** RattShoulder fade ticks*/ - if (roundabout$getActive() && roundabout$getStandPowers() instanceof PowersRatt){ + if (roundabout$getActive() && roundabout$getStandPowers() instanceof PowersRatt && + ((PowersRatt)roundabout$getStandPowers()).isRattState(PowersRatt.SHOULDER) + ){ roundabout$setRattShoulderVanishTicks(roundabout$getRattShoulderVanishTicks()+1); } else { - roundabout$setRattShoulderVanishTicks(roundabout$getRattShoulderVanishTicks()-1); + roundabout$setRattShoulderVanishTicks(0); } diff --git a/common/src/main/java/net/hydra/jojomod/sound/ModSounds.java b/common/src/main/java/net/hydra/jojomod/sound/ModSounds.java index 378416138..49d34304a 100644 --- a/common/src/main/java/net/hydra/jojomod/sound/ModSounds.java +++ b/common/src/main/java/net/hydra/jojomod/sound/ModSounds.java @@ -591,6 +591,11 @@ public class ModSounds { public static final ResourceLocation CINDERELLA_VISAGE_CREATION_ID = new ResourceLocation(Roundabout.MOD_ID+":"+CINDERELLA_VISAGE_CREATION); public static SoundEvent CINDERELLA_VISAGE_CREATION_EVENT = SoundEvent.createVariableRangeEvent(CINDERELLA_VISAGE_CREATION_ID); + public static final String RATT_SUMMON = "ratt_summon"; + public static final ResourceLocation RATT_SUMMON_ID = new ResourceLocation(Roundabout.MOD_ID+":"+RATT_SUMMON); + public static SoundEvent RATT_SUMMON_EVENT = SoundEvent.createVariableRangeEvent(RATT_SUMMON_ID); + + public static final String UNLOCK_SKIN = "unlock_skin"; public static final ResourceLocation UNLOCK_SKIN_ID = new ResourceLocation(Roundabout.MOD_ID+":"+UNLOCK_SKIN); public static SoundEvent UNLOCK_SKIN_EVENT = SoundEvent.createVariableRangeEvent(UNLOCK_SKIN_ID); diff --git a/common/src/main/java/net/hydra/jojomod/stand/powers/PowersRatt.java b/common/src/main/java/net/hydra/jojomod/stand/powers/PowersRatt.java index 28c03c083..a3bf0551e 100644 --- a/common/src/main/java/net/hydra/jojomod/stand/powers/PowersRatt.java +++ b/common/src/main/java/net/hydra/jojomod/stand/powers/PowersRatt.java @@ -4,32 +4,29 @@ import net.hydra.jojomod.client.ClientUtil; import net.hydra.jojomod.client.StandIcons; import net.hydra.jojomod.entity.ModEntities; -import net.hydra.jojomod.entity.stand.D4CEntity; import net.hydra.jojomod.entity.stand.RattEntity; import net.hydra.jojomod.entity.stand.StandEntity; import net.hydra.jojomod.event.index.OffsetIndex; import net.hydra.jojomod.event.index.PowerIndex; +import net.hydra.jojomod.event.index.SoundIndex; import net.hydra.jojomod.event.powers.StandPowers; -import net.hydra.jojomod.mixin.InputEvents; +import net.hydra.jojomod.event.powers.StandUser; import net.hydra.jojomod.sound.ModSounds; import net.minecraft.ChatFormatting; -import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.core.Vec3i; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.Entity; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvent; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.ClipContext; -import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import java.util.Arrays; -import java.util.HashSet; import java.util.List; public class PowersRatt extends NewDashPreset { @@ -37,25 +34,62 @@ public PowersRatt(LivingEntity self) { super(self); } + + @Override public StandPowers generateStandPowers(LivingEntity entity) { return new PowersRatt(entity); } + @Override + public boolean canSummonStandAsEntity() {/* lazy ass code*/return true;} - public static float PlacementRange = 5.0F; - public static float PilotRange = 3.0F; - public static float ActiveRange = 10.0F; - public static float DormantRange = 12.5F; - public byte RATT_STATE; + @Override + public StandEntity getNewStandEntity(){return ModEntities.RATT.create(this.getSelf().level());} + + public static int MaxLerpTime = 25; + public static float PlacementRange = 5.0F; + public static final byte SHOULDER = 0, MOVING = 1, PLACED = 2; - public byte getRattState() {return RATT_STATE;} - public void setRattState(byte i) {RATT_STATE = i;} - public boolean isRattState(byte i) {return RATT_STATE == i;} + + + public byte getRattState() { + RattEntity RE = (RattEntity) getStandUserSelf().roundabout$getStand(); + if (RE != null) { + return RE.MotionState; + } + return -1; + } + public void setRattState(byte b) { + RattEntity RE = (RattEntity) getStandUserSelf().roundabout$getStand(); + if (RE != null) { + RE.MotionState = b; + } + } + public boolean isRattState(byte b) { + RattEntity RE = (RattEntity) getStandUserSelf().roundabout$getStand(); + if (RE != null) { + return RE.MotionState == b; + } + return false; + } + public Vec3 getRattPlacement() { + RattEntity RE = (RattEntity) getStandUserSelf().roundabout$getStand(); + if (RE != null) { + return RE.Placement; + } + return Vec3.ZERO; + } + public void setRattPlacement(Vec3 b) { + RattEntity RE = (RattEntity) getStandUserSelf().roundabout$getStand(); + if (RE != null) { + RE.Placement = b; + } + } private BlockHitResult getValidPlacement(){ Vec3 vec3d = this.getSelf().getEyePosition(0); @@ -71,11 +105,8 @@ private BlockHitResult getValidPlacement(){ - @Override - public boolean canSummonStandAsEntity() {return false;} - @Override - public StandEntity getNewStandEntity(){return ModEntities.RATT.create(this.getSelf().level());} + @Override public void renderIcons(GuiGraphics context, int x, int y) { @@ -100,17 +131,34 @@ public void renderIcons(GuiGraphics context, int x, int y) { setSkillIcon(context,x,y,2,StandIcons.JUSTICE_PILOT_EXIT,PowerIndex.SKILL_2); } } - setSkillIcon(context,x,y,2,StandIcons.DODGE,PowerIndex.GLOBAL_DASH); + setSkillIcon(context,x,y,3,StandIcons.DODGE,PowerIndex.GLOBAL_DASH); } + @Override - public void tick() { + public boolean tryPosPower(int move, boolean forced, Vec3 pos) { + if (move == PowerIndex.POWER_2) { + if (this.getStandEntity(this.getSelf()) != null) { + this.getStandEntity(this.getSelf()).setPos(pos); + } + } + return true; } @Override - public void powerActivate(PowerContext context) { + public boolean tryIntPower(int move, boolean forced, int chargeTime) { + if (move == PowerIndex.POWER_2) { + if (this.getStandEntity(this.getSelf()) != null) { + this.getStandEntity(this.getSelf()).setOffsetType((byte) chargeTime); + } + } + return true; + } + + @Override + public void powerActivate(PowerContext context) { switch (context) { @@ -121,9 +169,11 @@ public void powerActivate(PowerContext context) { } case SKILL_2_NORMAL -> { if (isRattState(SHOULDER) ) { - Roundabout.LOGGER.info("Deploy"); + if (getValidPlacement() != null) { + Deploy(); + } } else { - Roundabout.LOGGER.info("Recall"); + Recall(); } } @@ -145,14 +195,24 @@ public void RattScope() { } - - - - @Override - public boolean tryPower(int move, boolean forced) { - return super.tryPower(move, forced); + public void Deploy() { + RattEntity RE = (RattEntity) this.getStandUserSelf().roundabout$getStand(); + if (RE != null) { + if (getValidPlacement() != null) { + setRattState(MOVING); + setRattPlacement(getValidPlacement().getLocation()); + } + } + } + public void Recall() { + RattEntity RE = (RattEntity) this.getStandUserSelf().roundabout$getStand(); + if (RE != null) { + setRattState(MOVING); + setRattPlacement(null); + } } + @Override public boolean isAttackIneptVisually(byte activeP, int slot) { switch (activeP) { @@ -166,15 +226,11 @@ public boolean isAttackIneptVisually(byte activeP, int slot) { /** if = -1, not melt dodging */ public int meltDodgeTicks = -1; - @Override - public void tickPower() { - super.tickPower(); - } @Override public boolean canScope() { - return getStandUserSelf().roundabout$getActive(); + return getStandUserSelf().roundabout$getActive() && isRattState(SHOULDER); } @Override @@ -184,22 +240,6 @@ public List getSkinList() { ); } - @Override - public boolean setPowerOther(int move, int lastMove) { - - return super.setPowerOther(move, lastMove); - } - - @Override - public void updateIntMove(int in) { - - super.updateIntMove(in); - } - - @Override - public void updateUniqueMoves() { - super.updateUniqueMoves(); - } @@ -211,6 +251,16 @@ public Component getPosName(byte posID) { } } + @Override + protected Byte getSummonSound() {return SoundIndex.SUMMON_SOUND;} + public SoundEvent getSoundFromByte(byte soundChoice){ + byte bt = ((StandUser)this.getSelf()).roundabout$getStandSkin(); + if (soundChoice == SoundIndex.SUMMON_SOUND) { + return ModSounds.RATT_SUMMON_EVENT; + } + return super.getSoundFromByte(soundChoice); + } + @Override public boolean isWip(){ return true; diff --git a/common/src/main/resources/assets/roundabout/lang/en_us.json b/common/src/main/resources/assets/roundabout/lang/en_us.json index f3b04218d..c4d809c8a 100644 --- a/common/src/main/resources/assets/roundabout/lang/en_us.json +++ b/common/src/main/resources/assets/roundabout/lang/en_us.json @@ -505,6 +505,9 @@ "sounds.roundabout.cinderella_fail": "Uh oh", "sounds.roundabout.cinderella_visage_creation": "Mechanical whirl", + "sounds.roundabout.ratt_summon": "Stand Summoned", + + "sounds.roundabout.arcade_impale": "[Arcade Impale]", "sounds.roundabout.arcade_long_ts": "[Stop Time]", "sounds.roundabout.arcade_muda": "[Arcade Muda]", diff --git a/common/src/main/resources/assets/roundabout/sounds/ratt_scope.ogg b/common/src/main/resources/assets/roundabout/sounds/ratt_scope.ogg new file mode 100644 index 0000000000000000000000000000000000000000..97c1f421c189634b7332a9c9649ac198a4ee4eb3 GIT binary patch literal 8114 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 ZL4UcSH9P2xp=>i^49?5U&jhNf{|jS8$4USI literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/roundabout/sounds/ratt_summon.ogg b/common/src/main/resources/assets/roundabout/sounds/ratt_summon.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5a7a2fe52899436a8b8a6ac6441d5b2d392973a9 GIT binary patch literal 21461 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 H>=ytI0M*+s literal 0 HcmV?d00001 diff --git a/fabric/src/main/java/net/hydra/jojomod/registry/FabricSounds.java b/fabric/src/main/java/net/hydra/jojomod/registry/FabricSounds.java index 27c7d9cc7..edd72879d 100644 --- a/fabric/src/main/java/net/hydra/jojomod/registry/FabricSounds.java +++ b/fabric/src/main/java/net/hydra/jojomod/registry/FabricSounds.java @@ -200,6 +200,8 @@ public static void register(){ addSound(ModSounds.CINDERELLA_FAIL_ID, ModSounds.CINDERELLA_FAIL_EVENT); addSound(ModSounds.CINDERELLA_VISAGE_CREATION_ID, ModSounds.CINDERELLA_VISAGE_CREATION_EVENT); + addSound(ModSounds.RATT_SUMMON_ID, ModSounds.RATT_SUMMON_EVENT); + addSound(ModSounds.THE_WORLD_OVER_HEAVEN_ID, ModSounds.THE_WORLD_OVER_HEAVEN_EVENT); addSound(ModSounds.UNLOCK_SKIN_ID, ModSounds.UNLOCK_SKIN_EVENT); diff --git a/forge/src/main/java/net/hydra/jojomod/registry/ForgeSounds.java b/forge/src/main/java/net/hydra/jojomod/registry/ForgeSounds.java index 8dd18cf07..db17d5f7c 100644 --- a/forge/src/main/java/net/hydra/jojomod/registry/ForgeSounds.java +++ b/forge/src/main/java/net/hydra/jojomod/registry/ForgeSounds.java @@ -301,7 +301,8 @@ public class ForgeSounds { register(ModSounds.CINDERELLA_FAIL, ModSounds.CINDERELLA_FAIL_ID); public static final RegistryObject CINDERELLA_VISAGE_CREATION_EVENT = register(ModSounds.CINDERELLA_VISAGE_CREATION, ModSounds.CINDERELLA_VISAGE_CREATION_ID); - + public static final RegistryObject RATT_SUMMON = + register(ModSounds.RATT_SUMMON, ModSounds.RATT_SUMMON_ID); public static final RegistryObject THE_WORLD_OVER_HEAVEN_EVENT = register(ModSounds.THE_WORLD_OVER_HEAVEN, ModSounds.THE_WORLD_OVER_HEAVEN_ID); From 2d6f1b8b015ad209733b0d6e77a7a68051c37954 Mon Sep 17 00:00:00 2001 From: Prisma Date: Thu, 3 Jul 2025 22:21:53 -0700 Subject: [PATCH 6/6] Ratt Work --- .../net/hydra/jojomod/client/ClientUtil.java | 11 +++ .../net/hydra/jojomod/client/StandIcons.java | 2 + .../client/models/stand/RattModel.java | 72 ++++++++------- .../jojomod/entity/stand/RattEntity.java | 26 ++++-- .../net/hydra/jojomod/mixin/HudRendering.java | 8 ++ .../net/hydra/jojomod/mixin/InputEvents.java | 8 ++ .../hydra/jojomod/mixin/ZItemInHandLayer.java | 9 +- .../jojomod/mixin/ZItemInHandRenderer.java | 7 ++ .../net/hydra/jojomod/sound/ModSounds.java | 5 -- .../jojomod/stand/powers/PowersRatt.java | 82 ++++++++++++------ .../roundabout/models/item/max_ratt_disc.json | 2 +- .../roundabout/models/item/ratt_disc.json | 2 +- .../textures/item/max_ratt_disc.png | Bin 0 -> 317 bytes .../roundabout/textures/item/ratt_disc.png | Bin 0 -> 320 bytes .../roundabout/textures/misc/ratt_scope.png | Bin 0 -> 26512 bytes .../roundabout/textures/stand/ratt/anime.png | Bin 2012 -> 2011 bytes .../hydra/jojomod/registry/FabricItems.java | 2 + .../hydra/jojomod/registry/FabricSounds.java | 1 - .../hydra/jojomod/registry/ForgeSounds.java | 3 +- 19 files changed, 165 insertions(+), 75 deletions(-) create mode 100644 common/src/main/resources/assets/roundabout/textures/item/max_ratt_disc.png create mode 100644 common/src/main/resources/assets/roundabout/textures/item/ratt_disc.png create mode 100644 common/src/main/resources/assets/roundabout/textures/misc/ratt_scope.png diff --git a/common/src/main/java/net/hydra/jojomod/client/ClientUtil.java b/common/src/main/java/net/hydra/jojomod/client/ClientUtil.java index c9f409aef..b9f1cb80a 100644 --- a/common/src/main/java/net/hydra/jojomod/client/ClientUtil.java +++ b/common/src/main/java/net/hydra/jojomod/client/ClientUtil.java @@ -7,6 +7,8 @@ import net.hydra.jojomod.access.IPermaCasting; import net.hydra.jojomod.access.IPlayerEntity; import net.hydra.jojomod.client.gui.*; +import net.hydra.jojomod.entity.stand.RattEntity; +import net.hydra.jojomod.mixin.StandUserEntity; import net.zetalasis.client.shader.D4CShaderFX; import net.zetalasis.client.shader.callback.RenderCallbackRegistry; import net.hydra.jojomod.entity.D4CCloneEntity; @@ -167,6 +169,15 @@ public static int getOutlineColor(Entity entity) { if (player != null) { StandUser standComp = ((StandUser) player); StandPowers powers = standComp.roundabout$getStandPowers(); + if (entity instanceof RattEntity) { + if (((StandEntity) entity).getUser() != null) { + if (((StandEntity) entity).getUser().isCrouching()) { + return 12978493; + } + } + } + + if (powers.getGoBeyondTarget() != null && powers.getGoBeyondTarget().is(entity)) { return 10978493; } else if (powers.isPiloting()) { diff --git a/common/src/main/java/net/hydra/jojomod/client/StandIcons.java b/common/src/main/java/net/hydra/jojomod/client/StandIcons.java index a37327073..39af52421 100644 --- a/common/src/main/java/net/hydra/jojomod/client/StandIcons.java +++ b/common/src/main/java/net/hydra/jojomod/client/StandIcons.java @@ -26,6 +26,8 @@ public class StandIcons { public static final ResourceLocation IN_BUBBLE_OVERLAY = new ResourceLocation(Roundabout.MOD_ID, "textures/misc/in_bubble.png"); + public static final ResourceLocation RATT_SCOPE_OVERLAY = new ResourceLocation(Roundabout.MOD_ID, + "textures/misc/ratt_scope.png"); public static final ResourceLocation NO_FACE_LAYER = new ResourceLocation(Roundabout.MOD_ID, "textures/entity/other_layers/faceless.png"); public static final ResourceLocation STONE_HEAD_OVERLAY = new ResourceLocation(Roundabout.MOD_ID, diff --git a/common/src/main/java/net/hydra/jojomod/client/models/stand/RattModel.java b/common/src/main/java/net/hydra/jojomod/client/models/stand/RattModel.java index 64acdea15..4eef9db3c 100644 --- a/common/src/main/java/net/hydra/jojomod/client/models/stand/RattModel.java +++ b/common/src/main/java/net/hydra/jojomod/client/models/stand/RattModel.java @@ -31,7 +31,7 @@ public class RattModel extends StandModel { // This layer location should be baked with EntityRendererProvider.Context in the entity renderer and passed into this model's constructor // public static final ModelLayerLocation LAYER_LOCATION = new ModelLayerLocation(new ResourceLocation("modid", "ratt"), "main"); private final ModelPart stand; - private final ModelPart Rotating; + private final ModelPart head; private final ModelPart Neck; private final ModelPart Jaw; private final ModelPart Barrel; @@ -41,11 +41,11 @@ public class RattModel extends StandModel { public RattModel(ModelPart root) { this.stand = root.getChild("stand"); - this.Rotating = this.stand.getChild("Rotating"); - this.Neck = this.Rotating.getChild("Neck"); - this.Jaw = this.Rotating.getChild("Jaw"); - this.Barrel = this.Rotating.getChild("Barrel"); - this.IDK = this.Rotating.getChild("IDK"); + this.head = this.stand.getChild("Rotating"); + this.Neck = this.head.getChild("Neck"); + this.Jaw = this.head.getChild("Jaw"); + this.Barrel = this.head.getChild("Barrel"); + this.IDK = this.head.getChild("IDK"); this.LeftLeg = this.stand.getChild("LeftLeg"); this.RightLeg = this.stand.getChild("RightLeg"); } @@ -60,12 +60,13 @@ public static LayerDefinition getTexturedModelData() { PartDefinition Rotating = stand.addOrReplaceChild("Rotating", CubeListBuilder.create().texOffs(0, 19).addBox(-3.0F, -9.0F, -3.5F, 6.0F, 8.0F, 6.0F, new CubeDeformation(0.0F)) .texOffs(48, 24).addBox(-1.0F, -6.0F, -4.65F, 2.0F, 2.0F, 3.0F, new CubeDeformation(0.0F)) - .texOffs(0, 46).addBox(-2.0F, -7.0F, -4.0F, 4.0F, 4.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -10.0F, 0.5F)); + .texOffs(0, 46).addBox(-2.0F, -7.0F, -4.0F, 4.0F, 4.0F, 2.0F, new CubeDeformation(0.0F)) + .texOffs(48, 18).addBox(-1.5F, -4.5F, 1.0F, 3.0F, 4.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -10.0F, 0.5F)); - PartDefinition Neck = Rotating.addOrReplaceChild("Neck", CubeListBuilder.create().texOffs(38, 0).addBox(-5.5F, -2.0F, -1.0F, 7.0F, 2.0F, 3.0F, new CubeDeformation(0.0F)) - .texOffs(38, 8).addBox(-5.0F, -2.1F, 0.0F, 6.0F, 2.0F, 3.0F, new CubeDeformation(0.0F)) - .texOffs(42, 36).addBox(-5.0F, -1.7F, 1.75F, 6.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)) - .texOffs(38, 5).addBox(-7.0F, -2.25F, 0.0F, 10.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offset(2.0F, 1.0F, -0.5F)); + PartDefinition Neck = Rotating.addOrReplaceChild("Neck", CubeListBuilder.create().texOffs(38, 0).addBox(-3.5F, -2.0F, -1.0F, 7.0F, 2.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(38, 8).addBox(-3.0F, -2.1F, 0.0F, 6.0F, 2.0F, 3.0F, new CubeDeformation(0.0F)) + .texOffs(42, 36).addBox(-3.0F, -1.7F, 1.75F, 6.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)) + .texOffs(38, 5).addBox(-5.0F, -2.25F, 0.0F, 10.0F, 2.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 1.0F, -0.5F)); PartDefinition Jaw = Rotating.addOrReplaceChild("Jaw", CubeListBuilder.create(), PartPose.offset(0.0F, 1.0F, -0.5F)); @@ -78,49 +79,58 @@ public static LayerDefinition getTexturedModelData() { PartDefinition Jaw_r2 = Jaw.addOrReplaceChild("Jaw_r2", CubeListBuilder.create().texOffs(0, 33).addBox(-3.0F, -2.0F, -3.0F, 6.0F, 2.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.48F, 0.0F, 0.0F)); - PartDefinition Barrel = Rotating.addOrReplaceChild("Barrel", CubeListBuilder.create().texOffs(48, 18).addBox(-1.5F, -4.5F, 1.0F, 3.0F, 4.0F, 2.0F, new CubeDeformation(0.0F)) - .texOffs(24, 31).addBox(-0.5F, -1.75F, 2.0F, 1.0F, 1.0F, 8.0F, new CubeDeformation(0.0F)) - .texOffs(24, 19).addBox(-1.0F, -3.75F, 2.0F, 2.0F, 2.0F, 10.0F, new CubeDeformation(0.0F)) - .texOffs(0, 0).addBox(-0.5F, -3.25F, 2.0F, 1.0F, 1.0F, 18.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 0.0F, 0.0F)); + PartDefinition Barrel = Rotating.addOrReplaceChild("Barrel", CubeListBuilder.create().texOffs(24, 31).addBox(-0.5F, 1.25F, 0.0F, 1.0F, 1.0F, 8.0F, new CubeDeformation(0.0F)) + .texOffs(24, 19).addBox(-1.0F, -0.75F, 0.0F, 2.0F, 2.0F, 10.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, -3.0F, 2.0F)); + + PartDefinition Berrel2 = Barrel.addOrReplaceChild("Berrel2", CubeListBuilder.create().texOffs(1, 1).addBox(-0.5F, -0.5F, -14.0F, 1.0F, 1.0F, 17.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 0.25F, 10.0F)); PartDefinition IDK = Rotating.addOrReplaceChild("IDK", CubeListBuilder.create().texOffs(20, 33).addBox(-0.5F, 0.5F, -1.0F, 1.0F, 3.0F, 1.0F, new CubeDeformation(0.0F)) .texOffs(20, 37).addBox(-0.5F, 2.5F, 0.0F, 1.0F, 1.0F, 1.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 0.0F, 0.0F)); - PartDefinition LeftLeg = stand.addOrReplaceChild("LeftLeg", CubeListBuilder.create(), PartPose.offset(0.0F, -10.0F, 0.0F)); + PartDefinition LeftLeg = stand.addOrReplaceChild("LeftLeg", CubeListBuilder.create(), PartPose.offset(4.0F, -10.0F, 0.75F)); + + PartDefinition Plate_r1 = LeftLeg.addOrReplaceChild("Plate_r1", CubeListBuilder.create().texOffs(48, 39).addBox(0.0F, -3.0F, -1.0F, 1.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(1.25F, 1.75F, -0.75F, 0.0F, 0.0F, -0.3491F)); + + PartDefinition LB = LeftLeg.addOrReplaceChild("LB", CubeListBuilder.create(), PartPose.offsetAndRotation(-0.25F, 1.0F, 1.25F, 0.0F, -1.5708F, 0.0F)); - PartDefinition Plate_r1 = LeftLeg.addOrReplaceChild("Plate_r1", CubeListBuilder.create().texOffs(48, 39).addBox(0.0F, -3.0F, -1.0F, 1.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(5.25F, 1.75F, 0.0F, 0.0F, 0.0F, -0.3491F)); + PartDefinition LBLegIsolate = LB.addOrReplaceChild("LBLegIsolate", CubeListBuilder.create(), PartPose.offset(0.15F, 0.5F, -0.5F)); - PartDefinition LB = LeftLeg.addOrReplaceChild("LB", CubeListBuilder.create(), PartPose.offsetAndRotation(3.75F, 1.0F, 1.25F, 0.0F, -1.5708F, 0.0F)); + PartDefinition LBLeg_r1 = LBLegIsolate.addOrReplaceChild("LBLeg_r1", CubeListBuilder.create().texOffs(32, 45).addBox(-1.0F, -2.0F, -1.0F, 2.0F, 10.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, -0.49F, -0.1925F, -0.3444F)); - PartDefinition LBLeg_r1 = LB.addOrReplaceChild("LBLeg_r1", CubeListBuilder.create().texOffs(32, 45).addBox(-1.0F, -2.0F, -1.0F, 2.0F, 10.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.9F, 0.5F, -0.5F, -0.49F, -0.1925F, -0.3444F)); + PartDefinition LBPlate = LB.addOrReplaceChild("LBPlate", CubeListBuilder.create().texOffs(32, 40).addBox(-1.75F, -0.75F, -2.45F, 4.0F, 1.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(2.75F, 6.75F, -3.65F)); - PartDefinition LFPlate = LeftLeg.addOrReplaceChild("LFPlate", CubeListBuilder.create().texOffs(38, 13).addBox(-1.5F, -1.25F, -2.15F, 4.0F, 1.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(7.0F, 8.25F, -4.0F)); + PartDefinition LF = LeftLeg.addOrReplaceChild("LF", CubeListBuilder.create(), PartPose.offset(0.0F, 0.5F, -0.65F)); - PartDefinition LBPlate = LeftLeg.addOrReplaceChild("LBPlate", CubeListBuilder.create().texOffs(32, 40).addBox(-3.0F, -1.25F, -0.95F, 4.0F, 1.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(8.5F, 8.25F, 4.1F)); + PartDefinition LFLegIsolate = LF.addOrReplaceChild("LFLegIsolate", CubeListBuilder.create(), PartPose.offset(0.65F, 1.0F, -0.6F)); - PartDefinition LF = LeftLeg.addOrReplaceChild("LF", CubeListBuilder.create(), PartPose.offset(5.5F, 4.25F, -1.9F)); + PartDefinition LFLeg_r1 = LFLegIsolate.addOrReplaceChild("LFLeg_r1", CubeListBuilder.create().texOffs(16, 45).addBox(-1.0F, -2.0F, -1.0F, 2.0F, 10.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, -0.49F, -0.1925F, -0.3444F)); - PartDefinition LFLeg_r1 = LF.addOrReplaceChild("LFLeg_r1", CubeListBuilder.create().texOffs(16, 45).addBox(-1.0F, -2.0F, -1.0F, 2.0F, 10.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-0.85F, -2.75F, 1.4F, -0.49F, -0.1925F, -0.3444F)); + PartDefinition LFPlate = LF.addOrReplaceChild("LFPlate", CubeListBuilder.create().texOffs(38, 13).addBox(-1.5F, -1.25F, -2.15F, 4.0F, 1.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(3.0F, 7.75F, -4.1F)); - PartDefinition RightLeg = stand.addOrReplaceChild("RightLeg", CubeListBuilder.create(), PartPose.offset(0.0F, -10.0F, 0.0F)); + PartDefinition RightLeg = stand.addOrReplaceChild("RightLeg", CubeListBuilder.create(), PartPose.offset(-4.0F, -10.0F, 0.75F)); - PartDefinition Plate_r2 = RightLeg.addOrReplaceChild("Plate_r2", CubeListBuilder.create().texOffs(48, 45).addBox(0.0F, -3.0F, -1.0F, 1.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(-6.75F, 1.5F, 0.0F, 0.0F, 0.0F, 0.3491F)); + PartDefinition Plate_r2 = RightLeg.addOrReplaceChild("Plate_r2", CubeListBuilder.create().texOffs(48, 39).mirror().addBox(-1.0F, -3.0F, -1.0F, 1.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(-1.25F, 1.75F, -0.75F, 0.0F, 0.0F, 0.3491F)); - PartDefinition RB = RightLeg.addOrReplaceChild("RB", CubeListBuilder.create(), PartPose.offsetAndRotation(-4.25F, 1.0F, 1.0F, 0.0F, 3.1416F, 0.0F)); + PartDefinition RB = RightLeg.addOrReplaceChild("RB", CubeListBuilder.create(), PartPose.offsetAndRotation(0.25F, 1.0F, 1.25F, 0.0F, 1.5708F, 0.0F)); - PartDefinition Leg_r1 = RB.addOrReplaceChild("Leg_r1", CubeListBuilder.create().texOffs(24, 45).addBox(-1.0F, -2.0F, -1.0F, 2.0F, 10.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.9F, 0.5F, -0.5F, -0.49F, -0.1925F, -0.3444F)); + PartDefinition RBLegIsolate = RB.addOrReplaceChild("RBLegIsolate", CubeListBuilder.create(), PartPose.offset(-0.15F, 0.5F, -0.5F)); - PartDefinition RF = RightLeg.addOrReplaceChild("RF", CubeListBuilder.create(), PartPose.offsetAndRotation(-4.25F, 1.0F, 0.5F, 0.0F, 1.5708F, 0.0F)); + PartDefinition RBLeg_r1 = RBLegIsolate.addOrReplaceChild("RBLeg_r1", CubeListBuilder.create().texOffs(40, 45).mirror().addBox(-1.0F, -2.0F, -1.0F, 2.0F, 10.0F, 2.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, -0.49F, 0.1925F, 0.3444F)); - PartDefinition Leg_r2 = RF.addOrReplaceChild("Leg_r2", CubeListBuilder.create().texOffs(40, 45).addBox(-1.0F, -2.0F, -1.0F, 2.0F, 10.0F, 2.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.9F, 0.5F, -0.5F, -0.49F, -0.1925F, -0.3444F)); + PartDefinition RBPlate = RB.addOrReplaceChild("RBPlate", CubeListBuilder.create().texOffs(16, 40).mirror().addBox(-2.25F, -0.75F, -2.45F, 4.0F, 1.0F, 4.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offset(-2.75F, 6.75F, -3.65F)); - PartDefinition RFPlate = RightLeg.addOrReplaceChild("RFPlate", CubeListBuilder.create().texOffs(42, 31).addBox(-10.0F, -3.0F, -5.65F, 4.0F, 1.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 10.0F, 0.0F)); + PartDefinition RF = RightLeg.addOrReplaceChild("RF", CubeListBuilder.create(), PartPose.offset(0.0F, 0.5F, -0.65F)); - PartDefinition RBPlate = RightLeg.addOrReplaceChild("RBPlate", CubeListBuilder.create().texOffs(16, 40).addBox(-10.0F, -3.0F, 3.15F, 4.0F, 1.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 10.0F, 0.0F)); + PartDefinition RFLegIsolate = RF.addOrReplaceChild("RFLegIsolate", CubeListBuilder.create(), PartPose.offset(-0.65F, 1.0F, -0.6F)); + + PartDefinition RFLeg_r1 = RFLegIsolate.addOrReplaceChild("RFLeg_r1", CubeListBuilder.create().texOffs(24, 45).mirror().addBox(-1.0F, -2.0F, -1.0F, 2.0F, 10.0F, 2.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, -0.49F, 0.1925F, 0.3444F)); + + PartDefinition RFPlate = RF.addOrReplaceChild("RFPlate", CubeListBuilder.create().texOffs(42, 31).mirror().addBox(-2.5F, -1.25F, -2.15F, 4.0F, 1.0F, 4.0F, new CubeDeformation(0.0F)).mirror(false), PartPose.offset(-3.0F, 7.75F, -4.1F)); return LayerDefinition.create(meshdefinition, 64, 64); } + public static ResourceLocation base = new ResourceLocation(Roundabout.MOD_ID, "textures/stand/ratt/anime.png"); public ResourceLocation getTextureLocation(Entity context, byte skin){ diff --git a/common/src/main/java/net/hydra/jojomod/entity/stand/RattEntity.java b/common/src/main/java/net/hydra/jojomod/entity/stand/RattEntity.java index aa63a369c..a23ab8aec 100644 --- a/common/src/main/java/net/hydra/jojomod/entity/stand/RattEntity.java +++ b/common/src/main/java/net/hydra/jojomod/entity/stand/RattEntity.java @@ -1,12 +1,8 @@ package net.hydra.jojomod.entity.stand; -import net.hydra.jojomod.Roundabout; -import net.hydra.jojomod.client.StandIcons; import net.hydra.jojomod.event.index.OffsetIndex; import net.hydra.jojomod.event.index.PowerIndex; -import net.hydra.jojomod.event.powers.StandPowers; import net.hydra.jojomod.event.powers.StandUser; -import net.hydra.jojomod.mixin.StandUserEntity; import net.hydra.jojomod.stand.powers.PowersRatt; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.*; @@ -37,9 +33,14 @@ public static Component getSkinNameT(byte skinId){ @Override public void tick() { + if (getUser() != null) { + if (!this.getUserData(this.getUser()).roundabout$getActive()) { + this.remove(RemovalReason.DISCARDED); // might not be the best method + } + } + switch (MotionState) { case PowersRatt.SHOULDER -> { - // I'm going to either not summon RattEntity or just send him to the shadow realm (0,-1000,0) UpdateState(OffsetIndex.FOLLOW); } @@ -50,15 +51,15 @@ public void tick() { target = Placement; } - UpdatePos(target); + UpdatePos(this.getPosition(0).lerp(target,0.8)); if (getPosition(0).distanceTo(target) < 0.2) { UpdatePos(target); if (target == Placement) { - MotionState = PowersRatt.PLACED; + UpdateMotionState(PowersRatt.PLACED); } else { - MotionState = PowersRatt.SHOULDER; + UpdateMotionState(PowersRatt.SHOULDER); } } } @@ -73,11 +74,20 @@ public void tick() { super.tick(); } + + + public void UpdatePos(Vec3 v) { if (this.getUser() != null) { ((StandUser) this.getUser()).roundabout$getStandPowers().tryPosPowerPacket(PowerIndex.POWER_2,v); } } + public void UpdateMotionState(byte s) { + if (this.getUser() != null) { + MotionState = s; + ((StandUser) this.getUser()).roundabout$getStandPowers().tryIntPowerPacket(PowerIndex.POWER_1,(int) s); + } + } public void UpdateState(byte s) { if (this.getUser() != null) { ((StandUser) this.getUser()).roundabout$getStandPowers().tryIntPowerPacket(PowerIndex.POWER_2,(int) s); diff --git a/common/src/main/java/net/hydra/jojomod/mixin/HudRendering.java b/common/src/main/java/net/hydra/jojomod/mixin/HudRendering.java index 1a44e5b3d..0d83e2b5c 100644 --- a/common/src/main/java/net/hydra/jojomod/mixin/HudRendering.java +++ b/common/src/main/java/net/hydra/jojomod/mixin/HudRendering.java @@ -15,6 +15,7 @@ import net.hydra.jojomod.event.powers.stand.PowersSoftAndWet; import net.hydra.jojomod.event.powers.visagedata.JosukePartEightVisage; import net.hydra.jojomod.item.MaskItem; +import net.hydra.jojomod.stand.powers.PowersRatt; import net.hydra.jojomod.util.config.ConfigManager; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; @@ -88,6 +89,13 @@ protected void renderTextureOverlay(GuiGraphics p_282304_, ResourceLocation p_28 this.renderTextureOverlay($$1, StandIcons.GASOLINE_OVERLAY, overlay2); } } + if (((StandUser) this.minecraft.player ).roundabout$getStandPowers() instanceof PowersRatt) { + if ( ((StandUser) this.minecraft.player).roundabout$getStandPowers().scopeLevel != 0 ) { + RenderSystem.enableBlend(); + this.renderTextureOverlay($$1, StandIcons.RATT_SCOPE_OVERLAY, 0.99F); + RenderSystem.disableBlend(); + } + } if (this.minecraft.options.getCameraType().isFirstPerson()) { StandUser user = ((StandUser) this.minecraft.player); if (user.roundabout$isBubbleEncased()){ diff --git a/common/src/main/java/net/hydra/jojomod/mixin/InputEvents.java b/common/src/main/java/net/hydra/jojomod/mixin/InputEvents.java index a7803c36b..e3e0b6b23 100644 --- a/common/src/main/java/net/hydra/jojomod/mixin/InputEvents.java +++ b/common/src/main/java/net/hydra/jojomod/mixin/InputEvents.java @@ -15,6 +15,7 @@ import net.hydra.jojomod.entity.D4CCloneEntity; import net.hydra.jojomod.entity.corpses.FallenMob; import net.hydra.jojomod.entity.stand.D4CEntity; +import net.hydra.jojomod.entity.stand.RattEntity; import net.hydra.jojomod.entity.stand.StandEntity; import net.hydra.jojomod.event.index.PacketDataIndex; import net.hydra.jojomod.event.index.Poses; @@ -106,6 +107,13 @@ public void roundaboutAttack(CallbackInfoReturnable ci) { } } + if ($$0 instanceof RattEntity) { + if (((StandEntity) $$0).getUser() != null) { + if (((RattEntity) $$0).getUser().isCrouching()) { + ci.setReturnValue(true); + } + } + } if (powers.getGoBeyondTarget() != null && powers.getGoBeyondTarget().is($$0)) { ci.setReturnValue(true); return; diff --git a/common/src/main/java/net/hydra/jojomod/mixin/ZItemInHandLayer.java b/common/src/main/java/net/hydra/jojomod/mixin/ZItemInHandLayer.java index ff33b8769..28dc0e365 100644 --- a/common/src/main/java/net/hydra/jojomod/mixin/ZItemInHandLayer.java +++ b/common/src/main/java/net/hydra/jojomod/mixin/ZItemInHandLayer.java @@ -9,6 +9,7 @@ import net.hydra.jojomod.entity.visages.JojoNPC; import net.hydra.jojomod.event.powers.StandUser; import net.hydra.jojomod.event.powers.TimeStop; +import net.hydra.jojomod.stand.powers.PowersRatt; import net.minecraft.client.Minecraft; import net.minecraft.client.model.ArmedModel; import net.minecraft.client.model.EntityModel; @@ -82,7 +83,13 @@ public ZItemInHandLayer(RenderLayerParent $$0) { } LivingEntity host = entity; - if (entity instanceof JojoNPC jnpc && jnpc.host != null && ((StandUser)jnpc.host).roundabout$getEffectiveCombatMode()){ + if ( ((StandUser)host).roundabout$getStandPowers() instanceof PowersRatt) { + if ( ((StandUser)host).roundabout$getStandPowers().scopeLevel != 0 ) { + ci.cancel(); + } + } + + if (entity instanceof JojoNPC jnpc && jnpc.host != null && ((StandUser)jnpc.host).roundabout$getEffectiveCombatMode()){ host = jnpc.host; } if (host != null && ((StandUser)host).roundabout$getEffectiveCombatMode() && !host.isUsingItem()){ diff --git a/common/src/main/java/net/hydra/jojomod/mixin/ZItemInHandRenderer.java b/common/src/main/java/net/hydra/jojomod/mixin/ZItemInHandRenderer.java index 3575de928..df773c1ec 100644 --- a/common/src/main/java/net/hydra/jojomod/mixin/ZItemInHandRenderer.java +++ b/common/src/main/java/net/hydra/jojomod/mixin/ZItemInHandRenderer.java @@ -14,6 +14,7 @@ import net.hydra.jojomod.item.GlaiveItem; import net.hydra.jojomod.item.ModItems; import net.hydra.jojomod.item.StandArrowItem; +import net.hydra.jojomod.stand.powers.PowersRatt; import net.hydra.jojomod.util.MainUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.model.EntityModel; @@ -102,6 +103,12 @@ public void renderItem(LivingEntity livingEntity, ItemStack itemStack, ItemDispl return; } } + if (user.roundabout$getStandPowers() instanceof PowersRatt) { + if (user.roundabout$getStandPowers().scopeLevel != 0) { + ci.cancel(); + return; + } + } if (powers.isPiloting()){ StandEntity stand = powers.getPilotingStand(); float aan = $$3.getAttackAnim($$0); diff --git a/common/src/main/java/net/hydra/jojomod/sound/ModSounds.java b/common/src/main/java/net/hydra/jojomod/sound/ModSounds.java index 49d34304a..378416138 100644 --- a/common/src/main/java/net/hydra/jojomod/sound/ModSounds.java +++ b/common/src/main/java/net/hydra/jojomod/sound/ModSounds.java @@ -591,11 +591,6 @@ public class ModSounds { public static final ResourceLocation CINDERELLA_VISAGE_CREATION_ID = new ResourceLocation(Roundabout.MOD_ID+":"+CINDERELLA_VISAGE_CREATION); public static SoundEvent CINDERELLA_VISAGE_CREATION_EVENT = SoundEvent.createVariableRangeEvent(CINDERELLA_VISAGE_CREATION_ID); - public static final String RATT_SUMMON = "ratt_summon"; - public static final ResourceLocation RATT_SUMMON_ID = new ResourceLocation(Roundabout.MOD_ID+":"+RATT_SUMMON); - public static SoundEvent RATT_SUMMON_EVENT = SoundEvent.createVariableRangeEvent(RATT_SUMMON_ID); - - public static final String UNLOCK_SKIN = "unlock_skin"; public static final ResourceLocation UNLOCK_SKIN_ID = new ResourceLocation(Roundabout.MOD_ID+":"+UNLOCK_SKIN); public static SoundEvent UNLOCK_SKIN_EVENT = SoundEvent.createVariableRangeEvent(UNLOCK_SKIN_ID); diff --git a/common/src/main/java/net/hydra/jojomod/stand/powers/PowersRatt.java b/common/src/main/java/net/hydra/jojomod/stand/powers/PowersRatt.java index a3bf0551e..35154be72 100644 --- a/common/src/main/java/net/hydra/jojomod/stand/powers/PowersRatt.java +++ b/common/src/main/java/net/hydra/jojomod/stand/powers/PowersRatt.java @@ -17,9 +17,8 @@ import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.level.ClipContext; import net.minecraft.world.phys.BlockHitResult; @@ -40,9 +39,6 @@ public PowersRatt(LivingEntity self) { public StandPowers generateStandPowers(LivingEntity entity) { return new PowersRatt(entity); } - @Override - public boolean canSummonStandAsEntity() {/* lazy ass code*/return true;} - @Override @@ -57,33 +53,36 @@ public StandPowers generateStandPowers(LivingEntity entity) { PLACED = 2; + public boolean active = false; + @Override + public boolean canSummonStandAsEntity() { + return active; + } + public byte getRattState() { RattEntity RE = (RattEntity) getStandUserSelf().roundabout$getStand(); if (RE != null) { return RE.MotionState; + } else if (this.getStandUserSelf().roundabout$getActive()) { + return SHOULDER; } return -1; } public void setRattState(byte b) { RattEntity RE = (RattEntity) getStandUserSelf().roundabout$getStand(); if (RE != null) { - RE.MotionState = b; + RE.UpdateMotionState(b); } } public boolean isRattState(byte b) { RattEntity RE = (RattEntity) getStandUserSelf().roundabout$getStand(); if (RE != null) { return RE.MotionState == b; + } else if (b == SHOULDER) { + return true; } return false; } - public Vec3 getRattPlacement() { - RattEntity RE = (RattEntity) getStandUserSelf().roundabout$getStand(); - if (RE != null) { - return RE.Placement; - } - return Vec3.ZERO; - } public void setRattPlacement(Vec3 b) { RattEntity RE = (RattEntity) getStandUserSelf().roundabout$getStand(); if (RE != null) { @@ -105,9 +104,6 @@ private BlockHitResult getValidPlacement(){ - - - @Override public void renderIcons(GuiGraphics context, int x, int y) { ClientUtil.fx.roundabout$onGUI(context); @@ -124,10 +120,8 @@ public void renderIcons(GuiGraphics context, int x, int y) { setSkillIcon(context, x, y, 1, ScopeIcon, PowerIndex.SKILL_1); setSkillIcon(context,x,y,2,StandIcons.JUSTICE_PILOT,PowerIndex.SKILL_2); } - case MOVING -> { - setSkillIcon(context,x,y,2,StandIcons.JUSTICE_PILOT_EXIT,PowerIndex.SKILL_2); - } - case PLACED -> { + case MOVING, PLACED -> { + setSkillIcon(context,x,y,1,StandIcons.NONE, PowerIndex.SKILL_1); setSkillIcon(context,x,y,2,StandIcons.JUSTICE_PILOT_EXIT,PowerIndex.SKILL_2); } } @@ -136,6 +130,21 @@ public void renderIcons(GuiGraphics context, int x, int y) { } + @Override + public boolean tryPower(int move, boolean forced) { + switch(move) { + case PowerIndex.POWER_1 -> { + active = true; + if (!this.isClient()) { + this.getStandUserSelf().roundabout$summonStand(this.getSelf().level(), true, false); + } + } + case PowerIndex.POWER_1_SNEAK -> { + active = false; + } + } + return super.tryPower(move, forced); + } @Override public boolean tryPosPower(int move, boolean forced, Vec3 pos) { if (move == PowerIndex.POWER_2) { @@ -148,15 +157,33 @@ public boolean tryPosPower(int move, boolean forced, Vec3 pos) { @Override public boolean tryIntPower(int move, boolean forced, int chargeTime) { - if (move == PowerIndex.POWER_2) { - if (this.getStandEntity(this.getSelf()) != null) { + if (this.getStandEntity(this.getSelf()) != null) { + if (move == PowerIndex.POWER_2) { this.getStandEntity(this.getSelf()).setOffsetType((byte) chargeTime); + } else if (move == PowerIndex.POWER_1) { + ((RattEntity) this.getStandEntity(this.getSelf())).MotionState = (byte) chargeTime; } } return true; } + @Override + public void tickPower() { + StandEntity SE = getStandEntity(this.getSelf()); + if ( SE != null && SE.getOffsetType() == OffsetIndex.FOLLOW) { + if (active) { + Deploy(); + } else { + if (!this.getSelf().level().isClientSide()) { + SE.remove(Entity.RemovalReason.DISCARDED); + } + } + } + super.tickPower(); + } + + @Override public void powerActivate(PowerContext context) { @@ -184,7 +211,7 @@ public void powerActivate(PowerContext context) { } public void RattScope() { - /* will eventually add some sort of scope effect */ + /* will eventually add some sort of scope overlay */ int nl = scopeLevel + 1; if (nl == 2) { setScopeLevel(0); @@ -200,8 +227,11 @@ public void Deploy() { if (RE != null) { if (getValidPlacement() != null) { setRattState(MOVING); - setRattPlacement(getValidPlacement().getLocation()); + setRattPlacement(getValidPlacement().getLocation().subtract(0,0.1,0)); } + } else { + tryPower(PowerIndex.POWER_1,true); + tryPowerPacket(PowerIndex.POWER_1); } } public void Recall() { @@ -209,6 +239,8 @@ public void Recall() { if (RE != null) { setRattState(MOVING); setRattPlacement(null); + tryPower(PowerIndex.POWER_1_SNEAK,true); + tryPowerPacket(PowerIndex.POWER_1_SNEAK); } } @@ -256,7 +288,7 @@ public Component getPosName(byte posID) { public SoundEvent getSoundFromByte(byte soundChoice){ byte bt = ((StandUser)this.getSelf()).roundabout$getStandSkin(); if (soundChoice == SoundIndex.SUMMON_SOUND) { - return ModSounds.RATT_SUMMON_EVENT; + return ModSounds.SUMMON_SOUND_EVENT; } return super.getSoundFromByte(soundChoice); } diff --git a/common/src/main/resources/assets/roundabout/models/item/max_ratt_disc.json b/common/src/main/resources/assets/roundabout/models/item/max_ratt_disc.json index 3f975eda4..ff64898cd 100644 --- a/common/src/main/resources/assets/roundabout/models/item/max_ratt_disc.json +++ b/common/src/main/resources/assets/roundabout/models/item/max_ratt_disc.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/template_music_disc", "textures": { - "layer0": "roundabout:item/max_d4c_disc" + "layer0": "roundabout:item/max_ratt_disc" } } \ No newline at end of file diff --git a/common/src/main/resources/assets/roundabout/models/item/ratt_disc.json b/common/src/main/resources/assets/roundabout/models/item/ratt_disc.json index 694e3ef4c..2bfa4aa81 100644 --- a/common/src/main/resources/assets/roundabout/models/item/ratt_disc.json +++ b/common/src/main/resources/assets/roundabout/models/item/ratt_disc.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/template_music_disc", "textures": { - "layer0": "roundabout:item/d4c_disc" + "layer0": "roundabout:item/ratt_disc" } } \ No newline at end of file diff --git a/common/src/main/resources/assets/roundabout/textures/item/max_ratt_disc.png b/common/src/main/resources/assets/roundabout/textures/item/max_ratt_disc.png new file mode 100644 index 0000000000000000000000000000000000000000..580903848d0aad084d9ec63511e4c746f6c7256d GIT binary patch literal 317 zcmV-D0mA-?P)Px#_en%SR5(v#WS|f*QmCJSHU^yC9Q7aFWyZeCuv!KeMAl?z>4~C0bLI+$G(CQ} z7_wnt13;QlG%@kQ6=zPL%^)fu4d=i9@Dywq%n(MnW+Y7@)jxkge9^joI|E1)$PgF} z5)YL70yYF}fRSqfij#l5d&>^{PUB6Q{yvO9K{9d+LjDl0tZIkqztEei`m$m<1Toh@NQ3N=W493EJcZQd|Q7oY!j++#CFK P00000NkvXXu0mjfXsdkb literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/roundabout/textures/item/ratt_disc.png b/common/src/main/resources/assets/roundabout/textures/item/ratt_disc.png new file mode 100644 index 0000000000000000000000000000000000000000..cc953f92e2cf7f718dc7824d354b7275ada3eb9a GIT binary patch literal 320 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 literal 0 HcmV?d00001 diff --git a/common/src/main/resources/assets/roundabout/textures/stand/ratt/anime.png b/common/src/main/resources/assets/roundabout/textures/stand/ratt/anime.png index 7d20eb2f642fec09f8b2970b3ba9fa3c5e8df264..7b398486dfc5341a00ac341b96e6ccb496ec47d8 100644 GIT binary patch delta 1984 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 CINDERELLA_VISAGE_CREATION_EVENT = register(ModSounds.CINDERELLA_VISAGE_CREATION, ModSounds.CINDERELLA_VISAGE_CREATION_ID); - public static final RegistryObject RATT_SUMMON = - register(ModSounds.RATT_SUMMON, ModSounds.RATT_SUMMON_ID); + public static final RegistryObject THE_WORLD_OVER_HEAVEN_EVENT = register(ModSounds.THE_WORLD_OVER_HEAVEN, ModSounds.THE_WORLD_OVER_HEAVEN_ID);