11API文档

注意事项

需要确保在jass的main函数开始时立刻调用SetCameraBounds

API说明

妖豆相关

/*!
@brief 获取玩家妖豆余额
@param p 玩家对象
@return 玩家妖豆余额
*/
function YDWERPGBillingGetCommonCurrency takes player p returns integer


/*!
@brief 玩家妖豆消费
@param p 玩家对象
@param consume 消费金额
@return 消费是否成功
*/
function YDWERPGBillingCommonConsume takes player p,integer consume returns boolean


/*!
@breif 玩家使用妖豆购买商品,该商品在作者后台配置。
@param p 玩家对象
@param productId 商品id,通过作者后台配置。
@return 扣款是否成功
@sa YDWECommonBuyQueryCost, YDWECommonBuyQueryStatus, YDWECommonBuyQueryItem, YDWECommonBuyQueryName
*/
function YDWECommonBuyProduct takes player p, integer productId returns boolean

/*!
@breif 查询商品的妖豆价格
@param productId 商品id,通过作者后台配置。
@return 商品价格,如果没有该商品则返回-1。
@sa YDWECommonBuyProduct
*/
function YDWECommonBuyQueryCost takes integer productId returns integer


/*!
@breif 查询商品在后台绑定的状态id
@param productId 商品id,通过作者后台配置。
@return 商品在后台绑定的状态id,如果没有该商品则返回空字符串。
@sa YDWECommonBuyProduct
*/
function YDWECommonBuyQueryStatus takes integer productId returns string

/*!
@breif 查询商品在后台绑定的道具id
@param productId 商品id,通过作者后台配置。
@return 商品在后台绑定的道具id,如果没有该商品则返回字符串。
@sa YDWECommonBuyProduct
*/
function YDWECommonBuyQueryItem takes integer productId returns string

/*!
@breif 查询商品在后台绑定的道具数量
@param productId 商品id,通过作者后台配置。
@return 商品在后台绑定的道具数量。
@sa YDWECommonBuyProduct
*/
function YDWECommonBuyQueryItemCount takes integer productId returns integer


/*!
@breif 查询商品在后台绑定的商品名
@param productId 商品id,通过作者后台配置。
@return 商品在后台绑定的道具id,如果没有该商品则返回字符串。
@sa YDWECommonBuyProduct
*/
function YDWECommonBuyQueryName takes integer productId returns string

/*!
@breif 查询商品在后台绑定的类型
@param productId 商品id,通过作者后台配置。
@return 商品在后台绑定的类型, 0-错误的商品id, 1-状态, 2-累加型道具。
@sa YDWECommonBuyProduct
*/
function YDWECommonBuyQueryType takes integer productId returns integer

道具与状态

/*!
@brief 获取玩家状态
@param p 玩家对象
@param key 状态id
@return 状态值
*/
function YDWERPGBillingGetStatus takes player p, string key returns integer


/*!
@brief 判断玩家是否拥有状态值
@param p 玩家对象
@param key 状态id
@return 玩家是否拥有状态值
*/
function YDWERPGBillingHasStatus takes player p, string key returns boolean


/*!
@brief 获取玩家道具数量
@param p 玩家对象
@param key 道具id
@return 玩家道具数量
*/
function YDWERPGBillingGetItem takes player p, string key returns integer


/*!
@brief 判断玩家是否拥有道具
@param p 玩家对象
@param key 道具id
@return 玩家是否拥有道具
*/
function YDWERPGBillingHasItem takes player p, string key returns boolean


/*!
@brief 玩家使用道具
@param p 玩家对象
@param itemid 道具id
@param amount 使用数量
@return 道具是否使用成功
*/
native EXNetUseItem  takes player p,string itemid,integer amount returns boolean

存档相关

注意:存档只保存本地玩家的数据。存档的请求会保存在队列中,每隔0.5秒向服务端发送5条请求。期间如果有相同的存档请求,新的存档请求会覆盖老的存档请求。

/*!
@breif 获取玩家存档
@param p 玩家对象
@param rKey 存档名称
@return 存档内容
*/
function YDWERPGGetRemoteData takes player p, string rKey returns string


/*!
@breif 修改玩家存档
@param p 玩家对象
@param rKey 存档名称
@param value 新存档的内容
@return 修改是否成功
*/
function YDWESaveRemoteData takes player p, string Key ,string value returns boolean

随机只读存档相关


/*!
@brief 查看随机只读存档是否存在
@param p 玩家对象
@param rkey 随机只读存档名
@return 随机只读存档是否存在
*/
function YDWECheckRandSavExist takes player p,string rkey returns boolean;   

/*!
@brief 向服务端请求发送生成随机只读存档,请求发送后可以在云脚本事件"DZBLU"中重新读取新的随机只读存档
@param p 玩家对象
@param rkey 存档名
@param gkey 组名
@return 生成请求是否发送成功
*/
function YDWEGenRandSav takes player p,string rkey,string gkey returns boolean;

/*!
@brief 向服务端请求删除随机只读存档
@param p 玩家对象
@param rkey 存档名
@return 删除请求是否发送成功
*/
function YDWEDelRandSav takes player p,string rkey returns boolean;

/*!
@brief 获取随机只读存档的值
@param p 玩家对象
@param rkey 存档名
@return 随机只读存档的值
*/
function YDWEGetRandSavData takes player p,string rkey returns integer;


/*!
@brief 获取随机只读存档的组id
@param p 玩家对象
@param rkey 存档名
@return 随机只读存档的组id
*/
function YDWEGetRandSavGroupId takes player p,string rkey returns string;

/*!
@brief 获取随机只读存档的时间戳
@param p 玩家对象
@param rkey 存档名
@return 随机只读存档的时间戳
*/
function YDWEGetRandSavTimestamp takes player p,string rkey returns integer;


/*!
@brief 获取随机只读存档组的剩余写入次数
@param p 玩家对象
@param gkey 组id
@return 组的剩余写入次数
*/
function YDWEGetRandSavTriggerLimit takes player p,string gkey returns integer;

/*!
@brief 获取随机标准存档的剩余写入次数
@param p 玩家对象
@param key 标准存档名
@return 标准存档的剩余写入次数
*/
function YDWEGetStdSavTriggerLimit takes player p,string key returns integer;

全局存档相关

/*!
@brief 获取全局存档的值
@param p 玩家对象
@param key 全局存档名
@return 全局存档的值
*/
function YDWEGetGlobalSav takes player p,string key returns string;

积分相关

/*!
@breif 获取玩家积分
@param p 玩家对象
@param key 积分名
@return 玩家积分
*/
function YDWERPGGetKey takes player p, string key returns integer


/*!
@breif 修改玩家积分
@param p 玩家对象
@param key 积分名
@param value 新积分的值
*/
function YDWERPGSetKey takes player p, string key, integer value returns nothing


/*!
@breif 玩家积分累加
@param p 玩家对象
@param key 积分名
@param value 要累加的值
*/
function YDWERPGAddKey takes player p, string key, integer value returns nothing


/*!
@breif 游戏结束,结算积分
@warning 当游戏结束时一定要调用该函数进行积分结算
*/
function YDWERPGGameEnd takes nothing returns nothing

排行相关(关联的GameCache "11.rank")

//显示当前的排名种类名称
function YDWEGetRPGRankName takes nothing returns string
    return GetStoredString(ranktable, "RankKey", "0" )
endfunction

/*!
@breif 设置当前的排名种类名称
@param 排名种类名称 
*/
function YDWESetRPGRankName takes string name returns nothing
	call StoreString(ranktable, "RankKey", "0", name)
endfunction

/*!
@breif 设置当前的排名种类名称
@param 排名种类名称 
@warning 需要先调用YDWESetRPGRankName设置排名种类,否则使用默认的排名种类
*/
function YDWESetRPGRankName takes string name returns nothing
	call StoreString(ranktable, "RankKey", "0", name)
endfunction

/*!
@brief 获取排名第rank名的玩家名字
@param rank 排名
@warning 需要先调用YDWESetRPGRankName设置排名种类,否则使用默认的排名种类

*/
function YDWEGetTopsName takes integer rank returns string
	return GetStoredString(ranktable, "TopsName", I2S((rank)))
endfunction

/*!
@brief 获取排名第rank名的玩家分数
@param rank 排名
@return 排名第rank名的玩家分数
@warning 需要先调用YDWESetRPGRankName设置排名种类,否则使用默认的排名种类
*/
function YDWEGetTopsScore takes integer rank returns integer
	return GetStoredInteger(ranktable, "TopsScore", I2S((rank)))
endfunction

/*!
@brief 获取玩家的排名
@param playerId 玩家ID
@return 玩家的排名
@warning 需要先调用YDWESetRPGRankName设置排名种类,否则使用默认的排名种类
*/
function YDWEGetPlayerRank takes integer playerId returns integer
	return GetStoredInteger(ranktable, "PlayerRank", I2S(playerId))
endfunction

/*!
@brief 获取玩家的排名分数
@param playerId 玩家ID
@return 玩家的排名分数
@warning 需要先调用YDWESetRPGRankName设置排名种类,否则使用默认的排名种类
*/
function YDWEGetPlayerRankScore takes integer playerId returns integer
	return GetStoredInteger(ranktable, "PlayerScore", I2S(playerId))
endfunction

成就相关

/*!
@brief 存入用户成就
@param p 玩家对象
@param key 成就名
@param value 成就值
*/
function YDWEStatRemoteData takes player p, string key ,string value returns boolean

地图统计数据

/*!
@brief 获取地图的各项统计数据
@param key 统计项
@return 统计项的值
@detail 目前支持的统计项如下
	"Collection" - 收藏数
@example
	//获取地图的收藏数
	local integer collection = S2I(YDWERPGGetMapStatistics("Collection"));

	//老版的YDWE可以这样使用
	local integer collection = S2I(GetStoredString(ctable, "statistic", "Collection"));
	
*/
function YDWERPGGetMapStatistics takes string ckey returns string

玩家唯一ID获取(关联的GameCache "11.s")

/*!
@brief 获取玩家的唯一ID
@param playerId 玩家ID
@return 玩家的唯一ID
*/
function YDWEGetPlayerUniqueKey takes integer playerId returns string
	return GetStoredString(ctable, "UniqueID", I2S(playerId))
endfunction

防刷分机制

积分防刷

在作者后台新建积分项时,可以根据地图的逻辑设置每局积分的累加上限,从而达到防刷的目的。

存档防刷

存档需要和积分进行逻辑上的关联来实现防刷的目的。比如我们可以设置一个积分项"ArcherLevel",设置若干存档项"Begineer", "Skilled", "Master",...。因为积分具有防刷机制,所有可以通过积分项来选择如何加载存档。
下面的例子展示了如何通过积分来加载不同的存档

/**!
@breif 等级模块,根据不同的ArcherLevel选择对应的存档进行读写操纵
@detail 1. 当中立生物被杀死时,累加玩家的击杀数。
        2. 玩家每击杀动物两次升一级 1~2级为新手期(Beginner存档),3~10级为老手期(Skilled存档),10级以上为大师期(Master存档)
        3. 玩家每次升级后清空存档中的击杀数量
*/  
library ArcherLevel initializer InitArcherLevel requires YDWERPGScores
    globals
        integer array g_ArcherLevel
    endglobals

    private function InitArcherLevel takes nothing returns nothing
        local integer idx = 0
        loop
            exitwhen idx>=bj_MAX_PLAYERS
            set g_ArcherLevel[idx] = -1
            
            set idx = idx+1
        endloop
    endfunction
    
    /**!
    @brief 读取积分,并对全局变量初始化
    @param p 玩家对象
    */
    function GetArcherLevel takes player p returns integer
        local integer pid = GetPlayerId(p)
        
        //如果使用时未初始化等级,则读取积分进行初始化
        if g_ArcherLevel[pid] ==-1 then
            set g_ArcherLevel[pid] = YDWERPGGetKey(p,"ArcherLevel")
        endif
        
        return g_ArcherLevel[pid]
    endfunction

    /**!
    @brief 升级
    @param p 玩家对象
    */
    function AddArcherLevel takes player p returns nothing
        local integer pid = GetPlayerId(p)
        
        //如果使用时未初始化等级,则读取积分进行初始化
        if g_ArcherLevel[pid] == -1 then
            set g_ArcherLevel[pid] = YDWERPGGetKey(p,"ArcherLevel")
        endif
        
        set g_ArcherLevel[pid] = g_ArcherLevel[pid] + 1
        call YDWERPGAddKey(p,"ArcherLevel", 1)          //向服务端发送累加积分的请求
        
        call BJDebugMsg(GetPlayerName(p)+" level "+I2S(g_ArcherLevel[pid]-1) + "->" + I2S(g_ArcherLevel[pid]))
    endfunction


    /**!
    @brief 读取玩家的积分,并通过积分来推断使用的存档
    @param p 玩家对象
    @return 玩家在当前积分下能够使用的存档
    */
    function GetPlayerSaveName takes player p returns string
        local integer level = GetArcherLevel(p)    
        local string saveName = "Beginner"     
        
         //根据积分的等级获取正确的存档名,这样即使外挂修改了其他等级时的存档,也会因为等级的限制而无法使用
        if level>=10 then                              
            set saveName = "Master"
        elseif level>=3 and level <10 then
            set saveName = "Skilled"
        else
            set saveName = "Beginner"
        endif
        
        return saveName
    endfunction

    /**!
    @brief 根据玩家的积分来获取对应的存档数据
    @param p 玩家对象
    */
    function GetPlayerSaveData takes player p returns string
        local string saveName = GetPlayerSaveName(p)
        call BJDebugMsg(GetPlayerName(p)+" get "+saveName)
        return YDWERPGGetRemoteData(p,saveName)         //获取存档数据
    endfunction

    /**!
    @brief 根据玩家的积分来设置对应的存档数据
    @param p 玩家对象
    @param killCnt 击杀数量
    */
    function SetPlayerSaveData takes player p, integer killCnt returns nothing
        local string saveName = GetPlayerSaveName(p)
        call YDWESaveRemoteData(p, saveName, I2S(killCnt))  //将击杀数量写入存档数据
        call BJDebugMsg(GetPlayerName(p)+" save to "+saveName)
    endfunction

    /**!
    @breif 当中立生物被杀死时,累加玩家的击杀数, 玩家每击杀动物两次升一级,1~2级为新手期(Beginner存档),3~10级为老手期(Skilled存档),10级以上为大师期(Master存档)
    */
    function NeturalUnitKilled takes nothing returns nothing
        local player p = GetOwningPlayer(GetKillingUnitBJ())
        local integer killCnt = 0
        local string saveName = GetPlayerSaveName(p)
        call BJDebugMsg(GetPlayerName(p)+" killed animal")
        set killCnt = S2I(GetPlayerSaveData(p))
        
        //这里可以校验存档的内容是否符合逻辑
        if killCnt>=10000 and saveName =="Beginner" then
            call BJDebugMsg(GetPlayerName(p)+" killed too many animals")
        endif
        
        set killCnt = killCnt + 1
        call SetPlayerSaveData(p,killCnt)
        call BJDebugMsg(GetPlayerName(p)+" killed cnt: "+I2S(killCnt))
        
        if killCnt >= 2 then 
            call AddArcherLevel(p)
            call SetPlayerSaveData(p, 0)
        endif
    endfunction
endlibrary

游戏货币相关(不再对新地图开放)

/*!
@brief 获取玩家游戏货币余额
@param p 玩家对象
@return 玩家游戏货币余额
*/
function YDWERPGBillingGetCurrency takes player p returns integer


/*!
@brief 获取玩家游戏货币扣款
@param p 玩家
@param consume 消费金额
@return 扣款是否成功
*/
function YDWERPGBillingConsume takes player p,integer consume returns boolean

消费妖豆示例

    local player p = GetTriggerPlayer()     //触发购买的玩家
    local integer itemCost = 20         //商品价格
    local integer currency = YDWERPGBillingGetCommonCurrency(p)//妖豆余额可以用于在游戏中展示
    local boolean buyRet = YDWERPGBillingCommonConsume(p, itemCost)
    if buyRet == true then
        /*
        妖豆消费成功使用道具的逻辑
        */
    else
        /*
        妖豆不足时的逻辑
        */
    endif

妖豆内购状态示例

    local player p = GetTriggerPlayer()     //触发购买的玩家
    local integer productID = 56656         //商品id
    local integer productCost = YDWECommonBuyQueryCost(productID)//商品价格可以用于在游戏中展示
    local string statusID = YDWECommonBuyQueryStatus(productID) //商品在后台绑定的状态ID
    local string productName = YDWECommonBuyQueryName(productID) //商品在后台绑定的商品名称
    local boolean buyRet = YDWECommonBuyProduct(p, productID)
    if buyRet == true then
        /*
        商品购买成功的逻辑
        */
    else
        /*
        妖豆不足时的逻辑
        */
    endif

云脚本相关接口

ExTriggerRegisterSyncData

注册云脚本事件

参数

参数名 类型 说明
trig trigger 触发器对象
prefix string 事件ID

EXSendRmtScriptData

描述

发送脚本请求,脚本函数名长度应小于64个字符,传入的参数应小于800个字符,否则发送失败。

参数

参数名 类型 说明
whichPlayer player 发送脚本请求的玩家
param1 string 事件ID
param2 string 事件数据

返回

返回值 类型 说明
- boolean 发送成功返回true,发送失败返回false

EXGetTriggerSyncData

描述

云脚本事件触发后获取事件数据

返回

返回值 类型 说明
- string 事件数据

EXGetTriggerSyncPlayer

描述

云脚本事件触发后获取触发事件的玩家

返回

返回值 类型 说明
- player 触发事件的玩家