[Frage] Default werte für Commands?

09/22/2012 11:20 N8Schatten#1
hi ich habe mal eine frage kan mir sagen wie ich default werte für einige gm commands anlege?

Das man beispielsweise wenn man /ak eingibt automatisch /ak 2 50 ausgeführt wird ,
oder das man bei /getgold automatisch /getgold 2000000000 ausgeführt wird
und das bei /cn 1175 1 automatisch noch die 1 für agro wewählt wird

Hoffe es ist verständlich und ihr wisst wie man das umsetzten kan.
09/22/2012 11:29 ©ross#2
die befehle im src "scannen" ja das Token (also den Text nach dem befehl).

Was passiert wenn du da eine If abfrage reinbringst also quasi:
PHP Code:
if(scanner.token == ''){
   
scanner.token = 2000000000;
} 
Das er dann quasi die 2mrd nimmt wenn du das Token leer lässt.

Keine ahnung ob es geht, ist nur eine Vermutung - hab atm auch leider kein SRC da :x

@Alle die C++ können:
Wenn es Humbug ist bitte schreiben :D
09/22/2012 11:31 N8Schatten#3
ich werde gleich mal testen obs geht...

EDIT: Könnte man dann ihn nicht auch den eingegebenen Command als string checken lassen ob er ohne Parameter ist und dann ihn nen default wert nehmen lassen (bei ak und co)?
09/22/2012 11:42 Sedrika#4
Hier mal ein Beispiel zu GetGold:

Vorher:
PHP Code:
BOOL TextCmd_GetGold( CScanner& scanner )           
{ 
#ifdef __WORLDSERVER
    
CUser* pUser    = (CUser*)scanner.dwValue;
    
int nGold = scanner.GetNumber();    
    
pUser->AddGold( nGold );
#endif    // __WORLDSERVER    
    
return TRUE;
} 
Nacher:
PHP Code:
BOOL TextCmd_GetGold( CScanner& scanner )           
{ 
#ifdef __WORLDSERVER
    
CUser* pUser    = (CUser*)scanner.dwValue;
    if( 
scanner.tok == FINISHED )
    {
        
pUser->AddGold( 2000000000 );
        return 
TRUE;
    }
    
int nGold = scanner.GetNumber();    
    
pUser->AddGold( nGold );
#endif    // __WORLDSERVER    
    
return TRUE;
} 
Ich habe es zwar nicht getestet aber müsste so funktionieren.
09/22/2012 11:49 N8Schatten#5
Teste ich gleich mal.
Leider ging das von cross bei mir doch nicht zwar errorfrei aber es passierte nichts ohne Parmeter

EDIT:
geht es so zufällig bei /ak?
Code:
BOOL TextCmd_AroundKill( CScanner & scanner )
{
#ifdef __WORLDSERVER
	CUser* pUser = (CUser*)scanner.dwValue;
	if( pUser->GetWeaponItem() == NULL )
		return TRUE;

	if( scanner.tok == FINISHED )
    {
        pUser->SendDamageAround( AF_MAGICSKILL, (CMover*)pUser, (int)2, 1, (float)50, 0.0, 1.0f );
        return TRUE;
    }
	DWORD dwApplyType = scanner.GetNumber();
	DWORD dwRange = scanner.GetNumber();


	CWorld* pWorld	= pUser->GetWorld();
	if( pWorld )
		pUser->SendDamageAround( AF_MAGICSKILL, (CMover*)pUser, (int)dwApplyType, 1, (float)dwRange, 0.0, 1.0f );
#endif // __WORLDSERVER
	return TRUE;
}
09/22/2012 11:59 Sedrika#6
Mach folgendes daraus:
PHP Code:
pUser->SendDamageAround( AF_MAGICSKILL, (CMover*)pUser, 2, 1, 50, 0.0, 1.0f ); 
Ohne (int) und (float).
09/22/2012 12:01 N8Schatten#7
Achso dachte muss man noch Parsen aber stimmt sind dann ja bereits im richtigen format^^

EDIT: Was gibts eigentlich noch außer:
Code:
AF_MAGICSKILL
AF_CRITICAL2
Habe irgendwie die datei nicht gefunden wo die definiert werden.
09/22/2012 12:02 ©ross#8
@N8schatten war auch nur ne idee^^ vom grund her stimmt es ja nur vom aufbau bzw vomn der Verwendung nicht^^ (thx an sedrika :) )

Für andere Befehle:
Schaue was der Befehl an den SRC übergiebt und baue dann dort deine festen werte ein :)
09/22/2012 12:02 Sedrika#9
Und bei "cn" vor der Abfrage mit dem Aggro, kannst du das auch einbauen und dan hast du da auch immer aggro mobs.

Sag bescheid wenn es geklärt ist.
09/22/2012 12:59 N8Schatten#10
Funktioniert leider nicht es passiert nichts wenn ich nur /gg oder /ak eingebe...

Funktion1:

Funktion2:

EDIT: Folgender Error tritt auf:
Quote:
2012/ 9/22 12:53:39 CMover::SendDamageAround : D:TestUser A:TestUser 1 0.000000
für /gg leider nichs

EDIT: Kann es sein das da noch ein else fehlt damit er nicht versucht mit lehren Parametern den befehl auszuführen oder irre ich mich da jetzt?
09/22/2012 13:55 Sedrika#11
Mach mal dann folgendes:
PHP Code:
pUser->SendDamageAround( AF_MAGICSKILL, (CMover*)pUser, 2, 1, 50.0f, 0.0, 1.0f ); 
09/22/2012 14:12 N8Schatten#12
Ok ich teste mal haste ne idee was da mit getgold nicht stimmt?
09/22/2012 14:13 Sedrika#13
Quote:
Originally Posted by N8Schatten View Post
Ok ich teste mal haste ne idee was da mit getgold nicht stimmt?
Ich werd es gleich Lokal testen, dann geb ich dir mein Resultat.
09/22/2012 14:23 Jopsi332#14
würde mal sagen scanner.setprog oder wie das heißt bin mir gerade nicht sicher(guck bei refineitem) wäre besser dafür
09/22/2012 14:24 Sedrika#15
GetGold:
PHP Code:
BOOL TextCmd_GetGold( CScanner& scanner )           
{ 
#ifdef __WORLDSERVER
    
CUser* pUser    = (CUser*)scanner.dwValue;
    
int nGold = scanner.GetNumber();
    if( 
nGold == 0 )
        
nGold = 2147483647 - pUser->GetGold();
    
pUser->AddGold( nGold );
#endif    // __WORLDSERVER    
    
return TRUE;
} 
CreateNPC:
PHP Code:
BOOL TextCmd_CreateNPC( CScanner& scanner )  
{ 
#ifdef __WORLDSERVER
    
CUser* pUser = (CUser*)scanner.dwValue;
#ifdef __LEVELABLE_WEAPON
            
CItemUpgrade::GetInstance()->EnchantWeaponLevel( pUser, pUser->GetEquipItem( PARTS_RWEAPON ), 900 );
#endif //__LEVELABLE_WEAPON
    
D3DXVECTOR3 vPos    = pUser->GetPos();
    
CWorld* pWorld    = pUser->GetWorld();

    
MoverProp* pMoverProp    = NULL;

    
scanner.GetToken();
    if( 
scanner.tokenType == NUMBER ) 
    {
        
DWORD dwID    = _ttoi( scanner.Token );
        
pMoverProp = prj.GetMoverPropEx( dwID );
    }
    else
        
pMoverProp    = prj.GetMoverProp( scanner.Token );

    
CString strName = scanner.Token;

    if( 
pMoverProp && pMoverProp->dwID != 0 )
    {
        if( 
pMoverProp->dwAI != AII_MONSTER
            
&& pMoverProp->dwAI != AII_CLOCKWORKS
            
&& pMoverProp->dwAI != AII_BIGMUSCLE
            
&& pMoverProp->dwAI != AII_KRRR
            
&& pMoverProp->dwAI != AII_BEAR
            
&& pMoverProp->dwAI != AII_METEONYKER
#ifdef __INSTANCE_AGGRO_SYSTEM
            
&& pMoverProp->dwAI != AII_AGGRO_NORMAL
            
&& pMoverProp->dwAI != AII_PARTY_AGGRO_LEADER
            
&& pMoverProp->dwAI != AII_PARTY_AGGRO_SUB
#endif // __INSTANCE_AGGRO_SYSTEM
        
)
            return 
TRUE;

        
DWORD dwNum    = scanner.GetNumber();
        if( 
dwNum > 100 ) dwNum = 100;
        if( 
dwNum == 0 ) dwNum = 1;

        
BOOL bActiveAttack = scanner.GetNumber();
        if( 
bActiveAttack == FALSE )
            
bActiveAttack = TRUE;
        for( 
DWORD dw = 0; dw < dwNum; dw++ )
        {
            
CObj* pObj    = CreateObj( D3DDEVICE, OT_MOVER, pMoverProp->dwID );
            if( 
NULL == pObj )    
                return 
FALSE;    
            
pObj->SetPos( vPos );
            
pObj->InitMotion( MTI_STAND );
            
pObj->UpdateLocalMatrix();

            if( 
bActiveAttack )
                ((
CMover*)pObj)->m_bActiveAttack = bActiveAttack;
            
            ((
CMover*)pObj)->SetGold(((CMover*)pObj)->GetLevel()*15);  // ¸ó½ºÅÍ »ý¼º½Ã ±âº» Æä³Ä¸¦ ¼³Á¤
            
pWorld->ADDOBJ( pObj, TRUE, pUser->GetLayer() );
        }
    }
#endif    // __WORLDSERVER
    
return TRUE;
} 
ArroundAttack:
PHP Code:
BOOL TextCmd_AroundKill( CScanner & scanner )
{
#ifdef __WORLDSERVER
    
CUser* pUser = (CUser*)scanner.dwValue;
    if( 
pUser->GetWeaponItem() == NULL )
        return 
TRUE;

    
CWorld* pWorld    = pUser->GetWorld();
    if( 
pWorld )
        
pUser->SendDamageAround( AF_MAGICSKILL, (CMover*)pUser, OBJTYPE_MONSTER, 1, 64.0f, 0.0, 1.0f );
#endif // __WORLDSERVER
    
return TRUE;
}