Einige Sachen sind nicht optimal , wenn nicht sogar grottenschlecht gelöst, aber es erfüllt seinen Zweck besser als die andern Scripts da draußen.
Ihr dürft gerne über die miserable Qualität lästern , jedoch wüsste ich nicht warum ich ein vollkommenes Produkt releasen sollte wenn ich eine Version davon hab mit der man Spaß am basteln haben kann :)
DATABASE:
dpTrans.cpp:
#ifdef __ARENA_SCORE
ON_MSG( PACKETTYPE_ARENA_UPDATE, OnSendArenaScore );
ON_MSG( PACKETTYPE_ARENA_GET, OnGetArenaScore );
#endif
#ifdef __ARENA_SCORE
void CDPTrans::OnGetArenaScore( CAr & ar, DPID dpid, DPID dpidCache, DPID dpidUser, LPBYTE lpBuf, u_long uBufSize )
{
LPDB_OVERLAPPED_PLUS lpDbOverlappedPlus = g_DbManager.AllocRequest();
g_DbManager.MakeRequest( lpDbOverlappedPlus, lpBuf, uBufSize );
lpDbOverlappedPlus->dpid = dpid;
lpDbOverlappedPlus->nQueryMode = LOAD_ARENASCORE;
PostQueuedCompletionStatus( g_DbManager.m_hIOCPPut, 1, NULL, &lpDbOverlappedPlus->Overlapped );
}
void CDPTrans::OnSendArenaScore( CAr & ar, DPID dpid, DPID dpidCache, DPID dpidUser, LPBYTE lpBuf, u_long uBufSize )
{
LPDB_OVERLAPPED_PLUS lpDbOverlappedPlus = g_DbManager.AllocRequest();
g_DbManager.MakeRequest( lpDbOverlappedPlus, lpBuf, uBufSize );
lpDbOverlappedPlus->dpid = dpid;
lpDbOverlappedPlus->nQueryMode = SAVE_ARENASCORE;
PostQueuedCompletionStatus( g_DbManager.m_hIOCPPut, 1, NULL, &lpDbOverlappedPlus->Overlapped );
}
void CDPTrans::SendArenaScore( u_long idPlayer, int nAkill, int nAdeath )
{
BEFORESENDDUAL( ar, PACKETTYPE_ARENA_GET, DPID_UNKNOWN, DPID_UNKNOWN );
ar << idPlayer << nAkill << nAdeath;
SEND( ar, this, DPID_ALLPLAYERS );
}
#endif
Alles anzeigen
dpTrans.h
#ifdef __ARENA_SCORE
void OnGetArenaScore( CAr & ar, DPID dpid, DPID dpidCache, DPID dpidUser, LPBYTE lpBuf, u_long uBufSize );
void OnSendArenaScore( CAr & ar, DPID dpid, DPID dpidCache, DPID dpidUser, LPBYTE lpBuf, u_long uBufSize );
void SendArenaScore( u_long idPlayer, int nAkill, int nAdeath );
#endif
DbManager.cpp
#ifdef __ARENA_SCORE
case LOAD_ARENASCORE:
LoadArenaScore( pQueryChar, lpDbOverlappedPlus );
break;
case SAVE_ARENASCORE:
SaveArenaScore( pQueryChar, lpDbOverlappedPlus );
break;
#endif
#ifdef __ARENA_SCORE
void CDbManager::LoadArenaScore( CQuery *qry, LPDB_OVERLAPPED_PLUS lpDbOverlappedPlus )
{
CAr arRead( lpDbOverlappedPlus->lpBuf, lpDbOverlappedPlus->uBufSize );
u_long nidPlayer;
int nArenaKills;
int nArenaDeaths;
arRead >> nidPlayer;
char szQuery[QUERY_SIZE] = {0,};
sprintf( szQuery, "uspLoadArena @serverindex='%02d', @idPlayer='%07d' ",g_appInfo.dwSys, nidPlayer ); //can add arguments directly %s %d..
//RUN QUERY
//RUN QUERY
if( FALSE == qry->Exec( szQuery ) )
{
WriteLog( "%s, %d\t%s", __FILE__, __LINE__, szQuery );
}
while( qry->Fetch() )
{
nArenaKills = qry->GetInt("nArenaKills");
nArenaDeaths = qry->GetInt("nArenaDeaths");
}
CDPTrans::GetInstance()->SendArenaScore( nidPlayer, nArenaKills, nArenaDeaths );
FreeRequest( lpDbOverlappedPlus );
}
void CDbManager::SaveArenaScore( CQuery *qry, LPDB_OVERLAPPED_PLUS lpDbOverlappedPlus )
{
CAr arRead( lpDbOverlappedPlus->lpBuf, lpDbOverlappedPlus->uBufSize );
u_long idPlayer;
int nArenaKills;
int nArenaDeaths;
BOOL bCreate;
arRead >> idPlayer >> nArenaKills >> nArenaDeaths >> bCreate;
char szQuery[250] = {0,};
if( !bCreate )
sprintf( szQuery, "uspSaveArena @serverindex='%02d', @idPlayer='%07d', @nArenaKills='%d', @nArenaDeaths='%d'", g_appInfo.dwSys, idPlayer, nArenaKills, nArenaDeaths );
else
sprintf( szQuery, "TRUNCATE TABLE dbo.ArenaScore");
if( FALSE == qry->Exec( szQuery ) )
{
WriteLog( "%s, %d\t%s", __FILE__, __LINE__, szQuery );
FreeRequest( lpDbOverlappedPlus );
return;
}
FreeRequest( lpDbOverlappedPlus );
}
#endif
Alles anzeigen
DbManager.h
#ifdef __ARENA_SCORE
,LOAD_ARENASCORE
,SAVE_ARENASCORE
#endif
#ifdef __ARENA_SCORE
void LoadArenaScore( CQuery *qry, LPDB_OVERLAPPED_PLUS lpDbOverlappedPlus );
void SaveArenaScore( CQuery *qry, LPDB_OVERLAPPED_PLUS lpDbOverlappedPlus );
#endif
CLIENT:
DpClient.cpp
#ifdef __ARENA_SCORE
#include "ArenaScoreClient.h"
extern CArenaScore g_ArenaScore;
#endif
#ifdef __ARENA_SCORE
case SNAPSHOTTYPE_ARENA_UPDATE: OnArenaUpdate( ar ); break;
#endif
#ifdef __ARENA_SCORE
void CDPClient::OnArenaUpdate( CAr & ar )
{
int nCount;
ar >> nCount;
g_ArenaScore.m_vecUserInfo.clear();
for( int i=0; i<nCount; i++)
{
ARENA_INFO tmpInfo;
ar.ReadString( tmpInfo.szName );
ar >> tmpInfo.nKills;
ar >> tmpInfo.nDeaths;
ar >> tmpInfo.nPoints;
ar >> tmpInfo.nKills2;
ar >> tmpInfo.nDeaths2;
ar >> tmpInfo.nLevel;
g_ArenaScore.m_vecUserInfo.push_back( tmpInfo );
}
}
#endif
Alles anzeigen
DPClient.h
#ifdef __ARENA_SCORE
void OnArenaUpdate( CAr & ar );
#endif
Neuz.cpp
#ifdef __ARENA_SCORE
m_pHeroIconArena = NULL;
#endif
#ifdef __ARENA_SCORE
m_pHeroIconArena = CWndBase::m_textureMng.AddTexture( g_Neuz.m_pd3dDevice, MakePath( DIR_ICON, "icon_ArenaMvp.png"), 0xffff00ff );
#endif
Neuz.h
#ifdef __ARENA_SCORE
CTexture* m_pHeroIconArena;
#endif
FuncTextCmd.cpp
#ifdef __ARENA_SCORE
#include "ArenaScoreWorld.h"
extern CArenaScore g_ArenaScore;
#endif
#endif // __WORLDSERVER
BOOL TextCmd_ArenaAllout( CScanner& scanner )
{
#ifdef __WORLDSERVER
#ifdef __ARENA_SCORE
g_ArenaScore.m_nRemainTime = ::timeGetTime();
g_ArenaScore.KickOut();
#endif
#endif
return TRUE;
}
#ifdef __ARENA_SCORE
ON_TEXTCMDFUNC( TextCmd_ArenaAllout, "AlloutArena", "aoa", "½Ã°£", "½Ã", TCM_SERVER, AUTH_GAMEMASTER , "½Ã°£ º¸±â [/½Ã°£]" )
#endif
WndWorld.cpp
#ifdef __ARENA_SCORE
#include "ArenaScoreClient.h"
extern CArenaScore g_ArenaScore;
#endif
#ifdef __ARENA_SCORE
g_ArenaScore.WorldDrawer(p2DRender);
#endif
#ifdef __ARENA_SCORE
if( nChar == VK_TAB )
g_ArenaScore.m_bDraw = !g_ArenaScore.m_bDraw;
#endif
Mover.cpp
#ifdef __ARENA_SCORE
#include "..\WORLDSERVER\ArenaScoreWorld.h"
extern CArenaScore g_ArenaScore;
#endif
#ifdef __WORLDSERVER
#ifdef __ARENA_SCORE
if( GetWorld()->IsArena() && IsPlayer() )
g_ArenaScore.ArenaOnKillHook((CUser*)pAttacker,(CUser*)this);
#endif // __ARENA_SCORE
#endif
MoverRender.cpp
#ifdef __ARENA_SCORE
#include "ArenaScoreClient.h"
extern CArenaScore g_ArenaScore;
#endif
#ifdef __ARENA_SCORE
//Arena Score
if( GetWorld()->IsArena() && !strcmp( m_szName , g_ArenaScore.m_vecUserInfo[0].szName) )
{
pTexture = g_Neuz.m_pHeroIconArena;
if( pTexture )
{
long oldpointx=point.x;
long oldpointy=point.y;
point.y -= pTexture->m_size.cy + 5;
point.y = point.y+1;
//point.x = point.x + 15;
if(pGuild==NULL)
{
point.x -= cs1.cx + 27;
}
else
{
if( cs1.cx > cs2.cx )
{
if(this->GetGuild()->m_dwLogo!=NULL)
{
point.x -= cs1.cx + 52;
}
else
{
point.x -= cs1.cx + 27;
}
}
else
{
if(this->GetGuild()->m_dwLogo!=NULL)
{
point.x -= cs2.cx + 52;
}
else
{
point.x -= cs2.cx + 27;
}
}
}
pTexture->Render( &g_Neuz.m_2DRender, point );
point.x=oldpointx;
point.y=oldpointy;
}
}
#endif
Alles anzeigen
Worldserver:
DPDatabaseClient.cpp
#ifdef __ARENA_SCORE
#include "ArenaScoreWorld.h"
extern CArenaScore g_ArenaScore;
#endif
#ifdef __ARENA_SCORE
ON_MSG( PACKETTYPE_ARENA_GET, OnGetArenaScore );
#endif
#ifdef __ARENA_SCORE // SendArenaUpdate
if( pUser->m_nArenaKills || pUser->m_nArenaDeaths ) // Override fix.
g_dpDBClient.SendArenaScore( pUser->m_idPlayer, pUser->m_nArenaKills, pUser->m_nArenaDeaths );
#endif
#ifdef __ARENA_SCORE
void CDPDatabaseClient::OnGetArenaScore( CAr & ar, DPID, DPID )
{
u_long idPlayer;
int nKills,nDeaths;
ar >> idPlayer >> nKills >> nDeaths;
CUser* pUser = g_UserMng.GetUserByPlayerID( idPlayer );
if(IsValidObj(pUser))
{
pUser->m_nArenaKills = nKills;
pUser->m_nArenaDeaths = nDeaths;
//g_UserMng.AddArenaUpdateSingleUser( pUser ); // Send User joined to other Clients.
}
}
void CDPDatabaseClient::SendArenaScore( u_long idPlayer, int nAkill , int nAdeath, BOOL bCreate )
{
BEFORESENDDUAL( ar, PACKETTYPE_ARENA_UPDATE, DPID_UNKNOWN, DPID_UNKNOWN );
ar << idPlayer << nAkill << nAdeath << bCreate;
SEND( ar, this, DPID_SERVERPLAYER );
}
void CDPDatabaseClient::GetArenaScore( u_long idPlayer )
{
BEFORESENDDUAL( ar, PACKETTYPE_ARENA_GET, DPID_UNKNOWN, DPID_UNKNOWN );
ar << idPlayer;
SEND( ar, this, DPID_SERVERPLAYER );
}
#endif
Alles anzeigen
DPServer.cpp
#ifdef __ARENA_SCORE
#include "ArenaScoreWorld.h"
extern CArenaScore g_ArenaScore;
#endif
ThreadMng.cpp
#ifdef __ARENA_SCORE
#include "ArenaScoreWorld.h"
extern CArenaScore g_ArenaScore;
#endif
#ifdef __ARENA_SCORE
g_ArenaScore.Process();
#endif
User.cpp
#ifdef __ARENA_SCORE
#include "ArenaScoreWorld.h"
extern CArenaScore g_ArenaScore;
#endif
#ifdef __ARENA_SCORE
m_nArenaKills = 0;
m_nArenaKills2 = 0;
m_nArenaPoints = 0;
m_nArenaDeaths = 0;
m_nArenaDeaths2 = 0;
m_nArenaIndex = NULL_ID;
#endif
#ifdef __ARENA_SCORE
if( GetWorld()->IsArena() ) // This hook fixes the Score and ID of the player no matter where they are
if( !g_ArenaScore.IsArenaUser( this ) )
{
g_ArenaScore.ArenaOnJoin( this ); // or how they got into thr Arena.
}
if( !GetWorld()->IsArena() )
if( g_ArenaScore.IsArenaUser( this ) )
{
g_ArenaScore.ArenaOnExit( this );
}
#endif
Alles anzeigen
#ifdef __ARENA_SCORE
void CUserMng::AddArenaUpdate()
{
CAr arBlock;
arBlock << NULL_ID << SNAPSHOTTYPE_ARENA_UPDATE;
arBlock << g_ArenaScore.m_vecUserInfo.size();
for( DWORD i = 0; i < g_ArenaScore.m_vecUserInfo.size(); i++ )
{
arBlock.WriteString( g_ArenaScore.m_vecUserInfo[i].szName );
arBlock << g_ArenaScore.m_vecUserInfo[i].nKills;
arBlock << g_ArenaScore.m_vecUserInfo[i].nDeaths;
arBlock << g_ArenaScore.m_vecUserInfo[i].nPoints;
arBlock << g_ArenaScore.m_vecUserInfo[i].nKills2;
arBlock << g_ArenaScore.m_vecUserInfo[i].nDeaths2;
arBlock << g_ArenaScore.m_vecUserInfo[i].nLevel;
}
GETBLOCK( arBlock, lpBlock, uBlockSize );
for( DWORD i = 0; i < g_ArenaScore.m_vecUserInfo.size(); i++ )
{
CUser* pUserReceive = prj.GetUser(g_ArenaScore.m_vecUserInfo[i].dwID);
if( !pUserReceive )
continue;
pUserReceive->AddBlock( lpBlock, uBlockSize );
}
}
void CUserMng::GetArenaUsers()
{
if( ::timeGetTime() > g_ArenaScore.m_nRejoinTime + 2000 )
{
map<DWORD, CUser*>::iterator it;
for( it = m_users.begin(); it != m_users.end(); ++it )
{
CUser* pUser = it->second;
if( !pUser->IsValid() )
continue;
if( pUser->GetWorld()->IsArena() )
g_ArenaScore.NewUser( pUser );
}
}
}
#endif
Alles anzeigen
#ifdef __ARENA_SCORE
if( g_ArenaScore.IsArenaUser( pUser ) )
{
g_ArenaScore.ArenaOnExit( pUser );
DestroyPlayer( pUser );
return;
}
#endif
DatabaseClient.h
#ifdef __ARENA_SCORE
// Arena
void SendArenaScore( u_long idPlayer, int nAkill , int nAdeath, BOOL bCreate = FALSE );
void GetArenaScore( u_long idPlayer );
void OnGetArenaScore( CAr & ar, DPID, DPID );
#endif
User.h
#ifdef __ARENA_SCORE
public:
//Arena Score
int m_nArenaKills;
int m_nArenaKills2;
int m_nArenaPoints;
int m_nArenaDeaths;
int m_nArenaDeaths2;
int m_nArenaIndex;
#endif
Alles anzeigen
#ifdef __ARENA_SCORE
void AddArenaUpdate();
void GetArenaUsers();
#endif
KernDateien:
File-Upload.net - ArenaCore.rar
Ich gebe keine Garantie auf die Richtigkeit der Codebausteine noch garantiere ich das davon alles in dem eigentlichen Script verwendet wird.
Dies ist eine ungecleante und veraltete Version des eigentlichen Codes und wurde nie über einen längeren Zeitraum verwendet.
Jeder der sich NICHT mit dem Source Code ansatzweise auskennt sollte die Finger hiervon lassen.
Credits :
99.9% Pumaaa ( Recode )
0.01% lol32/caja ( Arena ~ Original Code )
SCREEN