[Help] add the QuickJobChange In Source

Page 1 of 16 12345678911 ... LastLast
Results 1 to 15 of 235
  1. #1
    One word! Im Fawkin Pro! Xakzi is offline
    MemberRank
    Jul 2010 Join Date
    SwedenLocation
    1,356Posts

    [Help] add the QuickJobChange In Source

    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/sourc...hanger-769708/

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

    (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
    Spoiler:

    MsgHdr.h
    Spoiler:

    Code:
    After~
    #define PACKETTYPE_QUERYMAILBOX_COUNT				(DWORD)0x88100241
    You Add~
    #ifdef __QUICKJOBCHANGE
    #define PACKETTYPE_UPDATE_JOB						(DWORD)0x88100242
    #endif //__QUICKJOBCHANGE
    Info::~ If 0x88100243 is already added, add 0x88100242, just be sure it is not duplicated


    DPClient.cpp
    Spoiler:
    Code:
    After~
    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
    
    You Add~
    #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


    DPClient.h
    Spoiler:
    Code:
    After~
    #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
    
    You Add~
    #ifdef __QUICKJOBCHANGE
    	void	UpdateJob( int nJob, int nLevel );
    #endif //__QUICKJOBCHANGE

    DPSrvr.cpp
    Spoiler:

    Code:
    After~
    #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
    
    You Add~
    #ifdef __QUICKJOBCHANGE
    	ON_MSG( PACKETTYPE_UPDATE_JOB, OnUpdateJob );
    #endif // __QUICKJOBCHANGE
    
    After~
    #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
    
    You Add~
    #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


    DPSrvr.h
    Spoiler:
    Code:
    After~
    #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
    
    You Add~
    #ifdef __QUICKJOBCHANGE
    void	OnUpdateJob( CAr & ar, DPID dpidCache, DPID dpidUser, LPBYTE, u_long );
    #endif //__QUICKJOBCHANGE

    Mover.cpp
    Spoiler:
    For 3rd Job Only~
    Spoiler:
    Code:
    At The Bottom You Add~
    #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
    For 2nd Job Only~
    Spoiler:
    Code:
    At The Bottom You Add~
    #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

    Mover.h
    Spoiler:
    Code:
    After~
    	void			InitLevel( int nJob, LONG nLevel, BOOL bGamma = TRUE );
    
    You Add~
    #ifdef __QUICKJOBCHANGE
    	void			InitLevelPumbaaa( int nJob, LONG nLevel, BOOL bGamma = TRUE ) ;
    #endif //__QUICKJOBCHANGE


    MoverParam.cpp
    Spoiler:

    For 3rd Job Only~
    Spoiler:
    Code:
    Find~
    BOOL CMover::SetExperience( EXPINTEGER nExp1, int nLevel )
    {
    	m_nExp1		= nExp1;
    
    	if( IsInvalidObj(this) )
    		return 0;
    
    	if( nLevel > m_nLevel )
    	{
    
    Change To~
    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
    
    After~
    #if __VER < 12 // __MOD_TUTORIAL				
    				if( GetLevel() != 1 )
    					pWndWorld->m_pWndGuideSystem->GuideStart(FALSE);
    			#endif
    
    You Add~
    #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


    For 2nd Job Only~
    Spoiler:
    Code:
    Find~
    BOOL CMover::SetExperience( EXPINTEGER nExp1, int nLevel )
    {
    	m_nExp1		= nExp1;
    
    	if( IsInvalidObj(this) )
    		return 0;
    
    	if( nLevel > m_nLevel )
    	{
    
    Change To~
    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
    
    After~
    #if __VER < 12 // __MOD_TUTORIAL				
    				if( GetLevel() != 1 )
    					pWndWorld->m_pWndGuideSystem->GuideStart(FALSE);
    			#endif
    
    You Add~
    #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


    WndManager.h
    Spoiler:
    Code:
    After~
    #ifdef __GUILD_HOUSE_MIDDLE
    #include "WndHousing.h"
    #endif //__GUILD_HOUSE_MIDDLE
    
    You Add~
    #ifdef __QUICKJOBCHANGE
    #include "WndChangeJobEx.h"
    #endif //__QUICKJOBCHANGE
    
    After~
    	CWndPetStatus* m_pWndPetStatus;
    
    You Add~
    #ifdef __QUICKJOBCHANGE
    	CWndJobChangeEx* m_pJobChangeEx;
    #endif //__QUICKJOBCHANGE

    VersionCommon.h (Neuz & Worldserver)
    Spoiler:
    Code:
    Add~
    
    #define __QUICKJOBCHANGE //Released by pumbaaa thanks <3


    WndChangeJobEx.cpp & WndChangeJobEx.h
    Spoiler:

    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.
    
    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
    Spoiler:
    WndChangeJobEx.cpp
    Spoiler:
    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
    Spoiler:
    WndChangeJobEx.cpp
    Spoiler:
    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
    Spoiler:


    Resdata.h
    Spoiler:
    Code:
    You Add These Stuff~
    
    #define APP_FASTJOBCHANGE						907
    
    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)
    Spoiler:
    Code:
    You Add~
    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
        }
    
    }


    Resdata.inc (NEW RESDATA)
    Spoiler:
    Code:
    You Add~
    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
        }
    
    }


    ResData.txt
    Spoiler:
    Code:
    You Add~
    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	
    
    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 ---->> Click Here To See The New Window

    3rd job change does not work for you?
    Here's the fix for that! ~ http://forum.ragezone.com/f457/sourc...2/#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 Ketchup; 27-12-20 at 11:45 PM.


  2. #2
    Apprentice NathanKent is offline
    MemberRank
    Dec 2011 Join Date
    10Posts

    Re: How to add the QuickJobChange In Source

    Thanks a lot! Will give it a go tomorrow :)

  3. #3
    Account Upgraded | Title Enabled! kolelolx is offline
    MemberRank
    Oct 2010 Join Date
    577Posts

    Re: How to add the QuickJobChange In Source

    I thought it was kinda self explanatory o.o
    Posted via Mobile Device

  4. #4
    Flyff Developer ShadowDragon is offline
    MemberRank
    Apr 2009 Join Date
    1,916Posts

    Re: How to add the QuickJobChange In Source

    I thought so too. Although he made it noob friendly and fixed a few things, there are still a few bugs left in the original coding (one of which I guess we can overlook, since it's related to 3rd jobs).

    The first, is that if you get to a job change level other than one that requires 99.99% exp (which is most of them) and you close the window, you're stuck at that level and have to do the quest instead.

    The second, which pertains to 3rd jobs, is that if your inventory is full when you do job change on a Forcemaster or Mentalist, then you never get your class's shield.

    The third, is that when you job change to master, you get way more skill points than you're supposed to have.

    Note: I'm not asking for fixes. I've already fixed them myself, just telling others about them.
    Last edited by ShadowDragon; 16-12-11 at 05:50 AM.

  5. #5
    Apprentice NathanKent is offline
    MemberRank
    Dec 2011 Join Date
    10Posts

    Re: How to add the QuickJobChange In Source

    Its self explanatory for someone who knows how to do it... I have never coded in my life and I would not of known to put them extra lines of code. I learn better when shown what to do and just reading that code kind of makes sense to me now. So thanks again ;)

    I give up :( Error after error no matter what I do.


    Spoiler:
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(19): error C2143: syntax error : missing ';' before 'this'
    c:\Users\User\Desktop\Server\v16\Source\WORLDSERVER\DPSrvr.cpp(556): error C2501: 'pfn' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\WORLDSERVER\DPSrvr.cpp(556): error C2065: 'OnUpdateJob' : undeclared identifier
    c:\Users\User\Desktop\Server\v16\Source\WORLDSERVER\DPSrvr.cpp(556): error C2143: syntax error : missing ';' before '.'
    c:\Users\User\Desktop\Server\v16\Source\WORLDSERVER\DPSrvr.cpp(556): error C2501: 'm_pfnEntries' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\Neuz\mover.h error C2470: 'under' : looks like a function definition, but there is no formal parameter list; skipping apparent body
    c:\Users\User\Desktop\Server\v16\Source\Neuz\mover.h error C2062: type 'void' unexpected
    c:\Users\User\Desktop\Server\v16\Source\Neuz\mover.h(4): error C2062: type 'void' unexpected
    c:\Users\User\Desktop\Server\v16\Source\Neuz\mover.h(4): error C2630: ';' found in what should be a comma-separated list
    c:\Users\User\Desktop\Server\v16\Source\Neuz\mover.h(7): error C2059: syntax error : 'this'
    c:\Users\User\Desktop\Server\v16\Source\Neuz\mover.h(7): error C2630: ';' found in what should be a comma-separated list
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(17): error C2059: syntax error : '<class-head>'
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(17): error C2630: ';' found in what should be a comma-separated list
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(62): error C2143: syntax error : missing ';' before '*'
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(62): error C2501: 'LPREGIONELEM' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(77): error C2146: syntax error : missing ',' before identifier 'lpRegionElem'
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(78): error C2146: syntax error : missing ';' before identifier 'GetAt'
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(78): error C2501: 'CRegionElemArray::LPREGIONELEM' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(78): warning C4183: 'GetAt': missing return type; assumed to be a member function returning 'int'
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(81): error C2146: syntax error : missing ',' before identifier 'lpRegionElem'
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(84): error C2065: 'lpRegionElem' : undeclared identifier
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(86): error C2143: syntax error : missing ';' before 'CRegionElemArray::GetAt'
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(86): error C2433: 'LPREGIONELEM' : 'inline' not permitted on data declarations
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(86): error C2501: 'LPREGIONELEM' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(86): error C2040: 'LPREGIONELEM' : 'int' differs in levels of indirection from 'int *'
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(89): error C2440: 'return' : cannot convert from 'REGIONELEM *' to 'int'
    This conversion requires a reinterpret_cast, a C-style cast or function-style cast
    c:\Users\User\Desktop\Server\v16\Source\_Common\Sfx.h(504): error C2143: syntax error : missing ';' before '*'
    c:\Users\User\Desktop\Server\v16\Source\_Common\Sfx.h(504): error C2501: 'CSfxItemRangeAtk1::CTailEffectBelt' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Common\Sfx.h(504): error C2501: 'CSfxItemRangeAtk1::m_pTail' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Common\Sfx.h(577): error C2143: syntax error : missing ';' before '*'
    c:\Users\User\Desktop\Server\v16\Source\_Common\Sfx.h(577): error C2501: 'CSfxItemRangeAtk_JunkBow::CTailEffectBelt' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Common\Sfx.h(577): error C2501: 'CSfxItemRangeAtk_JunkBow::m_pTail' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Common\Sfx.h(597): error C2143: syntax error : missing ';' before '*'
    c:\Users\User\Desktop\Server\v16\Source\_Common\Sfx.h(597): error C2501: 'CSfxItemYoyoAtk::CTailEffectModel' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Common\Sfx.h(597): error C2501: 'CSfxItemYoyoAtk::m_pTail' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndTitle.h(184): error C2146: syntax error : missing ';' before identifier 'm_Player'
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndTitle.h(184): error C2501: 'CWndCreateChar::PLAYER' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndTitle.h(184): error C2501: 'CWndCreateChar::m_Player' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndField.h(257): error C2146: syntax error : missing ';' before identifier 'm_aEquipInfoAdd'
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndField.h(257): error C2501: 'CWndQueryEquip::EQUIP_INFO_ADD' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndField.h(257): error C2501: 'CWndQueryEquip::m_aEquipInfoAdd' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndField.h(268): error C2061: syntax error : identifier 'EQUIP_INFO_ADD'
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndField.h(621): error C2065: 'MAX_SKILL_JOB' : undeclared identifier
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndField.h(1028): error C2065: 'MAX_NAME' : undeclared identifier
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndField.h(1047): error C3861: 'MAX_NAME': identifier not found, even with argument-dependent lookup
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndField.h(1293): error C3861: 'MAX_NAME': identifier not found, even with argument-dependent lookup
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndField.h(1333): error C3861: 'MAX_NAME': identifier not found, even with argument-dependent lookup
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndField.h(1334): error C3861: 'MAX_NAME': identifier not found, even with argument-dependent lookup
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndField.h(1664): error C3861: 'MAX_NAME': identifier not found, even with argument-dependent lookup
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndWorld.h(392): error C3861: 'MAX_NAME': identifier not found, even with argument-dependent lookup
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h error C2146: syntax error : missing ';' before identifier 'CWndReSkillWarning'
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h error C2501: 'under' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(3): error C2143: syntax error : missing ';' before 'this'
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(3): error C2501: 'insert' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(3): error C2143: syntax error : missing ';' before '*'
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(3): error C2501: 'CWndJobChangeEx' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(3): error C2501: 'm_pJobChangeEx' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(10): error C2143: syntax error : missing ';' before '*'
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(10): error C2501: 'CWndJobChangeEx' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(10): error C2086: 'int CWndJobChangeEx' : redefinition
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(3) : see declaration of 'CWndJobChangeEx'
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(10): error C2501: 'm_pJobChangeEx' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(10): error C2086: 'int *m_pJobChangeEx' : redefinition
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(3) : see declaration of 'm_pJobChangeEx'
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndHelp.h(7): error C2143: syntax error : missing ';' before '<class-head>'
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndHelp.h(7): error C2501: 'under' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndHelp.h(7): error C2086: 'int under' : redefinition
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(1) : see declaration of 'under'
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(19): error C2501: 'insert' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(19): error C2086: 'int insert' : redefinition
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(3) : see declaration of 'insert'
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(19): error C2014: preprocessor command must start as first nonwhite space
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndGuildTabMember.h(16): error C3861: 'MAX_NAME': identifier not found, even with argument-dependent lookup
    c:\Users\User\Desktop\Server\v16\Source\Neuz\Neuz.h(165): error C3861: 'MAX_NAME': identifier not found, even with argument-dependent lookup

  6. #6
    One word! Im Fawkin Pro! Xakzi is offline
    MemberRank
    Jul 2010 Join Date
    SwedenLocation
    1,356Posts

    Re: How to add the QuickJobChange In Source

    Quote Originally Posted by kolelolx View Post
    I thought it was kinda self explanatory o.o
    Posted via Mobile Device
    pretty much is xd

    Quote Originally Posted by ShadowDragon42 View Post
    I thought so too. Although he made it noob friendly and fixed a few things, there are still a few bugs left in the original coding (one of which I guess we can overlook, since it's related to 3rd jobs).

    The first, is that if you get to a job change level other than one that requires 99.99% exp (which is most of them) and you close the window, you're stuck at that level and have to do the quest instead.

    The second, which pertains to 3rd jobs, is that if your inventory is full when you do job change on a Forcemaster or Mentalist, then you never get your class's shield.

    The third, is that when you job change to master, you get way more skill points than you're supposed to have.

    Note: I'm not asking for fixes. I've already fixed them myself, just telling others about them.
    yeah, i noticed that too really, but I did not care much of it haha, uhm I guess I can change so you are unable to close the window at all..

    the inventory thing, will probably remove the items you gain, since you should not be possible to get them for free anyhow..

    the master thingy, gonna check it out ^^

    I will try to fix them anyway

    Quote Originally Posted by NathanKent View Post
    Its self explanatory for someone who knows how to do it... I have never coded in my life and I would not of known to put them extra lines of code. I learn better when shown what to do and just reading that code kind of makes sense to me now. So thanks again ;)

    I give up :( Error after error no matter what I do.


    Spoiler:
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(19): error C2143: syntax error : missing ';' before 'this'
    c:\Users\User\Desktop\Server\v16\Source\WORLDSERVER\DPSrvr.cpp(556): error C2501: 'pfn' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\WORLDSERVER\DPSrvr.cpp(556): error C2065: 'OnUpdateJob' : undeclared identifier
    c:\Users\User\Desktop\Server\v16\Source\WORLDSERVER\DPSrvr.cpp(556): error C2143: syntax error : missing ';' before '.'
    c:\Users\User\Desktop\Server\v16\Source\WORLDSERVER\DPSrvr.cpp(556): error C2501: 'm_pfnEntries' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\Neuz\mover.h error C2470: 'under' : looks like a function definition, but there is no formal parameter list; skipping apparent body
    c:\Users\User\Desktop\Server\v16\Source\Neuz\mover.h error C2062: type 'void' unexpected
    c:\Users\User\Desktop\Server\v16\Source\Neuz\mover.h(4): error C2062: type 'void' unexpected
    c:\Users\User\Desktop\Server\v16\Source\Neuz\mover.h(4): error C2630: ';' found in what should be a comma-separated list
    c:\Users\User\Desktop\Server\v16\Source\Neuz\mover.h(7): error C2059: syntax error : 'this'
    c:\Users\User\Desktop\Server\v16\Source\Neuz\mover.h(7): error C2630: ';' found in what should be a comma-separated list
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(17): error C2059: syntax error : '<class-head>'
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(17): error C2630: ';' found in what should be a comma-separated list
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(62): error C2143: syntax error : missing ';' before '*'
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(62): error C2501: 'LPREGIONELEM' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(77): error C2146: syntax error : missing ',' before identifier 'lpRegionElem'
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(78): error C2146: syntax error : missing ';' before identifier 'GetAt'
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(78): error C2501: 'CRegionElemArray::LPREGIONELEM' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(78): warning C4183: 'GetAt': missing return type; assumed to be a member function returning 'int'
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(81): error C2146: syntax error : missing ',' before identifier 'lpRegionElem'
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(84): error C2065: 'lpRegionElem' : undeclared identifier
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(86): error C2143: syntax error : missing ';' before 'CRegionElemArray::GetAt'
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(86): error C2433: 'LPREGIONELEM' : 'inline' not permitted on data declarations
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(86): error C2501: 'LPREGIONELEM' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(86): error C2040: 'LPREGIONELEM' : 'int' differs in levels of indirection from 'int *'
    c:\Users\User\Desktop\Server\v16\Source\_Common\Region.h(89): error C2440: 'return' : cannot convert from 'REGIONELEM *' to 'int'
    This conversion requires a reinterpret_cast, a C-style cast or function-style cast
    c:\Users\User\Desktop\Server\v16\Source\_Common\Sfx.h(504): error C2143: syntax error : missing ';' before '*'
    c:\Users\User\Desktop\Server\v16\Source\_Common\Sfx.h(504): error C2501: 'CSfxItemRangeAtk1::CTailEffectBelt' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Common\Sfx.h(504): error C2501: 'CSfxItemRangeAtk1::m_pTail' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Common\Sfx.h(577): error C2143: syntax error : missing ';' before '*'
    c:\Users\User\Desktop\Server\v16\Source\_Common\Sfx.h(577): error C2501: 'CSfxItemRangeAtk_JunkBow::CTailEffectBelt' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Common\Sfx.h(577): error C2501: 'CSfxItemRangeAtk_JunkBow::m_pTail' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Common\Sfx.h(597): error C2143: syntax error : missing ';' before '*'
    c:\Users\User\Desktop\Server\v16\Source\_Common\Sfx.h(597): error C2501: 'CSfxItemYoyoAtk::CTailEffectModel' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Common\Sfx.h(597): error C2501: 'CSfxItemYoyoAtk::m_pTail' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndTitle.h(184): error C2146: syntax error : missing ';' before identifier 'm_Player'
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndTitle.h(184): error C2501: 'CWndCreateChar::PLAYER' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndTitle.h(184): error C2501: 'CWndCreateChar::m_Player' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndField.h(257): error C2146: syntax error : missing ';' before identifier 'm_aEquipInfoAdd'
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndField.h(257): error C2501: 'CWndQueryEquip::EQUIP_INFO_ADD' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndField.h(257): error C2501: 'CWndQueryEquip::m_aEquipInfoAdd' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndField.h(268): error C2061: syntax error : identifier 'EQUIP_INFO_ADD'
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndField.h(621): error C2065: 'MAX_SKILL_JOB' : undeclared identifier
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndField.h(1028): error C2065: 'MAX_NAME' : undeclared identifier
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndField.h(1047): error C3861: 'MAX_NAME': identifier not found, even with argument-dependent lookup
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndField.h(1293): error C3861: 'MAX_NAME': identifier not found, even with argument-dependent lookup
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndField.h(1333): error C3861: 'MAX_NAME': identifier not found, even with argument-dependent lookup
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndField.h(1334): error C3861: 'MAX_NAME': identifier not found, even with argument-dependent lookup
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndField.h(1664): error C3861: 'MAX_NAME': identifier not found, even with argument-dependent lookup
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndWorld.h(392): error C3861: 'MAX_NAME': identifier not found, even with argument-dependent lookup
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h error C2146: syntax error : missing ';' before identifier 'CWndReSkillWarning'
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h error C2501: 'under' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(3): error C2143: syntax error : missing ';' before 'this'
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(3): error C2501: 'insert' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(3): error C2143: syntax error : missing ';' before '*'
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(3): error C2501: 'CWndJobChangeEx' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(3): error C2501: 'm_pJobChangeEx' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(10): error C2143: syntax error : missing ';' before '*'
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(10): error C2501: 'CWndJobChangeEx' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(10): error C2086: 'int CWndJobChangeEx' : redefinition
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(3) : see declaration of 'CWndJobChangeEx'
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(10): error C2501: 'm_pJobChangeEx' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(10): error C2086: 'int *m_pJobChangeEx' : redefinition
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(3) : see declaration of 'm_pJobChangeEx'
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndHelp.h(7): error C2143: syntax error : missing ';' before '<class-head>'
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndHelp.h(7): error C2501: 'under' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndHelp.h(7): error C2086: 'int under' : redefinition
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(1) : see declaration of 'under'
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(19): error C2501: 'insert' : missing storage-class or type specifiers
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(19): error C2086: 'int insert' : redefinition
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(3) : see declaration of 'insert'
    c:\Users\User\Desktop\Server\v16\Source\Neuz\WndManager.h(19): error C2014: preprocessor command must start as first nonwhite space
    c:\Users\User\Desktop\Server\v16\Source\_Interface\WndGuildTabMember.h(16): error C3861: 'MAX_NAME': identifier not found, even with argument-dependent lookup
    c:\Users\User\Desktop\Server\v16\Source\Neuz\Neuz.h(165): error C3861: 'MAX_NAME': identifier not found, even with argument-dependent lookup

    I wonder hwo you manage to get error on files that you dont even touch, have you added the path for the resource to begin with?
    These are the same errors from your help thread, do this, re-download the v15 source I linked on the top (spiken's)

    Add the right path and shit to it, compile, if you manage to compile it, go back to this thread and add the quick job change:)

  7. #7
    Flyff Developer ShadowDragon is offline
    MemberRank
    Apr 2009 Join Date
    1,916Posts

    Re: How to add the QuickJobChange In Source

    Quote Originally Posted by Xakzi View Post
    yeah, i noticed that too really, but I did not care much of it haha, uhm I guess I can change so you are unable to close the window at all..

    the inventory thing, will probably remove the items you gain, since you should not be possible to get them for free anyhow..

    the master thingy, gonna check it out ^^

    I will try to fix them anyway
    No, preventing them from closing it wouldn't completely fix it. what if they crashed while the window is opened? I know you can't prevent that. You have to make it always pop up after killing something and they've met the requirements for job change.

    You can't just not give them those items. The Forcemaster and Mentalist shields are REQUIRED to use their new skills. Besides, those shields have a defense rate of 1~1, it hurts nothing by giving them for free. You have to check if giving the item was successful, and if not, send it to them another way.

  8. #8
    One word! Im Fawkin Pro! Xakzi is offline
    MemberRank
    Jul 2010 Join Date
    SwedenLocation
    1,356Posts

    Re: How to add the QuickJobChange In Source

    Quote Originally Posted by ShadowDragon42 View Post
    No, preventing them from closing it wouldn't completely fix it. what if they crashed while the window is opened? I know you can't prevent that. You have to make it always pop up after killing something and they've met the requirements for job change.

    You can't just not give them those items. The Forcemaster and Mentalist shields are REQUIRED to use their new skills. Besides, those shields have a defense rate of 1~1, it hurts nothing by giving them for free. You have to check if giving the item was successful, and if not, send it to them another way.
    yeah figured, well.. got some work to do before I can actually work on fixing this window even more, so untill then, it will be as it got released for now ^^

  9. #9
    Not working on UnitedFlyf Mootie is offline
    MemberRank
    Apr 2009 Join Date
    1,589Posts

    Re: How to add the QuickJobChange In Source

    This is a very nice system. Not because of the functionality necessarily, but the windows are very clean and the job descriptions are nice. I may improve the job switch window I use now to resemble similar to this.

    However, it could use some improvement. I would store the job descriptions in resource for better accessibility, but that's just for the purpose I plan on using it for.

    I don't really know why it would need a tutorial, but that's Ragezone I guess...

  10. #10
    Flyff Developer ShadowDragon is offline
    MemberRank
    Apr 2009 Join Date
    1,916Posts

    Re: How to add the QuickJobChange In Source

    Quote Originally Posted by xLethal View Post
    However, it could use some improvement. I would store the job descriptions in resource for better accessibility, but that's just for the purpose I plan on using it for.
    Yeah, I was questioning why the original coder did this as well. Only explanations I can think of are that he didn't know how to do that (not likely, considering the ability required to create the rest of the coding), or simply laziness in not wanting to add stuff to the resource files.

  11. #11
    One word! Im Fawkin Pro! Xakzi is offline
    MemberRank
    Jul 2010 Join Date
    SwedenLocation
    1,356Posts

    Re: How to add the QuickJobChange In Source

    well, that is pretty easy to explain, I was bored and 2 people needed help with adding it in source (help section), so I did what I could do haha :D

    While adding it and try it out myself, I changed it some and made it look little better..

    Going to do more edits, make it more functionally and release it again by removing this thread when im done.

    But for now, Still working on some other stuff so this one will have to wait

  12. #12
    Enthusiast Imanso is offline
    MemberRank
    Jun 2011 Join Date
    PattayaLocation
    40Posts

    Re: How to add the QuickJobChange In Source

    Where is WndChangeJobEx.h ???
    here is error.

    d:\Flyff 2\Source\8_Neuz\WndChangeJobEx.cpp(2): fatal error C1083: Cannot open include file: 'WndChangeJobEx.h': No such file or directory

    I create WndChangeJobEx.cpp but how to create .h file ?

  13. #13
    One word! Im Fawkin Pro! Xakzi is offline
    MemberRank
    Jul 2010 Join Date
    SwedenLocation
    1,356Posts

    Re: How to add the QuickJobChange In Source

    Download the package which is the first link I gave out on the tut..

    add the both files in which I show with the picture ...

    replace the code in the cpp depending if your using 3rd jobs or 2nd job, depending which ones you got in your server.

  14. #14
    Enthusiast Imanso is offline
    MemberRank
    Jun 2011 Join Date
    PattayaLocation
    40Posts

    Re: How to add the QuickJobChange In Source

    Now i got this error.

    d:\Flyff 2\Source\8_Neuz\WndChangeJobEx.cpp(66): error C2039: 'UpdateJob' : is not a member of 'CDPClient'

  15. #15
    One word! Im Fawkin Pro! Xakzi is offline
    MemberRank
    Jul 2010 Join Date
    SwedenLocation
    1,356Posts

    Re: How to add the QuickJobChange In Source

    you did not edit dpclient.h..
    please read it through, like 5 times before posting errors :)



Page 1 of 16 12345678911 ... LastLast

Advertisement