From 3d5d33b8aa3229622db8b19e10abf7cc14b360a5 Mon Sep 17 00:00:00 2001 From: James Hall Date: Sun, 6 Jul 2025 23:06:47 +0100 Subject: [PATCH 1/4] feat: basic flash suit - no model/texture feat: super speed power --- .../mc/duzo/timeless/power/PowerRegistry.java | 6 ++ .../duzo/timeless/suit/flash/FlashSuit.java | 56 +++++++++++++++++++ .../suit/flash/generic/GenericFlashSuit.java | 55 ++++++++++++++++++ .../suit/flash/item/FlashSuitItem.java | 38 +++++++++++++ .../duzo/timeless/suit/set/SetRegistry.java | 6 ++ 5 files changed, 161 insertions(+) create mode 100644 src/main/java/mc/duzo/timeless/suit/flash/FlashSuit.java create mode 100644 src/main/java/mc/duzo/timeless/suit/flash/generic/GenericFlashSuit.java create mode 100644 src/main/java/mc/duzo/timeless/suit/flash/item/FlashSuitItem.java diff --git a/src/main/java/mc/duzo/timeless/power/PowerRegistry.java b/src/main/java/mc/duzo/timeless/power/PowerRegistry.java index 1ae09a3b..dff16e50 100644 --- a/src/main/java/mc/duzo/timeless/power/PowerRegistry.java +++ b/src/main/java/mc/duzo/timeless/power/PowerRegistry.java @@ -45,6 +45,12 @@ public static T register(T entry) { }) .build().register(); public static Power SWIFT_SNEAK = Power.Builder.create(new Identifier(Timeless.MOD_ID, "swift_sneak")).build().register(); + public static Power SUPER_SPEED = Power.Builder.create(new Identifier(Timeless.MOD_ID, "super_speed")) + .tick(player -> { + if (player.getServer().getTicks() % 20 != 0) return; // Run every second + player.addStatusEffect(new StatusEffectInstance(StatusEffects.SPEED, 22, 10, false, false)); + }) + .build().register(); public static void init() {} } diff --git a/src/main/java/mc/duzo/timeless/suit/flash/FlashSuit.java b/src/main/java/mc/duzo/timeless/suit/flash/FlashSuit.java new file mode 100644 index 00000000..5d80ba2a --- /dev/null +++ b/src/main/java/mc/duzo/timeless/suit/flash/FlashSuit.java @@ -0,0 +1,56 @@ +package mc.duzo.timeless.suit.flash; + +import mc.duzo.timeless.Timeless; +import mc.duzo.timeless.datagen.provider.lang.AutomaticSuitEnglish; +import mc.duzo.timeless.power.PowerList; +import mc.duzo.timeless.suit.Suit; +import net.minecraft.sound.SoundEvent; +import net.minecraft.sound.SoundEvents; +import net.minecraft.util.Identifier; + +public abstract class FlashSuit extends Suit implements AutomaticSuitEnglish { + private final Identifier id; + protected final PowerList powers; + + protected FlashSuit(Identifier id, PowerList powers) { + this.id = id; + this.powers = powers; + } + + protected FlashSuit(String mark, String modid, PowerList powers) { + this(new Identifier(modid, "flash_" + mark), powers); + } + + /** + * For Timeless heroes ONLY + * Addon mods should use other constructor + */ + protected FlashSuit(String mark, PowerList powers) { + this(mark, Timeless.MOD_ID, powers); + } + + @Override + public PowerList getPowers() { + return powers; + } + + @Override + public boolean isBinding() { + return false; + } + + @Override + public boolean isAlwaysVisible() { + return false; + } + + @Override + public Identifier id() { + return this.id; + } + + @Override + public SoundEvent getStepSound() { + return SoundEvents.BLOCK_WOOL_STEP; + } +} diff --git a/src/main/java/mc/duzo/timeless/suit/flash/generic/GenericFlashSuit.java b/src/main/java/mc/duzo/timeless/suit/flash/generic/GenericFlashSuit.java new file mode 100644 index 00000000..b945abae --- /dev/null +++ b/src/main/java/mc/duzo/timeless/suit/flash/generic/GenericFlashSuit.java @@ -0,0 +1,55 @@ +package mc.duzo.timeless.suit.flash.generic; + +import mc.duzo.animation.generic.AnimationInfo; +import mc.duzo.timeless.Timeless; +import mc.duzo.timeless.power.PowerList; +import mc.duzo.timeless.power.PowerRegistry; +import mc.duzo.timeless.suit.batman.sixer.client.model.Batman66Model; +import mc.duzo.timeless.suit.client.ClientSuit; +import mc.duzo.timeless.suit.client.render.SuitModel; +import mc.duzo.timeless.suit.flash.FlashSuit; +import mc.duzo.timeless.suit.set.SetRegistry; +import mc.duzo.timeless.suit.set.SuitSet; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.entity.LivingEntity; +import net.minecraft.util.Identifier; + +import java.util.Optional; +import java.util.function.Supplier; + +// todo - i dont know any flash lore so this is just generic placeholder +public class GenericFlashSuit extends FlashSuit { + public GenericFlashSuit() { + super(new Identifier(Timeless.MOD_ID, "generic_flash"), PowerList.of(PowerRegistry.SUPER_SPEED)); + } + + @Override + public SuitSet getSet() { + return SetRegistry.FLASH; + } + + @Environment(EnvType.CLIENT) + @Override + protected ClientSuit createClient() { + AnimationInfo info = new AnimationInfo(AnimationInfo.RenderType.TORSO_HEAD, null, AnimationInfo.Movement.ALLOW, null); + + return new ClientSuit(this) { + @Override + public Supplier model() { + return Batman66Model::new; // TODO - create a flash model + } + + @Override + public Optional emission() { + return Optional.empty(); + } + + @Override + public AnimationInfo getAnimationInfo(LivingEntity entity) { + if (!(getSet().isWearing(entity))) return null; + return info; + } + }; + } +} diff --git a/src/main/java/mc/duzo/timeless/suit/flash/item/FlashSuitItem.java b/src/main/java/mc/duzo/timeless/suit/flash/item/FlashSuitItem.java new file mode 100644 index 00000000..9c601ff5 --- /dev/null +++ b/src/main/java/mc/duzo/timeless/suit/flash/item/FlashSuitItem.java @@ -0,0 +1,38 @@ +package mc.duzo.timeless.suit.flash.item; + +import mc.duzo.timeless.core.items.SuitItem; +import mc.duzo.timeless.core.items.SuitMaterial; +import mc.duzo.timeless.datagen.provider.lang.AutomaticSuitEnglish; +import mc.duzo.timeless.datagen.provider.model.AutomaticModel; +import mc.duzo.timeless.suit.Suit; +import net.fabricmc.fabric.api.item.v1.FabricItemSettings; +import net.minecraft.item.Item; +import net.minecraft.item.Items; +import net.minecraft.recipe.Ingredient; +import net.minecraft.sound.SoundEvents; +import net.minecraft.util.Util; + +import java.util.EnumMap; + +public class FlashSuitItem extends SuitItem implements AutomaticModel, AutomaticSuitEnglish { + public FlashSuitItem(Suit suit, Type type) { + super(suit, FlashMaterial.INSTANCE, type, new FabricItemSettings().maxCount(1)); + } + + private static class FlashMaterial extends SuitMaterial { + public FlashMaterial(Item repair) { + super("flash", 33, Util.make(new EnumMap(Type.class), map -> { + map.put(Type.BOOTS, 3); + map.put(Type.LEGGINGS, 6); + map.put(Type.CHESTPLATE, 8); + map.put(Type.HELMET, 3); + }), 10, SoundEvents.ITEM_ARMOR_EQUIP_LEATHER, 2.0F, 0.0F, () -> Ingredient.ofItems(repair)); + } + + public FlashMaterial() { + this(Items.LEATHER); // todo + } + + public static FlashMaterial INSTANCE = new FlashMaterial(); + } +} diff --git a/src/main/java/mc/duzo/timeless/suit/set/SetRegistry.java b/src/main/java/mc/duzo/timeless/suit/set/SetRegistry.java index 54741ebf..fd58469a 100644 --- a/src/main/java/mc/duzo/timeless/suit/set/SetRegistry.java +++ b/src/main/java/mc/duzo/timeless/suit/set/SetRegistry.java @@ -1,5 +1,7 @@ package mc.duzo.timeless.suit.set; +import mc.duzo.timeless.suit.flash.generic.GenericFlashSuit; +import mc.duzo.timeless.suit.flash.item.FlashSuitItem; import net.fabricmc.fabric.api.event.registry.FabricRegistryBuilder; import net.minecraft.registry.Registry; @@ -28,6 +30,7 @@ public static T register(T suit) { public static SuitSet MARK_THREE; public static SuitSet MARK_TWO; public static SuitSet BATMAN_66; + public static SuitSet FLASH; public static void init() { // Iron Man @@ -38,5 +41,8 @@ public static void init() { // Batman BATMAN_66 = register(new RegisteringSuitSet(new Batman66Suit(), BatmanSuitItem::new)); + + // Flash + FLASH = register(new RegisteringSuitSet(new GenericFlashSuit(), FlashSuitItem::new)); } } From 7d7da103210621763695496dc1c4180d1071b6b4 Mon Sep 17 00:00:00 2001 From: James Hall Date: Sun, 6 Jul 2025 23:33:24 +0100 Subject: [PATCH 2/4] feat: placeholder flash suit texture --- .../suit/flash/generic/GenericFlashSuit.java | 7 +++---- .../timeless/textures/suit/flash_generic.png | Bin 0 -> 5774 bytes 2 files changed, 3 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/assets/timeless/textures/suit/flash_generic.png diff --git a/src/main/java/mc/duzo/timeless/suit/flash/generic/GenericFlashSuit.java b/src/main/java/mc/duzo/timeless/suit/flash/generic/GenericFlashSuit.java index b945abae..362e101e 100644 --- a/src/main/java/mc/duzo/timeless/suit/flash/generic/GenericFlashSuit.java +++ b/src/main/java/mc/duzo/timeless/suit/flash/generic/GenericFlashSuit.java @@ -1,12 +1,11 @@ package mc.duzo.timeless.suit.flash.generic; import mc.duzo.animation.generic.AnimationInfo; -import mc.duzo.timeless.Timeless; import mc.duzo.timeless.power.PowerList; import mc.duzo.timeless.power.PowerRegistry; -import mc.duzo.timeless.suit.batman.sixer.client.model.Batman66Model; import mc.duzo.timeless.suit.client.ClientSuit; import mc.duzo.timeless.suit.client.render.SuitModel; +import mc.duzo.timeless.suit.client.render.generic.SteveSuitModel; import mc.duzo.timeless.suit.flash.FlashSuit; import mc.duzo.timeless.suit.set.SetRegistry; import mc.duzo.timeless.suit.set.SuitSet; @@ -21,7 +20,7 @@ // todo - i dont know any flash lore so this is just generic placeholder public class GenericFlashSuit extends FlashSuit { public GenericFlashSuit() { - super(new Identifier(Timeless.MOD_ID, "generic_flash"), PowerList.of(PowerRegistry.SUPER_SPEED)); + super("generic", PowerList.of(PowerRegistry.SUPER_SPEED)); } @Override @@ -37,7 +36,7 @@ protected ClientSuit createClient() { return new ClientSuit(this) { @Override public Supplier model() { - return Batman66Model::new; // TODO - create a flash model + return () -> new SteveSuitModel(this); } @Override diff --git a/src/main/resources/assets/timeless/textures/suit/flash_generic.png b/src/main/resources/assets/timeless/textures/suit/flash_generic.png new file mode 100644 index 0000000000000000000000000000000000000000..7f8918610cd6e76b3bcace49f95f5692b7493115 GIT binary patch literal 5774 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 M07*qoM6N<$g1;>n-~a#s literal 0 HcmV?d00001 From d4d35d7298c86dd4d1551a7684aaacaf9ed44233 Mon Sep 17 00:00:00 2001 From: James Hall Date: Sun, 6 Jul 2025 23:35:54 +0100 Subject: [PATCH 3/4] fix: generic suit models not copying poses --- .../client/render/generic/AlexSuitModel.java | 25 +++++++++++++++++++ .../client/render/generic/SteveSuitModel.java | 25 +++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/src/main/java/mc/duzo/timeless/suit/client/render/generic/AlexSuitModel.java b/src/main/java/mc/duzo/timeless/suit/client/render/generic/AlexSuitModel.java index f628a13a..40e48a02 100644 --- a/src/main/java/mc/duzo/timeless/suit/client/render/generic/AlexSuitModel.java +++ b/src/main/java/mc/duzo/timeless/suit/client/render/generic/AlexSuitModel.java @@ -6,6 +6,7 @@ import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.render.OverlayTexture; import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.entity.model.BipedEntityModel; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.LivingEntity; @@ -136,4 +137,28 @@ public ClientSuit getSuit() { public ModelPart getPart() { return root; } + + @Override + public void copyFrom(BipedEntityModel model) { + super.copyFrom(model); + + this.head.copyTransform(model.head); + this.body.copyTransform(model.body); + this.leftArm.copyTransform(model.leftArm); + this.leftLeg.copyTransform(model.leftLeg); + this.rightArm.copyTransform(model.rightArm); + this.rightLeg.copyTransform(model.rightLeg); + } + + @Override + public void copyTo(BipedEntityModel model) { + super.copyTo(model); + + model.head.copyTransform(this.head); + model.body.copyTransform(this.body); + model.leftArm.copyTransform(this.leftArm); + model.leftLeg.copyTransform(this.leftLeg); + model.rightArm.copyTransform(this.rightArm); + model.rightLeg.copyTransform(this.rightLeg); + } } diff --git a/src/main/java/mc/duzo/timeless/suit/client/render/generic/SteveSuitModel.java b/src/main/java/mc/duzo/timeless/suit/client/render/generic/SteveSuitModel.java index ccb286d8..303d10ee 100644 --- a/src/main/java/mc/duzo/timeless/suit/client/render/generic/SteveSuitModel.java +++ b/src/main/java/mc/duzo/timeless/suit/client/render/generic/SteveSuitModel.java @@ -6,6 +6,7 @@ import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.render.OverlayTexture; import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.entity.model.BipedEntityModel; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.EquipmentSlot; import net.minecraft.entity.LivingEntity; @@ -136,4 +137,28 @@ public ClientSuit getSuit() { public ModelPart getPart() { return root; } + + @Override + public void copyFrom(BipedEntityModel model) { + super.copyFrom(model); + + this.head.copyTransform(model.head); + this.body.copyTransform(model.body); + this.leftArm.copyTransform(model.leftArm); + this.leftLeg.copyTransform(model.leftLeg); + this.rightArm.copyTransform(model.rightArm); + this.rightLeg.copyTransform(model.rightLeg); + } + + @Override + public void copyTo(BipedEntityModel model) { + super.copyTo(model); + + model.head.copyTransform(this.head); + model.body.copyTransform(this.body); + model.leftArm.copyTransform(this.leftArm); + model.leftLeg.copyTransform(this.leftLeg); + model.rightArm.copyTransform(this.rightArm); + model.rightLeg.copyTransform(this.rightLeg); + } } From 77ecdf7f0b105492324751e987231f3deab3bd84 Mon Sep 17 00:00:00 2001 From: James Hall Date: Sun, 6 Jul 2025 23:46:01 +0100 Subject: [PATCH 4/4] feat: toggling super speed --- .../mc/duzo/timeless/power/PowerRegistry.java | 7 +-- .../duzo/timeless/power/impl/SpeedPower.java | 44 +++++++++++++++++++ src/main/java/mc/duzo/timeless/suit/Suit.java | 9 +--- 3 files changed, 47 insertions(+), 13 deletions(-) create mode 100644 src/main/java/mc/duzo/timeless/power/impl/SpeedPower.java diff --git a/src/main/java/mc/duzo/timeless/power/PowerRegistry.java b/src/main/java/mc/duzo/timeless/power/PowerRegistry.java index dff16e50..c41d62d7 100644 --- a/src/main/java/mc/duzo/timeless/power/PowerRegistry.java +++ b/src/main/java/mc/duzo/timeless/power/PowerRegistry.java @@ -45,12 +45,7 @@ public static T register(T entry) { }) .build().register(); public static Power SWIFT_SNEAK = Power.Builder.create(new Identifier(Timeless.MOD_ID, "swift_sneak")).build().register(); - public static Power SUPER_SPEED = Power.Builder.create(new Identifier(Timeless.MOD_ID, "super_speed")) - .tick(player -> { - if (player.getServer().getTicks() % 20 != 0) return; // Run every second - player.addStatusEffect(new StatusEffectInstance(StatusEffects.SPEED, 22, 10, false, false)); - }) - .build().register(); + public static Power SUPER_SPEED = new SpeedPower().register(); public static void init() {} } diff --git a/src/main/java/mc/duzo/timeless/power/impl/SpeedPower.java b/src/main/java/mc/duzo/timeless/power/impl/SpeedPower.java new file mode 100644 index 00000000..f2231e9b --- /dev/null +++ b/src/main/java/mc/duzo/timeless/power/impl/SpeedPower.java @@ -0,0 +1,44 @@ +package mc.duzo.timeless.power.impl; + +import mc.duzo.timeless.Timeless; +import mc.duzo.timeless.power.TogglePower; +import mc.duzo.timeless.suit.api.EquipSoundSupplier; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.sound.SoundEvent; +import net.minecraft.util.Identifier; + +import java.util.Optional; + +public class SpeedPower extends TogglePower { + public SpeedPower(String modid, String key) { + super(modid, key); + } + + public SpeedPower() { + this(Timeless.MOD_ID, "speed"); + } + + @Override + public void tick(ServerPlayerEntity player) { + if (player.getServer().getTicks() % 20 != 0) return; // Run every second + if (!this.getValue(player)) return; + player.addStatusEffect(new StatusEffectInstance(StatusEffects.SPEED, 22, 10, false, false)); + } + + @Override + protected Class getSuitClass() { + return EquipSoundSupplier.class; + } + + @Override + public Identifier getAnimation(boolean isOpening, EquipSoundSupplier suit) { + return null; + } + + @Override + public Optional getSound(EquipSoundSupplier suit) { + return Optional.empty(); + } +} diff --git a/src/main/java/mc/duzo/timeless/suit/Suit.java b/src/main/java/mc/duzo/timeless/suit/Suit.java index 231ee962..87eb9af7 100644 --- a/src/main/java/mc/duzo/timeless/suit/Suit.java +++ b/src/main/java/mc/duzo/timeless/suit/Suit.java @@ -5,6 +5,7 @@ import mc.duzo.timeless.datagen.provider.lang.Translatable; import mc.duzo.timeless.power.Power; import mc.duzo.timeless.power.PowerList; +import mc.duzo.timeless.suit.api.EquipSoundSupplier; import mc.duzo.timeless.suit.client.ClientSuit; import mc.duzo.timeless.suit.client.ClientSuitRegistry; import mc.duzo.timeless.suit.set.SuitSet; @@ -16,7 +17,7 @@ import java.util.Optional; -public abstract class Suit implements Identifiable, Translatable { +public abstract class Suit implements Identifiable, Translatable, EquipSoundSupplier { public static Optional findSuit(LivingEntity entity, EquipmentSlot slot) { if (!(entity.getEquippedStack(slot).getItem() instanceof SuitItem item)) return Optional.empty(); return Optional.ofNullable(item.getSuit()); @@ -37,12 +38,6 @@ public boolean hasPower(Power power) { return this.getPowers().contains(power); } public abstract SoundEvent getStepSound(); - public Optional getEquipSound() { - return Optional.empty(); - } - public Optional getUnequipSound() { - return Optional.empty(); - } /** * whether this suit is always visible on the player