Welcome!

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!

[Help] add the QuickJobChange In Source

One word! Im Fawkin Pro!
Loyal Member
Joined
Jul 1, 2010
Messages
1,254
Reaction score
359
A updated version of this can be found here: http://forum.ragezone.com/f457/__fastjobchange-1193423/

Sup Ragezoner's.

Xakzi here and I will do a Noob-friendly guide on how to add the QuickJobChange that was release in Epvp and re-released in RZ (In english)

You can download the package here~
http://forum.ragezone.com/f724/source-quickjobchanger-769708/

Credits goes for the guy who released in at ePVP (Sorry but Im lazy to check who u are :eek:tt1: Guessing Pumbaaa since your name is in the code :lol:)

(Keep in mind that My source is v15 Clean Released by Spiken http://forum.ragezone.com/f457/clean-source-705158/)

Green = What you have to find
Red = What you have to add/replace

Source
MsgHdr.h
Code:
[COLOR="Green"][U][B]After~[/B][/U]
#define PACKETTYPE_QUERYMAILBOX_COUNT				(DWORD)0x88100241[/COLOR]
[COLOR="Red"][U][B]You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
#define PACKETTYPE_UPDATE_JOB						(DWORD)0x88100242
#endif //__QUICKJOBCHANGE[/Color]
Info::~ If 0x88100243 is already added, add 0x88100242, just be sure it is not duplicated

DPClient.cpp
Code:
[COLOR="Green"][U][B]After~[/B][/U]
void CDPClient::SendGuildHouseTenderJoin( OBJID objGHId, int nTenderPerin, int nTenderPenya )
{
	BEFORESENDSOLE( ar, PACKETTYPE_GUILDHOUSE_TENDER_JOIN, DPID_UNKNOWN );
	ar << objGHId << nTenderPerin << nTenderPenya;
	SEND( ar, this, DPID_SERVERPLAYER );
}
#endif // __GUILD_HOUSE_MIDDLE[/COLOR]

[COLOR="Red"][U][B]You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
void CDPClient::UpdateJob( int nJob, int nLevel )
{
	BEFORESENDSOLE( ar, PACKETTYPE_UPDATE_JOB, DPID_UNKNOWN );
	ar << nJob << nLevel;
	SEND( ar, this, DPID_SERVERPLAYER );
}
#endif //__QUICKJOBCHANGE[/COLOR]

DPClient.h
Code:
[COLOR="Green"][U][B]After~[/B][/U]
#ifdef __GUILD_HOUSE_MIDDLE
private:
	void	OnGuildHouseTenderMainWnd( CAr & ar );
	void	OnGuildHouseTenderInfoWnd( CAr & ar );
	void	OnGuildHouseTenderResult( CAr & ar );
public:
	void	SendGuildHouseTenderMainWnd( DWORD dwGHType, OBJID objNpcId );
	void	SendGuildHouseTenderInfoWnd( OBJID objGHId );
	void	SendGuildHouseTenderJoin( OBJID objGHId, int nTenderPerin, int nTenderPenya );
#endif // __GUILD_HOUSE_MIDDLE[/COLOR]

[COLOR="Red"][U][B]You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
	void	UpdateJob( int nJob, int nLevel );
#endif //__QUICKJOBCHANGE[/COLOR]
DPSrvr.cpp
Code:
[COLOR="Green"][U][B]After~[/B][/U]
#ifdef __GUILD_HOUSE_MIDDLE
	ON_MSG( PACKETTYPE_GUILDHOUSE_TENDER_MAINWND, OnGuildHouseTenderMainWnd );
	ON_MSG( PACKETTYPE_GUILDHOUSE_TENDER_INFOWND, OnGuildHouseTenderInfoWnd );
	ON_MSG( PACKETTYPE_GUILDHOUSE_TENDER_JOIN, OnGuildHouseTenderJoin );
#endif // __GUILD_HOUSE_MIDDLE
[/COLOR]
[COLOR="Red"][U][B]You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
	ON_MSG( PACKETTYPE_UPDATE_JOB, OnUpdateJob );
#endif // __QUICKJOBCHANGE[/COLOR]

[COLOR="Green"][U][B]After~[/B][/U]
#ifdef __GUILD_HOUSE_MIDDLE
void CDPSrvr::OnGuildHouseTenderMainWnd( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE, u_long )
{
	CUser* pUser = g_UserMng.GetUser( dpidCache, dpidUser );
	if( IsValidObj( pUser ) == TRUE )
	{
		DWORD dwGHType;
		OBJID objNpcId;
		ar >> dwGHType >> objNpcId;

		GuildHouseMng->ReqTenderGuildHouseList( pUser, dwGHType, objNpcId );
	}
}

void CDPSrvr::OnGuildHouseTenderInfoWnd( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE, u_long )
{
	CUser* pUser = g_UserMng.GetUser( dpidCache, dpidUser );
	if( IsValidObj( pUser ) == TRUE )
	{
		OBJID objGHId;
		ar >> objGHId;

		GuildHouseMng->ReqTenderGuildHouseInfo( pUser, objGHId );
	}
}

void CDPSrvr::OnGuildHouseTenderJoin( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE, u_long )
{
	CUser* pUser = g_UserMng.GetUser( dpidCache, dpidUser );
	if( IsValidObj( pUser ) == TRUE )
	{
		OBJID objGHId;
		int nTenderPerin, nTenderPenya;
		ar >> objGHId >> nTenderPerin >> nTenderPenya;
		
		GuildHouseMng->OnGuildHouseTenderJoin( pUser, objGHId, nTenderPerin, nTenderPenya );
	}
}
#endif // __GUILD_HOUSE_MIDDLE[/COLOR]

[COLOR="Red"][U][B]You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
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->InitLevelPumbaaa( nJob, nLevel, TRUE );
		}
    }
    catch(...)
    {
        Error("Exception caught in File %s on line %d", __FILE__, __LINE__);
    }
}
#endif //__QUICKJOBCHANGE[/COLOR]

DPSrvr.h
Code:
[COLOR="Green"][U][B]After~[/B][/U]
#ifdef __GUILD_HOUSE_MIDDLE
	void	OnGuildHouseTenderMainWnd( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE, u_long );
	void	OnGuildHouseTenderInfoWnd( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE, u_long );
	void	OnGuildHouseTenderJoin( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE, u_long );
#endif // __GUILD_HOUSE_MIDDLE[/COLOR]

[COLOR="Red"][U][B]You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
void	OnUpdateJob( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE, u_long );
#endif //__QUICKJOBCHANGE[/COLOR]
Mover.cpp
For 3rd Job Only~
Code:
[COLOR="Purple"][U][B]At The Bottom You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
void CMover::InitLevelPumbaaa( int nJob, LONG nLevel, BOOL bGamma )
{
#ifdef __WORLDSERVER
	// ¿î¿µÀÚ ¸í·ÉÀ¸·Î ·¹º§¾÷ Çϴ°÷ÀÓ
	MoverProp* pProp = GetProp();
	if( pProp )
	{
		if( nJob > 0 && nJob < MAX_LEGEND_HERO )
		{
			AddChangeJob( nJob );
		}else{
			return;
		}
		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;
		else if( nJob ==  JOB_LORDTEMPLER_HERO || nJob ==  JOB_STORMBLADE_HERO )
			nPoint += 120;
		else if( nJob ==  JOB_WINDLURKER_HERO || nJob ==  JOB_CRACKSHOOTER_HERO )
			nPoint += 150;
		else if( nJob ==  JOB_FLORIST_HERO )
			nPoint += 160;
		else if( nJob ==  JOB_FORCEMASTER_HERO || nJob ==  JOB_MENTALIST_HERO )
			nPoint += 180;
		else if( nJob ==  JOB_ELEMENTORLORD_HERO )
			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;
				}
			}
		}
		else if(IsLegendHero())
		{
			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( nJob == JOB_MENTALIST_HERO || nJob == JOB_FORCEMASTER_HERO )
		{
			CItemElem itemelem;
			itemelem.m_nItemNum = 1;
			itemelem.m_bCharged = TRUE;
			BYTE nID;

			if( nJob == JOB_MENTALIST_HERO )
				itemelem.m_dwItemId = II_WEA_BOOK_BOKROMAIN;
			if( nJob == JOB_FORCEMASTER_HERO )
				itemelem.m_dwItemId = II_ARM_ARM_SHI_ZEMBATO;

			( ( 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 //__QUICKJOBCHANGE[/COLOR][/spoiler]
For 2nd Job Only~
Code:
[COLOR="Purple"][U][B]At The Bottom You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
void CMover::InitLevelPumbaaa( int nJob, LONG nLevel, BOOL bGamma )
{
#ifdef __WORLDSERVER
	// ¿î¿µÀÚ ¸í·ÉÀ¸·Î ·¹º§¾÷ Çϴ°÷ÀÓ
	MoverProp* pProp = GetProp();
	if( pProp )
	{
		if( nJob > 0 && nJob < MAX_HERO )
		{
			AddChangeJob( nJob );
		}else{
			return;
		}
		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;
/*		else if( nJob ==  JOB_LORDTEMPLER_HERO || nJob ==  JOB_STORMBLADE_HERO )
			nPoint += 120;
		else if( nJob ==  JOB_WINDLURKER_HERO || nJob ==  JOB_CRACKSHOOTER_HERO )
			nPoint += 150;
		else if( nJob ==  JOB_FLORIST_HERO )
			nPoint += 160;
		else if( nJob ==  JOB_FORCEMASTER_HERO || nJob ==  JOB_MENTALIST_HERO )
			nPoint += 180;
		else if( nJob ==  JOB_ELEMENTORLORD_HERO )
			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;
				}
			}
		}
/*		else if(IsLegendHero())
		{
			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( nJob == JOB_MENTALIST_HERO || nJob == JOB_FORCEMASTER_HERO )
		{
			CItemElem itemelem;
			itemelem.m_nItemNum = 1;
			itemelem.m_bCharged = TRUE;
			BYTE nID;

			if( nJob == JOB_MENTALIST_HERO )
				itemelem.m_dwItemId = II_WEA_BOOK_BOKROMAIN;
			if( nJob == JOB_FORCEMASTER_HERO )
				itemelem.m_dwItemId = II_ARM_ARM_SHI_ZEMBATO;

			( ( 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 //__QUICKJOBCHANGE[/color]
Mover.h
Code:
[COLOR="Green"][U][B]After~[/B][/U]
	void			InitLevel( int nJob, LONG nLevel, BOOL bGamma = TRUE );[/COLOR]

[COLOR="Red"][U][B]You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
	void			InitLevelPumbaaa( int nJob, LONG nLevel, BOOL bGamma = TRUE ) ;
#endif //__QUICKJOBCHANGE[/COLOR]

MoverParam.cpp
For 3rd Job Only~
Code:
[COLOR="Green"][U][B]Find~[/B][/U]
BOOL CMover::SetExperience( EXPINTEGER nExp1, int nLevel )
{
	m_nExp1		= nExp1;

	if( IsInvalidObj(this) )
		return 0;

	if( nLevel > m_nLevel )
	{[/COLOR]

[COLOR="Red"][U][B]Change To~[/B][/U]
BOOL CMover::SetExperience( EXPINTEGER nExp1, int nLevel )
{
#ifdef __QUICKJOBCHANGE
	m_nExp1		= nExp1;

	if( IsInvalidObj(this) )
		return 0;
		
#ifdef __CLIENT
	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 // __QUICKJOBCHANGE

	m_nExp1		= nExp1;

	if( IsInvalidObj(this) )
		return 0;

	if( nLevel > m_nLevel )
	{
	
#endif //__QUICKJOBCHANGE[/COLOR]

[COLOR="Green"][U][B]After~[/B][/U]
#if __VER < 12 // __MOD_TUTORIAL				
				if( GetLevel() != 1 )
					pWndWorld->m_pWndGuideSystem->GuideStart(FALSE);
			#endif[/color]

[COLOR="Red"][U][B]You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
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 //__QUICKJOBCHANGE[/COLOR]

For 2nd Job Only~
Code:
[COLOR="Green"][U][B]Find~[/B][/U]
BOOL CMover::SetExperience( EXPINTEGER nExp1, int nLevel )
{
	m_nExp1		= nExp1;

	if( IsInvalidObj(this) )
		return 0;

	if( nLevel > m_nLevel )
	{[/COLOR]

[COLOR="Red"][U][B]Change To~[/B][/U]
BOOL CMover::SetExperience( EXPINTEGER nExp1, int nLevel )
{
#ifdef __QUICKJOBCHANGE
	m_nExp1		= nExp1;

	if( IsInvalidObj(this) )
		return 0;
		
#ifdef __CLIENT
	if( (GetLevel() == 120) && 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 // __QUICKJOBCHANGE

	m_nExp1		= nExp1;

	if( IsInvalidObj(this) )
		return 0;

	if( nLevel > m_nLevel )
	{
	
#endif //__QUICKJOBCHANGE[/COLOR]

[COLOR="Green"][U][B]After~[/B][/U]
#if __VER < 12 // __MOD_TUTORIAL				
				if( GetLevel() != 1 )
					pWndWorld->m_pWndGuideSystem->GuideStart(FALSE);
			#endif[/color]

[COLOR="Red"][U][B]You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
if( GetLevel() == 15 || GetLevel() == 60 )
{
	SAFE_DELETE( g_WndMng.m_pJobChangeEx );
	g_WndMng.m_pJobChangeEx = new CWndJobChangeEx;
	g_WndMng.m_pJobChangeEx->Initialize();
}
#endif //__QUICKJOBCHANGE[/COLOR]

WndManager.h
Code:
[COLOR="Green"][U][B]After~[/B][/U]
#ifdef __GUILD_HOUSE_MIDDLE
#include "WndHousing.h"
#endif //__GUILD_HOUSE_MIDDLE[/COLOR]

[COLOR="Red"][U][B]You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
#include "WndChangeJobEx.h"
#endif //__QUICKJOBCHANGE[/COLOR]

[COLOR="Green"][U][B]After~[/B][/U]
	CWndPetStatus* m_pWndPetStatus;[/COLOR]

[COLOR="Red"][U][B]You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
	CWndJobChangeEx* m_pJobChangeEx;
#endif //__QUICKJOBCHANGE[/COLOR]
VersionCommon.h (Neuz & Worldserver)
Code:
[COLOR="Red"][U][B]Add~[/B][/U]

#define __QUICKJOBCHANGE //Released by pumbaaa thanks <3[/COLOR]

WndChangeJobEx.cpp & WndChangeJobEx.h
Code:
So, how to add these hm?
Add the files into the folder "_Interface".
Go To Visual Studio (after opening all.sln)
Click this button right here.
[img]http://screensnapr.com/e/fdnv5f.png[/img]
Mark the 2 new .cpp & .h
and Click "Open"!
Now the files should be in the solution :)

If for 3rd Job Only~ Use this WndChangeJobEx.cpp instead
WndChangeJobEx.cpp
Code:
#include "StdAfx.h"
#include "WndChangeJobEx.h"
#include "DPClient.h"
#include "DPLoginClient.h"
#include "Network.h"
#include "ResData.h"
#include "defineText.h"
#include "mover.h"

extern CDPClient g_DPlay;

CWndJobChangeEx::CWndJobChangeEx()
{
}

CWndJobChangeEx::~CWndJobChangeEx()
{
	DeleteDeviceObjects();
}

BOOL CWndJobChangeEx::Initialize( CWndBase* pWndParent, DWORD dwType )
{

	if( g_pPlayer->GetLevel() == 15 || g_pPlayer->GetLevel() == 60 || ( ( g_pPlayer->GetLevel() == 120 || g_pPlayer->GetLevel() == 129 ) && g_pPlayer->GetExpPercent() == 9999 ) )
	{
		if(  g_pPlayer->GetJob() == 0 )
		{
			nJobMin = 1;
			nJobMax = 4;
			nNewLv = 15;
		}
		else if( g_pPlayer->GetJob() < MAX_EXPERT )
		{
			nJobMin = (g_pPlayer->GetJob() + 2) * 2;
			nJobMax = nJobMin + 1;
			nNewLv = 60;
		}
		else if( g_pPlayer->GetJob() < MAX_PROFESSIONAL )
		{
			nJobMin = g_pPlayer->GetJob() + 10;
			nJobMax = nJobMin;
			nNewLv = 60;
		}
		else if( g_pPlayer->GetJob() < MAX_HERO )
		{
			nJobMin = g_pPlayer->GetJob() + 8;
			nJobMax = nJobMin;
			( g_pPlayer->GetJob() < MAX_MASTER ) ? nNewLv = 121 : nNewLv = 130;
		}
		nCurJob = nJobMin;
	}else{
		nCurJob = 0;
	}
	return CWndNeuz::InitDialog( g_Neuz.GetSafeHwnd(), APP_FASTJOBCHANGE, 0, CPoint( 0, 0 ), pWndParent );
}

BOOL CWndJobChangeEx::OnChildNotify( UINT message, UINT nID, LRESULT* pLResult )
{
	switch( nID )
	{
	case WIDC_BUTTON4:
		g_DPlay.UpdateJob( nCurJob, nNewLv );
		Destroy();
		break;
	case WIDC_BUTTON2:
		if( nCurJob < nJobMax )
			nCurJob++;
		break;
	case WIDC_BUTTON3:
		if( nCurJob > nJobMin )
			nCurJob--;
		break;
	}
	return CWndNeuz::OnChildNotify( message, nID, pLResult );
}

void CWndJobChangeEx::OnDraw( C2DRender* p2DRender )
{
	char* szInfo[] = { "Error", "Mercenaries prefer to partake in close range combat. The main characteristics of this particular class involve physical strength, and a strong body that is able to withstand attacks.",
"Acrobats are those who mainly wield long distance weapons such as bows or yoyos. Using the skill tactics of speed and accuracy, they are usually able to break anyone willing enough to fight them.",
"Being an assist, you'll be able to choose to either be a fighter, or a healer. If a fighter is what you desire, assists generally favouritise close and personal combat. If supporting other characters is more your style, you may choose the alternative.",
"Magicians are ranged spell casters, they are able to focus large amounts of magic upon an enemy, dealing a great deal of damage before they are even reached. Magicians generally have lower defense, lower HP, and sometimes even delay when it comes to casting spells.",
"<Leer>",
"Knights are a second class for mercenaries and are the best tanks in the game. As a knight you will receive more health points per stamina point than any other class.",
"Blades are a second class for mercenaries and are the best damage dealers in the game. As a blade you will be able to wield two weapons at the same time and thus drastically increase your damage output.",
"Jesters focus on ranged attacks using Yo-Yos. They have a wide range of skills that allow them to be strong PvP'ers with their YoYo attacks, use some of their penya to do increased damage, and escape incoming attacks.",
"Rangers are a ranged based melee class that focus on using bow skills to damage enemies.",
"When it comes to partners, this class is the most sought after due to their ability to enhance others abilities and skills. With extra buffs and skills, this assist class is almost considered a necessity for game play; or, at least, they make it easier.",
"Billposters are undoubtedly the most self-sufficient class in the game. With their normal assist buffs, and their additional damage skills upon second job change, they are a very strong class. They are more of a melee class, and fight using a knuckle and a shield.",
"Psykeepers are one of the Magician's second classes. These, however, do not deal in the field of elemental damage. Most of the attacks, which are very powerful, tend to be based off mental and demonic forces.",
"Elementors are a second class for magicians and are a high damage spell casting class that uses staves to cast devastating elemental spells. ",
"<Leer>",
"<Leer>",
"Become master to get more strength",
"Become hero to get more strength",
"Templars are the third class for knights. The ultimate guardian, far more than just a meat shield. They are the epitome of defense and are the knights in shining armor legends are made of.",
"Slayers are the third class for blades. These ferocious fighters never relent on the attack, and their fury never ceases until all those that oppose them have been laid to waste at their hands.",
"Harlequins are the third class for Jesters and posses dark skills which allow them to attack from behind there foes and even vanish right in front of your eyes. The Harlequins make for a deadly class with there combo of stealth and attacks.",
"Crackshooters are the third class for Rangers and can kill from a much further distance than Rangers. They can equip the crossbow, a compact and highly lethal weapon, these ranged fighters can and will kill multiple targets.",
"Seraphs are the third class for Ringmasters. They are capable of mending any wound, big or small and can bless their companions and awaken strength, skill, and abilities few may think are possible and can even invoke the power of temporary immortality.",
"Force Masters are the third class for Billposters. All ready one of the strongest if not thee strongest class within Madrigal. The addition of the Force Master Skills brings the most welcome boost to party abilities. Any party would welcome the power's of a Force Master.",
"Mentalists are the third class for Psykeepers. These playful but graceful and fearsome magicians can manipulate the battlefield and foes to an untimely demise.",
"Arcanists are the third class for Elementors. Arcanists are experts in the art of elements and can rain down the heaven's to destroy all that lie in there way.",
};


	CWndButton* nJobPic = (CWndButton*)GetDlgItem( WIDC_BUTTON4 );
	CWndStatic* nJobTit = (CWndStatic*)GetDlgItem( WIDC_STATIC1 );
	CWndButton* chk1 = (CWndButton*) GetDlgItem( WIDC_BUTTON2 );
	CWndButton* chk2 = (CWndButton*) GetDlgItem( WIDC_BUTTON3 );
	CWndText* nJobInfo = (CWndText*)GetDlgItem( WIDC_TEXT1 );
	switch( nCurJob )
	{
	case 0:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotVan.bmp" ), TRUE );
		nJobPic->EnableWindow( FALSE );
		nJobTit->SetToolTip( "You don't have the right level" );
		nApply->EnableWindow( FALSE );
		nJobTit->SetTitle( "Error" );
		chk1->EnableWindow( FALSE );
		chk2->EnableWindow( FALSE );
		return;
		break;
	case 1:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotMer.bmp" ), TRUE );
		break;
	case 2:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotArc.bmp" ), TRUE );
		break;
	case 3:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotAs.bmp" ), TRUE );
		break;
	case 4:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotMag.bmp" ), TRUE );
		break;
	case 6: case 16: case 24:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotKnight.bmp" ), TRUE );
		break;
	case 7: case 17: case 25:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotBlad.bmp" ), TRUE );
		break;
	case 8: case 18: case 26:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotJes.bmp" ), TRUE );
		break;
	case 9: case 19: case 27:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotRan.bmp" ), TRUE );
		break;
	case 10: case 20: case 28:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotRingm.bmp" ), TRUE );
		break;
	case 11: case 21: case 29:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotBillfor.bmp" ), TRUE );
		break;
	case 12: case 22: case 30:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotPsy.bmp" ), TRUE );
		break;
	case 13: case 23: case 31:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotElem.bmp" ), TRUE );
		break;
	case 32:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotLord.bmp" ), TRUE );
		break;
	case 33:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotStormb.bmp" ), TRUE );
		break;
	case 34:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotWindI.bmp" ), TRUE );
		break;
	case 35:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotCracks.bmp" ), TRUE );
		break;
	case 36:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotFlor.bmp" ), TRUE );
		break;
	case 37:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotForcem.bmp" ), TRUE );
		break;
	case 38:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotMent.bmp" ), TRUE );
		break;
	case 39:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotElel.bmp" ), TRUE );
		break;
	default:
		return;
		break;
	}
	nJobPic->SetToolTip( prj.m_aJob[nCurJob].szName );
	nJobTit->SetTitle( prj.m_aJob[nCurJob].szName );
	( nCurJob == nJobMax ) ? chk1->EnableWindow( FALSE ) : chk1->EnableWindow( TRUE );
	( nCurJob == nJobMin ) ? chk2->EnableWindow( FALSE ):chk2->EnableWindow( TRUE );
	if( nCurJob < MAX_PROFESSIONAL )
		nJobInfo->SetString( szInfo[nCurJob] );
	else if( nCurJob < MAX_MASTER )
		nJobInfo->SetString( szInfo[MAX_PROFESSIONAL] );
	else if( nCurJob < MAX_HERO )
		nJobInfo->SetString( szInfo[MAX_PROFESSIONAL+1] );
	else
		nJobInfo->SetString( szInfo[nCurJob - 14] );

}

void CWndJobChangeEx::OnInitialUpdate( )
{
	CWndNeuz::OnInitialUpdate(); 
	RestoreDeviceObjects();

	
	CRect rectRoot = m_pWndRoot->GetLayoutRect();
	CRect rectWindow = GetWindowRect();
	CPoint point( rectRoot.right - rectWindow.Width(), 110 );
	Move( point );
	MoveParentCenter();
}

BOOL CWndJobChangeEx::OnCommand( UINT nID, DWORD dwMessage, CWndBase *pWndBase )
{
	return CWndNeuz::OnCommand( nID, dwMessage, pWndBase );
}

HRESULT CWndJobChangeEx::RestoreDeviceObjects()
{
	CWndNeuz::RestoreDeviceObjects();
	return S_OK;
}
HRESULT CWndJobChangeEx::InvalidateDeviceObjects()
{
	CWndNeuz::InvalidateDeviceObjects();
    return S_OK;
}
HRESULT CWndJobChangeEx::DeleteDeviceObjects()
{
	CWndNeuz::DeleteDeviceObjects();
	InvalidateDeviceObjects();
	return S_OK;
}

If for 2nd Job Only~ Use this WndChangeJobEx.cpp instead
WndChangeJobEx.cpp
Code:
#include "StdAfx.h"
#include "WndChangeJobEx.h"
#include "DPClient.h"
#include "DPLoginClient.h"
#include "Network.h"
#include "ResData.h"
#include "defineText.h"
#include "mover.h"

extern CDPClient g_DPlay;

CWndJobChangeEx::CWndJobChangeEx()
{
}

CWndJobChangeEx::~CWndJobChangeEx()
{
	DeleteDeviceObjects();
}

BOOL CWndJobChangeEx::Initialize( CWndBase* pWndParent, DWORD dwType )
{

	if( g_pPlayer->GetLevel() == 15 || g_pPlayer->GetLevel() == 60 || ( ( g_pPlayer->GetLevel() == 120 || g_pPlayer->GetLevel() == 129 ) && g_pPlayer->GetExpPercent() == 9999 ) )
	{
		if(  g_pPlayer->GetJob() == 0 )
		{
			nJobMin = 1;
			nJobMax = 4;
			nNewLv = 15;
		}
		else if( g_pPlayer->GetJob() < MAX_EXPERT )
		{
			nJobMin = (g_pPlayer->GetJob() + 2) * 2;
			nJobMax = nJobMin + 1;
			nNewLv = 60;
		}
		else if( g_pPlayer->GetJob() < MAX_PROFESSIONAL )
		{
			nJobMin = g_pPlayer->GetJob() + 10;
			nJobMax = nJobMin;
			nNewLv = 60;
		}
		else if( g_pPlayer->GetJob() < MAX_HERO )
		{
			nJobMin = g_pPlayer->GetJob() + 8;
			nJobMax = nJobMin;
			( g_pPlayer->GetJob() < MAX_MASTER ) ? nNewLv = 121 : nNewLv = 130;
		}
		nCurJob = nJobMin;
	}else{
		nCurJob = 0;
	}
	return CWndNeuz::InitDialog( g_Neuz.GetSafeHwnd(), APP_FASTJOBCHANGE, 0, CPoint( 0, 0 ), pWndParent );
}

BOOL CWndJobChangeEx::OnChildNotify( UINT message, UINT nID, LRESULT* pLResult )
{
	switch( nID )
	{
	case WIDC_BUTTON4:
		g_DPlay.UpdateJob( nCurJob, nNewLv );
		Destroy();
		break;
	case WIDC_BUTTON2:
		if( nCurJob < nJobMax )
			nCurJob++;
		break;
	case WIDC_BUTTON3:
		if( nCurJob > nJobMin )
			nCurJob--;
		break;
	}
	return CWndNeuz::OnChildNotify( message, nID, pLResult );
}

void CWndJobChangeEx::OnDraw( C2DRender* p2DRender )
{
	char* szInfo[] = { "Error", "Mercenaries prefer to partake in close range combat. The main characteristics of this particular class involve physical strength, and a strong body that is able to withstand attacks.",
"Acrobats are those who mainly wield long distance weapons such as bows or yoyos. Using the skill tactics of speed and accuracy, they are usually able to break anyone willing enough to fight them.",
"Being an assist, you'll be able to choose to either be a fighter, or a healer. If a fighter is what you desire, assists generally favouritise close and personal combat. If supporting other characters is more your style, you may choose the alternative.",
"Magicians are ranged spell casters, they are able to focus large amounts of magic upon an enemy, dealing a great deal of damage before they are even reached. Magicians generally have lower defense, lower HP, and sometimes even delay when it comes to casting spells.",
"<Leer>",
"Knights are a second class for mercenaries and are the best tanks in the game. As a knight you will receive more health points per stamina point than any other class.",
"Blades are a second class for mercenaries and are the best damage dealers in the game. As a blade you will be able to wield two weapons at the same time and thus drastically increase your damage output.",
"Jesters focus on ranged attacks using Yo-Yos. They have a wide range of skills that allow them to be strong PvP'ers with their YoYo attacks, use some of their penya to do increased damage, and escape incoming attacks.",
"Rangers are a ranged based melee class that focus on using bow skills to damage enemies.",
"When it comes to partners, this class is the most sought after due to their ability to enhance others abilities and skills. With extra buffs and skills, this assist class is almost considered a necessity for game play; or, at least, they make it easier.",
"Billposters are undoubtedly the most self-sufficient class in the game. With their normal assist buffs, and their additional damage skills upon second job change, they are a very strong class. They are more of a melee class, and fight using a knuckle and a shield.",
"Psykeepers are one of the Magician's second classes. These, however, do not deal in the field of elemental damage. Most of the attacks, which are very powerful, tend to be based off mental and demonic forces.",
"Elementors are a second class for magicians and are a high damage spell casting class that uses staves to cast devastating elemental spells. ",
"<Leer>",
"<Leer>",
"Become master to get more strength",
"Become hero to get more strength",
/*"Templars are the third class for knights. The ultimate guardian, far more than just a meat shield. They are the epitome of defense and are the knights in shining armor legends are made of.",
"Slayers are the third class for blades. These ferocious fighters never relent on the attack, and their fury never ceases until all those that oppose them have been laid to waste at their hands.",
"Harlequins are the third class for Jesters and posses dark skills which allow them to attack from behind there foes and even vanish right in front of your eyes. The Harlequins make for a deadly class with there combo of stealth and attacks.",
"Crackshooters are the third class for Rangers and can kill from a much further distance than Rangers. They can equip the crossbow, a compact and highly lethal weapon, these ranged fighters can and will kill multiple targets.",
"Seraphs are the third class for Ringmasters. They are capable of mending any wound, big or small and can bless their companions and awaken strength, skill, and abilities few may think are possible and can even invoke the power of temporary immortality.",
"Force Masters are the third class for Billposters. All ready one of the strongest if not thee strongest class within Madrigal. The addition of the Force Master Skills brings the most welcome boost to party abilities. Any party would welcome the power's of a Force Master.",
"Mentalists are the third class for Psykeepers. These playful but graceful and fearsome magicians can manipulate the battlefield and foes to an untimely demise.",
"Arcanists are the third class for Elementors. Arcanists are experts in the art of elements and can rain down the heaven's to destroy all that lie in there way.",*/
};


	CWndButton* nJobPic = (CWndButton*)GetDlgItem( WIDC_BUTTON4 );
	CWndStatic* nJobTit = (CWndStatic*)GetDlgItem( WIDC_STATIC1 );
	CWndButton* chk1 = (CWndButton*) GetDlgItem( WIDC_BUTTON2 );
	CWndButton* chk2 = (CWndButton*) GetDlgItem( WIDC_BUTTON3 );
	CWndText* nJobInfo = (CWndText*)GetDlgItem( WIDC_TEXT1 );
	switch( nCurJob )
	{
	case 0:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotVan.bmp" ), TRUE );
		nJobPic->EnableWindow( FALSE );
		nJobTit->SetToolTip( "You don't have the right level" );
		nApply->EnableWindow( FALSE );
		nJobTit->SetTitle( "Error" );
		chk1->EnableWindow( FALSE );
		chk2->EnableWindow( FALSE );
		return;
		break;
	case 1:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotMer.bmp" ), TRUE );
		break;
	case 2:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotArc.bmp" ), TRUE );
		break;
	case 3:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotAs.bmp" ), TRUE );
		break;
	case 4:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotMag.bmp" ), TRUE );
		break;
	case 6: case 16: case 24:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotKnight.bmp" ), TRUE );
		break;
	case 7: case 17: case 25:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotBlad.bmp" ), TRUE );
		break;
	case 8: case 18: case 26:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotJes.bmp" ), TRUE );
		break;
	case 9: case 19: case 27:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotRan.bmp" ), TRUE );
		break;
	case 10: case 20: case 28:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotRingm.bmp" ), TRUE );
		break;
	case 11: case 21: case 29:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotBillfor.bmp" ), TRUE );
		break;
	case 12: case 22: case 30:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotPsy.bmp" ), TRUE );
		break;
	case 13: case 23: case 31:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotElem.bmp" ), TRUE );
		break;
	/*case 32:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotLord.bmp" ), TRUE );
		break;
	case 33:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotStormb.bmp" ), TRUE );
		break;
	case 34:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotWindI.bmp" ), TRUE );
		break;
	case 35:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotCracks.bmp" ), TRUE );
		break;
	case 36:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotFlor.bmp" ), TRUE );
		break;
	case 37:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotForcem.bmp" ), TRUE );
		break;
	case 38:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotMent.bmp" ), TRUE );
		break;
	case 39:
		nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotElel.bmp" ), TRUE );
		break;*/
	default:
		return;
		break;
	}
	nJobPic->SetToolTip( prj.m_aJob[nCurJob].szName );
	nJobTit->SetTitle( prj.m_aJob[nCurJob].szName );
	( nCurJob == nJobMax ) ? chk1->EnableWindow( FALSE ) : chk1->EnableWindow( TRUE );
	( nCurJob == nJobMin ) ? chk2->EnableWindow( FALSE ):chk2->EnableWindow( TRUE );
	if( nCurJob < MAX_PROFESSIONAL )
		nJobInfo->SetString( szInfo[nCurJob] );
	else if( nCurJob < MAX_MASTER )
		nJobInfo->SetString( szInfo[MAX_PROFESSIONAL] );
	else if( nCurJob < MAX_HERO )
		nJobInfo->SetString( szInfo[MAX_PROFESSIONAL+1] );
	else
		nJobInfo->SetString( szInfo[nCurJob - 14] );

}

void CWndJobChangeEx::OnInitialUpdate( )
{
	CWndNeuz::OnInitialUpdate(); 
	RestoreDeviceObjects();

	
	CRect rectRoot = m_pWndRoot->GetLayoutRect();
	CRect rectWindow = GetWindowRect();
	CPoint point( rectRoot.right - rectWindow.Width(), 110 );
	Move( point );
	MoveParentCenter();
}

BOOL CWndJobChangeEx::OnCommand( UINT nID, DWORD dwMessage, CWndBase *pWndBase )
{
	return CWndNeuz::OnCommand( nID, dwMessage, pWndBase );
}

HRESULT CWndJobChangeEx::RestoreDeviceObjects()
{
	CWndNeuz::RestoreDeviceObjects();
	return S_OK;
}
HRESULT CWndJobChangeEx::InvalidateDeviceObjects()
{
	CWndNeuz::InvalidateDeviceObjects();
    return S_OK;
}
HRESULT CWndJobChangeEx::DeleteDeviceObjects()
{
	CWndNeuz::DeleteDeviceObjects();
	InvalidateDeviceObjects();
	return S_OK;
}


Resource
Resdata.h
Code:
[COLOR="Red"][U][B]You Add These Stuff~[/B][/U]

#define APP_FASTJOBCHANGE						907
[/COLOR]
Info::~ Since it is an "APP_", if the number 907 already exists, just take the next possible (Do not duplicate the number with another "APP_" number)

Resdata.inc (OLD RESDATA)
Code:
[COLOR="Red"][U][B]You Add~[/B][/U]
APP_FASTJOBCHANGE "WndTile00.tga" 1 288 240 0x2410000 26
{
// Title String
IDS_RESDATA_INC_017466
}
{
// Help Key
IDS_RESDATA_INC_017471
}
{
    WTYPE_TEXT WIDC_TEXT1 "WndEditTile00.tga" 1 12 78 264 170 0x20020000 0 0 0 0
    {
    // Title String
IDS_RESDATA_INC_017465
    }
    {
    // ToolTip
IDS_RESDATA_INC_017465
    }
    WTYPE_BUTTON WIDC_BUTTON2 "Buttright2.bmp" 0 223 172 264 192 0x220010 0 0 0 0
    {
    // Title String
IDS_RESDATA_INC_017471
    }
    {
    // ToolTip
IDS_RESDATA_INC_017467
    }
    WTYPE_BUTTON WIDC_BUTTON3 "Buttleft2.bmp" 0 12 172 53 192 0x220010 0 0 0 0
    {
    // Title String
IDS_RESDATA_INC_017471
    }
    {
    // ToolTip
IDS_RESDATA_INC_017468
    }
    WTYPE_BUTTON WIDC_BUTTON4 "SlotVan.bmp" 0 8 8 72 72 0x220010 0 0 0 0
    {
    // Title String
IDS_RESDATA_INC_017470
    }
    {
    // ToolTip
IDS_RESDATA_INC_017469
    }
    WTYPE_STATIC WIDC_STATIC1 "" 0 78 52 264 68 0x2220000 0 0 0 0
    {
    // Title String
IDS_RESDATA_INC_017470
    }
    {
    // ToolTip
IDS_RESDATA_INC_017471
    }

}[/COLOR]

Resdata.inc (NEW RESDATA)
Code:
[COLOR="Red"][U][B]You Add~[/B][/U]
APP_FASTJOBCHANGE "WndTile00.tga" "" 1 288 240 0x2410000 26
{
// Title String
IDS_RESDATA_INC_017466
}
{
// Help Key
IDS_RESDATA_INC_017471
}
{
    WTYPE_TEXT WIDC_TEXT1 "WndEditTile00.tga" 1 12 78 264 170 0x20020000 0 0 0 0 46 112 169
    {
    // Title String
IDS_RESDATA_INC_017465
    }
    {
    // ToolTip
IDS_RESDATA_INC_017465
    }
    WTYPE_BUTTON WIDC_BUTTON2 "Buttright2.bmp" 0 223 172 264 192 0x220010 0 0 0 0 46 112 169
    {
    // Title String
IDS_RESDATA_INC_017471
    }
    {
    // ToolTip
IDS_RESDATA_INC_017467
    }
    WTYPE_BUTTON WIDC_BUTTON3 "Buttleft2.bmp" 0 12 172 53 192 0x220010 0 0 0 0 46 112 169
    {
    // Title String
IDS_RESDATA_INC_017471
    }
    {
    // ToolTip
IDS_RESDATA_INC_017468
    }
    WTYPE_BUTTON WIDC_BUTTON4 "SlotVan.bmp" 0 8 8 72 72 0x220010 0 0 0 0 46 112 169
    {
    // Title String
IDS_RESDATA_INC_017470
    }
    {
    // ToolTip
IDS_RESDATA_INC_017469
    }
    WTYPE_STATIC WIDC_STATIC1 "" 0 78 52 264 68 0x2220000 0 0 0 0 46 112 169
    {
    // Title String
IDS_RESDATA_INC_017470
    }
    {
    // ToolTip
IDS_RESDATA_INC_017471
    }

}[/COLOR]

ResData.txt
Code:
[COLOR="Red"][U][B]You Add~[/B][/U]
IDS_RESDATA_INC_017465	
IDS_RESDATA_INC_017466	Quick Jobchange
IDS_RESDATA_INC_017467	Next
IDS_RESDATA_INC_017468	Previous
IDS_RESDATA_INC_017469	Do It!
IDS_RESDATA_INC_017470	
IDS_RESDATA_INC_017471	
IDS_RESDATA_INC_017472	
[/COLOR]
Info::~ As Usual, if the ID Numbers already exist, change it to the next possible :)


And as Usual, End words!!

I have done some changes to pumbaaa's Quick change job..

change 1:
There is no "Change" Button anymore, now when you click on the picture, the character will change to that job!

change 2:
Fixed the text on the window, now it does not say "IDS_****" when mouse is hovering over a button / text

Change 3:
I have made a window for the NEW resdata and OLD resdata

Change 4:
I have made quick job change up to Hero and one up to 3rd Job

Change 5: The code is now inside an ID "__QUICKJOBCHANGE",
so if you feel like removing it, then removing the ID from both versioncommon.h is enough :)

Change 6: I am too damn awesome so I just needed to say that.

Info 1: I dont have 3rd job in my server, so if anyone has 3rd job, could you please comment on how it worked for you? Would greatly appriciate it.

I hope you like it, and there should not be any problems whatsoever, tried to change my job more then 64 times already haha..

If you would need any kind of help, just write your error log you get in a Spoiler and I and many others will try to help you as much as possible ^^

SlideShow For Pictures ---->>

3rd job change does not work for you?
Here's the fix for that! ~ http://forum.ragezone.com/f457/source-quickchange-3rd-job-level-818682/#post6827132

Sincerely~ Xakzi

EDIT: IF YOU GET THE ERROR GETDLGITEM : nID=933 NOT FOUND, GO TO WNDCHANGEJOBEX.CPP AND DELETE THIS LINE
Code:
	CWndButton* nApply = (CWndButton*)GetDlgItem( WIDC_BUTTON1 );
 
Last edited by a moderator:
Newbie Spellweaver
Joined
Oct 31, 2016
Messages
17
Reaction score
0
Actually, after adding the QuickChange to a complelety clean source, everything is working as intended. I don't know what the hell led my client to reset to Lv60 Hero without popping a window, but it works now so I can live in peace :p
 
Upvote 0
Newbie Spellweaver
Joined
May 6, 2016
Messages
15
Reaction score
0
I followed everything. I am using Codeblocks. When I try to reach level 15, I didnt get any pop-ups to change job.
 
Upvote 0
Newbie Spellweaver
Joined
May 6, 2016
Messages
15
Reaction score
0
I don't know why I am getting this error but if I will erase " #endif " I will have more errors coming. I already added WndChangeJobEx.cpp and WndChangeJobEx.h to NUEZ Project.

Xakzi - [Help] add the QuickJobChange In Source - RaGEZONE Forums
 
Upvote 0
Newbie Spellweaver
Joined
Mar 27, 2017
Messages
23
Reaction score
0
So, how to add these hm?Add the files into the folder "_Interface".
Go To Visual Studio (after opening all.sln)
Click this button right here.
Xakzi - [Help] add the QuickJobChange In Source - RaGEZONE Forums

Mark the 2 new .cpp & .h
and Click "Open"!
Now the files should be in the solution :)

I do not see the image, where should I click?
 
Upvote 0
Initiate Mage
Joined
Jul 20, 2018
Messages
3
Reaction score
0
I still dont get this solution .

So, how to add these hm?
Add the files into the folder "_Interface".
Go To Visual Studio (after opening all.sln)
Click this button right here.
Xakzi - [Help] add the QuickJobChange In Source - RaGEZONE Forums

Mark the 2 new .cpp & .h
and Click "Open"!
Now the files should be in the solution :)



Could you show screenshot





Sup Ragezoner's.

Xakzi here and I will do a Noob-friendly guide on how to add the QuickJobChange that was release in Epvp and re-released in RZ (In english)

You can download the package here~
http://forum.ragezone.com/f724/source-quickjobchanger-769708/

Credits goes for the guy who released in at ePVP (Sorry but Im lazy to check who u are :eek:tt1: Guessing Pumbaaa since your name is in the code :lol:)

(Keep in mind that My source is v15 Clean Released by Spiken http://forum.ragezone.com/f457/clean-source-705158/)

Green = What you have to find
Red = What you have to add/replace

Source
MsgHdr.h
Code:
[COLOR=Green][U][B]After~[/B][/U]
#define PACKETTYPE_QUERYMAILBOX_COUNT                (DWORD)0x88100241[/COLOR]
[COLOR=Red][U][B]You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
#define PACKETTYPE_UPDATE_JOB                        (DWORD)0x88100242
#endif //__QUICKJOBCHANGE[/COLOR]
Info::~ If 0x88100243 is already added, add 0x88100242, just be sure it is not duplicated

DPClient.cpp
Code:
[COLOR=Green][U][B]After~[/B][/U]
void CDPClient::SendGuildHouseTenderJoin( OBJID objGHId, int nTenderPerin, int nTenderPenya )
{
    BEFORESENDSOLE( ar, PACKETTYPE_GUILDHOUSE_TENDER_JOIN, DPID_UNKNOWN );
    ar << objGHId << nTenderPerin << nTenderPenya;
    SEND( ar, this, DPID_SERVERPLAYER );
}
#endif // __GUILD_HOUSE_MIDDLE[/COLOR]

[COLOR=Red][U][B]You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
void CDPClient::UpdateJob( int nJob, int nLevel )
{
    BEFORESENDSOLE( ar, PACKETTYPE_UPDATE_JOB, DPID_UNKNOWN );
    ar << nJob << nLevel;
    SEND( ar, this, DPID_SERVERPLAYER );
}
#endif //__QUICKJOBCHANGE[/COLOR]

DPClient.h
Code:
[COLOR=Green][U][B]After~[/B][/U]
#ifdef __GUILD_HOUSE_MIDDLE
private:
    void    OnGuildHouseTenderMainWnd( CAr & ar );
    void    OnGuildHouseTenderInfoWnd( CAr & ar );
    void    OnGuildHouseTenderResult( CAr & ar );
public:
    void    SendGuildHouseTenderMainWnd( DWORD dwGHType, OBJID objNpcId );
    void    SendGuildHouseTenderInfoWnd( OBJID objGHId );
    void    SendGuildHouseTenderJoin( OBJID objGHId, int nTenderPerin, int nTenderPenya );
#endif // __GUILD_HOUSE_MIDDLE[/COLOR]

[COLOR=Red][U][B]You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
    void    UpdateJob( int nJob, int nLevel );
#endif //__QUICKJOBCHANGE[/COLOR]
DPSrvr.cpp
Code:
[COLOR=Green][U][B]After~[/B][/U]
#ifdef __GUILD_HOUSE_MIDDLE
    ON_MSG( PACKETTYPE_GUILDHOUSE_TENDER_MAINWND, OnGuildHouseTenderMainWnd );
    ON_MSG( PACKETTYPE_GUILDHOUSE_TENDER_INFOWND, OnGuildHouseTenderInfoWnd );
    ON_MSG( PACKETTYPE_GUILDHOUSE_TENDER_JOIN, OnGuildHouseTenderJoin );
#endif // __GUILD_HOUSE_MIDDLE
[/COLOR]
[COLOR=Red][U][B]You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
    ON_MSG( PACKETTYPE_UPDATE_JOB, OnUpdateJob );
#endif // __QUICKJOBCHANGE[/COLOR]

[COLOR=Green][U][B]After~[/B][/U]
#ifdef __GUILD_HOUSE_MIDDLE
void CDPSrvr::OnGuildHouseTenderMainWnd( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE, u_long )
{
    CUser* pUser = g_UserMng.GetUser( dpidCache, dpidUser );
    if( IsValidObj( pUser ) == TRUE )
    {
        DWORD dwGHType;
        OBJID objNpcId;
        ar >> dwGHType >> objNpcId;

        GuildHouseMng->ReqTenderGuildHouseList( pUser, dwGHType, objNpcId );
    }
}

void CDPSrvr::OnGuildHouseTenderInfoWnd( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE, u_long )
{
    CUser* pUser = g_UserMng.GetUser( dpidCache, dpidUser );
    if( IsValidObj( pUser ) == TRUE )
    {
        OBJID objGHId;
        ar >> objGHId;

        GuildHouseMng->ReqTenderGuildHouseInfo( pUser, objGHId );
    }
}

void CDPSrvr::OnGuildHouseTenderJoin( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE, u_long )
{
    CUser* pUser = g_UserMng.GetUser( dpidCache, dpidUser );
    if( IsValidObj( pUser ) == TRUE )
    {
        OBJID objGHId;
        int nTenderPerin, nTenderPenya;
        ar >> objGHId >> nTenderPerin >> nTenderPenya;
        
        GuildHouseMng->OnGuildHouseTenderJoin( pUser, objGHId, nTenderPerin, nTenderPenya );
    }
}
#endif // __GUILD_HOUSE_MIDDLE[/COLOR]

[COLOR=Red][U][B]You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
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->InitLevelPumbaaa( nJob, nLevel, TRUE );
        }
    }
    catch(...)
    {
        Error("Exception caught in File %s on line %d", __FILE__, __LINE__);
    }
}
#endif //__QUICKJOBCHANGE[/COLOR]

DPSrvr.h
Code:
[COLOR=Green][U][B]After~[/B][/U]
#ifdef __GUILD_HOUSE_MIDDLE
    void    OnGuildHouseTenderMainWnd( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE, u_long );
    void    OnGuildHouseTenderInfoWnd( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE, u_long );
    void    OnGuildHouseTenderJoin( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE, u_long );
#endif // __GUILD_HOUSE_MIDDLE[/COLOR]

[COLOR=Red][U][B]You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
void    OnUpdateJob( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE, u_long );
#endif //__QUICKJOBCHANGE[/COLOR]
Mover.cpp
For 3rd Job Only~
Code:
[COLOR=Purple][U][B]At The Bottom You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
void CMover::InitLevelPumbaaa( int nJob, LONG nLevel, BOOL bGamma )
{
#ifdef __WORLDSERVER
    // ¿î¿µÀÚ ¸í·ÉÀ¸·Î ·¹º§¾÷ Çϴ°÷ÀÓ
    MoverProp* pProp = GetProp();
    if( pProp )
    {
        if( nJob > 0 && nJob < MAX_LEGEND_HERO )
        {
            AddChangeJob( nJob );
        }else{
            return;
        }
        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;
        else if( nJob ==  JOB_LORDTEMPLER_HERO || nJob ==  JOB_STORMBLADE_HERO )
            nPoint += 120;
        else if( nJob ==  JOB_WINDLURKER_HERO || nJob ==  JOB_CRACKSHOOTER_HERO )
            nPoint += 150;
        else if( nJob ==  JOB_FLORIST_HERO )
            nPoint += 160;
        else if( nJob ==  JOB_FORCEMASTER_HERO || nJob ==  JOB_MENTALIST_HERO )
            nPoint += 180;
        else if( nJob ==  JOB_ELEMENTORLORD_HERO )
            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;
                }
            }
        }
        else if(IsLegendHero())
        {
            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( nJob == JOB_MENTALIST_HERO || nJob == JOB_FORCEMASTER_HERO )
        {
            CItemElem itemelem;
            itemelem.m_nItemNum = 1;
            itemelem.m_bCharged = TRUE;
            BYTE nID;

            if( nJob == JOB_MENTALIST_HERO )
                itemelem.m_dwItemId = II_WEA_BOOK_BOKROMAIN;
            if( nJob == JOB_FORCEMASTER_HERO )
                itemelem.m_dwItemId = II_ARM_ARM_SHI_ZEMBATO;

            ( ( 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 //__QUICKJOBCHANGE[/COLOR]
For 2nd Job Only~
Code:
[COLOR=Purple][U][B]At The Bottom You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
void CMover::InitLevelPumbaaa( int nJob, LONG nLevel, BOOL bGamma )
{
#ifdef __WORLDSERVER
    // ¿î¿µÀÚ ¸í·ÉÀ¸·Î ·¹º§¾÷ Çϴ°÷ÀÓ
    MoverProp* pProp = GetProp();
    if( pProp )
    {
        if( nJob > 0 && nJob < MAX_HERO )
        {
            AddChangeJob( nJob );
        }else{
            return;
        }
        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;
/*        else if( nJob ==  JOB_LORDTEMPLER_HERO || nJob ==  JOB_STORMBLADE_HERO )
            nPoint += 120;
        else if( nJob ==  JOB_WINDLURKER_HERO || nJob ==  JOB_CRACKSHOOTER_HERO )
            nPoint += 150;
        else if( nJob ==  JOB_FLORIST_HERO )
            nPoint += 160;
        else if( nJob ==  JOB_FORCEMASTER_HERO || nJob ==  JOB_MENTALIST_HERO )
            nPoint += 180;
        else if( nJob ==  JOB_ELEMENTORLORD_HERO )
            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;
                }
            }
        }
/*        else if(IsLegendHero())
        {
            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( nJob == JOB_MENTALIST_HERO || nJob == JOB_FORCEMASTER_HERO )
        {
            CItemElem itemelem;
            itemelem.m_nItemNum = 1;
            itemelem.m_bCharged = TRUE;
            BYTE nID;

            if( nJob == JOB_MENTALIST_HERO )
                itemelem.m_dwItemId = II_WEA_BOOK_BOKROMAIN;
            if( nJob == JOB_FORCEMASTER_HERO )
                itemelem.m_dwItemId = II_ARM_ARM_SHI_ZEMBATO;

            ( ( 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 //__QUICKJOBCHANGE[/COLOR]
Mover.h
Code:
[COLOR=Green][U][B]After~[/B][/U]
    void            InitLevel( int nJob, LONG nLevel, BOOL bGamma = TRUE );[/COLOR]

[COLOR=Red][U][B]You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
    void            InitLevelPumbaaa( int nJob, LONG nLevel, BOOL bGamma = TRUE ) ;
#endif //__QUICKJOBCHANGE[/COLOR]

MoverParam.cpp
For 3rd Job Only~
Code:
[COLOR=Green][U][B]Find~[/B][/U]
BOOL CMover::SetExperience( EXPINTEGER nExp1, int nLevel )
{
    m_nExp1        = nExp1;

    if( IsInvalidObj(this) )
        return 0;

    if( nLevel > m_nLevel )
    {[/COLOR]

[COLOR=Red][U][B]Change To~[/B][/U]
BOOL CMover::SetExperience( EXPINTEGER nExp1, int nLevel )
{
#ifdef __QUICKJOBCHANGE
    m_nExp1        = nExp1;

    if( IsInvalidObj(this) )
        return 0;
        
#ifdef __CLIENT
    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 // __QUICKJOBCHANGE

    m_nExp1        = nExp1;

    if( IsInvalidObj(this) )
        return 0;

    if( nLevel > m_nLevel )
    {
    
#endif //__QUICKJOBCHANGE[/COLOR]

[COLOR=Green][U][B]After~[/B][/U]
#if __VER < 12 // __MOD_TUTORIAL                
                if( GetLevel() != 1 )
                    pWndWorld->m_pWndGuideSystem->GuideStart(FALSE);
            #endif[/COLOR]

[COLOR=Red][U][B]You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
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 //__QUICKJOBCHANGE[/COLOR]

For 2nd Job Only~
Code:
[COLOR=Green][U][B]Find~[/B][/U]
BOOL CMover::SetExperience( EXPINTEGER nExp1, int nLevel )
{
    m_nExp1        = nExp1;

    if( IsInvalidObj(this) )
        return 0;

    if( nLevel > m_nLevel )
    {[/COLOR]

[COLOR=Red][U][B]Change To~[/B][/U]
BOOL CMover::SetExperience( EXPINTEGER nExp1, int nLevel )
{
#ifdef __QUICKJOBCHANGE
    m_nExp1        = nExp1;

    if( IsInvalidObj(this) )
        return 0;
        
#ifdef __CLIENT
    if( (GetLevel() == 120) && 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 // __QUICKJOBCHANGE

    m_nExp1        = nExp1;

    if( IsInvalidObj(this) )
        return 0;

    if( nLevel > m_nLevel )
    {
    
#endif //__QUICKJOBCHANGE[/COLOR]

[COLOR=Green][U][B]After~[/B][/U]
#if __VER < 12 // __MOD_TUTORIAL                
                if( GetLevel() != 1 )
                    pWndWorld->m_pWndGuideSystem->GuideStart(FALSE);
            #endif[/COLOR]

[COLOR=Red][U][B]You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
if( GetLevel() == 15 || GetLevel() == 60 )
{
    SAFE_DELETE( g_WndMng.m_pJobChangeEx );
    g_WndMng.m_pJobChangeEx = new CWndJobChangeEx;
    g_WndMng.m_pJobChangeEx->Initialize();
}
#endif //__QUICKJOBCHANGE[/COLOR]

WndManager.h
Code:
[COLOR=Green][U][B]After~[/B][/U]
#ifdef __GUILD_HOUSE_MIDDLE
#include "WndHousing.h"
#endif //__GUILD_HOUSE_MIDDLE[/COLOR]

[COLOR=Red][U][B]You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
#include "WndChangeJobEx.h"
#endif //__QUICKJOBCHANGE[/COLOR]

[COLOR=Green][U][B]After~[/B][/U]
    CWndPetStatus* m_pWndPetStatus;[/COLOR]

[COLOR=Red][U][B]You Add~[/B][/U]
#ifdef __QUICKJOBCHANGE
    CWndJobChangeEx* m_pJobChangeEx;
#endif //__QUICKJOBCHANGE[/COLOR]
VersionCommon.h (Neuz & Worldserver)
Code:
[COLOR=Red][U][B]Add~[/B][/U]

#define __QUICKJOBCHANGE //Released by pumbaaa thanks <3[/COLOR]

WndChangeJobEx.cpp & WndChangeJobEx.h
Code:
So, how to add these hm?
Add the files into the folder "_Interface".
Go To Visual Studio (after opening all.sln)
Click this button right here.
[IMG]http://screensnapr.com/e/fdnv5f.png[/IMG]
Mark the 2 new .cpp & .h
and Click "Open"!
Now the files should be in the solution :)

If for 3rd Job Only~ Use this WndChangeJobEx.cpp instead
WndChangeJobEx.cpp
Code:
#include "StdAfx.h"
#include "WndChangeJobEx.h"
#include "DPClient.h"
#include "DPLoginClient.h"
#include "Network.h"
#include "ResData.h"
#include "defineText.h"
#include "mover.h"

extern CDPClient g_DPlay;

CWndJobChangeEx::CWndJobChangeEx()
{
}

CWndJobChangeEx::~CWndJobChangeEx()
{
    DeleteDeviceObjects();
}

BOOL CWndJobChangeEx::Initialize( CWndBase* pWndParent, DWORD dwType )
{

    if( g_pPlayer->GetLevel() == 15 || g_pPlayer->GetLevel() == 60 || ( ( g_pPlayer->GetLevel() == 120 || g_pPlayer->GetLevel() == 129 ) && g_pPlayer->GetExpPercent() == 9999 ) )
    {
        if(  g_pPlayer->GetJob() == 0 )
        {
            nJobMin = 1;
            nJobMax = 4;
            nNewLv = 15;
        }
        else if( g_pPlayer->GetJob() < MAX_EXPERT )
        {
            nJobMin = (g_pPlayer->GetJob() + 2) * 2;
            nJobMax = nJobMin + 1;
            nNewLv = 60;
        }
        else if( g_pPlayer->GetJob() < MAX_PROFESSIONAL )
        {
            nJobMin = g_pPlayer->GetJob() + 10;
            nJobMax = nJobMin;
            nNewLv = 60;
        }
        else if( g_pPlayer->GetJob() < MAX_HERO )
        {
            nJobMin = g_pPlayer->GetJob() + 8;
            nJobMax = nJobMin;
            ( g_pPlayer->GetJob() < MAX_MASTER ) ? nNewLv = 121 : nNewLv = 130;
        }
        nCurJob = nJobMin;
    }else{
        nCurJob = 0;
    }
    return CWndNeuz::InitDialog( g_Neuz.GetSafeHwnd(), APP_FASTJOBCHANGE, 0, CPoint( 0, 0 ), pWndParent );
}

BOOL CWndJobChangeEx::OnChildNotify( UINT message, UINT nID, LRESULT* pLResult )
{
    switch( nID )
    {
    case WIDC_BUTTON4:
        g_DPlay.UpdateJob( nCurJob, nNewLv );
        Destroy();
        break;
    case WIDC_BUTTON2:
        if( nCurJob < nJobMax )
            nCurJob++;
        break;
    case WIDC_BUTTON3:
        if( nCurJob > nJobMin )
            nCurJob--;
        break;
    }
    return CWndNeuz::OnChildNotify( message, nID, pLResult );
}

void CWndJobChangeEx::OnDraw( C2DRender* p2DRender )
{
    char* szInfo[] = { "Error", "Mercenaries prefer to partake in close range combat. The main characteristics of this particular class involve physical strength, and a strong body that is able to withstand attacks.",
"Acrobats are those who mainly wield long distance weapons such as bows or yoyos. Using the skill tactics of speed and accuracy, they are usually able to break anyone willing enough to fight them.",
"Being an assist, you'll be able to choose to either be a fighter, or a healer. If a fighter is what you desire, assists generally favouritise close and personal combat. If supporting other characters is more your style, you may choose the alternative.",
"Magicians are ranged spell casters, they are able to focus large amounts of magic upon an enemy, dealing a great deal of damage before they are even reached. Magicians generally have lower defense, lower HP, and sometimes even delay when it comes to casting spells.",
"<Leer>",
"Knights are a second class for mercenaries and are the best tanks in the game. As a knight you will receive more health points per stamina point than any other class.",
"Blades are a second class for mercenaries and are the best damage dealers in the game. As a blade you will be able to wield two weapons at the same time and thus drastically increase your damage output.",
"Jesters focus on ranged attacks using Yo-Yos. They have a wide range of skills that allow them to be strong PvP'ers with their YoYo attacks, use some of their penya to do increased damage, and escape incoming attacks.",
"Rangers are a ranged based melee class that focus on using bow skills to damage enemies.",
"When it comes to partners, this class is the most sought after due to their ability to enhance others abilities and skills. With extra buffs and skills, this assist class is almost considered a necessity for game play; or, at least, they make it easier.",
"Billposters are undoubtedly the most self-sufficient class in the game. With their normal assist buffs, and their additional damage skills upon second job change, they are a very strong class. They are more of a melee class, and fight using a knuckle and a shield.",
"Psykeepers are one of the Magician's second classes. These, however, do not deal in the field of elemental damage. Most of the attacks, which are very powerful, tend to be based off mental and demonic forces.",
"Elementors are a second class for magicians and are a high damage spell casting class that uses staves to cast devastating elemental spells. ",
"<Leer>",
"<Leer>",
"Become master to get more strength",
"Become hero to get more strength",
"Templars are the third class for knights. The ultimate guardian, far more than just a meat shield. They are the epitome of defense and are the knights in shining armor legends are made of.",
"Slayers are the third class for blades. These ferocious fighters never relent on the attack, and their fury never ceases until all those that oppose them have been laid to waste at their hands.",
"Harlequins are the third class for Jesters and posses dark skills which allow them to attack from behind there foes and even vanish right in front of your eyes. The Harlequins make for a deadly class with there combo of stealth and attacks.",
"Crackshooters are the third class for Rangers and can kill from a much further distance than Rangers. They can equip the crossbow, a compact and highly lethal weapon, these ranged fighters can and will kill multiple targets.",
"Seraphs are the third class for Ringmasters. They are capable of mending any wound, big or small and can bless their companions and awaken strength, skill, and abilities few may think are possible and can even invoke the power of temporary immortality.",
"Force Masters are the third class for Billposters. All ready one of the strongest if not thee strongest class within Madrigal. The addition of the Force Master Skills brings the most welcome boost to party abilities. Any party would welcome the power's of a Force Master.",
"Mentalists are the third class for Psykeepers. These playful but graceful and fearsome magicians can manipulate the battlefield and foes to an untimely demise.",
"Arcanists are the third class for Elementors. Arcanists are experts in the art of elements and can rain down the heaven's to destroy all that lie in there way.",
};


    CWndButton* nJobPic = (CWndButton*)GetDlgItem( WIDC_BUTTON4 );
    CWndStatic* nJobTit = (CWndStatic*)GetDlgItem( WIDC_STATIC1 );
    CWndButton* chk1 = (CWndButton*) GetDlgItem( WIDC_BUTTON2 );
    CWndButton* chk2 = (CWndButton*) GetDlgItem( WIDC_BUTTON3 );
    CWndText* nJobInfo = (CWndText*)GetDlgItem( WIDC_TEXT1 );
    switch( nCurJob )
    {
    case 0:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotVan.bmp" ), TRUE );
        nJobPic->EnableWindow( FALSE );
        nJobTit->SetToolTip( "You don't have the right level" );
        nApply->EnableWindow( FALSE );
        nJobTit->SetTitle( "Error" );
        chk1->EnableWindow( FALSE );
        chk2->EnableWindow( FALSE );
        return;
        break;
    case 1:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotMer.bmp" ), TRUE );
        break;
    case 2:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotArc.bmp" ), TRUE );
        break;
    case 3:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotAs.bmp" ), TRUE );
        break;
    case 4:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotMag.bmp" ), TRUE );
        break;
    case 6: case 16: case 24:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotKnight.bmp" ), TRUE );
        break;
    case 7: case 17: case 25:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotBlad.bmp" ), TRUE );
        break;
    case 8: case 18: case 26:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotJes.bmp" ), TRUE );
        break;
    case 9: case 19: case 27:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotRan.bmp" ), TRUE );
        break;
    case 10: case 20: case 28:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotRingm.bmp" ), TRUE );
        break;
    case 11: case 21: case 29:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotBillfor.bmp" ), TRUE );
        break;
    case 12: case 22: case 30:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotPsy.bmp" ), TRUE );
        break;
    case 13: case 23: case 31:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotElem.bmp" ), TRUE );
        break;
    case 32:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotLord.bmp" ), TRUE );
        break;
    case 33:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotStormb.bmp" ), TRUE );
        break;
    case 34:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotWindI.bmp" ), TRUE );
        break;
    case 35:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotCracks.bmp" ), TRUE );
        break;
    case 36:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotFlor.bmp" ), TRUE );
        break;
    case 37:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotForcem.bmp" ), TRUE );
        break;
    case 38:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotMent.bmp" ), TRUE );
        break;
    case 39:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotElel.bmp" ), TRUE );
        break;
    default:
        return;
        break;
    }
    nJobPic->SetToolTip( prj.m_aJob[nCurJob].szName );
    nJobTit->SetTitle( prj.m_aJob[nCurJob].szName );
    ( nCurJob == nJobMax ) ? chk1->EnableWindow( FALSE ) : chk1->EnableWindow( TRUE );
    ( nCurJob == nJobMin ) ? chk2->EnableWindow( FALSE ):chk2->EnableWindow( TRUE );
    if( nCurJob < MAX_PROFESSIONAL )
        nJobInfo->SetString( szInfo[nCurJob] );
    else if( nCurJob < MAX_MASTER )
        nJobInfo->SetString( szInfo[MAX_PROFESSIONAL] );
    else if( nCurJob < MAX_HERO )
        nJobInfo->SetString( szInfo[MAX_PROFESSIONAL+1] );
    else
        nJobInfo->SetString( szInfo[nCurJob - 14] );

}

void CWndJobChangeEx::OnInitialUpdate( )
{
    CWndNeuz::OnInitialUpdate(); 
    RestoreDeviceObjects();

    
    CRect rectRoot = m_pWndRoot->GetLayoutRect();
    CRect rectWindow = GetWindowRect();
    CPoint point( rectRoot.right - rectWindow.Width(), 110 );
    Move( point );
    MoveParentCenter();
}

BOOL CWndJobChangeEx::OnCommand( UINT nID, DWORD dwMessage, CWndBase *pWndBase )
{
    return CWndNeuz::OnCommand( nID, dwMessage, pWndBase );
}

HRESULT CWndJobChangeEx::RestoreDeviceObjects()
{
    CWndNeuz::RestoreDeviceObjects();
    return S_OK;
}
HRESULT CWndJobChangeEx::InvalidateDeviceObjects()
{
    CWndNeuz::InvalidateDeviceObjects();
    return S_OK;
}
HRESULT CWndJobChangeEx::DeleteDeviceObjects()
{
    CWndNeuz::DeleteDeviceObjects();
    InvalidateDeviceObjects();
    return S_OK;
}

If for 2nd Job Only~ Use this WndChangeJobEx.cpp instead
WndChangeJobEx.cpp
Code:
#include "StdAfx.h"
#include "WndChangeJobEx.h"
#include "DPClient.h"
#include "DPLoginClient.h"
#include "Network.h"
#include "ResData.h"
#include "defineText.h"
#include "mover.h"

extern CDPClient g_DPlay;

CWndJobChangeEx::CWndJobChangeEx()
{
}

CWndJobChangeEx::~CWndJobChangeEx()
{
    DeleteDeviceObjects();
}

BOOL CWndJobChangeEx::Initialize( CWndBase* pWndParent, DWORD dwType )
{

    if( g_pPlayer->GetLevel() == 15 || g_pPlayer->GetLevel() == 60 || ( ( g_pPlayer->GetLevel() == 120 || g_pPlayer->GetLevel() == 129 ) && g_pPlayer->GetExpPercent() == 9999 ) )
    {
        if(  g_pPlayer->GetJob() == 0 )
        {
            nJobMin = 1;
            nJobMax = 4;
            nNewLv = 15;
        }
        else if( g_pPlayer->GetJob() < MAX_EXPERT )
        {
            nJobMin = (g_pPlayer->GetJob() + 2) * 2;
            nJobMax = nJobMin + 1;
            nNewLv = 60;
        }
        else if( g_pPlayer->GetJob() < MAX_PROFESSIONAL )
        {
            nJobMin = g_pPlayer->GetJob() + 10;
            nJobMax = nJobMin;
            nNewLv = 60;
        }
        else if( g_pPlayer->GetJob() < MAX_HERO )
        {
            nJobMin = g_pPlayer->GetJob() + 8;
            nJobMax = nJobMin;
            ( g_pPlayer->GetJob() < MAX_MASTER ) ? nNewLv = 121 : nNewLv = 130;
        }
        nCurJob = nJobMin;
    }else{
        nCurJob = 0;
    }
    return CWndNeuz::InitDialog( g_Neuz.GetSafeHwnd(), APP_FASTJOBCHANGE, 0, CPoint( 0, 0 ), pWndParent );
}

BOOL CWndJobChangeEx::OnChildNotify( UINT message, UINT nID, LRESULT* pLResult )
{
    switch( nID )
    {
    case WIDC_BUTTON4:
        g_DPlay.UpdateJob( nCurJob, nNewLv );
        Destroy();
        break;
    case WIDC_BUTTON2:
        if( nCurJob < nJobMax )
            nCurJob++;
        break;
    case WIDC_BUTTON3:
        if( nCurJob > nJobMin )
            nCurJob--;
        break;
    }
    return CWndNeuz::OnChildNotify( message, nID, pLResult );
}

void CWndJobChangeEx::OnDraw( C2DRender* p2DRender )
{
    char* szInfo[] = { "Error", "Mercenaries prefer to partake in close range combat. The main characteristics of this particular class involve physical strength, and a strong body that is able to withstand attacks.",
"Acrobats are those who mainly wield long distance weapons such as bows or yoyos. Using the skill tactics of speed and accuracy, they are usually able to break anyone willing enough to fight them.",
"Being an assist, you'll be able to choose to either be a fighter, or a healer. If a fighter is what you desire, assists generally favouritise close and personal combat. If supporting other characters is more your style, you may choose the alternative.",
"Magicians are ranged spell casters, they are able to focus large amounts of magic upon an enemy, dealing a great deal of damage before they are even reached. Magicians generally have lower defense, lower HP, and sometimes even delay when it comes to casting spells.",
"<Leer>",
"Knights are a second class for mercenaries and are the best tanks in the game. As a knight you will receive more health points per stamina point than any other class.",
"Blades are a second class for mercenaries and are the best damage dealers in the game. As a blade you will be able to wield two weapons at the same time and thus drastically increase your damage output.",
"Jesters focus on ranged attacks using Yo-Yos. They have a wide range of skills that allow them to be strong PvP'ers with their YoYo attacks, use some of their penya to do increased damage, and escape incoming attacks.",
"Rangers are a ranged based melee class that focus on using bow skills to damage enemies.",
"When it comes to partners, this class is the most sought after due to their ability to enhance others abilities and skills. With extra buffs and skills, this assist class is almost considered a necessity for game play; or, at least, they make it easier.",
"Billposters are undoubtedly the most self-sufficient class in the game. With their normal assist buffs, and their additional damage skills upon second job change, they are a very strong class. They are more of a melee class, and fight using a knuckle and a shield.",
"Psykeepers are one of the Magician's second classes. These, however, do not deal in the field of elemental damage. Most of the attacks, which are very powerful, tend to be based off mental and demonic forces.",
"Elementors are a second class for magicians and are a high damage spell casting class that uses staves to cast devastating elemental spells. ",
"<Leer>",
"<Leer>",
"Become master to get more strength",
"Become hero to get more strength",
/*"Templars are the third class for knights. The ultimate guardian, far more than just a meat shield. They are the epitome of defense and are the knights in shining armor legends are made of.",
"Slayers are the third class for blades. These ferocious fighters never relent on the attack, and their fury never ceases until all those that oppose them have been laid to waste at their hands.",
"Harlequins are the third class for Jesters and posses dark skills which allow them to attack from behind there foes and even vanish right in front of your eyes. The Harlequins make for a deadly class with there combo of stealth and attacks.",
"Crackshooters are the third class for Rangers and can kill from a much further distance than Rangers. They can equip the crossbow, a compact and highly lethal weapon, these ranged fighters can and will kill multiple targets.",
"Seraphs are the third class for Ringmasters. They are capable of mending any wound, big or small and can bless their companions and awaken strength, skill, and abilities few may think are possible and can even invoke the power of temporary immortality.",
"Force Masters are the third class for Billposters. All ready one of the strongest if not thee strongest class within Madrigal. The addition of the Force Master Skills brings the most welcome boost to party abilities. Any party would welcome the power's of a Force Master.",
"Mentalists are the third class for Psykeepers. These playful but graceful and fearsome magicians can manipulate the battlefield and foes to an untimely demise.",
"Arcanists are the third class for Elementors. Arcanists are experts in the art of elements and can rain down the heaven's to destroy all that lie in there way.",*/
};


    CWndButton* nJobPic = (CWndButton*)GetDlgItem( WIDC_BUTTON4 );
    CWndStatic* nJobTit = (CWndStatic*)GetDlgItem( WIDC_STATIC1 );
    CWndButton* chk1 = (CWndButton*) GetDlgItem( WIDC_BUTTON2 );
    CWndButton* chk2 = (CWndButton*) GetDlgItem( WIDC_BUTTON3 );
    CWndText* nJobInfo = (CWndText*)GetDlgItem( WIDC_TEXT1 );
    switch( nCurJob )
    {
    case 0:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotVan.bmp" ), TRUE );
        nJobPic->EnableWindow( FALSE );
        nJobTit->SetToolTip( "You don't have the right level" );
        nApply->EnableWindow( FALSE );
        nJobTit->SetTitle( "Error" );
        chk1->EnableWindow( FALSE );
        chk2->EnableWindow( FALSE );
        return;
        break;
    case 1:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotMer.bmp" ), TRUE );
        break;
    case 2:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotArc.bmp" ), TRUE );
        break;
    case 3:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotAs.bmp" ), TRUE );
        break;
    case 4:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotMag.bmp" ), TRUE );
        break;
    case 6: case 16: case 24:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotKnight.bmp" ), TRUE );
        break;
    case 7: case 17: case 25:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotBlad.bmp" ), TRUE );
        break;
    case 8: case 18: case 26:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotJes.bmp" ), TRUE );
        break;
    case 9: case 19: case 27:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotRan.bmp" ), TRUE );
        break;
    case 10: case 20: case 28:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotRingm.bmp" ), TRUE );
        break;
    case 11: case 21: case 29:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotBillfor.bmp" ), TRUE );
        break;
    case 12: case 22: case 30:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotPsy.bmp" ), TRUE );
        break;
    case 13: case 23: case 31:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotElem.bmp" ), TRUE );
        break;
    /*case 32:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotLord.bmp" ), TRUE );
        break;
    case 33:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotStormb.bmp" ), TRUE );
        break;
    case 34:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotWindI.bmp" ), TRUE );
        break;
    case 35:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotCracks.bmp" ), TRUE );
        break;
    case 36:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotFlor.bmp" ), TRUE );
        break;
    case 37:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotForcem.bmp" ), TRUE );
        break;
    case 38:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotMent.bmp" ), TRUE );
        break;
    case 39:
        nJobPic->SetTexture(D3DDEVICE, MakePath( DIR_THEME, "SlotElel.bmp" ), TRUE );
        break;*/
    default:
        return;
        break;
    }
    nJobPic->SetToolTip( prj.m_aJob[nCurJob].szName );
    nJobTit->SetTitle( prj.m_aJob[nCurJob].szName );
    ( nCurJob == nJobMax ) ? chk1->EnableWindow( FALSE ) : chk1->EnableWindow( TRUE );
    ( nCurJob == nJobMin ) ? chk2->EnableWindow( FALSE ):chk2->EnableWindow( TRUE );
    if( nCurJob < MAX_PROFESSIONAL )
        nJobInfo->SetString( szInfo[nCurJob] );
    else if( nCurJob < MAX_MASTER )
        nJobInfo->SetString( szInfo[MAX_PROFESSIONAL] );
    else if( nCurJob < MAX_HERO )
        nJobInfo->SetString( szInfo[MAX_PROFESSIONAL+1] );
    else
        nJobInfo->SetString( szInfo[nCurJob - 14] );

}

void CWndJobChangeEx::OnInitialUpdate( )
{
    CWndNeuz::OnInitialUpdate(); 
    RestoreDeviceObjects();

    
    CRect rectRoot = m_pWndRoot->GetLayoutRect();
    CRect rectWindow = GetWindowRect();
    CPoint point( rectRoot.right - rectWindow.Width(), 110 );
    Move( point );
    MoveParentCenter();
}

BOOL CWndJobChangeEx::OnCommand( UINT nID, DWORD dwMessage, CWndBase *pWndBase )
{
    return CWndNeuz::OnCommand( nID, dwMessage, pWndBase );
}

HRESULT CWndJobChangeEx::RestoreDeviceObjects()
{
    CWndNeuz::RestoreDeviceObjects();
    return S_OK;
}
HRESULT CWndJobChangeEx::InvalidateDeviceObjects()
{
    CWndNeuz::InvalidateDeviceObjects();
    return S_OK;
}
HRESULT CWndJobChangeEx::DeleteDeviceObjects()
{
    CWndNeuz::DeleteDeviceObjects();
    InvalidateDeviceObjects();
    return S_OK;
}


Resource
Resdata.h
Code:
[COLOR=Red][U][B]You Add These Stuff~[/B][/U]

#define APP_FASTJOBCHANGE                        907
[/COLOR]
Info::~ Since it is an "APP_", if the number 907 already exists, just take the next possible (Do not duplicate the number with another "APP_" number)

Resdata.inc (OLD RESDATA)
Code:
[COLOR=Red][U][B]You Add~[/B][/U]
APP_FASTJOBCHANGE "WndTile00.tga" 1 288 240 0x2410000 26
{
// Title String
IDS_RESDATA_INC_017466
}
{
// Help Key
IDS_RESDATA_INC_017471
}
{
    WTYPE_TEXT WIDC_TEXT1 "WndEditTile00.tga" 1 12 78 264 170 0x20020000 0 0 0 0
    {
    // Title String
IDS_RESDATA_INC_017465
    }
    {
    // ToolTip
IDS_RESDATA_INC_017465
    }
    WTYPE_BUTTON WIDC_BUTTON2 "Buttright2.bmp" 0 223 172 264 192 0x220010 0 0 0 0
    {
    // Title String
IDS_RESDATA_INC_017471
    }
    {
    // ToolTip
IDS_RESDATA_INC_017467
    }
    WTYPE_BUTTON WIDC_BUTTON3 "Buttleft2.bmp" 0 12 172 53 192 0x220010 0 0 0 0
    {
    // Title String
IDS_RESDATA_INC_017471
    }
    {
    // ToolTip
IDS_RESDATA_INC_017468
    }
    WTYPE_BUTTON WIDC_BUTTON4 "SlotVan.bmp" 0 8 8 72 72 0x220010 0 0 0 0
    {
    // Title String
IDS_RESDATA_INC_017470
    }
    {
    // ToolTip
IDS_RESDATA_INC_017469
    }
    WTYPE_STATIC WIDC_STATIC1 "" 0 78 52 264 68 0x2220000 0 0 0 0
    {
    // Title String
IDS_RESDATA_INC_017470
    }
    {
    // ToolTip
IDS_RESDATA_INC_017471
    }

}[/COLOR]

Resdata.inc (NEW RESDATA)
Code:
[COLOR=Red][U][B]You Add~[/B][/U]
APP_FASTJOBCHANGE "WndTile00.tga" "" 1 288 240 0x2410000 26
{
// Title String
IDS_RESDATA_INC_017466
}
{
// Help Key
IDS_RESDATA_INC_017471
}
{
    WTYPE_TEXT WIDC_TEXT1 "WndEditTile00.tga" 1 12 78 264 170 0x20020000 0 0 0 0 46 112 169
    {
    // Title String
IDS_RESDATA_INC_017465
    }
    {
    // ToolTip
IDS_RESDATA_INC_017465
    }
    WTYPE_BUTTON WIDC_BUTTON2 "Buttright2.bmp" 0 223 172 264 192 0x220010 0 0 0 0 46 112 169
    {
    // Title String
IDS_RESDATA_INC_017471
    }
    {
    // ToolTip
IDS_RESDATA_INC_017467
    }
    WTYPE_BUTTON WIDC_BUTTON3 "Buttleft2.bmp" 0 12 172 53 192 0x220010 0 0 0 0 46 112 169
    {
    // Title String
IDS_RESDATA_INC_017471
    }
    {
    // ToolTip
IDS_RESDATA_INC_017468
    }
    WTYPE_BUTTON WIDC_BUTTON4 "SlotVan.bmp" 0 8 8 72 72 0x220010 0 0 0 0 46 112 169
    {
    // Title String
IDS_RESDATA_INC_017470
    }
    {
    // ToolTip
IDS_RESDATA_INC_017469
    }
    WTYPE_STATIC WIDC_STATIC1 "" 0 78 52 264 68 0x2220000 0 0 0 0 46 112 169
    {
    // Title String
IDS_RESDATA_INC_017470
    }
    {
    // ToolTip
IDS_RESDATA_INC_017471
    }

}[/COLOR]

ResData.txt
Code:
[COLOR=Red][U][B]You Add~[/B][/U]
IDS_RESDATA_INC_017465    
IDS_RESDATA_INC_017466    Quick Jobchange
IDS_RESDATA_INC_017467    Next
IDS_RESDATA_INC_017468    Previous
IDS_RESDATA_INC_017469    Do It!
IDS_RESDATA_INC_017470    
IDS_RESDATA_INC_017471    
IDS_RESDATA_INC_017472    
[/COLOR]
Info::~ As Usual, if the ID Numbers already exist, change it to the next possible :)


And as Usual, End words!!

I have done some changes to pumbaaa's Quick change job..

change 1:
There is no "Change" Button anymore, now when you click on the picture, the character will change to that job!

change 2:
Fixed the text on the window, now it does not say "IDS_****" when mouse is hovering over a button / text

Change 3:
I have made a window for the NEW resdata and OLD resdata

Change 4:
I have made quick job change up to Hero and one up to 3rd Job

Change 5: The code is now inside an ID "__QUICKJOBCHANGE",
so if you feel like removing it, then removing the ID from both versioncommon.h is enough :)

Change 6: I am too damn awesome so I just needed to say that.

Info 1: I dont have 3rd job in my server, so if anyone has 3rd job, could you please comment on how it worked for you? Would greatly appriciate it.

I hope you like it, and there should not be any problems whatsoever, tried to change my job more then 64 times already haha..

If you would need any kind of help, just write your error log you get in a Spoiler and I and many others will try to help you as much as possible ^^

SlideShow For Pictures ---->>

3rd job change does not work for you?
Here's the fix for that! ~ http://forum.ragezone.com/f457/source-quickchange-3rd-job-level-818682/#post6827132

Sincerely~ Xakzi

EDIT: IF YOU GET THE ERROR GETDLGITEM : nID=933 NOT FOUND, GO TO WNDCHANGEJOBEX.CPP AND DELETE THIS LINE
Code:
    CWndButton* nApply = (CWndButton*)GetDlgItem( WIDC_BUTTON1 );



ok Done, I fixed the errors while compiling and it compiled with no errors.

One more problem, The server starts fine and no errors, but when I try to start the client I get this weird window that pops up and client will not start.
Xakzi - [Help] add the QuickJobChange In Source - RaGEZONE Forums

I added everything to my resource files, and I also added everything to my .Res files in client.

Anyone else have this issue? and how can I fix it?

Same problem. how did you fix this issue
 
Upvote 0
Newbie Spellweaver
Joined
Dec 15, 2015
Messages
19
Reaction score
0
I have followed everything, I get an error while compiling which is
wndChangeJobEx.cpp
'nApply': undeclared identifier.

any ideas?



Fixed. Commented out the line.
 
Upvote 0
Newbie Spellweaver
Joined
Sep 5, 2008
Messages
79
Reaction score
10
I pasted everything from the tut, commented the nApply, compiled it but when i level from 14 to 15 there is no window, same goes for 59 -> 60. But when i use gm commands to become a 61 knight for example and change back to a tier 1 job level 60 it pops up and i can chose a job. Same goes for level 15. If i become a level 16 tier 1 job and convert back to a level 15 Vagrant the window pops up. Anyone knows how i can fix that ?
 
Upvote 0
Newbie Spellweaver
Joined
Sep 28, 2014
Messages
17
Reaction score
0
can someone re up the file please. I can't download it



Hello, so I compiled the source and I eventually got this error


what should I do from this point?

Thank you!

Edit: The first error is solved, I solved the second error by removing "nApply->EnableWindow( FALSE );", only the 3rd error remains
 
Last edited:
Upvote 0
Newbie Spellweaver
Joined
Sep 28, 2014
Messages
17
Reaction score
0
bump, still stuck in this error. I've checked the files that I copied multiple times and so far I copied it right
 
Upvote 0
Inactive
Joined
Jan 20, 2009
Messages
1,014
Reaction score
1,830
Error is pretty self explanatory tbh, you need to make the code meet current compiler standards.

Replace
Code:
OnUpdateJob

With
Code:
&CDPSrver::OnUpdateJob

Where the packet is called on DpSrvr.cpp
 
Last edited:
Upvote 0
Newbie Spellweaver
Joined
Sep 28, 2014
Messages
17
Reaction score
0
Error is pretty self explanatory tbh, you need to make the code meet current compiler standards.

Replace
Code:
OnUpdateJob

With
Code:
&CDPSrver::OnUpdateJob

Where the packet is called on DpSrvr.cpp

It succeeded in building. Thanks again, Ketchup! really need a mentor for this
 
Last edited:
Upvote 0
Initiate Mage
Joined
Mar 23, 2020
Messages
4
Reaction score
0
Can anyone help me with this error?

Neuz error LNK2019: unresolved external symbol "public: __thiscall CWndJobChangeEx::CWndJobChangeEx(void)" (??0CWndJobChangeEx@@QAE@XZ) referenced in function "public: int __thiscall CMover::SetExperience(__int64,int)" (?SetExperience@CMover@@QAEH_JH@Z)Neuz fatal error LNK1120: 1 unresolved externals
 
Upvote 0
Inactive
Joined
Jan 20, 2009
Messages
1,014
Reaction score
1,830
Can anyone help me with this error?

Neuz error LNK2019: unresolved external symbol "public: __thiscall CWndJobChangeEx::CWndJobChangeEx(void)" (??0CWndJobChangeEx@@QAE@XZ) referenced in function "public: int __thiscall CMover::SetExperience(__int64,int)" (?SetExperience@CMover@@QAEH_JH@Z)Neuz fatal error LNK1120: 1 unresolved externals

Make sure you have applied ALL edits as your missing something.
 
Upvote 0
Initiate Mage
Joined
Mar 23, 2020
Messages
4
Reaction score
0
Thanks for the response Ketchup,

I made sure that I have applied all edits, I even tried to redo everything and I still can't find or fix the error.
 
Upvote 0
Newbie Spellweaver
Joined
Nov 28, 2018
Messages
31
Reaction score
0
when I turned level 15 it doesnt show up, nothing happens but when I compile the source theres no error. What should I do?
 
Upvote 0
Back
Top