From 5e331016ff7f1072d88c4c5e6cf97a856a02ed91 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sun, 4 Oct 2020 12:58:01 +0200 Subject: [PATCH] A bit of cleanup --- .../unicopia/EquinePredicates.java | 3 ++ .../ability/ChangelingFeedAbility.java | 2 +- .../unicopia/ability/magic/Caster.java | 14 +------ .../unicopia/ability/magic/CasterUtils.java | 39 ++++--------------- .../ability/magic/ThrowableSpell.java | 2 +- .../ability/magic/spell/AttractiveSpell.java | 6 +-- .../ability/magic/spell/FireSpell.java | 5 +-- .../ability/magic/spell/IceSpell.java | 4 +- .../ability/magic/spell/NecromancySpell.java | 4 +- .../ability/magic/spell/ScorchSpell.java | 2 +- .../unicopia/client/UnicopiaClient.java | 16 ++++++++ .../entity/player/PlayerAttributes.java | 1 + .../mixin/client/MixinGameRenderer.java | 11 ++---- .../mixin/client/MixinKeyboardInput.java | 2 +- .../unicopia/mixin/client/MixinMouse.java | 2 +- .../unicopia/util/VecHelper.java | 20 +++++----- 16 files changed, 52 insertions(+), 81 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java b/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java index 17c42732..a00d7111 100644 --- a/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java +++ b/src/main/java/com/minelittlepony/unicopia/EquinePredicates.java @@ -2,6 +2,7 @@ package com.minelittlepony.unicopia; import java.util.function.Predicate; +import com.minelittlepony.unicopia.ability.magic.Caster; import com.minelittlepony.unicopia.ability.magic.Spell; import com.minelittlepony.unicopia.entity.Equine; import com.minelittlepony.unicopia.entity.player.Pony; @@ -20,6 +21,8 @@ public interface EquinePredicates { Predicate PLAYER_CHANGELING = IS_PLAYER.and(entity -> Equine.of(entity).getSpecies() == Race.CHANGELING); Predicate PLAYER_PEGASUS = IS_PLAYER.and(entity -> ((PlayerEntity)entity).abilities.creativeMode || RACE_INTERACT_WITH_CLOUDS.test(entity)); + Predicate IS_CASTER = e -> !e.removed && (e instanceof Caster || PLAYER_UNICORN.test(e)); + static Predicate carryingSpell(Class type) { return IS_PLAYER.and(entity -> Pony.of((PlayerEntity)entity).getSpellOrEmpty(type, false).isPresent()); } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/ChangelingFeedAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/ChangelingFeedAbility.java index b7101ede..13fa157b 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/ChangelingFeedAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/ChangelingFeedAbility.java @@ -79,7 +79,7 @@ public class ChangelingFeedAbility implements Ability { } protected List getTargets(Pony player) { - List list = VecHelper.getWithinReach(player.getOwner(), 3, this::canDrain); + List list = VecHelper.findInReach(player.getOwner(), 3, this::canDrain); RayTraceHelper.findEntity(player.getOwner(), 17, 1, looked -> looked instanceof LivingEntity && !list.contains(looked) && canDrain(looked)) diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/Caster.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/Caster.java index fd2900fb..6c10cd74 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/Caster.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/Caster.java @@ -14,7 +14,6 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.damage.DamageSource; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; import net.minecraft.world.World; /** @@ -89,13 +88,6 @@ public interface Caster extends Owned, Levelled, Affi return getWorld().isClient(); } - /** - * Returns true if we're executing on the server. - */ - default boolean isLocal() { - return !isClient(); - } - /** * Gets the center position where this caster is located. */ @@ -112,11 +104,7 @@ public interface Caster extends Owned, Levelled, Affi return CasterUtils.findInRange(this, radius); } - default Stream> findAllSpellsInRange(Box bb) { - return CasterUtils.findInRange(this, bb); - } - default Stream findAllEntitiesInRange(double radius) { - return VecHelper.findAllEntitiesInRange(getEntity(), getWorld(), getOrigin(), radius); + return VecHelper.findInRange(getEntity(), getWorld(), getOrigin(), radius, null).stream(); } } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/CasterUtils.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/CasterUtils.java index 7ed4a1af..350029f6 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/CasterUtils.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/CasterUtils.java @@ -7,44 +7,21 @@ import javax.annotation.Nullable; import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.entity.PonyContainer; +import com.minelittlepony.unicopia.util.VecHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; public class CasterUtils { /** - * Finds all surrounding spells withing range from the given caster. + * Finds all surrounding spells within range from the given caster. */ - public static Stream> findInRange(Caster source, double radius) { - - BlockPos origin = source.getOrigin(); - - BlockPos begin = origin.add(-radius, -radius, -radius); - BlockPos end = origin.add(radius, radius, radius); - - Box bb = new Box(begin, end); - - return source.getWorld().getOtherEntities(source.getEntity(), bb, e -> - !e.removed && (e instanceof Caster || e instanceof PlayerEntity) - ).stream().filter(e -> { - double dist = e.squaredDistanceTo(origin.getX(), origin.getY(), origin.getZ()); - double dist2 = e.squaredDistanceTo(origin.getX(), origin.getY() - e.getStandingEyeHeight(), origin.getZ()); - - return dist <= radius || dist2 <= radius; - }) - .map(CasterUtils::toCaster) - .filter(o -> o.isPresent() && o.get() != source) - .map(Optional::get); - } - - static Stream> findInRange(Caster source, Box bb) { - return source.getWorld().getOtherEntities(source.getEntity(), bb, e -> !e.removed && (e instanceof Caster || EquinePredicates.PLAYER_UNICORN.test(e))).stream() - .map(CasterUtils::toCaster) - .filter(o -> o.isPresent() && o.get() != source) - .map(Optional::get); + static Stream> findInRange(Caster source, double radius) { + return VecHelper.findInRange(source.getEntity(), source.getWorld(), source.getOrigin(), radius, EquinePredicates.IS_CASTER) + .stream() + .map(e -> toCaster(e).filter(o -> o != source)) + .filter(Optional::isPresent) + .map(Optional::get); } /** diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/ThrowableSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/ThrowableSpell.java index 46371197..8db0b922 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/ThrowableSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/ThrowableSpell.java @@ -65,7 +65,7 @@ public interface ThrowableSpell extends Spell { world.playSound(null, entity.getX(), entity.getY(), entity.getZ(), getThrowSound(caster), SoundCategory.NEUTRAL, 0.7F, 0.4F / (world.random.nextFloat() * 0.4F + 0.8F)); - if (caster.isLocal()) { + if (!caster.isClient()) { Projectile projectile = new MagicProjectileEntity(UEntities.THROWN_ITEM, world, caster.getOwner()); projectile.setItem(getCastAppearance(caster)); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/AttractiveSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/AttractiveSpell.java index fcf8f20b..75e3f2e3 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/AttractiveSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/AttractiveSpell.java @@ -1,8 +1,6 @@ package com.minelittlepony.unicopia.ability.magic.spell; import java.util.List; -import java.util.stream.Collectors; - import javax.annotation.Nullable; import com.minelittlepony.unicopia.Affinity; @@ -61,9 +59,7 @@ public class AttractiveSpell extends ShieldSpell { protected List getTargets(Caster source, double radius) { if (homingPos != null) { - return VecHelper.findAllEntitiesInRange(source.getEntity(), source.getWorld(), source.getOrigin(), radius) - .filter(i -> i instanceof ItemEntity) - .collect(Collectors.toList()); + return VecHelper.findInRange(source.getEntity(), source.getWorld(), source.getOrigin(), radius, i -> i instanceof ItemEntity); } return super.getTargets(source, radius); diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/FireSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/FireSpell.java index 418f94f3..bb72cb42 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/FireSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/FireSpell.java @@ -122,10 +122,7 @@ public class FireSpell extends AbstractRangedAreaSpell { } protected boolean applyEntities(Entity owner, World world, BlockPos pos) { - return VecHelper - .findAllEntitiesInRange(owner, world, pos, 3) - .filter(i -> applyEntitySingle(owner, world, i)) - .count() > 0; + return !VecHelper.findInRange(owner, world, pos, 3, i -> applyEntitySingle(owner, world, i)).isEmpty(); } protected boolean applyEntitySingle(Entity owner, World world, Entity e) { diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/IceSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/IceSpell.java index 7bc93eab..3773816a 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/IceSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/IceSpell.java @@ -57,9 +57,7 @@ public class IceSpell extends AbstractRangedAreaSpell { } protected boolean applyEntities(LivingEntity owner, World world, BlockPos pos) { - return VecHelper.findAllEntitiesInRange(owner, world, pos, 3).filter(i -> - applyEntitySingle(owner, i) - ).count() > 0; + return !VecHelper.findInRange(owner, world, pos, 3, i -> applyEntitySingle(owner, i)).isEmpty(); } protected boolean applyEntitySingle(LivingEntity owner, Entity e) { diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/NecromancySpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/NecromancySpell.java index 9c9714a9..044363c4 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/NecromancySpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/NecromancySpell.java @@ -62,9 +62,7 @@ public class NecromancySpell extends AbstractRangedAreaSpell { Vec3d origin = source.getOriginVector(); - if (VecHelper.findAllEntitiesInRange(source.getEntity(), source.getWorld(), source.getOrigin(), radius * 4) - .filter(e -> e instanceof ZombieEntity) - .count() >= 10 * (1 + additional)) { + if (VecHelper.findInRange(source.getEntity(), source.getWorld(), source.getOrigin(), radius * 4, e -> e instanceof ZombieEntity).size() >= 10 * (1 + additional)) { return true; } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/ScorchSpell.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/ScorchSpell.java index 37ba9fc5..264dbd77 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/ScorchSpell.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/ScorchSpell.java @@ -79,7 +79,7 @@ public class ScorchSpell extends FireSpell implements ThrowableSpell { @Override public void onImpact(Caster caster, BlockPos pos, BlockState state) { - if (caster.isLocal()) { + if (!caster.isClient()) { caster.getWorld().createExplosion(caster.getOwner(), pos.getX(), pos.getY(), pos.getZ(), 2, DestructionType.DESTROY); } } diff --git a/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java b/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java index 7d20bc73..cd558fad 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java +++ b/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java @@ -1,21 +1,37 @@ package com.minelittlepony.unicopia.client; +import java.util.Optional; + import com.minelittlepony.common.client.gui.element.Cycler; import com.minelittlepony.common.event.ScreenInitCallback; import com.minelittlepony.common.event.ScreenInitCallback.ButtonList; import com.minelittlepony.unicopia.InteractionManager; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Unicopia; +import com.minelittlepony.unicopia.entity.player.PlayerCamera; +import com.minelittlepony.unicopia.entity.player.Pony; + import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.world.CreateWorldScreen; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.math.MathHelper; public class UnicopiaClient implements ClientModInitializer { + public static Optional getCamera() { + PlayerEntity player = MinecraftClient.getInstance().player; + + if (player != null && MinecraftClient.getInstance().cameraEntity == player) { + return Optional.of(Pony.of(player).getCamera()); + } + + return Optional.empty(); + } + public static Race getPreferredRace() { if (!Unicopia.getConfig().ignoresMineLittlePony() && MinecraftClient.getInstance().player != null) { diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerAttributes.java b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerAttributes.java index c3e786a9..d65c8762 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerAttributes.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerAttributes.java @@ -3,6 +3,7 @@ package com.minelittlepony.unicopia.entity.player; import java.util.UUID; import com.minelittlepony.unicopia.Race; + import net.minecraft.entity.attribute.ClampedEntityAttribute; import net.minecraft.entity.attribute.EntityAttribute; import net.minecraft.entity.attribute.EntityAttributeInstance; diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinGameRenderer.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinGameRenderer.java index ddc73112..f9670470 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinGameRenderer.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinGameRenderer.java @@ -8,13 +8,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.minelittlepony.unicopia.EquinePredicates; import com.minelittlepony.unicopia.client.UnicopiaClient; -import com.minelittlepony.unicopia.client.render.WorldRenderDelegate; -import com.minelittlepony.unicopia.entity.player.Pony; - -import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.Camera; import net.minecraft.client.render.GameRenderer; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.util.math.Vector3f; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.resource.SynchronousResourceReloadListener; @@ -25,15 +22,13 @@ abstract class MixinGameRenderer implements AutoCloseable, SynchronousResourceRe at = @At("RETURN"), cancellable = true) private void onGetFov(Camera camera, float f, boolean z, CallbackInfoReturnable info) { - info.setReturnValue(Pony.of(MinecraftClient.getInstance().player) - .getCamera() - .calculateFieldOfView(info.getReturnValue())); + UnicopiaClient.getCamera().ifPresent(c -> info.setReturnValue(c.calculateFieldOfView(info.getReturnValue()))); } @Inject(method = "renderWorld(FJLnet/minecraft/client/util/math/MatrixStack;)V", at = @At("HEAD")) private void onRenderWorld(float tickDelta, long limitTime, MatrixStack matrices, CallbackInfo info) { - WorldRenderDelegate.INSTANCE.applyWorldTransform(matrices, tickDelta); + UnicopiaClient.getCamera().ifPresent(c -> matrices.multiply(Vector3f.POSITIVE_Z.getDegreesQuaternion(c.calculateRoll()))); } @Inject(method = "getNightVisionStrength(Lnet/minecraft/entity/LivingEntity;F)F", diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinKeyboardInput.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinKeyboardInput.java index 1d35bc4a..21373a90 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinKeyboardInput.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinKeyboardInput.java @@ -17,7 +17,7 @@ abstract class MixinKeyboardInput extends Input { private void onTick(boolean strafe, CallbackInfo info) { Pony player = Pony.of(MinecraftClient.getInstance().player); - if (player.getPhysics().isGravityNegative()) { + if (player != null && player.getPhysics().isGravityNegative()) { boolean tmp = pressingLeft; pressingLeft = pressingRight; diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinMouse.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinMouse.java index 6bcdf6ec..3d01a795 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinMouse.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinMouse.java @@ -21,7 +21,7 @@ abstract class MixinMouse { @Inject(method = "updateMouse()V", at = @At("HEAD")) private void onUpdateMouse(CallbackInfo info) { Pony player = Pony.of(MinecraftClient.getInstance().player); - if (player != null&& player.getPhysics().isGravityNegative()) { + if (player != null && player.getPhysics().isGravityNegative()) { cursorDeltaX = -cursorDeltaX; cursorDeltaY = -cursorDeltaY; } diff --git a/src/main/java/com/minelittlepony/unicopia/util/VecHelper.java b/src/main/java/com/minelittlepony/unicopia/util/VecHelper.java index 546ba8d6..71bdba5d 100644 --- a/src/main/java/com/minelittlepony/unicopia/util/VecHelper.java +++ b/src/main/java/com/minelittlepony/unicopia/util/VecHelper.java @@ -2,8 +2,6 @@ package com.minelittlepony.unicopia.util; import java.util.List; import java.util.function.Predicate; -import java.util.stream.Stream; - import javax.annotation.Nullable; import net.minecraft.entity.Entity; @@ -14,19 +12,23 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; public interface VecHelper { - static Stream findAllEntitiesInRange(@Nullable Entity origin, World w, BlockPos pos, double radius) { - return w.getOtherEntities(origin, new Box(pos).expand(radius), e -> { - double dist = Math.sqrt(e.squaredDistanceTo(pos.getX(), pos.getY(), pos.getZ())); - double dist2 = Math.sqrt(e.squaredDistanceTo(pos.getX(), pos.getY() - e.getStandingEyeHeight(), pos.getZ())); - return dist <= radius || dist2 <= radius; - }).stream(); + static Predicate inRange(BlockPos center, double range) { + double rad = Math.pow(range, 2); + return e -> { + return e.squaredDistanceTo(center.getX(), center.getY(), center.getZ()) <= rad + || e.squaredDistanceTo(center.getX(), center.getY() - e.getStandingEyeHeight(), center.getZ()) <= rad; + }; + } + + static List findInRange(@Nullable Entity origin, World w, BlockPos pos, double radius, @Nullable Predicate predicate) { + return w.getOtherEntities(origin, new Box(pos).expand(radius), predicate == null ? inRange(pos, radius) : inRange(pos, radius).and(predicate)); } /** * Gets all entities within a given range from the player. */ - static List getWithinReach(PlayerEntity player, double reach, @Nullable Predicate predicate) { + static List findInReach(PlayerEntity player, double reach, @Nullable Predicate predicate) { Vec3d look = player.getCameraPosVec(1).multiply(reach); return player.world.getOtherEntities(player, player