이해도 | 입문자 |
---|---|
게임버전 (JE) | 1.7.10 |
게임버전 (BE) | 관련없음 |
package doorplugin;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.material.MaterialData;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;
public class Doorplugin extends JavaPlugin implements Listener {
private Map<Block, String> doorPasswords;
private Pattern passwordPattern;
@Override
public void onEnable() {
getServer().getPluginManager().registerEvents(this, this);
doorPasswords = new HashMap<>();
passwordPattern = Pattern.compile("[1-9]{4}");
}
@EventHandler
public void onPlayerInteract(PlayerInteractEvent event) {
Player player = event.getPlayer();
Block block = event.getClickedBlock();
// 플레이어가 철문을 Right-click했는지 확인
if (block != null && block.getType() == Material.IRON_DOOR) {
// 비밀번호가 설정되어 있는지 확인
if (doorPasswords.containsKey(block)) {
// 비밀번호가 맞는지 확인
String password = doorPasswords.get(block);
if (!password.isEmpty() && !password.equals(player.getName())) {
player.sendMessage("비밀번호가 일치하지 않습니다.");
return;
}
} else {
player.sendMessage("비밀번호가 설정되지 않았습니다.");
return;
}
// 비밀번호가 맞거나 비밀번호가 설정되지 않은 경우, 철문 열기/닫기
BlockState blockState = block.getState();
MaterialData data = blockState.getData();
// 철문의 열림 상태 설정
data.setData((byte) (data.getData() ^ 0x4));
blockState.update();
}
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if (cmd.getName().equalsIgnoreCase("setpassword")) {
if (sender instanceof Player) {
Player player = (Player) sender;
Block block = player.getTargetBlock(null, 5);
if (block != null && block.getType() == Material.IRON_DOOR) {
if (args.length > 0) {
String password = args[0];
if (passwordPattern.matcher(password).matches()) {
doorPasswords.put(block, password);
player.sendMessage("철문에 비밀번호를 설정했습니다.");
} else {
player.sendMessage("비밀번호는 1에서 9까지의 4자리 숫자여야 합니다.");
}
} else {
player.sendMessage("비밀번호를 입력해주세요.");
}
} else {
player.sendMessage("철문을 향해 바라보고 명령어를 사용해주세요.");
}
} else {
sender.sendMessage("플레이어만 이 명령어를 사용할 수 있습니다.");
}
return true;
}
return false;
}
}
버킷에서enable도 나왔고 컴파일도 통과했는데 인게임에서 어째서 작동을 안할까요 ㅠㅠ
qsef1256
2023.07.02안녕하세요, 그냥 작동이 안된다고만 말하면 코드에서 무엇이 문제인지 찾기 어려워요. 정확히 어떤 게 안되는지, 발생하는 오류는 있는지, plugin.yml에 명령어 등록은 했는지, 등등 신경 써야 할 지점이 많아요.
박상진5122
2023.07.02안녕하세요, 보시면 철문을 우클릭하면 동작이 일어나야하는데 아무일도 일어나지 않고요 plugin.yml에 명령어 등록을 안했기도 합니다 처음 만들어봐서 몰랐어요.. 방법을 알려주시면 감사하겠습니다
main: doorplugin.Doorplugin
name: Doorplugin
version: 1.0
author: park
description: Doorplugin1
본문은 저의 plugin.yml파일 내용입니다
0reo
2023.07.04이벤트랑 커맨드랑 한클래스에 다 쑤셔넣는건 나중에 고치기 힘들어져요 분할하시는게?
명령어 등록 안하심
public class Doorplugin extends JavaPlugin implements Listener 대신
public class Doorplugin extends JavaPlugin implements Listener, CommandExecutor
onEnable() 메소드안에 getCommand("명령어이름").setExecutor(this);
plugin.yml 안에
commands:
명령어이름
추가 ㄱㄱ
0reo
2023.07.04다고친건아니고 그냥 대충봣을때 보이는문제만 말씀드린거에용