From f4bffad81559a9b0f6fde05af30b1765816052c8 Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 1 Oct 2020 19:33:31 +0200 Subject: [PATCH] Players can now gain levels by doing things that use their mana --- .../unicopia/entity/player/MagicReserves.java | 2 +- .../unicopia/entity/player/ManaContainer.java | 33 ++++++++++++++++++- .../unicopia/entity/player/PlayerPhysics.java | 8 +++-- .../unicopia/entity/player/Pony.java | 24 +++++++++++++- 4 files changed, 61 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/MagicReserves.java b/src/main/java/com/minelittlepony/unicopia/entity/player/MagicReserves.java index e07928e4..07a746f6 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/MagicReserves.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/MagicReserves.java @@ -42,7 +42,7 @@ public interface MagicReserves { /** * Adds a percentage increment to this bar's current value */ - default void add(int step) { + default void add(float step) { set(get() + (step / getMax())); } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/ManaContainer.java b/src/main/java/com/minelittlepony/unicopia/entity/player/ManaContainer.java index df744f1c..edf64d0e 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/ManaContainer.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/ManaContainer.java @@ -9,12 +9,14 @@ public class ManaContainer implements MagicReserves { private final Bar energy; private final Bar exertion; private final Bar mana; + private final Bar xp; public ManaContainer(Pony pony) { this.pony = pony; this.energy = new BarInst(Pony.ENERGY, 100F); this.exertion = new BarInst(Pony.EXERTION, 10F); - this.mana = new BarInst(Pony.MANA, 100F); + this.xp = new BarInst(Pony.XP, 1); + this.mana = new XpCollectingBar(Pony.MANA, 100F); } @Override @@ -32,6 +34,35 @@ public class ManaContainer implements MagicReserves { return mana; } + public Bar getXp() { + return xp; + } + + class XpCollectingBar extends BarInst { + + XpCollectingBar(TrackedData marker, float max) { + super(marker, max); + } + + @Override + public void set(float value) { + float diff = value - get(); + if (diff < 0) { + if (pony.canLevelUp()) { + xp.add(-diff / (100 * (1 + pony.getCurrentLevel()))); + if (xp.getPercentFill() >= 1) { + pony.addLevels(1); + xp.set(0); + } + } + + value = get() + diff / (1 + pony.getCurrentLevel()); + } + + super.set(value); + } + } + class BarInst implements Bar { private final TrackedData marker; diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java index 39153083..5d1becee 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerPhysics.java @@ -106,10 +106,12 @@ public class PlayerPhysics extends EntityPhysics implements Tickable, Moti entity.fallDistance = 0; - if (ticksInAir > 100) { + int level = pony.getCurrentLevel() + 1; + + if (ticksInAir > (level * 100)) { Bar mana = pony.getMagicalReserves().getMana(); - mana.add((int)(-getHorizontalMotion(entity) * 50)); + mana.add((int)(-getHorizontalMotion(entity) * 50 / level)); if (mana.getPercentFill() < 0.2) { pony.getMagicalReserves().getExertion().add(2); @@ -156,7 +158,7 @@ public class PlayerPhysics extends EntityPhysics implements Tickable, Moti protected void moveFlying(Entity player, MutableVector velocity) { - float forward = 0.000015F * (float)Math.sqrt(getHorizontalMotion(player)); + float forward = 0.000015F * (1 + (pony.getCurrentLevel() / 10F)) * (float)Math.sqrt(getHorizontalMotion(player)); boolean sneak = !player.isSneaking(); // vertical drop due to gravity diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java index 2d419180..ff81ff1d 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -45,10 +45,13 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.network.packet.s2c.play.EntityPassengersSetS2CPacket; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvents; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; public class Pony implements Caster, Equine, Transmittable, Copieable { @@ -58,6 +61,9 @@ public class Pony implements Caster, Equine, Transmi static final TrackedData ENERGY = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.FLOAT); static final TrackedData EXERTION = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.FLOAT); static final TrackedData MANA = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.FLOAT); + static final TrackedData XP = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.FLOAT); + + static final TrackedData LEVEL = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.INTEGER); private static final TrackedData EFFECT = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.TAG_COMPOUND); private static final TrackedData HELD_EFFECT = DataTracker.registerData(PlayerEntity.class, TrackedDataHandlerRegistry.TAG_COMPOUND); @@ -92,6 +98,7 @@ public class Pony implements Caster, Equine, Transmi player.getDataTracker().startTracking(RACE, Race.HUMAN.ordinal()); player.getDataTracker().startTracking(EFFECT, new CompoundTag()); player.getDataTracker().startTracking(HELD_EFFECT, new CompoundTag()); + player.getDataTracker().startTracking(LEVEL, 0); } public static void registerAttributes(DefaultAttributeContainer.Builder builder) { @@ -293,6 +300,20 @@ public class Pony implements Caster, Equine, Transmi prevLanded = entity.isOnGround(); } + @Override + public void addLevels(int levels) { + if (levels > 0) { + mana.getMana().set(mana.getEnergy().getMax()); + entity.world.playSound(null, getOrigin(), SoundEvents.ENTITY_PLAYER_LEVELUP, SoundCategory.PLAYERS, 1, 2); + } + Caster.super.addLevels(levels); + } + + @Override + public int getMaxLevel() { + return 3; + } + public Optional onImpact(float distance, float damageMultiplier) { float g = gravity.getGravityModifier(); @@ -426,11 +447,12 @@ public class Pony implements Caster, Equine, Transmi @Override public int getCurrentLevel() { - return 0; + return entity.getDataTracker().get(LEVEL); } @Override public void setCurrentLevel(int level) { + entity.getDataTracker().set(LEVEL, MathHelper.clamp(level, 0, getMaxLevel())); } public boolean isClientPlayer() {