Search in sources :

Example 1 with SpellBuilder

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));
            }
        }
    }
}
Also used : AxisAlignedBB(net.minecraft.util.math.AxisAlignedBB) Entity(net.minecraft.entity.Entity) TileEntity(net.minecraft.tileentity.TileEntity) PacketExplode(com.teamwizardry.wizardry.common.network.PacketExplode) ArrayList(java.util.ArrayList) SpellBuilder(com.teamwizardry.wizardry.api.spell.SpellBuilder) IInfusable(com.teamwizardry.wizardry.api.item.IInfusable) SideOnly(net.minecraftforge.fml.relauncher.SideOnly) TileEntity(net.minecraft.tileentity.TileEntity) NBTTagList(net.minecraft.nbt.NBTTagList) SPacketEntityVelocity(net.minecraft.network.play.server.SPacketEntityVelocity) NetworkRegistry(net.minecraftforge.fml.common.network.NetworkRegistry) BlockPos(net.minecraft.util.math.BlockPos) TileCraftingPlateRenderer(com.teamwizardry.wizardry.client.render.block.TileCraftingPlateRenderer) EntityItem(net.minecraft.entity.item.EntityItem) ClientRunnable(com.teamwizardry.librarianlib.features.utilities.client.ClientRunnable) Vec3d(net.minecraft.util.math.Vec3d) CapManager(com.teamwizardry.wizardry.api.capability.CapManager) SpellRing(com.teamwizardry.wizardry.api.spell.SpellRing) INacreProduct(com.teamwizardry.wizardry.api.item.INacreProduct) EntityPlayerMP(net.minecraft.entity.player.EntityPlayerMP) ItemStack(net.minecraft.item.ItemStack)

Example 2 with SpellBuilder

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();
}
Also used : PacketExplode(com.teamwizardry.wizardry.common.network.PacketExplode) SpellBuilder(com.teamwizardry.wizardry.api.spell.SpellBuilder) IInfusable(com.teamwizardry.wizardry.api.item.IInfusable) SideOnly(net.minecraftforge.fml.relauncher.SideOnly) ClientRunnable(com.teamwizardry.librarianlib.features.utilities.client.ClientRunnable) Vec3d(net.minecraft.util.math.Vec3d) NBTTagList(net.minecraft.nbt.NBTTagList) NetworkRegistry(net.minecraftforge.fml.common.network.NetworkRegistry) TileCraftingPlateRenderer(com.teamwizardry.wizardry.client.render.block.TileCraftingPlateRenderer) ItemStack(net.minecraft.item.ItemStack) TileCraftingPlate(com.teamwizardry.wizardry.common.tile.TileCraftingPlate)

Aggregations

ClientRunnable (com.teamwizardry.librarianlib.features.utilities.client.ClientRunnable)2 IInfusable (com.teamwizardry.wizardry.api.item.IInfusable)2 SpellBuilder (com.teamwizardry.wizardry.api.spell.SpellBuilder)2 TileCraftingPlateRenderer (com.teamwizardry.wizardry.client.render.block.TileCraftingPlateRenderer)2 PacketExplode (com.teamwizardry.wizardry.common.network.PacketExplode)2 ItemStack (net.minecraft.item.ItemStack)2 NBTTagList (net.minecraft.nbt.NBTTagList)2 Vec3d (net.minecraft.util.math.Vec3d)2 NetworkRegistry (net.minecraftforge.fml.common.network.NetworkRegistry)2 SideOnly (net.minecraftforge.fml.relauncher.SideOnly)2 CapManager (com.teamwizardry.wizardry.api.capability.CapManager)1 INacreProduct (com.teamwizardry.wizardry.api.item.INacreProduct)1 SpellRing (com.teamwizardry.wizardry.api.spell.SpellRing)1 TileCraftingPlate (com.teamwizardry.wizardry.common.tile.TileCraftingPlate)1 ArrayList (java.util.ArrayList)1 Entity (net.minecraft.entity.Entity)1 EntityItem (net.minecraft.entity.item.EntityItem)1 EntityPlayerMP (net.minecraft.entity.player.EntityPlayerMP)1 SPacketEntityVelocity (net.minecraft.network.play.server.SPacketEntityVelocity)1 TileEntity (net.minecraft.tileentity.TileEntity)1