diff --git a/src/main/java/com/minelittlepony/unicopia/KeyBind.java b/src/main/java/com/minelittlepony/unicopia/KeyBind.java deleted file mode 100644 index b635ec58..00000000 --- a/src/main/java/com/minelittlepony/unicopia/KeyBind.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.minelittlepony.unicopia; - -public interface KeyBind { - String getKeyCategory(); - - String getKeyName(); - - int getKeyCode(); -} diff --git a/src/main/java/com/minelittlepony/unicopia/Unicopia.java b/src/main/java/com/minelittlepony/unicopia/Unicopia.java index c06e6340..1c609c44 100644 --- a/src/main/java/com/minelittlepony/unicopia/Unicopia.java +++ b/src/main/java/com/minelittlepony/unicopia/Unicopia.java @@ -7,7 +7,6 @@ import net.minecraft.resource.ResourceType; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import com.minelittlepony.unicopia.ability.Abilities; import com.minelittlepony.unicopia.advancement.BOHDeathCriterion; import com.minelittlepony.unicopia.block.UBlocks; import com.minelittlepony.unicopia.command.Commands; @@ -47,7 +46,6 @@ public class Unicopia implements ModInitializer { UContainers.bootstrap(); UStructures.bootstrap(); URecipes.bootstrap(); - Abilities.getInstance().init(); CriterionsRegistry.register(BOHDeathCriterion.INSTANCE); ResourceManagerHelper.get(ResourceType.SERVER_DATA).registerReloadListener(Pages.instance()); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java b/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java index 0e02eee0..9fe4ad2b 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/Abilities.java @@ -1,65 +1,36 @@ package com.minelittlepony.unicopia.ability; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import org.lwjgl.glfw.GLFW; -import com.minelittlepony.unicopia.Race; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.MutableRegistry; +import net.minecraft.util.registry.SimpleRegistry; -public final class Abilities { +public interface Abilities { + MutableRegistry KEYS_CODES = new SimpleRegistry<>(); + MutableRegistry> REGISTRY = new SimpleRegistry<>(); - private static final Abilities INSTANCE = new Abilities(); + // unicorn + Ability TELEPORT = register(new UnicornTeleportAbility(), "teleport", GLFW.GLFW_KEY_O); + Ability CAST = register(new UnicornCastingAbility(), "cast", GLFW.GLFW_KEY_P); - public static Abilities getInstance() { - return INSTANCE; - } + // earth + Ability GROW = register(new EarthPonyGrowAbility(), "grow", GLFW.GLFW_KEY_N); + Ability STOMP = register(new EarthPonyStompAbility(), "stomp", GLFW.GLFW_KEY_M); - private final Map>> keyToPowerMap = new HashMap<>(); + // pegasus + Ability CARRY = register(new PegasusCarryAbility(), "carry", GLFW.GLFW_KEY_K); + Ability CLOUD = register(new PegasusCloudInteractionAbility(), "cloud", GLFW.GLFW_KEY_J); - private final Map> powerNamesMap = new HashMap<>(); + // changeling + Ability FEED = register(new ChangelingFeedAbility(), "feed", GLFW.GLFW_KEY_O); + Ability TRAP = register(new ChangelingTrapAbility(), "trap", GLFW.GLFW_KEY_L); - private Abilities() { - } + Ability DISGUISE = register(new ChangelingDisguiseAbility(), "disguise", GLFW.GLFW_KEY_P); - public void init() { - register(new UnicornTeleportAbility()); - register(new UnicornCastingAbility()); - register(new EarthPonyGrowAbility()); - register(new ChangelingFeedAbility()); - register(new PegasusCarryAbility()); - register(new PegasusCloudInteractionAbility()); - register(new ChangelingTrapAbility()); - register(new EarthPonyStompAbility()); - register(new ChangelingDisguiseAbility()); - } - - public boolean hasRegisteredPower(int keyCode) { - return keyToPowerMap.containsKey(keyCode); - } - - public Optional> getCapablePowerFromKey(int keyCode, Race race) { - return getKeyCodePool(keyCode).stream() - .filter(power -> power.canUse(race)) - .findFirst(); - } - - public Optional> getPowerFromName(String name) { - return Optional.ofNullable(powerNamesMap.get(name)); - } - - private List> getKeyCodePool(int keyCode) { - return keyToPowerMap.computeIfAbsent(keyCode, ArrayList::new); - } - - public void register(Ability power) { - getKeyCodePool(power.getKeyCode()).add(power); - powerNamesMap.put(power.getKeyName(), power); - } - - public Collection> getValues() { - return powerNamesMap.values(); + static > T register(T power, String name, int keyCode) { + Identifier id = new Identifier("unicopia", name); + KEYS_CODES.add(id, keyCode); + return REGISTRY.add(id, power); } } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/Ability.java b/src/main/java/com/minelittlepony/unicopia/ability/Ability.java index 82db9179..4c61bec8 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/Ability.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/Ability.java @@ -2,21 +2,13 @@ package com.minelittlepony.unicopia.ability; import javax.annotation.Nullable; -import com.google.gson.annotations.Expose; -import com.minelittlepony.unicopia.KeyBind; import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.ability.data.Hit; import com.minelittlepony.unicopia.entity.player.Pony; -import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; -public interface Ability extends KeyBind { - - @Override - default String getKeyCategory() { - return "unicopia.category.name"; - } - +public interface Ability { /** * Returns the number of ticks the player must hold the ability key to trigger this ability. */ @@ -53,7 +45,7 @@ public interface Ability extends KeyBind { @Nullable T tryActivate(Pony player); - Class getPackageType(); + Hit.Serializer getSerializer(); /** * Called to actually apply the ability. @@ -75,48 +67,4 @@ public interface Ability extends KeyBind { * @param player The current player */ void postApply(Pony player); - - public interface IData { - - } - - class Pos implements Ability.IData { - @Expose - public int x; - - @Expose - public int y; - - @Expose - public int z; - - public Pos(int x, int y, int z) { - this.x = x; - this.y = y; - this.z = z; - } - - public Pos(BlockPos pos) { - x = pos.getX(); - y = pos.getY(); - z = pos.getZ(); - } - - public BlockPos pos() { - return new BlockPos(x, y, z); - } - } - - class Hit implements Ability.IData { - - } - - class Numeric implements IData { - @Expose - public int type; - - public Numeric(int t) { - type = t; - } - } } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/AbilityDelegate.java b/src/main/java/com/minelittlepony/unicopia/ability/AbilityDispatcher.java similarity index 60% rename from src/main/java/com/minelittlepony/unicopia/entity/player/AbilityDelegate.java rename to src/main/java/com/minelittlepony/unicopia/ability/AbilityDispatcher.java index a7a266b6..5461d3f0 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/AbilityDelegate.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/AbilityDispatcher.java @@ -1,18 +1,20 @@ -package com.minelittlepony.unicopia.entity.player; +package com.minelittlepony.unicopia.ability; + +import java.util.Optional; import javax.annotation.Nullable; -import com.minelittlepony.unicopia.ability.AbilityReceiver; -import com.minelittlepony.unicopia.ability.Ability; -import com.minelittlepony.unicopia.ability.Abilities; +import com.minelittlepony.unicopia.ability.data.Hit; import com.minelittlepony.unicopia.entity.Updatable; +import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.network.MsgPlayerAbility; import com.minelittlepony.unicopia.network.Channel; import com.minelittlepony.unicopia.util.NbtSerialisable; import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.Identifier; -class AbilityDelegate implements AbilityReceiver, Updatable, NbtSerialisable { +public class AbilityDispatcher implements Updatable, NbtSerialisable { private final Pony player; @@ -31,10 +33,9 @@ class AbilityDelegate implements AbilityReceiver, Updatable, NbtSerialisable { */ private boolean triggered; - @Nullable - private Ability activeAbility = null; + private Optional> activeAbility = Optional.empty(); - public AbilityDelegate(Pony player) { + public AbilityDispatcher(Pony player) { this.player = player; } @@ -42,53 +43,47 @@ class AbilityDelegate implements AbilityReceiver, Updatable, NbtSerialisable { * Returns true if the currrent ability can we swapped out. */ boolean canSwitchStates() { - return activeAbility == null || (warmup != 0) || (triggered && cooldown == 0); + return !activeAbility.isPresent() || (warmup != 0) || (triggered && cooldown == 0); } - @Override public void tryUseAbility(Ability power) { if (canSwitchStates()) { setAbility(power); } } - @Override public void tryClearAbility() { if (canSwitchStates()) { setAbility(null); } } - protected synchronized void setAbility(@Nullable Ability power) { - if (activeAbility != power) { + protected synchronized void setAbility(Ability power) { + if (activeAbility.orElse(null) != power) { triggered = false; - activeAbility = power; - warmup = power == null ? 0 : power.getWarmupTime(player); + activeAbility = Optional.ofNullable(power); + warmup = activeAbility.map(p -> p.getWarmupTime(player)).orElse(0); cooldown = 0; } } @Nullable - protected synchronized Ability getUsableAbility() { - if (!(activeAbility == null || (triggered && warmup == 0 && cooldown == 0)) && activeAbility.canUse(player.getSpecies())) { - return activeAbility; - } - return null; + protected synchronized Optional> getUsableAbility() { + return activeAbility.filter(ability -> { + return (triggered && warmup == 0 && cooldown == 0) && ability.canUse(player.getSpecies()); + }); } - @Override public int getRemainingCooldown() { return cooldown; } @Override public void onUpdate() { - Ability ability = getUsableAbility(); - - if (ability == null) { - return; - } + getUsableAbility().ifPresent(this::activate); + } + private void activate(Ability ability) { if (warmup > 0) { warmup--; ability.preApply(player); @@ -110,10 +105,10 @@ class AbilityDelegate implements AbilityReceiver, Updatable, NbtSerialisable { cooldown = ability.getCooldownTime(player); if (player.isClientPlayer()) { - Ability.IData data = ability.tryActivate(player); + T data = ability.tryActivate(player); if (data != null) { - Channel.PLAYER_ABILITY.send(new MsgPlayerAbility(ability, data)); + Channel.PLAYER_ABILITY.send(new MsgPlayerAbility<>(ability, data)); } else { cooldown = 0; } @@ -130,26 +125,16 @@ class AbilityDelegate implements AbilityReceiver, Updatable, NbtSerialisable { compound.putBoolean("triggered", triggered); compound.putInt("warmup", warmup); compound.putInt("cooldown", cooldown); - - Ability ability = getUsableAbility(); - - if (ability != null) { - compound.putString("activeAbility", ability.getKeyName()); - } + getUsableAbility().ifPresent(ability -> { + compound.putString("activeAbility", Abilities.REGISTRY.getId(ability).toString()); + }); } @Override public void fromNBT(CompoundTag compound) { - activeAbility = null; - triggered = compound.getBoolean("triggered"); warmup = compound.getInt("warmup"); cooldown = compound.getInt("cooldown"); - - if (compound.contains("activeAbility")) { - Abilities.getInstance() - .getPowerFromName(compound.getString("activeAbility")) - .ifPresent(p -> activeAbility = p); - } + activeAbility = Abilities.REGISTRY.getOrEmpty(new Identifier(compound.getString("activeAbility"))); } } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/AbilityReceiver.java b/src/main/java/com/minelittlepony/unicopia/ability/AbilityReceiver.java deleted file mode 100644 index 59842bdd..00000000 --- a/src/main/java/com/minelittlepony/unicopia/ability/AbilityReceiver.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.minelittlepony.unicopia.ability; - -import com.minelittlepony.unicopia.ability.Ability; - -public interface AbilityReceiver { - - void tryUseAbility(Ability power); - - void tryClearAbility(); - - int getRemainingCooldown(); -} diff --git a/src/main/java/com/minelittlepony/unicopia/ability/ChangelingDisguiseAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/ChangelingDisguiseAbility.java index 3b8bafcb..ca7688c4 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/ChangelingDisguiseAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/ChangelingDisguiseAbility.java @@ -3,9 +3,8 @@ package com.minelittlepony.unicopia.ability; import javax.annotation.Nullable; -import org.lwjgl.glfw.GLFW; - import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.ability.data.Hit; import com.minelittlepony.unicopia.entity.InAnimate; import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.magic.spell.DisguiseSpell; @@ -29,20 +28,10 @@ import net.minecraft.util.math.BlockPos; */ public class ChangelingDisguiseAbility extends ChangelingFeedAbility { - @Override - public String getKeyName() { - return "unicopia.power.disguise"; - } - - @Override - public int getKeyCode() { - return GLFW.GLFW_KEY_P; - } - @Nullable @Override public Hit tryActivate(Pony player) { - return new Hit(); + return Hit.INSTANCE; } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/ability/ChangelingFeedAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/ChangelingFeedAbility.java index f12ec0c7..e7a39afe 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/ChangelingFeedAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/ChangelingFeedAbility.java @@ -5,9 +5,8 @@ import java.util.stream.Collectors; import javax.annotation.Nullable; -import org.lwjgl.glfw.GLFW; - import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.ability.data.Hit; import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.particles.ParticleUtils; import com.minelittlepony.unicopia.particles.UParticles; @@ -30,17 +29,7 @@ import net.minecraft.particle.ParticleTypes; /** * Changeling ability to restore health from mobs */ -public class ChangelingFeedAbility implements Ability { - - @Override - public String getKeyName() { - return "unicopia.power.feed"; - } - - @Override - public int getKeyCode() { - return GLFW.GLFW_KEY_O; - } +public class ChangelingFeedAbility implements Ability { @Override public int getWarmupTime(Pony player) { @@ -62,7 +51,7 @@ public class ChangelingFeedAbility implements Ability { public Hit tryActivate(Pony player) { if (canFeed(player)) { if (!getTargets(player).isEmpty()) { - return new Hit(); + return Hit.INSTANCE; } } @@ -84,8 +73,8 @@ public class ChangelingFeedAbility implements Ability { } @Override - public Class getPackageType() { - return Hit.class; + public Hit.Serializer getSerializer() { + return Hit.SERIALIZER; } protected List getTargets(Pony player) { diff --git a/src/main/java/com/minelittlepony/unicopia/ability/ChangelingTrapAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/ChangelingTrapAbility.java index 17eb164e..7b4788b0 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/ChangelingTrapAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/ChangelingTrapAbility.java @@ -2,23 +2,12 @@ package com.minelittlepony.unicopia.ability; import javax.annotation.Nullable; -import org.lwjgl.glfw.GLFW; - import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.ability.data.Hit; import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.magic.spell.ChangelingTrapSpell; -public class ChangelingTrapAbility implements Ability { - - @Override - public String getKeyName() { - return "engulf"; - } - - @Override - public int getKeyCode() { - return GLFW.GLFW_KEY_L; - } +public class ChangelingTrapAbility implements Ability { @Override public int getWarmupTime(Pony player) { @@ -38,12 +27,12 @@ public class ChangelingTrapAbility implements Ability { @Nullable @Override public Hit tryActivate(Pony player) { - return new Hit(); + return Hit.INSTANCE; } @Override - public Class getPackageType() { - return Hit.class; + public Hit.Serializer getSerializer() { + return Hit.SERIALIZER; } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyGrowAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyGrowAbility.java index c17281cc..a7a31646 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyGrowAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyGrowAbility.java @@ -1,8 +1,8 @@ package com.minelittlepony.unicopia.ability; -import org.lwjgl.glfw.GLFW; - import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.ability.data.Hit; +import com.minelittlepony.unicopia.ability.data.Pos; import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.particles.MagicParticleEffect; import com.minelittlepony.unicopia.util.VecHelper; @@ -20,17 +20,7 @@ import net.minecraft.world.World; /** * Earth Pony ability to grow crops */ -public class EarthPonyGrowAbility implements Ability { - - @Override - public String getKeyName() { - return "unicopia.power.grow"; - } - - @Override - public int getKeyCode() { - return GLFW.GLFW_KEY_N; - } +public class EarthPonyGrowAbility implements Ability { @Override public int getWarmupTime(Pony player) { @@ -59,8 +49,8 @@ public class EarthPonyGrowAbility implements Ability { } @Override - public Class getPackageType() { - return Pos.class; + public Hit.Serializer getSerializer() { + return Pos.SERIALIZER; } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyStompAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyStompAbility.java index dec046f2..c1463ec1 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyStompAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/EarthPonyStompAbility.java @@ -2,13 +2,12 @@ package com.minelittlepony.unicopia.ability; import java.util.ArrayList; import java.util.List; -import org.lwjgl.glfw.GLFW; - import com.google.common.collect.Lists; -import com.google.gson.annotations.Expose; import com.minelittlepony.unicopia.AwaitTickQueue; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.TreeType; +import com.minelittlepony.unicopia.ability.data.Hit; +import com.minelittlepony.unicopia.ability.data.Multi; import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.util.MagicalDamageSource; import com.minelittlepony.unicopia.util.PosHelper; @@ -41,7 +40,7 @@ import net.minecraft.world.World; /** * Earth Pony stomping ability */ -public class EarthPonyStompAbility implements Ability { +public class EarthPonyStompAbility implements Ability { private final double rad = 4; @@ -50,16 +49,6 @@ public class EarthPonyStompAbility implements Ability 0) { - return new Data(pos.getX(), pos.getY(), pos.getZ(), 1); + return new Multi(pos.getX(), pos.getY(), pos.getZ(), 1); } } } if (!player.getOwner().onGround && !player.getOwner().abilities.flying) { player.getOwner().addVelocity(0, -6, 0); - return new Data(0, 0, 0, 0); + return new Multi(0, 0, 0, 0); } return null; } @Override - public Class getPackageType() { - return EarthPonyStompAbility.Data.class; + public Hit.Serializer getSerializer() { + return Multi.SERIALIZER; } public static BlockPos getSolidBlockBelow(BlockPos pos, World w) { @@ -116,7 +105,7 @@ public class EarthPonyStompAbility implements Ability { - - @Override - public String getKeyName() { - return "unicopia.power.carry"; - } - - @Override - public int getKeyCode() { - return GLFW.GLFW_KEY_K; - } +public class PegasusCarryAbility implements Ability { @Override public int getWarmupTime(Pony player) { @@ -45,7 +34,7 @@ public class PegasusCarryAbility implements Ability { @Override public Hit tryActivate(Pony player) { - return new Hit(); + return Hit.INSTANCE; } protected LivingEntity findRider(PlayerEntity player, World w) { @@ -61,8 +50,8 @@ public class PegasusCarryAbility implements Ability { } @Override - public Class getPackageType() { - return Hit.class; + public Hit.Serializer getSerializer() { + return Hit.SERIALIZER; } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/ability/PegasusCloudInteractionAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/PegasusCloudInteractionAbility.java index 3c980cb5..cd785ff0 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/PegasusCloudInteractionAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/PegasusCloudInteractionAbility.java @@ -2,9 +2,9 @@ package com.minelittlepony.unicopia.ability; import java.util.Optional; -import org.lwjgl.glfw.GLFW; - import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.ability.data.Hit; +import com.minelittlepony.unicopia.ability.data.Numeric; import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.particles.MagicParticleEffect; import com.minelittlepony.unicopia.particles.UParticles; @@ -12,17 +12,7 @@ import com.minelittlepony.unicopia.util.VecHelper; import net.minecraft.entity.Entity; -public class PegasusCloudInteractionAbility implements Ability { - - @Override - public String getKeyName() { - return "unicopia.power.cloud"; - } - - @Override - public int getKeyCode() { - return GLFW.GLFW_KEY_J; - } +public class PegasusCloudInteractionAbility implements Ability { @Override public int getWarmupTime(Pony player) { @@ -50,8 +40,8 @@ public class PegasusCloudInteractionAbility implements Ability } @Override - public Class getPackageType() { - return Numeric.class; + public Hit.Serializer getSerializer() { + return Numeric.SERIALIZER; } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/ability/UnicornCastingAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/UnicornCastingAbility.java index f2675071..5e734089 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/UnicornCastingAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/UnicornCastingAbility.java @@ -1,8 +1,7 @@ package com.minelittlepony.unicopia.ability; -import org.lwjgl.glfw.GLFW; - import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.ability.data.Hit; import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.magic.spell.ShieldSpell; import com.minelittlepony.unicopia.particles.MagicParticleEffect; @@ -11,17 +10,7 @@ import com.minelittlepony.unicopia.particles.MagicParticleEffect; * A magic casting ability for unicorns. * (only shields for now) */ -public class UnicornCastingAbility implements Ability { - - @Override - public String getKeyName() { - return "unicopia.power.magic"; - } - - @Override - public int getKeyCode() { - return GLFW.GLFW_KEY_P; - } +public class UnicornCastingAbility implements Ability { @Override public int getWarmupTime(Pony player) { @@ -40,12 +29,12 @@ public class UnicornCastingAbility implements Ability { @Override public Hit tryActivate(Pony player) { - return new Hit(); + return Hit.INSTANCE; } @Override - public Class getPackageType() { - return Hit.class; + public Hit.Serializer getSerializer() { + return Hit.SERIALIZER; } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/ability/UnicornTeleportAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/UnicornTeleportAbility.java index 7f40b5b2..6074b088 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/UnicornTeleportAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/UnicornTeleportAbility.java @@ -1,8 +1,8 @@ package com.minelittlepony.unicopia.ability; -import org.lwjgl.glfw.GLFW; - import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.ability.data.Hit; +import com.minelittlepony.unicopia.ability.data.Pos; import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.particles.MagicParticleEffect; import com.minelittlepony.unicopia.util.VecHelper; @@ -27,18 +27,7 @@ import net.minecraft.world.World; /** * Unicorn teleport ability */ -public class UnicornTeleportAbility implements Ability { - - @Override - public String getKeyName() { - return "unicopia.power.teleport"; - } - - @Override - public int getKeyCode() { - return GLFW.GLFW_KEY_O; - } - +public class UnicornTeleportAbility implements Ability { @Override public int getWarmupTime(Pony player) { return 20; @@ -107,11 +96,9 @@ public class UnicornTeleportAbility implements Ability { return new Pos(pos.getX(), pos.getY(), pos.getZ()); } - - @Override - public Class getPackageType() { - return Pos.class; + public Hit.Serializer getSerializer() { + return Pos.SERIALIZER; } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/ability/data/Hit.java b/src/main/java/com/minelittlepony/unicopia/ability/data/Hit.java new file mode 100644 index 00000000..f8beede9 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/ability/data/Hit.java @@ -0,0 +1,21 @@ +package com.minelittlepony.unicopia.ability.data; + +import net.minecraft.util.PacketByteBuf; + +public class Hit { + + public static final Hit INSTANCE = new Hit(); + public static final Serializer SERIALIZER = buf -> INSTANCE; + + protected Hit() { + + } + + public void toBuffer(PacketByteBuf buf) { + + } + + public interface Serializer { + T fromBuffer(PacketByteBuf buf); + } +} \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/ability/data/Multi.java b/src/main/java/com/minelittlepony/unicopia/ability/data/Multi.java new file mode 100644 index 00000000..27efad17 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/ability/data/Multi.java @@ -0,0 +1,25 @@ +package com.minelittlepony.unicopia.ability.data; + +import net.minecraft.util.PacketByteBuf; + +public class Multi extends Pos { + public static final Serializer SERIALIZER = Multi::new; + + public int hitType; + + Multi(PacketByteBuf buf) { + super(buf); + hitType = buf.readInt(); + } + + @Override + public void toBuffer(PacketByteBuf buf) { + super.toBuffer(buf); + buf.writeInt(hitType); + } + + public Multi(int x, int y, int z, int hit) { + super(x, y, z); + hitType = hit; + } +} \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/ability/data/Numeric.java b/src/main/java/com/minelittlepony/unicopia/ability/data/Numeric.java new file mode 100644 index 00000000..4f9d69ba --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/ability/data/Numeric.java @@ -0,0 +1,25 @@ +package com.minelittlepony.unicopia.ability.data; + +import com.google.gson.annotations.Expose; + +import net.minecraft.util.PacketByteBuf; + +public class Numeric extends Hit { + public static final Serializer SERIALIZER = Numeric::new; + + @Expose + public int type; + + Numeric(PacketByteBuf buf) { + type = buf.readInt(); + } + + @Override + public void toBuffer(PacketByteBuf buf) { + buf.writeInt(type); + } + + public Numeric(int t) { + type = t; + } +} \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/ability/data/Pos.java b/src/main/java/com/minelittlepony/unicopia/ability/data/Pos.java new file mode 100644 index 00000000..e8324563 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/ability/data/Pos.java @@ -0,0 +1,42 @@ +package com.minelittlepony.unicopia.ability.data; + +import net.minecraft.util.PacketByteBuf; +import net.minecraft.util.math.BlockPos; + +public class Pos extends Hit { + + public static final Serializer SERIALIZER = Pos::new; + + public int x; + public int y; + public int z; + + Pos(PacketByteBuf buf) { + x = buf.readInt(); + y = buf.readInt(); + z = buf.readInt(); + } + + @Override + public void toBuffer(PacketByteBuf buf) { + buf.writeInt(x); + buf.writeInt(y); + buf.writeInt(z); + } + + public Pos(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + } + + public Pos(BlockPos pos) { + x = pos.getX(); + y = pos.getY(); + z = pos.getZ(); + } + + public BlockPos pos() { + return new BlockPos(x, y, z); + } +} \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/client/KeyBindingsHandler.java b/src/main/java/com/minelittlepony/unicopia/client/KeyBindingsHandler.java index e7a33c46..3f4b56da 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/KeyBindingsHandler.java +++ b/src/main/java/com/minelittlepony/unicopia/client/KeyBindingsHandler.java @@ -1,10 +1,16 @@ package com.minelittlepony.unicopia.client; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; +import java.util.List; +import java.util.Map; import java.util.Set; -import com.minelittlepony.unicopia.KeyBind; import com.minelittlepony.unicopia.ability.Abilities; +import com.minelittlepony.unicopia.ability.Ability; +import com.minelittlepony.unicopia.ability.data.Hit; import com.minelittlepony.unicopia.entity.player.Pony; import net.fabricmc.fabric.api.client.keybinding.FabricKeyBinding; @@ -15,23 +21,31 @@ import net.minecraft.client.util.InputUtil; import net.minecraft.util.Identifier; class KeyBindingsHandler { - private final MinecraftClient client = MinecraftClient.getInstance(); + private final String KEY_CATEGORY = "unicopia.category.name"; + + private final Map>> keyPools = new HashMap<>(); private final Set bindings = new HashSet<>(); - private final Set removed = new HashSet<>(); private final Set pressed = new HashSet<>(); - public void addKeybind(KeyBind p) { - KeyBindingRegistry.INSTANCE.addCategory(p.getKeyCategory()); + private Collection> getKeyCodePool(KeyBinding keyCode) { + return keyPools.computeIfAbsent(keyCode, i -> new ArrayList<>()); + } - FabricKeyBinding b = FabricKeyBinding.Builder.create(new Identifier("unicopia", p.getKeyName()), InputUtil.Type.KEYSYM, p.getKeyCode(), p.getKeyCategory()).build(); + public void addKeybind(Ability p) { + KeyBindingRegistry.INSTANCE.addCategory(KEY_CATEGORY); + + Identifier id = Abilities.REGISTRY.getId(p); + int code = Abilities.KEYS_CODES.get(id); + + FabricKeyBinding b = FabricKeyBinding.Builder.create(id, InputUtil.Type.KEYSYM, code, KEY_CATEGORY).build(); KeyBindingRegistry.INSTANCE.register(b); - + getKeyCodePool(b).add(p); bindings.add(b); } - public void onKeyInput() { + public void tick(MinecraftClient client) { if (client.currentScreen != null || client.player == null) { return; @@ -42,22 +56,15 @@ class KeyBindingsHandler { if (i.isPressed()) { if (pressed.add(i)) { - if (!Abilities.getInstance().hasRegisteredPower(i.getDefaultKeyCode().getKeyCode())) { - removed.add(i); - System.out.println("Error: Keybinding(" + i.getLocalizedName() + ") does not have a registered pony power. Keybinding will be removed from event."); - } else { - Abilities.getInstance() - .getCapablePowerFromKey(i.getDefaultKeyCode().getKeyCode(), iplayer.getSpecies()) - .ifPresent(iplayer.getAbilities()::tryUseAbility); - } + getKeyCodePool(i) + .stream() + .filter(power -> power.canUse(iplayer.getSpecies())) + .findFirst() + .ifPresent(iplayer.getAbilities()::tryUseAbility); } } else if (pressed.remove(i)) { iplayer.getAbilities().tryClearAbility(); } } - - bindings.removeAll(removed); - pressed.removeAll(removed); - removed.clear(); } } diff --git a/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java b/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java index cf17c668..d3125f52 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java +++ b/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java @@ -45,7 +45,7 @@ public class UnicopiaClient implements ClientModInitializer { URenderers.bootstrap(); ClientTickCallback.EVENT.register(this::tick); - ClientReadyCallback.EVENT.register(client -> Abilities.getInstance().getValues().forEach(keyboard::addKeybind)); + ClientReadyCallback.EVENT.register(client -> Abilities.REGISTRY.stream().forEach(keyboard::addKeybind)); DefaultTexturesRegistry.getDefaultTextures().add(new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEX, SpellbookResultSlot.EMPTY_GEM_SLOT)); @@ -74,7 +74,7 @@ public class UnicopiaClient implements ClientModInitializer { } } - keyboard.onKeyInput(); + keyboard.tick(client); } private static int getLeavesColor(BlockState state, @Nullable BlockRenderView world, @Nullable BlockPos pos, int tint) { diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerImpl.java b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerImpl.java index 1e7e3cd1..2e58c38c 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerImpl.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerImpl.java @@ -4,7 +4,7 @@ import javax.annotation.Nullable; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.UTags; -import com.minelittlepony.unicopia.ability.AbilityReceiver; +import com.minelittlepony.unicopia.ability.AbilityDispatcher; import com.minelittlepony.unicopia.enchanting.PageOwner; import com.minelittlepony.unicopia.entity.FlightControl; import com.minelittlepony.unicopia.entity.Trap; @@ -54,7 +54,7 @@ public class PlayerImpl implements Pony { private final PlayerPageStats pageStates = new PlayerPageStats(); - private final AbilityDelegate powers = new AbilityDelegate(this); + private final AbilityDispatcher powers = new AbilityDispatcher(this); private final GravityDelegate gravity = new GravityDelegate(this); @@ -183,7 +183,7 @@ public class PlayerImpl implements Pony { } @Override - public AbilityReceiver getAbilities() { + public AbilityDispatcher getAbilities() { return powers; } 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 5add4417..ec838af0 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -3,7 +3,7 @@ package com.minelittlepony.unicopia.entity.player; import javax.annotation.Nullable; import com.minelittlepony.unicopia.InteractionManager; -import com.minelittlepony.unicopia.ability.AbilityReceiver; +import com.minelittlepony.unicopia.ability.AbilityDispatcher; import com.minelittlepony.unicopia.enchanting.PageOwner; import com.minelittlepony.unicopia.entity.FlightControl; import com.minelittlepony.unicopia.entity.Ponylike; @@ -30,7 +30,7 @@ public interface Pony extends Caster, RaceContainer, /** * Gets the player's magical abilities delegate responsible for all spell casting and persisting/updating. */ - AbilityReceiver getAbilities(); + AbilityDispatcher getAbilities(); /** * Gets the gravity delegate responsible for updating flight states diff --git a/src/main/java/com/minelittlepony/unicopia/network/Channel.java b/src/main/java/com/minelittlepony/unicopia/network/Channel.java index 23d1871c..8872d4c7 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/Channel.java +++ b/src/main/java/com/minelittlepony/unicopia/network/Channel.java @@ -12,7 +12,7 @@ import net.minecraft.util.PacketByteBuf; public interface Channel { - SPacketType PLAYER_ABILITY = clientToServer(new Identifier("unicopia", "player_ability"), MsgPlayerAbility::new); + SPacketType> PLAYER_ABILITY = clientToServer(new Identifier("unicopia", "player_ability"), MsgPlayerAbility::new); SPacketType REQUEST_CAPABILITIES = clientToServer(new Identifier("unicopia", "request_capabilities"), MsgRequestCapabilities::new); CPacketType PLAYER_CAPABILITIES = serverToClient(new Identifier("unicopia", "player_capabilities"), MsgPlayerCapabilities::new); diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerAbility.java b/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerAbility.java index 298d04db..b4ae6916 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerAbility.java @@ -1,53 +1,44 @@ package com.minelittlepony.unicopia.network; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.minelittlepony.unicopia.ability.Ability; +import com.minelittlepony.unicopia.ability.data.Hit; import com.minelittlepony.unicopia.ability.Abilities; import com.minelittlepony.unicopia.entity.player.Pony; import net.fabricmc.fabric.api.network.PacketContext; +import net.minecraft.util.Identifier; import net.minecraft.util.PacketByteBuf; -public class MsgPlayerAbility implements Channel.Packet { +public class MsgPlayerAbility implements Channel.Packet { - private static final Gson gson = new GsonBuilder() - .excludeFieldsWithoutExposeAnnotation() - .create(); + private final Ability power; - private final String powerIdentifier; + private final T data; - private final String abilityJson; - - MsgPlayerAbility(Ability power, Ability.IData data) { - powerIdentifier = power.getKeyName(); - abilityJson = gson.toJson(data, power.getPackageType()); + @SuppressWarnings("unchecked") + MsgPlayerAbility(PacketByteBuf buffer) { + power = (Ability) Abilities.REGISTRY.get(new Identifier(buffer.readString())); + data = power.getSerializer().fromBuffer(buffer); } - public MsgPlayerAbility(PacketByteBuf buffer) { - powerIdentifier = buffer.readString(); - abilityJson = buffer.readString(); + public MsgPlayerAbility(Ability power, T data) { + this.power = power; + this.data = data; } - private void apply(Ability power, PacketContext context) { + @Override + public void toBuffer(PacketByteBuf buffer) { + buffer.writeString(Abilities.REGISTRY.getId(power).toString()); + data.toBuffer(buffer); + } + + @Override + public void handle(PacketContext context) { Pony player = Pony.of(context.getPlayer()); if (player == null) { return; } - T data = gson.fromJson(abilityJson, power.getPackageType()); - power.apply(player, data); } - - @Override - public void toBuffer(PacketByteBuf buffer) { - buffer.writeString(powerIdentifier); - buffer.writeString(abilityJson); - } - - @Override - public void handle(PacketContext context) { - Abilities.getInstance().getPowerFromName(powerIdentifier).ifPresent(power -> apply(power, context)); - } }