当前位置: 首页 > 知识库问答 >
问题:

使用项目Minecraft插件插头Bukkit后标记位置

夏侯弘量
2023-03-14

我想把玩家点击的块的位置保存到两个变量中。

我尝试在使用该项目后触发一个事件,但只有当我在空中单击时才会生成该事件。

如果(p.getiteminhand().gettype()==Material.blaze_rod){System.out.println(“test”);}

我也尝试了这个设计,但代码仍然不能正常工作:

如果((p.getiteminhand().gettype()==Material.blaze_rod)&&(event.getaction().equals(action.right_click_block)){System.out.println(“test”);}

总之,我想把两个指示块的位置写到变量中。一个是当右键单击给定项时,另一个是当左键单击相同项时。

我还没有搜索,但我会马上问,我如何检查给定坐标处的块是否存在(它是空的,是空的),以及我如何设置或替换给定坐标处的选定块?

共有1个答案

唐煜
2023-03-14

您可以通过PlayerInteractEvent操作材料位置来实现这一点。以下是一个例子:

import org.bukkit.Location;
import org.bukkit.event.EventHandler;

import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.block.Action;

import org.bukkit.block.Block;
import org.bukkit.Material;

public class YourListener {

    private Location firstLocation;
    private Location secondLocation;
    
    @EventHandler
    public void onPlayerInteractEvent(PlayerInteractEvent event) {
        // Only process when the player has a wooden axe in the hand.
        if (event.getMaterial() == Material.WOODEN_AXE) {
            Action action = event.getAction();
            Block clickedBlock = event.getClickedBlock();
            if (clickedBlock == null) return;
            if (action == Action.LEFT_CLICK_AIR || action == Action.LEFT_CLICK_BLOCK) {
                // Do one thing (left click)
                Material type = clickedBlock.getType(); // Block material (Check if it's Material.AIR or another type)
                firstLocation = clickedBlock.getLocation(); // Save the location
            } else if (action == Action.RIGHT_CLICK_AIR || action == Action.RIGHT_CLICK_BLOCK){
                // Do another thing (right click)
                Material type = clickedBlock.getType(); // Block material (Check if it's Material.AIR or another type)
                secondLocation = clickedBlock.getLocation(); // Save location
                // Let's say you now want to replace the block material to a diamond block:
                clickedBlock.setType(Material.DIAMOND_BLOCK);
            }
        }
    }

}

PlayerInteractEvent具有getMaterial()方法,该方法返回:

返回此事件表示的项的材料

(玩家手中物品的材质)

然后,getAction()方法返回下列枚举项之一

  • action.left_click_air:在air上左键单击
  • 操作.left_click_block:左键单击block
  • 操作。right_click_air:右键单击air
  • 操作。right_click_block:右键单击block

getClickedBlock()方法返回播放器单击的块。然后可以使用gettype()settype(Material)方法来获取和设置该块的材料。

最后,block中的getlocation()方法将返回该块的位置。

请务必阅读有关此类、枚举和接口的所有文档:

  • 操作
  • 位置
  • 材料
  • PlayerInteractEvent
 类似资料:
  • 我正在为一个服务器做一个插件,我是开发者,我正在开发一个插件!我想通过执行boss give lvl命令来生成boss鸡蛋

  • 我想制作一个插件,允许玩家自定义他们的盔甲模型和纹理。我希望服务器上的其他玩家能够看到这些自定义设置。 由于我从未在插件中做过纹理覆盖,我不知道这是否可行,我也无法在网上找到任何相关的东西。我知道你可以让积木看起来和其他积木一样,但是盔甲不行。 我必须给在线玩家发送一个数据包,还是有其他方法可以做到这一点?如果这是可能的,是否有一个地方记录了如何做到这一点?

  • 我试图使一个混合modeauth(我自己的版本的身份验证插件),但有一个问题-在与明星的行,我得到以下错误: 这是我的代码:

  • 我正在尝试学习如何编写minecraft插件,但是我在开始时遇到了一点问题,当我尝试运行导出的插件时,我得到一个主类未找到错误。我已经尝试移动plugin.yml文件,检查所有部分都导出和重命名类等无济于事。也阅读了现有的问题。任何帮助都将不胜感激。 主要: helloCommand: 插件。yml: 控制台错误: Pic of Package Explorer编辑前一个问题,更正建议但错误仍然存