use of com.teamwizardry.wizardry.api.spell.SpellBuilder in project Wizardry by TeamWizardry.
the class TileCraftingPlate method update.
@Override
public void update() {
super.update();
if (!((BlockCraftingPlate) getBlockType()).isStructureComplete(getWorld(), getPos()))
return;
if (!new CapManager(getWizardryCap()).isManaFull()) {
for (BlockPos relative : poses) {
BlockPos target = getPos().add(relative);
TileEntity tile = world.getTileEntity(target);
if (tile != null && tile instanceof TilePearlHolder) {
if (!((TilePearlHolder) tile).isPartOfStructure) {
((TilePearlHolder) tile).isPartOfStructure = true;
((TilePearlHolder) tile).structurePos = getPos();
tile.markDirty();
}
}
}
}
for (EntityItem entityItem : world.getEntitiesWithinAABB(EntityItem.class, new AxisAlignedBB(pos))) {
if (hasInputPearl())
break;
if (!isInventoryEmpty() && entityItem.getItem().getItem() instanceof IInfusable) {
ItemStack stack = entityItem.getItem().copy();
stack.setCount(1);
entityItem.getItem().shrink(1);
inputPearl.getHandler().setStackInSlot(0, stack);
} else if (!(entityItem.getItem().getItem() instanceof IInfusable)) {
ItemStack stack = entityItem.getItem().copy();
stack.setCount(1);
entityItem.getItem().shrink(1);
for (int i = 0; i < realInventory.getHandler().getSlots(); i++) {
if (realInventory.getHandler().getStackInSlot(i).isEmpty()) {
realInventory.getHandler().setStackInSlot(i, stack);
ClientRunnable.run(new ClientRunnable() {
@Override
@SideOnly(Side.CLIENT)
public void runIfClient() {
if (renderHandler != null)
((TileCraftingPlateRenderer) renderHandler).addAnimation();
}
});
break;
}
}
}
markDirty();
}
if (hasInputPearl() && !isInventoryEmpty()) {
CapManager manager = new CapManager(getInputPearl());
if (manager.isManaFull()) {
ArrayList<ItemStack> stacks = new ArrayList<>();
for (int i = 0; i < realInventory.getHandler().getSlots(); i++) {
if (!realInventory.getHandler().getStackInSlot(i).isEmpty()) {
stacks.add(realInventory.getHandler().getStackInSlot(i));
realInventory.getHandler().setStackInSlot(i, ItemStack.EMPTY);
}
}
SpellBuilder builder = new SpellBuilder(stacks, true);
ItemStack infusedPearl = inputPearl.getHandler().getStackInSlot(0).copy();
inputPearl.getHandler().setStackInSlot(0, ItemStack.EMPTY);
outputPearl.getHandler().setStackInSlot(0, infusedPearl);
NBTTagList list = new NBTTagList();
for (SpellRing spellRing : builder.getSpell()) {
list.appendTag(spellRing.serializeNBT());
}
ItemNBTHelper.setList(infusedPearl, Constants.NBT.SPELL, list);
// Color lastColor = SpellUtils.getAverageSpellColor(builder.getSpell());
// float[] hsv = ColorUtils.getHSVFromColor(lastColor);
// ItemNBTHelper.setFloat(infusedPearl, "hue", hsv[0]);
// ItemNBTHelper.setFloat(infusedPearl, "saturation", hsv[1]);
ItemNBTHelper.setFloat(infusedPearl, Constants.NBT.RAND, world.rand.nextFloat());
ItemNBTHelper.setString(infusedPearl, "type", EnumPearlType.INFUSED.toString());
// Process spellData multipliers based on nacre quality
if (infusedPearl.getItem() instanceof INacreProduct) {
float purity = ((INacreProduct) infusedPearl.getItem()).getQuality(infusedPearl);
double multiplier;
if (purity >= 1f)
multiplier = ConfigValues.perfectPearlMultiplier * purity;
else if (purity <= ConfigValues.damagedPearlMultiplier)
multiplier = ConfigValues.damagedPearlMultiplier;
else {
double base = purity - 1;
multiplier = 1 - (base * base * base * base);
}
for (SpellRing spellRing : SpellUtils.getAllSpellRings(infusedPearl)) spellRing.multiplyMultiplierForAll((float) multiplier);
}
ClientRunnable.run(new ClientRunnable() {
@Override
@SideOnly(Side.CLIENT)
public void runIfClient() {
if (renderHandler != null)
((TileCraftingPlateRenderer) renderHandler).clearAll();
}
});
markDirty();
PacketHandler.NETWORK.sendToAllAround(new PacketExplode(new Vec3d(pos).addVector(0.5, 0.5, 0.5), Color.CYAN, Color.BLUE, 2, 2, 500, 300, 20, true), new NetworkRegistry.TargetPoint(world.provider.getDimension(), pos.getX(), pos.getY(), pos.getZ(), 256));
world.playSound(null, getPos(), ModSounds.BASS_BOOM, SoundCategory.BLOCKS, 1f, (float) RandUtil.nextDouble(1, 1.5));
List<Entity> entityList = world.getEntitiesWithinAABBExcludingEntity(null, new AxisAlignedBB(pos).grow(32, 32, 32));
for (Entity entity1 : entityList) {
double dist = entity1.getDistance(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5);
final double upperMag = 3;
final double scale = 0.8;
double mag = upperMag * (scale * dist / (-scale * dist - 1) + 1);
Vec3d dir = entity1.getPositionVector().subtract(new Vec3d(pos).addVector(0.5, 0.5, 0.5)).normalize().scale(mag);
entity1.motionX = (dir.x);
entity1.motionY = (dir.y);
entity1.motionZ = (dir.z);
entity1.fallDistance = 0;
entity1.velocityChanged = true;
if (entity1 instanceof EntityPlayerMP)
((EntityPlayerMP) entity1).connection.sendPacket(new SPacketEntityVelocity(entity1));
}
}
}
}
use of com.teamwizardry.wizardry.api.spell.SpellBuilder in project Wizardry by TeamWizardry.
the class BlockCraftingPlate method onBlockActivated.
@Override
public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
ItemStack heldItem = playerIn.getHeldItem(hand);
if (isStructureComplete(worldIn, pos)) {
TileCraftingPlate plate = getTE(worldIn, pos);
if (!plate.inputPearl.getHandler().getStackInSlot(0).isEmpty())
return false;
if (!heldItem.isEmpty()) {
if (heldItem.getItem() == ModItems.BOOK && playerIn.isCreative()) {
ItemStack pearl = new ItemStack(ModItems.PEARL_NACRE);
NBTTagList spellList = ItemNBTHelper.getList(heldItem, Constants.NBT.SPELL, net.minecraftforge.common.util.Constants.NBT.TAG_COMPOUND);
if (spellList == null)
return false;
SpellBuilder builder = new SpellBuilder(SpellUtils.getSpellChains(spellList), true, true);
// Color lastColor = SpellUtils.getAverageSpellColor(builder.getSpell());
//
// float[] hsv = ColorUtils.getHSVFromColor(lastColor);
// ItemNBTHelper.setFloat(pearl, "hue", hsv[0]);
// ItemNBTHelper.setFloat(pearl, "saturation", hsv[1]);
ItemNBTHelper.setFloat(pearl, Constants.NBT.RAND, playerIn.world.rand.nextFloat());
ItemNBTHelper.setList(pearl, Constants.NBT.SPELL, spellList);
plate.outputPearl.getHandler().setStackInSlot(0, pearl);
plate.markDirty();
PacketHandler.NETWORK.sendToAllAround(new PacketExplode(new Vec3d(pos).addVector(0.5, 0.5, 0.5), Color.CYAN, Color.BLUE, 2, 2, 500, 300, 20, false), new NetworkRegistry.TargetPoint(worldIn.provider.getDimension(), pos.getX(), pos.getY(), pos.getZ(), 256));
worldIn.playSound(null, pos, ModSounds.BASS_BOOM, SoundCategory.BLOCKS, 1f, (float) RandUtil.nextDouble(1, 1.5));
return true;
} else {
ItemStack stack = heldItem.copy();
stack.setCount(1);
heldItem.shrink(1);
if (!plate.isInventoryEmpty() && stack.getItem() instanceof IInfusable) {
plate.inputPearl.getHandler().setStackInSlot(0, stack);
} else if (!(stack.getItem() instanceof IInfusable)) {
for (int i = 0; i < plate.realInventory.getHandler().getSlots(); i++) {
if (plate.realInventory.getHandler().getStackInSlot(i).isEmpty()) {
plate.realInventory.getHandler().setStackInSlot(i, stack);
ClientRunnable.run(new ClientRunnable() {
@Override
@SideOnly(Side.CLIENT)
public void runIfClient() {
if (plate.renderHandler != null)
((TileCraftingPlateRenderer) plate.renderHandler).addAnimation();
}
});
break;
}
}
}
playerIn.openContainer.detectAndSendChanges();
worldIn.notifyBlockUpdate(pos, state, state, 3);
return true;
}
} else {
if (plate.hasOutputPearl()) {
playerIn.setHeldItem(hand, plate.outputPearl.getHandler().extractItem(0, 1, false));
playerIn.openContainer.detectAndSendChanges();
worldIn.notifyBlockUpdate(pos, state, state, 3);
return true;
} else {
boolean empty = true;
for (int i = 0; i < plate.realInventory.getHandler().getSlots(); i++) {
if (!plate.realInventory.getHandler().getStackInSlot(i).isEmpty()) {
empty = false;
break;
}
}
if (!empty) {
for (int i = plate.realInventory.getHandler().getSlots() - 1; i >= 0; i--) {
ItemStack extracted = plate.realInventory.getHandler().getStackInSlot(i);
if (!extracted.isEmpty()) {
playerIn.addItemStackToInventory(plate.realInventory.getHandler().extractItem(i, extracted.getCount(), false));
plate.markDirty();
ClientRunnable.run(new ClientRunnable() {
@Override
@SideOnly(Side.CLIENT)
public void runIfClient() {
if (plate.renderHandler != null)
((TileCraftingPlateRenderer) plate.renderHandler).clearAll();
}
});
break;
}
}
}
}
return true;
}
} else {
if (playerIn.isCreative() && playerIn.isSneaking()) {
tickStructure(worldIn, playerIn, pos);
} else {
TileCraftingPlate plate = getTE(worldIn, pos);
plate.revealStructure = !plate.revealStructure;
plate.markDirty();
}
}
return heldItem.isEmpty();
}
Aggregations