*이 글은 Spigot 1.19.2 버전을 기준으로 하여 제작되었습니다.
이전화
https://zepelown.tistory.com/38?category=745673
이전 강좌에서 저희는 흙을 캐면 약 50% 확률로 캔 유저에게 다이아를 주는 플러그인을 제작해보았습니다.
거기에 이어 그 다이아를 조금 꾸며보는 시간을 가져보도록 하겠습니다.
이전 강좌를 다시 돌아보면
private ItemStack dia = new ItemStack(Material.DIAMOND, 1);
@EventHandler
public void breakDirt(BlockBreakEvent e) {
Material brBlock = e.getBlock().getBlockData().getMaterial();
if(brBlock == Material.DIRT || brBlock == Material.GRASS_BLOCK){
if(Math.floor(Math.random() * 10) < 5){
Player p = e.getPlayer();
p.getInventory().addItem(dia);
p.sendMessage("다이아를 발견하셨습니다.");
}
}
}
첫 줄에 ItemStack 이라는 인스턴스를 생성합니다.
이 인스턴스가 아이템에 관한 정보를 저장하는데
spigot 사이트에서 어떻게 설명하고 있는지 찾아보겠습니다.
https://hub.spigotmc.org/javadocs/spigot/org/bukkit/inventory/ItemStack.html
생성자와 수많은 매서드를 확인할 수 있습니다.
또한 ItemMeta도 사용하는데 아이템의 이름, 설명, 커스텀 모델, 내구도 등을 수정할 수도 있습니다.
https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/inventory/meta/ItemMeta.html
private ItemStack dia = new ItemStack(Material.DIAMOND, 1);
먼저 이전엔 위와 같이 클래스 내부 인스턴스로만 선언해놓았기 때문에
다른 클래스에서 사용하기 위해서는 반환하는 매서드를 만들어야 했었습니다.
하지만 여기서 우리가 줄 다이아 정보는 플러그인이 작동을 시작하고 끝날 때까지
변경 불가능하도록 온전히 유지돼야하고 다른 클래스에서 쉽게 사용이 가능해야 편합니다.
즉, 다른 클래스에서도 쉽게 사용이 가능한 상수가 되야 코딩 시 편합니다.
public static final ItemStack dia = new ItemStack(Material.DIAMOND, 1);
이런 식으로 말입니다.
자 이제 인텔리제이를 열고
아이템 정보를 저장할 또 다른 클래스(ItemManager.java)를 만들어줍니다.
ItemManager.java
package io.github.zepelown.testplugin;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
public class ItemManager {
public static final ItemStack dia = new ItemStack(Material.DIAMOND, 1);
}
위와 같이 작성했습니다.
자 이제 이러면 BreakEvent.java 에 가서 밑과 같이 수정해야 합니다.
BreakEvent.java
package io.github.zepelown.testplugin.event;
import io.github.zepelown.testplugin.ItemManager;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
public class BreakEvent implements Listener {
@EventHandler
public void breakDirt(BlockBreakEvent e) {
Material brBlock = e.getBlock().getBlockData().getMaterial();
if(brBlock == Material.DIRT || brBlock == Material.GRASS_BLOCK){
if(Math.floor(Math.random() * 10)< 5){
Player p = e.getPlayer();
p.getInventory().addItem(ItemManager.dia);
p.sendMessage("다이아를 발견하셨습니다.");
}
}
}
}
p.getInventory().addItem(ItemManager.dia);
위 부분이 수정되었습니다.
기존엔 BreakEvent 클래스에 있던 아이템 관한 코드를
ItemManager 클래스에 전부다 저장하여 기능을 분리했다고 생각하시면 됩니다.
(BreakEvent는 event만 관리하고 ItemManager는 Item만 관리하는 겁니다)
자 이제 밑 작업은 끝났습니다. 아이템 정보를 수정해봅시다.
오늘 목표는 아이템의 이름, 설명, 인첸트를 추가하는 겁니다.
자 이제 원하는 아이템을 쉽게 만들 수 있게 해주는 매서드들을 작성해보겠습니다.
먼저 첫 번째 메서드는 아이템 이름, 설명만 추가하는 경우 사용합니다.
ItemManager.java
private static ItemStack buildItem(Material type, int amount, String displayName, String... lore) {
ItemStack stack = new ItemStack(type, amount);
ItemMeta meta = stack.getItemMeta();
meta.setDisplayName(displayName);
meta.setLore(Arrays.asList(lore));
stack.setItemMeta(meta);
return stack;
}
함수 내 첫 줄은 Material type과 개수 값을 받아 itemstack을 생성하고
두 번째 줄은 stack의 itemmeta 값을 meta라는 인스턴스를 생성해 저장을 합니다.
그리고 그 meta 값을 수정한 뒤
stack.setItemMeta(meta);
다시 stack에 수정된 값을 저장해주고
stack을 리턴합니다.
meta.setLore(Arrays.asList(lore));
이 코드는 아이템의 설명(Lore) 부분을 수정하는 곳인데
함수 매개변수를 보면 String... lore라고 되어있습니다.
이는 여러 개의 String 입력을 받겠다는 의미입니다.
매개변수 마지막에 있어야 합니다.
ItemManager.java
package io.github.zepelown.testplugin;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.Arrays;
public class ItemManager {
private static ItemStack buildItem(Material type, int amount, String displayName, String... lore) {
ItemStack stack = new ItemStack(type, amount);
ItemMeta meta = stack.getItemMeta();
meta.setDisplayName(displayName);
meta.setLore(Arrays.asList(lore));
stack.setItemMeta(meta);
return stack;
}
public static final ItemStack dia = buildItem(Material.DIAMOND, 1, ChatColor.AQUA +"다이아","흙을 캐서 얻은 다이아다",
ChatColor.LIGHT_PURPLE + "영웅");
}
간단하게 다이아를 꾸며보았습니다.
위와 같은 아이템을 얻을 수 있습니다.
따로 색깔을 지정해두지 않을 경우 보라색으로 나온다는 걸 참고하시길 바랍니다.
다음으로 작성할 메서드는 아이템에 인첸트 효과를 추가해볼 겁니다.
ItemManager.java
private static ItemStack buildItem(Material type, int amount, String displayName, Enchantment enchant, int enchantlvl, boolean enchantRestrict, String... lore) {
ItemStack stack = new ItemStack(type, amount);
ItemMeta meta = stack.getItemMeta();
meta.setDisplayName(displayName);
meta.setLore(Arrays.asList(lore));
meta.addEnchant(enchant, enchantlvl, enchantRestrict);
stack.setItemMeta(meta);
return stack;
}
addEnchant 함수는
세 가지의 매개변수를 받아야 합니다.
Enchantment 값과 레벨을 지정할 정수 값
그리고 마크에서 지정해놓은 인첸트 레벨 제한을 풀지를 표시할 참/거짓 값(boolean)이 필요합니다.
참고로
Enchantment에 어떤 것이 있는지 알려면
이렇게 인텔리제이의 자동 완성 기능을 확인하는 것과
https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/enchantments/Enchantment.html
api사이트를 확인하시면 됩니다.
위에서 사용한 ChatColor도 마찬가지입니다.
매서드를 다 작성했으니 아이템을 만들어보겠습니다.
ItemManager.java
package io.github.zepelown.testplugin;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.Arrays;
public class ItemManager {
private static ItemStack buildItem(Material type, int amount, String displayName, String... lore) {
ItemStack stack = new ItemStack(type, amount);
ItemMeta meta = stack.getItemMeta();
meta.setDisplayName(displayName);
meta.setLore(Arrays.asList(lore));
stack.setItemMeta(meta);
return stack;
}
private static ItemStack buildItem(Material type, int amount, String displayName, Enchantment enchant, int enchantlvl, boolean enchantRestrict, String... lore) {
ItemStack stack = new ItemStack(type, amount);
ItemMeta meta = stack.getItemMeta();
meta.setDisplayName(displayName);
meta.setLore(Arrays.asList(lore));
meta.addEnchant(enchant, enchantlvl, enchantRestrict);
stack.setItemMeta(meta);
return stack;
}
public static final ItemStack dia = buildItem(Material.DIAMOND, 1, ChatColor.AQUA +"다이아","흙을 캐서 얻은 다이아다",
ChatColor.WHITE + "노말");
public static final ItemStack enchantDia = buildItem(Material.DIAMOND, 1, ChatColor.AQUA +"다이아",
Enchantment.DIG_SPEED, 1, false,"흙을 캐서 얻은 다이아다", ChatColor.LIGHT_PURPLE + "영웅");
}
enchantdia로 새로운 인스턴스를 만들어주었고
효율 1을 붙여주었습니다.
또한
BreakEvent.java
package io.github.zepelown.testplugin.event;
import io.github.zepelown.testplugin.ItemManager;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
public class BreakEvent implements Listener {
@EventHandler
public void breakDirt(BlockBreakEvent e) {
Material brBlock = e.getBlock().getBlockData().getMaterial();
if(brBlock == Material.DIRT || brBlock == Material.GRASS_BLOCK){
Player p = e.getPlayer();
p.sendMessage("다이아를 발견하셨습니다.");
if(Math.floor(Math.random() * 10)< 5){
p.getInventory().addItem(ItemManager.enchantDia);
} else {
p.getInventory().addItem(ItemManager.dia);
}
}
}
}
반반 확률로 인첸트가 된 다이아가 뜨거나 그냥 다이아가 뜨게 변경하였습니다.
빌드해보겠습니다.
'마인크래프트 > 플러그인 제작 강좌(자바)' 카테고리의 다른 글
[인텔리제이로 마크 플러그인 개발하기]6. 나만의 인벤토리 GUI 만들기 1편 (기본적인 인벤토리 작성법) (3) | 2022.09.18 |
---|---|
[인텔리제이로 마크 플러그인 개발하기]5. 나만의 명령어 만들기 (give, help 명령어 만들어보기) (11) | 2022.09.15 |
[인텔리제이로 마크 플러그인 개발하기] 3. 흙을 캐면 다이아가 나오게 해보자! (이벤트와 리스너에 관하여) (13) | 2022.08.18 |
[인텔리제이로 마크 플러그인 개발하기] 2. 인텔리제이 한글인코딩 (6) | 2022.08.12 |
[인텔리제이로 마크 플러그인 개발(제작)하기] 1. 기본적인 세팅 (34) | 2020.04.12 |
댓글