잡다한 개발/마크플러그인

마크 가챠 3편

오잎 클로버 2021. 11. 23. 16:10
728x90

이전에 모든 세팅을 끝내고 연결 코드를 작성하였기 때문에

가챠 상자를 만드는 것을 할 것입니다.

 

가챠 상자는 가장 상자스러우면 좋겠다고 생각하여 아래 4가지의 상자들을 후보로 선택하였습니다.

위 4가지 중 개인적으로 셜커 상자로 하고 싶어서 셜커 상자로 선택하였습니다.

엔더 상자도 마음에 들긴 하였지만, 열리는 모습이 독특한 셜커 상자로 결정하였습니다.

 

먼저 누가봐도 가챠 상자임을 확인할 수 있도록 클래스명은 GachaBox로 하였습니다.

그리고 가챠 상자와 해당 상자임을 확인할 수 있는 독특한 메타를 설정하기 위해

멤버 변수로 가챠 상자와 메타 변수를 선언합니다.

public static ItemStack gachaBox = new ItemStack(Material.SHULKER_BOX);
public static ItemMeta gachaBoxMeta = gachaBox.getItemMeta();

그리고 GachaBox 클래스는 static 메소드만이 있어 다른 클래스 어디에서라도 호출할 수 있도록 합니다.

 

먼저 상자를 생성하는 메소드를 개발합니다.

이름은 누가 보더라도 생성한다는 메소드임을 알 수 있도록

createGachaBox로 합니다. 

(Java는 카멜 표기법을 사용합니다.)

그리고 플레이어마다 각각 상자를 주어야하기 때문에 인자값은 플레이어로 합니다.

 

그리고 이전에 말을 하지 않았지만

제가 만들고 있는 가챠 플러그인은

플레이어가 서버에 입장과 동시에 보스바(타이머 기능함)에 10분이 표기되며, 해당 10분이 다 지나간다면

가챠 상자를 하나 지급하고, 해당 가챠 상자를 사용하기 전까지는 보스바가 다시 생성되지 않습니다.

(여러 개를 가질 수 없게 하기 위함)

 

createGachaBox 메소드는 

가챠 상자의 메타 설정과 더불어 인자값으로 받은 해당 플레이어에게 해당 가챠 상자를 인벤토리에 넣어준다.

까지의 역할을 가지고 있습니다.

public static void createGachaBox(Player player) {
    gachaBoxMeta.addEnchant(Enchantment.LUCK, 1, false);
    gachaBoxMeta.setDisplayName("가챠 상자");
    gachaBox.setItemMeta(gachaBoxMeta);
    player.getInventory().addItem(gachaBox);
}

이와 같이 가챠 상자의 메타를 지정하고, 인자값인 플레이어에게 아이템을 주는 것까지 작성하였습니다.

 

그런 다음 해당 가챠 상자는 상호작용을 통해 사용했다는 것을 감지하기 위해

이를 확인하여, 다음 단계로 넘어가게 하는 메소드인 interactBox를 작성합니다.

 

인자값으로는 플레이어, 이벤트, 플러그인 이 3가지를 받으면 됩니다.

(사실, 이벤트와 플러그인 이 2가지만 받아도 되지만 그냥 3가지로 하였습니다. 아무 이유 없습니다.)

그런 다음보다 확실하게 가챠 상자로 상호작용을 하였는지 알아보기 위해

이벤트를 발생했을 당시, 플레이어가 사용하였던 메인 핸드 (default: 오른손)에는 셜커 상자가 있고, 

해당 셜커 상자에게 바다의 행운 인첸트가 적용되어 있는지 검사합니다.

그리고, 상호작용 이벤트는 플레이어가 고개만 움직이더라도 반응하는 이벤트 이므로

확실하게 블럭에 우클릭, 혹은 그냥 허공에 우클릭을 하였는지 역시 검사합니다.

(물론 상호작용 이벤트 외에도 더 편한 방식이 있긴 하지만, 해당 방식은 허공 우클릭 이벤트를 감지하지 못하므로, 이렇게 귀찮은 방식을 사용하는 것입니다.)

이 모든 조건에 통과가 되었다는 것은 확실하게 플레이어가 가챠 상자를 가지고 우리가 요구하는 행동을 했다는 것을 알 수 있습니다.

이때, 가챠 상자 이벤트를 발동시킴과 동시에 실제로 이벤트가 발생하여서는 안되기에 이벤트를 취소시켜버립니다.

 

public static void interactBox(Player player, PlayerInteractEvent event, Plugin plugin) {
    if (player.getInventory().getItemInMainHand().getType() == Material.SHULKER_BOX
            && player.getInventory().getItemInMainHand().containsEnchantment(Enchantment.LUCK)
            && (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK)) {

        openBox(player, plugin); // 가챠 상자 작동
        event.setCancelled(true); // 설치는 안된다.
    }
}

public static void openBox(Player player, Plugin plugin) {
    // 랜덤 클래스 사용하여 랜덤하게 작동
}

다음에는 가챠 상자 이벤트 작동 코드를 개발하도록 하겠습니다.

 

아래는 오늘의 최종 코드입니다.

package com.tistory.workshop6349.minecraft_gacha;

import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.Plugin;

public class GachaBox {

    // 가챠 상자와 상호작용 이후, 다시 보스바가 작동해야함
    public static ItemStack gachaBox = new ItemStack(Material.SHULKER_BOX);
    public static ItemMeta gachaBoxMeta = gachaBox.getItemMeta();

    public static void createGachaBox(Player player) {
        gachaBoxMeta.addEnchant(Enchantment.LUCK, 1, false);
        gachaBoxMeta.setDisplayName("가챠 상자");
        gachaBox.setItemMeta(gachaBoxMeta);
        player.getInventory().addItem(gachaBox);
    }

    public static void interactBox(Player player, PlayerInteractEvent event, Plugin plugin) {
        if (player.getInventory().getItemInMainHand().getType() == Material.SHULKER_BOX
                && player.getInventory().getItemInMainHand().containsEnchantment(Enchantment.LUCK)
                && (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK)) {

            openBox(player, plugin); // 가챠 상자 작동
            event.setCancelled(true); // 설치는 안된다.
        }
    }

    public static void openBox(Player player, Plugin plugin) {
        // 랜덤 클래스 사용하여 랜덤하게 작동
    }

}

이상입니다.

'잡다한 개발 > 마크플러그인' 카테고리의 다른 글

마크 가챠 5편  (0) 2021.11.30
마크 가챠 4편  (0) 2021.11.25
마크 가챠 2편  (0) 2021.11.20
마크 가챠 1편  (0) 2021.11.20
마크 가챠 0편  (0) 2021.11.19