Achtung !!!! Dieser V15 Job Change bezieht sich auf die VS2017 Version des Source von Blouflash ([Only registered and activated users can see links. Click Here To Register...]). 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:
[Only registered and activated users can see links. Click Here To Register...]
Änderungen im Source:
Änderungen im Resource Ordner:
Vorschau/Screenshot:
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 :D
Was wird benötigt:
[Only registered and activated users can see links. Click Here To Register...]
Ä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:
[Only registered and activated users can see links. Click Here To Register...]
Code:
PACKETTYPE_QUERYMAILBOX_COUNT
Code:
#ifdef __INSTANT_JOBCHANGE #define PACKETTYPE_UPDATE_JOB (DWORD)0x88100245 #endif //__INSTANT_JOBCHANGE
[Only registered and activated users can see links. Click Here To Register...]
DPClient.cpp:
Geht bis zum Ende und fügt vor:
Das ein:
Sollte dann so aussehen:
[Only registered and activated users can see links. Click Here To Register...]
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
[Only registered and activated users can see links. Click Here To Register...]
DPClient.h
Sucht nach:
Fügt darunter ein:
Sollte dann so aussehen:
[Only registered and activated users can see links. Click Here To Register...]
Code:
OnSetDuel( OBJID objid, CAr & ar )
Code:
#ifdef __INSTANT_JOBCHANGE void UpdateJob( int nJob, int nLevel ); #endif //__INSTANT_JOBCHANGE
[Only registered and activated users can see links. Click Here To Register...]
DPSrvr.cpp:
Sucht nach:
Fügt darunter ein:
Geht nun zum Ende der .cpp und fügt folgendes ein:
Sollte dann so aussehen:
[Only registered and activated users can see links. Click Here To Register...]
Und So:
[Only registered and activated users can see links. Click Here To Register...]
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
[Only registered and activated users can see links. Click Here To Register...]
Und So:
[Only registered and activated users can see links. Click Here To Register...]
DPSrvr.h:
Ihr sucht nach:
Fügt darunter das ein:
Sollte dann so aussehen:
[Only registered and activated users can see links. Click Here To Register...]
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
[Only registered and activated users can see links. Click Here To Register...]
Mover.cpp:
Ihr sucht nach:
und fügt darunter ein:
Sollte dann so aussehen:
[Only registered and activated users can see links. Click Here To Register...]
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
[Only registered and activated users can see links. Click Here To Register...]
Mover.h:
Sucht nach:
Fügt darunter ein:
Sollte dann so aussehen:
[Only registered and activated users can see links. Click Here To Register...]
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
[Only registered and activated users can see links. Click Here To Register...]
MoverParam.cpp:
Sucht nach:
Fügt nach:
Das ein:
Sucht nun nach:
Und fügt darunter ein:
Sollte dann so aussehen:
[Only registered and activated users can see links. Click Here To Register...]
Und So:
[Only registered and activated users can see links. Click Here To Register...]
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
[Only registered and activated users can see links. Click Here To Register...]
Und So:
[Only registered and activated users can see links. Click Here To Register...]
WndManager.h:
Sucht nach:
Fügt darunter ein:
Sucht nun nach:
und fügt darunter fogendes ein:
Sollte dann so aussehen:
[Only registered and activated users can see links. Click Here To Register...]
Und So:
[Only registered and activated users can see links. Click Here To Register...]
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
[Only registered and activated users can see links. Click Here To Register...]
Und So:
[Only registered and activated users can see links. Click Here To Register...]
Sucht
VersionCommon.h (in Neuz & Worldserver):
Fügt folgendes hinzu:
Sollte dann so aussehen:
[Only registered and activated users can see links. Click Here To Register...]
Code:
#define __INSTANT_JOBCHANGE
[Only registered and activated users can see links. Click Here To Register...]
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:
[Only registered and activated users can see links. Click Here To Register...]
Wir Fügen es als Vorhandenes Element hinzu und wählen die WndChangeJobEx.cpp & WndChangeJobEx.h im \Source\_Interface\ Ordner aus.
[Only registered and activated users can see links. Click Here To Register...]
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:
[Only registered and activated users can see links. Click Here To Register...]
Das Fenster kann natürlich noch bearbeitet werden mit Daisy(V15 GUI Editor)
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 :D