반응형
오늘은 마법사의 기술인 메테오와
암살자의 기술인 의뢰 기술을 가지고 왔다.
먼저 메테오를 보자
블레이즈 막대기를 우클릭하면 화염구 하나가 바라보는 방향으로 날아간다.
그 뒤 화염구가 터지게 되면 그 터진 위치에 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 |