본문 바로가기
취미/마인크래프트 플러그인

마크 플러그인 (#2)

by krapoi 2021. 9. 2.
반응형

오늘 암살자의 액티브 스킬과 패시브 스킬을 개발했고 마법사 이동기도 

구현하였다. 

 

첫 번째로 암살자 스킬이다.

패시브 스택(뼛가루)의 개수 따라 피해량이 증가하며 상대 엔티티(몹, 플레이어 등)가 바라보고 있는 방향의 반대로 이동한다.(즉, 뒤로 이동)

자신이 죽게될시 스택 초기화

패시브인 스택은 플레이어를 제외한 엔티티를 죽일 때 쌓이게 된다. 참고로 피해량이 너무 높아 엔티티를 한 번에 죽일 시 스택은 오르지 않는다.(무한 스택 증식 막기)

 

또한 플레이어를 죽이거나 자신이 죽게 되었을 때 스택은 초기화가 된다.

 

암살자 액티브 스킬 코드

   @EventHandler
    public void assassinate(EntityDamageByEntityEvent e) {
        double rand = Math.random(); // 0.0 ~ 1.0
        if (e.getDamager() instanceof Player) {
            Player player = (Player) e.getDamager();
            Entity victim = e.getEntity();
            ((Damageable) victim).damage((2 + stack) * 1.5);
            player.sendMessage("현재 피해량: " + (2 + stack) * 1.5);
            player.sendMessage("현재 스텍: " + stack);
            if((rand * 100) <= 2) {
                ((Damageable) victim).damage(999999999);
                player.sendMessage("즉사");
            }
            Location victimLocation = victim.getLocation();
            double nx;
            double nz;
            float angle = victimLocation.getYaw() + 90;
            if (angle < 0) angle += 360;
            nx = Math.cos(Math.toRadians(angle));
            nz = Math.sin(Math.toRadians(angle));
            Location location = new Location(victimLocation.getWorld(), victimLocation.getX() - nx,
                    victimLocation.getY(), victimLocation.getZ() - nz, victimLocation.getYaw(), victimLocation.getPitch());
            player.teleport(location);
        }
    }

암살자 패시브 코드

	public static int stack = 0;
    ItemStack killingstack = new ItemStack(Material.BONE_MEAL);
    ItemMeta killingstackmeta = (ItemMeta)killingstack.getItemMeta();


@EventHandler
    public void killedstack(EntityDeathEvent e) {

        LivingEntity entity = e.getEntity();
        Player player = (Player) e.getEntity().getKiller();
        if (entity.getType() == EntityType.PLAYER) {
            stack = 0;
        }
        if (killingstackmeta != null && player != null) {
            killingstackmeta.addEnchant(Enchantment.BINDING_CURSE, 1, false);
            killingstackmeta.setDisplayName(ChatColor.RED + "살인청부");
            killingstackmeta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
            killingstack.setItemMeta(killingstackmeta);
            player.getInventory().addItem(killingstack);
            ItemStack[] inv = player.getInventory().getContents();
            int temp = 0;
            for (ItemStack itemStack : inv) {
                if (itemStack != null) {
                    if (itemStack.getType() == Material.BONE_MEAL && itemStack.containsEnchantment(Enchantment.BINDING_CURSE)) {
                        temp = temp + itemStack.getAmount();
                    }
                }
            }
            stack = temp;
        }
    }

    @EventHandler
    public void cancelDropItem(PlayerDropItemEvent e) {
        if (e.getItemDrop().getItemStack().containsEnchantment(Enchantment.BINDING_CURSE) &&
            e.getItemDrop().getItemStack().getType() == Material.BONE_MEAL) {
            e.setCancelled(true);
        }
    }

    @EventHandler
    public void cancelDropItem(PlayerInteractEvent e) {
        Player player = e.getPlayer();

        if (player.getInventory().getItemInMainHand().getType() == Material.BONE_MEAL &&
            player.getInventory().getItemInMainHand().containsEnchantment(Enchantment.BINDING_CURSE)) {
            e.setCancelled(true);
        }
    }

그다음은 마법사 텔레포트이다.

바라보는 방향의 +10칸까지 범위의 블록이나 허공에 막대기를 들고 우클릭을 하면 그 블록의 위치로 이동한다.

 

텔레포트 코드

@EventHandler
    public void ability(PlayerInteractEvent e) {
        Player player = e.getPlayer();
        Action action = e.getAction();

        if ((action == Action.RIGHT_CLICK_BLOCK || action == Action.RIGHT_CLICK_AIR) && player.getInventory().getItemInMainHand().getType() == Material.STICK) {
            float pitch = player.getLocation().getPitch();
            float yaw = player.getLocation().getYaw();
            Location targetLocation = player.getTargetBlock(null, 10).getLocation();
            targetLocation.add(0, 1, 0);
            targetLocation.setPitch(pitch);
            targetLocation.setYaw(yaw);
            player.teleport(targetLocation);
        }
    }

암살자의 패시브 스킬이 오류가 좀 있어서 시간이 좀 걸렸다.

다음 기능도 최대한 빨리 가져오겠다.

반응형

'취미 > 마인크래프트 플러그인' 카테고리의 다른 글

마크 플러그인(#4)  (0) 2021.09.13
마크 플러그인 #3  (0) 2021.09.08
마크 플러그인 (#1)  (0) 2021.08.30
마크 플러그인 (#0)  (0) 2021.08.26