반응형
오늘 암살자의 액티브 스킬과 패시브 스킬을 개발했고 마법사 이동기도
구현하였다.
첫 번째로 암살자 스킬이다.
패시브 스택(뼛가루)의 개수 따라 피해량이 증가하며 상대 엔티티(몹, 플레이어 등)가 바라보고 있는 방향의 반대로 이동한다.(즉, 뒤로 이동)
패시브인 스택은 플레이어를 제외한 엔티티를 죽일 때 쌓이게 된다. 참고로 피해량이 너무 높아 엔티티를 한 번에 죽일 시 스택은 오르지 않는다.(무한 스택 증식 막기)
또한 플레이어를 죽이거나 자신이 죽게 되었을 때 스택은 초기화가 된다.
암살자 액티브 스킬 코드
@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 |