blob: ceec6337bfef54103f228802bbd3eeb04f4072d4 [file] [log] [blame] [raw]
package codechicken.multipart
import codechicken.lib.vec.Cuboid6
import cpw.mods.fml.relauncher.SideOnly
import cpw.mods.fml.relauncher.Side
import net.minecraft.util.Icon
import net.minecraft.util.MovingObjectPosition
import net.minecraft.client.particle.EffectRenderer
import codechicken.lib.vec.Vector3
import codechicken.lib.raytracer.ExtendedMOP
import codechicken.lib.render.EntityDigIconFX
/**
* This suite of 3 classes provides simple functions for standard minecraft style hit and break particles.
*
* Scala|Java composition setup.
* Due to the lack of mixin inheritance in Java, the classes are structured to suit both languages as follows.
* IconHitEffects contains static implementations of the functions that would be overriden in TMultiPart
* JIconHitEffects is the interface that should be implemented by a Java class,
* which can then override the functions in TMultipart and call the static methods in IconHitEffects with 'this' as the first parameter
* TIconHitEffects is a trait for scala implementors that does includes the overrides/static calls that Java programmers need to include themselves.
*/
object IconHitEffects
{
def addHitEffects(part:JIconHitEffects, hit:MovingObjectPosition, effectRenderer:EffectRenderer)
{
EntityDigIconFX.addBlockHitEffects(part.tile.worldObj,
part.getBounds.copy.add(Vector3.fromTileEntity(part.tile)), hit.sideHit,
part.getBreakingIcon(ExtendedMOP.getData(hit), hit.sideHit), effectRenderer)
}
def addDestroyEffects(part:JIconHitEffects, effectRenderer:EffectRenderer)
{
addDestroyEffects(part, effectRenderer, true)
}
def addDestroyEffects(part:JIconHitEffects, effectRenderer:EffectRenderer, scaleDensity:Boolean)
{
val icons = new Array[Icon](6)
for(i <- 0 until 6)
icons(i) = part.getBrokenIcon(i)
val bounds =
if(scaleDensity) part.getBounds.copy
else Cuboid6.full.copy
EntityDigIconFX.addBlockDestroyEffects(part.tile.worldObj,
bounds.add(Vector3.fromTileEntity(part.tile)), icons, effectRenderer)
}
}
/**
* Java interface containing callbacks for particle rendering.
* Make sure to override addHitEffects and addDestroyEffects as in TIconHitEffects
*/
trait JIconHitEffects extends TMultiPart
{
def getBounds:Cuboid6
@SideOnly(Side.CLIENT)
def getBreakingIcon(subPart:Any, side:Int):Icon = getBrokenIcon(side)
@SideOnly(Side.CLIENT)
def getBrokenIcon(side:Int):Icon
}
/**
* Trait for scala programmers
*/
trait TIconHitEffects extends JIconHitEffects
{
@SideOnly(Side.CLIENT)
override def addHitEffects(hit:MovingObjectPosition, effectRenderer:EffectRenderer)
{
IconHitEffects.addHitEffects(this, hit, effectRenderer)
}
@SideOnly(Side.CLIENT)
override def addDestroyEffects(effectRenderer:EffectRenderer)
{
IconHitEffects.addDestroyEffects(this, effectRenderer)
}
}