[Source]Scanner Problem

08/12/2012 00:32 iSynaptic#1
Hallo Leute,

ich bin gerade einem Problem begegnet was ich wirklich nicht zuordnen kann.
Ich hole mir mit dem Scanner 2 Werte, einmal den Charakternamen und ein Penya Betrag.

Der Name Wird erkannt, es wird die ID abgerufen, auch der Penyawert wird erkennt, aber sobald ich den Penya Wert mit Scanner.Token habe, werden
die 2 Variablen für den Charakternamen WOHL? mit dem des Penyas überschrieben, was für mich einfach keinen Sinn ergibt.

So sieht die Funktion aus:

PHP Code:
#ifdef __WORLDSERVER

int        nGold;

LPCTSTR    szName;
LPCTSTR unBug_SzName

CUserpUser = (CUser*)scanner.dwValue;

scanner.GetToken();    
szName scanner.Token;
unBug_SzName szName// Mein Versuch das Ergebnis gleich zu sichern
Error"Name: %s"szName );

u_long idPlayer    CPlayerDataCenter::GetInstance()->GetPlayerId((char*)szName );
    
if ( 
idPlayer == 
{
        
pUser->AddText("Der Spieler ist nicht Online und kann somit nicht auf die Wanted Liste gesetzt werden");
        return 
TRUE;

    }else{
        
        
nGold scanner.GetNumber(); 
        
Error("nGold %d"nGold );
        
Error"Name: %s",unBug_SzName );
        if ( 
nGold 200000000 || nGold 1000 )
        {
            
pUser->AddText("Die Kopfgeld Summe muss zwischen 1000 und 200 000 000 Penya liegen");
            return 
TRUE;

        }else{
            
            
Error("SetWanted: %s, %d, %d, %s"unBug_SzNameidPlayernGold"System Kill" );
            
g_DPCoreClient.SendWCWantedGoldunBug_SzName idPlayernGold"System Kill" );
        }

    }
#endif 

In meinem Error Log ist auch gut zu erkennen, dass er beide Werte erst einmal richtig bekommt:

2012/ 8/12 00:26:40 Name: MadeMyDay // richtig
2012/ 8/12 00:26:40 nGold 4000 // richtig
2012/ 8/12 00:26:40 Name: 4000 // nicht korrekt
2012/ 8/12 00:26:40 SetWanted: 4000, 4, 4000, System Kill

Hat jemand eine Idee woran das liegen könnte, und wie ich dem vorbeugen kann ?


Edit:

Ich habe den Spieler um den es geht, jetzt als CUser pTarget ausgelegt und beziehe den Namen aus der CUser Klasse ( getName() ). Allerdings finde ich das doch ein wenig umständlich nur wegen dem Namen noch einmal eine Klasse zu initalisieren. Vorschläge sind gern gesehen.
08/12/2012 03:10 Pumbaaa#2
Nun, da es sich bei einem LPCTSTR um nen TCHAR Zeiger (bin mir nich sicher, ob TCHAR, aber Zeiger) handelt, wird mit szName nur auf Token der CScanner Klasse gezeigt. Die Addresse gibst du an den anderen Zeiger, unBug_SzName, weiter, sodass auch er auf Token von CScanner zeigt.
Du solltest einen TCHAR bzw char Array erstellen, evtl via TCHAR *szName = new TCHAR[strlen(scanner.Token)+1], via strcpy oder memcpy den Wert von Token in szName kopieren (strcpy(szName,scanner.Token); ) und anschließend das ende des Arrays nullen (szName[strlen(scanner.Token)] = 0.

Das sollte dein Problem lösen.
08/12/2012 04:15 Aspectus#3
Quote:
Originally Posted by Pumbaaa View Post
Nun, da es sich bei einem LPCTSTR um nen TCHAR Zeiger (bin mir nich sicher, ob TCHAR, aber Zeiger) handelt, wird mit szName nur auf Token der CScanner Klasse gezeigt. Die Addresse gibst du an den anderen Zeiger, unBug_SzName, weiter, sodass auch er auf Token von CScanner zeigt.
Du solltest einen TCHAR bzw char Array erstellen, evtl via TCHAR *szName = new TCHAR[strlen(scanner.Token)+1], via strcpy oder memcpy den Wert von Token in szName kopieren (strcpy(szName,scanner.Token); ) und anschließend das ende des Arrays nullen (szName[strlen(scanner.Token)] = 0.

Das sollte dein Problem lösen.
Awas, denk doch nicht so kompliziert.

PHP Code:
#ifdef __WORLDSERVER 
int nGold
CUserpUser = (CUser*)scanner.dwValue
scanner.GetToken();     
u_long idPlayer        CPlayerDataCenter::GetInstance()->GetPlayerIdscanner.token );
CUserpTarget g_UserMng.GetUserByPlayerIDidPlayer );
if ( 
IsValidObjpTarget ) )  

        
pUser->AddText("Der Spieler ist nicht Online und kann somit nicht auf die Wanted Liste gesetzt werden"); 
        return 
FALSE

    }else{ 
         
        
nGold scanner.GetNumber();  
        if ( 
nGold 200000000 || nGold 1000 
        { 
            
pUser->AddText("Die Kopfgeld Summe muss zwischen 1000 und 200 000 000 Penya liegen"); 
            return 
FALSE

        }else{ 
             
            
g_DPCoreClient.SendWCWantedGoldpTarget->GetName(), idPlayernGold"System Kill" ); 
        } 

    } 
#endif 
Wäre halt die einfachste Methode.
Würde den Namen nicht extra speichern lassen.
Kannst aber auch so:
PHP Code:
#ifdef __WORLDSERVER
int        nGold;
CUserpUser = (CUser*)scanner.dwValue;
scanner.GetToken();    
u_long idPlayer    CPlayerDataCenter::GetInstance()->GetPlayerIdscanner.token );
if ( 
idPlayer == 
{
        
pUser->AddText("Der Spieler ist nicht Online und kann somit nicht auf die Wanted Liste gesetzt werden");
        return 
TRUE;

    }else{
        
        
nGold scanner.GetNumber(); 
        if ( 
nGold 200000000 || nGold 1000 )
        {
            
pUser->AddText("Die Kopfgeld Summe muss zwischen 1000 und 200 000 000 Penya liegen");
            return 
TRUE;

        }else{
            );
            
g_DPCoreClient.SendWCWantedGoldg_UserMng.GetUserByPlayerIDidPlayer )->GetName(), idPlayernGold"System Kill" );
        }

    }
#endif 
Sollte funktionieren, habs nicht getestet.

Achja, man sollte wenn die ID z.B nicht valid ist oder so, nicht TRUE returnen, da es ja keinen Grund gibt, und die Funktion einfach abbricht. Also bleib lieber bei FALSE.
08/12/2012 10:47 iSynaptic#4
Naja war nen Flüchtigkeitsfehler von mir, war ziemlich spät.
Ich muss den Scanner mit Scanner.GetToken() nur nochmals anweisen den
nächsten Token zu scannen.

CUser verwende ich jetzt aber dennoch, da ich eine User Message ausgeben lasse.
Hat sich also geklärt,
danke für eure Hilfe.
08/12/2012 17:22 Sedrika#5
#Closed