本帖最后由 hsk001ufo 于 2014-1-19 14:25 编辑

声明本人对于PocketMine及php认知有限在这里分享一下一年来对PocketMine的经验

本帖由NES工作室成员kgdwhsk发布




开发准备

首先学习php及编写PocketMine(下文开始以PM简称)的插件我们需要一个代码编辑器(Windows系统推荐Notepad++下载可以去Notepad++官网:notepad-plus-plus.org下载),虽然代码在什么编辑器上都行,不过用这些专用的编辑器可以提高代码可读性并且增加效率。PM是基于php编写的一个软件,想要编写PocketMine的插件就必须会一些php的语法(在PM中特别需要熟练类[class]即面向对象的知识)如果你是一个php新手(比如我)可以上www.codecademy.com学习php的一些基础,这个网站是在边实践边学的所以本人觉得不错暑假时就是这个网站让我再次提起了对php的学习兴趣。









了解PM插件


现在我们可以上pm的官网看看:


在这里我们可以下载到PM最新的版本及很多PM资讯,你也可以进入PM论坛看看那里有许多有趣的插件。

接下来我们进入https://github.com/PocketMine/PocketMine-MP就可以获取最新pm测试版还有很多关于pm的信息。

我们可以在Github上找到这个https://github.com/PocketMine/PocketMine-MP/wiki/Plugin%20format在这里可以看到pm作者留下的插件的格式:




这里就是PM插件的开头部分,虽然在PHP里面/* */是注释的作用不过PM会检测这段信息,如果填写错误就会导致插件启动失败,name代表的是插件的名字,在PM开启时插件名字就是从这而来,version就是代表插件的版本号,那个description写的是关于此插件的功能介绍,autuhr就是写作者名字,class这个需要和你的插件类名字一样,apiversion这个填写的是PM的API版本。(以上除了class需要与代码里面的类名相同外其他根据个人意愿填写基本不会造成插件出现问题)

这就是Wiki里面的范例插件:

  1. <?php
  2. /*
  3. __PocketMine Plugin__
  4. name=ExamplePlugin
  5. version=0.0.1
  6. description=Example plugin
  7. author=shoghicp
  8. class=ExamplePlugin
  9. apiversion=7
  10. */
  11. class ExamplePlugin implements Plugin{
  12.         private $api;
  13.         public function __construct(ServerAPI $api, $server = false){
  14.                 $this->api = $api;
  15.         }
  16.         
  17.         public function init(){
  18.                 $this->api->console->register("example", "Example command", array($this, "handleCommand"));
  19.         }
  20.         
  21.         public function __destruct(){
  22.         
  23.         }
  24.         
  25.         public function handleCommand($cmd, $arg){
  26.                 switch($cmd){
  27.                         case "example":
  28.                                 console("EXAMPLE!!!");
  29.                                 break;
  30.                 }
  31.         }

  32. }
  33. ?>
复制代码

class ExamplePlugin implements Plugin{这是插件主体的第一句,意思就是定义一个类使用了Plugin(这个接口在src/API/PluginAPI.php)接口。

然后我们可以在/src/PluginAPI.php里面找到这个接口(接口的意义就在于像pm插件这样固定一个模板)


这样我们就可以看出插件的必备组成部分,这三个必须要有


$this->api->console->register()就是注册指令还有指向输入这个命令时使用的方法,这是pm内部的一个函数我们引用这个函数来进行注册命令白名单,example是指令名,后面那一段"Example command"是在输入help时显示的指令介绍,当控制台或者玩家使用example(玩家是使用/example)这个命令时就会根据这个方法init()里面所指向的方法handleCommand()并且运行,至于这个方法里面的参数$arg还有$cmd都是pm内部规定的一种参数$cmd就是指指令,当我们输入example时候就会激发这个方法。在handleCommand()方法里面的switch关键字就是个判断语句,最终引发switch里面的console()方法,console()的方法就是在服务端发送信息,break是一个退出循环的关键字如果在switch循环里没有break的话就会一直向下运行其他分支语句。

PHP基本控制语句补充
在PHP语言中八大基本数据类型(四种标量类型:布尔型[boolean]、整型[integer]、浮点型[float/double]、字符串[ string];两种复合类型:数组[array]、对象[object];两种特殊类型:资源[resource]、NULL)中有一种叫布尔值的类型,这种是数据类型只有2个值false(整型值0【零】、浮点型值0.0【零】、空白字符串和字符串"0"、没有成员变量的数组、没有单元的对象、特殊类型NULL会被认为是false)还有true(所有其他值都被认为是true【包括任何资源】)

php流程控制语句
  


类(class)还有函数(也称方法function)都需要用户大括号{}括起来,php里面每个字段(语句)都需要用分号(;)来终结
(这些符合,比如冒号括号之类的需要用的是英文的不能使用中文的因为这两种字符集不一样,php编译器只认英文的符号)。php是松散型语言不像js、JAVA、c等语言php的赋值不需要类型定义的操作符直接使用赋值运算符(=把右边的值赋值给左边的变量),因为php变量的分类是根据你赋值的值自动给予的所以也可以用强制类型转换
允许的强制转换有:

方法(也称函数function)定义方法:
  1. function 方法名(可添加参数){
  2. 函数主题句段;
  3. }
复制代码
定义类(class)方法:
  1. class 类名字
  2. {
  3. 类句段,类主体由方法还有属性组成
  4. }
复制代码
在pm中这段主体部分
  1. private $api;
  2. public function __construct(ServerAPI $api, $server = false){
  3. $this->api = $api;
  4. }

  5. public function init(){
  6. $this->api->console->register("example", "Example command", array($this, "handleCommand"));
  7. }

  8. public function __destruct(){

复制代码

只有init函数中间的内容是根据插件需要编写其他基本按照这个格式



有错误欢迎提