From 56e380777036e769468963d9e2a9282e22261304 Mon Sep 17 00:00:00 2001 From: Sollace Date: Wed, 16 Aug 2023 20:55:38 +0100 Subject: [PATCH] Bat pony screech strength now scales to however long you hold the key down --- .../com/minelittlepony/unicopia/UTags.java | 1 + .../unicopia/ability/AbilityDispatcher.java | 1 + .../unicopia/ability/BatEeeeAbility.java | 61 +++++++++++++------ .../unicopia/advancement/UCriteria.java | 1 + .../unicopia/bat/extra_spooky.json | 29 +++++++++ .../tags/items/spooked_mob_drops.json | 6 ++ 6 files changed, 80 insertions(+), 19 deletions(-) create mode 100644 src/main/resources/data/unicopia/advancements/unicopia/bat/extra_spooky.json create mode 100644 src/main/resources/data/unicopia/tags/items/spooked_mob_drops.json diff --git a/src/main/java/com/minelittlepony/unicopia/UTags.java b/src/main/java/com/minelittlepony/unicopia/UTags.java index 7dd2d283..c93b4d5c 100644 --- a/src/main/java/com/minelittlepony/unicopia/UTags.java +++ b/src/main/java/com/minelittlepony/unicopia/UTags.java @@ -24,6 +24,7 @@ public interface UTags { TagKey SHADES = item("shades"); TagKey CHANGELING_EDIBLE = item("food_types/changeling_edible"); + TagKey SPOOKED_MOB_DROPS = item("spooked_mob_drops"); TagKey POLEARMS = item("polearms"); TagKey APPLE_SEEDS = item("apple_seeds"); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/AbilityDispatcher.java b/src/main/java/com/minelittlepony/unicopia/ability/AbilityDispatcher.java index 956d66f8..232fcfbf 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/AbilityDispatcher.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/AbilityDispatcher.java @@ -201,6 +201,7 @@ public class AbilityDispatcher implements Tickable, NbtSerialisable { if (player.isClientPlayer()) { Optional data = ability.prepare(player); + warmup = 0; if (data.isPresent()) { Channel.CLIENT_PLAYER_ABILITY.sendToServer(new MsgPlayerAbility<>(ability, data, ActivationType.NONE)); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/BatEeeeAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/BatEeeeAbility.java index 92659bd9..fb4269f8 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/BatEeeeAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/BatEeeeAbility.java @@ -6,6 +6,7 @@ import com.minelittlepony.unicopia.AwaitTickQueue; import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.USounds; +import com.minelittlepony.unicopia.UTags; import com.minelittlepony.unicopia.ability.data.Numeric; import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; import com.minelittlepony.unicopia.advancement.UCriteria; @@ -13,11 +14,13 @@ import com.minelittlepony.unicopia.client.render.PlayerPoser.Animation; import com.minelittlepony.unicopia.entity.Living; import com.minelittlepony.unicopia.entity.damage.UDamageTypes; import com.minelittlepony.unicopia.entity.player.Pony; +import com.minelittlepony.unicopia.util.RegistryUtils; import com.minelittlepony.unicopia.util.VecHelper; import net.minecraft.entity.LivingEntity; import net.minecraft.particle.ParticleTypes; -import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvents; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.random.Random; @@ -26,15 +29,17 @@ import net.minecraft.util.math.random.Random; * (only shields for now) */ public class BatEeeeAbility implements Ability { + public static final int SELF_SPOOK_PROBABILITY = 20000; + public static final int MOB_SPOOK_PROBABILITY = 1000; @Override public int getWarmupTime(Pony player) { - return 1; + return 30; } @Override public int getCooldownTime(Pony player) { - return 1; + return 5; } @Override @@ -42,6 +47,11 @@ public class BatEeeeAbility implements Ability { return 0; } + @Override + public boolean activateOnEarlyRelease() { + return true; + } + @Override public boolean canUse(Race race) { return race == Race.BAT; @@ -49,7 +59,10 @@ public class BatEeeeAbility implements Ability { @Override public Optional prepare(Pony player) { - return Numeric.of(1); + return player.getAbilities().getActiveStat() + .map(stat -> (int)(stat.getWarmup() * getWarmupTime(player))) + .filter(i -> i >= 0) + .map(Numeric::new); } @Override @@ -59,23 +72,26 @@ public class BatEeeeAbility implements Ability { @Override public boolean apply(Pony player, Numeric data) { + float strength = 1 - MathHelper.clamp(data.type() / (float)getWarmupTime(player), 0, 1); Random rng = player.asWorld().random; - int count = 1 + rng.nextInt(10); + int count = 1 + rng.nextInt(10) + (int)(strength * 10); for (int i = 0; i < count; i++) { - player.asWorld().playSound(null, player.getOrigin(), USounds.ENTITY_PLAYER_BATPONY_SCREECH, SoundCategory.PLAYERS, - 0.9F + (rng.nextFloat() - 0.5F) / 2F, + player.playSound(USounds.ENTITY_PLAYER_BATPONY_SCREECH, + (0.9F + (rng.nextFloat() - 0.5F) / 2F) * strength, 1.6F + (rng.nextFloat() - 0.5F) ); } - AwaitTickQueue.scheduleTask(player.asWorld(), w -> { - for (int i = 0; i < count; i++) { - player.asWorld().playSound(null, player.getOrigin(), USounds.ENTITY_PLAYER_BATPONY_SCREECH, SoundCategory.PLAYERS, - 0.9F + (rng.nextFloat() - 0.5F) / 2F, - 1.6F + (rng.nextFloat() - 0.5F) - ); + for (int j = 0; j < (int)(strength * 2); j++) { + for (int k = 0; k < count; k++) { + AwaitTickQueue.scheduleTask(player.asWorld(), w -> { + player.playSound(USounds.ENTITY_PLAYER_BATPONY_SCREECH, + (0.9F + (rng.nextFloat() - 0.5F) / 2F) * strength, + 1.6F + (rng.nextFloat() - 0.5F) + ); + }, rng.nextInt(3)); } - }, rng.nextInt(10)); + } if (!player.getPhysics().isFlying()) { player.setAnimation(Animation.SPREAD_WINGS, Animation.Recipient.ANYONE); @@ -83,20 +99,27 @@ public class BatEeeeAbility implements Ability { Vec3d origin = player.getOriginVector(); - if (rng.nextInt(20000) == 0) { + if (strength > 0.5F && rng.nextInt(SELF_SPOOK_PROBABILITY) == 0) { player.asEntity().damage(player.damageOf(UDamageTypes.BAT_SCREECH, player), 0.1F); UCriteria.SCREECH_SELF.trigger(player.asEntity()); } - int total = player.findAllEntitiesInRange(5).mapToInt(e -> { + int total = player.findAllEntitiesInRange((int)Math.max(1, 8 * strength)).mapToInt(e -> { if (e instanceof LivingEntity living && !SpellType.SHIELD.isOn(e)) { boolean isEarthPony = EquinePredicates.PLAYER_EARTH.test(e); e.damage(player.damageOf(UDamageTypes.BAT_SCREECH, player), isEarthPony ? 0.1F : 0.3F); + if (e.getWorld().random.nextInt(MOB_SPOOK_PROBABILITY) == 0) { + RegistryUtils.pickRandom(e.getWorld(), UTags.SPOOKED_MOB_DROPS).ifPresent(drop -> { + e.dropStack(drop.getDefaultStack()); + e.playSound(SoundEvents.ENTITY_ITEM_PICKUP, 1, 0.1F); + UCriteria.SPOOK_MOB.trigger(player.asEntity()); + }); + } - Vec3d knockVec = origin.subtract(e.getPos()); - living.takeKnockback(isEarthPony ? 0.3F : 0.5F, knockVec.getX(), knockVec.getZ()); + Vec3d knockVec = origin.subtract(e.getPos()).multiply(strength); + living.takeKnockback((isEarthPony ? 0.3F : 0.5F) * strength, knockVec.getX(), knockVec.getZ()); if (!isEarthPony) { - e.addVelocity(0, 0.1, 0); + e.addVelocity(0, 0.1 * strength, 0); } Living.updateVelocity(e); return 1; diff --git a/src/main/java/com/minelittlepony/unicopia/advancement/UCriteria.java b/src/main/java/com/minelittlepony/unicopia/advancement/UCriteria.java index 8243d39f..cb6697e0 100644 --- a/src/main/java/com/minelittlepony/unicopia/advancement/UCriteria.java +++ b/src/main/java/com/minelittlepony/unicopia/advancement/UCriteria.java @@ -13,6 +13,7 @@ public interface UCriteria { CustomEventCriterion.Trigger FEED_TRICK_APPLE = CUSTOM_EVENT.createTrigger("feed_trick_apple"); CustomEventCriterion.Trigger SCREECH_SELF = CUSTOM_EVENT.createTrigger("screech_self"); CustomEventCriterion.Trigger SCREECH_TWENTY_MOBS = CUSTOM_EVENT.createTrigger("screech_twenty_mobs"); + CustomEventCriterion.Trigger SPOOK_MOB = CUSTOM_EVENT.createTrigger("spook_mob"); CustomEventCriterion.Trigger SHED_FEATHER = CUSTOM_EVENT.createTrigger("shed_feather"); CustomEventCriterion.Trigger THROW_MUFFIN = CUSTOM_EVENT.createTrigger("throw_muffin"); CustomEventCriterion.Trigger SEND_OATS = CUSTOM_EVENT.createTrigger("send_oats"); diff --git a/src/main/resources/data/unicopia/advancements/unicopia/bat/extra_spooky.json b/src/main/resources/data/unicopia/advancements/unicopia/bat/extra_spooky.json new file mode 100644 index 00000000..9c992050 --- /dev/null +++ b/src/main/resources/data/unicopia/advancements/unicopia/bat/extra_spooky.json @@ -0,0 +1,29 @@ +{ + "parent": "unicopia:unicopia/bat/night_route", + "display": { + "icon": { + "item": "unicopia:sunglasses" + }, + "title": { + "translate": "advancements.unicopia.extra_spooky.title" + }, + "description": { + "translate": "advancements.unicopia.extra_spooky.description" + }, + "frame": "challenge", + "show_toast": true, + "announce_to_chat": true, + "hidden": true + }, + "criteria": { + "spook_extra_hard": { + "trigger": "unicopia:custom", + "conditions": { + "event": "super_scare_entity" + } + } + }, + "requirements": [ + [ "spook_extra_hard" ] + ] +} diff --git a/src/main/resources/data/unicopia/tags/items/spooked_mob_drops.json b/src/main/resources/data/unicopia/tags/items/spooked_mob_drops.json new file mode 100644 index 00000000..5bca236a --- /dev/null +++ b/src/main/resources/data/unicopia/tags/items/spooked_mob_drops.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "minecraft:brick" + ] +}