diff --git a/src/main/java/mc/duzo/timeless/power/PowerRegistry.java b/src/main/java/mc/duzo/timeless/power/PowerRegistry.java index 1ae09a3b..c41d62d7 100644 --- a/src/main/java/mc/duzo/timeless/power/PowerRegistry.java +++ b/src/main/java/mc/duzo/timeless/power/PowerRegistry.java @@ -45,6 +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 = 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 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..362e101e --- /dev/null +++ b/src/main/java/mc/duzo/timeless/suit/flash/generic/GenericFlashSuit.java @@ -0,0 +1,54 @@ +package mc.duzo.timeless.suit.flash.generic; + +import mc.duzo.animation.generic.AnimationInfo; +import mc.duzo.timeless.power.PowerList; +import mc.duzo.timeless.power.PowerRegistry; +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; +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("generic", 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 () -> new SteveSuitModel(this); + } + + @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)); } } 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 00000000..7f891861 Binary files /dev/null and b/src/main/resources/assets/timeless/textures/suit/flash_generic.png differ