[Source Release] Jobauswahl bei Character Create

07/21/2011 03:31 yannickminecraft#1
Hier erkläre ich euch wie ihr im Source eine Jobauswahl beim Character erstellen einbaut.

../NEUZ/Versioncommon.h

Tragt hier im oberen bereich einfach dies ein:
Code:
#define __JOB_CREATE_CHAR
../_Interface/WndTitle.cpp

Hier geht ihr in die Function
Code:
void CWndCreateChar::OnInitialUpdate()
und trägt unter
Code:
CWndNeuz::OnInitialUpdate();
Diesen code ein:

Code:
#ifdef __JOB_CREATE_CHAR
	m_Player.m_byJob = JOB_MERCENARY;
	CWndComboBox* pWndJobBox = ( CWndComboBox* )GetDlgItem( WIDC_COMBOBOX1 );
	pWndJobBox->AddString("Mercenary");//Edit by yannickmama
	pWndJobBox->AddString("Acrobat");
	pWndJobBox->AddString("Assist");
	pWndJobBox->AddString("Magician");
	pWndJobBox->AddWndStyle( EBS_READONLY );
	pWndJobBox->SetCurSel( 0 );
#endif //__JOB_CREATE_CHAR
In der gleichen Datei springen wir zu dieser function
Code:
BOOL CWndCreateChar::OnChildNotify( UINT message, UINT nID, LRESULT* pLResult )
und suchen diese zeile:
Code:
		case WIDC_OK: // Create
			{
Darunter tragen wir dies ein:

Code:
#ifdef __JOB_CREATE_CHAR
				CWndComboBox* pWndJobBox = ( CWndComboBox* )GetDlgItem( WIDC_COMBOBOX1 );
				assert( pWndJobBox );

				if( pWndJobBox->GetCurSel() == -1 )
				{
					g_WndMng.OpenMessageBox( "Bitte wählen Sie einen Job" );
				return TRUE;
				}

				switch( pWndJobBox->GetCurSel() )
				{
				case 0:
				m_Player.m_byJob = JOB_MERCENARY;
				break;
				case 1:
				m_Player.m_byJob = JOB_ACROBAT;
				break;
				case 2:
				m_Player.m_byJob = JOB_ASSIST;
				break;
				case 3:
				m_Player.m_byJob = JOB_MAGICIAN;
				break;
				default:
				m_Player.m_byJob = JOB_MERCENARY;
				break;
				}
#endif //__JOB_CREATE_CHAR

../databaseserver/versioncommon.h

Dort tragen wir irgendwo oben dies ein
Code:
#define __JOB_CREATE_CHAR
../_Database/DbManager.cpp

Dort gehen wir zu der Function
Code:
void CDbManager::CreatePlayer( CQuery *qry, LPDB_OVERLAPPED_PLUS lpDbOverlappedPlus )
und suchen nach
Code:
pd.data.nJob = 0;
und ersetzen es durch
Code:
#ifdef __JOB_CREATE_CHAR
			pd.data.nJob = nJob;
#else //__JOB_CREATE_CHAR
			pd.data.nJob = 0;
#endif //__JOB_CREATE_CHAR

So das wäre schonmal das zeugs für den Source.

Wir müssen aber jetzt noch die Datenbank bearbeiten deswegen gehen wir zur Datenbank CHARACTER_01_DBF in die Stored Procedure CHARACTER_STR
und suchen dort
Code:
			       FROM BASE_VALUE_TBL
				 WHERE g_nSex 								= @im_dwSex
und ersetzen es durch

Code:
			       FROM BASE_VALUE_TBL
				 WHERE g_nSex 								= @im_dwSex AND
						m_nJob								= @im_nJob
Nachdem ihr dies alles getan habt könnt ihr in der BASE_VALUE_TBL in der CHARACTER_01_DBF die Einträge für weitere Jobs tätigen.

Ihr müsst dabei nur darauf achten das nJob und g_nSex passt. Immer zwei einträge für g_nSex = 0 und g_nSex = 1 erstellen.

Ihr müsst aber in der Character_STR noch einträge (einfach unter der Selectierung der BASE_VALUE_TBL) für die SKILLINFLUENCE_TBL hinzufügen.
Diese ist dazu da um den Server zu sagen welche Skills dein Character skillen kann.
Habe die leider nichtmehr und bin zu faul das jetzt wieder zu machen :'D
07/21/2011 06:30 MysticAngelz#2
Nice hab gerade keine Zeit es auszuprobieren THX bekommst du trozdem
07/21/2011 08:26 Karamelleis#3
is der Char dann lvl 1 und Merc, etc.?
07/21/2011 09:48 Sedrika#4
ohne character str is das nutzlos xd und wozu base value nutzen xd ?

ich post die charstr mal ohne fehler wenn ich zu haus bin...

Edit: Sry, ich habs mir anders überlegt.
07/21/2011 12:52 yannickminecraft#5
Quote:
Originally Posted by Sedrika View Post
ohne character str is das nutzlos xd und wozu base value nutzen xd ?
Wieso nutzen wir die PropSkill? Hardcoden wir doch alles WEHYA!!!

Sei mal bisschen Flexibel. Damit können wir individuel jedem Job ein passendes Equiment, Level, Items, Hp, Mp, FP, Spawnplatz, Spawnworld und sonst noch was so anliegt geben.
07/21/2011 12:54 Sedrika#6
Quote:
Originally Posted by yannickminecraft View Post
Wieso nutzen wir die PropSkill? Hardcoden wir doch alles WEHYA!!!

Sei mal bisschen Flexibel. Damit können wir individuel jedem Job ein passendes Equiment, Level, Items, Hp, Mp, FP, Spawnplatz, Spawnworld und sonst noch was so anliegt geben.
Schon yoah, jedoch geht das auch direkt ohne base value, zudem kann man da noch mehr hinzufügen xD

Meld dich mal in ICQ xD
07/21/2011 13:07 Kurosaki'#7
Bei mir findet er
Code:
 pd.data.nJob = 0;
nicht o:
Also ich sehe nur
Code:
 //			pd.nJob	= 0;
^^
07/21/2011 13:20 Sedrika#8
Quote:
Originally Posted by Divine. View Post
Bei mir findet er
Code:
 pd.data.nJob = 0;
nicht o:
Also ich sehe nur
Code:
 //            pd.nJob    = 0;
^^
Hier, das mussu finden:
Quote:
#ifdef __CREATE_JOB
pd.data.nJob = nJob;
#endif // __CREATE_JOB
// pd.nJob = 0;
// pd.dwState = 0;
pd.data.nLevel = 1;
pd.data.nSex = nSex;
pd.data.nVer = 1;
07/21/2011 13:32 yannickminecraft#9
Quote:
Originally Posted by Sedrika View Post
Schon yoah, jedoch geht das auch direkt ohne base value, zudem kann man da noch mehr hinzufügen xD

Meld dich mal in ICQ xD


Natürlich geht das direkt. Hast wohl nicht meine Anspielung mit den propSkill bezüglich des Hardcodens bemerkt?
Dann halt nochmal ganz langsam.

Ich kann den Wert @im_nJob auch direkt eintragen das ist mir bewusst. Aber wenn ich die Base_Value_TBL benutze bin ich viel flexibler und kann leichter änderungen vornehmen / hinzufügen.

Das wäre sozusagen mit dem Hardcoden der propSkills gleichzustellen.


//Für die Leecher geilen. Heute im laufe des Tages werd ich noch das Colosseum komplett fertig mit allen drum und dran releasen.
07/21/2011 17:55 Kurosaki'#10
Ich seh nur das hier
Code:
#if __VER >= 11 // __SYS_PLAYER_DATA
			PlayerData pd;
//			pd.nJob	= 0;
//			pd.dwState	= 0;
			pd.data.nLevel	= 1;
			pd.data.nSex	= nSex;
			pd.data.nVer	= 1;
			lstrcpy( pd.szPlayer, lpDbOverlappedPlus->AccountInfo.szPlayer );
			PlayerData* pPlayerData		= CPlayerDataCenter::GetInstance()->AddPlayerData( nidPlayer, pd );
#else	// __SYS_PLAYER_DATA;
O:
07/21/2011 18:06 ~Product~#11
Quote:
Originally Posted by Divine. View Post
Ich seh nur das hier
Code:
#if __VER >= 11 // __SYS_PLAYER_DATA
			PlayerData pd;
[COLOR="Red"]//			pd.nJob	= 0;[/COLOR]
//			pd.dwState	= 0;
			pd.data.nLevel	= 1;
			pd.data.nSex	= nSex;
			pd.data.nVer	= 1;
			lstrcpy( pd.szPlayer, lpDbOverlappedPlus->AccountInfo.szPlayer );
			PlayerData* pPlayerData		= CPlayerDataCenter::GetInstance()->AddPlayerData( nidPlayer, pd );
#else	// __SYS_PLAYER_DATA;
O:
da
07/21/2011 19:22 Kurosaki'#12
Ich habe noch ein Problem (:
In der DB unter Character_STR
Hab das hier
Code:
 			       FROM BASE_VALUE_TBL
				 WHERE g_nSex 								= @im_dwSex
In das hier geändert
Code:
 FROM BASE_VALUE_TBL
				 WHERE g_nSex 								= @im_dwSex AND
						m_nJob
Aber ich bekomme diesen Error hier
Code:
 Meldung 4145, Ebene 15, Status 1, Prozedur CHARACTER_STR, Zeile 1188
In der Nähe von 'INSERT' wurde ein nicht boolescher Ausdruck in einem Kontext angegeben, in dem eine Bedingung erwartet wird.
07/21/2011 19:32 Soralein#13
Quote:
Originally Posted by Divine. View Post
Ich habe noch ein Problem (:
In der DB unter Character_STR
Hab das hier
Code:
 			       FROM BASE_VALUE_TBL
				 WHERE g_nSex 								= @im_dwSex
In das hier geändert
Code:
 FROM BASE_VALUE_TBL
				 WHERE g_nSex 								= @im_dwSex AND
						m_nJob
Da fehlt doch auch was ö.ö
Im ersten Post steht doch
Code:
  FROM BASE_VALUE_TBL
				 WHERE g_nSex 								= @im_dwSex AND
						m_nJob								[COLOR="Red"]= @im_nJob[/COLOR]
07/21/2011 21:31 Kurosaki'#14
Nun hab ich nochmal ein Problem :x xD
Wenn ich mir ein Char erstellen will, stürzt der Client ab, wenn man auf Create drückt oder sowas ^^
07/21/2011 23:33 yannickminecraft#15
Quote:
Originally Posted by Divine. View Post
Nun hab ich nochmal ein Problem :x xD
Wenn ich mir ein Char erstellen will, stürzt der Client ab, wenn man auf Create drückt oder sowas ^^
Error log.