Beiträge von FACE

    Bevor das mit dem break noch zu viele Probleme aufwirft, schreibe ich das Problem eben um:



    new namestr[25], merk;
    merk=-1;
    for(new i=0; i<GetMaxPlayres();i++){
    GetPlayerName(i, namestr, sizeof(namestr));
    if(i==playerid || !IsPlayerConnected(i)) continue;
    if(strcmp(inputtext,namestr,true) == 0) { merk=i; break; }
    iff(i==GetMaxPlayers() && !IsPlayerConnected(i)) { ShowPlayerDialog(playerid,DIALOG_PERSON,DIALOG_STYLE_INPUT,"Contract","Der Spieler ist nicht Online!\nGib den Namen der Person ein","absenden","abbrechen"); }
    }



    ..
    //ShowPlayerDialog..
    //if(merk!=-1) //Show (alt.)





    das "merk=i;" kann man natürlich direkt mit ShowPlayerDialog ersetzen ;)


    Der Rest sollte wohl kein Problem sein ;)



    Code
    break
    
    
    break breaks out of a loop, ending it prematurely:
    for (new a = 0; a < 10; a++)
    {
    	if (a == 5) break;
    }
    This loop will go 6 times but code after the break will only be executed 5 times.



    Wir müssen den Dialog aus der Schleife rausziehen, sonst bricht er dort ab.

    Groß- und Kleinschreibung habe ich mit dem Ignore-Case hinfällig gemacht. Genau um diese Fehlerquelle auszumerzen.


    Eine Idee hätte ich noch.
    So banal es klingen mag: Wo hast du den Code eingefügt.
    Und nicht zu vergessen: Hast du deine DialogIDs richtig definiert (bzw. abgefragt) ? Ist eine häufige Fehlerursache.

    Natürlich!
    Ich habe lediglich noch eingefügt, dass die Spieler, die nicht online sind (und der spieler selbst), übersprungen werden.


    Anbei habe ich noch eine kleine Änderung vorgenommen:

    for(new i=0; i<GetMaxPlayres();i++){
    if(i==playerid || !IsPlayerConnected(i)) continue;
    if(strcmp(inputtext,SpielerName(i),true) == 0){
    //Dein Code..
    break;
    return 1;
    }
    }
    return ShowPlayerDialog(playerid,DIALOG_PERSON,DIALOG_STYLE_INPUT,"Contract","Der Spieler ist nicht Online!\nGib den Namen der Person ein","absenden","abbrechen"); }



    Auf die Gefahr hin, dass dein String (SpielerName) falsch abgefragt wird, hier nochmal direkt deklariert:

    new namestr[25];
    for(new i=0; i<GetMaxPlayres();i++){
    GetPlayerName(i, namestr, sizeof(namestr));
    if(i==playerid || !IsPlayerConnected(i)) continue;
    if(strcmp(inputtext,namestr,true) == 0){
    //Dein Code..
    break;
    return 1;
    }
    }
    return ShowPlayerDialog(playerid,DIALOG_PERSON,DIALOG_STYLE_INPUT,"Contract","Der Spieler ist nicht Online!\nGib den Namen der Person ein","absenden","abbrechen"); }

    Ich verkürze mal deine Suche..


    Ja, es gibt mittlerweile zwei Callbacks, die genau durch sowas ausgelöst werden.



    public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid)
    {
    if(issuerid != INVALID_PLAYER_ID) // If not self-inflicted
    {
    new
    infoString[128],
    weaponName[24],
    victimName[MAX_PLAYER_NAME],
    attackerName[MAX_PLAYER_NAME];

    GetPlayerName(playerid, victimName, sizeof (victimName));
    GetPlayerName(issuerid, attackerName, sizeof (attackerName));

    GetWeaponName(weaponid, weaponName, sizeof (weaponName));

    format(infoString, sizeof(infoString), "%s has made %.0f damage to %s, weapon: %s", attackerName, amount, victimName, weaponName);
    SendClientMessageToAll(-1, infoString);
    }
    return 1;
    }


    Analog dazu gibt es auch noch "OnPlayerTakeDamage".


    Ich glaube, aus dem Beispiel kannst du alles nötige erfassen.
    Wenn nicht, geh einfach ins Sa-mp Wiki ;)

    Code
    Returns	The ID of the class which was just added.
    300 if the class limit (300) was reached. The highest possible class ID is 299.


    Wenn es zuviele werden, wird nurnoch die letzte überschrieben.


    Die Frage ist jedoch berechtigt.
    Ich hätte den Vorschlag, dass du einfach nur 2-3 verschiedene Klassen erstellst und diese dann unter "OnPlayerRequestClass" entsprechend anpasst.



    Ich geb dir mal ein kleines Beispiel:

    public OnPlayerRequestClass(playerid,classid)
    {
    if(Level==0)
    {
    if(classid == 3 ) SetPlayerSkin(playerid, 25);
    ....
    }
    ...
    return 0;
    }
    return 1;
    }


    for(new i; i<MAX_PLAYERS;i++){
    if(i==playerid || !IsPlayerConnected(i)) continue;
    if(!strcmp(inputtext,SpielerName(i),false)){
    //Bla bla
    return 1;
    }
    }
    return ShowPlayerDialog(playerid,DIALOG_PERSON,DIALOG_STYLE_INPUT,"Contract","Der Spieler ist nicht Online!\nGib den Namen der Person ein","absenden","abbrechen"); }

    Schonmal so probiert ? ;)

    Offengestanden finde ich keinen Anhaltspunkt, weshalb dem Spieler Wanted-Sterne beim Töten eines Mitspielers zugeschrieben werden könnten.
    Es findet sich keine Verlinkung auf "OnPlayerGiveDamage", "OnPlayerTakeDamage" noch "OnPlayerDeath".
    Außerdem setzt du ja nirgends Wanteds (SetPlayerWantedLevel(playerid,level)).


    Wenn es jedoch nur um das Textdraw geht:
    -Ich sehe die beiden Fkts. WantedUpdate und WantedSternUpdate in gewissen Zügen als redundant an.
    Eine Funktion kannst du dir locker sparen ;) (Performance!)
    -Desweiteren verstehe ich nicht, warum du extra einen Timer für die ganze Angelegenheit setzt.


    -Hinzu kommt noch ein evtl. Fehler:
    TextDrawShowForPlayer(playerid,Wanteds);
    Dein Textdraw ist allgemein für jeden definiert? Das könnte ein Problem werden ;)
    Ein spezifisches Textdraw wäre hier vermutlich angebracht.

    Alternativ kannst du auch einfach via RCON Command einen neuen Gamemode laden ^^


    Siehe folgenden Code:

    Code
    /rcon gamemodetext [name] - change the gamemode text (example: /rcon gamemodetext my gamemode).

    Hi,
    mir sind da zwei Sachen aufgefallen:


    new vehicleid = GetPlayerVehicleID(playerid); new autoid = GetPlayerVehicleID(playerid);
    Erscheint mir persönlich etwas redundant ;)



    Zu der Fremove Sache.
    Die Definition im Wiki sagt ganz klar, dass das File vorher geschlossen werden muss.

    Code
    Note: If the file you are attempting to delete is open at the time that fremove is used, it will not work.
    You must first use fclose before you try deleting it, that is, if you have used fopen.


    Versuch also einfach mal, das File vorher via Fclose zu schließen.

    if(dini_Float(spielerdatei, "Geschlecht")== format(SpielerInfo[playerid][Geschlecht], sizeof(Frau), "Weiblich"))
    Schau mal..Du liest "Geschlecht" als einen Gleitkomma-Wert aus. Das würde mich schon ein wenig stutzig machen ;)
    Dann kommt die eigentlich Abfrage. Du fragst ab, ob du dein Gleitkommawert dem Integer des Strings "Weiblich" gleichkommt.


    Ich würde es mal ganz anders probieren ;)

    if(dini_Int(spielerdatei,"Geschlecht") == 0)//0 == männlich, 1 == weiblich
    {
    SetPlayerSkin(playerid, 22);
    }
    else
    {
    SetPlayerSkin(playerid, 7);
    }
    }


    Die Abfrage erscheint für mich als deutlich logischer..
    Jedoch würde ich evtl. am Anfang (Connect des Spielers) die Variable in einen Integer packen, sodass du nichtmehr andauernd auslesen musst (stichwort perfomance!).
    Die Belegung der Variable musst doch halt ggf. noch deinen Verhältnissen anpassen.

    Mal eben die Sachen nochmal in reiner Form, damit auch andere Mitleser nicht im Dunkeln gelassen werden.



    COMMAND:motor(playerid,params[])
    {
    if(GetPlayerState(playerid)==PLAYER_STATE_DRIVER)
    {
    new engine,lights,alarm,doors,bonnet,boot,objective;
    GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);
    if(engine==1)
    {
    SetVehicleParamsEx(GetPlayerVehicleID(playerid),0,lights,alarm,doors,bonnet,boot,objective);
    GameTextForPlayer(playerid,"~w~Motor ~r~abgeschaltet",1500, 3);
    }
    else
    {
    SetVehicleParamsEx(GetPlayerVehicleID(playerid),1,lights,alarm,doors,bonnet,boot,objective);
    GameTextForPlayer(playerid,"~w~Motor ~g~angeschaltet~",1500,3);
    }
    }
    return 1;
    }


    Müsste so funktionieren .


    Aber mal so ganz nebenbei:
    -Die Abfrage, ob der Spieler der Fahrer des Wagens ist, finde ich eigentlich ein wenig übeflüssig.
    Klar, in dem Kontext macht es Sinn.


    Ich hätte jedoch über eine Tastenkombi und die dann folgende Direktabfrage, ob es sich um den Fahrer handelt, erst überprüft, ob ich überhaupt auf eine weitere Funktion weiterleite.

    Immerwieder interessant, wie sich doch der Themenschwerpunkt der Leute verschiebt.
    Von Mandela zur Gaddafi-Grundsatzdiskussion..


    Vielleicht hilft ja ein andere Blickwinkel weiter:
    -Mandela war mit vielen Menschen in Kontakt. Geht es nicht genau darum?!


    Zum Thema "Bild mit Hitler" (fiktiv) würde mir auch wieder der obenstehende Satz einfallen.
    Einfluss auf das Denken und Handeln von Personen erzielt man nur durch Kontakt.


    (Das ist meine Meinung dazu...Muss keiner teilen, wenn sie einem missfallen sollte ;) )

    Ich hab ne Menge Kumpels, die abends in Clubs/Pubs/Bars arbeiten und sich dort ein wenig das Studiengeld aufbessern.
    Alternativ kann man auch im Kino oder im Theater anfangen. In letzterem werden oft Roadies und Bimbos für allen möglichen Krempel gesucht, einfach mal anfragen ;)

    Mal so der kleine Hint..
    Schau dir mal diese beiden Zeilen an:

    GetVehicleParamsEx(vehid,engines,lightss,alarms,doorss,bonnets,boots,objectives);
    SetVehicleParamsEx(vehid,1,lightss,alarms,doorss,bonnets,boots,objectives);

    Na, was fällt uns da auf ? ;)
    Du schaltest den Motor ein (im anderen Fall aus), möchtest aber doch das Licht ein-/bzw. ausschalten.


    Ändern wir dazu die Zeilen wie folgt:

    GetVehicleParamsEx(vehid,engines,lightss,alarms,doorss,bonnets,boots,objectives);
    SetVehicleParamsEx(vehid,engines,1,alarms,doorss,bonnets,boots,objectives);


    MFG FACE.

    Relativ einfach.
    Hau ein Array mit den Positions oben ins Script:

    new randomspawn[][] = {
    {..,..,..},
    {..,..,..},
    {..,..,..}
    };


    Dann bei OnPlayerSpawn:

    new spawnrandom = random(sizeof(randomspawn));
    SetPlayerPos(playerid, randomspawn[spawnrandom][0], randomspawn[spawnrandom][1], randomspawn[spawnrandom][2]);
    //Kannst auch noch "Angle" mit einbauen (InteriorIDs natürlich auch ;) )


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


    Zur Sache mit den Waffen speichern.
    Bei "OnPlayerDisconnect" kannst du einfach die Daten auslesen und in ein File schreiben.
    Zum Beispiel mit Dini, oder per MySQL, oder halt alternativ mit dem Standart-Filesystem.


    (Wieso du nicht erst die Suche benutzt hast, ist mir immernoch ein Rätsel)


    Gruß, FACE 8)

    Sorry, hab ein Semikolon vergessen:
    Anbei hast du die Anzahl vergessen einzutragen:



    new Muell[3][3] = {
    {946.0647,-1233.8378,16.3256},
    {946.3282,-1251.4817,15.5382},
    {946.5988,-1271.6508,15.0806}
    };


    Das geht aber auch eigentlich aus dem Errorcode hervor. ;)
    Rest kannst dir ja selbst zusammenbasteln.

    Es geht dabei darum, die Belastung für den Server und für den Client so gering wie möglich zu halten.
    Simple Beispiele sind unnötige Abfragen, die man durch bessere ersetzen kann, oder die gar komplett wegfallen.


    Da ich gerade auf Quellcode verzichten möchte, kurz ein paar Gedanken:
    -Man muss nicht alles aus der Datenbank oder aus Files auslesen, dafür gibt es Variablen, die genau für dieses Zwischenspeichern gedacht sind.
    -Ist es unbedingt notwendig eine Schleife durch alle Spieler laufen zu lassen?


    Allgemein Schlucken Schleifen und Sortier-Algorythmen sehr viel Rechenleistung.
    Daher bietet es sich an, diese "Großverbraucher" zu optimieren, bzw. zu überlegen, ob man nicht eine bessere Methode für eine Aktion finden kann.
    Mal als Beispiel einen Heapsort:
    (entnommen aus "wikipedia")
    Dagegen den Bubblesort:
    (entnommen aus "wikipedia")
    Ich hoffe es wird klar, was hier klar vorne liegt ;)



    Das ist halt Code-Optimizing :)



    Grüße FACE.