mirror of
https://github.com/Sollace/Unicopia.git
synced 2024-11-27 23:27:59 +01:00
Added caster utils to easily find magically enabled entities in the world, and make it easier to get out an effect of a given type
This commit is contained in:
parent
0ab3867b9d
commit
4ba567d5e5
7 changed files with 114 additions and 14 deletions
|
@ -97,9 +97,9 @@ public class EntitySpell extends EntityLiving implements IMagicals, ICaster<Enti
|
|||
|
||||
@Nullable
|
||||
@Override
|
||||
public IMagicEffect getEffect(boolean update) {
|
||||
return effectDelegate.get(update);
|
||||
}
|
||||
public <T extends IMagicEffect> T getEffect(@Nullable Class<T> type, boolean update) {
|
||||
return effectDelegate.get(type, update);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasEffect() {
|
||||
|
|
|
@ -55,9 +55,14 @@ public class EffectSync<T extends EntityLivingBase> {
|
|||
return effect != null;
|
||||
}
|
||||
|
||||
public IMagicEffect get(boolean update) {
|
||||
@SuppressWarnings("unchecked")
|
||||
public <E extends IMagicEffect> E get(Class<E> type, boolean update) {
|
||||
if (!update) {
|
||||
return effect;
|
||||
if (effect == null || type == null || type.isAssignableFrom(effect.getClass())) {
|
||||
return (E)effect;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
NBTTagCompound comp = owned.getEntity().getDataManager().get(param);
|
||||
|
@ -82,7 +87,11 @@ public class EffectSync<T extends EntityLivingBase> {
|
|||
}
|
||||
}
|
||||
|
||||
return effect;
|
||||
if (effect == null || type == null || type.isAssignableFrom(effect.getClass())) {
|
||||
return (E)effect;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public void set(@Nullable IMagicEffect effect) {
|
||||
|
|
|
@ -369,8 +369,8 @@ class PlayerCapabilities implements IPlayer {
|
|||
|
||||
@Nullable
|
||||
@Override
|
||||
public IMagicEffect getEffect(boolean update) {
|
||||
return effectDelegate.get(update);
|
||||
public <T extends IMagicEffect> T getEffect(@Nullable Class<T> type, boolean update) {
|
||||
return effectDelegate.get(type, update);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package com.minelittlepony.unicopia.render;
|
||||
|
||||
import com.minelittlepony.unicopia.player.IPlayer;
|
||||
import com.minelittlepony.unicopia.spell.IMagicEffect;
|
||||
import com.minelittlepony.unicopia.spell.SpellDisguise;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
|
@ -50,9 +49,9 @@ public class DisguiseRenderer {
|
|||
}
|
||||
|
||||
public boolean renderDisguiseToGui(IPlayer player) {
|
||||
IMagicEffect effect = player.getEffect(false);
|
||||
SpellDisguise effect = player.getEffect(SpellDisguise.class, false);
|
||||
|
||||
if (!(effect instanceof SpellDisguise) || effect.getDead()) {
|
||||
if (effect == null || effect.getDead()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -63,7 +62,7 @@ public class DisguiseRenderer {
|
|||
return false;
|
||||
}
|
||||
|
||||
Entity e = ((SpellDisguise)effect).getDisguise();
|
||||
Entity e = effect.getDisguise();
|
||||
|
||||
// Check for a disguise and render it in our place.
|
||||
if (e != null) {
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
package com.minelittlepony.unicopia.spell;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import com.minelittlepony.unicopia.Predicates;
|
||||
import com.minelittlepony.unicopia.player.PlayerSpeciesList;
|
||||
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
|
||||
public class CasterUtils {
|
||||
|
||||
public static Stream<ICaster<?>> findAllSpellsInRange(ICaster<?> source, double radius) {
|
||||
|
||||
BlockPos origin = source.getOrigin();
|
||||
|
||||
BlockPos begin = origin.add(-radius, -radius, -radius);
|
||||
BlockPos end = origin.add(radius, radius, radius);
|
||||
|
||||
AxisAlignedBB bb = new AxisAlignedBB(begin, end);
|
||||
|
||||
return source.getWorld().getEntitiesInAABBexcluding(source.getEntity(), bb, e ->
|
||||
!e.isDead && (e instanceof ICaster || e instanceof EntityPlayer)
|
||||
).stream().filter(e -> {
|
||||
double dist = e.getDistance(origin.getX(), origin.getY(), origin.getZ());
|
||||
double dist2 = e.getDistance(origin.getX(), origin.getY() - e.getEyeHeight(), origin.getZ());
|
||||
|
||||
return dist <= radius || dist2 <= radius;
|
||||
})
|
||||
.map(CasterUtils::toCaster)
|
||||
.filter(o -> o.isPresent() && o.get() != source)
|
||||
.map(Optional::get);
|
||||
}
|
||||
|
||||
static Stream<ICaster<?>> findAllSpellsInRange(ICaster<?> source, AxisAlignedBB bb) {
|
||||
return source.getWorld().getEntitiesInAABBexcluding(source.getEntity(), bb, e ->
|
||||
!e.isDead && (e instanceof ICaster || Predicates.MAGI.test(e))
|
||||
).stream()
|
||||
.map(CasterUtils::toCaster)
|
||||
.filter(o -> o.isPresent() && o.get() != source)
|
||||
.map(Optional::get);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
static <T extends IMagicEffect> Optional<T> toMagicEffect(Class<T> type, @Nullable Entity entity) {
|
||||
return toCaster(entity)
|
||||
.filter(ICaster::hasEffect)
|
||||
.map(caster -> caster.getEffect(type, false))
|
||||
.filter(e -> !e.getDead());
|
||||
}
|
||||
|
||||
static Optional<ICaster<?>> toCaster(@Nullable Entity entity) {
|
||||
|
||||
if (entity instanceof ICaster<?>) {
|
||||
return Optional.of((ICaster<?>)entity);
|
||||
}
|
||||
|
||||
if (entity instanceof EntityPlayer) {
|
||||
return Optional.of(PlayerSpeciesList.instance().getPlayer((EntityPlayer)entity));
|
||||
}
|
||||
|
||||
return Optional.empty();
|
||||
}
|
||||
}
|
|
@ -14,6 +14,7 @@ import com.minelittlepony.util.vector.VecHelper;
|
|||
|
||||
import net.minecraft.entity.Entity;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.util.math.AxisAlignedBB;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.World;
|
||||
|
@ -23,7 +24,12 @@ public interface ICaster<E extends EntityLivingBase> extends IOwned<E>, ILevelle
|
|||
void setEffect(@Nullable IMagicEffect effect);
|
||||
|
||||
@Nullable
|
||||
IMagicEffect getEffect(boolean update);
|
||||
default IMagicEffect getEffect(boolean update) {
|
||||
return getEffect(null, update);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
<T extends IMagicEffect> T getEffect(@Nullable Class<T> type, boolean update);
|
||||
|
||||
@Nullable
|
||||
default IMagicEffect getEffect() {
|
||||
|
@ -39,14 +45,23 @@ public interface ICaster<E extends EntityLivingBase> extends IOwned<E>, ILevelle
|
|||
return getOwner();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the unique id associated with this caste.
|
||||
*/
|
||||
default UUID getUniqueId() {
|
||||
return getEntity().getUniqueID();
|
||||
}
|
||||
|
||||
/**
|
||||
* gets the minecraft world
|
||||
*/
|
||||
default World getWorld() {
|
||||
return getEntity().getEntityWorld();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the center position where this caster is located.
|
||||
*/
|
||||
default BlockPos getOrigin() {
|
||||
return getEntity().getPosition();
|
||||
}
|
||||
|
@ -69,6 +84,14 @@ public interface ICaster<E extends EntityLivingBase> extends IOwned<E>, ILevelle
|
|||
}
|
||||
}
|
||||
|
||||
default Stream<ICaster<?>> findAllSpellsInRange(double radius) {
|
||||
return CasterUtils.findAllSpellsInRange(this, radius);
|
||||
}
|
||||
|
||||
default Stream<ICaster<?>> findAllSpellsInRange(AxisAlignedBB bb) {
|
||||
return CasterUtils.findAllSpellsInRange(this, bb);
|
||||
}
|
||||
|
||||
default Stream<Entity> findAllEntitiesInRange(double radius) {
|
||||
return VecHelper.findAllEntitiesInRange(getEntity(), getWorld(), getOrigin(), radius);
|
||||
}
|
||||
|
|
|
@ -32,7 +32,7 @@ public class VecHelper {
|
|||
Vec3d pos = e.getPositionEyes(partialTicks);
|
||||
Vec3d look = e.getLook(partialTicks).scale(distance);
|
||||
|
||||
return e.world.rayTraceBlocks(pos, pos.add(look), false, false, true);
|
||||
return e.getEntityWorld().rayTraceBlocks(pos, pos.add(look), false, false, true);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in a new issue