用Java写一个Bukkit1201的放置箱子后自动上锁并生成牌子两个箱子合并的大箱子只显示一个牌子
以下是一个用Java编写的Bukkit插件示例,可以实现在放置箱子后自动上锁并生成牌子,两个箱子合并的大箱子只显示一个牌子。
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.Chest;
import org.bukkit.block.Sign;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.HashMap;
import java.util.Map;
public class ChestLockPlugin extends JavaPlugin implements Listener {
private Map<Block, String> lockedChests;
@Override
public void onEnable() {
lockedChests = new HashMap<>();
Bukkit.getPluginManager().registerEvents(this, this);
}
@Override
public void onDisable() {
lockedChests.clear();
}
@EventHandler
public void onPlayerInteract(PlayerInteractEvent event) {
Player player = event.getPlayer();
Action action = event.getAction();
Block clickedBlock = event.getClickedBlock();
if (action == Action.RIGHT_CLICK_BLOCK && clickedBlock != null && clickedBlock.getType() == Material.CHEST) {
Chest chest = (Chest) clickedBlock.getState();
if (isDoubleChest(clickedBlock)) {
clickedBlock = getMainChest(clickedBlock); // 获取大箱子的主方块
chest = (Chest) clickedBlock.getState();
}
String playerName = player.getName();
if (lockedChests.containsKey(clickedBlock)) {
String owner = lockedChests.get(clickedBlock);
if (!owner.equals(playerName)) {
player.sendMessage("这个箱子已经被 " + owner + " 锁定了!");
event.setCancelled(true);
return;
} else {
lockedChests.remove(clickedBlock); // 解锁箱子
updateSign(clickedBlock, null); // 移除牌子
player.sendMessage("你解锁了这个箱子!");
}
} else {
lockedChests.put(clickedBlock, playerName); // 上锁箱子
updateSign(clickedBlock, playerName); // 生成牌子
player.sendMessage("你锁定了这个箱子!");
}
}
}
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
Player player = event.getPlayer();
String playerName = player.getName();
lockedChests.entrySet().removeIf(entry -> entry.getValue().equals(playerName)); // 移除玩家锁定的箱子
}
private boolean isDoubleChest(Block block) {
BlockState state = block.getState();
if (state instanceof Chest) {
Chest chest = (Chest) state;
Block relativeBlock = chest.getRelative(org.bukkit.block.BlockFace.EAST);
return relativeBlock.getType() == Material.CHEST || relativeBlock.getType() == Material.TRAPPED_CHEST;
}
return false;
}
private Block getMainChest(Block block) {
BlockState state = block.getState();
if (state instanceof Chest) {
Chest chest = (Chest) state;
Block relativeBlock = chest.getRelative(org.bukkit.block.BlockFace.WEST);
if (relativeBlock.getType() == Material.CHEST || relativeBlock.getType() == Material.TRAPPED_CHEST) {
return relativeBlock;
}
}
return block;
}
private void updateSign(Block chestBlock, String playerName) {
Block signBlock = chestBlock.getRelative(org.bukkit.block.BlockFace.UP);
if (signBlock.getType() == Material.WALL_SIGN) {
Sign sign = (Sign) signBlock.getState();
sign.setLine(0, "[Locked Chest]");
if (playerName != null) {
sign.setLine(1, "Owner: " + playerName);
} else {
sign.setLine(1, "");
}
sign.update();
}
}
}
这是一个简单的插件示例,可以将其打包成一个jar文件,并在Bukkit服务器上运行。当玩家右键点击一个箱子时,插件会自动上锁或解锁箱子,并在上方生成一个牌子来显示箱子的状态。如果是两个箱子合并的大箱子,插件会将牌子放在主箱子上。当玩家退出服务器时,插件会自动移除该玩家锁定的箱子。
请注意,为了使插件正常工作,你需要将其所依赖的Bukkit版本设置为1.20.1,并确保你的项目中包含了正确的Bukkit库
原文地址: https://www.cveoy.top/t/topic/h4xX 著作权归作者所有。请勿转载和采集!