Beiträge von Mann im Mond

    Schau doch einfach im GF, welcher Callback aufgerufen wird. Ich habs für dich gemacht:
    Im Callback, welcher aufgerufen wird, ist eine Schleife welche alle Autos überprüft nach

    Code
    if (gLastDriver[code=c] == 301)
    {
    	CarRespawn(c);
    }
    if (gLastDriver[code=c] >= 300)
    {
    	gLastDriver[code=c]++;
    }


    Wenn man weitersucht nach dem Array "gLastDriver" merkt man, dass der Array des Auto, welches man gerade verlassen hat, auf 300 gesetzt wird. Allerdings werden die Autos erst bei 301 respawnt, d.h. wenn man aussteigt respawned das Auto erst beim 2. Durchlauf des Timers


    => Beispiel: Der Timer steht auf 1 Minute:
    Du steigst in ein Auto und es wird nichts passieren. Sobald du das Auto verlässt wird gLastDriver[Auto] auf 300 gesetzt. Wenn der Timer dann das erste Mal den Callback aufruft, wird die 300 zu einer 301. Beim 2. Durchlauf respawnt das Auto dann. Also wird dein Auto spätestens 2 Minuten (je nachdem wann der Timer genau aufgerufen wird) nach Aussteigen respawnt bei Zeit des Timers von 1 Minute. Bei 2 Minuten sind es entsprechend 4 Minuten Respawnzeit usw.


    => Zu deiner Frage:
    Wenn du willst das deine Autos gar nicht mehr respawnen, entferne einfach den ensprechenden Abschnitt... Arbeite einfach mit der normalen Respawnzeit der Autos. Setze diese auf "-1" wenn du willst, dass sie nicht mehr respawnen (außer beim Explodieren)

    Du wirst die VehicleID bei Wiki o.ä. nicht finden. Da findest du nur die ModelID. Die "603" schaut mir auch ganz nach ner ModelID aus, da ich nicht glaube, dass du 603 Fahrzeuge in deinem Script hast. Um die VehicleID in deinem Script rauszufinden kannst du entweder einen Befehl machen mit
    new
    string[128];
    format(string,sizeof(string),"Deine VehicleID ist %d", GetPlayerVehicleID(playerid));
    SendClientMessage(playerid,DEINE_FARBE,string);
    drin oder du zählst die AddStaticVehicle bzw. CreateVehicle bzw. AddStatidVehicleEx in OnGameModeInit durch. Das Erste (AddStaticVehicle ...) hat die VehicleID 0, das 2. die 1 usw.
    Bsp.: Dein OnGameModeInit sieht so aus:
    AddStaticVehicleEx(...); //Das Auto hat die VehicleID 0
    AddStaticVehicleEx(...); //Das Auto hat die VehicleID 1
    AddStaticVehicleEx(...); //Das Auto hat die VehicleID 2


    EDIT: Fehler verbessert

    Dazu müsstest du es ein wenig komplizierter anstellen. Zuerst brauchst du einen Befehl, der alle Waffenslots (13) überprüft und anzeigt, welche Waffen der Spieler trägt:
    for(new slot = 0; slot < 15; slot++)
    {
    GetPlayerWeaponData(playerid, slot, weapon, ammo);
    if(weapon > 0 && weapon < 47 && ammo > 0) // Hat er überhaupt eine Waffe in dem Slot?
    {
    GetWeaponName(weapon,weaponname,sizeof(weaponname));
    format(string,sizeof(string),"Slot: %d , Waffe: %s, Munition: %d",slot,weaponname,ammo);
    SendClientMessage(playerid,COLOR_GRAD1,string);
    }
    }
    So sollte funktionieren, habs nicht gestetet. Auf jeden Fall zeigt das dann dem Spieler seine Waffen und den Slot an. Und dann kannst du deinen /givegun Befehl schon machen, aber halt Slotabhängig, d.h.
    /givegun [Spieler] [Waffenslot]
    Der 2. Befehle zum Waffengeben sieht dann ungefähr so aus
    new
    weapon,
    ammo,
    slot;
    if(sscanf(params,"dd",giveplayerid,slot)
    {
    // Fehler: Keine Eingabe
    return 1;
    }
    if(IsPlayerConnected(giveplayerid))
    {
    GetPlayerWeaponData(playerid, slot, weapon, ammo);
    if(weapon > 0 && weapon < 47 && ammo > 0)
    {
    GivePlayerWeapon(giveplayerid, weapon, ammo); // Dem Anderen Spieler die Waffe geben
    GivePlayerWeapon(playerid, weapon, -ammo); // Dem Spieler die Waffe wegnehmen
    // Der Rest deines Codes - Nachrihten usw.
    }
    else
    {
    // Fehler: keine Waffe in dem Slot
    }
    }
    Das sollte eigentlich reichen als Starthilfe...

    Du speicherst deine Autoids, die der Spieler erstellt hat in einem Array ab.
    Ich würde zuerst ein paar Änderungen vornehmen:
    In deinem /veh Befehl zum Auto spawnen würde ich das
    Spawned[playerid]++;
    unter das
    PutPlayerInVehicle(playerid, CarID[playerid][Spawned[playerid]], 0);
    setzen, damit die Autos beginnend ab "0" in dem Array gespeichert werden. Wenn du es schon vorher hochzählt fängst erst bei 1 an. Kannst du lassen wie du willst, aber die 0 verschwendest du sonst als Speicherplatz. Es heisst ja wahrscheinlich auch, da du nur 3 Autos spawnen kannst
    new
    CarID[MAX_PLAYERS][3];
    Dadurch, dass du deinen Autos in einem Array speicherst, brachst du keinen Schleife, sondern du musst einfach nur nacheinander die Arrays nachprüfen:
    if(CarID[playerid][0] != 0)
    {
    DestroyVehicle(CarID[playerid][0]);
    CarID[playerid][0] = 0;
    }
    if(CarID[playerid][1] != 0)
    {
    DestroyVehicle(CarID[playerid][1]);
    CarID[playerid][1] = 0;
    }
    if(CarID[playerid][2] != 0)
    {
    DestroyVehicle(CarID[playerid][2]);
    CarID[playerid][2] = 0;
    }
    Spawned[playerid] = 0;
    So da hast deine 3 Autos die gelöscht werden und die Arrays werden geleert und der Zähler zurückgesetzt... Wenn du meinen Vorschglag oben nicht umsetzt, musst du entsprechend die Nummern in dem Array ändern unten, da die "0" ja nicht exitiert dann - dann musst bei "1" beginnen

    Das bezweifel ich doch gar nicht. Ich habe doch oben gesagt, welche Zahlen du bei einem Array benutzen kannst. Die fangen bei 0 an und hören 1 unter der definierten Größe auf. Also bei einem Array von 100 ist die letzte mögliche Zahl 99 und die erste mögliche deine 0.
    Du hast oben allerdings gesagt man kann bei einer Arraygröße von 4
    0,1,2,3,4 (also 5) Zahlen benutzen...

    Zitat

    0 hat auch noch nen Slot Superdok ^^

    Hä?


    Wenn du einen Array mit der Größe 4 erstellst, dann kannst du dort auch nur 4 Sachen speichern, also
    0,1,2,3
    und nicht
    0,1,2,3,4 (= 5 Sachen)


    Ich habe es jetzt sogar extra getestet und hab
    // oben
    new Items[4];


    // irgendwo weiter unten
    Items[4] = 4;
    und bei mir kam wie erwartet ein Error

    Zitat

    error 032: array index out of bounds (variable "Items")

    Wenn man das übersetzt heisst das, dass die "4" außerhalb der Grenzen des Arrays liegt.

    Steht der Code so in deinem Gamemode oder hast du nur ein paar Stellen vom Gamemode zitiert? Wenn es genauso in deinem Gamemode steht, kommt ein Fehler, weil du ein if Statement außerhalb eines Callbacks verwendest. So wie ich das anschaue, solltest du den oberen Teil mit den "ifs" (CopCar und Ambulance) in den Callback "OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)" einfügen.

    Zitat

    Es hängt davon ab, welchen Inhalt sich in den jeweilgen Timer Public's befindet, die der jenige Timer aufruft.

    Besonders Schleifen, also
    for(new i = 0; i < GetMaxPlayers(); i++)
    oder
    while(...)
    in einem dauerhaft ausgeführten Time begünstigen Lags.

    Im Prinzip ist es ganz simpel: Du kontrollierst mit Hilfe eines Timers dauerhaft, in welcher Area (= Gangzone) sich der Spieler befindet und speicherst die "Areaid" des Spielers in einer globalen Variable. Wenn sich die ID beim nächster Durchlauf ändert, dass der Spieler (je nach ID) eine Zone verlassen oder eine Zone betreten hat.
    Ich habe dir mal etwas kleines vorbereitet, was du einfügen kannst oder als .inc benutzen kannst (dann musst du aber noch #include <a_samp> hinzufügen oben). Du erstellt dann Gangzones mit
    AddGangZone(Float:minx, Float:miny, Float:maxx, Float:maxy);
    und kannst wie gewohnt auch gangzone = AddGangZone(...); verwenden. Wenn ein Spieler eine Gangzone betreteten hat, wird (wie oben vorgeschlagen)
    OnPlayerEnterArea(playerid, area) aufgerufen, in welchem du dann deine "gangzone" Variable überprüfen kannst und einen Text senden kannst. Wenn ein Spieler eine Zone verlässt, wird
    OnPlayerLeaveArea(playerid, area);
    aufgerufen.


    Hier ist der Code, ob er funktioniert kann ich nicht versichern, aber er sollte eigentlich soweit funktionieren
    http://pastebin.com/m9aa969d

    new
    carid = GetPlayerVehicleID(playerid);
    for(new i = 0; i < GetMaxPlayers(); i++)
    {
    if(IsPlayerConnected(i))
    {
    if(IsATaxiDriver(i)) // Oder wie du das auch immer definierst
    {
    if(IsPlayerInVehicle(i, carid))
    {
    // Wir haben unseren Taxifahrer gefunden
    }
    }
    }
    }

    Zitat

    Aus Wiki: Wichtiger Hinweis: Diese Funktion funktioniert NUR wenn jemand im Fahrzeug war seit es gespawned ist.


    Vorschlag wäre, dass man beim connecten in jedes im Script vorhande Fahrzeuge kurz telepotiert wird und dann raus geschmißen.

    Na ja der Satz ist recht schwammig formuliert. Heisst das, dass du in dem Fahrzeug gewesen sein musst oder das einmalig irgendjemand im Fahrzeug gewesen sein muss?
    Ich werde mal deine Möglichkeit bei Gelegenheit testen und überprüfen ob es funktioniert.

    Nutzt du nur SetVehiclePos und es geht bei dir für jeden?
    Ich habe es selbst getestet mit mehreren anderen und es hat immer nur für einen Funktioniert...
    Sobald dieser Spieler, bei dem es richtig geht in das Auto einsteigt, sehen es plötzlich alle an der richtigen Position, vorher aber nicht

    Zeig mal wie du die beiden publics nutzt, dann kann ich dir weiterhelfen. Aber ich verstehe nicht ganz, warum du jeweils einen eigenen public machst für im Prinzip eine Funktion.
    Mit meinem Code kannst du überprüfen, ob der Spieler in VW 3 (bsn) oder VW 8 (bss) ist...

    Les dir bitte meinen Beitrag nochmal richtig durch:
    1.) Ich hab gesagt, dass die Funktion nur für denjenigen funktioniert, der als letzes (!) im Auto gesessen ist, egal ob er wieder ausgestigen ist oder nicht, hauptsache er saß als letztes (!) drin.
    2.) Dein Code bewirkt, dass Auto 1 und Auto 2 verschoben werden, aber auch nur für den Spielerm der als letzes im Auto saß, unabhängig von der Autoid. Was soll also der Code darstellen?
    2.) Welche Möglichkeit gibt es diesen Fehler zu umgehen?

    Wie benutzt die die beiden publics? Also an welcher Stelle genau...
    Warum überhaupt publics? Publics brauchst du nur wenn es von einem Timer aufgerufen wird...


    Aber ich denke obwohl ich die Funktionsweise nur erahnen kann, dass du die Virtual World einfach überprüfen solltest mit
    if(GetPlayerVirtualWorld(playerid) == [...])