[wpdreams_ajaxsearchlite]

创建一个Atavism插件


使用AGIS代码的开发人员可能决定创建新的Atavism插件,如果他们想要实现默认情况下未提供的新系统(例如自定义天气系统或可能是证券交易系统)。以下步骤介绍了如何将新插件添加到Atavism中。


注意:插件或客户端之前的*符号表示插件的名称(任何名称)。


第1步:创建* Plugin.java文件

插件的核心文件是* Plugin.java文件,该文件应存在于atavism.agis.plugins包中。第一步是创建一个新的* Plugin.java文件(用你的插件名称替换*)。这可以通过右键单击atavism.agis.plugins在Eclipse中完成,选择New→File并命名文件* Plugin.java(将*替换为插件的名称)。


Plugin类需要扩展EnginePlugin类(或EnginePlugin的子代),并且应该在构造函数中调用SetPluginType(string),同时将Plugin名称传递给父构造函数。下面的ArenaPlugin类示例显示了设置Plugin类所需的基本结构。


  public class ArenaPlugin extends EnginePlugin {
      
      public ArenaPlugin() {
          super(ARENA_PLUGIN_NAME);
          setPluginType("Arena");
      }
      
      public String getName() {
          return ARENA_PLUGIN_NAME;
      }
      
      public static String ARENA_PLUGIN_NAME = "Arena";
      
      protected static final Logger log = new Logger("Arena");
      
      public void onActivate() {
          ...
      }
  }

第2步:创建* Client.java文件

虽然不是必需的,但每个插件使用都有一个附带的* Client.java文件,其中可以添加插件的消息/消息类型和其他功能。 Client文件通常位于core * Plugin.java文件旁边的atavism.agis.plugins包中。


Client类不继承或扩展任何其他类,并且没有任何必需的函数或变量,但是,插件的任何消息都将添加到此类中。


第3步:添加加载插件代码

要在服务器启动时加载插件,必须在几个位置声明和注册。

应该在服务器上的config / world文件夹中创建插件的python脚本,并包含registerPlugin()函数,例如:


from atavism.agis import *
  from atavism.agis.core import *
  from atavism.agis.objects import *
  from atavism.agis.util import *
  from atavism.server.math import *
  from atavism.server.events import *
  from atavism.server.objects import *
  from atavism.server.engine import *
  from atavism.server.util import *
  from atavism.server.plugins import *
  
  Engine.registerPlugin("atavism.agis.plugins.ArenaPlugin");

然后,此插件文件可以包含其他代码,以便在需要时允许在插件中设置属性等。查看config / world文件夹中的其他* plugin.py文件以获取一些示例。

现在需要将新的插件python脚本添加到world.sh文件(位于bin文件夹中),同时将插件名称添加到该文件中的插件列表中。

向下滚动到大致250行,找到以下开头的行:


   PLUGIN_TYPES=
   

转到字符串的末尾并添加(不带引号):


  " -p YourPluginName,1"

现在,您需要决定是否可以将插件添加到其中一个现有服务器进程,或者是否需要创建新的服务器进程。):


在现有流程中加载插件

通过将插件的python脚本添加到它在启动时加载的脚本列表,可以通过现有服务器进程加载新插件。这可能有点棘手,但是稍微低于PLUGIN_TYPES行,每个进程都按以下格式定义(战斗过程示例):


  if [ $verbose -gt 0 ]; then
      echo -en "Starting combat server: t"
  fi
  java 
      $JAVA_FLAGS 
      -Datavism.loggername=combat 
      atavism.server.engine.Engine 
$CMDLINE_PROPS 
      -i "${AO_BIN}"/wmgr_local1.py 
      -i "${AO_COMMON_CONFIG}"/aomessages.py 
      -i "${AO_WORLD_CONFIG}"/worldmessages.py 
      -t "${AO_COMMON_CONFIG}"/typenumbers.txt 
      "${AO_COMMON_CONFIG}"/global_props.py 
      "${AO_WORLD_CONFIG}"/global_props.py 
      "${AO_COMMON_CONFIG}"/skill_db.py 
      "${AO_WORLD_CONFIG}"/skill_db.py 
      "${AO_COMMON_CONFIG}"/ability_db.py 
      "${AO_WORLD_CONFIG}"/ability_db.py 
      "${AO_WORLD_CONFIG}"/classabilityplugin.py 
      "${AO_WORLD_CONFIG}"/combat.py 
      "${AO_WORLD_CONFIG}"/extensions_combat.py 
      "${AO_COMMON_CONFIG}"/profession_db.py 
      "${AO_WORLD_CONFIG}"/profession_db.py 
      "${AO_COMMON_CONFIG}"/groupplugin.py 
      "${AO_WORLD_CONFIG}"/group.py 
      &
  
  write_pid combat $!
  

需要将新的python脚本文件名添加到插件应该属于的进程的python脚本列表中。