Minecraft(我的世界)中文论坛

标题: [NEW API]新API的部分事物的讲解(新手请路过,可能会持续更新)

作者: y185110754    时间: 2014-6-24 22:52
标题: [NEW API]新API的部分事物的讲解(新手请路过,可能会持续更新)
本帖最后由 y185110754 于 2014-6-30 13:52 编辑

各位骚年你们好,我是来自PMPCT的组长juhua。。。

今天给大家带来的是新API的过渡篇,很多写手很难从旧的API中过渡过来这是为何呢,下面由我来为各位少年讲解。。。

那么新核的插件是否都是phar格式?不,答案是否定,因为你写出来的插件是php格式的源码,所以他不可能不会被识别和运行;






但是为何我却无法加载我的插件源码呢?不,少年是你缺少识别和运行它的工具(devtool)

devtools讲解:
devtools是一个出自PM官方的一个很强大的工具,他的功能是识别运行插件源码和将源码压制为phar格式
使用方法:
1.首先先将devtools放入插件目录中
1.将插件的所有文件打包放在一个xxx的文件夹里扔进PM主目录下plugin文件夹内
2.运行服务器,控制台看到"[INFO] Loading source plugin xxxxxxx v1.0.0"的紫色提示时代表你的插件没有任何问题可以运行了
3.输入/makeplugin XXXX(你的插件的名字与之前的紫字提示的XXXX那里相同注意大小写)将插件源码压制为phar格式的插件
4.从主目录下plugin文件夹的devtools文件夹内将phar格式的插件取出
5.你可以在官网的插件主页上发布你的插件,也可以在mcbbs论坛上发布,或者扔给你盆友。(放在PM的插件官网请检查你的插件里是否有恶意代码或者有非英文的语言出现,否则将不会通过允许发布你的插件)


那么新核的插件会有哪些文件呢?请查看官方所列举出来的
示例插件(第三方的示例插件)
plugin.yml
此文件的功能为整合插件所有指令和事件的权限分配,以及指令注册,插件的所有描述等
src文件夹
将所有插件的代码放入其中,使用plugin关联插件的主要工作文件

plugin.yml例子(使用的官方的例子):

  1. name: ExamplePlugin  #插件的名字与namespace相同即可
  2. main: ExamplePlugin\MainClass  #关键插件的主要工作文件
  3. version: 1.0.0  #插件版本(可带中文注意编码utf-8)
  4. api: [1.0.0]  #此处不做解释按部就班即可
  5. load: POSTWORLD #copy即可不做解释
  6. author: PocketMine Team #不做解释
  7. <pre><div class="line" id="LC9"><span class="l-Scalar-Plain">depend</span><span class="p-Indicator">:</span> <span class="p-Indicator">[<font face="微软雅黑">xxxx</font></span><span class="nv"></span><span class="p-Indicator">]#<font face="微软雅黑">当你这个插件引用到了别的插件的函数或者变量时,请记住加上他</font></span></div></pre>description: Example plugin showing the new API #对于插件的描述等同于old api在注释里的那堆描述
  8. website: https://github.com/PocketMine/ExamplePlugin  #此条可有可无(放X网地址的少年自己注意点儿)
  9. commands:     #copy下来
  10. example:      #此处与namepace相同即可
  11.   description: Example command  #主要指令的描述
  12.   usage: "Usage: /example"  #指令用法
  13.   <span class="l-Scalar-Plain">aliases</span><span class="p-Indicator">:</span> <span class="p-Indicator">[ex</span><span class="nv"></span><span class="p-Indicator">,</span> <span class="nv">exe</span><span class="p-Indicator">]</span>  
  14.   permission: exampleplugin.command.example  #格式为namespace.command.指令名
  15. permissions:   #开始分配权限
  16. exampleplugin.command.example:  #copy上面对应的部分即可
  17.   description: "Allows the user to run the example command"   #此处格式为"允许使用xxxx指令"
  18.   default: true #true值为默认允许所有人使用这个指令,false为禁用指令,op为只有管理员才能使用这个指令
复制代码
src/xxx/main.php实例讲解:

  1. <?php

  2. namespace ExamplePlugin; /*命名空间与plugin.yml的name处相同即可*/

  3. use pocketmine\command\Command;
  4. use pocketmine\command\CommandSender;
  5. use pocketmine\event\Listener;
  6. use pocketmine\event\player\PlayerRespawnEvent;
  7. use pocketmine\Player;
  8. use pocketmine\plugin\PluginBase;
  9. use pocketmine\Server;
  10. use pocketmine\utils\TextFormat;   
  11. /*以上这一大段都是需要的引用,你的插件使用的PM所给出的函数和变量还有类都必须要引用过来,那么函数和变量以及类在哪里能看到呢,不着急两个方法1.将整个PM仔仔细细由外而内琢磨透彻,2.使用给出的函数和变量列表(这些东西我有可加帖子后的群找群主要)*/

  12. class MainClass extends PluginBase implements Listener{    /*mainclass为文件名,可根据自己的命名更改*/

  13. public function onLoad(){
  14. $this->getLogger()->info(TextFormat::WHITE . "I've been loaded!");
  15. }
  16. /*此段必须有,这是在开始运行服务器时运行此处的所有代码*/

  17. public function onEnable(){
  18. $this->getServer()->getPluginManager()->registerEvents($this, $this);
  19. $this->getServer()->getScheduler()->scheduleRepeatingTask(new BroadcastPluginTask($this), 120);
  20. $this->getLogger()->info(TextFormat::DARK_GREEN . "I've been enabled!");
  21.     }
  22. /*此段必须有,这是在加载完成后的一系列提示*/

  23. public function onDisable(){
  24. $this->getLogger()->info(TextFormat::DARK_RED . "I've been disabled!");
  25. }
  26. /*此段必须有,当你输入/stop关闭服务器的指令时,运行此处的所有代码*/

  27. public function onCommand(CommandSender $sender, Command $command, $label, array $args){
  28. switch($command->getName()){
  29. case "example":
  30. $sender->sendMessage("Hello ".$sender->getName()."!");
  31. return true; /*当你在return值之前有"$sender->sendMessage("Hello ".$sender->getName()."!");"之类的回复消息的代码时值必须为true*/
  32. default:
  33. return false;
  34. }
  35. }

复制代码




应邀各位少年的积极请求和懒蛋的不作为我实在看不下去了于是我还是把函数和变量什么的列出来:


copy中下次更新会添加。、。。

教程更新动态:

2014/6/24 22:50 完成开头及对插件的部分文件的不完全描述,对于主要开发使用工具功能和使用进行了不详尽的讲解

●2014/6/30 13:50 对plugin.yml文件的说明补充和后续讲解的预告。。。


声明:


●本贴是送给正在往NEW API过渡的写过old api的插件的少年看的,不是的自己先学好php基础再来。

本帖可能会持续更新。。

●本帖的内容如若不喜可无视。


广告:
PMPCT广招程序猿代码写手键盘撸手
入组审核外群(入群找群主申请即可):329034682
审核通过即可进入内群享受群组福利(大量插件源码,大神指导,追踪官方动态等)
脑残骚年慎入!


作者: 小钧    时间: 2014-6-24 23:46
不明觉厉
作者: hsk001ufo    时间: 2014-6-27 15:43
菊花竟然来论坛发帖子了=。=
作者: y185110754    时间: 2014-6-29 14:07
hsk001ufo 发表于 2014-6-27 15:43
菊花竟然来论坛发帖子了=。=

嗯哼,然后呢。。。。。
作者: raysuperman    时间: 2014-7-2 10:25
load处应该有两个选项。
他们分别是PluginLoadOrder类的两个常量
STARTUP 和 POSTWORLD
STARTUP 应该是在服务器加载的时候也就是还没有加载第一个世界的时候会调用插件的onLoad()方法,
POSTWORLD 应该是在服务器加载第一个世界以后才会调用插件的onLoad()方法。

参见 Server::__construct() 方法 (第1425至1470行):
  1.                 $this->pluginManager = new PluginManager($this, $this->commandMap);
  2.                 $this->pluginManager->subscribeToPermission(Server::BROADCAST_CHANNEL_ADMINISTRATIVE, $this->consoleSender);
  3.                 $this->pluginManager->registerInterface("pocketmine\\plugin\\PharPluginLoader");
  4.                 $this->pluginManager->loadPlugins($this->pluginPath);

  5.                 $this->updater = new AutoUpdater($this, $this->getProperty("auto-updater.host", "www.pocketmine.net"));

  6.                 $this->enablePlugins(PluginLoadOrder::STARTUP);

  7.                 $this->generationManager = new GenerationRequestManager($this);

  8.                 LevelProviderManager::addProvider($this, "pocketmine\\level\\format\\anvil\\Anvil");


  9.                 Generator::addGenerator("pocketmine\\level\\generator\\Flat", "flat");
  10.                 Generator::addGenerator("pocketmine\\level\\generator\\Normal", "normal");
  11.                 Generator::addGenerator("pocketmine\\level\\generator\\Normal", "default");

  12.                 if($this->getDefaultLevel() === null){
  13.                         $default = $this->getConfigString("level-name", "world");
  14.                         if(trim($default) == ""){
  15.                                 trigger_error("level-name cannot be null, using default", E_USER_WARNING);
  16.                                 $default = "world";
  17.                                 $this->setConfigString("level-name", "world");
  18.                         }
  19.                         if($this->loadLevel($default) === false){
  20.                                 $seed = $this->getConfigInt("level-seed", time());
  21.                                 $this->generateLevel($default, $seed === 0 ? time() : $seed);
  22.                         }

  23.                         $this->setDefaultLevel($this->getLevelByName($default));
  24.                 }


  25.                 $this->properties->save();

  26.                 $this->scheduler->scheduleDelayedRepeatingTask(new CallbackTask("pocketmine\\utils\\Cache::cleanup"), $this->getProperty("ticks-per.cache-cleanup", 900), $this->getProperty("ticks-per.cache-cleanup", 900));
  27.                 if($this->getConfigBoolean("auto-save", true) === true and $this->getProperty("ticks-per.autosave", 6000) > 0){
  28.                         $this->scheduler->scheduleDelayedRepeatingTask(new CallbackTask(array($this, "doAutoSave")), $this->getProperty("ticks-per.autosave", 6000), $this->getProperty("ticks-per.autosave", 6000));
  29.                 }

  30.                 if($this->getProperty("chunk-gc.period-in-ticks", 600) > 0){
  31.                         $this->scheduler->scheduleDelayedRepeatingTask(new CallbackTask(array($this, "doLevelGC")), $this->getProperty("chunk-gc.period-in-ticks", 600), $this->getProperty("chunk-gc.period-in-ticks", 600));
  32.                 }

  33.                 $this->enablePlugins(PluginLoadOrder::POSTWORLD);
复制代码


和 Server::enablePlugins() 方法 (第1522至1533行):
  1.         public function enablePlugins($type){
  2.                 foreach($this->pluginManager->getPlugins() as $plugin){
  3.                         if(!$plugin->isEnabled() and $plugin->getDescription()->getOrder() === $type){
  4.                                 $this->loadPlugin($plugin);
  5.                         }
  6.                 }

  7.                 if($type === PluginLoadOrder::POSTWORLD){
  8.                         $this->commandMap->registerServerAliases();
  9.                         DefaultPermissions::registerCorePermissions();
  10.                 }
  11.         }
复制代码

作者: y185110754    时间: 2014-7-12 21:44
raysuperman 发表于 2014-7-2 10:25
load处应该有两个选项。
他们分别是PluginLoadOrder类的两个常量
STARTUP 和 POSTWORLD

少年真耐心看,我都只是浏览了一遍函数库而已,看源码时间太长了。。
作者: zmdd    时间: 2014-7-13 09:02
表示小白一个→-→只看得懂一点,,,不过我想问phar是打包的?就不能打开了是吧,那如何进行汉化呢?
作者: stevenghy    时间: 2014-7-13 17:35
zmdd 发表于 2014-7-13 09:02
表示小白一个→-→只看得懂一点,,,不过我想问phar是打包的?就不能打开了是吧,那如何进行汉化呢? ...

要是看得懂一点就知道怎么解包了。unphar.com或devtools的extractplugin,不过,汉化别修改作者
作者: raysuperman    时间: 2014-8-1 13:58
本帖最后由 raysuperman 于 2014-8-1 14:00 编辑
y185110754 发表于 2014-7-12 21:44
少年真耐心看,我都只是浏览了一遍函数库而已,看源码时间太长了。。

表示只是平时打印了本源码准备看看。只不过还是顶一个既然是菊花发的贴。

作者: raysuperman    时间: 2014-8-1 14:03
plugin.yml例子(使用的官方的例子):

这个乱码了
作者: Kenneth_z    时间: 2015-3-3 01:19
能不能解释下开头一堆引用的例子从哪里可以看
作者: robbery1    时间: 2015-3-15 08:44
顶下楼主 希望发布更多的插件教程 并不是没有人看而是伸手党不回复 我在此支持一下- -
作者: shenren3-f    时间: 2019-8-18 09:04
提示: 作者被禁止或删除 内容自动屏蔽