11API文档

API说明

/*!
@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


/*!
@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


/*!
@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 YDWERPGBillingHasStatus 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


/*!
@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


/*!
@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


/*!
@breif 获取当前排行的名称
*/
function YDWEGetRPGRankName takes nothing returns string


/*!
@breif 显示在排行榜中某一位的玩家分数
@param rank 排行榜中的排名
@return 玩家的分数,如果未找到或者超出可显示的排名范围时,返回-1
*/
function YDWEGetRPGTopScore takes integer rank returns integer


/*!
@breif 显示玩家的分数
@param p 玩家对象
@return 玩家的分数
*/
function YDWEGetPalyerRPGRankScore takes player p returns integer

/*!
@breif 显示玩家的排名
@param p 玩家对象
@return 玩家的排名
*/
function YDWEGetPalyerRPGRank takes player p returns integer

/*!
@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

防刷分机制

积分防刷

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

存档防刷

存档需要和积分进行逻辑上的关联来实现防刷的目的。比如我们可以设置一个积分项"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