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

마크 플러그인(#4)

by krapoi 2021. 9. 13.
반응형

오늘은 마법사의 기술인 메테오와

암살자의 기술인 의뢰 기술을 가지고 왔다.

 

먼저 메테오를 보자

블레이즈 막대기를 우클릭하면 화염구 하나가 바라보는 방향으로 날아간다.

그 뒤 화염구가 터지게 되면 그 터진 위치에 9*9의 크기에 높이가 3인 화염 구들이 내려온다.

근데 데미지는 별로 높은 편이 아님

코드

 @EventHandler
    public void ability(PlayerInteractEvent e) {
        Player player = e.getPlayer();
        Action action = e.getAction();
         if ((action == Action.RIGHT_CLICK_AIR || action == Action.RIGHT_CLICK_BLOCK) && player.getInventory().getItemInMainHand().getType() == Material.BLAZE_ROD) {
            if (JobVariable.getPlayerJob(player, "Wizard")) {
                if (JobVariable.isAvailable(player.getUniqueId(), "meteor")) {
                    LargeFireball f = player.launchProjectile(LargeFireball.class);
                    Block location = player.getTargetBlock(null, 10);
                    JobVariable.setCoolTime(player.getUniqueId(), System.currentTimeMillis(), "meteor");
                }
                else {
                    player.sendMessage(ChatColor.DARK_RED + "[메태오]" + ChatColor.RESET + " 쿨타임 남은 시간: "
                            + -1 * (JobVariable.getSkillCoolLeft(player.getUniqueId(), "meteor")) + "초");
                }
  @EventHandler
    public void meteor(ProjectileHitEvent e) {

        if (e.getEntity() instanceof LargeFireball) {

            if (e.getEntity().getShooter() instanceof Player player) {

                if (JobVariable.getPlayerJob(player, "Wizard")) {
                    List<Location> locationList = new ArrayList<>();

                    if (e.getHitEntity() != null && e.getHitEntity() instanceof LivingEntity) {
                        ((Damageable)e.getHitEntity()).damage(10);
                    }

                    if (e.getHitBlock() != null) {
                        for (Block fireBallLocation : getBlocks(e.getHitBlock(), 3)) {
                            locationList.add(fireBallLocation.getLocation().add(0, 20, 0));
                        }
                    }
                    else {
                        for (Block fireBallLocation : getBlocks(e.getHitEntity().getLocation().getBlock(), 3)) {
                            locationList.add(fireBallLocation.getLocation().add(0, 20, 0));
                        }
                    }

                    for (Location fireballGoTo : locationList) {
                        Fireball fb = (Fireball) player.getWorld().spawnEntity(fireballGoTo, EntityType.FIREBALL);
                        fb.setDirection(new Vector(0, -3, 0));
                        fb.setYield(3);
                    }
                }

            }
        }
    }

    public ArrayList<Block> getBlocks(Block start, int radius) {
        ArrayList<Block> blocks = new ArrayList<Block>();
        if (start == null) {
            blocks.add(null);
            return blocks;
        }

        for(double x = start.getLocation().getX() - radius; x <= start.getLocation().getX() + radius; x++) {
            for (double z = start.getLocation().getZ() - radius; z <= start.getLocation().getZ() + radius; z++) {
                Location loc = new Location(start.getWorld(), x, start.getLocation().getY(), z);
                blocks.add(loc.getBlock());
            }
        }
        return blocks;
    }
          
 }

 

다음은 암살자의 의뢰기술이다.

같은 entity를 두 번 때리면 네 가지 디버프(구속, 독, 실명, 나약함)중 하나에 걸리게 된다.

위 주민의 머리에 기포가 생기는 걸 볼 수 있다. 

각각 5초씩 걸리게 된다.

코드

@EventHandler
    public void assassinate(EntityDamageByEntityEvent e) {

        if (e.getEntity() instanceof LivingEntity && e.getDamager() instanceof Player) {
            Player assassin = (Player) e.getDamager();
            LivingEntity victim = (LivingEntity) e.getEntity();
            if (!JobVariable.getPlayerJob(assassin, "Assassin")) {
                return;
            }
            List<PotionEffectType> potionlist = new ArrayList<>();
            potionlist.add(PotionEffectType.SLOW);
            potionlist.add(PotionEffectType.POISON);
            potionlist.add(PotionEffectType.BLINDNESS);
            potionlist.add(PotionEffectType.WEAKNESS);
            int r = rand.nextInt(4);
            if (assassinationQuest.get(assassin.getUniqueId()) == null) {
                assassinationQuest.put(assassin.getUniqueId(), victim.getUniqueId());
                assassin.sendMessage("의뢰대상: " + victim.getType());
            } else {
                if (assassinationQuest.get(assassin.getUniqueId()).equals(victim.getUniqueId())) {
                    victim.addPotionEffect(new PotionEffect(potionlist.get(r), 100, 4));
                }
            }
        }

이제 거의 모든 기술을 다 구현한 거 같다.

다음에는 조금남은 기술들을 가져와 보겠다.

반응형

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

마크 플러그인 #3  (0) 2021.09.08
마크 플러그인 (#2)  (0) 2021.09.02
마크 플러그인 (#1)  (0) 2021.08.30
마크 플러그인 (#0)  (0) 2021.08.26