From 90f3bfded3be81accd0e99eebb45e41bf84db4e0 Mon Sep 17 00:00:00 2001 From: poopki Date: Sat, 16 Jul 2022 16:49:00 +0900 Subject: [PATCH] =?UTF-8?q?custom=20item=20effect=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Command.java | 10 -------- User_DB.java | 4 ++- itemeffect.java | 50 ++++++++++++++++++++++++++++++++++++ itemeffect_eventhandler.java | 36 ++++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 11 deletions(-) delete mode 100644 Command.java create mode 100644 itemeffect.java create mode 100644 itemeffect_eventhandler.java diff --git a/Command.java b/Command.java deleted file mode 100644 index c411370..0000000 --- a/Command.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.poopki.duckdns.user_db; -import org.bukkit.Material; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -public class Command implements CommandExecutor { -} diff --git a/User_DB.java b/User_DB.java index 9c38e24..c870a26 100644 --- a/User_DB.java +++ b/User_DB.java @@ -24,7 +24,9 @@ public final class User_DB extends JavaPlugin implements Listener { } catch (SQLException e) { throw new RuntimeException(e); } - + getCommand("test").setExecutor(new CustomItem_test()); + getCommand("shotgun").setExecutor(new itemeffect(this)); + getServer().getPluginManager().registerEvents(new itemeffect_eventhandler(), this); getServer().getPluginManager().registerEvents(new UserJoin(m_InfoArrayInstance, m_AccountArrayInstance),this); } diff --git a/itemeffect.java b/itemeffect.java new file mode 100644 index 0000000..1d03a6c --- /dev/null +++ b/itemeffect.java @@ -0,0 +1,50 @@ +package org.poopki.duckdns.user_db; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.Player; +import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.util.Vector; + +import java.util.Random; + +public class itemeffect implements CommandExecutor{ + JavaPlugin plugin; + + public itemeffect(JavaPlugin plugin) { + this.plugin = plugin; //메타데이터를 위해 플러그인 객체를 갖고 있어야 함 + } + + private Vector getDir(double yaw, double dirY, double angleAdd) //바라보는 방향을 벡터로 가져오는 함수 + { + double dirX = Math.cos(Math.toRadians(yaw + 90 + angleAdd)); + double dirZ = Math.sin(Math.toRadians(yaw + 90 + angleAdd)); + return new Vector(dirX, dirY, dirZ); + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { //명령어 실행 시 + if(sender instanceof Player) { //명령어 사용자가 플레이어인 경우 + Player player = (Player)sender; //명령어 사용자 객체를 플레이어 객체로 변환할 수 있음 + Random random = new Random(); + for(int i = 0; i < 15; i++) { + //화살을 수평으로 15개 발사 + Arrow pr = player.launchProjectile(Arrow.class, getDir(player.getLocation().getYaw(), player.getLocation().getDirection().getY(), random.nextDouble() * 45 - 22.5).multiply(3)); + pr.setMetadata("shotgun", new FixedMetadataValue(plugin, true)); //생성된 화살에 명령어로 생성되었다는 것을 표시 + pr.setGravity(false); //중력의 영향을 받지 않게 설정하여 낙차가 없게 함 + pr.setCritical(true); //화살의 이펙트를 위해 크리티컬 판정을 설정 + pr.setDamage(10); //화살 피격 시 10대미지를 받도록 설정 (일반 플레이어 체력의 반) + } + return true; //true값을 반환하면 명령어가 성공한 것으로 간주 + } + else if(sender instanceof ConsoleCommandSender) { //명령어 사용자가 콘솔인 경우 + sender.sendMessage("콘솔에서는 이 명령어를 실행할 수 없습니다."); + return false; //false값을 반환하면 명령어가 실패한 것으로 간주 + } + return false; //false값을 반환하면 명령어가 실패한 것으로 간주 + } +} diff --git a/itemeffect_eventhandler.java b/itemeffect_eventhandler.java new file mode 100644 index 0000000..6660a92 --- /dev/null +++ b/itemeffect_eventhandler.java @@ -0,0 +1,36 @@ +package org.poopki.duckdns.user_db; +import org.bukkit.entity.Arrow; +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.entity.ProjectileHitEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; + +public class itemeffect_eventhandler implements Listener { + @EventHandler + public void onProjectileHit(ProjectileHitEvent e) { //투사체 착탄시 실행 + if(e.getEntity().hasMetadata("shotgun")) { //만약 화살이 명령어로 생성되었다면 + Arrow arrow = (Arrow)e.getEntity(); //객체를 화살로 변환 + arrow.getWorld().createExplosion(arrow.getLocation(), 1); //화살의 착탄 위치에 폭발 생성 + arrow.remove(); //화살 삭제 + } + } + + @EventHandler + public void onPlayerInteract(PlayerInteractEvent e) { //플레이어가 상호작용을 할 때 실행 + Player player = e.getPlayer(); //상호작용한 플레이어 + Action action = e.getAction(); //플레이어가 한 상호작용 + ItemStack item = e.getItem(); //플레이어가 상호작용할 때 손에 들고 있던 아이템 + + //플레이어가 좌클릭을 눌렀을 때(허공을 때리거나 블럭을 때릴 때) + if(action.equals(Action.LEFT_CLICK_AIR) || action.equals(Action.LEFT_CLICK_BLOCK)) { + if(item != null) { //플레이어 손에 무언가 있으면 + switch(item.getType()) { + case BOW: //그 무언가가 활이라면 + player.performCommand("itemeffect:shotgun"); //산탄화살 발사 + } + } + } +}