181133567
本帖最后由 181133567 于 2015-8-2 16:27 编辑

又是一个周末时~
废话就不多说了 直接进入主题
先上效果图:






先拿出我们珍藏的小木棍  然后对准一个方块 之后鼠标左键




然后我们选中的方块就变成金砖了!


实现:
现在来回想一下这个神奇的法术:
      1.小木棍  2.左键点击  3.施法成功!
不难想到,既然有点击那么就一定有玩家点击事件,所以就会有 @EventHandler:
  1.         @EventHandler
  2.         public void onPlayerInteractBlock(PlayerInteractEvent evt){

  3.         }
复制代码
既然施法道具小木棍,那么就会有一个判断:
  1. if(evt.getPlayer().getItemInHand().getType() == Material.STICK){

  2. }
复制代码
evt着这里是这个点击事件  evt.getPlayer()就是触发这个事件的玩家  evt.getPlayer().getItemInHand()则是触发这个事件的玩家手上的物品
evt.getPlayer().getItemInHand().getType()就是触发这个事件的玩家手上的物品的类型了~  
Material是所有材料的类 所以这段code的意思就是【如果玩家手上的物品是小木棍 那么便执行接下来的code】


仔细思考一下刚才的施法过程 好像还有一个左键点击 也就是说要进行像  ↑↑↑上面↑↑↑  那样进行判断咯:
  1. if(evt.getAction() == Action.LEFT_CLICK_BLOCK){

  2. }
复制代码
同理,获得时间的具体行为 判断是否是 左键单击砖块 如果是 执行接下来的code。
  1. Block block = (Block) evt.getPlayer().getTargetBlock(null, 4);
  2. block.setType(Material.GOLD_BLOCK);
复制代码
这里就是获得一个Block实例并取名叫block。
使block 等于 玩家的目标砖块 施法距离为4格
获得目标砖块之后再用setType()来改变目标砖块的类型就好了~


应为一开始我们用到了@EventHandler 要使用它的话必须先对事件进行注册,而祖册一般都是在最早的时候执行的,所以注册事件的code就应该放在
onEnable()里咯  
  1.      @Override
  2.         public void onEnable() {
  3.                 getLogger().info(getName()+"已启动");
  4.                 getServer().getPluginManager().registerEvents(this, this);//注册事件
  5.                 super.onEnable();
  6.         }
复制代码


既然有注册 那么对应的就有注销:
  1.         @Override
  2.         public void onDisable() {
  3.                
  4.                 HandlerList.unregisterAll();//注销所有事件
  5.                 getLogger().info(getName()+"已关闭");
  6.                 super.onDisable();
  7.         }
复制代码
之后只需要简单的配置一下yml文件就好~(这里就不在赘述了= =。)
附上源码一份:
  1. package theGoldenTouch;

  2. import org.bukkit.Material;
  3. import org.bukkit.block.Block;
  4. import org.bukkit.event.EventHandler;
  5. import org.bukkit.event.HandlerList;
  6. import org.bukkit.event.Listener;
  7. import org.bukkit.event.block.Action;
  8. import org.bukkit.event.player.PlayerInteractEvent;
  9. import org.bukkit.plugin.java.JavaPlugin;

  10. public class main extends JavaPlugin implements Listener{
  11.         
  12.         @Override
  13.         public void onEnable() {
  14.                 getLogger().info(getName()+"已启动");
  15.                 getServer().getPluginManager().registerEvents(this, this);//注册事件
  16.                 super.onEnable();
  17.         }
  18.         
  19.         @EventHandler
  20.         public void onPlayerInteractBlock(PlayerInteractEvent evt){
  21.                 if(evt.getPlayer().getItemInHand().getType() == Material.STICK){
  22.                           if(evt.getAction() == Action.LEFT_CLICK_BLOCK){
  23.                                   Block block = evt.getPlayer().getTargetBlock(null, 4);
  24.                                   block.setType(Material.GOLD_BLOCK);
  25.                           }
  26.                         
  27.                 }
  28.         }
  29.         
  30.         
  31.         
  32.         @Override
  33.         public void onDisable() {
  34.                
  35.                 HandlerList.unregisterAll();//注销所有事件
  36.                 getLogger().info(getName()+"已关闭");
  37.                 super.onDisable();
  38.         }

  39. }
复制代码





*******************************************华丽丽的分割线*******************************************

渴望力量的我们是不会满足于小小的点金术上的!!!

我们想要的是更强大的力量!!











怎么做的前文都有说过,这里直接附上核心code:
  1. @EventHandler
  2.         public void onPlayerInteractBlock(PlayerInteractEvent evt){
  3.                 if(evt.getPlayer().getItemInHand().getType() == Material.STICK){
  4.                         Block block = evt.getPlayer().getTargetBlock(null, 4);
  5.                           if(evt.getAction() == Action.LEFT_CLICK_BLOCK){
  6.                                   if(stored_block == null){
  7.                                           block.setType(Material.GOLD_BLOCK);
  8.                                   }else{
  9.                                           block.setType(stored_block);
  10.                                   }
  11.                           }
  12.                           if(evt.getAction() == Action.RIGHT_CLICK_BLOCK){
  13.                                   stored_block = evt.getPlayer().getTargetBlock(null, 4).getType();
  14.                                   evt.getPlayer().sendMessage("成功获取当前的方块。");
  15.                           }
  16.                         
  17.                 }
  18.         }
复制代码
这里要注意的是stored_block这个变量。 在一开始创建一个私有变量 private Material stored_block ;
以供在onPlayerInteractBlock(PlayerInteractEvent evt)中使用
【虽然这样破坏了函数良好的封装性= =。。不过无所谓了  我们可是大法师!】


最后:
      之后的加强法术我没有仔细说明 不过原理前文都有提到过  大家可以自己独立思考一下  毕竟强大的力量总是要付出些什么不是么~

181133567
抱歉····粘代码的时候落了几个 }  各位亲们就将就一下吧 = =。。。。

caifuniao
{:10_508:}又见到楼主发帖了.
有机会交流下插件开发呀{:10_512:}

181133567
caifuniao 发表于 2015-8-2 23:57
又见到楼主发帖了.
有机会交流下插件开发呀

好的好的~加一下q呗  【我ID就是号····】

第一页 上一页 下一页 最后一页