Kein Car-Respawn

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hey Leute,
    ich habe folgendes Problem:
    Ich habe mir gestern einen Car-Spawner gebastelt, der mir ein Auto neben mich spawnt.
    Das Problem ist, dass das Auto immer wieder respawnt, wenn es zerstört wurde.
    Die betroffene Ziele sieht so aus:
    AddStaticVehicleEx (411,player_pos[0],player_pos[1],player_pos[2],player_pos[3],-1,-1,-1);


    wie ihr seht habe ich die Respawnzeit auf -1 gesetzt, und das Auto respawnt genau wie bei 0.
    Woran könnte das liegen?


    K3nNy

  • wenn das car zerstört wird respawnt es ja automatisch. soweit ich weiß.


    du musst da wo abgefragt wird was passiert wenn das car zerstört wird das car einfach freezen lassen or so.
    aber ka wie.
    hoffe konnte dir so nen bisschien weiterhelfen^^

  • Ganz leicht das Auto hier:


    AddStaticVehicleEx (411,player_pos[0],player_pos[1],player_pos[2],player_pos[3],-1,-1,-1);



    einer var zuordnen zb so


    new cvar;



    cvar = AddStaticVehicleEx (411,player_pos[0],player_pos[1],player_pos[2],player_pos[3],-1,-1,-1);
    cvar++;


    Dann



    OnVehicleDeath oder so....


    if(cvar >= 1)
    {
    DestroyVehicle(cvar);
    }

  • Danke für den guten Tipp :thumbup: .
    Leider funktionert der nicht, weil cvar nach einem Spawn immer über 1 ist, d.h. auch die anderen Fahrzeuge, die nach einem Spawn zerstört werden, verschwinden.

    Einmal editiert, zuletzt von K3nNy ()

  • Ja, es ist aber ganz einfach, ganz oben im Script erstellst du eine globale Definition zB.:


    new gCountDeleteCreatedVehicles = 0;
    new gDeleteCreatedVehicles[50]; //Die Zahl ändern, wenn mehr als 50 Autos damit definiert wurden bzw weniger als 50 Autos ^^


    danach fügst du folgendes dort ein wo die Autos dafür erstellt werden, zB bei deinem Beispiel sieht es dann so aus:


    gDeleteCreatedVehicles[gCountDeleteCreatedVehicles] = AddStaticVehicleEx (411,player_pos[0],player_pos[1],player_pos[2],player_pos[3],-1,-1,-1);
    gCountDeleteCreatedVehicles++;


    und dann einfach eine billige Abfrage unter OnVehicleDeath


    public OnVehicleDeath(vehicleid, killerid)
    {
    new vehid;
    for(; vehid < gCountDeleteCreatedVehicles; vehid++)
    {
    if(vehicleid == gDeleteCreatedVehicles[vehid])
    {
    DestroyVehicle(gDeleteCreatedVehicles[vehid]);
    break;
    }
    }
    return 1;
    }


    Hoffe ich hab dir damit geholfen ^^

    Mfg Templer


    >>Dein Breadfish-Thema im Unterforum ScriptingBase / Scriptingwünsche wurde nicht richtig beantworter?<<
    >>Es handelt sich um ein Programmier Problem und du nicht einfach weiter kommst wo der Fehler sein könnte?<<
    Dann melde dich bei mir über die PN-Funktion indem du den Link zu deinem Breadfish-Themen Problem schickst.
    Voraussetzung:
    Thema älter als 1 Tag und im Breadfish Forum gespostet!

  • Sagen wir es so: es funktionert perfekt. :thumbup:
    Mein Problem ist aber, dass ich das ganze noch nicht nachvollziehen kann, da ich erst seit ca. 3Tagen scripte.
    Wenn du Lust und Zeit hast, würde ich mich freuen, wenn du den ganzen Ablauf für mich anfängerfreundlich darstellst ;)


    K3nNy

  • Hoffe du verstehst das xD


    //Ganz oben Script dies einfügen..
    new gCountDeleteCreatedVehicles = 0; //Erstelle Definition mit Wert 0, welche zum zählen der erstellten Autos dient!
    new gDeleteCreatedVehicles[50]; //Die Zahl ändern, wenn mehr als 50 Autos damit definiert wurden bzw weniger als 50 Autos ^^


    //Folgende Code muss dann dort eingeügt werden, wo du es verwendest!...
    gDeleteCreatedVehicles[gCountDeleteCreatedVehicles] = AddStaticVehicleEx (411,player_pos[0],player_pos[1],player_pos[2],player_pos[3],-1,-1,-1); //Fahrzeug ID wird in Definition 'gDeleteCreatedVehicles' abgelagert und die derzeit Freie Zahl von 'gCountDeleteCreatedVehicles' verwendet!
    gCountDeleteCreatedVehicles++; //Erhöhe die erstellten Fahrzeuge um 1 (dafür steht das ++)


    //Im Angegebenen Callback folgendes schreiben...
    public OnVehicleDeath(vehicleid, killerid)
    {
    new vehid;
    for(; vehid < gCountDeleteCreatedVehicles; vehid++) //Geht alle derzeit erstellten Fahrzeuge durch
    {
    if(vehicleid == gDeleteCreatedVehicles[vehid]) //Wenn das zerstörte Fahrzeug die gleiche ID hat wie vom Fahrzeug das erstellt wurden ist
    {
    DestroyVehicle(gDeleteCreatedVehicles[vehid]); //Zerstöre Fahrzeug
    break; //Brich Schleife ab und führe restlichen Codes vom OnVehicleDeath durch
    }
    }
    return 1;
    }

    Mfg Templer


    >>Dein Breadfish-Thema im Unterforum ScriptingBase / Scriptingwünsche wurde nicht richtig beantworter?<<
    >>Es handelt sich um ein Programmier Problem und du nicht einfach weiter kommst wo der Fehler sein könnte?<<
    Dann melde dich bei mir über die PN-Funktion indem du den Link zu deinem Breadfish-Themen Problem schickst.
    Voraussetzung:
    Thema älter als 1 Tag und im Breadfish Forum gespostet!

  • Ich habe jetzt folgendes Problem:
    Wenn ich das Auto jetzt spawnen lassen will, bekomme ich folgende Errormeldungen:
    C:\Program Files\Rockstar Games\Grand Theft Auto San Andreas\Server\filterscripts\AdminScript.pwn(71) : error 006: must be assigned to an array
    C:\Program Files\Rockstar Games\Grand Theft Auto San Andreas\Server\filterscripts\AdminScript.pwn(76) : error 001: expected token: "-string end-", but found "-identifier-"


    hier ist der Code dazu:
    dcmd_spawn(playerid, params[])
    {
    if (strlen(params))
    {
    new String:name, cid;
    new Float:player_pos[4];
    GetPlayerPos (playerid, player_pos[0], player_pos[1], player_pos[2]);
    GetPlayerFacingAngle (playerid, player_pos[3]);
    player_pos[0]=player_pos[0]+5;
    player_pos[2]=player_pos[2]+1;
    player_pos[3]=player_pos[3]+90;
    name = params;
    if (IsPlayerAdmin(playerid))
    {
    switch (name)
    {
    case "Infernus":
    cid=411;


    }
    gDeleteCreatedVehicles[gCountDeleteCreatedVehicles] = AddStaticVehicleEx (cid,player_pos[0],player_pos[1],player_pos[2],player_pos[3],-1,-1,-1);
    gCountDeleteCreatedVehicles++;
    return 1;
    }
    else
    return SendClientMessage (playerid, 0xFFFFFFFF, " **Du bist kein Admin!");
    }
    else SendClientMessage(playerid, 0xFFFFFFFF, " **/spawn <FahrzeugID>");
    return 1;
    }


    Was mache ich da falsch? Ich habe bei beiden Fehlern keine Ahnung.


    K3nNy

  • Also damit der Befehl nicht blöd rüberkommt, hier meine Variante, zuerst fügst du folgende zwei Sachen ganz oben in deiN Script ein:


    new CarName[] =
    {
    "Landstalker", "Bravura", "Buffalo", "Linerunner", "Perrenial", "Sentinel",
    "Dumper", "Firetruck", "Trashmaster", "Stretch", "Manana", "Infernus",
    "Voodoo", "Pony", "Mule", "Cheetah", "Ambulance", "Leviathan", "Moonbeam",
    "Esperanto", "Taxi", "Washington", "Bobcat", "Whoopee", "BF Injection",
    "Hunter", "Premier", "Enforcer", "Securicar", "Banshee", "Predator", "Bus",
    "Rhino", "Barracks", "Hotknife", "Trailer", "Previon", "Coach", "Cabbie",
    "Stallion", "Rumpo", "RC Bandit", "Romero", "Packer", "Monster", "Admiral",
    "Squalo", "Seasparrow", "Pizzaboy", "Tram", "Trailer", "Turismo", "Speeder",
    "Reefer", "Tropic", "Flatbed", "Yankee", "Caddy", "Solair", "Berkley's RC Van",
    "Skimmer", "PCJ-600", "Faggio", "Freeway", "RC Baron", "RC Raider", "Glendale",
    "Oceanic","Sanchez", "Sparrow", "Patriot", "Quad", "Coastguard", "Dinghy",
    "Hermes", "Sabre", "Rustler", "ZR-350", "Walton", "Regina", "Comet", "BMX",
    "Burrito", "Camper", "Marquis", "Baggage", "Dozer", "Maverick", "News Chopper",
    "Rancher", "FBI Rancher", "Virgo", "Greenwood", "Jetmax", "Hotring", "Sandking",
    "Blista Compact", "Police Maverick", "Boxvillde", "Benson", "Mesa", "RC Goblin",
    "Hotring Racer A", "Hotring Racer B", "Bloodring Banger", "Rancher", "Super GT",
    "Elegant", "Journey", "Bike", "Mountain Bike", "Beagle", "Cropduster", "Stunt",
    "Tanker", "Roadtrain", "Nebula", "Majestic", "Buccaneer", "Shamal", "Hydra",
    "FCR-900", "NRG-500", "HPV1000", "Cement Truck", "Tow Truck", "Fortune",
    "Cadrona", "FBI Truck", "Willard", "Forklift", "Tractor", "Combine", "Feltzer",
    "Remington", "Slamvan", "Blade", "Freight", "Streak", "Vortex", "Vincent",
    "Bullet", "Clover", "Sadler", "Firetruck", "Hustler", "Intruder", "Primo",
    "Cargobob", "Tampa", "Sunrise", "Merit", "Utility", "Nevada", "Yosemite",
    "Windsor", "Monster", "Monster", "Uranus", "Jester", "Sultan", "Stratum",
    "Elegy", "Raindance", "RC Tiger", "Flash", "Tahoma", "Savanna", "Bandito",
    "Freight Flat", "Streak Carriage", "Kart", "Mower", "Dune", "Sweeper",
    "Broadway", "Tornado", "AT-400", "DFT-30", "Huntley", "Stafford", "BF-400",
    "News Van", "Tug", "Trailer", "Emperor", "Wayfarer", "Euros", "Hotdog", "Club",
    "Freight Box", "Trailer", "Andromada", "Dodo", "RC Cam", "Launch", "Police Car",
    "Police Car", "Police Car", "Police Ranger", "Picador", "S.W.A.T", "Alpha",
    "Phoenix", "2. Gebrauchtwagen", "1. Gebrauchtwagen", "Luggage", "Luggage", "Stairs", "Boxville",
    "Tiller", "Utility Trailer"
    };


    stock IsNumeric(const string[])
    {
    new i;
    while(string[i] != '\0') //end of string
    {
    if (string[i] > '9' || string[i] < '0'){return 0;}
    i++;
    }
    return 1;
    }


    Danach ersetzt du deinen Befehl mit dem hier (Erklärung inklusive..):


    dcmd_spawn(playerid, params[])
    {
    if (!IsPlayerAdmin(playerid)) return SendClientMessage (playerid, 0xFFFFFFFF, " **Du bist kein Admin!"); //Abfrage ob Spieler RCON-Admin ist
    if (!strlen(params)) return SendClientMessage(playerid, 0xFFFFFFFF, " **/spawn <FahrzeugID>"); //Ob Spieler bei params einen Wert oder Text angegeben hat!
    new cid = -1, nameid = 0, Float:player_pos[4];
    GetPlayerPos (playerid, player_pos[0], player_pos[1], player_pos[2]);
    GetPlayerFacingAngle (playerid, player_pos[3]);
    floatadd(player_pos[0], 5.0);
    floatadd(player_pos[2], 1.0);
    floatadd(player_pos[3], 90.0);
    if(!IsNumeric(params)) //Ob das eingegebene einem Text entspricht
    {
    for(; nameid < sizeof(CarName); nameid++) //Geht alle FahrzeugNamen durch
    {
    if(strcmp(params, CarName[nameid], false) == 0) //Abfrage ob FahrzeugName mit eingegegebenem Namen übereinstimmt
    {
    cid = (nameid+400); //Füge Fahrzeug Model-ID in die Variable cid ein und beende die Schleife
    break;
    }
    }
    if(cid == -1) return SendClientMessage(playerid, 0xFFFFFFFF, "Ungültiger Fahrzeugname!"); //Wird wiedergeben, wenn das eingegebene Fahrzeug nicht gefunden wurde
    }
    else if (IsNumeric(params)) //Ob das eingegebene einer Zahl entspricht
    {
    if(cid < 400 || cid > 611) return SendClientMessage(playerid, 0xFFFFFFFF, "FahrzeugID nicht kleiner als 400 oder größer als 611!"); //Die Abfrage sollte logisch sein
    cid = strval(params); //Eingegebene Model-ID wird in die Variable cid gespeichert
    }
    gDeleteCreatedVehicles[gCountDeleteCreatedVehicles] = CreateVehicle(cid,player_pos[0],player_pos[1],player_pos[2],player_pos[3],-1,-1,-1); //Erstellt das Fahrzeug
    gCountDeleteCreatedVehicles++; //Addiert den Zähler um 1 mehr
    return 1;
    }


    Kannst natürlich den Vergleich zwischen deinem Befehl und meinem auch machen

    Mfg Templer


    >>Dein Breadfish-Thema im Unterforum ScriptingBase / Scriptingwünsche wurde nicht richtig beantworter?<<
    >>Es handelt sich um ein Programmier Problem und du nicht einfach weiter kommst wo der Fehler sein könnte?<<
    Dann melde dich bei mir über die PN-Funktion indem du den Link zu deinem Breadfish-Themen Problem schickst.
    Voraussetzung:
    Thema älter als 1 Tag und im Breadfish Forum gespostet!

  • Boah da muss ich mir das 5 Mal durchlesen, bis ich das verstanden habe :D
    Das einzige was für mich noch keinen Sinn ergibt: Was bedeutet dieser Codeschnipsel:
    stock IsNumeric(const string[])
    {
    new i;
    while(string[i] != '\0') //end of string
    {
    if (string[i] > '9' || string[i] < '0'){return 0;}
    i++;
    }
    return 1;
    }


    Den Rest hab ich soweit verstanden, und du warst mir sogar schon einen Schritt voraus (ID und Name möglich). :thumbup:


    *edit*
    OK habs auch verstanden ;)
    Das definiert die IsNumeric-Funktion.


    Vielen Dank


    *edit 2*
    Ich habe aber noch 2 Fehler gefunden ;)


    player_pos[0]=floatadd(player_pos[0], 5.0);
    player_pos[2]=floatadd(player_pos[2], 1.0);
    player_pos[3]=floatadd(player_pos[3], 90.0);//Ergebnis von floatadd muss in eine Variable gepeichert werden


    cid=strval(params);//cid muss den Wert von params erhalten
    if(cid < 400 || cid > 611) return SendClientMessage(playerid, 0xFFFFFFFF, "FahrzeugID nicht kleiner als 400 oder größer als 611!");

    2 Mal editiert, zuletzt von K3nNy ()

  • So, nächstes Problem: komischerweise spawnt das Script, wenn ich mit Fahrzeugnamen spawnen möchte, immer einen Infernus. Ich habe dann ein paar Variablen ausgeben lassen, damit ich die Werte der Variablen verfolgen kann.
    if(!IsNumeric(params))
    {
    for(; nameid < sizeof(CarName); nameid++)
    {
    new nameid2[100];
    new i, j;
    i=sizeof(CarName);
    j=strcmp(params, CarName[nameid], true);
    format(nameid2,sizeof(nameid2), "nameid=%i, i=%i, j=%i",nameid, i, j);
    print(nameid2);
    if(strcmp(params, CarName[nameid], true) == 0)
    {
    cid = (nameid+400);
    break;
    }
    }
    if(cid == -1) return SendClientMessage(playerid, 0xFFFFFFFF, "Ungültiger Fahrzeugname!");
    }


    Die Ausgabe ist folgende:
    nameid=0, i=1758, j=-1
    nameid=1, i=1758, j=1
    nameid=2, i=1758, j=-1
    nameid=3, i=1758, j=1
    nameid=4, i=1758, j=-1
    nameid=5, i=1758, j=-1
    nameid=6, i=1758, j=1
    nameid=7, i=1758, j=-1
    nameid=8, i=1758, j=-1
    nameid=9, i=1758, j=1
    nameid=10, i=1758, j=-1
    nameid=11, i=1758, j=0


    Meine ursprüngliche Eingabe war "Hunter" (nameid=25). Warum bricht die Schleife immer bei 11 ab?


    K3nNy

  • Ok Sry, habe die Definition CarNames falsch kopiert, hier das richtige:


    new CarName[][] =
    {
    "Landstalker", "Bravura", "Buffalo", "Linerunner", "Perrenial", "Sentinel",
    "Dumper", "Firetruck", "Trashmaster", "Stretch", "Manana", "Infernus",
    "Voodoo", "Pony", "Mule", "Cheetah", "Ambulance", "Leviathan", "Moonbeam",
    "Esperanto", "Taxi", "Washington", "Bobcat", "Whoopee", "BF Injection",
    "Hunter", "Premier", "Enforcer", "Securicar", "Banshee", "Predator", "Bus",
    "Rhino", "Barracks", "Hotknife", "Trailer", "Previon", "Coach", "Cabbie",
    "Stallion", "Rumpo", "RC Bandit", "Romero", "Packer", "Monster", "Admiral",
    "Squalo", "Seasparrow", "Pizzaboy", "Tram", "Trailer", "Turismo", "Speeder",
    "Reefer", "Tropic", "Flatbed", "Yankee", "Caddy", "Solair", "Berkley's RC Van",
    "Skimmer", "PCJ-600", "Faggio", "Freeway", "RC Baron", "RC Raider", "Glendale",
    "Oceanic","Sanchez", "Sparrow", "Patriot", "Quad", "Coastguard", "Dinghy",
    "Hermes", "Sabre", "Rustler", "ZR-350", "Walton", "Regina", "Comet", "BMX",
    "Burrito", "Camper", "Marquis", "Baggage", "Dozer", "Maverick", "News Chopper",
    "Rancher", "FBI Rancher", "Virgo", "Greenwood", "Jetmax", "Hotring", "Sandking",
    "Blista Compact", "Police Maverick", "Boxvillde", "Benson", "Mesa", "RC Goblin",
    "Hotring Racer A", "Hotring Racer B", "Bloodring Banger", "Rancher", "Super GT",
    "Elegant", "Journey", "Bike", "Mountain Bike", "Beagle", "Cropduster", "Stunt",
    "Tanker", "Roadtrain", "Nebula", "Majestic", "Buccaneer", "Shamal", "Hydra",
    "FCR-900", "NRG-500", "HPV1000", "Cement Truck", "Tow Truck", "Fortune",
    "Cadrona", "FBI Truck", "Willard", "Forklift", "Tractor", "Combine", "Feltzer",
    "Remington", "Slamvan", "Blade", "Freight", "Streak", "Vortex", "Vincent",
    "Bullet", "Clover", "Sadler", "Firetruck", "Hustler", "Intruder", "Primo",
    "Cargobob", "Tampa", "Sunrise", "Merit", "Utility", "Nevada", "Yosemite",
    "Windsor", "Monster", "Monster", "Uranus", "Jester", "Sultan", "Stratum",
    "Elegy", "Raindance", "RC Tiger", "Flash", "Tahoma", "Savanna", "Bandito",
    "Freight Flat", "Streak Carriage", "Kart", "Mower", "Dune", "Sweeper",
    "Broadway", "Tornado", "AT-400", "DFT-30", "Huntley", "Stafford", "BF-400",
    "News Van", "Tug", "Trailer", "Emperor", "Wayfarer", "Euros", "Hotdog", "Club",
    "Freight Box", "Trailer", "Andromada", "Dodo", "RC Cam", "Launch", "Police Car",
    "Police Car", "Police Car", "Police Ranger", "Picador", "S.W.A.T", "Alpha",
    "Phoenix", "2. Gebrauchtwagen", "1. Gebrauchtwagen", "Luggage", "Luggage", "Stairs", "Boxville",
    "Tiller", "Utility Trailer"
    };


    dcmd_spawn(playerid, params[])
    {
    if (!IsPlayerAdmin(playerid)) return SendClientMessage (playerid, 0xFFFFFFFF, " **Du bist kein Admin!"); //Abfrage ob Spieler RCON-Admin ist
    if (!strlen(params)) return SendClientMessage(playerid, 0xFFFFFFFF, " **/spawn <FahrzeugID>"); //Ob Spieler bei params einen Wert oder Text angegeben hat!
    new cid = -1, nameid = 0, Float:player_pos[4];
    GetPlayerPos (playerid, player_pos[0], player_pos[1], player_pos[2]);
    GetPlayerFacingAngle (playerid, player_pos[3]);
    floatadd(player_pos[0], 5.0);
    floatadd(player_pos[2], 1.0);
    floatadd(player_pos[3], 90.0);
    if(!IsNumeric(params))
    {
    for(; nameid < sizeof(CarName); nameid++)
    {
    new nameid2[100], i = sizeof(CarName), j = strcmp(params, CarName[nameid], true);
    format(nameid2,sizeof(nameid2), "nameid=%i, i=%i, j=%i",nameid, i, j);
    print(nameid2);
    if(strcmp(params, CarName[nameid], true) == 0)
    {
    cid = (nameid+400);
    break;
    }
    }
    if(cid == -1) return SendClientMessage(playerid, 0xFFFFFFFF, "Ungültiger Fahrzeugname!");
    }
    else if (IsNumeric(params)) //Ob das eingegebene einer Zahl entspricht
    {
    if(strval(params) < 400 || strval(params) > 611) return SendClientMessage(playerid, 0xFFFFFFFF, "FahrzeugID nicht kleiner als 400 oder größer als 611!"); //Die Abfrage sollte logisch sein
    cid = strval(params); //Eingegebene Model-ID wird in die Variable cid gespeichert
    }
    gDeleteCreatedVehicles[gCountDeleteCreatedVehicles] = CreateVehicle(cid,player_pos[0],player_pos[1],player_pos[2],player_pos[3],-1,-1,-1); //Erstellt das Fahrzeug
    gCountDeleteCreatedVehicles++; //Addiert den Zähler um 1 mehr
    return 1;
    }

    Mfg Templer


    >>Dein Breadfish-Thema im Unterforum ScriptingBase / Scriptingwünsche wurde nicht richtig beantworter?<<
    >>Es handelt sich um ein Programmier Problem und du nicht einfach weiter kommst wo der Fehler sein könnte?<<
    Dann melde dich bei mir über die PN-Funktion indem du den Link zu deinem Breadfish-Themen Problem schickst.
    Voraussetzung:
    Thema älter als 1 Tag und im Breadfish Forum gespostet!