Minecraft(我的世界)中文论坛

标题: [Pyramid]【PocketMine】插件制作学习&讨论

作者: hsk001ufo    时间: 2013-12-27 22:30
标题: [Pyramid]【PocketMine】插件制作学习&讨论
本帖最后由 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函数中间的内容是根据插件需要编写其他基本按照这个格式



欢迎加入PocketMine开发&讨论小组
有错误欢迎提



作者: Mani    时间: 2013-12-27 22:31
吊炸天的教程,膜拜
作者: crj125    时间: 2013-12-27 22:32
知道的挺多了
作者: LZX6238    时间: 2013-12-27 22:33
额,看到此教程我晕了。。。
作者: hsk001ufo    时间: 2013-12-27 22:46
LZX6238 发表于 2013-12-27 22:33
额,看到此教程我晕了。。。

哪里不好尽量提,我会尽量改好
作者: wilhelm    时间: 2013-12-27 23:07
很不错的教程,我没有看懂,但是写得很详细。辛苦了
作者: hsk001ufo    时间: 2013-12-27 23:08
sdszwilliam 发表于 2013-12-27 23:07
很不错的教程,我没有看懂,但是写得很详细。辛苦了

还没完呢=。=基本每星期更新一次明天还会继续的
作者: wilhelm    时间: 2013-12-27 23:09
hsk001ufo 发表于 2013-12-27 23:08
还没完呢=。=基本每星期更新一次明天还会继续的

如果更新内容较大的话建议新开一个帖子。做成一个系列。
作者: hsk001ufo    时间: 2013-12-27 23:10
sdszwilliam 发表于 2013-12-27 23:09
如果更新内容较大的话建议新开一个帖子。做成一个系列。

有道理哦,那我还是再开贴算了
作者: wilhelm    时间: 2013-12-27 23:28
hsk001ufo 发表于 2013-12-27 23:10
有道理哦,那我还是再开贴算了

不是不是,我的意思是,每次更新内容很大的话就都新开一个帖子,都放在一起很不方便阅读的
作者: hsk001ufo    时间: 2013-12-27 23:40
sdszwilliam 发表于 2013-12-27 23:28
不是不是,我的意思是,每次更新内容很大的话就都新开一个帖子,都放在一起很不方便阅读的

这个必须的
作者: hsk001ufo    时间: 2013-12-28 13:43
开始添加关于PHP判断语句的补充内容
作者: ljyloo    时间: 2014-1-3 10:05
hsk001ufo 发表于 2013-12-28 13:43
开始添加关于PHP判断语句的补充内容

{:10_505:}莫多写得不错额
作者: hsk001ufo    时间: 2014-1-3 17:40
ljyloo 发表于 2014-1-3 10:05
莫多写得不错额

=。=有错误记得提醒啊
作者: 。—。    时间: 2014-1-19 14:23
hsk001ufo 发表于 2014-1-3 17:40
=。=有错误记得提醒啊

字符串那里的[ string]变成论坛的蜘蛛丝[string]了……加个空格在中间或把文字截屏吧……

作者: hsk001ufo    时间: 2014-1-19 14:25
a6809936 发表于 2014-1-19 14:23
字符串那里的[ string]变成论坛的蜘蛛丝了……加个空格在中间或把文字截屏吧……

谢谢提醒了我现在已经改正了
作者: hsk001ufo    时间: 2014-2-9 13:40
移动一下位置
作者: MC-小俊    时间: 2014-2-12 19:16
要如何才能输入中文呢为何我输入的中文是乱码
作者: hsk001ufo    时间: 2014-2-12 19:48
MC-小俊 发表于 2014-2-12 19:16
要如何才能输入中文呢为何我输入的中文是乱码

改变一下插件的编码比如使用UTF-8编码

作者: wncda    时间: 2014-5-2 08:59
你是莫多吗?。。。顺便一提,我也晕。
作者: raysuperman    时间: 2014-7-25 16:16
有什么的还是多顶顶好,另外,NES工作室是什么。。
作者: hsk001ufo    时间: 2014-7-25 16:20
raysuperman 发表于 2014-7-25 16:16
有什么的还是多顶顶好,另外,NES工作室是什么。。

就是个工作室
作者: YIXIUWEI    时间: 2014-11-6 16:43
看不懂。。。。。。。。
作者: hfzc    时间: 2015-7-14 10:45
楼主如果有时间可不可以亲自教我,我qq1284503329
我看了教程后还是不会

作者: DHRSW    时间: 2015-10-16 19:29
hsk001ufo 发表于 2013-12-27 22:46
哪里不好尽量提,我会尽量改好

看不懂。。。。

作者: DHRSW    时间: 2015-10-17 09:51
能不能手把手教我求~
作者: 麦兜g    时间: 2016-8-11 13:08
开始添加关于PHP判断语句的补充内容
作者: mohist    时间: 2019-11-25 13:06
教程不错,学会写第一个插件了,感谢分享教程