*이 글은 Spigot 1.19.3 버전을 기준으로 하여 제작되었습니다.
지난 화
https://zepelown.tistory.com/45
참고하면 좋은 화
https://zepelown.tistory.com/41
지금까지 내용을 github에 기재하였습니다.
전체 코드를 확인하시려면 방문해 주세요.
https://github.com/Zepelown/SpigotBlogPosting
https://hub.spigotmc.org/javadocs/spigot/org/bukkit/potion/PotionEffect.html
https://hub.spigotmc.org/javadocs/spigot/org/bukkit/inventory/meta/PotionMeta.html
위 문서들을 참고하시면 좋습니다.
포션은 기존에 아이템을 만들던 방식에서 크게 다르지 않습니다.
먼저 포션은 하나의 아이템(Material)만 존재합니다.
그게 바로
물병(Material.POTION)이며
그리고 이 물병의 ItemMeta를 PotionMeta로 설정하여
PotionEffect를 추가한다고 생각하시면 됩니다.
ItemManager.java
private static ItemStack buildItem(Material type, int amount, Color color, PotionEffectType effect, int duration, int amplifier, String displayName, String... lore){
ItemStack stack = new ItemStack(type, amount);
PotionMeta meta = (PotionMeta) stack.getItemMeta();
meta.setDisplayName(displayName);
meta.setLore(Arrays.asList(lore));
meta.setColor(color);
PotionEffect potionEffect = new PotionEffect(effect, duration, amplifier);
//마크는 시간을 ticks 이란 단위로 세기 때문에 수정 필요
meta.addCustomEffect(potionEffect,false);
stack.setItemMeta(meta);
return stack;
}
PotionMeta는 ItemMeta와 같이 setDisplayName, SetLore 등 다 사용할 수 있습니다.
여기서 아셔야 하는 건 밑의 표와 같습니다.
항목 | 설명 | 예시 |
Color | 포션의 색깔을 설정합니다. | Color.BLUE |
PotionEffectType | 아이템 생성시 사용하는 Material이랑 비슷한 것으로 포션 효과의 이름을 뜻합니다. |
PotionEffectType.SPEED |
Duration | 효과 지속시간으로 20 => 1초 입니다. |
100 (=5초) |
Amplifier | 효과 세기입니다. 0이 1입니다. |
2 (=3) |
ItemManager.java
public static final ItemStack healPotion = buildItem(Material.POTION,1, Color.PURPLE,PotionEffectType.REGENERATION,100,2,ChatColor.YELLOW + "재생", "체력을 재생시킵니다");
위와 같이 작성 시
이런 멋진 포션이 만들어집니다!
이번엔 매우 빠르게 해주는 신속 포션을 만들어보겠습니다.
ItemManager.java
public static final ItemStack speedPotion = buildItem(Material.POTION,1,Color.BLUE,PotionEffectType.SPEED,400,10,ChatColor.BLUE + "스피드", ChatColor.GREEN+"아주 빠르게!");
이렇게 완성되었습니다!
참고!
포션을 주는 명령어 코드입니다.
/tgetpoiton heal(또는 speed) 로 작동합니다.
GetPotion.java
package io.github.zepelown.testplugin.commands;
import io.github.zepelown.testplugin.ItemManager;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class GetPotion implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String s, String[] args) {
if(!(sender instanceof Player))
sender.sendMessage("인게임에서 명령어를 쳐주세요");
Player player = (Player) sender;
switch (args.length) {
case 1:
if (args[0].equalsIgnoreCase("heal")) {
player.getInventory().addItem(ItemManager.healPotion);
sender.sendMessage("회복 포션이 지급되었습니다.");
break;
}
else if (args[0].equalsIgnoreCase("speed")) {
player.getInventory().addItem(ItemManager.speedPotion);
sender.sendMessage("스피드 포션이 지급되었습니다.");
break;
}
else {
sender.sendMessage("포션명을 적어주세요.");
break;
}
default:
player.sendMessage("명령어를 제대로 입력해주세요.");
}
return false;
}
}
TestPlugin.java
(메인 클래스)
package io.github.zepelown.testplugin;
import io.github.zepelown.testplugin.commands.GetPotion;
import io.github.zepelown.testplugin.commands.GiveDia;
import io.github.zepelown.testplugin.commands.Help;
import io.github.zepelown.testplugin.commands.OpenInv;
import io.github.zepelown.testplugin.event.BreakEvent;
import io.github.zepelown.testplugin.event.InvClickEvent;
import org.bukkit.plugin.java.JavaPlugin;
public final class TestPlugin extends JavaPlugin {
@Override
public void onEnable() {
// Plugin startup logic
getLogger().info("플러그인 활성화");
getServer().getPluginManager().registerEvents(new BreakEvent(), this);
getServer().getPluginManager().registerEvents(new InvClickEvent(), this);
getServer().getPluginCommand("thelp").setExecutor(new Help());
getServer().getPluginCommand("tgivedia").setExecutor(new GiveDia());
getServer().getPluginCommand("topeninv").setExecutor(new OpenInv());
getServer().getPluginCommand("tgetpotion").setExecutor(new GetPotion());
}
@Override
public void onDisable() {
// Plugin shutdown logic
getLogger().info("플러그인 비활성화");
}
}
plugin.yml
name: TestPlugin
version: '${project.version}'
main: io.github.zepelown.testplugin.TestPlugin
api-version: 1.19
commands:
thelp:
description: help command
aliases:
- thelp2
tgivedia:
description: givedia
topeninv:
description: open gui
tgetpotion:
description: get custom potion
다음화에선 config 파일 제작법에 대해 알아보겠습니다.
'마인크래프트 > 플러그인 제작 강좌(자바)' 카테고리의 다른 글
[인텔리제이로 마크 플러그인 개발하기]10. config.yml 제작하기 2편 ( config에 변수 및 색깔 코드 넣기) (4) | 2023.01.16 |
---|---|
[인텔리제이로 마크 플러그인 개발하기]9. config.yml 제작하기 1편 (플레이어 입장 메시지 만들기) (0) | 2023.01.13 |
[인텔리제이로 마크 플러그인 개발하기](보충) Gradle로 jar 빌드하기 (0) | 2023.01.10 |
[인텔리제이로 마크 플러그인 개발하기]7. 나만의 인벤토리 GUI 만들기 2편 (인벤토리와 관련된 이벤트 처리하기) (5) | 2022.10.10 |
[인텔리제이로 마크 플러그인 개발하기]6. 나만의 인벤토리 GUI 만들기 1편 (기본적인 인벤토리 작성법) (3) | 2022.09.18 |
댓글