Beiträge von FACE

    Auch das sollte ja wohl kein Problem darstellen.
    Die Auslese-Routine war wohl das Schwerste.


    Geht man halt hin und schreibt die wichtigen Werte aus dem Array in einen Dialog und dann wählt man halt aus und spawnt den Mist.
    Ich bin eben davon ausgegangen, dass du mehrere "Setups" für ein Autohaus hättest, sowie auch mehrere Autohäuser, welche du dann einfach per Command laden wolltest.

    Die Autos zu spawnen ist kein Problem, aber wahrscheinlich möchtest du ja noch ein paar Labels, also Schriftzüge mit den Namen der Autos, an die Wagen anheften.
    Der Name "Los Santos Autohaus" soll wahrscheinlich auch angeheftet werden, richtig ? ;)


    Soweit mit dem Spawnen kein Problem. Doch die Wagen zu löschen und zu sperren ist dann ein Anderes. (Aber dazu später..)


    Fangen wir also mit dem Array an:
    Um das Fahrzeug zu spawnen benötigen wir die ModelID (check), die Koordinaten, sprich X,Y,Z und Rotation (check), den Interior (hier Welt 0), und die Farbe(n), welche hier wegfallen, da wir diese zufällig generieren lassen.


    Die Labels heften wir später dran.



    //Das Array wurde oben definiert...Die "AKInfo" ist aber überflüssig, also weg damit.
    new Buycars[6][] =
    {
    {549,"Clover", "Los Santos Autohaus", 20000, 2136.0657,-1131.0842,25.3699,91.2656},
    {402,"Buffalo","Los Santos Autohaus",40000,2136.0845,-1126.7832,25.3609,91.1370},
    {412,"Vooodo","Los Santos Autohaus",60000,2135.3247,-1136.2650,25.5041,91.3687},
    {418,"Moonbeam","Los Santos Autohaus",80000,2136.2673,-1140.1033,25.4358,93.1913},
    {422,"Bobcat","Los Santos Autohaus",10000,2135.8828,-1143.7695,24.9242,89.5671},
    {426,"Premier","Los Santos Autohaus",120000,2135.9514,-1148.0029,24.2194,90.2682}
    };


    Nun zur Auslese-Routine für das Spawnen der Autos:

    //Wir bauen eine for-schleife, die das Array ausliest und die wichtigen Werte in den CreateVehicle-Command einsetzt
    for(new i=0;i<sizeof(Buycars);i++){
    new v;//Deklaration des Fahrzeuges; NUR in der Schleife!!!
    //Wir spawnen das Fahrzeug
    v=CreateVehicle(Buycars[i][0]/*ModelID*/,/*Jetzt die Coords*/Buycars[i][4],Buycars[i][5],Buycars[i][6],Buycars[i][7],-1,-1,60/*alle 60 Sek ohne Fahrer respawnt; gegen Verschieben etc.*/);
    //Motor abstellen, damit keiner klauen kann.
    SetVehicleParamsEx(v, false, false, false, true, true, true, false);//Bei den Werten "true" für Türen, Haube etc.. Kannst du konfigurieren, ob die offen oder geschlossen seien sollen.
    }


    Jetzt können wir noch das Label anheften...
    Ach was.... Das kiegst dann noch selbst hin. Einfach den Labelkram mit in die Schleife hauen und basta ;)

    Kann da Goldkiller nur Recht geben:
    Du liest einen Integer aus (in der sscanf Zeile).
    Preis ist somit ein Integer, du hast diesen oben aber anders definiert. Richtig wäre dann so:
    new pID, preis/*Der Part hier ist weggefallen*/, string[128];


    Dadurch fällt jetzt auch die Zeile mit dem "preismoney und strval weg! :

    new preismoney = strval(preis);
    GivePlayerMoney(pID,-preismoney);


    wird zu :



    GivePlayerMoney(pID,-preis);//Warum du vorher extra eine zweite Variable definiert hast, versteh ich nicht..


    Da der Medic wohl auch das Geld erhalten soll, schieben wir ihm das auch noch, nett wie wir sind ;), eben zu.
    Insgesamt sieht das dann wie folgt aus:



    ocmd:versorgen(playerid,params[])
    {
    new pID, preis, string[128];
    new Float:X, Float:Y, Float:Z;
    GetPlayerPos(playerid, X, Y, Z);
    if(IsPlayerInRangeOfPoint(pID, 5.0, X,Y,Z))//Hier ist das Spaltprodukt! Das ist aber doch noch garnicht definiert!!
    {
    if(!istSpielerFraktion(playerid,3))return SendClientMessage(playerid,ROT,"[ERROR] Du bist kein Arzt!");
    if(sscanf(params,"ui",pID,preis))return SendClientMessage(playerid,ROT,"[ERROR] Eingeben: /versorgen [ID] [PREIS]");/*Hier liegt jetzt aber der Fehler.
    Du spaltest die params auf, arbeitest aber vorher schon mit dem Spaltproduk?!*/
    format(string,sizeof(string),"[Arzt] Du wurdest vom Arzt %s für %i$ geheilt. Bleib gesund!",SpielerName(playerid),preis);
    SendClientMessage(pID,BLAU,string);
    GivePlayerMoney(pID,-preis);//Wir entnehmen dem Einen das Geld
    GivePlayerMoney(playerid,preis);//Und geben dem Anderen den Betrag
    SetPlayerHealth(pID,100);
    SendClientMessage(playerid,BLAU,"Du hast einen Spieler erfolgreich geheilt!");//Wir senden noch eine kleine Bestätigungsmessage.
    return 1;
    }
    else
    {
    SendClientMessage(playerid,ROT,"[ERROR] Du bist nicht in der nähe der Person.");
    return 1;
    }
    }



    Fazit: Bitte baue die Aufspaltung der Params bereits vor die Range-Abfrage (Distanzabfrage zwischen den Spielern), da du "pID" bereits dort verwenden musst.

    K3v1n hat es schon auf den Punkt gebracht. Notfalls kannst du dir auch einfach eine Funktion definieren ;)


    Probiers mal so:

    ..
    for(new i=0;i<GetMaxPlayers();i++){
    ifIsPlayerConnected(i){
    PlayAudioStreamForPlayer(i,.....)
    }
    }


    Way like this ;)

    Ok, es gibt ein paar Möglichkeiten:
    Entweder du fügst bei OnPlayerSpawn(playerid) die Funktion "ClearAnimations(playerid);" ein, oder du suchst nach der Stelle, an der "SpawnPlayer(playerid)" vorkommt. Diese müsstest du dann löschen.

    Wo hast du die Sachen eingefügt (Unter welchem Callback)?
    Hast du den Server schon restartet, oder den Gamemode neu geladen?
    Hast du das Script compiled?


    Zeige notfalls mal ein paar exemplarische Zeilen deiner eingefügten Objekte. (Eine Zeile reicht da schon ;) )

    Code
    SpawnPlayer - Kills the player if they are in a vehicle and then they spawn with a bottle in their hand


    Siehe Sa-mp Wiki in der Kategorie "Bugs"
    Wenn du unter "OnPlayerDeath(playerid, killerid,reason)" ein "SpawnPlayer(playerid);" verbaut haben solltest, kann dies die Ursache dafür sein.

    War die Syntax von "dini_Get" nicht ohne Angabe eine String-Länge?
    Beispiel:dini_Get(file,"Ip"); 
    Desweiteren ist es leider nicht richtig, die Auslese-Funktion mit einem String gleichzusetzen, daher:
    (Beispiel)
    strcat(gPlayerInfo[playerid][PLAYER_IP],dini_Get(file,"Ip"));
    (Beispiel entnommen aus sa-mp wikipedia)

    Nutze doch einfach die "Apply Animation" Funktion.
    Die Animationen, welche durch diese Funktion erzeugt werden, können bei anderen Spielern synchronisiert werden.
    http://wiki.sa-mp.com/wiki/ApplyAnimation
    ApplyAnimation(playerid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time, forcesync)

    Code
    forcesync: Set to 1 to force playerid to sync animation with other players in all instances (optional).


    MFG FACE

    Natürlich muss man das vorher definieren !
    Da die Funktionen aber doch sehr häufig benutzt werden, finden sich die Deklarationen im Netz und sind auch sinnvoll, wenn man diese einbindet.

    Um zu wissen ob der Name bereits unter "allen" Userfiles vorhanden ist, bleibt doch eigentlich nur, den Namen mit allen Usernamen zu vergleichen, was noch lange nicht bedingt alle Files "auslesen zu müssen", lediglich die Directory muss ausgelesen werden.
    Soweit zur Logik.


    Alternativlösungen wüsste ich da keine anderen.


    Wäre aber gespannt von welchen zu hören, auch wenn mir keine andere Vergleichsmethode einfällt.
    Durch das Verändern von Funktionen und die Auslagerung des Abfrage-Prozesses auf irgendwelche datenbank-internen Funktionen wird das ganze Prozedere letztlich nur anders benannt.


    Vorschlag zur Güte:

    new pname[32];//Änder Variablen-namen und länge auf deine Bedürfnisse; viell. speicherst du ja noch Zusätze wie Counter im Playernamen.
    //GetPlayerName(playerid,pname);//Wenn du es nicht schon vorher drin hast.


    for(new i=0;i!=j && strlen(name[i])!=0 /*Für ende der Schleife*/;i++)
    {
    if (i==playerid) continue;
    if(strcmp(pname, name[i], false)==0) {break};//Break der Schleife!..Längenvergleich könnte man jetzt natürlich auch noch reinbringen.
    }



    Wenn also die Schleife voll durchläuft, dann hast du keine Treffer.
    Wenn die Schleife via Break unterbrochen wird, dann hast du schonmal einen identischen gefunden.
    Da ich natürlich nicht wissen kann, wie du deine Spielerfiles hinterlegt hast, ist es notwendig, die Stellen mit "name" gegebenenfalls abzuändern.

    Ich finde viele innovative Ideen auf Servern super, jedoch wird es oft zu komplex für den Spieler und der Kerngedanke rückt dadurch in den Hintergrund.
    Aktien zum Beispiel... Die Zielgruppe des Servers, schätze mal so zwischen 13-19, wird sich im Leben bisher wohl kaum mit Börsenaktivitäten beschäftigt haben.


    Lieber etwas einfacher, dafür gut zu bedienen. ;) (Funktionen sind im Endeffekt immer dieselben, aber im Layout und der Bedienung gibts die entscheidenden Unterschiede)

    Das ist versionsabhängig.
    Der Vorfall, selbst bei blankem Script, dass einem Geld beim "Ableben" abgezogen wird, hat sich bei mir in einer oder zwei Versionen von Sa-mp ereignet, in der aktuellen Version jedoch nichtmehr.