Package net.citizensnpcs.guards.types

Source Code of net.citizensnpcs.guards.types.Soldier

package net.citizensnpcs.guards.types;

import java.util.Map;

import net.citizensnpcs.guards.Guard;
import net.citizensnpcs.guards.GuardState;
import net.citizensnpcs.guards.GuardUpdater;
import net.citizensnpcs.guards.OwnerSelection;
import net.citizensnpcs.guards.Selection;
import net.citizensnpcs.npctypes.NPCTypeManager;
import net.citizensnpcs.properties.properties.UtilityProperties;
import net.citizensnpcs.resources.npclib.HumanNPC;
import net.citizensnpcs.resources.npclib.NPCManager;
import net.citizensnpcs.utils.PathUtils;
import net.citizensnpcs.utils.StringUtils;

import org.bukkit.ChatColor;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerQuitEvent;

import com.google.common.collect.Maps;

public class Soldier implements GuardUpdater {
    public Soldier() {
        Listener listener = new SelectionHooks();
        NPCTypeManager.registerEvents(listener);
    }

    @Override
    public void onDamage(HumanNPC npc, LivingEntity attacker) {
    }

    @Override
    public GuardStatus updateStatus(GuardStatus current, HumanNPC npc) {
        return current;
    }

    private static class SelectionHooks implements Listener {
        private void attack(Player player, LivingEntity attack, Selection<HumanNPC> selection) {
            if (selection.size() == 0)
                return;
            for (HumanNPC npc : selection) {
                PathUtils.target(npc, attack, true, -1);
            }
            player.sendMessage(ChatColor.GREEN + "Set " + StringUtils.wrap(selection.size())
                    + StringUtils.pluralise(" NPC", selection.size()) + " on your target.");
        }

        private boolean isSoldier(HumanNPC npc) {
            return npc.isType("guard") && ((Guard) npc.getType("guard")).isState(GuardState.SOLDIER);
        }

        @EventHandler
        public void onPlayerInteract(PlayerInteractEvent event) {
            Selection<HumanNPC> selection = getSelection(event.getPlayer());
            if (event.getAction() != Action.RIGHT_CLICK_BLOCK || selection.size() == 0
                    || !UtilityProperties.isHoldingTool("SoldierSelectTool", event.getPlayer())) {
                if ((event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK)
                        && selection.size() > 0
                        && UtilityProperties.isHoldingTool("SoldierDeselectAllTool", event.getPlayer())) {
                    event.getPlayer().sendMessage(
                            ChatColor.GRAY + "Deselecting " + StringUtils.wrap(selection.size(), ChatColor.GRAY)
                                    + StringUtils.pluralise(" NPC", selection.size()) + ".");
                    selection.deselectAll();
                }
                return;
            }
            for (HumanNPC npc : getSelection(event.getPlayer())) {
                if (npc == null) {
                    continue;
                }
                PathUtils.createPath(npc, event.getClickedBlock().getLocation(), -1);
            }
            event.getPlayer().sendMessage(
                    StringUtils.wrap(selection.size()) + " " + StringUtils.pluralise("NPC", selections.size())
                            + " enroute.");
        }

        @EventHandler
        public void onPlayerInteractEntity(PlayerInteractEntityEvent event) {
            HumanNPC npc = NPCManager.get(event.getRightClicked());
            boolean holding = UtilityProperties.isHoldingTool("SoldierSelectTool", event.getPlayer());
            if (npc == null) {
                if (holding && event.getRightClicked() instanceof LivingEntity)
                    attack(event.getPlayer(), (LivingEntity) event.getRightClicked(), getSelection(event.getPlayer()));
                return;
            }
            if (isSoldier(npc)) {
                if (holding) {
                    select(event.getPlayer(), npc, getSelection(event.getPlayer()));
                } else if (UtilityProperties.isHoldingTool("SoldierReturnTool", event.getPlayer())) {
                    npc.getHandle().cancelTarget();
                    npc.teleport(npc.getBaseLocation());
                }
                return;
            }
        }

        @EventHandler
        public void onPlayerQuit(PlayerQuitEvent event) {
            selections.remove(event.getPlayer());
        }

        private void select(Player player, HumanNPC npc, Selection<HumanNPC> selection) {
            if (selection.isSelected(npc)) {
                selection.deselect(npc);
            } else {
                selection.select(npc);
                PathUtils.target(npc, player, false, -1);
            }
            player.sendMessage(ChatColor.GREEN + (selection.isSelected(npc) ? "Selected" : "Deselected")
                    + StringUtils.wrap(npc.getName()) + ". " + StringUtils.wrap(selection.size())
                    + StringUtils.pluralise(" NPC", selection.size()) + " now selected.");

        }
    }

    private static final Map<Player, Selection<HumanNPC>> selections = Maps.newHashMap();

    private static Selection<HumanNPC> getSelection(Player player) {
        if (!selections.containsKey(player))
            selections.put(player, new OwnerSelection(player));
        return selections.get(player);
    }
}
TOP

Related Classes of net.citizensnpcs.guards.types.Soldier

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.