<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://game.etao.net/w/index.php?action=history&amp;feed=atom&amp;title=Marauroa_Core_API</id>
	<title>Marauroa Core API - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://game.etao.net/w/index.php?action=history&amp;feed=atom&amp;title=Marauroa_Core_API"/>
	<link rel="alternate" type="text/html" href="https://game.etao.net/w/index.php?title=Marauroa_Core_API&amp;action=history"/>
	<updated>2026-05-07T05:12:18Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://game.etao.net/w/index.php?title=Marauroa_Core_API&amp;diff=121&amp;oldid=prev</id>
		<title>2020年4月28日 (二) 00:56 115.192.141.63</title>
		<link rel="alternate" type="text/html" href="https://game.etao.net/w/index.php?title=Marauroa_Core_API&amp;diff=121&amp;oldid=prev"/>
		<updated>2020-04-28T00:56:42Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Navigation for Marauroa Top|Using}}&lt;br /&gt;
{{Navigation for Marauroa Users}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Marauroa公开了精简后的非常简单的API，因此您可以轻松地开发自己的游戏. A nightly build [http://stendhalgame.org/hudson/job/marauroa_HEAD/javadoc/ JavaDoc API Documentation] is available, too.&lt;br /&gt;
&lt;br /&gt;
== 内容 ==&lt;br /&gt;
[[Image:Classdiagram_marauroa.common.game_rp_stubs.png|thumb|Class Diagram of RP* classes]]&lt;br /&gt;
&lt;br /&gt;
您应该了解的主要实体:&lt;br /&gt;
* Attributes&lt;br /&gt;
* RPAction&lt;br /&gt;
* RPObject&lt;br /&gt;
* RPSlot&lt;br /&gt;
* RPClass&lt;br /&gt;
* IRPZone interface&lt;br /&gt;
* IRPRuleProcessor interface&lt;br /&gt;
* RPWorld&lt;br /&gt;
&lt;br /&gt;
要了解这些元素，请参阅 [[RolePlayingDesign]] 和 [[GameDesign]].&lt;br /&gt;
&lt;br /&gt;
或者，如果您希望使用Python来开发游戏规则，请参阅:&lt;br /&gt;
* PythonRP&lt;br /&gt;
* PythonWorld&lt;br /&gt;
&lt;br /&gt;
The Python API can be found at [[PyArianneAPIDefinition]] and an example of its use at [[PyArianneAPIExample]]. 您可以在我们的游戏教程中阅读有关使用Python进行开发的更多信息。 [[HowToWriteGamesUsingArianne]]. Please note that Python support is dormant.&lt;br /&gt;
&lt;br /&gt;
== Attributes ==&lt;br /&gt;
属性是存储在列表中的数据对. 每个属性由 &amp;#039;&amp;#039;name&amp;#039;&amp;#039; 和 &amp;#039;&amp;#039;value&amp;#039;&amp;#039; 元素组成. 属性是在Arianne中存储数据的标准方式. 一个属性的例子是您的年龄, 即 name=&amp;quot;age&amp;quot; 和 value=21 &lt;br /&gt;
&lt;br /&gt;
每个属性还具有与之关联的类型，在 &amp;#039;&amp;#039;RPClass&amp;#039;&amp;#039; 中定义. 属性是 &amp;#039;&amp;#039;RPClass&amp;#039;&amp;#039; 的实例(关于 RPClass 的更多内容请参阅下节).&lt;br /&gt;
&lt;br /&gt;
属性中有两个特殊条目:&lt;br /&gt;
* &amp;#039;&amp;#039;type&amp;#039;&amp;#039;: 定义对象所属的RPClass的名称.&lt;br /&gt;
* &amp;#039;&amp;#039;id&amp;#039;&amp;#039;: 定义一个唯一的标识符&lt;br /&gt;
&lt;br /&gt;
Attributes类向游戏开发人员公开的方法如下所示。 可以用来修改属性的功能.&lt;br /&gt;
&lt;br /&gt;
设置属性的值:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    public void put(String name, String value)&lt;br /&gt;
    public void put(String name, int value)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
向已经存在的属性的值元素添加数量:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    public void add(String name, int quantity)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
返回属性的值:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    public String get(String name)&lt;br /&gt;
    public int get(String name)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从属性列表中删除属性条目:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    public void remove(String name)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果属性存在则返回True:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    public boolean has(String name)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;例子&amp;#039;&amp;#039;&amp;#039;: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    Attributes test=new Attributes();&lt;br /&gt;
    test.put(&amp;quot;name&amp;quot;,&amp;quot;Test attribute&amp;quot;);&lt;br /&gt;
    test.put(&amp;quot;hp&amp;quot;,100);&lt;br /&gt;
&lt;br /&gt;
    if(test.has(&amp;quot;hp&amp;quot;)) {&lt;br /&gt;
        test.add(&amp;quot;hp&amp;quot;,10);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    test.remove(&amp;quot;name&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RPClass ==&lt;br /&gt;
此类是Arianne的关键概念。 RPClass非常类似于Java类，但是对于Arianne RPObjects来说：RPClass定义了组成对象（对象是属性的集合,例如对于人类而言，年龄、身高等属性）的属性的类型（字符串、整数、布尔值...）和可见性（隐藏，私有或可见）。&lt;br /&gt;
&lt;br /&gt;
RPClass 由5个不同部分组成:&lt;br /&gt;
&lt;br /&gt;
数据类型定义:&lt;br /&gt;
* &amp;#039;&amp;#039;String&amp;#039;&amp;#039;: 字符串，最多 2^32 字节&lt;br /&gt;
* &amp;#039;&amp;#039;Short String&amp;#039;&amp;#039;: 字符串，最多 255 字节&lt;br /&gt;
* &amp;#039;&amp;#039;Integer&amp;#039;&amp;#039;:  32 位整数&lt;br /&gt;
* &amp;#039;&amp;#039;Short&amp;#039;&amp;#039;:  16 位整数&lt;br /&gt;
* &amp;#039;&amp;#039;Byte&amp;#039;&amp;#039;:  8 位整数&lt;br /&gt;
* &amp;#039;&amp;#039;Flag&amp;#039;&amp;#039;: 二进制标志.&lt;br /&gt;
&lt;br /&gt;
数据的可见性:&lt;br /&gt;
* &amp;#039;&amp;#039;Visible&amp;#039;&amp;#039;: 属性对客户端可见.&lt;br /&gt;
* &amp;#039;&amp;#039;Hidden&amp;#039;&amp;#039;: 属性对客户端不可见.&lt;br /&gt;
* &amp;#039;&amp;#039;Private&amp;#039;&amp;#039;: 该属性仅对与之关联的客户端可见（如客户端控制的玩家对象）&lt;br /&gt;
&lt;br /&gt;
RPClass的创建方法: (这些是每个RPClass实例的一部分，有关用法，请参见下面的示例)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    public void add(String name, byte type)&lt;br /&gt;
    public void add(String name, byte type, byte visibility)&lt;br /&gt;
    public void isA(String parent)&lt;br /&gt;
    public void isA(RPClass parent)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些方法将属性添加到RPClass并设置其类型和可见性。 您也可以设置此类的父类。 当然也可以没有父类.&lt;br /&gt;
&lt;br /&gt;
填充完类后，您可以使用这些方法查询数据。 这些方法使您可以获取类的类名称，属性的类型，确定属性是否存在以及知道RPClass是否为另一个的子类.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;查询&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    public String getName()&lt;br /&gt;
    public byte getType(String name)&lt;br /&gt;
    public byte getVisibility(String name)&lt;br /&gt;
    public boolean hasAttribute(String name)&lt;br /&gt;
    public boolean subclassOf(String parentclass)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
您可以使用以下方法查询系统类. 注意在运行时修改类 &amp;#039;&amp;#039;&amp;#039;不是&amp;#039;&amp;#039;&amp;#039; 一个好主意. 类定义在连接时发送到客户端，因此，如果您在游戏过程中更改类定义，则会使客户端崩溃!&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Class wide query&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    boolean hasRPClass(String name)&lt;br /&gt;
    RPClass getRPClass(String name)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当编写类定义时您可以跳过 &amp;#039;&amp;#039;id&amp;#039;&amp;#039; 和 &amp;#039;&amp;#039;type&amp;#039;&amp;#039; 属性，它们由 RPClass 自动定义.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;例子&amp;#039;&amp;#039;&amp;#039;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    // 一个带位置信息的实体&lt;br /&gt;
    RPClass objclass = new RPClass(&amp;quot;entity&amp;quot;);&lt;br /&gt;
    objclass.add(&amp;quot;x&amp;quot;, RPClass.BYTE);&lt;br /&gt;
    objclass.add(&amp;quot;y&amp;quot;, RPClass.BYTE);&lt;br /&gt;
&lt;br /&gt;
    // 一个玩家实体&lt;br /&gt;
    objclass = RPClass(&amp;quot;player&amp;quot;);&lt;br /&gt;
    objclass.isA(&amp;quot;entity&amp;quot;);&lt;br /&gt;
    objclass.add(&amp;quot;name&amp;quot;, RPClass.SHORT_STRING);&lt;br /&gt;
    objclass.add(&amp;quot;direction&amp;quot;, RPClass.SHORT_STRING);&lt;br /&gt;
    objclass.add(&amp;quot;score&amp;quot;, RPClass.INT);&lt;br /&gt;
    objclass.add(&amp;quot;super&amp;quot;, RPClass.BYTE);&lt;br /&gt;
    objclass.add(&amp;quot;!vdir&amp;quot;, RPClass.STRING,RPClass.HIDDEN);&lt;br /&gt;
    objclass.add(&amp;quot;!hdir&amp;quot;, RPClass.STRING,RPClass.HIDDEN);&lt;br /&gt;
    objclass.add(&amp;quot;?kill&amp;quot;, RPClass.FLAG);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
每次您创建一个新的RPClass时，只要您给它命名（例如：entity，player，...），它将被添加到系统的类列表中.&lt;br /&gt;
&lt;br /&gt;
注意，在示例中，如果您希望RPClass具有此属性，则必须指定hidden属性，否则默认情况下，该属性可见.&lt;br /&gt;
&lt;br /&gt;
注意：您可以选择在应用程序中不使用RPClass，但是这会增加网络带宽的使用率.&lt;br /&gt;
&lt;br /&gt;
== RPAction ==&lt;br /&gt;
RPAction是一个对象，用于表示玩家想要执行的动作. &lt;br /&gt;
在设计游戏时，由您自己决定，因为它们是针对每个游戏的（您还应该为它们定义RPClass）.&lt;br /&gt;
&lt;br /&gt;
== RPObject 和 RPSlot ==&lt;br /&gt;
RPObject是Arianne中数据的容器。 一个RPObject是附加了RPSlot列表的Attributes元素.&lt;br /&gt;
&lt;br /&gt;
RPSlot是RPObject拥有的插槽，可以在其中放置其他RPObject（例如背包中的物品）&lt;br /&gt;
&lt;br /&gt;
RPObject修改插槽的方法是:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    public void addSlot(RPSlot slot)&lt;br /&gt;
    public RPSlot getSlot(String name)&lt;br /&gt;
    public void removeSlot(String name)&lt;br /&gt;
    public boolean hasSlot(String name)&lt;br /&gt;
    public Iterator slotIterator()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
以上方法用于将插槽添加到对象，对其进行检索，将其删除并测试该插槽是否存在。 最后，插槽迭代器用于访问对象中的所有插槽.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    public RPObject.ID getID()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
这是获取对象唯一ID的辅助方法.&lt;br /&gt;
&lt;br /&gt;
RPSlot的简单API:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    public void add(RPObject object)&lt;br /&gt;
    public RPObject get(RPObject.ID id)&lt;br /&gt;
    public boolean has(RPObject.ID id)&lt;br /&gt;
    public RPObject remove(RPObject.ID id)&lt;br /&gt;
    public void clear()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些方法修改RPSlot中的对象。 clear（）方法删除插槽中的所有对象.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
   public Iterator iterator()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
用于访问该插槽的所有对象.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  // 创建一个玩家RPClass的对象并设置一些属性值&lt;br /&gt;
  RPObject object = new RPObject(&amp;quot;player&amp;quot;);&lt;br /&gt;
  object.put(&amp;quot;name&amp;quot;, &amp;quot;example&amp;quot;);&lt;br /&gt;
  object.put(&amp;quot;score&amp;quot;, 0);&lt;br /&gt;
&lt;br /&gt;
  // 创建一个名为背包的插槽&lt;br /&gt;
  RPSlot slot = new RPSlot(&amp;quot;backpack&amp;quot;);&lt;br /&gt;
  object.addSlot(slot);&lt;br /&gt;
&lt;br /&gt;
  // 创建一个钱币RPClass的对象并且放入插槽&lt;br /&gt;
  RPObject coin = new RPObject(&amp;quot;coin&amp;quot;);&lt;br /&gt;
  slot.add(coin);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
现在来看最复杂的部分。 稍微有点疯狂！: IRPZone 和 IRPRuleProcessor 接口&lt;br /&gt;
&lt;br /&gt;
==RPWorld==&lt;br /&gt;
此类只是区域Zone的容器.&lt;br /&gt;
&lt;br /&gt;
RPWorld 提供了几种方法来简化RPZone的处理.&lt;br /&gt;
  &lt;br /&gt;
在服务器启动和完成时调用onInit和onFinish。 您需要将RPWorld子类化以使其具有适当的行为.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    public void onInit() throws Exception&lt;br /&gt;
    public void onFinish() throws Exception&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一些添加区域并对其进行迭代的辅助方法.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    public void addRPZone(IRPZone zone)&lt;br /&gt;
    public IRPZone getRPZone(IRPZone.ID zoneid)&lt;br /&gt;
    public IRPZone getRPZone(RPObject.ID objectid)&lt;br /&gt;
    public Iterator&amp;lt;IRPZone&amp;gt; iterator()&lt;br /&gt;
    public int size()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
添加，获取，测试存在，删除和修改对象的方法。 modify() 采用delta ^ 2算法.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    public void add(RPObject object) throws NoRPZoneException, RPObjectInvalidException  &lt;br /&gt;
    public RPObject get(RPObject.ID id) throws NoRPZoneException, RPObjectInvalidException  &lt;br /&gt;
    public boolean has(RPObject.ID id) throws NoRPZoneException, RPObjectInvalidException  &lt;br /&gt;
    public RPObject remove(RPObject.ID id) throws NoRPZoneException, RPObjectNotFoundException  &lt;br /&gt;
    public void modify(RPObject object) throws NoRPZoneException  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这些是用于更改对象区域的辅助方法。 用它们代替手工操作.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
    public void changeZone(IRPZone.ID oldzoneid, IRPZone.ID newzoneid, RPObject object) throws NoRPZoneException&lt;br /&gt;
    public void changeZone(String oldzone, String newzone, RPObject object) throws NoRPZoneException&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==IRPZone==&lt;br /&gt;
IRPZone是处理世界内容和感知的接口。 在大多数情况下，您应该使用实现MarauroaRPZone并将其扩展.&lt;br /&gt;
&lt;br /&gt;
这些方法是:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  /** This method is called when the zone is created to populate it */&lt;br /&gt;
  public void onInit() throws Exception;&lt;br /&gt;
&lt;br /&gt;
  /** This method is called when the server finish to save the content of the zone */&lt;br /&gt;
  public void onFinish() throws Exception;&lt;br /&gt;
&lt;br /&gt;
  /** This method adds an object to the Zone */&lt;br /&gt;
  public void add(RPObject object) throws RPObjectInvalidException;&lt;br /&gt;
&lt;br /&gt;
  /** This method tag an object of the Zone as modified */&lt;br /&gt;
  public void modify(RPObject object) throws RPObjectInvalidException;&lt;br /&gt;
&lt;br /&gt;
  /** This method removed an object of the Zone and return it.*/&lt;br /&gt;
  public RPObject remove(RPObject.ID id) throws RPObjectNotFoundException;&lt;br /&gt;
&lt;br /&gt;
  /** This method returns an object of the Zone */&lt;br /&gt;
  public RPObject get(RPObject.ID id) throws RPObjectNotFoundException;&lt;br /&gt;
&lt;br /&gt;
  /** This method returns true if the object exists in the Zone */&lt;br /&gt;
  public boolean has(RPObject.ID id);&lt;br /&gt;
&lt;br /&gt;
  /** This method create a new RPObject with a valid id */&lt;br /&gt;
  public RPObject create();&lt;br /&gt;
&lt;br /&gt;
  /** Iterates over the elements of the zone */&lt;br /&gt;
  public Iterator iterator();&lt;br /&gt;
&lt;br /&gt;
  /** Returns the number of elements of the zone */&lt;br /&gt;
  public long size();&lt;br /&gt;
&lt;br /&gt;
  /** This method return the perception of a zone for a player */&lt;br /&gt;
  public Perception getPerception(RPObject.ID id, byte type);&lt;br /&gt;
&lt;br /&gt;
  /** This method is called to take zone to the next turn */&lt;br /&gt;
  public void nextTurn();&lt;br /&gt;
&lt;br /&gt;
  /** Method to create the map to send to player&amp;#039;s client */&lt;br /&gt;
  public java.util.List buildMapObjectsList(RPObject.ID id);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在大多数情况下，您希望修改的只是:&lt;br /&gt;
* onInit&lt;br /&gt;
* onFinish&lt;br /&gt;
* buildMapObjectsList&lt;br /&gt;
&lt;br /&gt;
==IRPRuleProcessor==&lt;br /&gt;
此类必须完全实现，但与IRPZone :)相比，它是一个儿童玩具。 这是您编写所有游戏规则的地方.&amp;lt;br&amp;gt;&lt;br /&gt;
API如下:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
  /** Set the context where the actions are executed.&lt;br /&gt;
   *  @param zone The zone where actions happens.  */&lt;br /&gt;
  public void setContext(IRPZone zone);&lt;br /&gt;
&lt;br /&gt;
  /** Pass the whole list of actions so that it can approve or deny the actions in it.&lt;br /&gt;
   *  @param id the id of the object owner of the actions.&lt;br /&gt;
   *  @param actionList the list of actions that the player wants to execute. */&lt;br /&gt;
  public void approvedActions(RPObject.ID id, RPActionList actionList);&lt;br /&gt;
&lt;br /&gt;
  /** Execute an action in the name of a player.&lt;br /&gt;
   *  @param id the id of the object owner of the actions.&lt;br /&gt;
   *  @param action the action to execute&lt;br /&gt;
   *  @return the action status, that can be Success, Fail or incomplete, please&lt;br /&gt;
   *      refer to Actions Explained for more info. */&lt;br /&gt;
  public RPAction.Status execute(RPObject.ID id, RPAction action);&lt;br /&gt;
&lt;br /&gt;
  /** Notify it when a new turn happens */&lt;br /&gt;
  public void nextTurn();&lt;br /&gt;
&lt;br /&gt;
  /** Callback method called when a new player enters in the game&lt;br /&gt;
   *  @param object the new player that enters in the game. */&lt;br /&gt;
  public boolean onInit(RPObject object) throws RPObjectInvalidException;&lt;br /&gt;
&lt;br /&gt;
  /** Callback method called when a new player exits the game&lt;br /&gt;
   *  @param id the new player id that exits the game.&lt;br /&gt;
   *  @return true to update the player on database. */&lt;br /&gt;
  public boolean onExit(RPObject.ID id) throws RPObjectNotFoundException;&lt;br /&gt;
&lt;br /&gt;
  /** Callback method called when a new player time out&lt;br /&gt;
   *  @param id the new player id that timeouts. */&lt;br /&gt;
  public boolean onTimeout(RPObject.ID id) throws RPObjectNotFoundException;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Marauroa]]&lt;br /&gt;
{{#breadcrumbs: [[Marauroa]] | [[Navigation for Marauroa Users|Using]] | [[Marauroa Core API|Core API]]}}&lt;/div&gt;</summary>
		<author><name>115.192.141.63</name></author>
	</entry>
</feed>