enginefuncs_t 结构体中的函数

就是常见的 g_engfuncs 中的函数。AMXX 里就是 fakemeta 的 EngFunc_**

// 这些函数由引擎提供给EXTDLL使用。mp.dll hl.dll 。。。
typedef struct enginefuncs_s
{
    /**
     *  预缓存模型文件,可以是:BSP文件、MDL文件、SPR文件。若要缓存一个没有缓存过的模型文件,必须在 CWorld::Spawn 函数(AMXX 则是 plugin_precache 函数)中使用。
     *  如果缓存一个已经缓存过的模型文件,此函数直接返回该模型的文件的索引。
     *  如果在非 CWorld::Spawn 函数中缓存一个没有缓存过的模型文件,将产生 Host Error 错误,导致服务器关闭。
     *  
     *  @参数 filename 欲缓存的模型文件路径。由于该字符串指针会被引擎直接保存,所以必须使用 pfnSzFromIndex 函数的返回值以保证字符串指针安全。
     *  @返回值 成功返回模型文件索引,失败将产生 Host Error 错误,返回 0
     *
    **/
    int            ( *pfnPrecacheModel )            ( const char *filename );

    /**
     *  预缓存声音文件,必须是WAV文件。若要缓存一个没有缓存过的声音文件,必须在 CWorld::Spawn 函数(AMXX 则是 plugin_precache 函数)中使用。
     *  如果缓存一个已经缓存过的声音文件,此函数直接返回该声音的文件的索引。
     *  如果在非 CWorld::Spawn 函数中缓存一个没有缓存过的声音文件,将产生 Host Error 错误,导致服务器关闭。
     *  
     *  @参数 filename 欲缓存的声音文件路径。由于该字符串指针会被引擎直接保存,所以必须使用 pfnSzFromIndex 函数的返回值以保证字符串指针安全。
     *  @返回值 成功返回模型文件索引,失败将产生 Host Error 错误,返回 0
     *
    **/
    int            ( *pfnPrecacheSound )            ( const char *filename );

    /**
     *  为实体设置模型文件,可以是:BSP文件、MDL文件、SPR文件。
     *  该函数将会改变以下变量:
     *      entity->v.model
     *      entity->v.modelindex
     *  并在内部调用了 pfnSetSize 函数。
     *  
     *  @参数 entity 欲设置模型的实体。
     *  @参数 filename 欲使用的模型文件路径。必须使用 pfnSzFromIndex 函数的返回值。该模型文件必须已经缓存。
     *
    **/
    void        ( *pfnSetModel )                ( edict_t *entity, const char *filename );

    /**
     *  返回指定模型文件的索引
     *  
     *  @参数 filename 欲取索引的模型文件路径。该字符串指针仅用于查询,可以使用临时指针。
     *  @返回值 成功返回该模型文件的索引,若该模型文件没有被缓存,将产生 Fatal Error 错误。
     * 
    **/
    int            ( *pfnModelIndex )                ( const char *filename );

    /**
     *  返回指定模型文件的帧数,通常指SPR文件的帧数。该函数也可以返回MDL文件的帧数(所有bodypart的submodel数量的乘积)。
     * 
     *  @参数 modelIndex 模型文件索引。该参数必须为 pfnPrecacheModel 函数或者 pfnModelIndex 函数的返回值。
     *  @返回值 成功返回该模型的帧数,失败返回1。
     * 
    **/
    int            ( *pfnModelFrames )                ( int modelIndex );

    /**
     *  设置实体包围盒大小。该包围盒用于:重力效果、碰撞检测、Trace函数检测。max必须大于min,否则将产生 Host Error 错误。
     *  
     *  @参数 min 指向 float[3] 数组的指针。包围盒的min端。
     *  @参数 max 指向 float[3] 数组的指针。包围盒的max端。
     *  
    **/
    void        ( *pfnSetSize )                    ( edict_t *entity, const float *min, const float *max );

    /**
     *  载入指定地图,销毁当前地图所有数据。当前所有在线的玩家(BOT除外)将会重新连接至服务器。
     *  
     *  @参数 levelname 欲载入的地图名称。例如:de_dust2 对应 maps/de_dust2.bsp ..
     *  @参数 startspot 仅用于单人模式。指定起点名称,用于加载单人模式下的任务相关实体或者实体数据保存于恢复,参考 CBaseEntity::Save CBaseEntity::Restore。
     *                  多人模式下该参数必须为NULL。
     *  
     *  @注意 如果 startspot 参数为 NULL 则相当于调用控制台命令 changelevel 如果 startspot 参数不为 NULL 则相当于调用控制台命令 changelevel2
     *  
    **/
    void        ( *pfnChangeLevel )                ( const char *levelname, const char *startspot );

    /**
     *  该函数无任何实际作用。
    **/
    void        ( *pfnGetSpawnParms )            ( edict_t *entity );

    /**
     *  该函数无任何实际作用。
    **/
    void        ( *pfnSaveSpawnParms )            ( edict_t *entity );

    /**
     *  该函数将指定三维向量转换为三维笛卡尔坐标系中的朝向角度,并返回其中的YAW角(偏航角)
     *  
     *  @参数 vector 指向 float[3] 数组的指针。欲转换的三维向量。
     *  @返回值 YAW角度。
     *  
     *  @注意 HL引擎中的向量以Z轴向上。角度单位为:角度
     *  
    **/
    float        ( *pfnVecToYaw )                ( const float *vector );

    /**
     *  该函数将指定三维向量转换为三维笛卡尔坐标系中的朝向角度。
     *  
     *  @参数 vector 指向 float[3] 数组的指针。欲转换的三维向量。
     *  @参数 angles 指向 float[3] 数组的指针。用于存放转换得到的朝向角度。成员排序为:{ PITCH(俯仰角),YAW(偏航角),ROLL(翻滚角)}
     *  
     *  @注意 HL引擎中的向量以Z轴向上。角度单位为:角度
     *  
    **/
    void        ( *pfnVecToAngles )                ( const float *vector, float *angles );

    /**
     *  该函数将实体移动到指定坐标处,如果移动方向中存在障碍物,将会停在障碍物处。
     *  仅包含以下标志的实体有效:FL_FLY、FL_SWIM、FL_ONGROUND
     *  
     *  @参数 entity 欲移动的实体。
     *  @参数 goal 指向 float[3] 数组的指针。终点坐标。
     *  @参数 dist 该参数限制移动距离。如果该距离小于实体到终点的距离,实体将不会到达终点(在移动方向中途停下)
     *  @参数 movetype 移动方式。可选值有:WALKMOVE_NORMAL、WALKMOVE_WORLDONLY、WALKMOVE_CHECKONLY。
     *                 该参数为 WALKMOVE_NORMAL 时函数将 entity->v.ideal_yaw 作为移动方向,如果该方向不能到达终点,函数将自动计算出合适的方向。
     *  
     *  @注意 对于移动模式,该函数实际上只处理了 WALKMOVE_NORMAL 其它值均未做特殊处理。
    **/
    void        ( *pfnMoveToOrigin )            ( edict_t *entity, const float *goal, float dist, int movetype );

    /**
     *  该函数按照 entity->v.yaw_speed 指定的步长将 entity->v.angles[1] 逐渐更新至 entity->v.ideal_yaw 指定的角度。
     *  
     *  @参数 entity 欲更新的实体。
     *  @注意 每次只更新指定步长。
     *  
    **/
    void        ( *pfnChangeYaw )                ( edict_t *entity );

    /**
     *  该函数按照 entity->v.pitch_speed 指定的步长将 entity->v.angles[0] 逐渐更新至 entity->v.idealpitch 指定的角度。
     *  
     *  @参数 entity 欲更新的实体。
     *  @注意 每次只更新指定步长。
     *  
    **/
    void        ( *pfnChangePitch )                ( edict_t *entity );

    /**
     *  根据实体中的字符串变量查找实体,可选的变量有:"classname"、"model"、"viewmodel"、"weaponmodel"、"netname"、"target"、"targetname"、"message"、"noise"
     *  "noise1"、"noise2"、"noise3"、"globalname"。均为 entity->v (即 pev)中的字符串变量。
     *  
     *  @参数 pEdictStartSearchAfter 指定一个实体,查找将会从该实体开始向后查找。如果该参数为 NULL 将从 0号 实体(即 worldspawn)开始查找。
     *  @参数 pszField 欲查找的变量名称。例如:"classname"。
     *  @参数 pszValue 想查找的字符串。内部使用 strcmp 函数进行对比,大小写敏感。
     *  @返回值 若查询到匹配的实体则返回该实体的指针,如果没有找到任何匹配的实体将返回 0号 实体的指针。如果 pszField 参数无效或者 pszValue 为 NULL 将直接返回 NULL
     *  
     *  @注意 该函数每次只能返回一个实体,如需查找批量的实体,需要将查找到的实体传入 pEdictStartSearchAfter 参数再次调用该函数,如此循环直到返回 0号 实体(即 worldspawn)。
     *  
    **/
    edict_t *    ( *pfnFindEntityByString )        ( edict_t *pEdictStartSearchAfter, const char *pszField, const char *pszValue );

    /**
     *  返回指定实体的渲染参数。
     *  
     *  @参数 entity 欲取参数的实体。
     *  @返回值 对于玩家实体直接返回 entity->v.light_level 其它实体永远返回 128
     *  
    **/
    int            ( *pfnGetEntityIllum )            ( edict_t *entity );

    /**
     *  查找指定中心点的指定球形半径内的实体。内部使用 entity->v.absmin 和 entity->v.absmax 变量进行对比。
     *  
     *  @参数 pEdictStartSearchAfter 指定一个实体,查找将会从该实体开始向后查找。如果该参数为 NULL 将从 0号 实体(即 worldspawn)开始查找。
     *  @参数 origin 指定查找的中心点。
     *  @参数 radius 指定查找的半径长度。
     *  @返回值 若查询到匹配的实体则返回该实体的指针,如果没有找到任何实体将返回 0号 实体的指针(即 worldspawn)。
     *  
     *  @注意 该函数会忽略 classname 为空的实体。
     *  
    **/
    edict_t *    ( *pfnFindEntityInSphere )        ( edict_t *pEdictStartSearchAfter, const float *origin, float radius );

    /**
     *  查找指定实体的PVS(可视范围)内的玩家。以 entity->v.origin + entity->v.view_ofs 作为原点。
     *  
     *  @参数 entity 指定一个实体,返回该实体PVS内的玩家。
     *  @返回值 如果找到玩家返回玩家实体的指针,如未找到则返回 0号 实体的指针。
     *
     *  @注意 如果需要查找出所有在范围内的玩家,循环调用该函数直到返回 0号 实体即可。
     *  
    **/
    edict_t *    ( *pfnFindClientInPVS )            ( edict_t *entity );

    /**
     *  查找指定实体的PVS(可视范围)内的实体。以 entity->v.origin + entity->v.view_ofs 作为原点。
     *  
     *  @参数 pplayer 指定一个实体,返回该实体PVS内的所有实体。
     *  @返回值 返回查找结果第一个实体,以链表方式遍历该实体的 entity->v.chain 变量即可获得所有查找到的实体。如果没有查找到任何实体,返回 0号 实体的指针。
     *  
     *  @注意 虽然参数名是 pplayer 但是传入一个非玩家实体也没问题。
     *  
    **/
    edict_t *    ( *pfnEntitiesInPVS )            ( edict_t *pplayer );

    /**
     *  将相对于指定朝向角度的 前、右、上 3个角度转换为对应的3个三维向量。
     *  结果存储到 gpGlobals->v_forward、gpGlobals->v_right、gpGlobals->v_up 变量中。
     *  
     *  @参数 angles 欲转换的朝向角度
     *  @返回值 结果存储在 gpGlobals->v_**** 变量中
     *  
     *  @注意 HL引擎中的向量以Z轴向上。角度单位为:角度
     *  
    **/
    void        ( *pfnMakeVectors )                ( const float *angles );

    /**
     *  将相对于指定朝向角度的 前、右、上 3个角度转换为对应的3个三维向量。
     *  
     *  @参数 angles 指向 float[3] 数组的指针。欲转换的朝向角度。
     *  @参数 forward 指向 float[3] 数组的指针。返回朝向 前 的向量。
     *  @参数 right 指向 float[3] 数组的指针。返回朝向 右 的向量。
     *  @参数 up 指向 float[3] 数组的指针。返回朝向 上 的向量。
     *  
     *  @注意 HL引擎中的向量以Z轴向上。角度单位为:角度
     * 
    **/
    void        ( *pfnAngleVectors )            ( const float *angles, float forward, float *right, float *up );

    /**
     *  创建一个空的实体,该实体需要 绑定class 后才能使用。(即 entity->pvPrivateData 为 NULL)
     *
     *  @返回值 成功返回新实体的指针,失败将产生 Fatal Error 错误。
     *  
    **/
    edict_t *    ( *pfnCreateEntity )            ( void );

    /**
     *  删除一个实体。该函数销毁实体所有数据,并将 entity->free 设为 true,将 entity->serialnumber 递增,将 entity->freetime 设为当前时间。
     *  
     *  @参数 entity 欲删除的实体。
     *
     *  @注意 实体删除后指针依旧有效,但请不要修改它的数据。
     *  
    **/
    void        ( *pfnRemoveEntity )            ( edict_t *entity );

    /**
     *  创建指定类名的实体,该实体必须已经通过 LINK_ENTITY_TO_CLASS 宏链接到一个有效的class
     *  
     *  @参数 classname 欲创建的实体的类名。该参数必须是 pfnAllocString 函数的返回值。
     *  @返回值 成功返回新实体的指针,失败返回NULL
     *  
     *  @注意 该函数内部自动为 entity->v.classname 赋值。
     *  
    **/
    edict_t *    ( *pfnCreateNamedEntity )        ( int classname );

    /**
     *  将一个实体转换为客户端的静态实体,然后删除该实体。客户端静态实体将永远不会消失直到载入地图。
     *  
     *  @参数 entity 欲转换的实体
     *  
     *  @注意 该函数已废弃
     *  
    **/
    void        ( *pfnMakeStatic )            ( edict_t *entity );

    /**
     *  检查指定实体是否落在地上或者其它实体上。
     *  
     *  @参数 entity 欲检查的实体。
     *  @返回值 如果落在地上或者其它实体上,返回1否则返回0
     * 
    **/
    int            ( *pfnEntIsOnFloor )        ( edict_t *entity );

    /**
     *  将实体向下移动到一个可停留的平面上(地上或者其它实体上),最大移动距离为 256.0
     *  
     *  @参数 entity 欲操作的实体。
     *  @返回值 成功返回1否则返回0
     *  
    **/
    int            ( *pfnDropToFloor )            ( edict_t *entity );

    /**
     *  将实体往指定方向移动一段距离。类似玩家走路,水平移动。
     *  
     *  @参数 entity 欲移动的实体
     *  @参数 yaw 移动方向
     *  @参数 dist 移动距离
     *  @参数 mode 移动方式。可选值:WALKMOVE_NORMAL、WALKMOVE_WORLDONLY、WALKMOVE_CHECKONLY。
     *              当值为 WALKMOVE_CHECKONLY 时仅检查是否能移动,不实际移动实体。
     *  @返回值 移动成功或可以移动返回1,失败或无法移动返回0
     *  
     *  @注意 WALKMOVE_NORMAL 与 WALKMOVE_WORLDONLY 效果一致。
     *  
    **/
    int            ( *pfnWalkMove )            ( edict_t *entity, float yaw, float dist, int mode );

    /**
     *  为实体设置新坐标。无视任何障碍物,谨慎使用。
     *  
     *  @参数 entity 欲操作的实体。
     *  @参数 origin 新的坐标
     *  
     *  @注意 该函数强制刷新实体链表,需要立即更新实体链表的时候可以使用该函数。
     *  
    **/
    void        ( *pfnSetOrigin )            ( edict_t *entity, const float *origin );

    /**
     *  在指定实体处播放一个声音。
     *  
     *  @参数 entity 指定一个实体,在该实体的坐标处播放声音。如果实体位置被改变,声音位置也会跟着改变。指定为 0号 实体则不使用该参数。
     *  @参数 channel 指定音频在哪个通道播放,可选值:
     *           CHAN_AUTO <-- 自动选择一个空闲的通道
     *           CHAN_WEAPON <-- 用于播放武器的声音
     *           CHAN_VOICE <-- 用于播放说话声音,例如NPC说话,该通道可以控制模型嘴巴的形状
     *           CHAN_ITEM <-- 用于播放操作物品的声音,例如使用某样道具,或者按下开关
     *           CHAN_BODY <-- 用于播放身体产生的声音,例如游泳时的划水声
     *           CHAN_STREAM <-- 用于播放超长的声音(超大的声音文件)
     *           CHAN_STATIC <-- 用于播放可以重叠多次的声音,例如地图实体的背景音乐
     *  @参数 sample 欲播放的声音文件。
     *  @参数 volume 音量,取值范围 0.0~1.0
     *  @参数 attenuation 距离音量衰减。默认请使用 ATTN_NORM,如果该参数为 0 则全地图都能听到该声音(因为没有了衰减)。
     *  @参数 flags 操作标志。可选值:
     *           SND_STOP <-- 立即停止该声音
     *           SND_CHANGE_VOL <-- 改变该声音的音量
     *           SND_CHANGE_PITCH <-- 改变该声音的音调
     *  @参数 pitch 音调。效果类似变声器。默认请使用 PITCH_NORM
    **/
    void        ( *pfnEmitSound )            ( edict_t *entity, int channel, const char *sample, float volume, float attenuation, int flags, int pitch );

    /**
     *  使用 CHAN_STATIC 通道在指定位置播放一个声音,通常用于播放地图背景音乐。
     *  
     *  @参数 entity 指定一个实体,在该实体的坐标处播放声音。如果实体位置被改变,声音位置也会跟着改变。指定为 0号 实体则不使用该参数。
     *  @参数 pos 指定一个坐标,在该坐标处播放声音。与 entity 参数互不兼容,但 entity 优先。
     *  
     *  @注意 其它参数与 pfnEmitSound 函数相同。
     *  
    **/
    void        ( *pfnEmitAmbientSound )    ( edict_t *entity, float *pos, const char *sample, float volume, float attenuation, int flags, int pitch );

    /**
     *  模拟一条线段从指定的起始位置通向结束位置进行测试,返回测试结果。
     *  
     *  @参数 start 指向 float[3] 数组的指针。线段的起始位置
     *  @参数 end 指向 float[3] 数组的指针。线段的结束位置
     *  @参数 fNoMonsters 是否忽略带有 FL_MONSTER 标志的实体。可选值:0、1、2
     *  @参数 pentToSkip 指定一个实体,该实体将被线段忽略(如果线段可以碰到该实体)。如果需要忽略多个实体,请使用 entity->v.groupinfo
     *  @参数 ptr 返回线段测试结果,详细请参考 TraceResult 结构体
     *  
     *  @注意 该函数还会将测试结果保存到 gpGlobals->trace_**** 变量
     *  
    **/
    void        ( *pfnTraceLine )            ( const float *start, const float *end, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr );

    /**
     *  该函数用于飞行物测试,例如投掷出去的手雷、发射出去的导弹等。内部使用 pfnTraceLine 进行测试,返回前进方向上的测试结果。
     *  
     *  @参数 entity 欲进行测试的实体
     *  @参数 pentToIgnore 指定一个实体,该实体将被测试函数忽略
     *  @参数 ptr 返回线段测试结果,详细请参考 TraceResult 结构体
     *  
    **/
    void        ( *pfnTraceToss )            ( edict_t *entity, edict_t *pentToIgnore, TraceResult *ptr );

    /**
     *  模拟一个BOX(盒子)从指定的起始位置移动到结束位置,测试途中是否与其它实体发生碰撞,返回测试结果。
     *  
     *  @参数 entity 指定一个实体,使用该实体的包围盒作为测试的盒子进行测试。(即 entity->v.mins、entity->v.maxs)
     *  @返回值 如果BOX与其它实体发生碰撞,返回1,否则返回0
     *  
     *  @注意 其它参数与 pfnTraceLine 函数相同。
     *  
    **/
    int            ( *pfnTraceMonsterHull )    ( edict_t *entity, const float *start, const float *end, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr );

    /**
     *  模拟一个BOX(盒子)从指定的起始位置移动到结束位置,测试途中是否与其它实体发生碰撞,返回测试结果。
     *  
     *  @参数 hullNumber 要使用的盒子,可取值:0~3,引擎预设的盒子,定义如下:
     *                   vec3_t hullmin[4] = 
     *                   {
     *                       { 0, 0, 0 },        // <-- 盒子体积为0,测试结果将与 pfnTraceLine 函数一致。
     *                       { -16, -16, -16 },  // <-- 大概是头部的大小
     *                       { -32, -32, -32 },  // <-- 两个头部的大小
     *                       { -16, -16, -18 },  // <-- HL中的小型怪物的大小
     *                   };
     *                   vec3_t hullmax[4] = 
     *                   {
     *                       { 0, 0, 0 },
     *                       { 16, 16, 16 },
     *                       { 32, 32, 32 },
     *                       { 16, 16, 18 },
     *                   };
     *  
     *  @注意 其它参数与 pfnTraceLine 函数相同。
     * 
    **/
    void        ( *pfnTraceHull )            ( const float *start, const float *end, int fNoMonsters, int hullNumber, edict_t *pentToSkip, TraceResult *ptr );

    /**
     *  该函数与 pfnTraceHull 函数类似,但只测试是否与指定的实体发生碰撞。
     *  
     *  @参数 entity 指定一个实体,用于与盒子作碰撞测试。
     *  
     *  @注意 其它参数与 pfnTraceHull 函数相同。
     *  
    **/
    void        ( *pfnTraceModel )            ( const float *start, const float *end, int hullNumber, edict_t *entity, TraceResult *ptr );

    /**
     *  模拟一条线段从起始位置通往结束位置,如果线段与指定实体发生碰撞,返回碰撞的那个面的纹理名称。
     *  
     *  @参数 pTextureEntity 指定一个实体用于测试,该实体使用的模型必须是 mod_brush (即 BSP)。此参数一般传入BSP地图实体。
     *  @参数 start 指向 float[3] 数组的指针。线段的起点
     *  @参数 end 指向 float[3] 数组的指针。线段的终点
     *  @返回值 如果线段成功击中BSP模型面,返回该模型面的纹理名称。失败返回 NULL
     *  
    **/
    const char *( *pfnTraceTexture )        ( edict_t *pTextureEntity, const float *start, const float *end );

    /**
     *  模拟一个球体从起始位置移动到结束位置,如果该球体与其它实体发生碰撞,返回测试结果。
     *  @注意 该函数没有实现
    **/
    void        ( *pfnTraceSphere )            ( const float *start, const float *end, int fNoMonsters, float radius, edict_t *pentToSkip, TraceResult *ptr );

    /**
     *  获取瞄准方向的向量。函数内部从 gpGlobals->v_forward 读取瞄准方向,所以使用该函数之前先要调用 pfnMakeVectors 函数。
     *  
     *  @参数 entity 如果该参数是 NULL 或者 BOT实体,函数将会直接返回 gpGlobals->v_forward。如果该实体不是BOT实体,函数内部还会
     *               进一步使用 TraceLine 测试该方向。
     *  @参数 speed 该参数没有使用。
     *  @参数 vector 指向 float[3] 数组的指针。保存返回的向量。
     *  
    **/
    void        ( *pfnGetAimVector )        ( edict_t *entity, float speed, float *vector );

    /**
     *  执行服务端命令,例如 "map ...\n"
     *  
     *  @参数 str 要执行的命令,该字符串必须以 '\n' 或者 ';' 结尾。
     *  
     *  @注意 该函数仅将命令添加到缓冲区中,并不会立即执行命令。
     *  
    **/
    void        ( *pfnServerCommand )        ( char *str );

    /**
     *  立即执行缓冲区中的所有命令。
    **/
    void        ( *pfnServerExecute )        ( void );

    /**
     *  向指定的玩家发送控制台命令(BOT将不做任何处理),该函数发送的命令与玩家手动在客户端控制台输入命令效果相同。
     *  
     *  @参数 entity 目标玩家
     *  @参数 format 支持格式化参数
     *  
    **/
    void        ( *pfnClientCommand )        ( edict_t *entity, char *format, ... );

    /**
     *  该函数在指定位置产生粒子效果
     *  
     *  @参数 org 目标位置
     *  @参数 dir 粒子发射方向
     *  @参数 color 粒子颜色
     *  @参数 count 粒子数量
     *  
    **/
    void        ( *pfnParticleEffect )        ( const float *org, const float *dir, float color, float count );

    /**
     *  设置用于BSP中明亮度变化效果的控制参数,例如闪烁的街灯
     *  
     *  @参数 style 效果索引,最多64种效果。取值范围:0~63
     *  @参数 val 亮度控制参数,格式如下:
     *            'a'为最暗,'z'为最亮。如果要写闪烁效果,那么可以取值:"az",但是这样 暗->亮 切换太快,效果不明显,所以间隔加长一点:"aaaaaaaazzzzzzzz" 这样
     *            当地图中有纹理使用了该style(效果),那么该纹理就会 亮->暗->亮->暗->亮->暗 一直切换闪烁了。
     *  
     *  @注意 val 参数不可为NULL
     *  
    **/
    void        ( *pfnLightStyle )            ( int style, char *val );

    /**
     *  返回在 decals.wad 文件中指定名称的贴图的索引
     *  
     *  @参数 name 欲查找的贴图文件名
     *  @返回值 成功返回贴图索引,失败返回-1
     *  
    **/
    int            ( *pfnDecalIndex )            ( const char *name );

    /**
     *  返回指定坐标处的空间类型,例如:空气中、水中、墙里等
     *  
     *  @参数 origin 指向 float[3] 数组的指针。欲测试的坐标
     *  @返回值 返回以下值:
     *             CONTENTS_EMPTY    <-- 空气中
     *             CONTENTS_SOLID    <-- 墙体中
     *             CONTENTS_WATER    <-- 水中
     *             CONTENTS_SLIME    <-- 泥潭中
     *             ...
     *  
    **/
    int            ( *pfnPointContents )        ( const float *origin );

    /**
     *  开始编写一个消息,该函数必须与 pfnMessageEnd 函数配合使用。
     *  
     *  @参数 msg_dest 指定消息发送的目标,可取值:
     *                   MSG_BROADCAST      <-- 发送给所有玩家客户端,但不保证该消息的安全性,网络状况较差时玩家客户端可能不会收到此消息。
     *                   MSG_ONE            <-- 发送给 entity 参数指定的玩家客户端,保证消息的安全性。
     *                   MSG_ALL            <-- 发送给所有玩家客户端,保证消息的安全性。
     *                   MSG_INIT           <-- 把消息写入 signon 缓冲区中,当玩家客户端连接到服务器时,将收到此消息。
     *                   MSG_PVS            <-- 发送给以 origin 参数指定的坐标为原点的PVS(可视范围)内的所有玩家客户端,但不保证该消息的安全性。
     *                   MSG_PAS            <-- 发送给以 origin 参数指定的坐标为原点的PAS(可听范围)内的所有玩家客户端,但不保证该消息的安全性。
     *                   MSG_PVS_R          <-- 同 MSG_PVS 但保证消息的安全性。
     *                   MSG_PAS_R          <-- 同 MSG_PAS 但保证消息的安全性。
     *                   MSG_ONE_UNRELIABLE <-- 同 MSG_ONE 但不保证该消息的安全性。
     *                   MSG_SPEC           <-- 仅发送给 HLTV 客户端。
     *  @参数 msg_type 消息索引。必须是 pfnRegUserMsg 函数的返回值或者引擎内置的 SVC_**** 消息索引。
     *  @参数 origin 指向 float[3] 数组的指针。当参数 msg_dest 为 MSG_PVS、MSG_PAS、MSG_PVS_R、MSG_PAS_R 时必须传入有效值,其它情况可以传入 NULL。
     *  @参数 entity 指定接受消息的玩家实体。当参数 msg_dest 为 MSG_ONE、MSG_ONE_UNRELIABLE 时必须传入有效值,其它情况可以传入 NULL。
     *  
     *  @注意 必须在 ServerActivate 中编写 MSG_INIT 消息。
     *  
    **/
    void        ( *pfnMessageBegin )        ( int msg_dest, int msg_type, const float *origin, edict_t *entity );

    /**
     *  完成消息编写,该函数必须与 pfnMessageBegin 函数配合使用。
    **/
    void        ( *pfnMessageEnd )            ( void );

    /**
     *  在当前编写的消息中写入一个 BYTE 型参数。
     *  @参数 value 欲写入的值。取值范围:0~255
     *  @注意 参数大小:1字节
    **/
    void        ( *pfnWriteByte )            ( int value );

    /**
     *  在当前编写的消息中写入一个 CHAR 型参数。
     *  @参数 value 欲写入的值。取值范围:-127~127
     *  @注意 参数大小:1字节
    **/
    void        ( *pfnWriteChar )            ( int value );

    /**
     *  在当前编写的消息中写入一个 SHORT 型参数。
     *  @参数 value 欲写入的值。取值范围:-32768~32767
     *  @注意 参数大小:2字节
    **/
    void        ( *pfnWriteShort )            ( int value );

    /**
     *  在当前编写的消息中写入一个 LONG 型参数。
     *  @参数 value 欲写入的值。取值范围:-2147483648~2147483647
     *  @注意 参数大小:4字节
    **/
    void        ( *pfnWriteLong )            ( int value );

    /**
     *  在当前编写的消息中写入一个角度值参数。
     *  @参数 value 欲写入的角度值。
     *  @注意 参数大小:1字节
    **/
    void        ( *pfnWriteAngle )            ( float value );

    /**
     *  在当前编写的消息中写入一个坐标值参数。
     *  @参数 value 欲写入的坐标值。
     *  @注意 参数大小:2字节
    **/
    void        ( *pfnWriteCoord )            ( float value );

    /**
     *  在当前编写的消息中写入一个字符串参数。
     *  @参数 sz 欲写入的字符串。
     *  @注意 字符串必须以NULL结束。参数大小:strlen(sz) + 1
    **/
    void        ( *pfnWriteString )            ( const char *sz );

    /**
     *  在当前编写的消息中写入一个实体索引参数。
     *  @参数 index 欲写入的实体索引。
     *  @注意 参数大小:2字节
    **/
    void        ( *pfnWriteEntity )            ( int index );

    /**
     *  在引擎中注册指定的CVAR(控制台变量)
     *  
     *  @参数 pCvar 欲注册的CVAR。该指针不能为临时指针。
     *  
     *  @注意 参数指向的对象必须已经对其成员 cvar_t::name、string、flags 进行初始化。name 不能为 "" 或 NULL,string 不能为 NULL,flags必须初始化一个值。
     *  @注意 CVAR一旦被注册,必须使用 pfnCVarSetFloat 或者 pfnCVarSetString 来修改值。
     *  @注意 该函数会自动为CVAR加上 FCVAR_EXTDLL 标志。
     *  
     *  @示例1 cvar_t cv_trace = { "cv_trace", "0", FCVAR_SERVER };
     *         pfnCVarRegister( &cv_trace );
     *  
     *  @示例2 pfnCVarSetFloat( "cv_trace", 1.0f );
     *         pfnCVarSetString( "cv_trace", "2.0" );
     *  
     *  @示例3 if ( cv_trace.value > 0 ) { ... }
     *         if ( pfnCVarGetFloat( "cv_trace" ) > 0 ) { ... }
     *  
    **/
    void        ( *pfnCVarRegister )        ( cvar_t *pCvar );

    /**
     *  取指定CVAR的值,返回类型为 FLOAT 型。
     *  @参数 szVarName CVAR名称
    **/
    float        ( *pfnCVarGetFloat )        ( const char *szVarName );

    /**
     *  取指定CVAR的值,返回字符串形式值的。
     *  @参数 szVarName CVAR名称
    **/
    const char *( *pfnCVarGetString )        ( const char *szVarName );

    /**
     *  为指定的CVAR设置新的值
     *  @参数 szVarName 欲设置新值的CVAR
     *  @参数 flValue 欲设置的值
     *  
     *  @注意 设置完毕后会自动更新 cvar_t 中的 string 和 value 成员。
     *  
    **/
    void        ( *pfnCVarSetFloat )        ( const char *szVarName, float flValue );

    /**
     *  为指定的CVAR设置新的值
     *  @参数 szVarName 欲设置新值的CVAR
     *  @参数 szValue 欲设置的值。字符串形式

     *  @注意 设置完毕后会自动更新 cvar_t 中的 string 和 value 成员。
     *  
    **/
    void        ( *pfnCVarSetString )        ( const char *szVarName, const char *szValue );

    /**
     *  向控制台或日志文件中输出消息文本
     *  
     *  @参数 atype 输出选项,可选值:
     *               at_notice    <-- 输出到服务端控制台,文本自动加上 "NOTE" 前缀
     *               at_console   <-- 输出到服务端控制台
     *               at_aiconsole <-- 当调试级别≥2时才输出到控制台,通过CVAR "developer" 设置调试级别
     *               at_warning   <-- 输出到服务端控制台,文本自动加上 "WARNING" 前缀
     *               at_error     <-- 输出到服务端控制台,文本自动加上 "ERROR" 前缀
     *               at_logged    <-- 输出到日志文件,使用控制台命令 log 开启日志文件功能
     *  @参数 szFmt 欲输出的文本,支持格式化
     *  
    **/
    void        ( *pfnAlertMessage )        ( ALERT_TYPE atype, char *szFmt, ... );

    /**
     *  该函数没有实现
    **/
    void        ( *pfnEngineFprintf )        ( void *pfile, char *szFmt, ... );

    /**
     *  为指定实体分配 Private Data (私有数据)内存,用于 CBase**** 类实例,分配成功则把内存指针存入 pEdict->pvPrivateData 变量
     *  
     *  @参数 pEdict 欲为其分配内存的实体
     *  @参数 iSize 欲分配的内存大小
     *  @返回值 成功返回分配的内存地址,失败返回NULL
     *  
     *  @注意 函数内部自动调用 pfnFreeEntPrivateData 释放前一次分配的私有数据内存(如果有)
     *  
    **/
    void *        ( *pfnPvAllocEntPrivateData )    ( edict_t *pEdict, int iSize );

    /**
     *  返回指定实体的私有数据内存的指针,即 pEdict->pvPrivateData
     *  
     *  @参数 pEdict 欲取数据指针的实体
     *  @返回值  如果 pEdict 为 NULL 将直接返回 NULL ,否则返回 pEdict->pvPrivateData
     *  
    **/
    void *        ( *pfnPvEntPrivateData )    ( edict_t *pEdict );

    /**
     *  释放指定实体的私有数据内存(如果有)
     *  
     *  @参数 pEdict 欲释放其私有数据内存的实体
     *  
     *  @注意 内存释放前会调用 pfnOnFreeEntPrivateData 函数通知 GAMEDLL
     *  @注意 释放完毕后自动将 pEdict->pvPrivateData 设为 NULL
     *  
    **/
    void        ( *pfnFreeEntPrivateData )    ( edict_t *pEdict );

    /**
     *  返回引擎字符串池中指定索引处的字符串。该字符串可用于 pfnPrecacheModel、pfnEmitSound 等函数
     *  
     *  @参数 iString 字符串索引。该参数必须是 pfnAllocString 函数的返回值
     *  @返回值 返回指向字符串的指针
     *  
     *  @注意 如果字符串索引无效,将返回无效的字符串指针
     *  
    **/
    const char *( *pfnSzFromIndex )            ( int iString );

    /**
     *  将指定的字符串拷贝到引擎字符串池中,返回在字符串池中的索引。该索引可用于 pfnSzFromIndex、pfnCreateNamedEntity 等函数。
     *  
     *  @参数 szValue 欲拷贝到引擎字符串池中的字符串。必须以 NULL 结尾
     *  @返回值 返回在字符串池中的索引
     *  
    **/
    int            ( *pfnAllocString )            ( const char *szValue );

    /**
     * 该函数直接返回 &pEdict->v 并且不检查 pEdict 是否有效
    **/
    entvars_t * ( *pfnGetVarsOfEnt )        ( edict_t *pEdict );

    /**
     *  根据给定的偏移量返回服务端实体数组中的实体(注:所有实体都在引擎内部的一个大数组中)
     *  
     *  @参数 iEntOffset 实体偏移量。该偏移量以 BYTE 为单位计算。例如:0号实体与1号实体之间的偏移量为 sizeof( edict_t )
     *  @返回值 实体指针
     *  
    **/
    edict_t *    ( *pfnPEntityOfEntOffset )    ( int iEntOffset );

    /**
     *  返回实体在服务端实体数组中的偏移量(注:所有实体都在引擎内部的一个大数组中)
     *  
     *  @参数 pEdict 欲取偏移量的实体。
     *  @返回值 偏移量
     *  
    **/
    int            ( *pfnEntOffsetOfPEntity )    ( const edict_t *pEdict );

    /**
     *  返回实体在服务端实体数组中的索引(注:所有实体都在引擎内部的一个大数组中)
     *  
     *  @参数 pEdict 欲取索引的实体。该指针必须有效,否者将产生 Fatal Error 错误
     *  @返回值 实体索引
    **/
    int            ( *pfnIndexOfEdict )        ( const edict_t *pEdict );

    /**
     *  根据给定的索引返回服务端实体数组中的实体(注:所有实体都在引擎内部的一个大数组中)
     *  
     *  @参数 iEntIndex 目标实体的索引
     *  @返回值 实体指针
     *  
    **/
    edict_t *    ( *pfnPEntityOfEntIndex )    ( int iEntIndex );

    /**
     *  指定一个 entvars 指针,查找其对应的实体(edict_t)
     *  
     *  @参数 pvars 欲查找的entvars指针
     *  @返回值 成功返回实体指针,失败返回 NULL
    **/
    edict_t *    ( *pfnFindEntityByVars )    ( entvars_t *pvars );

    /**
     *  返回指定实体中 entity->v.modelindex 指定的模型文件的数据指针。
     *  
     *  @参数 entity 目标实体
     *  @返回值 如果 modelindex 指定了有效的模型文件索引则返回该模型文件的数据指针,否则返回 NULL。如果 entity 参数为 NULL 也将返回 NULL。
     *  
    **/
    void *        ( *pfnGetModelPtr )            ( edict_t *entity );

    /**
     *  注册一个指定名称的消息。该消息可以用 pfnMessageBegin 函数来发送给玩家客户端。
     *  
     *  @参数 name 指向以NULL结尾的字符串。消息名称。长度不能超过11个字符。
     *  @参数 size 指定该消息中包含的参数的总大小。参考 pfnWrite**** 系列函数。如果该消息参数大小不确定,可传入-1。该参数值不能大于192
     *  @返回值 成功返回该消息的索引,失败返回0
     *  
     *  @注意 最多只能注册 255 个消息
     *  
    **/
    int            ( *pfnRegUserMsg )            ( const char *name, int size );

    /**
     *  该函数未实现 
    **/
    void        ( *pfnAnimationAutomove )    ( edict_t *entity, float time );

    /**
     *  返回实体当前模型的指定关节的坐标和角度。模型由 entity->v.modelindex 指定
     *  
     *  @参数 entity 目标实体
     *  @参数 bone 关节索引。取值范围:0~127。根据当前实体使用的模型中的关节数量而定。
     *  @参数 origin 指向 float[3] 数组的指针。保存返回的坐标
     *  @参数 angles 指向 float[3] 数组的指针。保存返回的角度。该参数没有实现
     *  
     *  @注意 模型类型必须为 mod_studio (即 MDL模型文件)否则将导致程序崩溃
    **/
    void        ( *pfnGetBonePosition )        ( edict_t *entity, int bone, float *origin, float *angles );

    /**
     *  返回EXTDLL中导出函数的地址。用于单人模式存档功能。
     *  
     *  @参数 name 函数名
     *  @返回值 函数地址
     *  
    **/
    uint32        ( *pfnFunctionFromName )    ( const char *name );

    /**
     *  返回指定地址的EXTDLL导出函数的名称。用于单人模式存档功能。
     *  
     *  @参数 function 函数地址
     *  @返回值 函数名称
     *  
    **/
    const char *( *pfnNameForFunction )        ( uint32 function );

    /**
     *  向指定玩家客户端输出文本
     *  
     *  @参数 entity 目标玩家
     *  @参数 ptype 输出位置。可选值:
     *                  print_console  <-- 输出到控制台
     *                  print_chat     <-- 输出到控制台和左下角
     *                  print_center   <-- 输出到屏幕中央
     *  @参数 szMsg 欲输出的文本
     *  
    **/
    void        ( *pfnClientPrintf )        ( edict_t *entity, PRINT_TYPE ptype, const char *szMsg );

    /**
     *  向服务端控制台输出文本
     *  @参数 szMsg 欲输出的文本
    **/
    void        (*pfnServerPrint)            ( const char *szMsg );

    /**
     *  获取当前命令整行。在 ClientCommand 中使用
     *  @返回值 命令文本
    **/
    const char *( *pfnCmd_Args )            ( void ); 

    /**
     *  返回当前命令的某个参数。在 ClientCommand 中使用
     *  
     *  @参数 argc 参数索引。0为命令本身
     *  @返回值 参数字符串
    **/
    const char *( *pfnCmd_Argv )            ( int argc );

    /**
     *  返回当前命令的参数的数量。在 ClientCommand 中使用
     *  @返回值 参数数量
     *  
    **/
    int            ( *pfnCmd_Argc )            ( void );

    /**
     *  返回实体当前模型的指定附件的坐标和角度。模型由 entity->v.modelindex 指定
     *  
     *  @参数 entity 目标实体
     *  @参数 attachment 附件索引。取值范围:0~4。根据当前实体使用的模型中的附件数量而定。
     *  @参数 origin 指向 float[3] 数组的指针。保存返回的坐标
     *  @参数 angles 指向 float[3] 数组的指针。保存返回的角度。该参数没有实现
     *  
     *  @注意 模型类型必须为 mod_studio (即 MDL模型文件)否则将导致程序崩溃。
    **/
    void        ( *pfnGetAttachment )        ( const edict_t *entity, int attachment, float *origin, float *angles );

    /**
     *  初始化一个CRC32数据校检句柄。可用于检查一段数据的CRC值。
     *  @参数 pulCRC 指向 CRC32_t 的指针。校检句柄。
     *  
     *  @示例 CRC32_t cs;
     *        pfnCRC32_Init( &cs );
     *        pfnCRC32_ProcessBuffer( &cs, buff, size );
     *        ...
     *        cs = pfnCRC32_Final( cs );
     *        Print( "%X", cs );
    **/
    void        ( *pfnCRC32_Init )            ( CRC32_t *pulCRC );

    /**
     *  立即校检一段数据。
     *  
     *  @参数 pulCRC 校检句柄。
     *  @参数 p 指向欲校检的数据。
     *  @参数 len 欲校检的数据长度。
     *  
    **/
    void        ( *pfnCRC32_ProcessBuffer )    ( CRC32_t *pulCRC, void *p, int len );

    /**
     *  立即校检一个字节数据。
     *  
     *  @参数 pulCRC 校检句柄。
     *  @参数 ch 欲校检的字节。
     **  
    **/
    void        ( *pfnCRC32_ProcessByte )    ( CRC32_t *pulCRC, unsigned char ch );

    /**
     *  结束指定的CRC校检,得到最终校检值。
     *  
     *  @参数 pulCRC 校检句柄。
     *  @返回值  返回校检值。
     *  
    **/
    CRC32_t        ( *pfnCRC32_Final )            ( CRC32_t pulCRC );

    /**
     *  返回一个指定范围内的随机整数。
     *  
     *  @参数 low 最小值
     *  @参数 high 最大值
     *  @返回值 随机数
     *  
    **/
    int            ( *pfnRandomLong )            ( int low,  int high );

    /**
     *  返回一个指定范围内的随机浮点数。
     *  
     *  @参数 low 最小值
     *  @参数 high 最大值
     *  @返回值 随机数
     *  
    **/
    float        ( *pfnRandomFloat )            ( float low, float high );

    /**
     *  为玩家设置一摄像机实体。可理解为设置玩家“眼睛”的位置。眼睛的坐标由 entity->v.origin 决定,朝向由 entity->v.angles 决定。
     *  通常用于单人模式。例如出现某些怪物时,玩家的镜头会暂时切换到怪物附近以观察怪物。实际上是在怪物附近创建了一个实体并使用该函数将玩家视野设置为该实体。
     *  
     *  @参数 pClient 欲设置视野的玩家
     *  @参数 pViewent 视野实体
     *  
     *  @注意 该功能在 client.dll 中的 V_CalcRefdef 函数中实现
     *  
    **/
    void        ( *pfnSetView )                ( const edict_t *pClient, const edict_t *pViewent );

    /**
     *  @返回值 返回精确的系统环境时间
    **/
    float        ( *pfnTime )                    ( void );

    /**
     *  设置一个准星角度,客户端会在屏幕上绘制一个准星。
     *  
     *  @参数 pClient 目标玩家
     *  @参数 pitch 俯仰角
     *  @参数 yaw 偏航角
     *  
     *  @注意 角度单位:角度
     *  
    **/
    void        ( *pfnCrosshairAngle )        ( const edict_t *pClient, float pitch, float yaw );

    /**
     *  读取一个文件到内存中。
     *  
     *  @参数 filename 欲打开的文件名
     *  @参数 pLength 返回该文件的大小
     *  @返回值 成功返回指向文件数据的指针,失败返回NULL
     *  
     *  @注意 如果数据不再使用,必须调用 pfnFreeFile 函数释放内存。
     *  
     *  @示例 byte *data = pfnLoadFileForMe( "maps/de_dust.txt", &length );
     *        pfnFreeFile( data );
     *  
    **/
    byte *      ( *pfnLoadFileForMe )        ( char *filename, int *pLength );

    /**
     *  释放由 pfnLoadFileForMe 函数载入的文件
     *  @参数 buffer 数据指针。该参数必须为 pfnLoadFileForMe 函数的返回值。
     *  
    **/
    void        ( *pfnFreeFile )            ( void *buffer );

    /**
     *  用于单人模式。结束当前场景,使客户端断开连接。
     *  @参数 pszSectionName 当前场景名称
    **/
    void        ( *pfnEndSection )            ( const char *pszSectionName );

    /**
     *  比较两个文件的修改时间
     *  
     *  @参数 filename1 文件A
     *  @参数 filename2 文件B
     *  @返回值 如果文件A比较新返回1。如果文件B比较新返回-1。否则返回0
     *  
    **/
    int         ( *pfnCompareFileTime )        ( char *filename1, char *filename2, int *iCompare );

    /**
     *  获取MOD目录名,例如:"cstrike"、"valve"
     *  @参数 szGetGameDir 保存返回的目录名。该缓冲区大小必须足够容纳目录名。
    **/
    void        ( *pfnGetGameDir )            ( char *szGetGameDir );

    /**
     *  该函数功能与 pfnCVarRegister 函数相同,但不会为CVAR加上 FCVAR_EXTDLL 标志。
    **/
    void        ( *pfnCvar_RegisterVariable )    ( cvar_t *variable );

    /**
     *  使客户端播放音效的音量逐渐提高或者降低
     *  
     *  @参数 pEdict 目标玩家
     *  @参数 fadePercent 目标值。取值范围:0~100
     *  @参数 fadeOutSeconds 淡出时间
     *  @参数 holdTime 持续时间
     *  @参数 fadeInSeconds 淡入时间
     *  
     *  @注意 该函数已废弃
     *  
    **/
    void        ( *pfnFadeClientVolume )    ( const edict_t *pEdict, int fadePercent, int fadeOutSeconds, int holdTime, int fadeInSeconds );

    /**
     *  设置指定玩家最大移动速度。
     *  
     *  @参数 pEdict 目标玩家。
     *  @参数 fNewMaxspeed 最大移动速度。
     *  
     *  @注意 该函数修改 pEdict->v.maxspeed 变量。
     *  
    **/
    void        ( *pfnSetClientMaxspeed )    ( const edict_t *pEdict, float fNewMaxspeed );

    /**
     *  创建一个虚拟玩家客户端,即BOT
     *  
     *  @参数 netname 玩家名字
     *  @返回值 成功返回实体指针,失败返回NULL
     *  
     *  @注意 该函数返回的实体也许并没有绑定到一个class(即 entity->pvPrivateData 为 NULL)需要自己检查并绑定
    **/
    edict_t *    ( *pfnCreateFakeClient )    ( const char *netname );

    /**
     *  运行 Player Move 处理程序(即玩家移动处理)该函数用于控制 BOT 的行动
     *  
     *  @参数 fakeclient 目标 BOT 玩家实体
     *  @参数 viewangles 模拟玩家视角
     *  @参数 forwardmove 模拟前/后移动速度。正数向前负数向后
     *  @参数 sidemove 模拟左/右移动速度。正数向右负数向左
     *  @参数 upmove 模拟上/下移动速度。正数向上负数向下
     *  @参数 buttons 模拟玩家按下的按钮。例如 IN_FORWARD IN_RELOAD IN_USE 等等
     *  @参数 impulse 模拟玩家信号。例如喷涂功能
     *  @参数 msec 距上次调用本函数的时间。单位为毫秒。如果时间超过255毫秒必须限制为255毫秒。
     *  
    **/
    void        ( *pfnRunPlayerMove )        (edict_t *fakeclient, const float *viewangles, float forwardmove, float sidemove, float upmove, unsigned short buttons, byte impulse, byte msec );

    /**
     *  返回当前服务器中实体的数量
    **/
    int            ( *pfnNumberOfEntities )    ( void );

    /**
     *  返回指定玩家的 userinfo 缓冲区。该缓冲区保存一个字符串。与客户端保持同步。
     *  缓存区中的数据格式为 Key\Value 格式。例如一个包含2个Key的缓冲区:"name\Erika\model\erika_lod3"
     *  缓冲区中的数据可以用 pfnSetKeyValue 或 pfnSetClientKeyValue 来修改。
     *  
     *  @参数 pEdict 目标玩家实体。如果传入有效的玩家实体,返回该玩家的 userinfo 缓冲区。该缓冲区中储存了一些玩家信息。例如玩家名称。
     *               如果传入NULL,返回 localinfo 缓冲区。该缓冲区中储存了一些MOD有关的信息。
     *               如果传入0号实体,返回 serverinfo 缓冲区。该缓冲区中储存了一些服务器有关的信息。
     *               如果传入其它类型实体,将返回 ""
     *  @返回值 返回指向缓冲区的指针。
     *  
    **/
    const char *( *pfnGetInfoKeyBuffer )    ( edict_t *pEdict );

    /**
     *  取出指定缓冲区中指定Key的值
     *  
     *  @参数 infobuffer 目标缓冲区。可以是任意缓冲区。
     *  @参数 key 目标Key名
     *  @返回值 返回对应的value,如果指定的Key不存在则返回 ""
     *  
     *  @注意 该函数最多可以连续调用4次返回不同的指针,超过4次将返回第1次调用时返回的指针,反复循环。
     *  
     *  @示例 假设某缓冲区中内容为 "name\Erika\model\erika_lod3"
     *        const char *val = pfnInfoKeyValue( infobuf, "model" );
     *        则 val 为 "erika_lod3"
     *  
    **/
    const char *( *pfnInfoKeyValue )        ( const char *infobuffer, const char *key );

    /**
     *  设置 localinfo 或者 serverinfo 缓冲区中的Key的值。
     *  
     *  @参数 infobuffer 目标缓冲区。必须为 pfnGetInfoKeyBuffer 函数返回的 localinfo 或 serverinfo 缓冲区。传入 userinfo 缓冲区将产生 Fatal Error 错误。
     *  @参数 key 目标Key名。如果缓冲区中不存在该Key,将自动添加。不能为 NULL
     *  @参数 value 该Key的值。不能为 NULL
     *  
    **/
    void        ( *pfnSetKeyValue )            ( const char *infobuffer, char *key, char *value );

    /**
     *  设置指定玩家的 userinfo 缓冲区中的Key值。
     *  
     *  @参数 clientIndex 目标玩家的索引。
     *  @参数 infobuffer 目标缓冲区。必须为 pfnGetInfoKeyBuffer 函数返回的 userinfo 缓冲区。
     *  @参数 key 目标Key名。如果缓冲区中不存在该Key,将自动添加。不能为 NULL
     *  @参数 value 该Key的值。不能为 NULL
     *  
     *  @注意 如果为一个Key设置了新的值,服务端将会把整个 userinfo 缓冲区重新发送给客户端以便更新客户端的 userinfo。所以该函数不能频繁调用。
     *  
    **/
    void        ( *pfnSetClientKeyValue )    ( int clientIndex, char *infobuffer, char *key, char *value );

    /**
     *  检查指定地图是否有效(检查指定地图文件是否存在)
     *  
     *  @参数 filename 地图名。例如:"de_dust"、"cs_assault"
     *  @返回值 有效返回1否则返回0
    **/
    int            ( *pfnIsMapValid )            ( char *filename );

    /**
     *  该函数发送一个 SVC_TEMPENTITY 消息,类型为 TE_BSPDECAL。在地图上创建一个贴花。
     *  
     *  @参数 origin 指向 float[3] 数组的指针。贴花位置
     *  @参数 decalIndex 贴花索引。必须是 pfnDecalIndex 函数的返回值。
     *  @参数 entityIndex 目标实体。该实体的模型类型必须是 mod_brush(即 BSP或BSP子模型)
     *  @参数 modelIndex 模型索引。如果 entityIndex 不为0则必须设置该参数。通常就是 entity->v.modelindex
     *  
     *  @注意 该函数必须在 ServerActivate 或者 CWorld::Spawn 中使用
     *  
    **/
    void        ( *pfnStaticDecal )            ( const float *origin, int decalIndex, int entityIndex, int modelIndex );

    /**
     *  缓存一个自定义类型的资源文件。如果客户端不存在该文件,将会从服务器下载。通常用于 TGA、TXT、BMP 等地图资源文件。
     *  该函数仅标记指定文件,不会将文件读入到内存中。
     *  
     *  @参数 欲缓存的文件命
     *  @返回值 该文件的索引
     *  
    **/
    int            ( *pfnPrecacheGeneric )        ( char *filename );

    /**
     *  返回指定玩家的 UserID 该ID并不是玩家的实体索引。通常用于踢人 kick 命令
     *  
     *  @参数 pEdict 目标玩家
     *  @返回值 成功返回UserID失败返回-1
     *  
    **/
    int            ( *pfnGetPlayerUserId )        ( edict_t *pEdict );

    /**
     *  该函数功能与 pfnEmitSound 函数类似。但可以指定哪些玩家客户端会收到该声音消息(即播放该声音)
     *  
     *  @参数 前7个参数 与 pfnEmitSound 函数相同。
     *  @参数 后4个参数 与 pfnMessageBegin 函数相同。
    **/
    void        ( *pfnBuildSoundMsg )        ( edict_t *entity, int channel, const char *sample, float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed );

    /**
     *  如果当前服务器是HLDS返回1否则返回0
    **/
    int            ( *pfnIsDedicatedServer )    ( void );

    /**
     *  返回指定名称的CVAR的指针
     *  @参数 szVarName CVAR名
     *  @返回值 指针
    **/
    cvar_t *    ( *pfnCVarGetPointer )        ( const char *szVarName );

    /**
     *  该函数已废弃
    **/
    unsigned int ( *pfnGetPlayerWONId )        ( edict_t *e ); 

    /**
     *  删除指定infobuffer中的某个Key
     *  
     *  @参数 infobuffer 目标缓冲区。可以是任意缓冲区。
     *  
    **/
    void        ( *pfnInfo_RemoveKey )        ( char *infobuffer, const char *key );

    /**
     *  获取指定玩家的 physinfo 缓冲区中的键值
     *  
     *  @参数 pClient 目标玩家
     *  @参数 key 目标键名
     *  @返回值 值字符串
     *  
    **/
    const char *(*pfnGetPhysicsKeyValue)    ( const edict_t *pClient, const char *key );

    /**
     *  设置指定玩家的 physinfo 缓冲区中的键值
     *  
     *  @参数 pClient 目标玩家
     *  @参数 key 欲设值的键名。如果该键不存在将自动添加。
     *  @参数 value 欲设置的值
     *  
    **/
    void        ( *pfnSetPhysicsKeyValue )    ( const edict_t *pClient, const char *key, const char *value );

    /**
     *  获取指定玩家的 physinfo 缓冲区。
     *  @参数 pClient 目标玩家
     *  @返回值 缓冲区指针
     *  
    **/
    const char *(*pfnGetPhysicsInfoString)    ( const edict_t *pClient );

    /**
     *  缓存一个事件脚本。虽然脚本已经废弃。但保留了事件功能。
     *  事件具有类似消息的功能。服务端可以发送事件给一些客户端,客户端接收事件,完成任务。例如产生烟雾弹效果、闪光弹效果、击中墙面效果等。
     *  
     *  @参数 type 事件类型。必须为 1 
     *  @参数 scriptfilename 事件脚本文件路径。可以是一个空的文件但该文件必须存在。例如:"events/snarkfire.sc"
     *  @参数 成功返回事件索引,失败产生 Host Error 错误,返回0
     *  
     *  @注意 该函数使用方法与 pfnPrecacheModel 等类似。注意使用时机
     *  
    **/
    unsigned short ( *pfnPrecacheEvent )    ( int type, const char *scriptfilename );

    /**
     *  发送一个事件给所有符合条件的玩家客户端。
     *  
     *  @参数 flags 指定事件标志。可取值:
     *                FEV_NOTHOST  <-- 如果指定该标志,并且玩家客户端的 cl_lw 这个CVAR为 1,则该玩家不会收到事件。
     *                FEV_RELIABLE <-- 如果指定该标志,事件将立即通过可靠的消息通道发送给客户端。网络条件较差时也可以保证事件能发送到客户端,但会给服务器带来额外的消耗。
     *                FEV_GLOBAL   <-- 如果指定该标志,事件将发送给所有玩家客户端。
     *                FEV_UPDATE   <-- 如果指定该标志,如果发送队列中已经有该事件,则更新该事件,不会产生重复事件。
     *                FEV_HOSTONLY <-- 如果指定该标志,必须在 pInvoker 参数传入有效的玩家实体。事件仅发送给该玩家。该标志与 FEV_NOTHOST 不冲突。
     *                FEV_SERVER   <-- 该标志用于指出事件来自服务器而非客户端。注:客户端也可以 PlaybackEvent 
     *                FEV_CLIENT   <-- 该标志用于指出事件来自客户端。用于客户端 PlaybackEvent
     *  @参数 pInvoker 指定发出事件的玩家或实体。
     *  @参数 eventindex 事件索引。必须是 pfnPrecacheEvent 的返回值。
     *  @参数 delay 指定事件需要等待多长时间后才真正发送给客户端。
     *  @参数 origin 可选参数。如果该参数为(0,0,0)并且 pInvoker 为有效实体,将自动从 pInvoker->v.origin 中复制。
     *  @参数 angles 可选参数。如果该参数为(0,0,0)并且 pInvoker 为有效实体,将自动从 pInvoker->v.angles 中复制。
     *  @参数 fparam1 可选参数。
     *  @参数 fparam2 可选参数。
     *  @参数 iparam1 可选参数。
     *  @参数 iparam2 可选参数。
     *  @参数 bparam1 可选参数。
     *  @参数 bparam2 可选参数。
     *  
    **/
    void        ( *pfnPlaybackEvent )        ( int flags, const edict_t *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 );

    /**
     *  返回指定坐标处的PVS(可视范围)数据集。主要用于 DLL SetupVisibility 函数。
     *  
     *  @参数 org 目标位置
     *  @返回值 数据集指针
     *  
    **/
    unsigned char *( *pfnSetFatPVS )        ( float *org );

    /**
     *  返回指定坐标处的PAS(可听范围)数据集。主要用于 DLL SetupVisibility 函数。
     *  
     *  @参数 org 目标位置
     *  @返回值 数据集指针
     *  
    **/
    unsigned char *( *pfnSetFatPAS )        ( float *org );

    /**
     *  检查指定实体是否在某个范围内。通常用于 DLL AddToFullPack 函数。
     *  
     *  @参数 entity 欲检查的实体
     *  @参数 pset 范围数据集。可以是 pfnSetFatPVS 或 pfnSetFatPAS 的返回值。
     *  @返回值 如果实体在指定范围内返回1否则返回0
     *  
    **/
    int            ( *pfnCheckVisibility )        ( edict_t *entity, unsigned char *pset );

    /**
     *  设置结构体中指定变量允许发送给客户端。详情参考:Delta功能 @http://www.cnblogs.com/crsky/p/6881084.html
     *  
     *  @参数 pFields 结构体变量集。该参数必须是 pfnDeltaAddEncoder 的 conditionalencode 回调函数的 pFields 参数。
     *  @参数 fieldname 结构体中的变量名。
     *  
    **/
    void        (*pfnDeltaSetField)            ( struct delta_s *pFields, const char *fieldname );

    /**
     *  设置结构体中指定变量不允许发送给客户端。详情参考:Delta功能 @http://www.cnblogs.com/crsky/p/6881084.html
     *  
     *  @参数 pFields 结构体变量集。该参数必须是 pfnDeltaAddEncoder 的 conditionalencode 回调函数的 pFields 参数。
     *  @参数 fieldname 结构体中的变量名。
     *  
    **/
    void        ( *pfnDeltaUnsetField )        ( struct delta_s *pFields, const char *fieldname );

    /**
     *  为Delta模块添加一个Encoder(编码器或者说过滤器)当Delta模块发送指定了编码器的结构体(在delta.lst文件中)时将会调用回调函数,处理特定的结构体变量
     *  例如:当发送 entity_state_t 数据时,禁止发送结构体中某些变量,这可以节省服务器带宽,减少服务器消耗。
     *  
     *  @参数 name 编码器名称。必须在 delta.lst 中存在。
     *  @参数 conditionalencode 编码器回调函数。在回调中使用 pfnDeltaSetField 或 pfnDeltaUnsetField 函数控制某些变量可否发送。
     *                            @参数 pFields 结构体变量集。可用于 pfnDeltaSetField、pfnDeltaUnsetField、pfnDeltaFindField、pfnDeltaSetFieldByIndex、pfnDeltaUnsetFieldByIndex 函数。
     *                            @参数 from 上次发送的数据集。用于差异检查。详情参考 Delta模块 
     *                            @参数 to 本次发送的数据集。
     *  
     *  @注意 必须在 DLL RegisterEncoders 函数中使用
     *  
    **/
    void        ( *pfnDeltaAddEncoder )        ( char *name, void (*conditionalencode)( struct delta_s *pFields, const unsigned char *from, const unsigned char *to ) );

    /**
     *  获取当前Delta要把数据发送给哪个玩家。用于Delta编码器回调函数。
     *  @返回值 玩家索引,出错返回-1
    **/
    int            (*pfnGetCurrentPlayer)        ( void );

    /**
     *  如果该玩家客户端的 "cl_lw" CVAR为 1 则返回1否则返回0
    **/
    int            (*pfnCanSkipPlayer)            ( const edict_t *player );

    /**
     *  返回变量在结构体中的索引
     *  
     *  @参数 pFields 结构体变量集。该参数必须是 pfnDeltaAddEncoder 的 conditionalencode 回调函数的 pFields 参数。
     *  @参数 fieldname 欲查找的变量名。
     *  
    **/
    int            ( *pfnDeltaFindField )        ( struct delta_s *pFields, const char *fieldname );

    /**
     *  该函数功能与 pfnDeltaSetField 相同,但参数是索引形式。
    **/
    void        ( *pfnDeltaSetFieldByIndex )( struct delta_s *pFields, int fieldNumber );

    /**
     *  该函数功能与 pfnDeltaUnsetField 相同,但参数是索引形式。
    **/
    void        ( *pfnDeltaUnsetFieldByIndex )    ( struct delta_s *pFields, int fieldNumber );

    /**
     *  设置分组屏蔽功能。可用于碰撞检测目标过滤、Trace检测目标过滤、Event发送目标过滤等。
     *  
     *  @参数 mask 屏蔽分组值。仅用于 PointContents 测试。
     *  @参数 op 检测方式。可选值:
     *                 GROUP_OP_AND   <-- 目标分组值与屏蔽分组值进行位与计算,如果结果为0则通过测试。
     *                 GROUP_OP_NAND  <-- 目标分组值与屏蔽分组值进行位与计算,如果结果不为0则通过测试。注:如果测试通过,该目标将被检测函数忽略。
     *  
    **/
    void        ( *pfnSetGroupMask )        ( int mask, int op );

    /**
     *  为指定类名的实体创建初始值。用于Delta模块的差异检测。
     *  
     *  @参数 classname 实体类名。该参数必须是 pfnAllocString 的返回值。
    **/
    int            ( *pfnCreateInstancedBaseline ) ( int classname, entity_state_t *baseline );

    /**
     *  设置CVAR的值。功能与 pfnCVarSetString 函数相同。不过参数是CVAR指针。
     *  
     *  @参数 var 目标CVAR指针
     *  @参数 value 欲设置的值
     *  
    **/
    void        ( *pfnCvar_DirectSet )        ( cvar_t *var, char *value );

    /**
     *  用于检查客户端的文件是否与服务端文件相同。
     *  该函数把文件添加到检查列表中。该功能会使客户端在连接服务器时上传大量文件特征数据,拖慢连接速度。
     *  
     *  @参数 type 检查方式。可选值:
     *               force_exactfile             <-- 该文件必须与服务端的完全相同。
     *               force_model_samebounds      <-- 该模型文件的包围盒大小必须与服务端的完全相同。
     *               force_model_specifybounds   <-- 该模型文件的包围盒大小不得大于服务端的。
     *               force_model_specifybounds_if_avail <-- 与 force_model_specifybounds 相同。如果该文件存在。
     *  @参数 mins 模型包围盒。仅用于模型文件。
     *  @参数 maxs 模型包围盒。仅用于模型文件。
     *  @参数 filename 欲检查的文件。
     *  
     *  @注意 该函数必须在 CWorld::Spawn 中使用
     *  
    **/
    void        ( *pfnForceUnmodified )        ( FORCE_TYPE type, float *mins, float *maxs, const char *filename );

    /**
     *  返回指定玩家客户端的当前状态。
     *  
     *  @参数 pClient 目标玩家
     *  @参数 ping 返回PING值。单位为毫秒
     *  @参数 packet_loss 返回丢包数量
     *  
    **/
    void        ( *pfnGetPlayerStats )        ( edict_t *pClient, int *ping, int *packet_loss );

    /**
     *  添加一个服务端命令,当服务端控制台输入该命令后,调用指定函数。
     *  
     *  @参数 cmd_name 命令名。
     *  @参数 function 回调函数。
     *  
    **/
    void        ( *pfnAddServerCommand )    ( char *cmd_name, void (*function)(void) );

    /**
     *  判断指定玩家客户端是否正在收听另一个玩家客户端的语音。游戏内语音功能。
     *  
     *  @参数 iReceiver 接听者。
     *  @参数 iSender 发声者。
     *  
    **/
    qboolean    ( *pfnVoice_GetClientListening )( int iReceiver, int iSender );

    /**
     *  设置指定玩家是否可以收听另一玩家客户端的语音。游戏内语音功能。
     *  
     *  @参数 iReceiver 收听者
     *  @参数 iSender 发声者
     *  @参数 bListen 是否可以收听
     *  
    **/
    qboolean    ( *pfnVoice_SetClientListening )( int iReceiver, int iSender, qboolean bListen );

    /**
     *  返回指定玩家的AuthID字符串。例如:"VALVE_ID_LAN"、"BOT"、"HLTV"
     *  @参数 pEdict 目标玩家
    **/
    const char *( *pfnGetPlayerAuthId )        ( edict_t *pEdict );


    // PSV: Added for CZ training map
//    const char *(*pfnKeyNameForBinding)        ( const char* pBinding );
    
    sequenceEntry_s*    (*pfnSequenceGet)            ( const char* fileName, const char* entryName );
    sentenceEntry_s*    (*pfnSequencePickSentence)    ( const char* groupName, int pickMethod, int *picked );

    /**
     *  返回指定文件的大小
     *  @参数 filename 文件名
    **/
    int            ( *pfnGetFileSize )            ( char *filename );

    unsigned int (*pfnGetApproxWavePlayLen) (const char *filepath);
    // MDC: Added for CZ career-mode
    int            (*pfnIsCareerMatch)            ( void );

    // BGC: return the number of characters of the localized string referenced by using "label"
    int            (*pfnGetLocalizedStringLength)(const char *label);

    // BGC: added to facilitate persistent storage of tutor message decay values for
    // different career game profiles.  Also needs to persist regardless of mp.dll being
    // destroyed and recreated.
    void (*pfnRegisterTutorMessageShown)(int mid);
    int (*pfnGetTimesTutorMessageShown)(int mid);
    void (*ProcessTutorMessageDecayBuffer)(int *buffer, int bufferLength);
    void (*ConstructTutorMessageDecayBuffer)(int *buffer, int bufferLength);
    void (*ResetTutorMessageDecayData)( void );

    /**
     *  查询一个客户端的CVAR的值。通过 NEW DLL pfnCvarValue 函数返回。 
    **/
    void (*pfnQueryClientCvarValue)( const edict_t *player, const char *cvarName );
    void (*pfnQueryClientCvarValue2)( const edict_t *player, const char *cvarName, int requestID );

    /**
     *  检查服务器启动命令行中是否有指定的参数..
    **/
    int (*pfnCheckParm)( const char *pchCmdLineToken, char **ppnext );

} enginefuncs_t;

 

如果有错字、错误、与实际测试结果跟描述不一致、或者需要补充的地方,请留言提出。我会尽快修改。

 

posted @ 2017-11-08 18:30  Akatsuki-  阅读(2014)  评论(0编辑  收藏  举报