/*! @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 设置当前的排名种类名称 @param 排名种类名称 */ 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
/*! @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