You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
474 lines
12 KiB
474 lines
12 KiB
/*==LICENSE==* |
|
|
|
CyanWorlds.com Engine - MMOG client, server and tools |
|
Copyright (C) 2011 Cyan Worlds, Inc. |
|
|
|
This program is free software: you can redistribute it and/or modify |
|
it under the terms of the GNU General Public License as published by |
|
the Free Software Foundation, either version 3 of the License, or |
|
(at your option) any later version. |
|
|
|
This program is distributed in the hope that it will be useful, |
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
GNU General Public License for more details. |
|
|
|
You should have received a copy of the GNU General Public License |
|
along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
Additional permissions under GNU GPL version 3 section 7 |
|
|
|
If you modify this Program, or any covered work, by linking or |
|
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
|
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
|
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
|
(or a modified version of those libraries), |
|
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
|
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
|
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
|
licensors of this Program grant you additional |
|
permission to convey the resulting work. Corresponding Source for a |
|
non-source form of such a combination shall include the source code for |
|
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
|
work. |
|
|
|
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
|
or by snail mail at: |
|
Cyan Worlds, Inc. |
|
14617 N Newport Hwy |
|
Mead, WA 99021 |
|
|
|
*==LICENSE==*/ |
|
#include "pfGameScoreMgr.h" |
|
|
|
#include "pnUtils/pnUtils.h" |
|
#include "plNetGameLib/plNetGameLib.h" |
|
#include "pnNetProtocol/pnNetProtocol.h" |
|
|
|
//============================================================================ |
|
pfGameScore::pfGameScore() |
|
{ |
|
} |
|
|
|
pfGameScore::~pfGameScore() |
|
{ |
|
pfGameScoreMgr::GetInstance()->RemoveCachedScore(scoreId); |
|
} |
|
|
|
void pfGameScore::Init( |
|
unsigned sid, |
|
unsigned oid, |
|
UInt32 createTime, |
|
const char gname[], |
|
unsigned gType, |
|
int val |
|
) { |
|
scoreId = sid; |
|
ownerId = oid; |
|
createdTime = createTime; |
|
gameType = gType; |
|
value = val; |
|
|
|
StrCopy(gameName, gname, arrsize(gameName)); |
|
pfGameScoreMgr::GetInstance()->AddCachedScore(this); |
|
} |
|
|
|
void pfGameScore::CopyFrom( |
|
const pfGameScore* score |
|
) { |
|
scoreId = score->scoreId; |
|
ownerId = score->ownerId; |
|
createdTime = score->createdTime; |
|
gameType = score->gameType; |
|
value = score->value; |
|
|
|
StrCopy(gameName, score->gameName, arrsize(gameName)); |
|
} |
|
|
|
//============================================================================ |
|
pfGameScoreMgr::pfGameScoreMgr() |
|
{ |
|
} |
|
|
|
pfGameScoreMgr* pfGameScoreMgr::GetInstance() |
|
{ |
|
static pfGameScoreMgr s_instance; |
|
return &s_instance; |
|
} |
|
|
|
void pfGameScoreMgr::AddCachedScore(pfGameScore * score) |
|
{ |
|
GameScoreLink * scoreLink = fScores.Find(score->scoreId); |
|
if (scoreLink == nil) |
|
{ |
|
GameScoreLink * link = TRACKED_NEW GameScoreLink(score); |
|
fScores.Add(link); |
|
} |
|
else |
|
scoreLink->score->CopyFrom(score); |
|
} |
|
|
|
void pfGameScoreMgr::RemoveCachedScore(unsigned scoreId) |
|
{ |
|
if (GameScoreLink * link = fScores.Find(scoreId)) |
|
{ |
|
DEL(link); |
|
} |
|
} |
|
|
|
//============================================================================ |
|
struct NetWaitOp |
|
{ |
|
ENetError result; |
|
bool complete; |
|
}; |
|
|
|
static void WaitOpCallback( |
|
ENetError result, |
|
void * param |
|
) { |
|
NetWaitOp * op = (NetWaitOp *)param; |
|
|
|
op->result = result; |
|
op->complete = true; |
|
} |
|
|
|
//============================================================================ |
|
// CreateScore |
|
//============================================================================ |
|
struct CreateScoreOp : NetWaitOp |
|
{ |
|
pfGameScore * score; |
|
}; |
|
|
|
static void CreateScoreCallback( |
|
ENetError result, |
|
void * param, |
|
unsigned scoreId, |
|
UInt32 createdTime, |
|
unsigned ownerId, |
|
const char* gameName, |
|
unsigned gameType, |
|
int value |
|
) { |
|
CreateScoreOp * op = (CreateScoreOp*)param; |
|
op->result = result; |
|
|
|
if (IS_NET_SUCCESS(result)) { |
|
op->score->Init( |
|
scoreId, |
|
ownerId, |
|
createdTime, |
|
gameName, |
|
gameType, |
|
value |
|
); |
|
} |
|
else |
|
op->score->scoreId = 0; |
|
|
|
op->complete = true; |
|
} |
|
|
|
ENetError pfGameScoreMgr::CreateScore( |
|
unsigned ownerId, |
|
const char* gameName, |
|
unsigned gameType, |
|
int value, |
|
pfGameScore& score |
|
) { |
|
CreateScoreOp param; |
|
MemZero(¶m, sizeof(CreateScoreOp)); |
|
param.score = &score; |
|
|
|
NetCliAuthScoreCreate( |
|
ownerId, |
|
gameName, |
|
gameType, |
|
value, |
|
CreateScoreCallback, |
|
¶m |
|
); |
|
|
|
while (!param.complete) { |
|
NetClientUpdate(); |
|
AsyncSleep(10); |
|
} |
|
|
|
return param.result; |
|
} |
|
|
|
//============================================================================ |
|
// DeleteScore |
|
//============================================================================ |
|
ENetError pfGameScoreMgr::DeleteScore( |
|
unsigned scoreId |
|
) { |
|
NetWaitOp param; |
|
MemZero(¶m, sizeof(NetWaitOp)); |
|
|
|
NetCliAuthScoreDelete( |
|
scoreId, |
|
WaitOpCallback, |
|
¶m |
|
); |
|
|
|
while (!param.complete) { |
|
NetClientUpdate(); |
|
AsyncSleep(10); |
|
} |
|
|
|
return param.result; |
|
} |
|
|
|
//============================================================================ |
|
// GetScores |
|
//============================================================================ |
|
struct GetScoresOp : NetWaitOp |
|
{ |
|
pfGameScore*** scores; |
|
int* scoreCount; |
|
}; |
|
|
|
static void GetScoresCallback( |
|
ENetError result, |
|
void * param, |
|
const NetGameScore scores[], |
|
unsigned scoreCount |
|
) { |
|
GetScoresOp * op = (GetScoresOp*)param; |
|
op->result = result; |
|
|
|
if (IS_NET_SUCCESS(result)) { |
|
*(op->scores) = TRACKED_NEW pfGameScore*[scoreCount]; |
|
*(op->scoreCount) = scoreCount; |
|
|
|
for (int i = 0; i < scoreCount; ++i) { |
|
pfGameScore* score = TRACKED_NEW pfGameScore(); |
|
score->IncRef(); |
|
|
|
char tempGameName[kMaxGameScoreNameLength]; |
|
StrToAnsi(tempGameName, scores[i].gameName, arrsize(tempGameName)); |
|
|
|
score->Init( |
|
scores[i].scoreId, |
|
scores[i].ownerId, |
|
scores[i].createdTime, |
|
tempGameName, |
|
scores[i].gameType, |
|
scores[i].value |
|
); |
|
|
|
(*op->scores)[i] = score; |
|
} |
|
} |
|
else { |
|
*(op->scores) = nil; |
|
op->scoreCount = 0; |
|
} |
|
|
|
op->complete = true; |
|
} |
|
|
|
ENetError pfGameScoreMgr::GetScoresIncRef( |
|
unsigned ownerId, |
|
const char* gameName, |
|
pfGameScore**& outScoreList, |
|
int& outScoreListCount |
|
) { |
|
GetScoresOp param; |
|
MemZero(¶m, sizeof(GetScoresOp)); |
|
param.scores = &outScoreList; |
|
param.scoreCount = &outScoreListCount; |
|
|
|
NetCliAuthScoreGetScores( |
|
ownerId, |
|
gameName, |
|
GetScoresCallback, |
|
¶m |
|
); |
|
|
|
while (!param.complete) { |
|
NetClientUpdate(); |
|
AsyncSleep(10); |
|
} |
|
|
|
return param.result; |
|
} |
|
|
|
//============================================================================ |
|
// AddPoints |
|
//============================================================================ |
|
ENetError pfGameScoreMgr::AddPoints( |
|
unsigned scoreId, |
|
int numPoints |
|
) { |
|
NetWaitOp param; |
|
MemZero(¶m, sizeof(NetWaitOp)); |
|
|
|
NetCliAuthScoreAddPoints( |
|
scoreId, |
|
numPoints, |
|
WaitOpCallback, |
|
¶m |
|
); |
|
|
|
while (!param.complete) { |
|
NetClientUpdate(); |
|
AsyncSleep(10); |
|
} |
|
|
|
if (IS_NET_SUCCESS(param.result)) { |
|
if (GameScoreLink * link = fScores.Find(scoreId)) { |
|
link->score->value += numPoints; |
|
} |
|
} |
|
|
|
return param.result; |
|
} |
|
|
|
//============================================================================ |
|
// TransferPoints |
|
//============================================================================ |
|
ENetError pfGameScoreMgr::TransferPoints( |
|
unsigned srcScoreId, |
|
unsigned destScoreId, |
|
int numPoints |
|
) { |
|
NetWaitOp param; |
|
MemZero(¶m, sizeof(NetWaitOp)); |
|
|
|
NetCliAuthScoreTransferPoints( |
|
srcScoreId, |
|
destScoreId, |
|
numPoints, |
|
WaitOpCallback, |
|
¶m |
|
); |
|
|
|
while (!param.complete) { |
|
NetClientUpdate(); |
|
AsyncSleep(10); |
|
} |
|
|
|
if (IS_NET_SUCCESS(param.result)) { |
|
if (GameScoreLink * link = fScores.Find(srcScoreId)) { |
|
link->score->value -= numPoints; |
|
} |
|
if (GameScoreLink * link = fScores.Find(destScoreId)) { |
|
link->score->value += numPoints; |
|
} |
|
} |
|
|
|
return param.result; |
|
} |
|
|
|
//============================================================================ |
|
// SetPoints |
|
//============================================================================ |
|
ENetError pfGameScoreMgr::SetPoints( |
|
unsigned scoreId, |
|
int numPoints |
|
) { |
|
NetWaitOp param; |
|
MemZero(¶m, sizeof(NetWaitOp)); |
|
|
|
NetCliAuthScoreSetPoints( |
|
scoreId, |
|
numPoints, |
|
WaitOpCallback, |
|
¶m |
|
); |
|
|
|
while (!param.complete) { |
|
NetClientUpdate(); |
|
AsyncSleep(10); |
|
} |
|
|
|
if (IS_NET_SUCCESS(param.result)) { |
|
if (GameScoreLink * link = fScores.Find(scoreId)) { |
|
link->score->value = numPoints; |
|
} |
|
} |
|
|
|
return param.result; |
|
} |
|
|
|
//============================================================================ |
|
// GetRankList |
|
//============================================================================ |
|
|
|
struct GetRanksOp : NetWaitOp |
|
{ |
|
NetGameRank*** ranks; |
|
int* rankCount; |
|
}; |
|
|
|
static void GetRanksCallback( |
|
ENetError result, |
|
void * param, |
|
const NetGameRank ranks[], |
|
unsigned rankCount |
|
) { |
|
GetRanksOp * op = (GetRanksOp*)param; |
|
op->result = result; |
|
|
|
if (IS_NET_SUCCESS(result)) { |
|
*(op->ranks) = TRACKED_NEW NetGameRank*[rankCount]; |
|
*(op->rankCount) = rankCount; |
|
|
|
for (int i = 0; i < rankCount; ++i) { |
|
NetGameRank * rank = TRACKED_NEW NetGameRank; |
|
|
|
rank->rank = ranks[i].rank; |
|
rank->score = ranks[i].score; |
|
StrCopy(rank->name, ranks[i].name, arrsize(rank->name)); |
|
|
|
(*op->ranks)[i] = rank; |
|
} |
|
} |
|
else { |
|
*(op->ranks) = nil; |
|
op->rankCount = 0; |
|
} |
|
|
|
op->complete = true; |
|
} |
|
|
|
ENetError pfGameScoreMgr::GetRankList( |
|
unsigned ownerId, |
|
unsigned scoreGroup, |
|
unsigned parentFolderId, |
|
const char * gameName, |
|
unsigned timePeriod, |
|
unsigned numResults, |
|
unsigned pageNumber, |
|
bool sortDesc, |
|
NetGameRank**& outRankList, |
|
int& outRankListCount |
|
) { |
|
GetRanksOp param; |
|
MemZero(¶m, sizeof(GetRanksOp)); |
|
param.ranks = &outRankList; |
|
param.rankCount = &outRankListCount; |
|
|
|
NetCliAuthScoreGetRankList( |
|
ownerId, |
|
scoreGroup, |
|
parentFolderId, |
|
gameName, |
|
timePeriod, |
|
numResults, |
|
pageNumber, |
|
sortDesc, |
|
GetRanksCallback, |
|
¶m |
|
); |
|
|
|
while (!param.complete) { |
|
NetClientUpdate(); |
|
AsyncSleep(10); |
|
} |
|
|
|
return param.result; |
|
}
|
|
|