Gentros' Files

06/18/2015 01:00 creativaot#1
Hallo liebe Community,

mir stellen sich folgende Fragen:
- Wieso kann ich als Administrator keine Spieler ohne Rechte zu mir porten ( /summon "Spielername" )?
- Ich möchte den /level Befehl so umschreiben, dass ich andere Spieler auch "leveln" kann. Nun.. wie mache ich das?
06/18/2015 01:18 Kiseku#2
tag,
beim ersten geh mal in die funktextcmd.cpp und schick uns mal die funktion von : TextCmd_Summon

zum 2.
funktextcmd.cpp
Code:
BOOL TextCmd_Level( CScanner & scanner )
{
#ifdef __WORLDSERVER
	CUser* pUser	= (CUser*)scanner.dwValue;

	if( !IsValidObj( pUser ) )
	{
		pUser->AddText( "Invalid user." );		
		return TRUE;
	}

	scanner.GetToken();
	u_long idTarget	= CPlayerDataCenter::GetInstance()->GetPlayerId( scanner.token );

	if( idTarget == 0 )
		idTarget = pUser->m_idPlayer;

	CUser* pTarget	= g_UserMng.GetUserByPlayerID( idTarget );	

	if( !IsValidObj( pTarget ) )
	{
		pUser->AddText( "Falscher Username!" );		
		return TRUE;
	}


	scanner.GetToken();
	CString strJob = scanner.Token;

	int nJob = JOB_VAGRANT;

	LONG nLevel = scanner.GetNumber();
	
	if( nLevel == 0 )
		nLevel = 1;

	for( int i = 0 ; i < MAX_JOB ; i++ )
	{
		if( strcmp( strJob, prj.m_aJob[i].szName ) == 0 || strcmp( strJob, prj.m_aJob[i].szEName ) == 0 )
		{
			nJob = i;
			break;
		}
	}

	char chMessage[MAX_PATH] = {0,};
	if( MAX_JOB_LEVEL < nLevel && nJob == 0 )
	{
		sprintf( chMessage, prj.GetText(TID_GAME_CHOICEJOB) );
		pUser->AddText( chMessage );		
		return TRUE;
	}

#if __VER >= 10 // __LEGEND	//	10Â÷ Àü½Â½Ã½ºÅÛ	Neuz, World, Trans
	LONG	nLegend = scanner.GetNumber();
	if( ( nLegend > 0 ) && ( nLegend < 3 ) )
	{
		for( int i = nJob + 1 ; i < MAX_JOB ; i++ )
		{
			if( strcmp( strJob, prj.m_aJob[i].szName ) == 0 || strcmp( strJob, prj.m_aJob[i].szEName ) == 0 )
			{
				nJob = i;
				if( nLegend == 1 )
					break;
				else
					nLegend--;
			}
		}

		pTarget->InitLevel( nJob, nLevel );	// lock
		FILEOUT ("..\\logs/ChangeLevel-Job.log","%s hat %s auf ein andere Level Gesetzt", pUser->GetName(), pTarget->GetName());

		return	TRUE;
	}
#endif	//__LEGEND	//	10Â÷ Àü½Â½Ã½ºÅÛ	Neuz, World, Trans
	
	if( nLevel <= MAX_JOB_LEVEL )	
	{
		pTarget->InitLevel( JOB_VAGRANT, nLevel );	// lock
	}
	else
	if( MAX_JOB_LEVEL < nLevel &&  nLevel <= MAX_JOB_LEVEL + MAX_EXP_LEVEL )
	{
		if( MAX_JOBBASE <= nJob && nJob < MAX_EXPERT)
		{
			pTarget->InitLevel( nJob, nLevel );	// lock

		}
		else
		{
			sprintf( chMessage, "Falscher Job" );
			pUser->AddText( chMessage );
			sprintf( chMessage, "Es gehen nur Folgende Jobs! : " );
			for( int i = MAX_JOBBASE ; i < MAX_EXPERT ; ++i )
			{
				if( strlen( prj.m_aJob[i].szName ) < 15 )
				{
					strcat( chMessage, prj.m_aJob[i].szName );
					if( i + 1 != MAX_EXPERT )
					{
						strcat( chMessage, ", ");
					}
				}
			}
			pUser->AddText( chMessage );
			sprintf( chMessage, "Du musst immer 16/61 sein ! : %d ~ %d", MAX_JOB_LEVEL + 1, MAX_JOB_LEVEL + MAX_EXP_LEVEL );
			pUser->AddText( chMessage );
			return TRUE;
		}

	}
	else
		pUser->AddText("Falscher Name !");
	if( MAX_JOB_LEVEL + MAX_EXP_LEVEL < nLevel && nLevel < MAX_LEVEL + 1 )
	{
		if( MAX_EXPERT <= nJob && nJob < MAX_PROFESSIONAL )
		{
			pTarget->InitLevel( nJob, nLevel );	// lock
		}
		else
		{
			sprintf( chMessage, "Not Professional Job" );
			pUser->AddText( chMessage );
			sprintf( chMessage, "Professional Job : " );
			for( int i = MAX_EXPERT ; i < MAX_PROFESSIONAL ; ++i )
			{
				if( strlen( prj.m_aJob[i].szName ) < 15 )
				{
					strcat( chMessage, prj.m_aJob[i].szName );
					if( i + 1 != MAX_PROFESSIONAL )
					{
						strcat( chMessage, ", ");
					}
				}
			}
			pUser->AddText( chMessage );
			sprintf( chMessage, "Professional Level : %d ~~~ ", MAX_JOB_LEVEL + MAX_EXP_LEVEL + 1 );
			pUser->AddText( chMessage );
			return TRUE;
		}
		
	}
#endif // __WORLDSERVER
	return TRUE;
}
06/18/2015 14:43 creativaot#3
Hier die Funktion:

Code:
BOOL TextCmd_Summon( CScanner& scanner )           
{
#ifdef __WORLDSERVER
	TCHAR lpszPlayer[32];

	scanner.GetToken();
	CUser* pUser	= (CUser*)scanner.dwValue;
	if( strcmp( pUser->GetName(), scanner.Token) )
	{
#if __VER >= 11 // __SYS_PLAYER_DATA
		u_long idPlayer		= CPlayerDataCenter::GetInstance()->GetPlayerId( scanner.token );
#else	// __SYS_PLAYER_DATA
		u_long idPlayer		= prj.GetPlayerID( scanner.Token );
#endif	// __SYS_PLAYER_DATA
		if( idPlayer > 0 ){
			strcpy( lpszPlayer, scanner.Token );
#ifdef __LAYER_1015
			g_DPCoreClient.SendSummonPlayer( pUser->m_idPlayer, pUser->GetWorld()->GetID(), pUser->GetPos(), idPlayer, pUser->GetLayer() );
#else	// __LAYER_1015
			g_DPCoreClient.SendSummonPlayer( pUser->m_idPlayer, pUser->GetWorld()->GetID(), pUser->GetPos(), idPlayer );
#endif	// __LAYER_1015
		}
		else {
//			scanner.Token라는 이름을 가진 사용자는 이 게임에 존재하지 않는다.
			pUser->AddReturnSay( 3, scanner.Token );
		}
	}
	else 
	{
		pUser->AddReturnSay( 2, " " );  		// 자기 자신에게 명령했다.		
	}
	
#endif	// __WORLDSERVER
	return TRUE;
}
06/18/2015 14:54 Marc~#4
Die Funktion ist relativ uninteressant
Code:
	ON_TEXTCMDFUNC( TextCmd_Summon,                "summon",            "su",             "¼Òȯ",           "¼Òȯ",    TCM_SERVER, AUTH_OPERATOR   , "À¯Àú¼Òȯ" )
Hier werden die Rechte eingestellt:
Code:
AUTH_OPERATOR
Mach daraus einfach
AUTH_ADMINISTRATOR -> Für den Admin
AUTH_GENERAL -> Für X-beliebigen Spieler
06/18/2015 15:06 creativaot#5
Ich glaube du hast mich missverstanden. Ich möchte nicht dass jeder x-beliebige Spieler den Befehl benutzen kann, sondern dass ich als Administrator auch AUTH_GENERAL zu mir teleportieren kann, was im Moment nicht funktioniert.

Code:
	ON_TEXTCMDFUNC( TextCmd_Summon,                "summon",            "su",             "소환",           "소환",    TCM_SERVER, AUTH_GAMEMASTER   , "유저소환" )
Damit kann der Supporter, bzw. der GM Stufe 1 den Befehl ausführen.
06/18/2015 15:59 raventh1984#6
Inside this function
BOOL TextCmd_Summon( CScanner& scanner )

Under

strcpy( lpszPlayer, scanner.Token );
Add
CUser* pUserTarget = static_cast<CUser*>( prj.GetUserByID( idPlayer ) );
if( pUserTarget )
pUserTarget->REPLACE( g_uIdofMulti, pUser->GetWorld()->GetID(), pUser->GetPos(), REPLACE_FORCE, pUser->GetLayer() );