Beiträge von Addickted

    Hallo,


    ich wollte gerne mein Fahrzeug (vorrübergehend) nur für den Besitzer zugänglich machen. Ist dieser im Auto kann er das Fahrzeug öffnen oder schliessen.
    Nur mein Befehl spinnt. Kann das mal jemand überprüfen? Ich weiss zwar was die Errormeldung bedeutet, aber ich begreife grad nicht wieso er sie ausgibt.


    P.S: An der Stelle wollte ich den Besitzer auslesen lassen um hinterher einen Vergleich zu machen ob der der im Auto ist auch der Besitzer ist.


    Enum:
    enum eFahrzeugInfo
    {
    vID,
    Float:vX,
    Float:vY,
    Float:vZ,
    Float:vA,
    vColor1,
    vColor2,
    vLocked,
    vModel,
    vBesitzer[MAX_PLAYER_NAME]
    }
    new Vehicle[MAX_VEHICLES][eFahrzeugInfo];


    Befehl:
    ocmd:auf(playerid,params[])
    {
    new save[19],pName[MAX_PLAYER_NAME], vehicleid;
    GetPlayerName(playerid,pName,sizeof pName);
    vehicleid = GetPlayerVehicleID(playerid);
    format(save,sizeof(save),"/Fahrzeuge/%d.ini",vehicleid);
    if(IsPlayerInAnyVehicle(playerid))
    {
    for(new i=0;i<MAX_VEHICLES;i++)
    {
    Vehicle[i][vBesitzer] = dini_Get(save,"vBesitzer"); // << Betroffene Zeile
    dini_IntSet(save,"vLocked",0);
    }
    }
    else
    {
    SendClientMessage(playerid,COLOR_YELLOW,"Du sitzt in keinem Auto");
    }
    return 1;
    }


    Error:
    (1099) : error 047: array sizes do not match, or destination array is too small

    Hi,


    ich wollte gerne die Dateinamen meiner Fahrzeuge nicht mit der VehicleID abspeichern, sondern mit fortlaufenden ID's. Was mit einer for Schleife bei meinem Haussystem wunderbar funktioniert und im entsprechenden Ordner nur EINE Datei erstellt, proudzierte der Code gestern 100 Dateien(wegen meinen Defines) für ein Fahrzeug mit Coords etc.


    Wie also kann ich das korrekt abspeichern. Kann mir da jemand ein Beispiel geben?

    Also im Grunde recht Simpel, da ich Anfänger bin dann doch in der Praxis komplizierter.


    Häuser können von Admins erstellt werden und gelöscht.
    Vom User gekauft und Verkauft werden.


    Ich lasse beim Verkaufen den Preis und den alten Besitzer, also denjenigen der den CMD ausführt(sofern er Besitzer ist) in eine Hausdatei schreiben.
    Wenn jemand sein Haus kauft, soll der alte Besitzer das Geld Automatisch bekommen mit einer Meldung im Chat.


    Ich führe mir vor Augen das der Name Ausgelesen werden muss beim /kaufehaus Befehl und in eine ID umgewandelt werden muss. Dann kann ich dem Verkäufer das Geld schicken(Oder gehts auch anders?). Wie stelle ich das an, ich arbeite mit Dini und ocmd.

    Moinsen ihr Fischis,


    meinem Scriptpartner und mir ist mal aufgefallen das unsere Kameraview aufs Vinewoodschild weg ist. Stattdessen wird der Standardscreen vom Santa Maria Beach angezeigt und es folgt der Register/Login Dialog.


    Hier der Code:


    public OnPlayerConnect(playerid)
    {
    sdisplay[playerid] = TextDrawCreate(270,400," ");
    TextDrawSetShadow(sdisplay[playerid],0);
    TextDrawSetOutline(sdisplay[playerid],1);
    TextDrawFont(sdisplay[playerid], 2);
    TextDrawShowForPlayer(playerid,sdisplay[playerid]);
    // TimerKill[playerid] = SetTimerEx("Score", 36000000, true, "i", playerid);
    SetPlayerPos(playerid, 1418.5896,-899.2567,49.9699);
    SetPlayerCameraPos(playerid, 1469.2946,-874.6194,56.3483);
    SetPlayerCameraLookAt(playerid, 1427.7919,-807.6279,86.4796);
    SetPlayerColor(playerid,COLOR_UNSICHTBAR);
    new pName[MAX_PLAYER_NAME], save[40],string[22 + MAX_PLAYER_NAME],joining[22 + MAX_PLAYER_NAME];
    GetPlayerName(playerid,pName,sizeof(pName));
    format(save,sizeof(save),"/Spieler/%s.ini",pName);
    format(joining, sizeof(joining),"Willkommen auf dem Server, %s", pName);
    SendClientMessage(playerid,COLOR_GREEN,joining);
    //......
    return 1;
    }

    Ich will meine Dini Dateien gerne löschen. Ich habe Häuser in Dini Dateien gespeichert. Die Datei würde ich nun gerne löschen. Ich dachte das ginge so, aber anscheinend nicht. Was mache ich falsch?


    ocmd:entfernehaus(playerid,params)
    {
    new pName[MAX_PLAYER_NAME],save[40];
    GetPlayerName(playerid,pName,sizeof(pName));
    format(save,sizeof(save),"/Spieler/%s.ini",pName);
    sInfo[playerid][pLevel] = dini_Int(save,"pLevel");
    if(sInfo[playerid][pLevel] > 1)
    {
    for(new haus;haus<MAX_HAUS;haus++)
    {
    format(save,sizeof(save),"/Haus/%d.ini",haus);
    if(IsPlayerInRangeOfPoint(playerid,2,HausInfo[haus][haus_x],HausInfo[haus][haus_y],HausInfo[haus][haus_z]))
    {
    if(dini_Exists(save))
    {
    dini_Remove(save); // So geht das jedenfalls nicht, die Datei bleibt bestehen.
    }
    }
    }
    }
    return 1;
    }

    ich habe es mal getestet gibt es auch ne möglichkeit das wenn man z.b 1200 hat und ihm noch 1800 geben will das man nur die 1800 eingeben muss und nicht 3000?


    Gibt es, wäre dann aber nicht mehr in dem Sinne des Befehls. Diesen habe ich erstellt um Beträge direkt anzupassen.


    if(sscanf(params,"ii",sID,Betrag)
    Das ist ziehmlich blödsinnig, du solltest hier lieber "ui" nutzen, statt "ii"


    Da hast du Recht, denn der Platzhalter steht ja unter anderem auch für eine UserID. Für die Funktionalität an sich spielt das keine Rolle.

    Hier mein erstes Tutorial für Einsteiger von einem Einsteiger.


    Für die Ausführung des Befehles habe ich die Includes OCMD, DINI und SSCANF verwendet. Downloadlinks am Ende des Tutorials.
    Beginnend fange ich bei mir mit den Grundgerüsten an und baue darin hinnein die Funktionen und Variabeln die ich benötige.
    In meinem Befehl sind verschiedene Abfragen zwecks Userlevel usw. Dies lasse ich an dieser Stelle aus, da diese sehr differenziert sind.


    Das würde bei mir erstmal so anfangen:


    ocmd:setmoney(playerid,params[])
    {
    new sID,Betrag;
    if(sscanf(params,"ui",sID,Betrag)) return SendClientMessage(playerid, COLOR_YELLOW,"Benutze: /setmoney [SpielerID][Betrag]");
    return 1;
    }


    Zur Erklärung: Befehle in OCMD verwenden nur die Definierung wie eben beschrieben, anders als wie in z.B. DCMD. Der Befehl an sich kann ganz am Ende vom Script stehen.
    Um ein Befehl einzugeben der Parameter beinhalten soll kann man z.B. SSCANF benutzen.
    In der Defininitionszeile geben wir die Parameter mittels Platzhalter an. In diesem Fall wollen wir 2 Integer (Ganzzahlen) übertragen.
    Es werden hier verschiedene Platzhalter verwendet. Direkt auf Anhieb fallen mir diese ein:


    "i" für Integer
    "u" für SpielerIDs oder Namen
    "s" für Strings
    "f" für floats.


    Da wir eine UserID und einen Integer übertragen wollen, verwenden wir also "ui" als Platzhalter.


    An der Stelle weiss das Script um was für Parameter es sich handelt. Die Platzhalter benötigen jedoch genau wie beim Formatieren einer Zeichenkette noch Variablen.


    Diese heissen sID und Betrag. sID steht für Spieler ID. Schreibt man den Befehl ohne Parameter wird eine SendClientMessage ausgegeben mit der richtigen Befehlsverwendung.


    ocmd:setmoney(playerid,params[])
    {
    new sID,Betrag; // Erstellt unsere benötigten Variablen
    if(sscanf(params,"ui",sID,Betrag)) return SendClientMessage(playerid, COLOR_YELLOW,"Benutze: /setmoney [SpielerID][Betrag]"); // Erstellt unsere Parameter und Sendet bei falscher Benutzung eine Message
    {
    SetPlayerMoney(sID,Betrag); // Ruft den Stock auf der unten nun Definiert ist/wird. Die Reihenfolge ist Identisch wie oben bei der Parameter Erstellung.
    }
    return 1;
    }
    }


    SetPlayerMoney ist keine Funktion von SAMP sondern ein ersteller Stock (Funktion), doch dazu gleich mehr. Die Variabeln sind nun mit den Integern gefüllt und der Betrag des Spielers wurde angepasst.
    In meinem Befehl lasse ich nun noch den neuen Betrag auch gleich mitspeichern. Ausserdem sende ich dem entsprechenden Spieler und auch mir eine SendClientMessage um Verwechslungen oder Zahlendreher auszuschliessen.
    Betrachtet man das ganze als Rohmaterial, würde der Befehl nun auch so funktionieren.


    Nun zum Stock. Ein Stock ist quasi eine eigens geschriebene Funktion die man natürlich auch aufrufen kann. Dieser Stock Resettet das Geld des Spielers und passt es um dem eingegeben Betrag an.


    stock SetPlayerMoney(playerid, cash)
    {
    ResetPlayerMoney(playerid); // Resett das Geld des Spielers und
    return GivePlayerMoney(playerid, cash); //gibt hier dem Spieler wieder Geld
    }


    Da dies mein erstes Tutorial ist, wäre es fein wenn ihr nicht zu hart bewertet. Sollte ich was vergessen haben oder es nicht richtig Erklärt ist, sagt es mir ruhig.


    Downloads:


    OCMD
    DINI
    SSCANF


    Edit: Korrekturen

    Wenn ich mich nicht irre hast du deinen Code der nicht ausgeführt wird in einem If-block. In der Abfrage fragst du ob der Spieler in der Fraktion 14 ist, du lässt die Fraktions ID aber nicht vorher auslesen. Das bedeutet das Script erkennt dich nicht als Fraktion 14 an und führt den Code nicht weiter aus.

    Huch, hab wohl geträumt beim schreiben. Danke.


    Mal angenommen ich will nun nicht die Spielerposition speichern in dem Moment wo ich /kaufehaus eingegeben habe, sondern die Daten vom Pickup aus der Datei. Kann ich das dann einfach so schreiben?


    Edit: Was mir in Pawn immernoch Problem bereitet ist definitiv an manchen Stellen die Syntax. Irgendwo ist sie immer gleich, aber dann als Anfänger doch sehr verschieden.
    Edit2: Ja kann man. Learning by Doing sage ich da nur :thumbup:



    dini_FloatSet(string,"pSpawnX",HausInfo[haus][haus_x]);
    dini_FloatSet(string,"pSpawnY",HausInfo[haus][haus_y]);
    dini_FloatSet(string,"pSpawnZ",HausInfo[haus][haus_z]);

    Moin Fischis,


    Mein Problem ist das die neuen Koordinaten nicht in die Spielerdatei eingetragen werden beim Ausführen des CMD. Wie kommt das? Ich habe hier die Variante das ich die SpielerPosition abfrage, ginge es nicht auch das einfach die Koordinaten aus dem IsPlayerInRangeOfPoint nehme?


    Zur Erklärung: Es stehen HausPickups rum, sobald der Besitzer "Keiner" eingetragen ist, kann man es kaufen und man soll nach Reconnect dort auf denselben Koordinaten spawnen wie wo das Pickup steht.


    Edit: Die Variablengrößen sind nicht entsprechend dessen wie sie Optimal wären, diese werden von mir hinterher angepasst.



    ocmd:kaufehaus(playerid,params[])
    {
    for(new haus=1;haus<MAX_HAUS;haus++)
    {
    if(IsPlayerInRangeOfPoint(playerid,2.0,HausInfo[haus][haus_x],HausInfo[haus][haus_y],HausInfo[haus][haus_z]))
    {
    new name[MAX_PLAYER_NAME],string[40],save[50], Float: pSpawnX, Float:pSpawnY,Float:pSpawnZ;
    GetPlayerName(playerid,name,sizeof name);
    GetPlayerPos(playerid, pSpawnX,pSpawnY,pSpawnZ);
    format(string,sizeof(string),"/Spieler/%s.ini",name);
    sInfo[playerid][pHaus] = dini_Int(string,"pHaus");
    if(sInfo[playerid][pHaus] == 0)
    {
    if(strcmp(HausInfo[haus][haus_besitzer],name,false) == 0)return SendClientMessage(playerid,COLOR_RED,"Dieses Haus gehört dir bereits!");
    if(strcmp(HausInfo[haus][haus_besitzer],"Keiner",false))return SendClientMessage(playerid,COLOR_RED,"Dieses Haus steht nicht zum Verkauf!");
    if(GetPlayerMoney(playerid) < HausInfo[haus][haus_preis])return SendClientMessage(playerid,COLOR_RED,"Du hast nicht genug Geld!");
    GivePlayerMoney(playerid,-HausInfo[haus][haus_preis]);
    SendClientMessage(playerid,COLOR_GREEN,"Du hast das Haus erfolgreich gekauft!");
    format(save,sizeof(save),"/Haus/%d.ini",haus);
    dini_Set(save,"besitzer",name);
    dini_IntSet(string,"pHaus",1);
    dini_FloatSet("string","pSpawnX",pSpawnX);
    dini_FloatSet("string","pSpawnY",pSpawnY);
    dini_FloatSet("string","pSpawnZ",pSpawnZ);
    SendClientMessage(playerid,COLOR_YELLOW,"Info: Dein Spawn wurde an dieses Haus gebunden!");
    KillHaus(haus);
    LoadHaus(haus);
    SendClientMessage(playerid,COLOR_LIGHTBLUE,"Info: Deine Hausdaten wurden erfolgreich geaendert!");

    }
    else if(sInfo[playerid][pHaus] == 1)
    {
    SendClientMessage(playerid,COLOR_RED,"Du kannst derzeit nur 1 Haus besitzen");
    }
    }
    }
    return 1;
    }