use of com.teamwizardry.wizardry.api.spell.SpellData in project Wizardry by TeamWizardry.
the class ModuleShapeZone method run.
@Override
@SuppressWarnings("unused")
public boolean run(@Nonnull SpellData spell, @Nonnull SpellRing spellRing) {
World world = spell.world;
Vec3d position = spell.getData(ORIGIN);
Entity caster = spell.getCaster();
Vec3d targetPos = spell.getTarget();
if (targetPos == null)
return false;
double aoe = spellRing.getAttributeValue(AttributeRegistry.AREA, spell);
double strength = spellRing.getAttributeValue(AttributeRegistry.POTENCY, spell);
double range = spellRing.getAttributeValue(AttributeRegistry.RANGE, spell);
spellRing.multiplyMultiplierForAll((float) (aoe / 7.0 * strength / 15.0 * range / 15.0));
List<Entity> entities = world.getEntitiesWithinAABBExcludingEntity(null, new AxisAlignedBB(new BlockPos(targetPos)).grow(aoe, 1, aoe));
if (RandUtil.nextInt((int) ((70 - strength))) == 0) {
if (!spellRing.taxCaster(spell))
return false;
for (Entity entity : entities) {
if (entity.getDistance(targetPos.x, targetPos.y, targetPos.z) <= aoe) {
Vec3d vec = targetPos.addVector(RandUtil.nextDouble(-strength, strength), RandUtil.nextDouble(range), RandUtil.nextDouble(-strength, strength));
SpellData copy = spell.copy();
copy.processEntity(entity, false);
copy.addData(YAW, entity.rotationYaw);
copy.addData(PITCH, entity.rotationPitch);
copy.addData(ORIGIN, vec);
if (spellRing.getChildRing() != null) {
spellRing.getChildRing().runSpellRing(spell);
}
}
}
}
if (RandUtil.nextInt((int) ((40 - strength))) != 0)
return false;
ArrayList<Vec3d> blocks = new ArrayList<>();
for (double i = -aoe; i < aoe; i++) for (double j = 0; j < range; j++) for (double k = -aoe; k < aoe; k++) {
Vec3d pos = targetPos.addVector(i, j, k);
if (pos.distanceTo(targetPos) <= aoe) {
// BlockPos.MutableBlockPos blockPos = new BlockPos.MutableBlockPos(new BlockPos(pos));
blocks.add(pos);
}
}
if (blocks.isEmpty())
return false;
if (!spellRing.taxCaster(spell))
return false;
Vec3d pos = blocks.get(RandUtil.nextInt(blocks.size() - 1));
SpellData copy = spell.copy();
copy.addData(ORIGIN, pos);
copy.processBlock(new BlockPos(pos), EnumFacing.UP, pos);
copy.addData(YAW, RandUtil.nextFloat(-180, 180));
copy.addData(PITCH, RandUtil.nextFloat(-50, 50));
if (spellRing.getChildRing() != null) {
spellRing.getChildRing().runSpellRing(copy);
}
return true;
}
use of com.teamwizardry.wizardry.api.spell.SpellData in project Wizardry by TeamWizardry.
the class PotionTimeSlow method entityMove.
@SubscribeEvent
public void entityMove(EntityMoveEvent event) {
if (!(event.entity instanceof EntityLivingBase))
return;
EntityLivingBase base = (EntityLivingBase) event.entity;
if (!base.isPotionActive(ModPotions.TIME_SLOW))
return;
PotionEffect effect = base.getActivePotionEffect(ModPotions.TIME_SLOW);
if (effect == null)
return;
ModuleEffectTimeSlow slow = (ModuleEffectTimeSlow) ModuleRegistry.INSTANCE.getModule("effect_time_slow");
SpellData data = new SpellData(event.entity.world);
data.processEntity(event.entity, false);
SpellRing ring = new SpellRing(slow);
ring.getModule().sendRenderPacket(data, ring);
event.override = true;
Entity entity = event.entity;
double amp = effect.getAmplifier();
double x = event.x / amp;
double y = event.y / amp;
double z = event.z / amp;
MoverType type = event.type;
if (entity.noClip) {
entity.setEntityBoundingBox(entity.getEntityBoundingBox().offset(x, y, z));
entity.resetPositionToBB();
} else {
entity.world.profiler.startSection("move");
double d10 = entity.posX;
double d11 = entity.posY;
double d1 = entity.posZ;
double d2 = x;
double d3 = y;
double d4 = z;
if ((type == MoverType.SELF || type == MoverType.PLAYER) && entity.onGround && entity.isSneaking() && entity instanceof EntityPlayer) {
for (; x != 0.0D && entity.world.getCollisionBoxes(entity, entity.getEntityBoundingBox().offset(x, (double) (-entity.stepHeight), 0.0D)).isEmpty(); d2 = x) {
if (x < 0.05D && x >= -0.05D) {
x = 0.0D;
} else if (x > 0.0D) {
x -= 0.05D;
} else {
x += 0.05D;
}
}
for (; z != 0.0D && entity.world.getCollisionBoxes(entity, entity.getEntityBoundingBox().offset(0.0D, (double) (-entity.stepHeight), z)).isEmpty(); d4 = z) {
if (z < 0.05D && z >= -0.05D) {
z = 0.0D;
} else if (z > 0.0D) {
z -= 0.05D;
} else {
z += 0.05D;
}
}
for (; x != 0.0D && z != 0.0D && entity.world.getCollisionBoxes(entity, entity.getEntityBoundingBox().offset(x, (double) (-entity.stepHeight), z)).isEmpty(); d4 = z) {
if (x < 0.05D && x >= -0.05D) {
x = 0.0D;
} else if (x > 0.0D) {
x -= 0.05D;
} else {
x += 0.05D;
}
d2 = x;
if (z < 0.05D && z >= -0.05D) {
z = 0.0D;
} else if (z > 0.0D) {
z -= 0.05D;
} else {
z += 0.05D;
}
}
}
List<AxisAlignedBB> list1 = entity.world.getCollisionBoxes(entity, entity.getEntityBoundingBox().offset(x, y, z));
AxisAlignedBB axisalignedbb = entity.getEntityBoundingBox();
if (y != 0.0D) {
int k = 0;
for (int l = list1.size(); k < l; ++k) {
y = list1.get(k).calculateYOffset(entity.getEntityBoundingBox(), y);
}
entity.setEntityBoundingBox(entity.getEntityBoundingBox().offset(0.0D, y, 0.0D));
}
if (x != 0.0D) {
int j5 = 0;
for (int l5 = list1.size(); j5 < l5; ++j5) {
x = list1.get(j5).calculateXOffset(entity.getEntityBoundingBox(), x);
}
if (x != 0.0D) {
entity.setEntityBoundingBox(entity.getEntityBoundingBox().offset(x, 0.0D, 0.0D));
}
}
if (z != 0.0D) {
int k5 = 0;
for (int i6 = list1.size(); k5 < i6; ++k5) {
z = list1.get(k5).calculateZOffset(entity.getEntityBoundingBox(), z);
}
if (z != 0.0D) {
entity.setEntityBoundingBox(entity.getEntityBoundingBox().offset(0.0D, 0.0D, z));
}
}
boolean flag = entity.onGround || d3 != y && d3 < 0.0D;
if (entity.stepHeight > 0.0F && flag && (d2 != x || d4 != z)) {
double d14 = x;
double d6 = y;
double d7 = z;
AxisAlignedBB axisalignedbb1 = entity.getEntityBoundingBox();
entity.setEntityBoundingBox(axisalignedbb);
y = (double) entity.stepHeight;
List<AxisAlignedBB> list = entity.world.getCollisionBoxes(entity, entity.getEntityBoundingBox().offset(d2, y, d4));
AxisAlignedBB axisalignedbb2 = entity.getEntityBoundingBox();
AxisAlignedBB axisalignedbb3 = axisalignedbb2.offset(d2, 0.0D, d4);
double d8 = y;
int j1 = 0;
for (int k1 = list.size(); j1 < k1; ++j1) {
d8 = list.get(j1).calculateYOffset(axisalignedbb3, d8);
}
axisalignedbb2 = axisalignedbb2.offset(0.0D, d8, 0.0D);
double d18 = d2;
int l1 = 0;
for (int i2 = list.size(); l1 < i2; ++l1) {
d18 = list.get(l1).calculateXOffset(axisalignedbb2, d18);
}
axisalignedbb2 = axisalignedbb2.offset(d18, 0.0D, 0.0D);
double d19 = d4;
int j2 = 0;
for (int k2 = list.size(); j2 < k2; ++j2) {
d19 = list.get(j2).calculateZOffset(axisalignedbb2, d19);
}
axisalignedbb2 = axisalignedbb2.offset(0.0D, 0.0D, d19);
AxisAlignedBB axisalignedbb4 = entity.getEntityBoundingBox();
double d20 = y;
int l2 = 0;
for (int i3 = list.size(); l2 < i3; ++l2) {
d20 = list.get(l2).calculateYOffset(axisalignedbb4, d20);
}
axisalignedbb4 = axisalignedbb4.offset(0.0D, d20, 0.0D);
double d21 = d2;
int j3 = 0;
for (int k3 = list.size(); j3 < k3; ++j3) {
d21 = list.get(j3).calculateXOffset(axisalignedbb4, d21);
}
axisalignedbb4 = axisalignedbb4.offset(d21, 0.0D, 0.0D);
double d22 = d4;
int l3 = 0;
for (int i4 = list.size(); l3 < i4; ++l3) {
d22 = list.get(l3).calculateZOffset(axisalignedbb4, d22);
}
axisalignedbb4 = axisalignedbb4.offset(0.0D, 0.0D, d22);
double d23 = d18 * d18 + d19 * d19;
double d9 = d21 * d21 + d22 * d22;
if (d23 > d9) {
x = d18;
z = d19;
y = -d8;
entity.setEntityBoundingBox(axisalignedbb2);
} else {
x = d21;
z = d22;
y = -d20;
entity.setEntityBoundingBox(axisalignedbb4);
}
int j4 = 0;
for (int k4 = list.size(); j4 < k4; ++j4) {
y = list.get(j4).calculateYOffset(entity.getEntityBoundingBox(), y);
}
entity.setEntityBoundingBox(entity.getEntityBoundingBox().offset(0.0D, y, 0.0D));
if (d14 * d14 + d7 * d7 >= x * x + z * z) {
x = d14;
y = d6;
z = d7;
entity.setEntityBoundingBox(axisalignedbb1);
}
}
entity.world.profiler.endSection();
entity.world.profiler.startSection("rest");
entity.resetPositionToBB();
entity.collidedHorizontally = d2 != x || d4 != z;
entity.collidedVertically = d3 != y;
entity.onGround = entity.collidedVertically && d3 < 0.0D;
entity.collided = entity.collidedHorizontally || entity.collidedVertically;
int j6 = MathHelper.floor(entity.posX);
int i1 = MathHelper.floor(entity.posY - 0.20000000298023224D);
int k6 = MathHelper.floor(entity.posZ);
BlockPos blockpos = new BlockPos(j6, i1, k6);
IBlockState iblockstate = entity.world.getBlockState(blockpos);
if (iblockstate.getMaterial() == Material.AIR) {
BlockPos blockpos1 = blockpos.down();
IBlockState iblockstate1 = entity.world.getBlockState(blockpos1);
Block block1 = iblockstate1.getBlock();
if (block1 instanceof BlockFence || block1 instanceof BlockWall || block1 instanceof BlockFenceGate) {
iblockstate = iblockstate1;
blockpos = blockpos1;
}
}
if (d2 != x) {
entity.motionX = 0.0D;
}
if (d4 != z) {
entity.motionZ = 0.0D;
}
Block block = iblockstate.getBlock();
if (d3 != y) {
block.onLanded(entity.world, entity);
}
if ((!entity.onGround || !entity.isSneaking() || !(entity instanceof EntityPlayer)) && !entity.isRiding()) {
double d15 = entity.posX - d10;
double d16 = entity.posY - d11;
double d17 = entity.posZ - d1;
if (block != Blocks.LADDER) {
d16 = 0.0D;
}
if (block != null && entity.onGround) {
block.onEntityWalk(entity.world, blockpos, entity);
}
entity.distanceWalkedModified = (float) ((double) entity.distanceWalkedModified + (double) MathHelper.sqrt(d15 * d15 + d17 * d17) * 0.6D);
entity.distanceWalkedOnStepModified = (float) ((double) entity.distanceWalkedOnStepModified + (double) MathHelper.sqrt(d15 * d15 + d16 * d16 + d17 * d17) * 0.6D);
}
try {
AxisAlignedBB bb = entity.getEntityBoundingBox();
BlockPos.PooledMutableBlockPos blockpos$pooledmutableblockpos = BlockPos.PooledMutableBlockPos.retain(bb.minX + 0.001D, bb.minY + 0.001D, bb.minZ + 0.001D);
BlockPos.PooledMutableBlockPos blockpos$pooledmutableblockpos1 = BlockPos.PooledMutableBlockPos.retain(bb.maxX - 0.001D, bb.maxY - 0.001D, bb.maxZ - 0.001D);
BlockPos.PooledMutableBlockPos blockpos$pooledmutableblockpos2 = BlockPos.PooledMutableBlockPos.retain();
if (entity.world.isAreaLoaded(blockpos$pooledmutableblockpos, blockpos$pooledmutableblockpos1)) {
for (int i = blockpos$pooledmutableblockpos.getX(); i <= blockpos$pooledmutableblockpos1.getX(); ++i) {
for (int j = blockpos$pooledmutableblockpos.getY(); j <= blockpos$pooledmutableblockpos1.getY(); ++j) {
for (int k = blockpos$pooledmutableblockpos.getZ(); k <= blockpos$pooledmutableblockpos1.getZ(); ++k) {
blockpos$pooledmutableblockpos2.setPos(i, j, k);
IBlockState state = entity.world.getBlockState(blockpos$pooledmutableblockpos2);
try {
state.getBlock().onEntityCollidedWithBlock(entity.world, blockpos$pooledmutableblockpos2, state, entity);
} catch (Throwable throwable) {
CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Colliding entity with block");
CrashReportCategory crashreportcategory = crashreport.makeCategory("Block being collided with");
CrashReportCategory.addBlockInfo(crashreportcategory, blockpos$pooledmutableblockpos2, state);
throw new ReportedException(crashreport);
}
}
}
}
}
blockpos$pooledmutableblockpos.release();
blockpos$pooledmutableblockpos1.release();
blockpos$pooledmutableblockpos2.release();
} catch (Throwable throwable) {
CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Checking entity block collision");
CrashReportCategory crashreportcategory = crashreport.makeCategory("Entity being checked for collision");
entity.addEntityCrashInfo(crashreportcategory);
throw new ReportedException(crashreport);
}
entity.world.profiler.endSection();
}
}
use of com.teamwizardry.wizardry.api.spell.SpellData in project Wizardry by TeamWizardry.
the class ModuleEffectSubstitution method render.
@Override
@SuppressWarnings("unused")
@SideOnly(Side.CLIENT)
public void render(@Nonnull SpellData spell, @Nonnull SpellRing spellRing) {
World world = spell.world;
Entity caster = spell.getCaster();
BlockPos targetBlock = spell.getTargetPos();
Entity targetEntity = spell.getVictim();
if (targetEntity != null && caster != null) {
ParticleBuilder glitter = new ParticleBuilder(RandUtil.nextInt(20, 30));
glitter.setRender(new ResourceLocation(Wizardry.MODID, Constants.MISC.SPARKLE_BLURRED));
glitter.setColorFunction(new InterpColorHSV(getPrimaryColor(), getSecondaryColor()));
ParticleSpawner.spawn(glitter, spell.world, new StaticInterp<>(new Vec3d(targetEntity.posX, targetEntity.posY, targetEntity.posZ)), 50, RandUtil.nextInt(20, 30), (aFloat, particleBuilder) -> {
glitter.setScale((float) RandUtil.nextDouble(0.3, 1));
glitter.setAlphaFunction(new InterpFadeInOut(0.3f, (float) RandUtil.nextDouble(0.6, 1)));
glitter.setLifetime(RandUtil.nextInt(10, 20));
glitter.setScaleFunction(new InterpScale(1, 0));
glitter.setPositionFunction(new InterpHelix(new Vec3d(0, 0, 0), new Vec3d(0, 2, 0), 0.5f, 0f, 1, RandUtil.nextFloat()));
});
glitter.setColorFunction(new InterpColorHSV(getSecondaryColor(), getPrimaryColor()));
ParticleSpawner.spawn(glitter, spell.world, new StaticInterp<>(new Vec3d(caster.posX, caster.posY, caster.posZ)), 50, RandUtil.nextInt(20, 30), (aFloat, particleBuilder) -> {
glitter.setScale((float) RandUtil.nextDouble(0.3, 1));
glitter.setAlphaFunction(new InterpFadeInOut(0.3f, (float) RandUtil.nextDouble(0.6, 1)));
glitter.setLifetime(RandUtil.nextInt(10, 20));
glitter.setScaleFunction(new InterpScale(1, 0));
glitter.setPositionFunction(new InterpHelix(new Vec3d(0, 0, 0), new Vec3d(0, 4, 0), 1f, 0f, 1, RandUtil.nextFloat()));
});
} else if (targetBlock != null) {
ParticleBuilder glitter = new ParticleBuilder(RandUtil.nextInt(20, 30));
glitter.setRender(new ResourceLocation(Wizardry.MODID, Constants.MISC.SPARKLE_BLURRED));
glitter.setColorFunction(new InterpColorHSV(getPrimaryColor(), getSecondaryColor()));
ParticleSpawner.spawn(glitter, spell.world, new StaticInterp<>(new Vec3d(targetBlock).addVector(0.5, 0.5, 0.5)), 20, RandUtil.nextInt(20, 30), (aFloat, particleBuilder) -> {
glitter.setScale((float) RandUtil.nextDouble(0.3, 1));
glitter.setAlphaFunction(new InterpFadeInOut(0.3f, (float) RandUtil.nextDouble(0.6, 1)));
glitter.setLifetime(RandUtil.nextInt(10, 20));
glitter.setScaleFunction(new InterpScale(1, 0));
glitter.setMotion(new Vec3d(RandUtil.nextDouble(-0.001, 0.001), RandUtil.nextDouble(-0.001, 0.001), RandUtil.nextDouble(-0.001, 0.001)));
});
}
}
use of com.teamwizardry.wizardry.api.spell.SpellData in project Wizardry by TeamWizardry.
the class TilePearlHolder method update.
@Override
public void update() {
super.update();
if (containsNacrePearl()) {
if (world.isRemote)
return;
updateCooldown(getItemStack());
IWizardryCapability pearlCap = WizardryCapabilityProvider.getCap(getItemStack());
if (pearlCap == null || pearlCap.getMana() > pearlCap.getMaxMana() || isPartOfStructure || structurePos != null)
return;
if (world.isBlockPowered(getPos()))
return;
if (isCoolingDown(getItemStack()))
return;
if (pearlCap.getMana() == 0)
return;
BlockPos closestMagnet = null;
for (int i = -10; i < 10; i++) for (int j = -10; j < 10; j++) for (int k = -10; k < 10; k++) {
BlockPos pos = new BlockPos(getPos().getX() + i, getPos().getY() + j, getPos().getZ() + k);
if (world.getBlockState(pos).getBlock() != ModBlocks.MANA_MAGNET)
continue;
if (closestMagnet == null)
closestMagnet = pos;
else if (pos.distanceSq(getPos()) < getPos().distanceSq(closestMagnet))
closestMagnet = pos;
}
if (closestMagnet == null)
return;
{
Vec3d direction = new Vec3d(closestMagnet).subtract(new Vec3d(getPos())).normalize();
SpellData spell = new SpellData(getWorld());
spell.addData(LOOK, direction);
spell.addData(ORIGIN, new Vec3d(getPos()).addVector(0.5, 1.5, 0.5));
spell.addData(CAPABILITY, pearlCap);
SpellUtils.runSpell(getItemStack(), spell);
setCooldown(world, null, null, getItemStack(), spell);
}
}
}
use of com.teamwizardry.wizardry.api.spell.SpellData in project Wizardry by TeamWizardry.
the class PacketRenderSpell method handle.
@Override
public void handle(@Nonnull MessageContext messageContext) {
if (messageContext.side.isServer())
return;
World world = LibrarianLib.PROXY.getClientPlayer().world;
if (world == null || spellRing == null || spellData == null)
return;
SpellData data = new SpellData(world);
data.deserializeNBT(spellData);
try {
if (spellRing.getModule() != null) {
spellRing.getModule().render(data, spellRing);
}
} catch (Exception ignored) {
}
}
Aggregations