名将接入手册

实现原理

该项功能基于jass的GameCache的机制实现。当创建了指定名字(案例中为"dr.x",这个名字可以由作者自定义,但是格式只能为“**.x”,例如"aa.x","bb.x","ab.x"都是可以的)的GameCache后,平台就会对这个对象进行接管。当调用这个对象的GetStoreInteger,StoreInteger等一些列的接口时,就可以向平台的服务端提交或者读取数据。
注意:所有的服务端数据都会在游戏加载时进行下发,由于服务端的延迟问题,所以在使用Get系列的接口时,尽可能在游戏加载完成3~5秒后再使用,以避免无法获取的问题。

预定义代码

这里将插入一部分代码块,来对平台的GameCache进行封装。作者可以直接将这块代码复制粘贴到地图的jass代码中,后续的文档也将基于这部分代码来进行使用说明。


globals
    gamecache drx	//全局的gamecache
endglobals

//调用initCache初始化gamecache
function initCache takes nothing returns nothing
    call FlushGameCache(InitGameCache("dr.x"))
    set drx=InitGameCache("dr.x")
endfunction

//定义该函数,在下面的事件中(战斗实时事件)传入指定的参数
function ServerCommtGameData takes string key,integer value returns nothing
    call StoreInteger(drx,"Data",key,value)
endfunction

//定义该函数,在下面的事件中(战斗统计事件)传入指定的参数
function ServerCommtPlayerData takes player p,string key,integer value returns nothing
    local string id=I2S(GetPlayerId(p))
    call StoreInteger(drx,id,key,value)	//变量drx表示名为"dr.x"的GameCache对象
endfunction

//定义该函数,在下面的事件中(4.*)传入指定的参数,用户获取11平台的改键信息
function QueryYYHotKey takes string keyType, integer keyValue returns string
    return GetStoredString(drx,keyType,keyValue)
endfunction

//定义该函数,可以获取玩家的官方RPG积分数据(字符串类型)
function GetOfficalRPGScoreStr takes player p, string keyName returns string
    local integer pid = GetPlayerId(p)
    return GetStoredString(drx,"OfficalRpgScore",I2S(pid)+"@"+keyName)
endfunction

//定义该函数,可以获取玩家的官方RPG配置
function GetOfficalRPGConf takes player p, string keyName returns string
    local integer pid = GetPlayerId(p)
    return GetStoredString(drx,"OfficalRpgConf",I2S(pid)+"@"+keyName)
endfunction


//判断平台是否有新的改键数据生成
function IsYYHotKeyEdited takes nothing returns boolean
    return GetStoredString(drx,"HotKeyStatus","IsEdited")=="1"
endfunction

//判断平台改键数据状态
function ResetYYHotKeyEdited takes nothing returns nothing
    call StoreString(drx,"HotKeyStatus","IsEdited","0")
endfunction

/*
每隔一段时间调用这个函数来轮询平台的改键是否发生变化,如果发生变化则进行相应处理后重置改键数据状态
*/
function OnTimingCheckYYHotKey takes nothing returns nothing
    local boolean isHotKeyEdited = IsYYHotKeyEdited()
    if isHotKeyEdited then 
        //在这里添加当改键数据发生变化时的处理
        call ResetYYHotKeyEdited()
    endif
endfunction

/*
禁用或启用11平台的改键,war3仍然会显示改键按钮,但是实际改键不生效,如需隐藏改键按钮则需要修改房间配置
参数 isEnable: “0”-禁用,“1”-启用
*/
function EnableYYHotKey takes string isEnable returns nothing
	call StoreString(drx,"HotKeyStatus","IsEnable", isEnable)
endfunction

槽位定义

0: 近卫
[1,5]: 玩家1~5
6: 天灾
[7,11]: 玩家6~10

地图初始化事件

/*!
@breif 需要在地图初始化后调用,否则上述的代码块都会失效。
*/
function initCache takes nothing returns nothing

游戏事件

相关接口(参照预定义代码)

function ServerCommtGameData takes string key,integer value returns nothing;

玩家离开时

key:“C”+"K"+玩家的正补数+“D”+玩家的反补数+“N”+玩家野怪的杀死数
value:玩家槽位id,通过GetPlayerId(GetTriggerPlayer()) 获取

玩家助攻时

key:“Assist”+助攻者槽位id
value:死去玩家槽位id,通过GetPlayerId(GetTriggerPlayer()) 获取

玩家操控英雄死亡时

key:“Hero”+死去玩家槽位id
value:击杀者槽位id,通过GetPlayerId(GetTriggerPlayer()) 获取

肉山被击杀时

key:"Roshan"
value:0-表示近卫击杀, 1-表示天灾击杀

信使被击杀时

key:"Courier"+信使所属的玩家槽位id
value:击杀者槽位id

玩家正补数量同步(每隔一段时间调用一次,作为参考dota每150秒调用一次)

key:"CSK"+玩家槽位id
value:正补数

玩家反补数量同步(每隔一段时间调用一次,作为参考dota每150秒调用一次)

key:"CSD"+玩家槽位id
value:反补数

玩家击杀野怪数量同步(每隔一段时间调用一次,作为参考dota每150秒调用一次)

key:"NK"+玩家槽位id
value:击杀野怪数

兵营被推倒时

key:"Rax"+["0": 近卫, "1": 天灾] + ["0": 上路, "1": 中路, "2": 下路] + ["0": 法师塔, "1": 近战塔]
value:推倒者槽位id
例如:"Rax000" 近卫上路法师塔

基地血量上报(建议在 10%,25%,50%,75%时上报一次)

key:"Tree"-世界树,"Throne"-冰封王座
value:血量百分比

防御塔被推倒时

key:"Tower"+["0": 近卫, "1": 天灾] + ["1": 上路, "2": 中路, "3": 下路, "4": 基地旁] + ["0": 外塔, "1": 中塔, "2": 高地塔]
value:推倒者槽位id
例如: "Tower010" 近卫上路外塔

英雄等级提升时

key:"Level"+等级值
value:英雄所属玩家槽位id

出兵时

key: "GameStart"
value: 1

英雄对英雄造成伤害时

key: "Damage"+造成伤害的英雄槽位id
value:英雄的伤害值

初始化GameCache(dr.x)之后

key: "MapDamageOpen"
value:1-使用地图上传英雄伤害 0-使用war3计算英雄伤害

玩家选择天赋时以及游戏胜负判断之前,更新玩家选择的天赋

key: "Talent"+玩家槽位id
value: 代表一层天赋的选择情况。 十位数表示天赋的层数,从1开始。个位数表示该层天赋的选择情况,0-没有天赋 1-左侧天赋 2-右侧天赋
例如:key="Talent1" value=11 表示槽位id为1的玩家选择的10级天赋为左侧。

玩家事件

相关接口(参照预定义代码)

function ServerCommtPlayerData takes player p,string key,integer value returns nothing

玩家选定英雄时

p:玩家对应的player对象
key: "9"
value: 英雄单位id,通过GetUnitTypeId获取

游戏胜负判断之前,更新玩家杀人总数

p:玩家对应的player对象
key: "1"
value: 玩家杀人数

游戏胜负判断之前,更新玩家死亡总数

p:玩家对应的player对象
key: "2"
value: 玩家死亡数

游戏胜负判断之前,更新玩家正补总数

p:玩家对应的player对象
key: "3"
value: 玩家正补总数

游戏胜负判断之前,更新玩家反补总数

p:玩家对应的player对象
key: "4"
value: 玩家反补总数

游戏胜负判断之前,更新玩家助攻总数

p:玩家对应的player对象
key: "5"
value: 玩家助攻总数

游戏胜负判断之前,更新玩家金钱数

p:玩家对应的player对象
key: "6"
value: 玩家金钱数,通过PLAYERSTATERESOURCE_GOLD获取

游戏胜负判断之前,更新玩家野怪的杀死数

p:玩家对应的player对象
key: "7"
value: 玩家野怪的杀死数

游戏胜负判断之前,更新玩家身上的装备

p:玩家对应的player对象
key: "8"
value: 玩家身上的装备id,通过GetItemTypeId获取
注: "
"的取值从范围为[0,5]对应六件装备,如”8
0“, "8_1"...

游戏胜负判断之前,更新玩家选定英雄

p:玩家对应的player对象
key: "9"
value: 英雄单位id,通过GetUnitTypeId获取

游戏结束的事件

相关接口(参照预定义代码)

native  StoreInteger takes gamecache cache, string missionKey, string key, integer value returns nothing

cache:drx(定义在全局变量中的名为“dr.x”的gamecache)
missionKey:"Global"
key:"Winner"
value:1-近卫,2-天灾

获取技能改键

相关接口(参照预定义代码)

function QueryYYHotKey takes string keyType, integer keyValue returns string

获取平台改键信息

keyType:"ItemKey"-物品栏改键 "SkillKey"-技能改键
keyValue:物品栏/技能序号,从0开始

物品栏序号排列方式:
0 1
2 3
4 5

技能序号排列方式:
8	9	10	11
7	4	5	6
0	1	2	3

获取玩家官方RPG积分

相关接口(参照预定义代码)

function GetOfficalRPGScoreStr takes player p, string keyName returns string

获取游戏局数

p:玩家对应的player对象
keyName:"rpggamec"

获取游玩时间

p:玩家对应的player对象
keyName:"rpg_gametime"

玩家的官方RPG配置

相关概念

针对地图的一系列数据,对玩家只读,每个一段时间会根据后台规则刷新。

相关接口(参照预定义代码)

function GetOfficalRPGConf takes player p, string keyName returns string

获取配置信息

p:玩家对应的player对象
keyName:在作者后台做的配置