struct mitloggen und vergleichen



  • Huhu!
    Wir sind ne kleine Gruppe von Freelancer Spielern die nur ein wenig Ahnung von C++ haben 😃

    Trotzdem haben wir bisjetzt einige Anti Cheat Features zusammenbasteln können.

    Als nächstes steht ein "Speed" und "Refire Rate" detect an.

    Da der Speed eines Players und die refire rate einer Waffe nicht direkt mitgeliefert wird, haben wir damit zu unsere probs.

    Wenn ein Player mit einer Waffe schießt wird das hier ausgelöst:

    void __stdcall FireWeapon(unsigned int iClientID, struct XFireWeaponInfo const &wpn)
    {
        ISERVER_LOG();
        ISERVER_LOGARG_UI(iClientID);
    
        try {
        } catch(...) { AddLog("Exception in %s", __FUNCTION__); }
    
        Server.FireWeapon(iClientID, wpn);
    }
    

    Zu XFireWeapon gibt es noch das hier:

    struct XFireWeaponInfo
    {
        uint iDunno1;
        Vector vDirection;
        uint iDunno2;
        short *sArray1;
        short *sArray2;
        short *s3;
    };
    

    Wie könnte ich jetzt z.B. mitloggen, was mir XFireWeapon sagt und wenn ich darin die refire rate gefunden habe, sie dann später im Code vergleichen.. Also z.B. iRefireRate > 20

    -------------------------------------------------------------

    Und wenn ich gleich dabei bin, hau ich das mit dem Speed detect noch gleich hinterher 😃

    Beim fliegen gibt es 3 Funktionen die Aufgerufen werden können.
    Ich denke mal, dass es in der Funktion steht, die aufgerufen wird, wenn das Schiff sich bewegt.
    Das sieht wie folgt aus:

    void __stdcall SPObjUpdate(struct SSPObjUpdateInfo const &ui, unsigned int iClientID)
    {
        ISERVER_LOG();
        ISERVER_LOGARG_UI(iClientID);
    
        Server.SPObjUpdate(ui, iClientID);
    
        try {
        } catch(...) { AddLog("Exception in %s", __FUNCTION__); }
    }
    

    SSPObjUpdateInfo:

    struct SSPObjUpdateInfo
    {
        float f[9];
        uint i;
    };
    

    Ich hoffe ihr könnt mir helfen.

    Gruß
    Crazy

    Edit: Ich habs jetzt mal so probiert:

    void __stdcall FireWeapon(unsigned int iClientID, struct XFireWeaponInfo const &wpn)
    {
        ISERVER_LOG();
        ISERVER_LOGARG_UI(iClientID);
    
        try {
        wstring wscCharname = Players.GetActiveCharacterName(iClientID);
    
    [B]    HkAddCheaterLog(wscCharname, [U]XFireWeaponInfo[/U], L"Fireweapon LOG");[/B]
        } catch(...) { AddLog("Exception in %s", __FUNCTION__); }
    
        Server.FireWeapon(iClientID, wpn);
    }
    

    Dabei kommt folgender Fehler:
    error C2275: 'XFireWeaponInfo': Ungültige Verwendung dieses Typs als Ausdruck

    Habe auch folgendes versucht:
    XFireWeaponInfo::iDunno1

    Dann kommt:
    error C2597: Ungültiger Verweis auf nicht-statischen Member 'XFireWeaponInfo::iDunno1'

    Mit:
    XFireWeaponInfo::sArray1
    Kommt der gliche Fehler.

    Mit wenig erfolg^^



  • Sry, hab mich wohl verklickt.

    Der Beitrag gehört ins C++ Forum. Sorry nochmal (auch für den Doppelpost :D)



  • Bei der XFireWeaponInfo blick ich nicht ganz durch, was denn da was sein könnte. Aber das liegt wohl daran, dass ich Freelancer nich kenn.
    So wie ich das sehe, steht in XFireWeaponInfo keine maximale firerate drin. Also wäre eine Möglichkeit, dass du die zeit zwischen 2 schüssen eines clients misst und falls die zeit unter eine bestimmte grenze fällt, das dann mitloggen kannst/den cheater kicken/... kannst. Ich denke, dass die bestimmt schon irgendwo irgendeine Zeitklasse haben, die man dann für diese Zwecke gebrauchen kann.

    Zu dem Speed:
    das "float f[9]" sieht sehr stark nach irgendeiner richtung/matrix aus. wie genau das array aber aufgebaut is, kann ich nicht sagen, das musst du entweder in der doku nachlesen, oder ausprobieren. also einfach mal in eine richtung fliegen und alle werte loggen. Und um da eine Geschwindigkeitsbegrenzung hinzukriegen, musst du wieder dir der Zeit behelfen.

    Zu deinen Fehlern:
    XFireWeaponInfo ist wie der Compiler schon sagt ein Typ(Struktur). Sie sagt nur was darüber aus, wie die daten nachher im speicher angelegt werden, wenn man davon ein Objekt erstellt. Du kannst dir eine Struktur als eine Art Plan vorstellen, den der Architekt vor sich hat. Und die Bauarbeiter sind dann diejenigen, die nach diesem Plan ein (oder viele) Häuser bauen.

    Also als Lösung solltest du "wpn" an "HkAddCheaterLog(..)" übergeben. Also in etwa so:

    HkAddCheaterLog(wscCharname, wpn, L"Fireweapon LOG");
    

    Falls HkAddCheaterLog aber als 2. Parameter keine Variable vom Typ XFireWeaponInfo zulässt, bleibt dir wohl nix anderes übrig, als alle Elemente der Struktur einzeln aufzulisten:

    HkAddCheaterLog(wscCharname, wpn.iDunno1, L"Fireweapon LOG");
    HkAddCheaterLog(wscCharname, wpn.vDirection, L"Fireweapon LOG"); //Auch hier kanns Probleme geben, weil Vector wiederum ein eigener Typ ist (wie XFireWeaponInfo)
    .
    .
    .
    

    Und noch ne Frage: Bezieht sich dieser Code auf den Client oder den Server? Das Server.FireWeapon() lässt vermuten, dass das ein Client-Code ist. Aber da würde es recht wenig bringen den Code reinzuverfrachten, da so jeder, der das Spiel spielt erstmal die neu compilierte Version besitzen müsste.
    Und bedenke auch: Bei jedem Schuss, oder gar bei jedem Bewegunsupdate etwas in eine Textdatei zu schreiben, kann ganz schön an der Performance ziehen.



  • Dieser Thread wurde von Moderator/in CMatt aus dem Forum C# und .NET in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Dieser Code läuft im Server mit.

    Es wird eine DLL erzeugt die dann diese Sachen im Speicher hookt.

    Wir wollen nicht jeden Schuss mitloggen, wir müssen nur erstmal herausfinden, wo überhaupt die refire rate drin steht.

    Deswegen wollen wir testweise alles mitloggen.
    Nur leider klappt das nicht.

    Wenn ich:

    HkAddCheaterLog(wscCharname, wpn);
    

    HkAddCheaterLog sieht so aus:

    bool HkAddCheaterLog(wstring wscCharname, wstring wscReason)
    {
    	FILE *f = fopen((scAcctPath + "flhook_cheaters.log").c_str(), "at");
    	if(!f)
    		return false;
    
    	CAccount *acc = HkGetAccountByCharname(wscCharname);
    	wstring wscAccountDir;
    	HkGetAccountDirName(acc, wscAccountDir);
    
    	time_t tNow = time(0);
    	struct tm *stNow = localtime(&tNow);
    	fprintf(f, "%.2d/%.2d/%.4d %.2d:%.2d:%.2d Possible cheating detected (%s) by %s(%s)(%s)\n", stNow->tm_mon + 1, stNow->tm_mday, stNow->tm_year + 1900, stNow->tm_hour, stNow->tm_min, stNow->tm_sec, wstos(wscReason).c_str(), wstos(wscCharname).c_str(), wstos(wscAccountDir).c_str(), wstos(HkGetAccountID(acc)).c_str());
    	fclose(f);
    	return true;
    }
    

    Und:

    bool HkAddCheaterLog(wstring wscCharname, wstring wscReason);
    

    error C2664: 'HkAddCheaterLog': Konvertierung des Parameters 2 von 'const XFireWeaponInfo' in 'std::wstring' nicht möglich

    Wenn ich nun ein HkAddCheaterLog2 erstelle was so aussieht:

    bool HkAddCheaterLog2(const XFireWeaponInfo);
    

    Und:

    bool HkAddCheaterLog2(const XFireWeaponInfo)
    {
    	FILE *f = fopen((scAcctPath + "flhook_cheaters2.log").c_str(), "at");
    	if(!f)
    		return false;
    
    	return true;
    }
    

    Dann kommt kein Fehler, die Log Datei wird auch erstellt, aber es steht nichts drin. (Der Code ganz oben habe ich natürch auf:

    HkAddCheaterLog2(wpn);
    

    Ich denke in bool HkAddCheaterLog2(const XFireWeaponInfo) müssen noch n paar Infos rein, aber da weiß ich nciht, was ich da rein schreiben soll^^

    e:\Games\FL\Hook\1.5.5\source\HkCbIServerImpl.cpp(239): error C2664: 'HkAddCheaterLog': Konvertierung des Parameters 2 von 'const XFireWeaponInfo' in 'std::wstring' nicht möglich

    Edit:
    Zum Speed:
    We kann ich denn die Arrays mitloggen?



  • Wie habt ihr es mit so wenigen C (oder C++, hier egal)-Kenntnissen geschafft so weit zu kommen 😕


Anmelden zum Antworten