Added electromagnetic cell unstability when dropped in the world
Fixed radiation damage to scale more realisticaly with distance
This commit is contained in:
parent
6938e1030d
commit
e3dcd26b06
9 changed files with 223 additions and 10 deletions
|
@ -119,6 +119,7 @@ import cr0s.warpdrive.data.StarMapRegistry;
|
||||||
import cr0s.warpdrive.event.ChunkHandler;
|
import cr0s.warpdrive.event.ChunkHandler;
|
||||||
import cr0s.warpdrive.event.ClientHandler;
|
import cr0s.warpdrive.event.ClientHandler;
|
||||||
import cr0s.warpdrive.event.CommonWorldGenerator;
|
import cr0s.warpdrive.event.CommonWorldGenerator;
|
||||||
|
import cr0s.warpdrive.event.ItemHandler;
|
||||||
import cr0s.warpdrive.event.LivingHandler;
|
import cr0s.warpdrive.event.LivingHandler;
|
||||||
import cr0s.warpdrive.event.WorldHandler;
|
import cr0s.warpdrive.event.WorldHandler;
|
||||||
import cr0s.warpdrive.item.ItemAirTank;
|
import cr0s.warpdrive.item.ItemAirTank;
|
||||||
|
@ -731,7 +732,7 @@ public class WarpDrive implements LoadingCallback {
|
||||||
|
|
||||||
// Event handlers
|
// Event handlers
|
||||||
MinecraftForge.EVENT_BUS.register(new ClientHandler());
|
MinecraftForge.EVENT_BUS.register(new ClientHandler());
|
||||||
|
MinecraftForge.EVENT_BUS.register(new ItemHandler());
|
||||||
MinecraftForge.EVENT_BUS.register(new LivingHandler());
|
MinecraftForge.EVENT_BUS.register(new LivingHandler());
|
||||||
|
|
||||||
if (WarpDriveConfig.isComputerCraftLoaded) {
|
if (WarpDriveConfig.isComputerCraftLoaded) {
|
||||||
|
|
10
src/main/java/cr0s/warpdrive/api/IItemBase.java
Normal file
10
src/main/java/cr0s/warpdrive/api/IItemBase.java
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
package cr0s.warpdrive.api;
|
||||||
|
|
||||||
|
import net.minecraft.entity.item.EntityItem;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
|
||||||
|
public interface IItemBase {
|
||||||
|
|
||||||
|
// wrapper for Forge ItemExpireEvent
|
||||||
|
void onEntityExpireEvent(EntityItem entityItem, ItemStack itemStack);
|
||||||
|
}
|
|
@ -1,11 +1,14 @@
|
||||||
package cr0s.warpdrive.api;
|
package cr0s.warpdrive.api;
|
||||||
|
|
||||||
import cr0s.warpdrive.Commons;
|
import cr0s.warpdrive.Commons;
|
||||||
|
import cr0s.warpdrive.WarpDrive;
|
||||||
|
import cr0s.warpdrive.data.Vector3;
|
||||||
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
import net.minecraft.item.EnumRarity;
|
import net.minecraft.item.EnumRarity;
|
||||||
import net.minecraft.util.StatCollector;
|
import net.minecraft.util.StatCollector;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
import cpw.mods.fml.relauncher.Side;
|
import cpw.mods.fml.relauncher.Side;
|
||||||
import cpw.mods.fml.relauncher.SideOnly;
|
import cpw.mods.fml.relauncher.SideOnly;
|
||||||
|
@ -17,6 +20,9 @@ public class Particle {
|
||||||
protected int colorIndex;
|
protected int colorIndex;
|
||||||
|
|
||||||
protected EnumRarity enumRarity = EnumRarity.common;
|
protected EnumRarity enumRarity = EnumRarity.common;
|
||||||
|
private int entityLifespan;
|
||||||
|
private float radiationLevel = 0.0F;
|
||||||
|
private float explosionStrength = 0.0F;
|
||||||
|
|
||||||
public Particle(final String registryName) {
|
public Particle(final String registryName) {
|
||||||
this.registryName = registryName.toLowerCase(Locale.ENGLISH);
|
this.registryName = registryName.toLowerCase(Locale.ENGLISH);
|
||||||
|
@ -42,6 +48,21 @@ public class Particle {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Particle setEntityLifespan(final int entityLifespan) {
|
||||||
|
this.entityLifespan = entityLifespan;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Particle setRadiationLevel(final float radiationLevel) {
|
||||||
|
this.radiationLevel = radiationLevel;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Particle setExplosionStrength(final float explosionStrength) {
|
||||||
|
this.explosionStrength = explosionStrength;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public final String getRegistryName()
|
public final String getRegistryName()
|
||||||
{
|
{
|
||||||
return this.registryName;
|
return this.registryName;
|
||||||
|
@ -80,5 +101,26 @@ public class Particle {
|
||||||
{
|
{
|
||||||
return color;
|
return color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getEntityLifespan() {
|
||||||
|
return entityLifespan;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Effector */
|
||||||
|
|
||||||
|
public void onWorldEffect(final World world, final Vector3 v3Position, final int amount) {
|
||||||
|
if (world.isRemote) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (radiationLevel > 0.0F) {
|
||||||
|
final float strength = radiationLevel * amount / 1000.0F;
|
||||||
|
WarpDrive.damageIrradiation.onWorldEffect(world, v3Position, strength);
|
||||||
|
}
|
||||||
|
if (explosionStrength > 0.0F) {
|
||||||
|
final float amountFactor = Math.max(1.25F, amount / 1000.0F);
|
||||||
|
world.newExplosion(null, v3Position.x, v3Position.y, v3Position.z, explosionStrength * amountFactor, true, true);
|
||||||
|
WarpDrive.logger.info("Particle caused explosion at " + v3Position.x + " " + v3Position.y + " " + v3Position.z + " with strength " + explosionStrength * amountFactor);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,10 +18,14 @@ public class ParticleRegistry {
|
||||||
|
|
||||||
private static BiMap<String, Particle> particles = HashBiMap.create();
|
private static BiMap<String, Particle> particles = HashBiMap.create();
|
||||||
|
|
||||||
public static final Particle ION = new Particle("ion") { }.setColor(0xE5FF54).setRarity(EnumRarity.common).setColorIndex(0);
|
public static final Particle ION = new Particle("ion") { }.setColor(0xE5FF54).setRarity(EnumRarity.common).setColorIndex(0)
|
||||||
public static final Particle PROTON = new Particle("proton") { }.setColor(0xE5FF54).setRarity(EnumRarity.common).setColorIndex(1);
|
.setEntityLifespan(200).setRadiationLevel(2.0F).setExplosionStrength(0.3F);
|
||||||
public static final Particle ANTIMATTER = new Particle("antimatter") { }.setColor(0x1C3CAF).setRarity(EnumRarity.uncommon).setColorIndex(2);
|
public static final Particle PROTON = new Particle("proton") { }.setColor(0xE5FF54).setRarity(EnumRarity.common).setColorIndex(1)
|
||||||
public static final Particle STRANGE_MATTER = new Particle("strange_matter") { }.setColor(0xE2414C).setRarity(EnumRarity.rare).setColorIndex(3);
|
.setEntityLifespan(200).setRadiationLevel(4.0F).setExplosionStrength(0.5F);
|
||||||
|
public static final Particle ANTIMATTER = new Particle("antimatter") { }.setColor(0x1C3CAF).setRarity(EnumRarity.uncommon).setColorIndex(2)
|
||||||
|
.setEntityLifespan(60).setRadiationLevel(10.0F).setExplosionStrength(1.0F);
|
||||||
|
public static final Particle STRANGE_MATTER = new Particle("strange_matter") { }.setColor(0xE2414C).setRarity(EnumRarity.rare).setColorIndex(3)
|
||||||
|
.setEntityLifespan(40).setRadiationLevel(14.0F).setExplosionStrength(0.8F);
|
||||||
// public static final Particle TACHYONS = new Particle("tachyons") { }.setColor(0xE5FF54).setRarity(EnumRarity.epic).setColorIndex(4);
|
// public static final Particle TACHYONS = new Particle("tachyons") { }.setColor(0xE5FF54).setRarity(EnumRarity.epic).setColorIndex(4);
|
||||||
|
|
||||||
static {
|
static {
|
||||||
|
|
|
@ -1,9 +1,12 @@
|
||||||
package cr0s.warpdrive.api;
|
package cr0s.warpdrive.api;
|
||||||
|
|
||||||
|
import cr0s.warpdrive.data.Vector3;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
import cpw.mods.fml.common.FMLLog;
|
import cpw.mods.fml.common.FMLLog;
|
||||||
|
|
||||||
|
@ -77,6 +80,20 @@ public class ParticleStack {
|
||||||
amount += amountAdded;
|
amount += amountAdded;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getEntityLifespan() {
|
||||||
|
if (particle == null) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return particle.getEntityLifespan();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onWorldEffect(@Nonnull final World world, @Nonnull final Vector3 v3Position) {
|
||||||
|
if (particle == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
particle.onWorldEffect(world, v3Position, amount);
|
||||||
|
}
|
||||||
|
|
||||||
public String getLocalizedName() {
|
public String getLocalizedName() {
|
||||||
return this.getParticle().getLocalizedName();
|
return this.getParticle().getLocalizedName();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,18 @@
|
||||||
package cr0s.warpdrive.damage;
|
package cr0s.warpdrive.damage;
|
||||||
|
|
||||||
|
import cr0s.warpdrive.Commons;
|
||||||
|
import cr0s.warpdrive.WarpDrive;
|
||||||
|
import cr0s.warpdrive.config.WarpDriveConfig;
|
||||||
|
import cr0s.warpdrive.data.Vector3;
|
||||||
|
import cr0s.warpdrive.network.PacketHandler;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.minecraft.entity.Entity;
|
||||||
|
import net.minecraft.entity.EntityLivingBase;
|
||||||
|
import net.minecraft.util.AxisAlignedBB;
|
||||||
import net.minecraft.util.DamageSource;
|
import net.minecraft.util.DamageSource;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
public class DamageIrradiation extends DamageSource {
|
public class DamageIrradiation extends DamageSource {
|
||||||
|
|
||||||
|
@ -10,4 +22,54 @@ public class DamageIrradiation extends DamageSource {
|
||||||
setDamageIsAbsolute();
|
setDamageIsAbsolute();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void onWorldEffect(final World world, final Vector3 v3Position, final float strength) {
|
||||||
|
// only search up to distance where damage applied is 0.5
|
||||||
|
final double radius = Math.sqrt(2.0D * strength);
|
||||||
|
final AxisAlignedBB axisAlignedBB = AxisAlignedBB.getBoundingBox(
|
||||||
|
v3Position.x - radius, v3Position.y - radius, v3Position.z - radius,
|
||||||
|
v3Position.x + radius, v3Position.y + radius, v3Position.z + radius);
|
||||||
|
final List<EntityLivingBase> listEntityLivingBase = world.getEntitiesWithinAABB(EntityLivingBase.class, axisAlignedBB);
|
||||||
|
if (listEntityLivingBase != null) {
|
||||||
|
for (EntityLivingBase entityLivingBase : listEntityLivingBase) {
|
||||||
|
// cap damage below 1 m distance, since the entity is never really inside the source and damage tends to +INF
|
||||||
|
final float distance = Math.min(1.0F, (float) Math.sqrt(v3Position.distanceTo_square(entityLivingBase)));
|
||||||
|
onEntityEffect(strength / (distance * distance), world, v3Position, entityLivingBase);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onEntityEffect(final float strength, final World world, final Vector3 v3Source, final Entity entity) {
|
||||||
|
if ( strength <= 0.0F
|
||||||
|
|| !(entity instanceof EntityLivingBase)
|
||||||
|
|| entity.isDead ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// common particle effects properties
|
||||||
|
final Vector3 v3Entity = new Vector3(entity);
|
||||||
|
final Vector3 v3Direction = new Vector3(entity).subtract(v3Source).normalize();
|
||||||
|
final Vector3 v3From = v3Source.clone();
|
||||||
|
v3From.translateFactor(v3Direction, 0.6D);
|
||||||
|
v3Entity.translateFactor(v3Direction, -0.6D);
|
||||||
|
|
||||||
|
final double speed = Math.abs(strength);
|
||||||
|
final Vector3 v3Motion = v3Direction.clone().scale(speed); // new Vector3(entity.motionX, entity.motionY, entity.motionZ);
|
||||||
|
if (WarpDriveConfig.LOGGING_ACCELERATOR && WarpDrive.isDev) {
|
||||||
|
PacketHandler.sendBeamPacket(world, v3From, v3Entity,
|
||||||
|
0.25F, 0.75F, 0.38F, 10, 0, 50);
|
||||||
|
WarpDrive.logger.info(String.format("%s strength %.1f speed %.3f entity %s source %s direction %s motion %s entity %s",
|
||||||
|
this, strength, speed, v3Entity, v3Source, v3Direction, v3Motion, entity));
|
||||||
|
}
|
||||||
|
|
||||||
|
// apply damages and particle effects
|
||||||
|
entity.attackEntityFrom(this, strength);
|
||||||
|
|
||||||
|
// visual effect
|
||||||
|
v3Direction.scale(0.20D);
|
||||||
|
PacketHandler.sendSpawnParticlePacket(world, "mobSpell", (byte) Commons.clamp(3, 10, strength), v3Entity, v3Direction,
|
||||||
|
0.20F + 0.10F * world.rand.nextFloat(),
|
||||||
|
0.90F + 0.10F * world.rand.nextFloat(),
|
||||||
|
0.40F + 0.15F * world.rand.nextFloat(),
|
||||||
|
0.0F, 0.0F, 0.0F, 32);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
28
src/main/java/cr0s/warpdrive/event/ItemHandler.java
Normal file
28
src/main/java/cr0s/warpdrive/event/ItemHandler.java
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
package cr0s.warpdrive.event;
|
||||||
|
|
||||||
|
import cr0s.warpdrive.api.IItemBase;
|
||||||
|
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
|
||||||
|
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
|
||||||
|
import net.minecraftforge.event.entity.item.ItemExpireEvent;
|
||||||
|
|
||||||
|
public class ItemHandler {
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
|
public static void onItemExpireEvent(final ItemExpireEvent event) {
|
||||||
|
if (event.entityItem == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final ItemStack itemStack = event.entityItem.getEntityItem();
|
||||||
|
if (itemStack == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final Item item = itemStack.getItem();
|
||||||
|
if (!(item instanceof IItemBase)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
((IItemBase) item).onEntityExpireEvent(event.entityItem, itemStack);
|
||||||
|
}
|
||||||
|
}
|
20
src/main/java/cr0s/warpdrive/item/ItemAbstractBase.java
Normal file
20
src/main/java/cr0s/warpdrive/item/ItemAbstractBase.java
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
package cr0s.warpdrive.item;
|
||||||
|
|
||||||
|
import cr0s.warpdrive.WarpDrive;
|
||||||
|
import cr0s.warpdrive.api.IItemBase;
|
||||||
|
|
||||||
|
import net.minecraft.entity.item.EntityItem;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
|
||||||
|
public class ItemAbstractBase extends Item implements IItemBase {
|
||||||
|
|
||||||
|
public ItemAbstractBase() {
|
||||||
|
super();
|
||||||
|
setCreativeTab(WarpDrive.creativeTabWarpDrive);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEntityExpireEvent(final EntityItem entityItem, final ItemStack itemStack) {
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,11 +6,13 @@ import cr0s.warpdrive.api.IParticleContainerItem;
|
||||||
import cr0s.warpdrive.api.Particle;
|
import cr0s.warpdrive.api.Particle;
|
||||||
import cr0s.warpdrive.api.ParticleRegistry;
|
import cr0s.warpdrive.api.ParticleRegistry;
|
||||||
import cr0s.warpdrive.api.ParticleStack;
|
import cr0s.warpdrive.api.ParticleStack;
|
||||||
|
import cr0s.warpdrive.data.Vector3;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import net.minecraft.client.renderer.texture.IIconRegister;
|
import net.minecraft.client.renderer.texture.IIconRegister;
|
||||||
import net.minecraft.creativetab.CreativeTabs;
|
import net.minecraft.creativetab.CreativeTabs;
|
||||||
|
import net.minecraft.entity.item.EntityItem;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.init.Blocks;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
|
@ -18,11 +20,12 @@ import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraft.util.IIcon;
|
import net.minecraft.util.IIcon;
|
||||||
import net.minecraft.util.StatCollector;
|
import net.minecraft.util.StatCollector;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
import cpw.mods.fml.relauncher.Side;
|
import cpw.mods.fml.relauncher.Side;
|
||||||
import cpw.mods.fml.relauncher.SideOnly;
|
import cpw.mods.fml.relauncher.SideOnly;
|
||||||
|
|
||||||
public class ItemElectromagneticCell extends Item implements IParticleContainerItem {
|
public class ItemElectromagneticCell extends ItemAbstractBase implements IParticleContainerItem {
|
||||||
|
|
||||||
private static final String AMOUNT_TO_CONSUME_TAG = "amountToConsume";
|
private static final String AMOUNT_TO_CONSUME_TAG = "amountToConsume";
|
||||||
|
|
||||||
|
@ -150,7 +153,7 @@ public class ItemElectromagneticCell extends Item implements IParticleContainerI
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int getDamageLevel(ItemStack itemStack, final ParticleStack particleStack) {
|
private static int getDamageLevel(ItemStack itemStack, final ParticleStack particleStack) {
|
||||||
if (!(itemStack.getItem() instanceof ItemElectromagneticCell)) {
|
if (!(itemStack.getItem() instanceof ItemElectromagneticCell)) {
|
||||||
WarpDrive.logger.error("Invalid ItemStack passed, expecting ItemElectromagneticCell: " + itemStack);
|
WarpDrive.logger.error("Invalid ItemStack passed, expecting ItemElectromagneticCell: " + itemStack);
|
||||||
return itemStack.getItemDamage();
|
return itemStack.getItemDamage();
|
||||||
}
|
}
|
||||||
|
@ -199,7 +202,7 @@ public class ItemElectromagneticCell extends Item implements IParticleContainerI
|
||||||
} else if (!particleStack.isParticleEqual(resource) || particleStack.getAmount() >= getCapacity(itemStack)) {
|
} else if (!particleStack.isParticleEqual(resource) || particleStack.getAmount() >= getCapacity(itemStack)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int transfer = Math.min(resource.getAmount(), getCapacity(itemStack) - particleStack.getAmount());
|
final int transfer = Math.min(resource.getAmount(), getCapacity(itemStack) - particleStack.getAmount());
|
||||||
if (doFill) {
|
if (doFill) {
|
||||||
particleStack.fill(transfer);
|
particleStack.fill(transfer);
|
||||||
|
|
||||||
|
@ -215,7 +218,7 @@ public class ItemElectromagneticCell extends Item implements IParticleContainerI
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ParticleStack drain(ItemStack itemStack, final ParticleStack resource, final boolean doDrain) {
|
public ParticleStack drain(ItemStack itemStack, final ParticleStack resource, final boolean doDrain) {
|
||||||
ParticleStack particleStack = getParticleStack(itemStack);
|
final ParticleStack particleStack = getParticleStack(itemStack);
|
||||||
if (particleStack == null || particleStack.getParticle() == null) {
|
if (particleStack == null || particleStack.getParticle() == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -226,7 +229,7 @@ public class ItemElectromagneticCell extends Item implements IParticleContainerI
|
||||||
if (doDrain) {
|
if (doDrain) {
|
||||||
particleStack.fill(-transfer);
|
particleStack.fill(-transfer);
|
||||||
|
|
||||||
NBTTagCompound tagCompound = itemStack.hasTagCompound() ? itemStack.getTagCompound() : new NBTTagCompound();
|
final NBTTagCompound tagCompound = itemStack.hasTagCompound() ? itemStack.getTagCompound() : new NBTTagCompound();
|
||||||
tagCompound.setTag("particle", particleStack.writeToNBT(new NBTTagCompound()));
|
tagCompound.setTag("particle", particleStack.writeToNBT(new NBTTagCompound()));
|
||||||
if (!itemStack.hasTagCompound()) {
|
if (!itemStack.hasTagCompound()) {
|
||||||
itemStack.setTagCompound(tagCompound);
|
itemStack.setTagCompound(tagCompound);
|
||||||
|
@ -236,6 +239,32 @@ public class ItemElectromagneticCell extends Item implements IParticleContainerI
|
||||||
return resource.copy(transfer);
|
return resource.copy(transfer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getEntityLifespan(final ItemStack itemStack, final World world) {
|
||||||
|
final ParticleStack particleStack = getParticleStack(itemStack);
|
||||||
|
if ( particleStack == null
|
||||||
|
|| particleStack.isEmpty() ) {
|
||||||
|
return super.getEntityLifespan(itemStack, world);
|
||||||
|
}
|
||||||
|
final int lifespan = particleStack.getEntityLifespan();
|
||||||
|
if (lifespan < 0) {
|
||||||
|
return super.getEntityLifespan(itemStack, world);
|
||||||
|
}
|
||||||
|
// less content means more stable, so we scale lifespan with emptiness, up to doubling it
|
||||||
|
return (2 - particleStack.getAmount() / getCapacity(itemStack)) * lifespan;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEntityExpireEvent(final EntityItem entityItem, final ItemStack itemStack) {
|
||||||
|
final ParticleStack particleStack = getParticleStack(itemStack);
|
||||||
|
if ( particleStack == null
|
||||||
|
|| particleStack.isEmpty() ) {
|
||||||
|
super.onEntityExpireEvent(entityItem, itemStack);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
particleStack.onWorldEffect(entityItem.worldObj, new Vector3(entityItem));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addInformation(ItemStack itemStack, EntityPlayer entityPlayer, List list, boolean advancedItemTooltips) {
|
public void addInformation(ItemStack itemStack, EntityPlayer entityPlayer, List list, boolean advancedItemTooltips) {
|
||||||
super.addInformation(itemStack, entityPlayer, list, advancedItemTooltips);
|
super.addInformation(itemStack, entityPlayer, list, advancedItemTooltips);
|
||||||
|
|
Loading…
Reference in a new issue