玩家


所有与Evennia建立游戏会话的游戏者(真实的个人)都是通过玩家对象执行动作的。玩家对象不代表游戏中的任何东西,只代表游戏者的帐户。为了真正进入游戏,玩家则必须操纵一个物体(通常是一个角色)。

它的工作方式取决于 MULTISESSION_MODE 的设置。共有三种会话模式,如下图所示:

会话-玩家-物体结构图

从左到右分别展示了 MULTISESSION_MODE 为 0、1和2的情况。在所有模式中,游戏者都是通过一个或多个会话连接到接入程序的,可以使用telnet、webclient、ssh或Evennia支持的其他协议。
  • 在模式0(左边)中,一个玩家在同一时间只能拥有一个会话。这是许多传统 mud 通常所使用的模式。
  • 在模式1(中间)中,一个玩家可以同时拥有任意数量的会话,但它们都被平等对待。这意味着在一个客户端上用命令做任何事情都和在其它客户端上做一模一样。所有会话都会看到相同的输出,如果执行 @quit 命令则会关闭所有的会话。
  • 在模式2(右边)中,一个玩家可以同时拥有任意数量的会话,它们是彼此分开的。这可以让一个玩家控制任意数量的角色和物体。

除了存储登录信息和其他与帐户有关的数据,玩家对象还可以在频道中聊天。这也是存储权限、配置选项等需要在不同游戏角色间保持一致的数据的好地方。玩家是类型类的实例,默认使用 settings.BASE_PLAYER_TYPECLASS 中设置的类型类,默认使用 settings.CMDSET_PLAYER 中设置的命令集

在默认的Evennia中,你可以使用@ooc命令脱离你当前的角色,进入脱离角色模式。在这种模式下你的行为受到很大限制,它工作起来基本上就像一个简单的聊天程序。它可以作为角色切换时的临时区域(如果你的游戏支持这个功能),或者作为角色删除后的安全模式。使用 @ic 可以尝试操纵一个角色。

请注意,玩家对象从所控制的角色取得的权限可以有所不同而且经常不同。通常来说,你应该将你的权限放在玩家这个级别上,这样就可以覆盖掉角色的权限设置(除非使用 @quell 命令)。


如何创建自己的玩家类型

通常你不会给新玩家提供多个不同的玩家类型类(但原则上你可以创建一个系统动态改变玩家的类型类)。

根据定义,Evennia中的玩家是一个Python类,其父类包括了 src.players.player.Player (如果你了解类型类就会知道,这个类型类是与 PlayerDB 数据库模型相连的)。在代码中,你还可以简单地从 ev.Player 来继承。

以下是如何用代码定义一个新的玩家类型类:
    from ev import Player
    class ConfigPlayer(Player):
        """
        使用一些配置创建一个玩家
        """
        at_player_creation(self):
            "这只会在玩家初次创建时被调用"
            self.db.real_name = None      # 这以后再设置
            self.db.real_address = None   #     "
            self.db.config_1 = True       # 默认设置
            self.db.config_2 = False      #     "
            self.db.config_3 = 1          #     "
            # ... 游戏需要设置的其他内容
在 game/gamesrc 中没有预先建立存放自定义玩家类型类的文件夹。你可以自己添加文件夹或将其存放在 gamesrc/objects 中(记住,如果添加了自己的文件夹,你需要添加一个空的 __init__.py 文件,这样才能从中导入该文件)。要更改新玩家所用的玩家类型类,可以设置 settings.py 文件中的 BASE_PLAYER_TYPECLASS。


玩家的属性

除了所有类型类对象都具有的属性(参见类型类),玩家还具有以下自定义属性:
  • user —— 与用户Django对象的一对一连接,代表已登录的用户。
  • obj —— character 属性的别名。
  • name —— user.username 属性的别名
  • sessions —— 保存了该玩家对象所监听的所有已连接会话(物理连接)的列表。会话id(在很多地方会使用到)可以在每个会话实例的 sessid 属性中找到。
  • is_superuser(布尔值:True/False) —— 该玩家是否是超级用户。

特殊处理程序:
  • cmdset —— 保存了当前玩家的所有命令。默认情况下是 settings.CMDSET_PLAYER 设定的命令集中的命令。
  • nicks —— 存储和处理昵称,与物体中 nicks 的工作方式相同。对于玩家,nicks 主要用来存储自定义的频道别名。

部分特殊方法(更多信息请参见 src.player.models):
  • get_puppet —— 获取玩家当前操纵的物体及会话id(如果有的话)。
  • puppet_object —— 将会话与可操纵的对象连接起来。
  • unpuppet_object —— 断开会话与可操纵对象的连接。
  • msg —— 向玩家发送文本信息。
  • execute_cmd —— 像玩家自己执行一样执行一条命令。
  • search —— 搜索玩家。


(原文:https://github.com/evennia/evennia/wiki/Players    翻译:卢铱俊)