Properly sync thrower field for all throwable projectiles, fixes #42 (does not fix vanilla throwables though)
This commit is contained in:
@@ -4,7 +4,6 @@ import io.netty.buffer.ByteBuf;
|
|||||||
import net.minecraft.entity.EntityLivingBase;
|
import net.minecraft.entity.EntityLivingBase;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Same as {@link EntityMagicProjectile}, but with an additional blast multiplier field which is synced and saved to
|
* Same as {@link EntityMagicProjectile}, but with an additional blast multiplier field which is synced and saved to
|
||||||
@@ -13,7 +12,7 @@ import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData;
|
|||||||
* @author Electroblob
|
* @author Electroblob
|
||||||
* @since Wizardry 1.2
|
* @since Wizardry 1.2
|
||||||
*/
|
*/
|
||||||
public abstract class EntityBomb extends EntityMagicProjectile implements IEntityAdditionalSpawnData {
|
public abstract class EntityBomb extends EntityMagicProjectile {
|
||||||
|
|
||||||
/** The entity blast multiplier. This is now synced and saved centrally from {@link EntityBomb}. */
|
/** The entity blast multiplier. This is now synced and saved centrally from {@link EntityBomb}. */
|
||||||
public float blastMultiplier = 1.0f;
|
public float blastMultiplier = 1.0f;
|
||||||
@@ -37,11 +36,13 @@ public abstract class EntityBomb extends EntityMagicProjectile implements IEntit
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeSpawnData(ByteBuf buffer){
|
public void writeSpawnData(ByteBuf buffer){
|
||||||
|
super.writeSpawnData(buffer);
|
||||||
buffer.writeFloat(blastMultiplier);
|
buffer.writeFloat(blastMultiplier);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void readSpawnData(ByteBuf buffer){
|
public void readSpawnData(ByteBuf buffer){
|
||||||
|
super.readSpawnData(buffer);
|
||||||
blastMultiplier = buffer.readFloat();
|
blastMultiplier = buffer.readFloat();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package electroblob.wizardry.entity.projectile;
|
package electroblob.wizardry.entity.projectile;
|
||||||
|
|
||||||
import java.util.List;
|
import io.netty.buffer.ByteBuf;
|
||||||
|
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.entity.EntityLivingBase;
|
import net.minecraft.entity.EntityLivingBase;
|
||||||
import net.minecraft.entity.projectile.EntityThrowable;
|
import net.minecraft.entity.projectile.EntityThrowable;
|
||||||
@@ -25,7 +24,7 @@ import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData;
|
|||||||
* @author Electroblob
|
* @author Electroblob
|
||||||
* @see EntityBomb
|
* @see EntityBomb
|
||||||
*/
|
*/
|
||||||
public abstract class EntityMagicProjectile extends EntityThrowable {
|
public abstract class EntityMagicProjectile extends EntityThrowable implements IEntityAdditionalSpawnData {
|
||||||
|
|
||||||
public float damageMultiplier = 1.0f;
|
public float damageMultiplier = 1.0f;
|
||||||
|
|
||||||
@@ -42,6 +41,8 @@ public abstract class EntityMagicProjectile extends EntityThrowable {
|
|||||||
// This is the standard set of parameters for this method, used by snowballs and ender pearls amongst others.
|
// This is the standard set of parameters for this method, used by snowballs and ender pearls amongst others.
|
||||||
this.shoot(thrower, thrower.rotationPitch, thrower.rotationYaw, 0.0f, this.getSpeed(), 1.0f);
|
this.shoot(thrower, thrower.rotationPitch, thrower.rotationYaw, 0.0f, this.getSpeed(), 1.0f);
|
||||||
this.damageMultiplier = damageMultiplier;
|
this.damageMultiplier = damageMultiplier;
|
||||||
|
// Mojang's 'fix' for the projectile-hitting-thrower bug actually made the problem worse, hence the following line.
|
||||||
|
this.ignoreEntity = thrower;
|
||||||
}
|
}
|
||||||
|
|
||||||
public EntityMagicProjectile(World world, double x, double y, double z){
|
public EntityMagicProjectile(World world, double x, double y, double z){
|
||||||
@@ -78,17 +79,17 @@ public abstract class EntityMagicProjectile extends EntityThrowable {
|
|||||||
// inside a mob using commands, it wouldn't hit that mob. This is so minor that it's not worth sending a packet
|
// inside a mob using commands, it wouldn't hit that mob. This is so minor that it's not worth sending a packet
|
||||||
// for, though it may become more noticeable if spells firing from blocks are added.
|
// for, though it may become more noticeable if spells firing from blocks are added.
|
||||||
// TODO: Investigate whether this is still necessary in 1.12
|
// TODO: Investigate whether this is still necessary in 1.12
|
||||||
if(this.world.isRemote){
|
// if(this.world.isRemote){
|
||||||
|
//
|
||||||
List<Entity> list = this.world.getEntitiesWithinAABBExcludingEntity(this, this.getEntityBoundingBox().expand(this.motionX, this.motionY, this.motionZ).grow(1.0D));
|
// List<Entity> list = this.world.getEntitiesWithinAABBExcludingEntity(this, this.getEntityBoundingBox().expand(this.motionX, this.motionY, this.motionZ).grow(1.0D));
|
||||||
|
//
|
||||||
for(Entity entity : list){ // Why does vanilla still not use a for-each loop?
|
// for(Entity entity : list){ // Why does vanilla still not use a for-each loop?
|
||||||
if(entity.canBeCollidedWith() && this.ticksExisted < 2 && this.ignoreEntity == null){
|
// if(entity.canBeCollidedWith() && this.ticksExisted < 2 && this.ignoreEntity == null){
|
||||||
this.ignoreEntity = entity;
|
// this.ignoreEntity = entity;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
// Pretty sure EntityThrowable handles the rest.
|
// // Pretty sure EntityThrowable handles the rest.
|
||||||
}
|
// }
|
||||||
|
|
||||||
super.onUpdate();
|
super.onUpdate();
|
||||||
}
|
}
|
||||||
@@ -105,4 +106,16 @@ public abstract class EntityMagicProjectile extends EntityThrowable {
|
|||||||
nbttagcompound.setFloat("damageMultiplier", damageMultiplier);
|
nbttagcompound.setFloat("damageMultiplier", damageMultiplier);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeSpawnData(ByteBuf data){
|
||||||
|
data.writeInt(this.getThrower().getEntityId());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void readSpawnData(ByteBuf data){
|
||||||
|
Entity entity = this.world.getEntityByID(data.readInt());
|
||||||
|
if(entity instanceof EntityLivingBase) this.thrower = (EntityLivingBase)entity;
|
||||||
|
this.ignoreEntity = this.thrower;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import electroblob.wizardry.util.MagicDamage;
|
|||||||
import electroblob.wizardry.util.MagicDamage.DamageType;
|
import electroblob.wizardry.util.MagicDamage.DamageType;
|
||||||
import electroblob.wizardry.util.WizardryParticleType;
|
import electroblob.wizardry.util.WizardryParticleType;
|
||||||
import electroblob.wizardry.util.WizardryUtilities;
|
import electroblob.wizardry.util.WizardryUtilities;
|
||||||
import io.netty.buffer.ByteBuf;
|
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.entity.EntityLivingBase;
|
import net.minecraft.entity.EntityLivingBase;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
@@ -20,9 +19,6 @@ import net.minecraft.world.World;
|
|||||||
|
|
||||||
public class EntitySparkBomb extends EntityBomb {
|
public class EntitySparkBomb extends EntityBomb {
|
||||||
|
|
||||||
/** For client use, because thrower field is not visible. */
|
|
||||||
private int casterID;
|
|
||||||
|
|
||||||
public EntitySparkBomb(World par1World){
|
public EntitySparkBomb(World par1World){
|
||||||
super(par1World);
|
super(par1World);
|
||||||
}
|
}
|
||||||
@@ -84,7 +80,7 @@ public class EntitySparkBomb extends EntityBomb {
|
|||||||
&& ((EntityPlayer)targets.get(i)).capabilities.isCreativeMode);
|
&& ((EntityPlayer)targets.get(i)).capabilities.isCreativeMode);
|
||||||
|
|
||||||
// Detects (client side) if target is the thrower, to stop particles being spawned around them.
|
// Detects (client side) if target is the thrower, to stop particles being spawned around them.
|
||||||
if(flag && world.isRemote && targets.get(i).getEntityId() == this.casterID) flag = false;
|
//if(flag && world.isRemote && targets.get(i).getEntityId() == this.casterID) flag = false;
|
||||||
|
|
||||||
if(flag){
|
if(flag){
|
||||||
|
|
||||||
@@ -120,16 +116,4 @@ public class EntitySparkBomb extends EntityBomb {
|
|||||||
|
|
||||||
this.setDead();
|
this.setDead();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeSpawnData(ByteBuf data){
|
|
||||||
super.writeSpawnData(data);
|
|
||||||
data.writeInt(this.getThrower().getEntityId());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void readSpawnData(ByteBuf data){
|
|
||||||
super.readSpawnData(data);
|
|
||||||
this.casterID = data.readInt();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user