Beiträge von Double-O-Seven

    Wenn man ein Tutorial macht, sollte man schon verstehen, was man macht.
    1) Nur nebenbei: OCMD ist kein Plugin.
    2) Du hast wohl weder verstanden, was "params" genau ist, noch wann man sscanf überhaupt anwenden muss.
    Wie komme ich darauf?


    Du benutzt if(sscanf(params,"s",reason)) return SendClientMessage(playerid,ROT,"Nutze /gt [TEXT]");
    Weisst du was du machst? Du scannst "params" nach einem String! Diesen String verwendest du danach weiter.
    Wo liegt der Fehler?
    "params" ist genau schon der String, den du willst! sscanf ist hier komplett überflüssig und macht das ganze nur ineffizienter.


    Dein Command:
    ocmd:gt (playerid, params [])
    {
    if (!IsPlayerAdmin (playerid))
    return SendClientMessage (playerid, 0xFF0000FF, "Du bist kein Admin.");


    new
    string [128],
    reason [128];


    if (sscanf (params, "s", reason))
    return SendClientMessage (playerid, 0xFF0000FF, "Nutze /gt [TEXT]");


    format (string, sizeof (string), "%s schrieb: %s", SpielerName (playerid), reason);
    GameTextForAll (string, 3000, 6);
    return 1;
    }


    Dein Command mit optimierter Speicherverwendung:
    Der String "reason" ist überflüssig.
    Du kannst einen String immer mit sich selbst formattieren.
    Du kannst also anstatt "reason" einfach "string" zweimal verwenden.

    ocmd:gt (playerid, params [])
    {
    if (!IsPlayerAdmin (playerid))
    return SendClientMessage (playerid, 0xFF0000FF, "Du bist kein Admin.");


    new
    string [128];


    if (sscanf (params, "s", string))
    return SendClientMessage (playerid, 0xFF0000FF, "Nutze /gt [TEXT]");


    format (string, sizeof (string), "%s schrieb: %s", SpielerName (playerid), string);
    GameTextForAll (string, 3000, 6);
    return 1;
    }


    Optimaler Command:
    sscanf überflüssig, da man einfach "params" verwenden kann, dies beinhaltet den kompletten Text, den man verwenden will.
    Möchte man Speicher optimal benutzen, speichert man den Spielernamen in "string", somit wird kein Extraspeicher gebraucht, der in der Funktion SpielerName alloziert wird.
    Zum Schluss formattiert man "string" mit "string" und "params".

    ocmd:gt (playerid, params [])
    {
    if (!IsPlayerAdmin (playerid))
    return SendClientMessage (playerid, 0xFF0000FF, "Du bist kein Admin.");


    if (!params [0]) // überprüfe ob Text leer ist.
    return SendClientMessage (playerid, 0xFF0000FF, "Nutze /gt [TEXT]");

    new
    string [128];


    GetPlayerName (playerid, string, sizeof string);
    format (string, sizeof string, "%s schrieb: %s", string, params);
    GameTextForAll (string, 3000, 6);
    return 1;
    }


    Allgemein: sscanf ist NICHT nötig, wenn man nur ein einziges Parameter haben will.
    Will man einen String haben, kann man ocmds Argument "params" benutzen, oder für Integers strval (params) oder für Floats floatstr (params).

    Das es nicht möglich ist, einen zu töten, ist Blödsinn.
    Es geht folgender Massen:
    - Man schreibe eine Funktion, die berechnet, ob ein Spieler auf den NPC zielt oder nicht, dann überprüft man, ob der Spieler auch wirklich schiesst (Munition verliert, Schiesstaste drückt)
    - Dann führt man ein eigenes Healthsystem für NPCs ein welches natürlich Health speichert. Wird ein NPC beschossen, zieht man je nach Waffe entsprechend Health ab.
    - Sobald Health auf 0 ist, benutzt man beim NPC ApplyAnimation um eine Sterbeanimation auszuführen. Dann kann man z.B. eine Funktion OnNPCDeath aufrufen...
    - Was danach kommt? Nach einiger Zeit Respawn mit SetPlayerPos für NPC vielleicht.

    stock PreventExplosion (vehicleid)
    {
    if (vehicleid != 0 && vehicleid != INVALID_VEHICLE_ID)
    {
    new Float: health;
    GetVehicleHealth (vehicleid, health);
    if (health < 250.0)
    SetVehicleHealth (vehicleid, 249.00);
    }
    }


    public OnPlayerUpdate (playerid)
    {
    PreventExplosion (GetPlayerVehicleID (playerid));
    return 1;
    }


    public OnUnoccupiedVehicleUpdate(vehicleid, playerid, passenger_seat) // Neue 0.3c R3/4/5 Funktion.
    {
    PreventExplosion (vehicleid);
    return 1;
    }


    Überall wo der Fahrzeugstatus geupdated wird, wird die mögliche Explosion verhindert.
    Das Auto brennt aber wird nicht explodieren.

    JunkBuster Anti-Cheat





    Nunja, manche kennen es wahrscheinlich schon. Ich halte jetzt keine grössere Rede.


    °°° Was macht/kann JunkBuster?

    • Es besteht die Möglichkeit, dass JunkBuster einen Cheater erkennt, wenn er das erste Mal spawnt. Er wird sofort gebannt! Jedoch ist das nur möglich, falls der Server UsePlayerPedAnims NICHT verwendet. Viele Roleplay-Server werden dadurch womöglich sehr viel weniger Cheater haben!
    • Serverside-Geldverwaltung: Erfolgreich Geld cheaten unmöglich, da es sofort entdeckt wird und unbrauchbar ist.
    • Serverside-Waffen: Das Cheaten von Waffen ist nahezu unmöglich, da die Waffen von JunkBuster verwaltet werden. Man kann nur in Ammu-Nation Waffen cheaten, jedoch erkennt JunkBuster auch da, ob man bezahlt hat oder nicht. (Pickups, Spawnwaffen, etc. wird alles von JunkBuster berücksichtigt.)
    • Serverside-Health und -Panzerung: JunkBuster erkennt, wenn sich jemand mit Cheats heilt oder eine Panzerung herzaubert. JunkBuster wird eingreifen. (Pickups, Restaurants etc. wird ebenfalls von JunkBuster berücksichtigt.)
    • Teleportieren mit Cheattools wird erkannt: JunkBuster erkennt, ob sich ein Spieler zu einer von gewissen Cheattools vorgegebenen Orten teleportiert, aber erkennt auch ganz allgemein teleportieren an beliebige Orte.
    • Airbrake-Erkennung
    • JunkBuster kann Godmode erkennen (die ganze Funktion wurde neu geschrieben und lieferte bei Tests keine "False Positives" im Gegensatz zur alten Version)
    • Speedhack-Erkennung: Jedes Fahrzeug hat ein individuelles Geschwindigkeitslimit. Fährt jemand mehrmals schneller, wird er gekickt. Fährt er schneller, als jedes andere Fahrzeug fahren kann, wird er gebannt.
    • Erkennen von Wallride-Cheat, jedoch ist das etwas ungenau, kaum verbesserbar.
    • Erkennen von Superman-Cheat
    • Erkennen von Quickturn
    • JunkBuster erkennt gewisse Arten von No-Reload-Cheats
    • Serverside-Vehiclehealth: Reparieren von Fahrzeugen mit Cheats wird sofort erkannt
    • Serverside-Tuningteile: JunkBuster merkt, wenn sich jemand Tuningteile cheatet
    • Spawnen von Fahrzeugen wird sofort erkannt
    • Kleinigkeiten wie Singleplayer-Cheats werden erkannt (wobei nur strohdumme Cheater sowas benutzen und vorallem im Chat eingeben)
    • JunkBuster bietet Schutz vor Laggern: Solche mit zu hohem Ping als auch zu niedriger Framerate
    • JunkBuster bietet auch Schutz vor Spammer, Abwerbern und unfairen Spielern welche Drive-By etc. machen
    • Umfangreiches Ban-System mit Blacklist, Whitelist, temporären Bans und IP-Bans (inklusive Range-Bans)
    • JunkBuster kann in jedem Script verwendet werden, egal ob Stuntscript oder RPG, da man mit dem benutzerfreundlichen GUI ingame als Admin jede Funktion ein und ausschalten kann!


    °°° Wie installiere ich JunkBuster?
    Eigentlich ist es ganz einfach: Herunterladen, entpacken, JunkBuster.pwn kompilieren, #include <JunkBuster> in allen anderen Scripts einfügen und kompilieren, Server starten und ingame konfigurieren.
    Besser erklärt wird alles im README!


    °°° Zusätzliche Funktionen, die JunkBuster mitbringt:
    GetPlayerFPS(playerid);
    GetPlayerSpeed(playerid,get3d=false);
    AntiBugKill(playerid);
    CheckText(playerid,text[]);
    GodModeCheck(playerid);
    AllowWeaponForPlayer(playerid,weaponid);
    ForbidWeaponForPlayer(playerid,weaponid,antibugkill);
    ResetForbiddenWeaponsForPlayer(playerid,antibugkill);
    IsForbiddenWeapon(weaponid);
    IsForbiddenWeaponForPlayer(playerid,weaponid);
    AddWeaponPickup(Float:x,Float:y,Float:z,weaponid,ammo,worldid);
    PlayerReportPlayer(playerid,reporterid,report[]);
    SetPlayerSpawnKillProtected(playerid,set);
    JunkBusterChrome(playerid,comment[]="No comment");
    SetPlayerMoney(playerid,money);
    IpBanCheck(playerid);
    BanIp(ipstring[]);
    UnbanIp(ipstring[]);
    AddNameToBlacklist(name[]);
    RemoveNameFromBlacklist(name[]);
    AddPlayerToBlacklist(playerid);
    IsPlayerOnBlacklist(playerid);
    AddNameToWhitelist(name[]);
    RemoveNameFromWhitelist(name[]);
    AddPlayerToWhitelist(playerid);
    IsPlayerOnWhitelist(playerid);
    TempBanCheck(playerid);
    TempBan(playerid,days,reason[]);
    DeleteTempBan(name[]);
    OnJunkBusterBan(playerid,reason[]);
    OnJunkBusterKick(playerid,reason[]);
    OnJunkBusterReport(playerid,reason[],details[]);


    °°° JunkBuster mit dem Adminscript verbinden und Adminimmunität garantieren
    Um Adminimmunität zu aktivieren, müsst ihr eine zusätzliche Funktion IsPlayerAdminCall in eurem Script einfügen und ebenfalls eurem Script anpassen. Nur so kann JunkBuster wissen, ob jemand Admin ist (aussert er ist RCON-Admin, das erkennt JunkBuster auch so). Genaueres steht im README.


    °°° JunkBuster-Commands für Admins

    • /jbcfg: Ingame-Menü zur Konfiguration von JunkBuster
    • /blackadd: Jemand der Blacklist hinzufügen
    • /blackdel: Jemand von der Blacklist löschen
    • /whiteadd: Jemand der Whitelist hinzufügen
    • /whitedel: Jemand von der Whitelist löschen
    • /tban: Jemand für eine gewisse Zeit bannen
    • /tunban: Temporär-Ban aufheben
    • /banip: IP bannen
    • /unbanip: IP entbannen
    • /jbvarlist: Liste aller JunkBuster-Variablen
    • /jbsetvar: Variable ändern
    • /myfps: Framerate anzeigen
    • /jbreports: Liste der neusten von JunkBuster gemachten Meldungen


    °°° Du magst und schätzt JunkBuster?


    °°° Download
    JunkBuster 10 auf Sendspace.com
    Pastebin (wegen den Regeln, ansonsten nutzlos). Man braucht das ganze Paket


    Viel Spass! Meldet Bugs!

    vehicletype ist ein Array, du kannst eine Array nach seiner Deklarierung so keinen Wert mehr zuweisen.
    format() und strcmp() werden dir bei deinem Problem helfen.


    Klar geht das, sofern die fixe Arraygrösse bekannt ist.
    Das Problem hier ist vehicletype==type. Das geht nicht, du kannst 2 Arrays nicht direkt vergleich in einem Schritt.
    Nimm strcmp(vehicletype, type, true)==0 anstatt vehicletype==type.

    stock RandomEx (minval, maxval)
    {
    // Gibt Wert zwischen minval und maxval - 1 zurück.
    return (random (maxval - minval) + minval);
    }

    Also RandomEx (1200, 3000).


    // Double-O-Bits


    #define DOB:: \
    DOB_

    #define DOB_GetCells(%0) \
    (((%0) + cellbits) / cellbits) // Round up

    #define BitArray:%0[%1] \
    Bits:%0[DOB_GetCells(%1)]

    stock DOB::GetBit (Bits: bitarray [], index)
    return _: ((bitarray [index / cellbits] & Bits: (1 << (index % cellbits))) != Bits: 0);


    stock DOB::SetBit (Bits: bitarray [], index, bool: set)
    {
    if (set)
    bitarray [index / cellbits] |= Bits: (1 << (index % cellbits));
    else
    bitarray [index / cellbits] &= Bits: ~(1 << (index % cellbits));
    }


    stock DOB::SetAllBits (Bits: bitarray [], bool: set, cells = sizeof (bitarray))
    {
    if (set)
    for (new i = 0; i < cells; ++i)
    bitarray [i] = Bit: 0xFFFFFFFF; // bitarray [i] |= Bit: 0xFFFFFFFF;
    else
    for (new i = 0; i < cells; ++i)
    bitarray [i] = Bit: 0; // bitarray [i] &= Bit: 0;
    }


    :D
    Wenn man Arrays hat, welche nur aus den Werten true (1) oder false (0) bestehen, braucht dieser Code 32 Mal weniger Speicher.

    Hi.


    Ich sitze schon seit längerem an einem neuen Objektestreamer. Es gibt zwar schon zuviele und braucht schon lange keine neuen mehr, aber naja, ich wollte einfach experimentieren.
    Wie auch immer.


    Wär nett, wenn ein paar Leute sich den Streamer herunterladen und auch schön strapazieren und danach Bugreports etc. posten. Ich kanns nicht, hab kein GTA im Moment.
    Am meisten interessiert mich, wie MoveStreamObject und AttachStreamObjectToPlayer funktionieren.


    Der Streamer ist in PAWN geschrieben, also kein Plugin und benutzt einen Zonierungsalgorithmus.
    Je nach Einstellung sollte er theoretisch 1'000'000 Objekte oder mehr streamen können (Verkleinerung der Zonen etc.) und das recht schnell. Das einzige Limit ist die Dateigrösse des Scripts.


    Also, wer Interesse hat, kann die Testversion hier runterladen: http://www.sendspace.com/file/9tnocl
    ACHTUNG: Man braucht dazu das neue YSI, hier: http://forum.sa-mp.com/showthread.php?p=884701


    MfG Double-O-Seven

    Sagt mal, ihr, die hier "helft"? Lest ihr überhaupt, was der Fragende fragt?


    1.) Das ist eine If-Abfrage ==> Da hört kein ; hin.
    2.) Ist das eine Getter-Funktion ==> GetObjectPos braucht Variablen als Argumente, keine richtigen Zahlen!



    new Float:pos[3];
    GetObjectPos(lspdtor2, pos[0], pos[1], pos[2]);
    if(******)//Was genau vergleichen?


    Was genau willst du vergleichen? Ob das Tor in der Nähe deines Punktes ist?