Package com.sk89q.craftbook.mechanics.ic.gates.world.blocks

Source Code of com.sk89q.craftbook.mechanics.ic.gates.world.blocks.BonemealTerraformer$Factory

package com.sk89q.craftbook.mechanics.ic.gates.world.blocks;

import java.util.Random;

import org.bukkit.Material;
import org.bukkit.Server;
import org.bukkit.TreeType;
import org.bukkit.block.Biome;
import org.bukkit.block.Block;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;

import com.sk89q.craftbook.ChangedSign;
import com.sk89q.craftbook.bukkit.CraftBookPlugin;
import com.sk89q.craftbook.bukkit.util.BukkitUtil;
import com.sk89q.craftbook.mechanics.ic.AbstractICFactory;
import com.sk89q.craftbook.mechanics.ic.AbstractSelfTriggeredIC;
import com.sk89q.craftbook.mechanics.ic.ChipState;
import com.sk89q.craftbook.mechanics.ic.IC;
import com.sk89q.craftbook.mechanics.ic.ICFactory;
import com.sk89q.craftbook.mechanics.ic.ICVerificationException;
import com.sk89q.craftbook.util.InventoryUtil;
import com.sk89q.craftbook.util.SearchArea;
import com.sk89q.worldedit.blocks.BlockID;

public class BonemealTerraformer extends AbstractSelfTriggeredIC {

    SearchArea area;

    public BonemealTerraformer(Server server, ChangedSign block, ICFactory factory) {

        super(server, block, factory);
    }

    @Override
    public void load() {

        area = SearchArea.createArea(getLocation().getBlock(), getLine(2));
    }

    @Override
    public String getTitle() {

        return "Bonemeal Terraformer";
    }

    @Override
    public String getSignTitle() {

        return "TERRAFORMER";
    }

    @Override
    public void trigger(ChipState chip) {

        if (chip.getInput(0)) {
            terraform();
        }
    }

    @Override
    public void think(ChipState state) {

        if(state.getInput(0)) return;

        for(int i = 0; i < 10; i++)
            terraform();
    }

    public void terraform() {

        Block b = area.getRandomBlockInArea();

        if(b == null) return;

        if (b.getType() == Material.CROPS && b.getData() < 0x7) {
            if (consumeBonemeal()) {
                b.setData((byte) (b.getData() + 0x1));
            }
            return;
        }
        if ((b.getType() == Material.CROPS || b.getType() == Material.CARROT || b.getType() == Material.POTATO || b.getType() == Material.MELON_STEM || b.getType() == Material.PUMPKIN_STEM) && b.getData() < 0x7) {
            if (consumeBonemeal()) {
                byte add = (byte) CraftBookPlugin.inst().getRandom().nextInt(3);
                if(b.getData() + add > 0x7)
                    b.setData((byte) 0x7);
                else
                    b.setData((byte) (b.getData() + add));
            }
            return;
        }
        if (b.getType() == Material.COCOA && ((b.getData() & 0x8) != 0x8 || (b.getData() & 0xC) != 0xC)) {
            if (consumeBonemeal()) {
                if (CraftBookPlugin.inst().getRandom().nextInt(30) == 0)
                    b.setData((byte) (b.getData() | 0xC));
                else b.setData((byte) (b.getData() | 0x8));
            }
            return;
        }
        if (b.getType() == Material.NETHER_WARTS && b.getData() < 0x3) {
            if (consumeBonemeal()) {
                b.setData((byte) (b.getData() + 0x1));
            }
            return;
        }
        if (b.getType() == Material.SAPLING) {
            if (consumeBonemeal()) {
                if (!growTree(b, CraftBookPlugin.inst().getRandom())) refundBonemeal();
                else return;
            }
        }
        if (b.getType() == Material.BROWN_MUSHROOM || b.getType() == Material.RED_MUSHROOM) {
            if (consumeBonemeal()) {
                if (b.getType() == Material.BROWN_MUSHROOM) {
                    b.setType(Material.AIR);
                    if (!b.getWorld().generateTree(b.getLocation(), TreeType.BROWN_MUSHROOM)) {
                        b.setType(Material.BROWN_MUSHROOM);
                        refundBonemeal();
                    } else return;
                }
                if (b.getType() == Material.RED_MUSHROOM) {
                    b.setType(Material.AIR);
                    if (!b.getWorld().generateTree(b.getLocation(), TreeType.RED_MUSHROOM)) {
                        b.setType(Material.RED_MUSHROOM);
                        refundBonemeal();
                    } else return;
                }
            }
        }
        if ((b.getType() == Material.SUGAR_CANE_BLOCK || b.getType() == Material.CACTUS) && b.getData() < 0x15 && b.getRelative(0, 1, 0).getType() == Material.AIR) {
            if (consumeBonemeal()) {
                b.getRelative(0, 1, 0).setType(b.getType());
            }
            return;
        }
        if (b.getType() == Material.DIRT && b.getRelative(0, 1, 0).getType() == Material.AIR) {
            if (consumeBonemeal()) {
                b.setType(b.getBiome() == Biome.MUSHROOM_ISLAND || b.getBiome() == Biome.MUSHROOM_SHORE ? Material.MYCEL : Material.GRASS);
            }
            return;
        }
        if (b.getType() == Material.GRASS && b.getRelative(0, 1, 0).getType() == Material.AIR && CraftBookPlugin.inst().getRandom().nextInt(15) == 0) {
            if (consumeBonemeal()) {
                int t = CraftBookPlugin.inst().getRandom().nextInt(7);
                if (t == 0) {
                    b.getRelative(0, 1, 0).setTypeIdAndData(BlockID.LONG_GRASS, (byte) 1, true);
                } else if (t == 1) {
                    b.getRelative(0, 1, 0).setType(Material.YELLOW_FLOWER);
                } else if (t == 2) {
                    b.getRelative(0, 1, 0).setType(Material.RED_ROSE);
                } else if (t == 3) {
                    b.getRelative(0, 1, 0).setTypeIdAndData(BlockID.LONG_GRASS, (byte) 2, true);
                } else {
                    b.getRelative(0, 1, 0).setTypeIdAndData(BlockID.LONG_GRASS, (byte) 1, true);
                }
            }
            return;
        }
        if (b.getTypeId() == BlockID.SAND && b.getRelative(0, 1, 0).getType() == Material.AIR && CraftBookPlugin.inst().getRandom().nextInt(15) == 0) {
            if (consumeBonemeal()) {
                b.getRelative(0, 1, 0).setTypeIdAndData(BlockID.LONG_GRASS, (byte) 0, true);
            }
            return;
        }
        if (b.getType() == Material.VINE && b.getRelative(0, -1, 0).getType() == Material.AIR && CraftBookPlugin.inst().getRandom().nextInt(15) == 0) {
            if (consumeBonemeal()) {
                b.getRelative(0, -1, 0).setTypeIdAndData(BlockID.VINE, b.getData(), true);
            }
            return;
        }
        if (b.getType() == Material.STATIONARY_WATER && b.getRelative(0, 1, 0).getType() == Material.AIR && CraftBookPlugin.inst().getRandom().nextInt(30) == 0) {
            if (consumeBonemeal()) {
                b.getRelative(0, 1, 0).setType(Material.WATER_LILY);
            }
            return;
        }
        if (b.getType() == Material.MYCEL && b.getRelative(0, 1, 0).getType() == Material.AIR
                && CraftBookPlugin.inst().getRandom().nextInt(15) == 0) {
            if (consumeBonemeal()) {
                int t = CraftBookPlugin.inst().getRandom().nextInt(2);
                if (t == 0) {
                    b.getRelative(0, 1, 0).setType(Material.RED_MUSHROOM);
                } else if (t == 1) {
                    b.getRelative(0, 1, 0).setType(Material.BROWN_MUSHROOM);
                }
            }
            return;
        }
    }

    public boolean consumeBonemeal() {

        Block chest = getBackBlock().getRelative(0, 1, 0);
        return InventoryUtil.doesBlockHaveInventory(chest) && InventoryUtil.removeItemsFromInventory((InventoryHolder) chest.getState(), new ItemStack(Material.INK_SACK, 1, (short) 15));

    }

    public boolean refundBonemeal() {

        Block chest = getBackBlock().getRelative(0, 1, 0);
        return InventoryUtil.doesBlockHaveInventory(chest) && InventoryUtil.addItemsToInventory((InventoryHolder) chest.getState(), new ItemStack(Material.INK_SACK, 1, (short) 15)).isEmpty();

    }

    public boolean isSameSapling(Block sapling, Block other) {

        return sapling.getType() == other.getType() && (other.getData() & 3) == (sapling.getData() & 3);
    }

    public boolean growTree(Block sapling, Random random) {

        int data = sapling.getData() & 3;
        int i1 = 0;
        int j1 = 0;
        boolean flag = false;

        TreeType treeType = null;

        if (data == 1) {
            treeType = TreeType.REDWOOD;
        } else if (data == 2) {
            treeType = TreeType.BIRCH;
        } else if (data == 3) {
            for (i1 = 0; i1 >= -1; --i1) {
                for (j1 = 0; j1 >= -1; --j1) {
                    if (isSameSapling(sapling, sapling.getRelative(i1, 0, j1)) && isSameSapling(sapling,
                            sapling.getRelative(i1 + 1, 0, j1))
                            && isSameSapling(sapling, sapling.getRelative(i1, 0, j1 + 1))
                            && isSameSapling(sapling, sapling.getRelative(i1 + 1, 0, j1 + 1))) {
                        treeType = TreeType.JUNGLE;
                        flag = true;
                        break;
                    }
                }

                if (flag) {
                    break;
                }
            }

            if (!flag) {
                j1 = 0;
                i1 = 0;
                treeType = TreeType.SMALL_JUNGLE;
            }
        } else {
            treeType = TreeType.TREE;
            if (random.nextInt(10) == 0) {
                treeType = TreeType.BIG_TREE;
            }
        }

        if (flag) {
            sapling.getRelative(i1, 0, j1).setTypeId(0);
            sapling.getRelative(i1 + 1, 0, j1).setTypeId(0);
            sapling.getRelative(i1, 0, j1 + 1).setTypeId(0);
            sapling.getRelative(i1 + 1, 0, j1 + 1).setTypeId(0);
        } else {
            sapling.setTypeId(0);
        }

        boolean planted = sapling.getWorld().generateTree(sapling.getRelative(i1, 0, j1).getLocation(), treeType);

        if (!planted) {
            if (flag) {
                sapling.getRelative(i1, 0, j1).setTypeIdAndData(BlockID.SAPLING, (byte) data, true);
                sapling.getRelative(i1 + 1, 0, j1).setTypeIdAndData(BlockID.SAPLING, (byte) data, true);
                sapling.getRelative(i1, 0, j1 + 1).setTypeIdAndData(BlockID.SAPLING, (byte) data, true);
                sapling.getRelative(i1 + 1, 0, j1 + 1).setTypeIdAndData(BlockID.SAPLING, (byte) data, true);
            } else {
                sapling.setTypeIdAndData(BlockID.SAPLING, (byte) data, true);
            }
        }

        return planted;
    }

    public static class Factory extends AbstractICFactory {

        int maxradius;

        public Factory(Server server) {

            super(server);
        }

        @Override
        public IC create(ChangedSign sign) {

            return new BonemealTerraformer(getServer(), sign, this);
        }

        @Override
        public String getShortDescription() {

            return "Terraforms an area using bonemeal.";
        }

        @Override
        public String[] getLineHelp() {

            return new String[] {"+oradius=x:y:z", null};
        }

        @Override
        public void verify(ChangedSign sign) throws ICVerificationException {
            if(!SearchArea.isValidArea(BukkitUtil.toSign(sign).getBlock(), sign.getLine(2)))
                throw new ICVerificationException("Invalid SearchArea on 3rd line!");
        }
    }
}
TOP

Related Classes of com.sk89q.craftbook.mechanics.ic.gates.world.blocks.BonemealTerraformer$Factory

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.