Beiträge von Simon

    Wurde mit 0.3d etwas an TogglePlayerControllable(playerid,toggle); geändert?


    Seid dem update funktioniert folgende verwendung nicht mehr: TogglePlayerControllable(playerid,1);
    Ich habe damit das einsteigen in fahrzeugen verhindert, in denen man nicht befugt ist einzusteigen. Jedoch funktioniert dies nun nicht mehr ohne das daran was geändert wurde.

    Guten Tag


    Ich möchte einen float runden. Der Float entsteht, indem ich ein integer teile (5 / 2 = 2.5). Es soll immer hoch gerundet werden (5 / 2 ~ 3).
    Jedoch rundet er bei 5 / 2 immer auf 2, dabei ist egal welche Methode ich benutze um runden.


    hier mal meine rundungen... habs schon einiges versucht, aber nichts hat geklappt.


    printf("normal: %d",floatround(5 / 2,floatround_round)); // 2
    printf("hoch: %d",floatround(5 / 2,floatround_ceil)); // 2
    printf("runter: %d",floatround(5 / 2,floatround_floor)); // 2


    LG
    Simon :thumbup:

    das problem liegt ja nicht direkt bei den admincars und das array ist nicht zu klein:


    new Adminauto[MAX_VEHICLES];


    das Problem ist, das wenn ich 49 Fahrzeuge besitze und sich jemand einloggt, der sich irgendwann mal ein auto gekauft hat und sein auto dann erstellt wird, die id 50 hat.


    es wird zwar so erstellt: Spielercar[bla][bla] = .. aber die vehicleid ist 50, also Spielercar[bla][bla] gibt den Wert 50 wieder. wenn das auto nun durch ausloggen oder verkaufen zerstört wird, hat Spielercar[bla][bla] immernoch den Wert 50. wird nun ein Adminauto oder Fraktionsauto erstellt, so hat dieses auch den Wert 50.


    Nun wird überprüft ob es die und die vehicleid id ist, und da beide den selben wert haben, wirds als Spielerfahrzeug erkannt und beim ausloggen des spielers zerstört. so kommt es, das Fraktionsfahrzeuge oder gespawnte Adminautos zerstört werden.


    Abfragen tu ich natürlich nicht: if(vehicleid == 50) sondern if(vehicleid == Spielercar[bla][bla]); aber es haut halt nicht hin, das ich den Wert dieser variable auf 0 setzte und abfrage. der wert bleibt 50 in diesem Beispiel


    LG
    Simon

    ich habe sie bisher auf -1 gesetzt, hat aber nicht geklappt :S
    das problem ist, das auch die parameter für diese vehicleid gespeichert werden. beim zerstören werden die wieder resettet.


    stock p_DestroyVehicle(carid)
    {
    SetVehicleParamsEx(carid,0,0,0,0,0,0,0);
    for(new i = 0; i < MAX_PLAYERS; i++) SetVehicleParamsForPlayer(carid,i,0,0);
    Adminauto[carid] = 0;
    DestroyVehicle(carid);
    carid = -1;
    return 1;
    }


    //edit: es will einfach nicht.. hier der aktuelle code:


    stock p_DestroyVehicle(carid)
    {
    if(carid == 0) return 0;
    SetVehicleParamsEx(carid,0,0,0,0,0,0,0);
    for(new i = 0; i < MAX_PLAYERS; i++) SetVehicleParamsForPlayer(carid,i,0,0);
    Adminauto[carid] = 0;
    DestroyVehicle(carid);
    carid = 0;
    return 1;
    }

    Ich habe schon eine menge Bugs behoben. Nun gibt es nur noch ein Bug durch die id verschiebung.
    Der Grund dafür ist, das ich Autos kaufen und verkaufen kann innerhalb der fraktion und als spieler selbst.


    wenn ich nun zum Beispiel ein Auto kaufe und mich auslogge, wirds zerstört. Das ist auch richtig so. Wenn ich jedoch mein privates auto verkaufe, wird es zerstört. kauft sich nun eine Fraktion ein Fahrzeug, und der spieler, der das auto verkauft hat, loggt sich aus, dann wird das fraktionsauto zerstört, da das ja die selbe id hat, wie das private Fahrzeug hatte.


    So werden beispielweise fraktionscars erstellt:


    Frakcar[0] = CreateVehicle..
    Frakcar[1] = CreateVehicle..
    usw.


    ein spielerfahrzeug wird so hinzugefügt:
    Spielercar[playerid][0] = CreateVehicle..
    Spielercar[playerid][1] = CreateVehicle..


    beim verkaufen siehts dann so aus:
    DestroyVehicle(Spielercar[playerid][0]);


    Das Problem ist nun das das fraktionsauto dann die selbe id hat wie das spielerfahrzeug vorher und deswegen als spielercar angesehen wird, obwohl das schon längst zerstört wurde.


    LG
    Simon :thumbup:

    Meine abfrage vorher war: if(!IsPlayerConnected(pID) || login[pID == 0 || IsPlayerNPC(pID))


    Das beduetet soviel wie: wenn er garnichtaufm Server ist, wenn er nicht eingeloggt ist order wenn er ein Bot ist, wird diese ID Als ungültig erkannt und "Ungültige ID" wird gesendet.
    Jedoch kommt "SERVER: Unknown Command". Die abfrage ob er überhaupt aufm server ist, fand ich unnötig, da er selbst wenn, eingeloggt sein muss.


    Also der befehl funktioniert super, wenn man die falschen parameter nutzt, kommt die nachricht: "Benutzung: bla..." die andeen abfragen funktionieren auch, es wird immer die entsprechende Nachricht gesendet. nur die eine abfrage funktioniert nicht..


    LG
    Simon :thumbup:


    //edit: fehler gelöst.. man muss also doch vorher abfragen ob er überhaupt aufm server ist :S

    Guten Tag


    Bei einer bestimmten Zeile kommt immer die bereits in der überschrift stehende Nachricht. Diese Nachricht wird normalerweise gesendet, wenn er den COmmand nicht finden kann.
    Jedoch funktionieren alle commands wunderbar, nur bei einer abfrage kommt diese Nachricht.


    Zeile: if(login[pID] == 0 || IsPlayerNPC(pID)) return SendClientMessage(playerid,grau,"Ungültige Id!");


    Ich verstehe nur noch warum es ausgerechnet bei dieser Zeile geschieht. die Zeilen darunter funktionieren wieder wunderbar.


    Hier mal ein bsp command:


    dcmd_giverank(playerid,params[])
    {
    new pID,rang;
    if(sscanf(params, "ud", pID, rang)) return SendClientMessage(playerid,grau,"Benutzung: /giverank [playerid] [Rang]");
    if(login[pID] == 0 || IsPlayerNPC(pID)) return SendClientMessage(playerid,grau,"Ungültige Id!");
    if(Spieler[playerid][Leader] < 0) return 0;
    if(GetPlayerFrak(pID) != Spieler[playerid][Leader]) return SendClientMessage(playerid,grau,"Dieser Spieler ist kein Member ihrer Fraktion!");
    if(rang < 0 || rang > Fraktionen[Spieler[playerid][Leader]][MaxRangs]) return SendClientMessage(playerid,grau,"Ungültiger Rang!");
    new str1[75],str2[75],name1[MAX_PLAYER_NAME],name2[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name1,sizeof(name1));
    GetPlayerName(pID,name2,sizeof(name2));
    format(str1,sizeof(str1),"Du hast %s Rang %d gegeben!", name2, rang);
    format(str2,sizeof(str2),"%s hat dir Rang %d gegeben!", name1, rang);
    SendClientMessage(playerid,green,str1);
    SendClientMessage(pID,gelb,str2);
    Spieler[pID][Rang] = rang;
    return 1;
    }


    Es werden immer die entsprechenden nachrichten gesendet, jedoch bei der einen Zeile kommt anstelle von "Ungültige Id" "SERVER: Unknown Command".


    Ich verstehe den fehler nicht so ganz.


    Ich hoffe ihr könnt mir dabei weiterhelfen


    LG
    Simon :thumbup:

    Guten Tag


    Ich bin echt überfragt..
    Ich habe ganz normal Fahrzeuge aufm server.. ziemlich viele..
    Und ich frage ab ob jemand berechtigt ist einzusteigen.. wenn ja dann lässt er ihn einsteigen, wenn nein, wird die aktion gestoppt..


    Aber iwie buggt es zwischendurch.. teilweise wird die aktion gestoppt obwohl er berechtigt ist einzusteigen..


    Es ist eigentlich eine ganz simple sache die jeder kann.. aber es buggt :S
    Ich habe schon Testmessage senden lassen. wenn er nicht berechtigt ist einzusteigen, wird die testmessage ganz normal gesendet und das script funktioniert.
    Wenn er berechtigt ist, wird die aktion gestoppt, aber die testmessage wird nicht gesendet. Aber ich frage mich wodurch die aktion gestoppt wird..


    Ich hoffe ihr könnt mir da helfen.


    Hier mal mein Code:


    public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
    {
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    if(!ispassenger)
    {
    for(new i = 0; i < sizeof noobbike; i++)
    {
    if(vehicleid == noobbike[i])
    {
    if(GetPlayerScore(playerid) == 1) continue;
    SendClientMessage(playerid,grau,"Test 1");
    return TogglePlayerControllable(playerid,1);
    }
    }
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i) && login[i] == 1)
    {
    if(vehicleid == Testcar[i])
    {
    if(i == playerid) continue
    SendClientMessage(playerid,grau,"Test 2");
    return TogglePlayerControllable(playerid,1);
    }
    }
    }
    for(new i = 0; i < sizeof Rentcars;i++)
    {
    if(vehicleid == Mietauto[i])
    {
    if(strcmp(Rentcars[i][Mietername],"Keiner",true))
    {
    if(!strcmp(Rentcars[i][Mietername],name,true)) continue;
    SendClientMessage(playerid,grau,"Test 3");
    return TogglePlayerControllable(playerid,1);
    }
    }
    }
    for(new i = 0; i < sizeof Frakcars; i++)
    {
    if(vehicleid == Frakauto[i])
    {
    if(GetPlayerFrak(playerid) == Frakcars[i][Frakid]) continue;
    SendClientMessage(playerid,grau,"Test 4");
    return TogglePlayerControllable(playerid,1);
    }
    }
    }
    entercar[playerid] = vehicleid;
    return 1;
    }


    LG
    Simon


    //edit: Also ich habe nun herausbekommen das es aufjedenfall an der Fahrzeug verschiebung liegt.


    Ein beispiel:


    Man spawnt ein auto per Admcmd. Man zerstört dieses wieder und ein User kauft sich ein auto. dieses auto wird nun ales Admincar erkannt. Andersherum wäre es genau das selbe.
    Nach einer bestimmten Zeit werden Admin autos automatisch zerstört. wenns nun ein spielerauto als admincar erkannt wird durch id verschiebung, wird das Spielerauto zerstört.


    Das selbe problem tritt auch bei den Fraktionsautos auf, wenn man frakcars kauft und verkauft. Jedoch besitzen alle cars eine eindeutige variable :S


    Ich hoffe mir kann einer bei dem Problem helfen.


    LG
    Simon

    Ähm vergiss das mit der For schleife.. totaler schwachsinn..


    Wenn du eine Variable haben willst, die immer für jeden gleich ist, dann mach eine globale variable.
    Dazu unter den includes einfach:


    new variable; und immer dann wenn sie geändert werden soll machst du:


    variable = NeuerWert;

    und imm wenn du die variable abfragen willst, machst du:


    if(variable == GewünschterWert)


    Sollten man eigentlich wissen..


    LG
    Simon :thumbup:

    new variable[MAX_PLAYERS];


    befehl 1: (in dm reingehn)


    variable[playerid] = 1;


    befehl 2: (aus dm raus)


    variable[playerid] = 0;


    OnPlayerSpawn:


    if(variable[playerid] == 1)
    {
    //wieder waffen und posi setzten
    }

    OnPlayerCommandText(playerid,cmdtext[])
    {
    if(variable[playerid] == 1)
    {
    if (strcmp("/exit", cmdtext, true, 8) == 0)
    {
    //dein zeugs
    }
    else SendCLientMessage(playerid,farbe,"Du kannst hier nur /exit benutzen oder whatever");
    }
    else
    {
    //andere befehle
    }
    return 1;
    }


    das wars.. so einfach..


    LG
    Simon :thumbup:

    zu Frage 1:


    ja das geht! Du musst eine include datei erstellen (zum beispiel cars.inc). Dazu öffnest du deinen Editor und schreibs folgenes rein:


    stock CreateAllCars()
    {
    //Hier alle deine Fahrzeuge
    return 1;
    }


    Anschließend speichern als "cars.inc".


    Nun kopierst du diese datei zu deinen Includes und schreibs im Gamemode oben
    #include <cars>


    Nun schreibe in dein Gamemode nur noch: CreateAllCars(); und alle Fahrzeuge werden erstellt =)


    zu Frage 2 und 3: du musst eine neue variable erstellen (zum beispiel IsInDM[MAX_PLAYERS] und sobald er den gewünschten befehl eingibt, musst du einfach seine posi setztn und ihm gewünschte waffen geben. Außerdem musst du die variable den Wert 1 zuweisen. Nun musst du bei OnPlayerCommandText abfragen ob die variable den wert 1 hat, wenn ja und der Befehl nicht /dmexit ist, kommt halt die gewünschte Nachricht. Damit er die Waffen nach dem Verlassen oder nach dem Tod wiederbekommt musst du sie Serverside speichern.
    Das ist etwas komplizierter und wäre nun ziemlich schwer dir das schnell zu erklären.


    LG
    Simon :thumbup:

    Ich rate dir das Include "dini.inc" zu benutzen.


    Das ist ein Include womit du ganz leicht sowas anstellen kannst.


    Damit es gespeichert wird, muss du eine Datei anlegen und in dieser Datei muss das gespeichert werden. Dazu muss du in einer enum alles auflisten was gespeichert werden soll, beim registrieren muss du die datei erstellen, beim einloggen auslesen und beim ausloggen speichern.


    Da du bereits ein login/registersystem hast, denke ich mal das du bereits dini benutzt. du musst also nur noch score und kills hinzufügen..


    LG
    Simon :thumbup:

    Welche Rangliste meinste? die du mit Tab öffnest wo dann id name score und ping steht? wenn ja dann kannst du sie nicht ausschalten, wüsste zumindest nicht das das geht


    LG