use of am2.particles.AMParticle in project ArsMagica2 by Mithion.
the class EntityLightningGuardian method onUpdate.
@Override
public void onUpdate() {
super.onUpdate();
if (this.getAttackTarget() != null) {
if (this.getCurrentAction() != BossActions.LONG_CASTING) {
ExtendedProperties.For(getAttackTarget()).setDisableGravity(false);
}
if (!this.worldObj.isRemote && this.getDistanceSqToEntity(getAttackTarget()) > 64D && this.getCurrentAction() == BossActions.IDLE) {
this.getNavigator().tryMoveToEntityLiving(getAttackTarget(), 0.5f);
}
}
if (worldObj.isRemote) {
int halfDist = 8;
int dist = 16;
if (this.getCurrentAction() == BossActions.CHARGE) {
if (ticksInCurrentAction > 50) {
for (int i = 0; i < 2 * AMCore.config.getGFXLevel(); ++i) {
AMParticle smoke = (AMParticle) AMCore.proxy.particleManager.spawn(worldObj, "smoke", posX, posY + 4, posZ);
if (smoke != null) {
smoke.addRandomOffset(halfDist, 1, halfDist);
smoke.SetParticleAlpha(1f);
smoke.setParticleScale(1f);
smoke.setMaxAge(20);
smoke.AddParticleController(new ParticleHoldPosition(smoke, 10, 1, false));
}
}
}
if (ticksInCurrentAction > 66) {
AMCore.proxy.particleManager.BoltFromPointToPoint(worldObj, posX + rand.nextDouble() - 0.5, posY + rand.nextDouble() - 0.5 + 2, posZ + rand.nextDouble() - 0.5, posX + rand.nextDouble() * dist - halfDist, posY + rand.nextDouble() * dist - halfDist, posZ + rand.nextDouble() * dist - halfDist);
}
} else if (this.getCurrentAction() == BossActions.LONG_CASTING) {
if (ticksInCurrentAction > 25 && ticksInCurrentAction < 150) {
for (int i = 0; i < 2 * AMCore.config.getGFXLevel(); ++i) {
AMParticle smoke = (AMParticle) AMCore.proxy.particleManager.spawn(worldObj, "smoke", posX, posY + 4, posZ);
if (smoke != null) {
smoke.addRandomOffset(halfDist, 1, halfDist);
smoke.SetParticleAlpha(1f);
smoke.setParticleScale(1f);
smoke.setRGBColorI(ticksInCurrentAction < 85 ? 0xFFFFFF - 0x111111 * ((ticksInCurrentAction - 25) / 4) : 0x222222);
smoke.setMaxAge(20);
smoke.AddParticleController(new ParticleHoldPosition(smoke, 10, 1, false));
}
}
}
}
}
}
use of am2.particles.AMParticle in project ArsMagica2 by Mithion.
the class EntitySpellEffect method wallUpdate.
private void wallUpdate() {
if (worldObj.isRemote) {
if (spellStack == null) {
spellStack = this.dataWatcher.getWatchableObjectItemStack(22);
if (spellStack == null) {
return;
}
}
double dist = this.dataWatcher.getWatchableObjectFloat(WATCHER_RADIUS);
int color = 0xFFFFFF;
if (SpellUtils.instance.modifierIsPresent(SpellModifiers.COLOR, spellStack, 0)) {
ISpellModifier[] mods = SpellUtils.instance.getModifiersForStage(spellStack, 0);
int ordinalCount = 0;
for (ISpellModifier mod : mods) {
if (mod instanceof Colour) {
byte[] meta = SpellUtils.instance.getModifierMetadataFromStack(spellStack, mod, 0, ordinalCount++);
color = (int) mod.getModifier(SpellModifiers.COLOR, null, null, null, meta);
}
}
}
double px = Math.cos(3.141 / 180 * (rotationYaw + 90)) * 0.1f;
double pz = Math.sin(3.141 / 180 * (rotationYaw + 90)) * 0.1f;
double py = 0.1f;
for (float i = 0; i < dist; i += 0.5f) {
double x = this.posX - Math.cos(3.141 / 180 * (rotationYaw)) * i;
double z = this.posZ - Math.sin(3.141 / 180 * (rotationYaw)) * i;
AMParticle effect = (AMParticle) AMCore.instance.proxy.particleManager.spawn(worldObj, AMParticleIcons.instance.getParticleForAffinity(SpellUtils.instance.mainAffinityFor(spellStack)), x, posY, z);
if (effect != null) {
effect.setIgnoreMaxAge(false);
effect.setMaxAge(20);
effect.addRandomOffset(1, 1, 1);
effect.setParticleScale(0.15f);
effect.setRGBColorI(color);
if (dataWatcher.getWatchableObjectInt(WATCHER_TYPE) == TYPE_WALL) {
effect.AddParticleController(new ParticleFloatUpward(effect, 0, 0.07f, 1, false));
} else {
effect.setAffectedByGravity();
effect.setDontRequireControllers();
effect.addVelocity(px, py, pz);
}
}
x = this.posX - Math.cos(Math.toRadians(rotationYaw)) * -i;
z = this.posZ - Math.sin(Math.toRadians(rotationYaw)) * -i;
effect = (AMParticle) AMCore.instance.proxy.particleManager.spawn(worldObj, AMParticleIcons.instance.getParticleForAffinity(SpellUtils.instance.mainAffinityFor(spellStack)), x, posY, z);
if (effect != null) {
effect.setIgnoreMaxAge(false);
effect.addRandomOffset(1, 1, 1);
effect.setMaxAge(20);
effect.setParticleScale(0.15f);
effect.setRGBColorI(color);
if (dataWatcher.getWatchableObjectInt(WATCHER_TYPE) == TYPE_WALL) {
effect.AddParticleController(new ParticleFloatUpward(effect, 0, 0.07f, 1, false));
} else {
effect.setAffectedByGravity();
effect.setDontRequireControllers();
effect.addVelocity(px, py, pz);
}
}
}
} else {
ticksToEffect--;
if (spellStack == null) {
if (!worldObj.isRemote) {
this.setDead();
}
return;
}
if (dummycaster == null) {
dummycaster = DummyEntityPlayer.fromEntityLiving(new EntityDummyCaster(worldObj));
}
if (ticksToEffect <= 0) {
ticksToEffect = maxTicksToEffect_wall;
float radius = this.dataWatcher.getWatchableObjectFloat(WATCHER_RADIUS);
List<Entity> possibleTargets = worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(posX - radius, posY - 1, posZ - radius, posX + radius, posY + 3, posZ + radius));
ItemStack newStack = SpellUtils.instance.popStackStage(spellStack);
for (Entity e : possibleTargets) {
if (e == this || e == dummycaster || e.getEntityId() == casterEntityID)
continue;
if (e instanceof EntityDragonPart && ((EntityDragonPart) e).entityDragonObj instanceof EntityLivingBase)
e = (EntityLivingBase) ((EntityDragonPart) e).entityDragonObj;
AMVector3 target = new AMVector3(e);
double dirX = Math.cos(3.141 / 180 * (rotationYaw));
double dirZ = Math.sin(3.141 / 180 * (rotationYaw));
AMVector3 a = new AMVector3(this.posX - dirX * radius, this.posY, this.posZ - dirZ * radius);
AMVector3 b = new AMVector3(this.posX - dirX * -radius, this.posY, this.posZ - dirZ * -radius);
AMVector3 closest = new AMLineSegment(a, b).closestPointOnLine(target);
closest.y = 0;
target.y = 0;
double hDistance = closest.distanceTo(target);
double vDistance = Math.abs(this.posY - e.posY);
if (e instanceof EntityLivingBase && hDistance < 0.75f && vDistance < 2) {
//commented out in favor of line below so as to apply subsequent shapes as well
//uncomment and comment out below line to revert to direct target only, but mark wave/wall as terminus
//SpellHelper.instance.applyStageToEntity(spellStack, dummycaster, worldObj, e, 0, false);
SpellHelper.instance.applyStackStage(spellStack, dummycaster, (EntityLivingBase) e, this.posX, this.posY, this.posZ, 0, worldObj, false, false, 0);
}
}
}
}
}
use of am2.particles.AMParticle in project ArsMagica2 by Mithion.
the class EntitySpellEffect method blizzardUpdate.
private void blizzardUpdate() {
float radius = this.dataWatcher.getWatchableObjectFloat(WATCHER_RADIUS);
if (worldObj.isRemote) {
if (spellStack == null) {
spellStack = this.dataWatcher.getWatchableObjectItemStack(22);
if (spellStack == null) {
return;
}
}
int color = 0xFFFFFF;
if (SpellUtils.instance.modifierIsPresent(SpellModifiers.COLOR, spellStack, 0)) {
ISpellModifier[] mods = SpellUtils.instance.getModifiersForStage(spellStack, 0);
int ordinalCount = 0;
for (ISpellModifier mod : mods) {
if (mod instanceof Colour) {
byte[] meta = SpellUtils.instance.getModifierMetadataFromStack(spellStack, mod, 0, ordinalCount++);
color = (int) mod.getModifier(SpellModifiers.COLOR, null, null, null, meta);
}
}
}
for (int i = 0; i < 20; ++i) {
double x = this.posX - radius + (rand.nextDouble() * radius * 2);
double z = this.posZ - radius + (rand.nextDouble() * radius * 2);
double y = this.posY + 10;
AMParticle particle = (AMParticle) AMCore.proxy.particleManager.spawn(worldObj, "snowflakes", x, y, z);
if (particle != null) {
particle.setMaxAge(20);
particle.setParticleScale(0.1f);
particle.addVelocity(rand.nextDouble() * 0.2f - 0.1f, 0, rand.nextDouble() * 0.2f - 0.1f);
particle.setAffectedByGravity();
particle.setRGBColorI(color);
particle.setDontRequireControllers();
particle.noClip = false;
}
}
double x = this.posX - radius + (rand.nextDouble() * radius * 2);
double z = this.posZ - radius + (rand.nextDouble() * radius * 2);
double y = this.posY + rand.nextDouble();
AMParticle particle = (AMParticle) AMCore.proxy.particleManager.spawn(worldObj, "smoke", x, y, z);
if (particle != null) {
particle.setParticleScale(2.0f);
particle.setMaxAge(20);
//particle.setRGBColorF(0.5f, 0.92f, 0.92f);
particle.setRGBColorF(0.5098f, 0.7843f, 0.7843f);
particle.SetParticleAlpha(0.6f);
particle.AddParticleController(new ParticleFleePoint(particle, new AMVector3(x, y, z), 0.1f, 3f, 1, false));
}
//TODO: SoundHelper.instance.loopSound(worldObj, (float)posX, (float)posY, (float)posZ, "arsmagica2:spell.loop.air", 1.0f);
} else {
List<Entity> possibleTargets = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(posX - radius, posY - 1, posZ - radius, posX + radius, posY + 3, posZ + radius));
for (Entity e : possibleTargets) {
if (e != dummycaster) {
if (e instanceof EntityDragonPart && ((EntityDragonPart) e).entityDragonObj instanceof EntityLivingBase)
e = (EntityLivingBase) ((EntityDragonPart) e).entityDragonObj;
if (e instanceof EntityLivingBase)
((EntityLivingBase) e).addPotionEffect(new BuffEffectFrostSlowed(80, 3));
float damage = 1 * this.dataWatcher.getWatchableObjectFloat(WATCHER_DAMAGEBONUS);
double lastVelX = e.motionX;
double lastVelY = e.motionY;
double lastVelZ = e.motionZ;
if (SpellHelper.instance.attackTargetSpecial(null, e, DamageSources.causeEntityFrostDamage(dummycaster), damage) && !(e instanceof EntityPlayer))
e.hurtResistantTime = 15;
e.addVelocity(-(e.motionX - lastVelX), -(e.motionY - lastVelY), -(e.motionZ - lastVelZ));
}
}
if (rand.nextInt(10) < 2) {
int pX = (int) (posX - radius + rand.nextInt((int) Math.ceil(radius) * 2));
int pY = (int) posY + rand.nextInt(2);
int pZ = (int) (posZ - radius + rand.nextInt((int) Math.ceil(radius) * 2));
if (worldObj.isAirBlock(pX, pY, pZ) && !worldObj.isAirBlock(pX, pY - 1, pZ) && worldObj.getBlock(pX, pY, pZ).isOpaqueCube())
worldObj.setBlock(pX, pY, pZ, Blocks.snow);
}
}
}
use of am2.particles.AMParticle in project ArsMagica2 by Mithion.
the class EntityHecate method spawnLivingParticles.
private void spawnLivingParticles() {
if (rand.nextInt(3) == 0) {
double yPos = this.posY + 1.1;
if (this.currentForwardRotation >= 0.24) {
yPos += 0.3;
}
AMParticle effect = (AMParticle) AMCore.instance.proxy.particleManager.spawn(worldObj, "smoke", this.posX + ((rand.nextFloat() * 0.2) - 0.1f), yPos, this.posZ + ((rand.nextFloat() * 0.4) - 0.2f));
if (effect != null) {
if (this.currentForwardRotation < 0.24) {
effect.AddParticleController(new ParticleFloatUpward(effect, 0.1f, -0.06f, 1, false));
} else {
effect.AddParticleController(new ParticleMoveOnHeading(effect, this.rotationYaw - 90, this.rotationPitch, 0.01f, 1, false));
}
effect.AddParticleController(new ParticleFadeOut(effect, 2, false).setFadeSpeed(0.04f));
effect.setMaxAge(25);
effect.setIgnoreMaxAge(false);
effect.setRGBColorF(0.3f, 0.3f, 0.3f);
}
}
}
use of am2.particles.AMParticle in project ArsMagica2 by Mithion.
the class EntityFireElemental method onUpdate.
@Override
public void onUpdate() {
int cookTargetID = dataWatcher.getWatchableObjectInt(19);
if (cookTargetID != 0) {
List<EntityItem> items = worldObj.getEntitiesWithinAABB(EntityItem.class, this.boundingBox.expand(cookRadius, cookRadius, cookRadius));
EntityItem inanimate = null;
for (EntityItem item : items) {
if (item.getEntityId() == cookTargetID) {
inanimate = item;
}
}
if (inanimate != null && worldObj.isRemote) {
AMParticle effect = (AMParticle) AMCore.instance.proxy.particleManager.spawn(worldObj, "fire", posX, posY + getEyeHeight(), posZ);
if (effect != null) {
effect.setIgnoreMaxAge(true);
effect.AddParticleController(new ParticleApproachPoint(effect, inanimate.posX + (rand.nextFloat() - 0.5), inanimate.posY + (rand.nextFloat() - 0.5), inanimate.posZ + (rand.nextFloat() - 0.5), 0.1f, 0.1f, 1, false).setKillParticleOnFinish(true));
}
}
}
if (worldObj.isRemote && rand.nextInt(100) > 75 && !isBurning())
for (int i = 0; i < AMCore.config.getGFXLevel(); i++) worldObj.spawnParticle("largesmoke", posX + (rand.nextDouble() - 0.5D) * width, posY + rand.nextDouble() * height, posZ + (rand.nextDouble() - 0.5D) * width, 0.0D, 0.0D, 0.0D);
super.onUpdate();
}
Aggregations