Beiträge von [DT]Sniper

    Da ist in dieser Hinsicht die Methode von d0 besser, hat man keine unnötigen Objekte irgendwo in der Luft rumfliegen :wacko:


    Jo die Methode von d0 ist sauberer, doch leider ist diese Methode mitlerweile von einigen Stealern schon gecracked, da sich die Methode nur einen samp bug ausgenutzt hatte.

    Muss mal mit Sniper reden.
    Eventell kann man ja die Objecte mit SetObjectMaterial Unsichtbar machen.


    Ist leider nicht so einfach möglich, da man sonst alle fake objecte mit einem Klick Filtern könnte.


    Ich werde mich aber mal die Tage mit an einer neuen Version ran setzen, die weniger Probleme bei 0.3z R1 machen soll.

    das hintereinander schreiben von anweisungen ist jedoch nur ein sehr kleiner Teil von Ressourcen schonenden Scripten, wichtiger ist es Timer richtig und wenig zu verwenden, möglichst wenig Variablen zu nutzen so wir unnötige Rechenschritte zu vermeiden.
    Vor allen sollten nicht mehr verwendete PVars wieder deltet werden etc. alles was Arbeitsspeicher und cpu schont.
    Eines der Bekanntesten Beispiele kommt aus den alten Godfather Systemen, dort wurde bei OnPLayerUpdate die daten des Spielers gespeichert, dies hat bewirkt, dass die Speicherung für jeden Spieler je nach updaterate des spielers (diese ist durch handlungen höher als wenn ich dumm rum stehe). Du kannst dir bestimmt gut vorstellen, dass es dem PC nicht gut tut in der sekunde ungefähr 10 mal pro Spieler die entsprechende Spielerdatei zu öffnen und zu updaten.


    edit:
    Wie Blackace bereits sagte ist es für den Kompiler etwas anderes ob er die Befehle einzeln oder hintereinander verknüpft bekommt.
    Stell dir vor du schreibst mit Hilfe von Pawn einen Code der ähnlich einer Einkaufsliste ist:
    schreibst du den code so:
    BuyMilk(),BuyToast(),BuyCheese(),BuyCookies();


    würde das für den Compiler so viel bedeuten dass er los gehen soll und Milch, Toast, Käse und Kekse kaufen soll.


    Bei der Methode:
    BuyMilk();
    BuyToast();
    BuyChesse();
    BuyCookies();


    würdest du den Compiler sagen, dass er los gehen soll Milch kaufen, wenn er wieder zurück ist sagst du ihm er soll Toast kaufen, wenn er wieder da ist sagst du ihm er soll Käse kaufen und wenn er dannach wieder bei dir ist sagst du ihm noch er soll Keckse kaufen.


    Bei der Schnelligkeit eines Computers, wird diese Art des Ressourcenshonenden Scripten jedoch nicht viel einsparren.
    zu lesbarkeit, wenn ich mich nicht irre kannst du das ganze auch so schreiben:


    BuyMilk(),
    BuyToast(),
    BuyCheese(),
    BuyCookies();


    Ich hoffe ich habe jetzt so schlaftrunken wie ich bin keine scheisse erzählt :)

    d0ma:
    Dann danke ich schonmal für dieen kleinen fix.


    Zum thema 100 Objekte in der Sekunde sei zu performence lasstig bei vielen Spielern...
    Klar wird etwas Performence gezogen, Doch selbst wenn ich Bots (also mit hilfe von Raknet ertsellte Bots(Fake Player)) auf den Server packe habe ich keine nennenswerten einbrüche auf dem root, und da es für den Spieler immer nur 25 PlayerObjekte mehr sind und ihm die objekte der anderen Spielern ja nicht gesendet werden wird dem einzelnen Spieler keine Performence einbussen durch weitere Spieler zu erkennen geben.


    Deine Variante ist aber aufjedenfall besser als die von mir geschriebene Include. Jedoch weiss ich nicht wie schnell die Programmierer hier ihre MapStealer gefixxt haben, daher nutze ich persönlich erstmal beide Varianten, um selbst wenn jemand mit einen geupdateten Map-Stealer kommt ihn das Leben wenigstens etwas schwerer zu machen.

    Ich werde die Tage mal nen kleinen Testserver mit downloadbaren Maps aufsetzen, und mit der include von mir versehen, so kann man die include testen und mir Scriptstealer bei der die include nichts genützt haben zukommen lassen :)

    Nettes Include, 300 Objekte pro Sekunde und das pro Spieler, schön das das mit 2-3 Spieler klappt ;)
    Für einen Testserver vll. :D Nicht für andere


    Auf einen Testserver, der ohne include eine cpu auslastung von 40% hat, da der server laufwege für 300 Bots mit der hilfe vob MapAndreas berechnet. Und trotzinclude bei 10 leuten um keinen % angestiegen ist. Es stimmt auch nicht ganz was newborn scheibt mit den genutzten standarteinstellungen sind es 100 objekte die sekunde

    Ich muss Myu recht geben, es gibt möglichkeiten die mapstealer gegen diesen schutzt zu pfeilen, so dass er automatisch die fake objekte rausfiltert. Das ist der grund warum ich nicht jedem die include gebe. Denn wenn die eraten mapstealer public werden, die diese sywteme austrixxen kann man nur noch mit plugins etwas dagegen machen.

    Ohne mir jetzt alles durchgelesen zu haben:


    Einfach bei jedem Spieler alle 2 Sekunden auf irgendner Position zufällig berechnet 50 Objekte mit zufälligen Koordinaten und ModelIDs erstellen - der Streamer kriegt das locker hin, selbst bei großen eigenen Maps kann man noch 50 Objekte mehr einbauen.


    Das sollte den Output von dem Teil absolut unbrauchbar machen.


    ist auch soweit ganz richtig, man sollte nur versuchen sie so random wie möglich zu machen udn bei den richtigen einstellungen crasht das game bei einigen mapstealern wenn der pc nicht der beste ist.

    ne die objekte abgesehen von den samp objecten gehören Rockstar games...
    nicht die maps..


    Wenn ich schrauben der Frima Knipping kaufe und daraus nen Kunstwerk erschaffe, ist das Kunstwerk mir und ich habe die rechte und nicht die Firma Knipping.

    Um hier mal die Falsch aussagen ber meine Include zu wiederlegen:
    Mein System ist eigendlich nur dafür da um den Output der Mapstealer mit vielen objecten zu verschandeln und den map stealer so die lust daran zu nehmen die daten ausseinander zu sammeln.
    Jedoch kommt es bei nicht gut geschriebene Map stealer (wie der für sobeit) dazu, dass der Client crasht.

    Ich habe eine kleine Include geschrieben, nach einigen Tests sieht es so aus, als wenn es funktioniert und sogar bei einigen nutzern des Mapstealers zum Gamecrash führt.


    Ich werde mit AhaEinHunter einige Test durchführen und ein Video dazuveröffentlichen.

    Man kann natürlich auch die Maps scriptteschnisch verfälschen lassen, hatte mich da vor paar Tagen mit Nemesus drüber unterhalten und soweit er mir erzählt hat hat er dies auch gemacht, habe ich jedoch nicht überprüft.


    Auch ist der im besagten Video gezeigte Map Stealer der letzte Schrott, da er objecte mehrfach stealt.


    Aber an sich ist es nicht wirklich möglich das mapstealen zu unterbinden.


    Das Stealen von Maps ist so simpel und liegt der Grundfunktion des Map-systems von samp zugrunde. Damit die objecte beim clienten angezeigt werden können werden befehle zu ihm gesendet welches object wo hin muss, das selbe gilt auch für Texturen und co.


    An sich macht der Mapstealer nichts anders als diese Daten abzufangen oder wieder in einen für pawn nutzbaren code zu übersetzen. Ansich ist es sogar möglich Textdraws (also rein die Textdraws und nicht den code dahinter) abzufangen und zu "stealen". Also alles was der Client sehen kann kann auch gestealt werden.


    myu: bitte berichtigen sollte mein halbwissen falsch sein.

    habe die letzte Woche an einer Permission Include gearbeitet, die selbständig in sqllite abspeichert.
    Mit Hilfe Dieser Include habe ich es nun auf meinen Server hinbekommen, dass ich jederzeit neue AdminGruppen erstellen und die Rechte der einzelnen Gruppen ändern kann.
    Später sollen auch einzelne Spieler Permissions erhalten können.
    Die Gruppen und Prmissions können in Gruppen eingeteilt und auch als Gruppen gehandelt werden:


    Beispiel für einige Permissions:

    CreatePermission("admin.main.aduty", "/aduty", "Gehe als Admin onduty");
    CreatePermission("admin.kickban.kick", "/kick [ID/Name]", "Kicke den Spieler vom Server");
    CreatePermission("admin.kickban.ban", "/ban [ID/Name]", "Banne den Spieler vom Server");
    CreatePermission("admin.kickban.tban", "/tban [ID/Name] [Zeit]", "Banne den Spieler für eine festgelegte Zeit vom Server");
    CreatePermission("admin.kickban.unban", "/unban [Name]", "Entbanne den Spieler mit dem Namen vom Server");


    wie man sieht wurden hier die Permissions in Gruppen eingeteilt. dadurch ist es möglich mehrere Permissions auf einmal zu handeln in dem man beispielsweise admin.kickban.* oder admin.* nutzt.
    Auch sieht man, dass direkt an die Permissions Befehle und Beschreibungen drangehangen können.
    Mithilfe dieses Systems kann man direkt alle Commands für einen Spieler anzeigen lassen oder nur Commands ener Spezziellen Permission Gruppe:
    ShowPlayerCommands(playerid,"Kick/Ban Help","admin.kickban.*");


    sollen für eine Permission mehrere commands aufgelistet werden oder soll man eine Hilfe command angezeigt bekommen wenn man irgend eine Permission einer Permission Group hat, so kann man das mit Permissionlinks realisieren, hier ein Beispiel aus meinen DayZ Server:
    // Mithilfe dieses Codes kann jemand mit spec rechten auch direkt specoff.
    CreatePermission("admin.spec", "/spec [Name/ID]", "Beobachte den angegebenen Spieler.");
    CreatePermissionLink("admin.specoff", "admin.spec", "/specoff", "Beende das Beobachten des Spielers.");


    Hier mal ein Auszug aus der Dukomentation innerhalb der Include:

    Spoiler anzeigen
    /*
    native CreatePermission(name[45],cmd[30],Desc[128])

    Spoiler anzeigen
    Registers an Permission, so that you can Use it for Commands and more. Use this in OnGamemodeInit
    Params:
    name: The Permissionname, the Name could get Permission Groups by deviding Groups and Name with an ".".
    cmd: The Command the Permission is needed for. If there is no commad just leave Blank
    desc: An description what the Command is used for. Is usefull if you use ShowCmdList(playerid,premgrp[])

    Spoiler anzeigen
    Returns: 1 If Permission got Created and 0 If it wasn't Possbile to Create the Permission
    */

    Spoiler anzeigen
    /*
    native CreatePermissionLink(name[45],cmd[30],Desc[128])

    Spoiler anzeigen
    Registers an Permission as Link, so that this Cmd is directly useable for an allready created Permission
    Params:
    name: The Permissionname, the Name could get Permission Groups by deviding Groups and Name with an ".".
    linkname: The Permissionname, you want to link with if you want to check if the player has any Permission of an Group write like this: "admin.*"
    cmd: The Command the Permission is needed for. If there is no commad just leave Blank
    desc: An description what the Command is used for. Is usefull if you use ShowCmdList(playerid,premgrp[])

    Spoiler anzeigen
    Returns: 1 If Permission got Created and 0 If it wasn't Possbile to Create the Permission
    */

    Spoiler anzeigen
    /*
    native HasPermission(playerid,const name[45])

    Spoiler anzeigen
    Checks if an Player has an Permission
    Params:
    playerid: The playerid, you want to check the Permission for.
    permission: The Premssionname you wants to check, if you want to check if the player has any Permission of an Group write like this: "admin.*"

    Spoiler anzeigen
    Returns: 1 If user has the Permission and 0 if the User don't have the Permission.
    */

    Spoiler anzeigen
    /*
    native GivePermission(playerid,name[45])

    Spoiler anzeigen
    Gives an Player an Permission with storing it. (For Admin Systems and more)
    Params:
    playerid: The playerid, you want to give the Permission.
    permission: The Premssionname you wants to give to the Player, if you want to give the player all Permission of an Group write like this: "admin.*"

    Spoiler anzeigen
    Returns: 0 if it wasn't possible to give the Permission and 1 if the Permission was given.
    */

    Spoiler anzeigen
    /*
    native GivePermissionEx(playerid,name[45])

    Spoiler anzeigen
    Gives an Player an Permission without Saving the Data forever
    Params:
    playerid: The playerid, you want to give the Permission.
    permission: The Premssionname you wants to give to the Player, if you want to give the player all Permission of an Group write like this: "admin.*"

    Spoiler anzeigen
    Returns: 0 if it wasn't possible to give the Permission and 1 if the Permission was given.
    */

    Spoiler anzeigen
    /*
    native AddGroup(gname[60])

    Spoiler anzeigen
    Creates an Group with storing it. (For Admin Systems and more)
    Params:
    gname: The GroupName the Group will get. Give an name like admin.Administrator or admin.ProjectLeader to let an Player only be in one admin. Group.
    It's also Useable to use admin. or similar if you want to Use ShowGroups(playerid,gname[],Callback[])
    ordernum: Used for sorting the Groups when loading

    Spoiler anzeigen
    Returns: GroupId or -1 if not able to Create.
    */

    Spoiler anzeigen
    /*
    native RemoveGroup(groupid)

    Spoiler anzeigen
    Deletes an Group with all Data forever
    Params:
    groupid: The Group you want to delete.

    Spoiler anzeigen
    Returns: 1 if Group was deleted
    */

    Spoiler anzeigen
    /*
    native GiveGroupPermission(groupid,name[45])

    Spoiler anzeigen
    Gives an Group an Permission with storing it. (For Admin Systems and more)
    Params:
    groupid: The groupid, you want to give the Permission. Get the groupid by using GetGroupId(groupname[])
    name: The Premssionname you wants to give to the Player.

    Spoiler anzeigen
    Returns: 0 if it wasn't possible to give the Permission and 1 if the Permission was given.
    */

    Spoiler anzeigen
    /*
    native RemoveGroupPermission(groupid,name[45])

    Spoiler anzeigen
    Removes an Group an Permission with storing it. (For Admin Systems and more)
    Params:
    groupid: The groupid, you want to give the Permission. Get the groupid by using GetGroupId(groupname[])
    permission: The Premssionname you wants to give to the Player.

    Spoiler anzeigen
    Returns: 0 if it wasn't possible to give the Permission and 1 if the Permission was given.
    */

    Spoiler anzeigen
    /*
    native GetGroupId(groupname[60])

    Spoiler anzeigen
    Get the GroupId of an GroupName
    Params:
    groupname: The Groupname you want to get the Permission for.

    Spoiler anzeigen
    Returns: -1 if Group wasn't found, returns the Groupid if found
    */

    Spoiler anzeigen
    /*
    native GetGroupOrder(groupid)

    Spoiler anzeigen
    Get the Ordernumber of an Group.
    Params:
    groupid: The Groupid you want to get the Ordernumber for. Get the groupid by using GetGroupId(groupname[])

    Spoiler anzeigen
    Returns: -1 if Group wasn't found, returns the Ordernum if found
    */

    Spoiler anzeigen
    /*
    native ChangeGroupOrder(groupid,ordernum)

    Spoiler anzeigen
    Change the Ordernumber of an Group.
    Params:
    groupid: The Groupid you want to change the Ordernumber for. Get the groupid by using GetGroupId(groupname[])
    ordernum: The new Ordernumber.

    Spoiler anzeigen
    Returns: 0 if Group wasn't found or 1 if sucsessfully changed
    */

    Spoiler anzeigen
    /*
    native GetGroupName(groupid,groupname[],length)

    Spoiler anzeigen
    Get the GroupId of an GroupName
    Params:
    groupid: The Groupid you want to get the Name for.
    groupname: The String the Name should be written in.
    lenght: The length of the String. Use sizeof()

    Spoiler anzeigen
    Returns: -1 if Group wasn't found, returns the Ordernum if found
    */

    Spoiler anzeigen
    /*
    native PutInGroup(playerid,groupid)

    Spoiler anzeigen
    Put an player in a Group
    Params:
    playerid: The playerid, you want to put in the Group.
    groupid: The groupid, you want to give the Player. Get the groupid by using GetGroupId(groupname[])

    Spoiler anzeigen
    Returns: 1 if Player was put sucsessfully into the Group.
    */

    Spoiler anzeigen
    /*
    native RemoveFromGroup(playerid,groupid)

    Spoiler anzeigen
    Removes an Player from an Group
    Params:
    playerid: The playerid, you want to remove from the Group.
    groupid: The groupid, you want to remove the Player from. Get the groupid by using GetGroupId(groupname[])

    Spoiler anzeigen
    Returns: 1 if Player was removed sucsessfully from the Group.
    */

    Spoiler anzeigen
    /*
    native GetPlayerGroup(playerid,groupname[60])

    Spoiler anzeigen
    Get the Group of an player.
    Params:
    playerid: The playerid, you want to get the Group.
    groupname: The name you want to search for an Group. Search for admin.* if you want to get the next admin. Group of the Player

    Spoiler anzeigen
    Returns: -1 if Player has no group.
    */

    Spoiler anzeigen
    /*
    native IsInGroup(playerid,groupid)

    Spoiler anzeigen
    Get the GroupId of an GroupName
    Params:
    playerid: The playerid, you want to check.
    groupid: The groupid, you want to check if the player is in. Get the groupid by using GetGroupId(groupname[])

    Spoiler anzeigen
    Returns: 1 if the player is in the Group.
    */

    Spoiler anzeigen
    /*
    native LoadPlayerPermission(playerid,auth[80])

    Spoiler anzeigen
    Loads all permissions of an Player including Group Permissions and more. If authstring not exist the Input gets Created.
    Can be used when Player Login.
    Params:
    playerid: The Playerid you want to load the data to.
    auth: The string the Player gets identificated by (Leave Blank for PlayerName). Can be used for User-Sqlid of the Gamemode, the Name, a Password or other.

    Spoiler anzeigen
    Returns: 1 if Player Permissions loaded.
    */

    Spoiler anzeigen
    /*
    native ShowPlayerPermissions(playerid,target)

    Spoiler anzeigen
    Shows an Player all Permissions of an target as an Dialog.
    Params:
    playerid: The playerid that will get shown the Dialog
    target: The playerid of the Player you wnat to get the Permissions.

    Spoiler anzeigen
    Returns: 0 if one of the Player is'nt Connected.
    */

    Spoiler anzeigen
    /*
    native ShowPlayerCommands(playerid,cap[64]="Commands",const permission[45]="")

    Spoiler anzeigen
    Shows an Player all Commands as an Dialog.
    Params:
    playerid: The playerid that will get all Commands and Descriptions
    cap: The Caption shown in the Dialog
    permission: The Permission you want to show the Command for. Leave Blank for all Permissions or use like amdin.* for all admin. Permissions.

    Spoiler anzeigen
    Returns: 0 if the Player is'nt Connected.
    */

    Spoiler anzeigen
    /*
    native ShowPlayerGroups(playerid,cap[64]="Groups",const groupname[60]="",callback[60]="",bool:newgroup=false)

    Spoiler anzeigen
    Shows an Player all Permissions of an target as an Dialog.
    Params:
    playerid: The playerid that will get all Groups listed
    cap: The Caption shown in the Dialog
    groupname: The Group you want to show. Leave Blank for all Groups or use like amdin.* for all admin. Groups.
    callback: The Callback that will be called when User selects an Group, Callback will give parameters (playerid,groupname[60],groupid,bool:newgroup)
    newgroup: If set to True at the End of the Dialog will be an List named (New Group) when clicking on it, player can put an new Groupname inside.

    Spoiler anzeigen
    Returns: 0 if the Player is'nt Connected.
    */

    Spoiler anzeigen
    /*
    native ShowPlayerGroupPermission(playerid,groupid,cap[64]="Group-Permissions",const permission[60]="",callback[60]="",bool:allprem=false)

    Spoiler anzeigen
    Shows an Player all Permissions of an target as an Dialog.
    Params:
    playerid: The playerid that will get all Group Permission Listed
    groupid: The Group you want to get the Permissions from.
    cap: The Caption shown in the Dialog
    permission: The Permissions you want to show. Leave Blank for all Permissions or use like amdin.* for all admin. Permissions.
    callback: The Callback that will be called when User selects an Group, Callback will give parameters (playerid,groupid,permission[45],bool:haspermission)
    allprem: If set to True The Dialog will also show the Permissions the Group don't has in red.

    Spoiler anzeigen
    Returns: 0 if the Player is'nt Connected.
    */


    Ich würde gerne wissen, ob sowas auch für andere Scripter Interessant ist, die vl. sogar so wie ich generft davon sind beim hinzufügen eines neuen Admin rnaks oder ähnliches wiedermal alle Admincmds durchgehen zu müssen...


    //Goldkiller: Premission, ernsthaft ? Es heißt permission :wacko: .
    Goldkiller: Danke dir dafür dass du mich auf diesen Groben fehler aufmerksam gemacht hast habe nun alles geändert.