https://github.com/gloomn/blogMCPluginProjects
GitHub - gloomn/blogMCPluginProjects
Contribute to gloomn/blogMCPluginProjects development by creating an account on GitHub.
github.com
플러그인 코드들은 모두 여기 있으니 코드가 필요하시면 다운로드 하시면 됩니다!
이전강의
저번 강좌에서는 쿨타임 시스템을 구현해 보았다.
https://syntaxack.tistory.com/entry/minecraftplugin7
마인크래프트 플러그인 강좌 7강 - 쿨타임 시스템 구현하기
이전 강의https://syntaxack.tistory.com/entry/minecraftplugin6 마인크래프트 플러그인 강좌 6강 - 커스텀 커맨드(긴 커맨드), 날씨 커맨드마인크래프트 긴 커맨드 구현2강에서는 기본적인 커맨드 구현을 해보
syntaxack.tistory.com
특정 아이템을 들면 버프 주기
이번에는 특정 아이템을 플레이어가 손에 들면 버프를 주도록 구현 해보도록 하겠다.
프로젝트 만들기
Intellij를 실행해서 새로운 마인크래프트 프로젝트를 만들어준다.
프로젝트 생성 방법을 모르면 아래 링크를 눌러 한 번만 보면 된다.
https://syntaxack.tistory.com/entry/minecraftplugin1
마인크래프트 플러그인 강좌 1강 - 첫 플러그인 만들기
이전 강의https://syntaxack.tistory.com/entry/minecraftplugin0 마인크래프트 플러그인 강좌 0강 - 준비하기마인크래프트 플러그인이란?마인크래프트 플러그인은 마인크래프트 내에서 기능을 확장할 수 있도
syntaxack.tistory.com
1. paper/spigot/sponge 템플릿에서 여러분이 사용하는 버킷 플러그인을 선택한다.
2. 빌드 시스템은 Gradle를 선택한다.
3. 언어는 자바를 선택한다.
4. 마인크래프트 버전은 여러분이 플러그인을 적용항 버전과 paper 버전이 일치하도록 선택한다.
예를 들어서 마인크래프트 버전 1.21.4, paper 버전 1.21.4 이면 1.21.4를 선택한다.
5. 플러그인 이름과 클래스 이름을 적는다.
생성을 눌러준다.
https://syntaxack.tistory.com/entry/minecraftpluginproblem1
마인크래프트 플러그인 강좌 - 잘못된 Gradle JVM 구성을 발견했습니다.
IntelliJ를 사용해서 마인크래프트 플러그인 프로젝트를 만들었을 때 잘못된 Gradle JVM 설정이라는 알람이 뜰 때가 있다.이는 JDK와 Gradle이 호환되지 않아서 발생하는 문제이다.이때는 인터넷 검색
syntaxack.tistory.com
만약 Gradle과 JVM 버전이 안 맞는다는 오류가 뜨면 위의 포스트를 보면 된다.
Gradle Build 설정
우리는 jar 파일로 빌드할 때 빌드 위치를 바로 플러그인 폴더로 빌드되게 설정할 것이다.
build.gradle 파일을 열어준다.
tasks.jar{
archiveFileName = 'itemBuff.jar'
destinationDirectory = file('C:\\Users\\kijoon\\Desktop\\Server\\plugins')
}
itemBuff.java
package org.blog.itemBuff;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.event.Listener;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerItemHeldEvent;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
public final class ItemBuff extends JavaPlugin implements Listener {
@Override
public void onEnable() {
// Plugin startup logic
Bukkit.getPluginManager().registerEvents(this, this);
getLogger().info("플러그인 활성화됨!");
}
@Override
public void onDisable() {
// Plugin shutdown logic
getLogger().info("플러그인 비활성화됨!");
}
@EventHandler
public void onItemHeld(PlayerItemHeldEvent event) {
Player player = event.getPlayer();
Bukkit.getScheduler().runTaskLater(this, () -> {
Material heldItem = player.getInventory().getItemInMainHand().getType();
// 기존 효과 제거
player.removePotionEffect(PotionEffectType.SPEED);
player.removePotionEffect(PotionEffectType.BLINDNESS);
// 조건에 따라 효과 부여
if (heldItem == Material.GOLDEN_SWORD) {
player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 1, true, false));
player.sendMessage("§e황금검을 들고 있어 신속 효과가 적용되었어요!");
} else if (heldItem == Material.DIAMOND_SWORD) {
player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, Integer.MAX_VALUE, 1, true, false));
player.sendMessage("§e다이아몬드검을 들고 있어 실명 효과가 적용되었어요!");
}
}, 1L);
}
}
여기서 살펴볼 것은 onItemHeld 함수 부분이다.
@EventHandler
이 메서드는 이벤트 리스너임을 의미한다.
PlayerItemHeldEvent가 발생했을 때 자동으로 호출된다.
public void onItemHeld(PlayerItemHeldEvent event) {
플레이어가 핫바 슬롯을 바꿔서 들고 있는 아이템이 변경되었을 때 호출되는 함수이다.
Player player = event.getPlayer();
이벤트에서 관련된 플레이어 객체를 가져온다.
Bukkit.getScheduler().runTaskLater(this, () -> {
아이템이 실제로 손에 적용되는 시점은 이벤트보다 한 틱 늦기 때문에
1틱(0.05초) 뒤에 작업을 수행한다.
this는 현재 플러그인 인스턴스를 의미한다.
*인스턴스는 클래스를 기반으로 실제로 만들어진 객체를 말한다. 즉 여기서는 플러그인 객체 그 자체를 말한다.
runTaskLater()는 어떤 플러그인에서 실행할 작업인지 알아야 하기 때문에, 그 플러그인의 인스턴스를 인자로 요구한다.
Material heldItem = player.getInventory().getItemInMainHand().getType();
플레이어가 지금 손에 들고 있는 아이템의 Material(종류)을 가져온다.
즉 어떤 아이템을 가지고 있는지 확인하여 heldItem이라는 변수에 넣는 것이다.
player.removePotionEffect(PotionEffectType.SPEED);
player.removePotionEffect(PotionEffectType.BLINDNESS);
먼저 이전에 적용됐을 수도 있는 효과들을 제거한다.
황금검이나 다이아검이 아닐 때 효과가 계속 유지되는 것을 방지한다.
if (heldItem == Material.GOLDEN_SWORD) {
손에 든 아이템이 황금검인지 확인한다.
아까 위에서 heldItem에는 플레이어가 들고 있는 아이템이 담긴다고 설명했다.
player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 1, true, false));
황금검을 들고 있으면 SPEED 효과를 부여한다.
Integer.MAX_VALUE는 매우 긴 지속 시간이다.
1은 효과 레벨이다.
true, false는 파티클은 보이게, 아이콘은 안 보이게 설정하는 것이다.
player.sendMessage("§e황금검을 들고 있어 신속 효과가 적용되었어요!");
플레이어에게 노란색( §e )메시지를 보낸다.
} else if (heldItem == Material.DIAMOND_SWORD) {
황금검이 아니고 다이아몬드검을 들고 있으면 이 else if 블록이 실행된다.
player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, Integer.MAX_VALUE, 1, true, false));
다이아몬드검을 들고 있으면 BLINDNESS 효과를 부여한다.
지속시간과 설정은 신속과 동일하게 무제한이다.
player.sendMessage("§e다이아몬드검을 들고 있어 실명 효과가 적용되었어요!");
플레이어에게 노란색( §e )메시지를 보낸다.
}, 1L);
이 코드는 블록의 내용을 1틱(0.05)초 뒤에 실행한다.
이로써 플레이어의 아이템이 바뀐 이우 상태를 정확히 읽을 수 있다.
plugin.yml 작성하기
name: itemBuff
version: '1.0-SNAPSHOT'
main: org.blog.itemBuff.ItemBuff
api-version: '1.21'
테스트하기
gradle build에서 jar을 선택하고 빌드한다.
마인크래프트 서버를 열고 실행해보면
정상적으로 실행이 되는 것을 볼 수 있다.
'마인크래프트 플러그인' 카테고리의 다른 글
마인크래프트 플러그인 강좌 10강 - config.yml이란? 생성과 구조 이해하기 (0) | 2025.06.21 |
---|---|
마인크래프트 플러그인 강좌 9강 - GUI 투표 시스템 만들기(paper) (6) | 2025.06.21 |
마인크래프트 플러그인 강좌 7강 - 쿨타임 시스템 구현하기 (1) | 2025.06.15 |
마인크래프트 플러그인 강좌 6강 - 커스텀 커맨드(긴 커맨드), 날씨 커맨드 (4) | 2025.06.14 |
마인크래프트 플러그인 강좌 - 잘못된 Gradle JVM 구성을 발견했습니다. (0) | 2025.06.14 |