i <3 C++
- Joined
- Jun 4, 2005
- Messages
- 383
- Reaction score
- 100
what do you mean by no luck you have some errors? or...
Join our community of MMO enthusiasts and game developers! By registering, you'll gain access to discussions on the latest developments in MMO server files and collaborate with like-minded individuals. Join us today and unlock the potential of MMO server development!
Join Today!what do you mean by no luck you have some errors? or...
fail. xDIt means he can't make it work without crash(or add it to the source /ridi).
Also DB save part is easy to make(Using the example pieces of Pumbaaa or doing it with another, the most easy way).
sprintf( szQuery, "[B]uspLoadArena[/B] @serverindex='%02d', @idPlayer='%07d' ",g_appInfo.dwSys, nidPlayer ); //can add arguments directly %s %d.. //RUN QUERY
sprintf( szQuery, "[B]uspSaveArena[/B] @serverindex='%02d', @idPlayer='%07d', @nArenaKills='%d', @nArenaDeaths='%d'", g_appInfo.dwSys, idPlayer, nArenaKills, nArenaDeaths );
sprintf( szQuery, "TRUNCATE TABLE [B]dbo.ArenaScore[/B]");
CREATE proc [dbo].[uspLoadArena] @serverindex char(2), @idPlayer char(7) as set nocount on Select serverindex, m_idPlayer, nArenaKills, nArenaDeaths from [B][COLOR=#ff0000]ArenaScore[/COLOR][/B] with (nolock) where serverindex = @serverindex and m_idPlayer = @m_idPlayer
CREATE proc [dbo].[uspSaveArena] @serverindex char(2), @idPlayer char(7), @nArenaKills int, @nArenaDeaths int as set nocount on set xact_abort on update [B][COLOR=#ff0000]ArenaScore[/COLOR][/B] set nArenaKills = @nArenaKills, nArenaDeaths = @nArenaDeaths where serverindex = @serverindex and m_idPlayer = @m_idPlayer
CREATE TABLE [dbo].[ArenaScore]( [serverindex] [char](2) NULL, [m_idPlayer] [char](7) NULL, [nArenaKills] [int] NULL, [nArenaDeaths] [int] NULL )
One thing that people might want to change with this system is, when a player logs out INSIDE the arena, they stay in the list and are marked as another person inside the arena while offline. When logging off make it so that it removes them from the scoreboard. Any easy fix (in my head, havent tried it) would probably be to make it so that when any player logs off within the arena, edit the savecharacter procedure and make it save them in Flaris and remove them from the scoreboard.
#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
CREATE proc [dbo].[uspSaveArena] @serverindex char(2), @idPlayer char(7), @nArenaKills int, @nArenaDeaths int as set nocount on set xact_abort on update ArenaScore set nArenaKills = @nArenaKills, nArenaDeaths = @nArenaDeaths where serverindex = @serverindex and m_idPlayer = @m_idPlayer
i dont know i just look in the dbmanager.cpp@Alemap
You can't update a table if there is nothing to edit.
And why this TRUNCATE TABLE dbo.ArenaScore
Uh, deleting the table?
#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
[B] sprintf( szQuery, "TRUNCATE TABLE dbo.ArenaScore");[/B]
if( FALSE == qry->Exec( szQuery ) )
{
WriteLog( "%s, %d\t%s", __FILE__, __LINE__, szQuery );
FreeRequest( lpDbOverlappedPlus );
return;
}
FreeRequest( lpDbOverlappedPlus );
}
#endif
GO
/****** Object: Table [dbo].[ArenaScore] Script Date: 05/04/2012 14:16:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[ArenaScore](
[idPlayer] [char](7) NOT NULL,
[nArenaKills] [int] NULL,
[nArenaDeaths] [int] NULL,
[serverindex] [int] NULL,
CONSTRAINT [PK_ArenaScore] PRIMARY KEY CLUSTERED
(
[idPlayer] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
USE [CHARACTER_01_DBF]
GO
/****** Object: StoredProcedure [dbo].[uspLoadArena] Script Date: 05/04/2012 14:17:25 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[uspLoadArena]
@serverindex char(2),
@idPlayer char(7)
AS
SET NOCOUNT ON
BEGIN
IF EXISTS ( SELECT idPlayer, nArenaKills, nArenaDeaths FROM ArenaScore WHERE idPlayer =@idPlayer AND serverindex=@serverindex )
BEGIN
SELECT idPlayer, nArenaKills, nArenaDeaths FROM ArenaScore
WHERE idPlayer =@idPlayer
AND serverindex=@serverindex
END
ELSE BEGIN
INSERT INTO ArenaScore VALUES( @idPlayer, '0', '0', @serverindex )
SELECT idPlayer , nArenaKills, nArenaDeaths FROM ArenaScore
WHERE idPlayer =@idPlayer
AND serverindex=@serverindex
END
END
RETURN
SET NOCOUNT OFF
GO
USE [CHARACTER_01_DBF]
GO
/****** Object: StoredProcedure [dbo].[uspSaveArena] Script Date: 05/04/2012 14:17:56 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[uspSaveArena]
@serverindex char(2),
@idPlayer char(7),
@nArenaKills int,
@nArenaDeaths int
AS
SET NOCOUNT ON
BEGIN
IF EXISTS ( SELECT * FROM dbo.ArenaScore WHERE serverindex=@serverindex AND idPlayer=@idPlayer )
BEGIN
UPDATE ArenaScore SET nArenaKills=@nArenaKills,nArenaDeaths=@nArenaDeaths
WHERE serverindex=@serverindex AND idPlayer=@idPlayer
END
ELSE BEGIN
INSERT INTO ArenaScore VALUES( @idPlayer, @nArenaKills, @nArenaDeaths, @serverindex )
END
END
RETURN
SET NOCOUNT OFF
GO
ArenaScore
Code:GO /****** Object: Table [dbo].[ArenaScore] Script Date: 05/04/2012 14:16:02 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[ArenaScore]( [idPlayer] [char](7) NOT NULL, [nArenaKills] [int] NULL, [nArenaDeaths] [int] NULL, [serverindex] [int] NULL, CONSTRAINT [PK_ArenaScore] PRIMARY KEY CLUSTERED ( [idPlayer] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO
LoadArena
Code:USE [CHARACTER_01_DBF] GO /****** Object: StoredProcedure [dbo].[uspLoadArena] Script Date: 05/04/2012 14:17:25 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[uspLoadArena] @serverindex char(2), @idPlayer char(7) AS SET NOCOUNT ON BEGIN IF EXISTS ( SELECT idPlayer, nArenaKills, nArenaDeaths FROM ArenaScore WHERE idPlayer =@idPlayer AND serverindex=@serverindex ) BEGIN SELECT idPlayer, nArenaKills, nArenaDeaths FROM ArenaScore WHERE idPlayer =@idPlayer AND serverindex=@serverindex END ELSE BEGIN INSERT INTO ArenaScore VALUES( @idPlayer, '0', '0', @serverindex ) SELECT idPlayer , nArenaKills, nArenaDeaths FROM ArenaScore WHERE idPlayer =@idPlayer AND serverindex=@serverindex END END RETURN SET NOCOUNT OFF GO
Save Arena
Code:USE [CHARACTER_01_DBF] GO /****** Object: StoredProcedure [dbo].[uspSaveArena] Script Date: 05/04/2012 14:17:56 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[uspSaveArena] @serverindex char(2), @idPlayer char(7), @nArenaKills int, @nArenaDeaths int AS SET NOCOUNT ON BEGIN IF EXISTS ( SELECT * FROM dbo.ArenaScore WHERE serverindex=@serverindex AND idPlayer=@idPlayer ) BEGIN UPDATE ArenaScore SET nArenaKills=@nArenaKills,nArenaDeaths=@nArenaDeaths WHERE serverindex=@serverindex AND idPlayer=@idPlayer END ELSE BEGIN INSERT INTO ArenaScore VALUES( @idPlayer, @nArenaKills, @nArenaDeaths, @serverindex ) END END RETURN SET NOCOUNT OFF GO
Enjoy...
ArenaScore
LoadArenaCode:GO /****** Object: Table [dbo].[ArenaScore] Script Date: 05/04/2012 14:16:02 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[ArenaScore]( [idPlayer] [char](7) NOT NULL, [nArenaKills] [int] NULL, [nArenaDeaths] [int] NULL, [serverindex] [int] NULL, CONSTRAINT [PK_ArenaScore] PRIMARY KEY CLUSTERED ( [idPlayer] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO SET ANSI_PADDING OFF GO
Save ArenaCode:USE [CHARACTER_01_DBF] GO /****** Object: StoredProcedure [dbo].[uspLoadArena] Script Date: 05/04/2012 14:17:25 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[uspLoadArena] @serverindex char(2), @idPlayer char(7) AS SET NOCOUNT ON BEGIN IF EXISTS ( SELECT idPlayer, nArenaKills, nArenaDeaths FROM ArenaScore WHERE idPlayer =@idPlayer AND serverindex=@serverindex ) BEGIN SELECT idPlayer, nArenaKills, nArenaDeaths FROM ArenaScore WHERE idPlayer =@idPlayer AND serverindex=@serverindex END ELSE BEGIN INSERT INTO ArenaScore VALUES( @idPlayer, '0', '0', @serverindex ) SELECT idPlayer , nArenaKills, nArenaDeaths FROM ArenaScore WHERE idPlayer =@idPlayer AND serverindex=@serverindex END END RETURN SET NOCOUNT OFF GO
Enjoy...Code:USE [CHARACTER_01_DBF] GO /****** Object: StoredProcedure [dbo].[uspSaveArena] Script Date: 05/04/2012 14:17:56 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[uspSaveArena] @serverindex char(2), @idPlayer char(7), @nArenaKills int, @nArenaDeaths int AS SET NOCOUNT ON BEGIN IF EXISTS ( SELECT * FROM dbo.ArenaScore WHERE serverindex=@serverindex AND idPlayer=@idPlayer ) BEGIN UPDATE ArenaScore SET nArenaKills=@nArenaKills,nArenaDeaths=@nArenaDeaths WHERE serverindex=@serverindex AND idPlayer=@idPlayer END ELSE BEGIN INSERT INTO ArenaScore VALUES( @idPlayer, @nArenaKills, @nArenaDeaths, @serverindex ) END END RETURN SET NOCOUNT OFF GO
it won't actually update the database at all with new info, when ever someone is killed or i kill someone it just leaves all points at 0, no changes in numbered position or anything