Fixed Pixies interacting with pressure plates (Closes #1217) and Pixie trail particles.

This commit is contained in:
Forstride 2018-04-07 04:25:04 -04:00
parent d5ceebedab
commit 198d9da3d0
6 changed files with 132 additions and 30 deletions

View file

@ -19,6 +19,7 @@ import net.minecraftforge.fml.client.FMLClientHandler;
public class EntityPixieTrailFX extends Particle
{
private float defaultParticleScale;
public EntityPixieTrailFX(World world, double xCoordIn, double yCoordIn, double zCoordIn, double motionXIn, double motionYIn, double motionZIn)
{
@ -41,13 +42,13 @@ public class EntityPixieTrailFX extends Particle
this.motionZ += motionZIn;
this.particleScale *= 0.75F;
this.particleScale *= par14;
this.defaultParticleScale = this.particleScale;
this.particleMaxAge = (int)((8.0D / (Math.random() * 0.8D + 0.2D)) * 8);
this.particleMaxAge = (int)((float)this.particleMaxAge * par14);
this.particleAge = (particleMaxAge / 2) + (particleMaxAge / 2) * world.rand.nextInt(7);
this.particleAge = world.rand.nextInt(3);
this.particleAlpha = 1.0F;
this.particleRed = 1.0F;
this.particleGreen = 1.0F;
this.particleBlue = 1.0F;
this.particleGravity = 0.02F;
this.canCollide = false;
}
@Override
@ -61,10 +62,10 @@ public class EntityPixieTrailFX extends Particle
{
// EffectRenderer will by default bind the vanilla particles texture, override with our own
FMLClientHandler.instance().getClient().renderEngine.bindTexture(ClientProxy.particleTexturesLocation);
float scaleMultiplier = ((float)this.particleAge + partialTicks) / (float)this.particleMaxAge * 32.0F;
scaleMultiplier = MathHelper.clamp(scaleMultiplier, 0.0F, 1.0F);
this.particleScale = this.particleScale * scaleMultiplier;
this.particleScale = this.defaultParticleScale * scaleMultiplier;
GlStateManager.depthMask(false);
GlStateManager.enableBlend();
@ -74,13 +75,12 @@ public class EntityPixieTrailFX extends Particle
GlStateManager.disableBlend();
GlStateManager.depthMask(true);
}
@Override
public int getBrightnessForRender(float p_189214_1_)
{
float f = ((float)this.particleAge + p_189214_1_) / (float)this.particleMaxAge;
float f = (float)this.particleMaxAge - (((float)this.particleAge + p_189214_1_) / (float)this.particleMaxAge);
f = MathHelper.clamp(f, 0.0F, 1.0F);
int i = super.getBrightnessForRender(p_189214_1_);
int j = i & 255;
@ -107,7 +107,7 @@ public class EntityPixieTrailFX extends Particle
this.setExpired();
}
this.particleTextureIndexX = 7 - particleAge * 8 / particleMaxAge;
this.particleTextureIndexX = 7 - this.particleAge * 8 / this.particleMaxAge;
this.move(motionX, motionY, motionZ);
if (posY == prevPosY)
@ -120,12 +120,11 @@ public class EntityPixieTrailFX extends Particle
motionY *= 0.9599999785423279D;
motionZ *= 0.9599999785423279D;
if (this.onGround)
if (onGround)
{
motionX *= 0.699999988079071D;
motionZ *= 0.699999988079071D;
}
}
}

View file

@ -17,10 +17,14 @@ import biomesoplenty.api.item.BOPItems;
import biomesoplenty.api.particle.BOPParticleTypes;
import biomesoplenty.api.sound.BOPSounds;
import biomesoplenty.core.BiomesOPlenty;
import net.minecraft.entity.EntityFlying;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.Entity;
import net.minecraft.entity.MoverType;
import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.ai.EntityAIBase;
import net.minecraft.entity.ai.EntityMoveHelper;
import net.minecraft.entity.monster.IMob;
import net.minecraft.entity.passive.EntityAmbientCreature;
import net.minecraft.item.Item;
import net.minecraft.util.DamageSource;
import net.minecraft.util.EnumFacing;
@ -28,10 +32,9 @@ import net.minecraft.util.SoundEvent;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.EnumSkyBlock;
import net.minecraft.world.World;
public class EntityPixie extends EntityFlying implements IMob {
public class EntityPixie extends EntityAmbientCreature implements IMob {
public EntityPixie(World worldIn) {
super(worldIn);
@ -45,7 +48,7 @@ public class EntityPixie extends EntityFlying implements IMob {
protected void applyEntityAttributes()
{
super.applyEntityAttributes();
// TODO: get right value here this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(10.0D);
this.getEntityAttribute(SharedMonsterAttributes.MAX_HEALTH).setBaseValue(0.5D);
}
@Override
@ -70,14 +73,12 @@ public class EntityPixie extends EntityFlying implements IMob {
public void onLivingUpdate()
{
super.onLivingUpdate();
if (this.world.isRemote)
{
for (int i = 0; i < 7; i++)
if (world.rand.nextInt(2) == 0)
{
if (this.rand.nextInt(2)==0)
{
BiomesOPlenty.proxy.spawnParticle(BOPParticleTypes.PIXIETRAIL, this.posX + (this.rand.nextDouble()) * (double)this.width, this.posY + this.rand.nextDouble() * (double)this.height - 0.25D, this.posZ + (this.rand.nextDouble()) * (double)this.width);
}
BiomesOPlenty.proxy.spawnParticle(BOPParticleTypes.PIXIETRAIL, this.world, this.posX + (this.rand.nextDouble() - 0.5D) * (double)this.width, this.posY + this.rand.nextDouble() * (double)this.height, this.posZ + (this.rand.nextDouble() - 0.5D) * (double)this.width, 0.0D, 0.0D, 0.0D, new int[0]);
}
}
}
@ -106,10 +107,110 @@ public class EntityPixie extends EntityFlying implements IMob {
}
}
// TODO - move PixieMoveTargetPos and AIPixieRandomFly outside and implement in a more generic way, to be reused for pixie and wasp
@Override
public boolean canBePushed()
{
return false;
}
@Override
protected void collideWithEntity(Entity entityIn)
{
}
@Override
protected void collideWithNearbyEntities()
{
}
@Override
protected boolean canTriggerWalking()
{
return false;
}
@Override
public void fall(float distance, float damageMultiplier)
{
}
@Override
protected void updateFallState(double y, boolean onGroundIn, IBlockState state, BlockPos pos)
{
}
@Override
public boolean doesEntityNotTriggerPressurePlate()
{
return true;
}
@Override
public boolean isOnLadder()
{
return false;
}
@Override
public void travel(float strafe, float vertical, float forward)
{
if (this.isInWater())
{
this.moveRelative(strafe, vertical, forward, 0.02F);
this.move(MoverType.SELF, this.motionX, this.motionY, this.motionZ);
this.motionX *= 0.800000011920929D;
this.motionY *= 0.800000011920929D;
this.motionZ *= 0.800000011920929D;
}
else if (this.isInLava())
{
this.moveRelative(strafe, vertical, forward, 0.02F);
this.move(MoverType.SELF, this.motionX, this.motionY, this.motionZ);
this.motionX *= 0.5D;
this.motionY *= 0.5D;
this.motionZ *= 0.5D;
}
else
{
float f = 0.91F;
if (this.onGround)
{
BlockPos underPos = new BlockPos(MathHelper.floor(this.posX), MathHelper.floor(this.getEntityBoundingBox().minY) - 1, MathHelper.floor(this.posZ));
IBlockState underState = this.world.getBlockState(underPos);
f = underState.getBlock().getSlipperiness(underState, this.world, underPos, this) * 0.91F;
}
float f1 = 0.16277136F / (f * f * f);
this.moveRelative(strafe, vertical, forward, this.onGround ? 0.1F * f1 : 0.02F);
f = 0.91F;
if (this.onGround)
{
BlockPos underPos = new BlockPos(MathHelper.floor(this.posX), MathHelper.floor(this.getEntityBoundingBox().minY) - 1, MathHelper.floor(this.posZ));
IBlockState underState = this.world.getBlockState(underPos);
f = underState.getBlock().getSlipperiness(underState, this.world, underPos, this) * 0.91F;
}
this.move(MoverType.SELF, this.motionX, this.motionY, this.motionZ);
this.motionX *= (double)f;
this.motionY *= (double)f;
this.motionZ *= (double)f;
}
this.prevLimbSwingAmount = this.limbSwingAmount;
double d1 = this.posX - this.prevPosX;
double d0 = this.posZ - this.prevPosZ;
float f2 = MathHelper.sqrt(d1 * d1 + d0 * d0) * 4.0F;
if (f2 > 1.0F)
{
f2 = 1.0F;
}
this.limbSwingAmount += (f2 - this.limbSwingAmount) * 0.4F;
this.limbSwing += this.limbSwingAmount;
}
// Helper class representing a point in space that the pixie is targeting for some reason
class PixieMoveTargetPos

View file

@ -46,7 +46,7 @@ public class EntityMudball extends EntityThrowable
{
for (int i = 0; i < 8; ++i)
{
BiomesOPlenty.proxy.spawnParticle(BOPParticleTypes.MUD, this.posX, this.posY, this.posZ);
BiomesOPlenty.proxy.spawnParticle(BOPParticleTypes.MUD, this.world, this.posX, this.posY, this.posZ);
}
}
}

View file

@ -62,7 +62,7 @@ public class TrailsEventHandler
if (player.posX != player.prevPosX || player.posZ != player.prevPosZ) //Particles should only spawn if the player is moving
{
//Move the particle up by 0.01 on spawn to prevent z-fighting (the trail particles move down with time)
BiomesOPlenty.proxy.spawnParticle(BOPParticleTypes.PLAYER_TRAIL, player.posX + offsetX, ((int)player.posY) + groundYOffset + 0.01, player.posZ + offsetZ, trailName);
BiomesOPlenty.proxy.spawnParticle(BOPParticleTypes.PLAYER_TRAIL, world, player.posX + offsetX, ((int)player.posY) + groundYOffset + 0.01, player.posZ + offsetZ, trailName);
}
}
}

View file

@ -60,6 +60,7 @@ import net.minecraft.util.EnumParticleTypes;
import net.minecraft.util.NonNullList;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.World;
import net.minecraftforge.client.model.ModelDynBucket;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.common.ForgeModContainer;
@ -194,26 +195,26 @@ public class ClientProxy extends CommonProxy
}
});
}
@Override
public void spawnParticle(BOPParticleTypes type, double x, double y, double z, Object... info)
public void spawnParticle(BOPParticleTypes type, World parWorld, double x, double y, double z, Object... info)
{
Minecraft minecraft = Minecraft.getMinecraft();
Particle entityFx = null;
switch (type)
{
case PIXIETRAIL:
entityFx = new EntityPixieTrailFX(minecraft.world, x, y, z, MathHelper.nextDouble(minecraft.world.rand, -0.03, 0.03), -0.02D, MathHelper.nextDouble(minecraft.world.rand, -0.03, 0.03));
entityFx = new EntityPixieTrailFX(parWorld, x, y, z, MathHelper.nextDouble(parWorld.rand, -0.03, 0.03), -0.02D, MathHelper.nextDouble(parWorld.rand, -0.03, 0.03));
break;
case MUD:
int itemId = Item.getIdFromItem(BOPItems.mudball);
minecraft.world.spawnParticle(EnumParticleTypes.ITEM_CRACK, x, y, z, MathHelper.nextDouble(minecraft.world.rand, -0.08D, 0.08D), MathHelper.nextDouble(minecraft.world.rand, -0.08D, 0.08D), MathHelper.nextDouble(minecraft.world.rand, -0.08D, 0.08D), itemId);
minecraft.world.spawnParticle(EnumParticleTypes.ITEM_CRACK, x, y, z, MathHelper.nextDouble(parWorld.rand, -0.08D, 0.08D), MathHelper.nextDouble(parWorld.rand, -0.08D, 0.08D), MathHelper.nextDouble(parWorld.rand, -0.08D, 0.08D), itemId);
return;
case PLAYER_TRAIL:
if (info.length < 1)
throw new RuntimeException("Missing argument for trail name!");
entityFx = new EntityTrailFX(minecraft.world, x, y, z, (String)info[0]);
entityFx = new EntityTrailFX(parWorld, x, y, z, (String)info[0]);
break;
default:
break;

View file

@ -11,6 +11,7 @@ package biomesoplenty.core;
import biomesoplenty.api.particle.BOPParticleTypes;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.world.World;
public class CommonProxy
{
@ -20,6 +21,6 @@ public class CommonProxy
public void registerBlockSided(Block block) {}
public void registerItemSided(Item item) {}
public void registerFluidBlockRendering(Block block, String name) {}
public void spawnParticle(BOPParticleTypes type, double x, double y, double z, Object... info) {}
public void spawnParticle(BOPParticleTypes type, World parWorld, double x, double y, double z, Object... info) {}
public void replaceBOPBucketTexture() {}
}