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

Source Code of com.sk89q.craftbook.mechanics.ic.gates.world.entity.AdvancedEntitySpawner$Factory

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

import java.util.Locale;

import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Server;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;

import com.sk89q.craftbook.ChangedSign;
import com.sk89q.craftbook.bukkit.util.BukkitUtil;
import com.sk89q.craftbook.mechanics.ic.AbstractIC;
import com.sk89q.craftbook.mechanics.ic.AbstractICFactory;
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.mechanics.ic.RestrictedIC;
import com.sk89q.craftbook.util.EntityUtil;
import com.sk89q.craftbook.util.ICUtil;
import com.sk89q.craftbook.util.ItemSyntax;
import com.sk89q.craftbook.util.ItemUtil;
import com.sk89q.craftbook.util.RegexUtil;
import com.sk89q.craftbook.util.SignUtil;

public class AdvancedEntitySpawner extends AbstractIC {

    public AdvancedEntitySpawner(Server server, ChangedSign sign, ICFactory factory) {

        super(server, sign, factory);
    }

    Location location;
    EntityType type;
    int amount;

    @Override
    public String getTitle() {

        return "Advanced Entity Spawner";
    }

    @Override
    public String getSignTitle() {

        return "ADV ENT SPAWNER";
    }

    @Override
    public void load() {

        String[] splitLine3 = RegexUtil.ASTERISK_PATTERN.split(getSign().getLine(3).trim());
        type = EntityType.fromName(splitLine3[0].trim().toLowerCase(Locale.ENGLISH));
        if (type == null) {
            type = EntityType.valueOf(splitLine3[0].trim().toUpperCase(Locale.ENGLISH));
            if(type == null)
                type = EntityType.PIG;
        }

        try {
            amount = Integer.parseInt(splitLine3[1]);
        } catch (Exception e) {
            amount = 1;
        }

        location = ICUtil.parseBlockLocation(getSign(), 2).getLocation();
    }

    @Override
    public void trigger(ChipState chip) {

        if(!location.getChunk().isLoaded())
            return;

        if (!chip.getInput(0)) return;
        Block left = SignUtil.getLeftBlock(BukkitUtil.toSign(getSign()).getBlock());
        ChangedSign effectSign = null;
        if (left.getType() == Material.WALL_SIGN)
            effectSign = BukkitUtil.toChangedSign(left);

        Block right = SignUtil.getRightBlock(BukkitUtil.toSign(getSign()).getBlock());
        ChangedSign armourSign = null;
        if (right.getType() == Material.WALL_SIGN)
            armourSign = BukkitUtil.toChangedSign(right);

        for (int i = 0; i < amount; i++) {
            Entity ent = BukkitUtil.toSign(getSign()).getWorld().spawn(location, type.getEntityClass());

            if (armourSign != null) { // Apply armor
                if (ent instanceof LivingEntity) {

                    for (int s = 0; s < 4; s++) {
                        String bit = armourSign.getLine(s);

                        ItemStack slot = ItemUtil.makeItemValid(ItemSyntax.getItem(bit));

                        switch (s) {
                            case 0:
                                ((LivingEntity) ent).getEquipment().setHelmet(slot);
                                break;
                            case 1:
                                ((LivingEntity) ent).getEquipment().setChestplate(slot);
                                break;
                            case 2:
                                ((LivingEntity) ent).getEquipment().setLeggings(slot);
                                break;
                            case 3:
                                ((LivingEntity) ent).getEquipment().setBoots(slot);
                                break;
                        }
                    }
                }
            }

            Boolean upwards = null;

            while (effectSign != null) { // Apply effects
                for (int s = 0; s < 4; s++) {
                    String bit = effectSign.getLine(s);
                    if (bit == null || bit.trim().isEmpty()) continue;

                    String[] data = RegexUtil.COLON_PATTERN.split(bit);

                    if (data[0].equalsIgnoreCase("e")) EntityUtil.setEntityData(ent, bit.substring(2));
                    else if (data[0].equalsIgnoreCase("r")) {
                        EntityType rider = EntityType.fromName(data[1].trim());
                        Entity rid = BukkitUtil.toSign(getSign()).getWorld().spawnEntity(location, rider);
                        ent.setPassenger(rid);
                    } else if (data[0].equalsIgnoreCase("p") && ent instanceof LivingEntity) {
                        for (int a = 1; a < data.length; a++) {
                            try {
                                String[] potionBits = RegexUtil.SEMICOLON_PATTERN.split(data[a]);
                                PotionEffect effect = new PotionEffect(PotionEffectType.getById(Integer.parseInt(potionBits[0])), Integer.parseInt(potionBits[1]), Integer.parseInt(potionBits[2]));
                                ((LivingEntity) ent).addPotionEffect(effect, true);
                            } catch (Exception ignored) {
                            }
                        }
                    } else if (data[0].equalsIgnoreCase("v")) {
                        try {
                            double x, y, z;
                            String[] coords = RegexUtil.COMMA_PATTERN.split(data[1]);
                            x = Double.parseDouble(coords[0]);
                            y = Double.parseDouble(coords[1]);
                            z = Double.parseDouble(coords[2]);
                            ent.setVelocity(new org.bukkit.util.Vector(x, y, z));
                        } catch (Exception ignored) {
                        }
                    } else if (data[0].equalsIgnoreCase("s")) {
                        if (!(ent instanceof LivingEntity)) continue;

                        ItemStack slot = ItemUtil.makeItemValid(ItemSyntax.getItem(bit.replace("s:", "")));
                        ((LivingEntity) ent).getEquipment().setItemInHand(slot);
                    }
                }
                if (upwards == null) {
                    if (BukkitUtil.toSign(effectSign).getBlock().getRelative(0, 1, 0).getType() == Material.WALL_SIGN) {
                        effectSign = BukkitUtil.toChangedSign(BukkitUtil.toSign(effectSign).getBlock().getRelative(0, 1, 0));
                        upwards = true;
                    } else if (BukkitUtil.toSign(effectSign).getBlock().getRelative(0, -1, 0).getType() == Material.WALL_SIGN) {
                        effectSign = BukkitUtil.toChangedSign(BukkitUtil.toSign(effectSign).getBlock().getRelative(0, -1, 0));
                        upwards = false;
                    } else break;
                } else {
                    if (BukkitUtil.toSign(effectSign).getBlock().getRelative(0, upwards ? 1 : -1, 0).getType() == Material.WALL_SIGN)
                        effectSign = BukkitUtil.toChangedSign(BukkitUtil.toSign(effectSign).getBlock().getRelative(0, upwards ? 1 : -1, 0));
                    else break;
                }
            }
        }
    }

    public static class Factory extends AbstractICFactory implements RestrictedIC {

        public Factory(Server server) {

            super(server);
        }

        @Override
        public IC create(ChangedSign sign) {

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

        @Override
        public String getShortDescription() {

            return "Spawns a mob with many customizations.";
        }

        @Override
        public String[] getLineHelp() {

            return new String[] {"+ox:y:z", "entitytype{*amount}"};
        }

        @Override
        public void verify(ChangedSign sign) throws ICVerificationException {

            String[] splitLine3 = RegexUtil.ASTERISK_PATTERN.split(sign.getLine(3).trim());
            EntityType type = EntityType.fromName(splitLine3[0].trim().toLowerCase(Locale.ENGLISH));
            if(type == null)
                type = EntityType.valueOf(splitLine3[0].trim().toUpperCase(Locale.ENGLISH));
            if (type == null)
                throw new ICVerificationException("Invalid Entity! See bukkit EntityType list!");
            else if (!type.isSpawnable())
                throw new ICVerificationException("Entity is not spawnable!");
        }
    }
}
TOP

Related Classes of com.sk89q.craftbook.mechanics.ic.gates.world.entity.AdvancedEntitySpawner$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.