). Außerdem weiß ich das es bereits einen Job Change gibt dieser aber nicht mit der V15 Version funktioniert deswegen werde ich nun noch einen anderen Vorstellen.Was wird benötigt:

Änderungen im Source:
MsgHdr.h :
DPClient.cpp:
DPClient.h
DPSrvr.cpp:
DPSrvr.h:
Mover.cpp:
Mover.h:
MoverParam.cpp:
WndManager.h:
VersionCommon.h (in Neuz & Worldserver):
Fügen wir nun die WndChangeJobEx.cpp & WndChangeJobEx.h zum Projekt hinzu. Dafür kopieren wir die 2 Dateien in das Folgendes Verzeichnis: \Source\_Interface\ . Danach fügen wir die Dateien in VS zum Projekt hinzu:
Sucht nach:
Drunter fügt ihr folgendes ein:
Sollte dann so aussehen:
Code:
PACKETTYPE_QUERYMAILBOX_COUNT
Code:
#ifdef __INSTANT_JOBCHANGE #define PACKETTYPE_UPDATE_JOB (DWORD)0x88100245 #endif //__INSTANT_JOBCHANGE
DPClient.cpp:
Geht bis zum Ende und fügt vor:
Das ein:
Sollte dann so aussehen:
Code:
CDPClient g_DPlay;
Code:
#ifdef __INSTANT_JOBCHANGE
void CDPClient::UpdateJob(int nJob, int nLevel)
{
BEFORESENDSOLE(ar, PACKETTYPE_UPDATE_JOB, DPID_UNKNOWN);
ar << nJob << nLevel;
SEND(ar, this, DPID_SERVERPLAYER);
}
#endif //__INSTANT_JOBCHANGE
DPClient.h
Sucht nach:
Fügt darunter ein:
Sollte dann so aussehen:
Code:
OnSetDuel( OBJID objid, CAr & ar )
Code:
#ifdef __INSTANT_JOBCHANGE void UpdateJob( int nJob, int nLevel ); #endif //__INSTANT_JOBCHANGE
DPSrvr.cpp:
Sucht nach:
Fügt darunter ein:
Geht nun zum Ende der .cpp und fügt folgendes ein:
Sollte dann so aussehen:
Und So:
Code:
__GUILD_HOUSE_MIDDLE
Code:
#ifdef __INSTANT_JOBCHANGE ON_MSG( PACKETTYPE_UPDATE_JOB, &CDPSrvr::OnUpdateJob ); #endif //__INSTANT_JOBCHANGE
Code:
#ifdef __INSTANT_JOBCHANGE
void CDPSrvr::OnUpdateJob( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE, u_long )
{
try
{
CUser* pUser = g_UserMng.GetUser( dpidCache, dpidUser );
if( IsValidObj( pUser ) == TRUE )
{
int nJob, nLevel;
ar >> nJob >> nLevel;
if( pUser->m_nJob >= nJob )
return;
if( nJob < MAX_EXPERT && pUser->m_nLevel != 15 )
return;
else if( nJob >= MAX_EXPERT && nJob < MAX_PROFESSIONAL && pUser->m_nLevel != 60 )
return;
else if( nJob >= MAX_PROFESSIONAL && nJob < MAX_HERO && pUser->m_nLevel != 120 && pUser->GetExpPercent() != 9999 )
return;
else if( nJob >= MAX_HERO && pUser->m_nLevel != 129 && pUser->GetExpPercent() != 9999 )
return;
pUser->InitLevelJobChange( nJob, nLevel, TRUE );
}
}
catch(...)
{
Error("Exception caught in File %s on line %d", __FILE__, __LINE__);
}
}
#endif //__INSTANT_JOBCHANGE
Und So:
DPSrvr.h:
Ihr sucht nach:
Fügt darunter das ein:
Sollte dann so aussehen:
Code:
OnEnchant( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE lpBuf, u_long uBufSize)
Code:
#ifdef __INSTANT_JOBCHANGE void OnUpdateJob(CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE, u_long); #endif //__INSTANT_JOBCHANGE
Mover.cpp:
Ihr sucht nach:
und fügt darunter ein:
Sollte dann so aussehen:
Code:
__HONORABLE_TITLE
Code:
#ifdef __INSTANT_JOBCHANGE
void CMover::InitLevelJobChange(int nJob, LONG nLevel, BOOL bGamma)
{
#ifdef __WORLDSERVER
// ¿î¿µÀÚ ¸í·ÉÀ¸·Î ·¹º§¾÷ Çϴ°÷ÀÓ
MoverProp* pProp = GetProp();
if (pProp)
{
#ifdef __NEW_CLASSES
if (nJob > 0 && nJob < MAX_LEGEND_HERO)
{
AddChangeJob(nJob);
}
else {
return;
}
#else
if (nJob > 0 && nJob < MAX_HERO)
{
AddChangeJob(nJob);
}
else {
return;
}
#endif // __NEW_CLASSES
int nPoint = 0;
if (m_nJob == JOB_MERCENARY)
nPoint += 40;
else if (m_nJob == JOB_ACROBAT)
nPoint += 50;
else if (m_nJob == JOB_ASSIST)
nPoint += 60;
else if (m_nJob == JOB_MAGICIAN)
nPoint += 90;
else if (m_nJob == JOB_KNIGHT || m_nJob == JOB_BLADE)
nPoint += 120;
else if (m_nJob == JOB_JESTER || m_nJob == JOB_RANGER)
nPoint += 150;
else if (m_nJob == JOB_RINGMASTER)
nPoint += 160;
else if (m_nJob == JOB_BILLPOSTER || m_nJob == JOB_PSYCHIKEEPER)
nPoint += 180;
else if (m_nJob == JOB_ELEMENTOR)
nPoint += 390;
AddSkillPoint(nPoint);
m_nLevel = nLevel;
SetJobLevel(nLevel, nJob);
m_nDeathLevel = nLevel;
#if __VER >= 10 // __LEGEND // 10Â÷ Àü½Â½Ã½ºÅÛ Neuz, World, Trans
if (IsMaster())
{
int dwTmpSkLevel = 1;//60, 72, 84, 96, 108
if (nLevel > 59 && nLevel < 72)
dwTmpSkLevel = 1;
else if (nLevel > 71 && nLevel < 84)
dwTmpSkLevel = 2;
else if (nLevel > 83 && nLevel < 96)
dwTmpSkLevel = 3;
else if (nLevel > 95 && nLevel < 108)
dwTmpSkLevel = 4;
else if (nLevel > 107 && nLevel < 120)
dwTmpSkLevel = 5;
for (int i = 0; i < MAX_SKILL_JOB; i++)
{
LPSKILL lpSkill = &(m_aJobSkill[i]);
if (lpSkill && lpSkill->dwSkill != NULL_ID)
{
ItemProp* pSkillProp = prj.GetSkillProp(lpSkill->dwSkill);
if (pSkillProp == NULL)
continue;
if (pSkillProp->dwItemKind1 != JTYPE_MASTER)
continue;
lpSkill->dwLevel = dwTmpSkLevel;
}
}
}
else if (IsHero())
{
for (int i = 0; i < MAX_SKILL_JOB; i++)
{
LPSKILL lpSkill = &(m_aJobSkill[i]);
if (lpSkill && lpSkill->dwSkill != NULL_ID)
{
ItemProp* pSkillProp = prj.GetSkillProp(lpSkill->dwSkill);
if (pSkillProp == NULL)
continue;
if (pSkillProp->dwItemKind1 != JTYPE_MASTER)
continue;
lpSkill->dwLevel = 5;
}
}
}
#endif // __LEGEND // 10Â÷ Àü½Â½Ã½ºÅÛ Neuz, World, Trans
if (bGamma)
{
m_nExp1 = 0;
}
((CUser*)this)->AddSetChangeJob(nJob);
g_UserMng.AddNearSetChangeJob(this, nJob, &((CUser*)this)->m_aJobSkill[MAX_JOB_SKILL]);
#if __VER >= 11 // __SYS_PLAYER_DATA
g_dpDBClient.SendUpdatePlayerData((CUser*)this);
#else // __SYS_PLAYER_DATA
g_DPCoreClient.SendPartyMemberJob((CUser*)this);
g_DPCoreClient.SendFriendChangeJob((CUser*)this);
if (m_idGuild != 0)
g_DPCoreClient.SendGuildChangeJobLevel((CUser*)this);
#endif // __SYS_PLAYER_DATA
SetHitPoint(GetMaxHitPoint());
SetManaPoint(GetMaxManaPoint());
SetFatiguePoint(GetMaxFatiguePoint());
if (nJob >= 1 && nJob <= 4)
{
m_nStr = m_nSta = m_nDex = m_nInt = 15;
m_nRemainGP = 28;
}
if (nJob >= MAX_PROFESSIONAL && nJob < MAX_MASTER)
{
m_nRemainGP = (m_nSta - 15) + (m_nStr - 15) + (m_nDex - 15) + (m_nInt - 15) + m_nRemainGP;
m_nStr = m_nSta = m_nDex = m_nInt = 15;
}
if (m_nLevel >= 15 && m_nLevel <= 59)
{
CItemElem itemelem;
itemelem.m_nItemNum = 1;
itemelem.m_bCharged = TRUE;
BYTE nID;
itemelem.m_dwItemId = II_SYS_SYS_SCR_RECCURENCE_LINK;
((CUser*)this)->CreateItem(&itemelem, &nID);
}
g_UserMng.AddSetLevel(this, (WORD)m_nLevel);
((CUser*)this)->AddSetGrowthLearningPoint(m_nRemainGP);
((CUser*)this)->AddSetExperience(GetExp1(), (WORD)m_nLevel, m_nSkillPoint, m_nSkillLevel);
/*( (CUser*)this )->m_playTaskBar.InitTaskBarShorcutKind( SHORTCUT_SKILL );
( (CUser*)this )->AddTaskBar();*/
((CUser*)this)->AddSetState(m_nStr, m_nSta, m_nDex, m_nInt, m_nRemainGP);
#if __VER >= 13 // __HONORABLE_TITLE // ´ÞÀÎ
((CUser*)this)->CheckHonorStat();
((CUser*)this)->AddHonorListAck();
g_UserMng.AddHonorTitleChange(this, m_nHonor);
#endif // __HONORABLE_TITLE // ´ÞÀÎ
}
#endif // __WORLDSERVER
}
#endif //__INSTANT_JOBCHANGE
Mover.h:
Sucht nach:
Fügt darunter ein:
Sollte dann so aussehen:
Code:
InitLevel( int nJob, LONG nLevel, BOOL bGamma = TRUE )
Code:
#ifdef __INSTANT_JOBCHANGE void InitLevelJobChange(int nJob, LONG nLevel, BOOL bGamma = TRUE); #endif //__INSTANT_JOBCHANGE
MoverParam.cpp:
Sucht nach:
Fügt nach:
Das ein:
Sucht nun nach:
Und fügt darunter ein:
Sollte dann so aussehen:
Und So:
Code:
BOOL CMover::SetExperience( EXPINTEGER nExp1, int nLevel)
Code:
return 0;
Code:
#ifdef __CLIENT
#ifdef __INSTANT_JOBCHANGE
if ((GetLevel() == 120 || GetLevel() == 129) && GetExpPercent() == 9999)
{
SAFE_DELETE(g_WndMng.m_pJobChangeEx);
g_WndMng.m_pJobChangeEx = new CWndJobChangeEx;
g_WndMng.m_pJobChangeEx->Initialize();
}
#endif
if( nLevel > m_nLevel )
{
#else // __INSTANT_JOBCHANGE
m_nExp1 = nExp1;
if (IsInvalidObj(this))
return 0;
if (nLevel > m_nLevel)
{
#endif //__INSTANT_JOBCHANGE
Code:
pWndWorld->m_pWndGuideSystem->GuideStart(FALSE);
Code:
#ifdef __INSTANT_JOBCHANGE
if (GetLevel() == 15 || GetLevel() == 60 /*|| ((GetLevel() == 120 || GetLevel() == 129) && GetExpPercent() >= 9900 ) */)
{
SAFE_DELETE(g_WndMng.m_pJobChangeEx);
g_WndMng.m_pJobChangeEx = new CWndJobChangeEx;
g_WndMng.m_pJobChangeEx->Initialize();
}
#endif //__INSTANT_JOBCHANGE
Und So:
WndManager.h:
Sucht nach:
Fügt darunter ein:
Sucht nun nach:
und fügt darunter fogendes ein:
Sollte dann so aussehen:
Und So:
Sucht
Code:
__HELP_BUG_FIX
Code:
#ifdef __INSTANT_JOBCHANGE #include "WndChangeJobEx.h" #endif //__INSTANT_JOBCHANGE
Code:
m_pWndReSkillWarning
Code:
#ifdef __INSTANT_JOBCHANGE CWndJobChangeEx* m_pJobChangeEx; #endif //__INSTANT_JOBCHANGE
Und So:
Sucht
VersionCommon.h (in Neuz & Worldserver):
Fügt folgendes hinzu:
Sollte dann so aussehen:
Code:
#define __INSTANT_JOBCHANGE
Fügen wir nun die WndChangeJobEx.cpp & WndChangeJobEx.h zum Projekt hinzu. Dafür kopieren wir die 2 Dateien in das Folgendes Verzeichnis: \Source\_Interface\ . Danach fügen wir die Dateien in VS zum Projekt hinzu:
Es sollte in Folgenden Ordner Eingefügt werden:
Wir Fügen es als Vorhandenes Element hinzu und wählen die WndChangeJobEx.cpp & WndChangeJobEx.h im \Source\_Interface\ Ordner aus.
Wir Fügen es als Vorhandenes Element hinzu und wählen die WndChangeJobEx.cpp & WndChangeJobEx.h im \Source\_Interface\ Ordner aus.
Änderungen im Resource Ordner:
Resdata.h:
resdata.inc:
resData.txt:
Nach dem nun alles Eingefügt wurde kann man das Neuz und WorldServer Projekt neu erstellen. Anschlißend ganz normal alles starten. Solltet ihr jetzt Lvl 15 oder 60 usw. kommen kommt ein Fenster wo ihr euren Job auswählen könnt.
Sucht nach:
Und Fügt darunter ein:
sollte diese Nummer schon Vergeben sein so sollte sie auf die nächst Größere geändert werden.
Code:
#define APP_REQUESTING_POST
Code:
#define APP_INSTANTJOBCHANGE 907
resdata.inc:
Ganz am Ende folgendes einfügen:
Code:
APP_INSTANTJOBCHANGE "WndTile07.tga" 1 304 272 0x2410000 26
{
// Title String
IDS_RESDATA_INC_017466
}
{
// Help Key
IDS_RESDATA_INC_017489
}
{
WTYPE_TEXT WIDC_TEXT1 "WndEditTile00.tga" 1 22 102 274 194 0x20020000 0 0 0 0
{
// Title String
IDS_RESDATA_INC_017490
}
{
// ToolTip
IDS_RESDATA_INC_017491
}
WTYPE_BUTTON WIDC_BUTTON1 "ButtApply.tga" 0 108 202 180 222 0x220010 0 0 0 0
{
// Title String
IDS_RESDATA_INC_017472
}
{
// ToolTip
IDS_RESDATA_INC_017492
}
WTYPE_BUTTON WIDC_BUTTON2 "ButtRight.bmp" 0 198 202 270 222 0x220010 0 0 0 0
{
// Title String
IDS_RESDATA_INC_017470
}
{
// ToolTip
IDS_RESDATA_INC_017467
}
WTYPE_BUTTON WIDC_BUTTON3 "ButtLeft.bmp" 0 18 202 90 222 0x220010 0 0 0 0
{
// Title String
IDS_RESDATA_INC_017471
}
{
// ToolTip
IDS_RESDATA_INC_017468
}
WTYPE_BUTTON WIDC_BUTTON4 "SlotVan.bmp" 0 116 8 180 72 0x220010 0 0 0 0
{
// Title String
IDS_RESDATA_INC_017473
}
{
// ToolTip
IDS_RESDATA_INC_017493
}
WTYPE_STATIC WIDC_STATIC1 "" 0 118 78 284 94 0x2220000 0 0 0 0
{
// Title String
IDS_RESDATA_INC_017494
}
{
// ToolTip
IDS_RESDATA_INC_017495
}
}
resData.txt:
Am Ende folgendes Einfügen:
Code:
IDS_RESDATA_INC_017465 IDS_RESDATA_INC_017466 Job Change IDS_RESDATA_INC_017467 Next Class IDS_RESDATA_INC_017468 Previous Class IDS_RESDATA_INC_017469 Confirm IDS_RESDATA_INC_017470 IDS_RESDATA_INC_017471 IDS_RESDATA_INC_017472 Select IDS_RESDATA_INC_017473 IDS_RESDATA_INC_017474 IDS_RESDATA_INC_017475 IDS_RESDATA_INC_017476 IDS_RESDATA_INC_017477 IDS_RESDATA_INC_017478 IDS_RESDATA_INC_017479 IDS_RESDATA_INC_017480 IDS_RESDATA_INC_017481 IDS_RESDATA_INC_017482 IDS_RESDATA_INC_017483 IDS_RESDATA_INC_017484 IDS_RESDATA_INC_017485 IDS_RESDATA_INC_017486 IDS_RESDATA_INC_017487 IDS_RESDATA_INC_017488 IDS_RESDATA_INC_017489 IDS_RESDATA_INC_017490 IDS_RESDATA_INC_017491 IDS_RESDATA_INC_017492 IDS_RESDATA_INC_017493 IDS_RESDATA_INC_017494 IDS_RESDATA_INC_017495
Nach dem nun alles Eingefügt wurde kann man das Neuz und WorldServer Projekt neu erstellen. Anschlißend ganz normal alles starten. Solltet ihr jetzt Lvl 15 oder 60 usw. kommen kommt ein Fenster wo ihr euren Job auswählen könnt.
Vorschau/Screenshot:
Das Fenster kann natürlich noch bearbeitet werden mit Daisy(V15 GUI Editor)
Ich hoffe ich konnte mit diesem Thread ein paar Leuten helfen da ich selbst fast verzweifelt bin bei hinzufügen. Für Vorkommende Rechtschreibfehler übernehme ich keine Haftung






