본문 바로가기
마인크래프트/플러그인 제작 강좌(자바)

[인텔리제이로 마크 플러그인 개발하기]8. 나만의 포션 제작하기 (커스텀 포션)

by Zepelown 2023. 1. 11.

*이 글은 Spigot 1.19.3 버전을 기준으로 하여 제작되었습니다.

 

지난 화

https://zepelown.tistory.com/45

 

[인텔리제이로 마크 플러그인 개발하기]7. 나만의 인벤토리 GUI 만들기 2편 (인벤토리와 관련된 이

*이 글은 Spigot 1.19.2 버전을 기준으로 하여 제작되었습니다. 지난 화 https://zepelown.tistory.com/44 [인텔리제이로 마크 플러그인 개발하기]6. 나만의 인벤토리 GUI 만들기 1편 (기본적인 인벤토리 작 *이

zepelown.tistory.com

참고하면 좋은 화

https://zepelown.tistory.com/41

 

[인텔리제이로 마크 플러그인 개발하기]4. 나만의 아이템 제작하기 (ItemStack, ItemMeta에 관하여)

*이 글은 Spigot 1.19.2 버전을 기준으로 하여 제작되었습니다. 이전화 https://zepelown.tistory.com/38?category=745673 [인텔리제이로 마크 플러그인 개발하기] 3. 흙을 캐면 다이아가 나오게 해보자! (이벤트와

zepelown.tistory.com

 

 

지금까지 내용을 github에 기재하였습니다.

 

전체 코드를 확인하시려면 방문해 주세요.

 

https://github.com/Zepelown/SpigotBlogPosting

 

GitHub - Zepelown/SpigotBlogPosting: spigot 강의

spigot 강의. Contribute to Zepelown/SpigotBlogPosting development by creating an account on GitHub.

github.com


 

https://hub.spigotmc.org/javadocs/spigot/org/bukkit/potion/PotionEffect.html

 

PotionEffect (Spigot-API 1.19.3-R0.1-SNAPSHOT API)

hasParticles public boolean hasParticles() Returns: whether this effect has particles or not

hub.spigotmc.org

 

https://hub.spigotmc.org/javadocs/spigot/org/bukkit/inventory/meta/PotionMeta.html

 

PotionMeta (Spigot-API 1.19.3-R0.1-SNAPSHOT API)

setMainEffect Deprecated. Moves a potion effect to the top of the potion effect list. This causes the client to display the potion effect in the potion's name. Parameters: type - the potion effect type to move Returns: true if the potion meta changed as a

hub.spigotmc.org

위 문서들을 참고하시면 좋습니다.

 

 

포션은 기존에 아이템을 만들던 방식에서 크게 다르지 않습니다.

 

먼저 포션은 하나의 아이템(Material)만 존재합니다.

 

그게 바로

출처 : Minecraft 위키

물병(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 파일 제작법에 대해 알아보겠습니다.

 

댓글