Beiträge von d0ma


    636 Zeichen passen in keinen 576 Zeichen langen array hinein :whistling:



    habe immer im Hinterkopf: Was ist der Inhalt von cmdtext[] eigentlich !!! ???


    Fehler 1

    Zitat

    Ich habe ein Command gebe ich da /unban ein, sagt er mir das es den Namen nicht gibt


    if(sscanf(cmdtext,"s",UserName))
    cmdtext[] = "/unban" in diesem fall, weil das hast du eingegeben
    -> if(sscanf("/unban","s",UserName))
    -> daraus folgt UserName[]= "/unban" = Nicht vorhanden!!!


    Fehler 2

    Zitat

    schreibe ich /unban werner, dann gibts nen Unkwon command ...


    in diesem fall ist cmdtext[] = "/unban werner"
    if(!strcmp("/unban", cmdtext, true))
    heißt soviel wie:
    if(!strcmp("/unban", "/unban werner", true))
    = falsch da "/unban" nicht das gleiche wie "/unban werner" ist = Unknown command



    Fazit: In den ganzen Command-Verwaltungssystemen wird der hintere Teil automatisch von dem eigentlichen command-namen getrennt und meist wird der Rest mit einer Variable params[] zum cmd übergeben
    Genau das musst du hier auch noch machen! (Oben stehen ja die beiden Fehler beschrieben)

    @Mr.ElectRoX:
    ohne timer ist das viel weniger Aufwand für Scripter&Server



    //variable
    new var[MAX_PLAYERS];



    //setzen(also ab wann gezählt werden soll)
    var[playerid] = gettime(); //speichert aktuelle Zeit in "Vergangene Sekunden seit dem 1.Januar 1970" in var[playerid] ab


    //überprüfen ob x sekunden vorbei sind
    if(gettime() > (var[playerid] + (x)) )
    {
    }
    für x setzt du die Anzahl an Sekunden ein



    Erklärung:
    - gettime() liefert die Anzahl an vergangenen Sekunden seit dem 1 Januar 1970 00:00
    wenn man das weiß dann sollte man aus dem Code den rest verstehen können

    {00FF00}Dieses {FF0000}Wort {00FF00}ist rot
    ergibt:
    Dieses Wort ist rot
    also einfach den hinteren teil wieder richtig einfärben ;)


    Beavis: Du kannst zwar ein '%' mit '%%' in format benutzen und formatieren, das heißt aber noch lange nicht das der SA-MP Chat bzw andere Anzeigearten in SA-MP dieses '%' unterstützen

    hab das jetzt auf die schnelle zusammen geschrieben, ohne timer/ohne irgendwelche komischen if(count == 2) usw


    Oben einfach die Positionen nach der reihe anordnen und schon fliegt der Ballon hin und her
    #include <a_samp>


    new Float:BalloonPos[][3] = // Mindestens 2 PUNKTE sonst gibt es Fehler!!!!!
    {
    {0.0, 0.0, 10.0},
    {0.0, 50.0, 100.0},
    {500.0, 50.0, 100.0},
    {1000.0, 1000.0, 100.0}
    };


    new BalloonState = 0;
    new BalloonObject = INVALID_OBJECT_ID;
    new BalloonType = 0; // Type, vorwärts oder zurück fliegen ?
    #define BALLOON_SPEED 2.0


    public OnGameModeInit()
    {
    BalloonObject = CreateObject(19337, 0.0,0.0,0.0,0.0,0.0,0.0);


    StartBalloon();
    return 1;
    }


    stock StartBalloon() //set balloon to start
    {
    SetObjectPos(BalloonObject, BalloonPos[0][0], BalloonPos[0][1], BalloonPos[0][2]); //reset to first position -> [0]
    MoveObject(BalloonObject, BalloonPos[1][0], BalloonPos[1][1], BalloonPos[1][2], BALLOON_SPEED);//start moving to second position
    BalloonState = 1; // reset balloon state variable
    BalloonType = 0;
    return 1;
    }


    public OnObjectMoved(objectid)
    {
    if(objectid == BalloonObject)
    {
    SetObjectPos(BalloonObject, BalloonPos[BalloonState][0], BalloonPos[BalloonState][1], BalloonPos[BalloonState][2]); //resync aktuelle position
    if(!BalloonType) BalloonState++;//vorwärts oder rückwärts bewegen ?
    else BalloonState--;
    if(BalloonState < 0) { //balloon hat wieder den start erreicht
    BalloonState=1;
    BalloonType=0;
    }
    else if(BalloonState >= sizeof(BalloonPos)) {//balloon hat das ende erreicht, wieder zurück fliegen ;)
    BalloonState=sizeof(BalloonPos)-2;
    BalloonType=1;
    }

    //Bewege das Object
    MoveObject(BalloonObject, BalloonPos[BalloonState][0], BalloonPos[BalloonState][1], BalloonPos[BalloonState][2], BALLOON_SPEED);
    }
    return 1;
    }


    ich nutz es bei 300 Fahrzeugen und?


    300 Fahrzeuge die bei OnGameModeInit geladen werden ?


    Ist eine einzige(oder ein paar) Abfrage(n) in OnGameModeInit -> das heißt soviel wie: Abfragen wenn noch 0 Spieler auf dem Server sind ? Wie hängt das mit Schnelligkeit/lag zusammen :)
    Mit dem 100 Spieler Beispiel geht es darum, dass ständig neue Abfragen gesendet werden müssen, da Spieler disconnecten/connecten und all die anderen Möglichkeiten auf dem Server beanspruchen die Abfragen benötigen.


    Was ich damit sagen will(ist allgemein gemeint und eigentlich auch nicht auf dich bezogen), ist das man das so einfach sagen kann wenn man keinen Server mit mehreren Spielern hat.

    Meine Meinung dazu:


    Ich nutze die neuste Version von dem Plugin von BlueG (Download: https://code.google.com/p/sa-mp-mysql-plugin/downloads/list ) im produktiven Einsatz auf meinem Server mit bis zu 175 Spielern und habe damit keine Probleme.


    Die meisten nutzen einfach nicht die neuste Version des Plugins, da dieses NUR threaded queries unterstützt und das die meisten einfach nicht ganz durchblicken bzw. verstehen. Die normalen Abfragen wurden entfernt, da die threaded Abfragen um einiges sinnvoller sind (sonst hätte man die normalen Abfragen ja auch erst gar nicht entfernt aus dem Plugin ....)


    Zusammenfassend: Wenn man ein Script neu beginnt und die Threaded Abfragen VERSTEHT, dann sollte man diese auch nutzen, wenn nicht sollte man auf alle Fälle versuchen die normalen Abfragen weitgehend zu optimieren.


    Beavis: schonmal mit >100 Spielern getestet ?

    Gewissermaßen, glaube ich nicht das das gehen wird. Da du über SAMP nicht fähig bist, Links anzuklicken, und dass müsstest du dann können. Anderenfalls müsstest du zugriff auf die Datenbank von Youtube haben. Und das würde ebenfalls icht gehen.


    Fazit:


    Ich glaube (bin ziemlich sicher) das du das nicht so umsetzen kannst


    das geht ;)
    Funktioniert ja bei mir auf dem Server


    1) auch ein Programm/Script kann auf youtube "Suchanfragen" ausführen
    2) und anschließend das Video Downloaden
    3) und anschließend den Sound des Videos in .mp3 umwandeln

    (Bin der Scripter von NSG)


    Das ist etwas komplizierter... :)
    dazu muss man erstmal ein Script schreiben/suchen um YouTube Videos zu suchen und anschließend umzuwandeln


    Der "/music" Befehl auf NSG sucht in YouTube nach deiner eingabe und wandelt das Video in ein .mp3 Format um (sehr einfach ausgedrückt)


    anschließend wird die Datei dann mit PlayAudioStreamForPlayer wiedergegeben


    Auf NSG kann man sogut wie alle lieder mit /music *LiedName* wiedergeben

    Create3DTextLabel
    und
    Destroy3DTextLabel
    gehören zusammen


    sowie:
    CreatePlayer3DTextLabel
    und
    DestroyPlayer3DTextLabel
    zusammen gehören


    aber NICHT Create3DTextLabel und DestroyPlayer3DTextLabel


    ocmd:aduty(playerid,params[])
    {
    new astr[128],astr1[128];
    if(!IstSpielerAdmin(playerid,1)) return SendClientMessage(playerid,ROT,"Du bist kein Admin");
    if(aduty[playerid]==0)
    {
    format(astr,sizeof(astr),"Admin %s hat sich zum Support angemeldet.",SpielerName(playerid));
    SendClientMessageToAll(BLAU,astr);
    aduty[playerid] = 1;
    label[playerid] = Create3DTextLabel("Admin im Dienst![Kein DM]", 0x008080FF, 30.0, 40.0, 50.0, 40.0, 0);
    Attach3DTextLabelToPlayer(label[playerid], playerid, 0.0, 0.0, 0.7);
    return 1;
    }
    if(aduty[playerid]==1)
    {
    format(astr1,sizeof(astr1),"Admin %s hat sich vom Support abgemeldet.",SpielerName(playerid));
    SendClientMessageToAll(BLAU,astr1);
    aduty[playerid] = 0;
    Delete3DTextLabel(label[playerid]);
    return 1;
    }
    return 1;
    }
    Fehler 1: In Zeile 10 muss label = Create3DTextLabel.... gesetzt werden ;)
    Fehler 2: In Zeile 19 muss wie oben erklärt Destroy3DTextLabel verwendet werden und nicht DestroyPlayer3DTextLabel
    Fehler 3: MAX_PLAYERS in new Text3D:label verwenden, sonst ist es nicht für alle spieler möglich
    Fehler 4: In OnPlayerDisconnect muss überprüft werden ob das Label aktiv ist und gegebenfalls gelöscht werden:
    public OnPlayerDisconnect(playerid, reason)
    {
    if(aduty[playerid])
    {
    aduty[playerid]=0;
    Destroy3DTextLabel(label[playerid]);
    }
    ...
    }


    ich denke mal das ein einziger optionaler Parameter nicht funktionieren kann.


    und nur so nebenbei.... für was braucht man sscanf wenn es sich nur um EINEN Wert handelt ?
    strval(text) = Zahl
    floatstr(text) = float
    text = Text
    dazu braucht man normal kein sscanf, weil ja überhaupt NULL aufgesplittet/verändert werden muss :D


    Was du brauchst ist:
    format(tanga,sizeof(tanga), p);
    falls p leer ist dann wird auch nichts kopiert ( = Optional )

    Das geht ohne timer mit gettime (viel viel besser)


    Global alle 10 minuten:

    new lastAusruesten;
    ocmd:ausruesten(playerid)
    {
    if(!IsPlayerInFrakt(playerid,2)||IsPlayerInFrakt(playerid,4)) return SendClientMessage(playerid,GRAU,"Deine Fraktion erlaubt es nicht dich Auszurüsten.");
    {
    if(gettime() - lastAusruesten < 60*10) return SendClientMessage(playerid,GRAU,"Sorry nur alle 10 min.");
    if(!IsPlayerInRangeOfPoint(playerid,3,2807.2842,-1166.1306,1025.5703)) return SendClientMessage(playerid,GRAU,"Du kannst dich hier nicht Ausrüsten.");
    if(GetPlayerMoney(playerid)<500) return SendClientMessage(playerid,GRAU,"Nicht genug Geld dabei.");
    {
    lastAusruesten =gettime();
    GivePlayerMoney(playerid,-500);
    SetPlayerArmour(playerid,100);
    SetPlayerHealth(playerid,100);
    GivePlayerWeapon(playerid,24,210);
    GivePlayerWeapon(playerid,25,40);
    GivePlayerWeapon(playerid,29,400);
    SendClientMessage(playerid,HBLAU,"Du hast dich Ausgerüstet!");
    SendClientMessage(playerid,HBLAU,"Du hast nun Volles Leben & Armour.");
    SendClientMessage(playerid,HBLAU,"Es wurden die Waffen Deagle/MP5/Schrotflinte hinzugefügt.");
    return 1;
    }
    }
    }


    oder pro spieler limitieren:

    new lastAusruesten[MAX_PLAYERS];
    ocmd:ausruesten(playerid)
    {
    if(!IsPlayerInFrakt(playerid,2)||IsPlayerInFrakt(playerid,4)) return SendClientMessage(playerid,GRAU,"Deine Fraktion erlaubt es nicht dich Auszurüsten.");
    {
    if(gettime() - lastAusruesten[playerid] < 60*10) return SendClientMessage(playerid,GRAU,"Sorry nur alle 10 min.");
    if(!IsPlayerInRangeOfPoint(playerid,3,2807.2842,-1166.1306,1025.5703)) return SendClientMessage(playerid,GRAU,"Du kannst dich hier nicht Ausrüsten.");
    if(GetPlayerMoney(playerid)<500) return SendClientMessage(playerid,GRAU,"Nicht genug Geld dabei.");
    {
    lastAusruesten[playerid] =gettime();
    GivePlayerMoney(playerid,-500);
    SetPlayerArmour(playerid,100);
    SetPlayerHealth(playerid,100);
    GivePlayerWeapon(playerid,24,210);
    GivePlayerWeapon(playerid,25,40);
    GivePlayerWeapon(playerid,29,400);
    SendClientMessage(playerid,HBLAU,"Du hast dich Ausgerüstet!");
    SendClientMessage(playerid,HBLAU,"Du hast nun Volles Leben & Armour.");
    SendClientMessage(playerid,HBLAU,"Es wurden die Waffen Deagle/MP5/Schrotflinte hinzugefügt.");
    return 1;
    }
    }
    }

    Ich suche eine schöne ebene grüne platte also eine graß fläche.. sie soll 4 eckig sein... ich hoffe ihr habt was nettes für mich :)


    dieses Object mit gras ? http://gta-sa-mp.de/object/?modelID=6959


    new beispielID = CreateObject(6959, 315.99121, 3208.60986, 144.43295, 356.85840, 0.00000, 3.14159);
    SetObjectMaterial( beispielID, 0, 10378, "cityhall_sfs", "desgreengrass", 0 );
    (aus meinem SetObjectMaterial Tutorial kopiert)


    muss man fast mit SetObjectMaterial machen, da es sonst denke ich keine flache grasfläche gibt

    soviel durcheinander D:


    DAS einzigste was du machst:
    zeile 84 in
    new spname[MAX_PLAYER_NAME];
    abändern
    (also das new dabei steht)


    und
    format(string,sizeof(string),"Der Spieler %s [ID: %d] hat den Server betreten.");
    zu
    format(string,sizeof(string),"Der Spieler %s [ID: %d] hat den Server betreten.", spname, playerid);



    EDIT: und in GetPlayerName steht spaname statt spname (tippfehler)