[SAMMELTHREAD] Kleine Scripting Fragen

Dein Problem konnte durch einen User gelöst werden? Bedank dich bei ihm indem du seinen Beitrag als Hilfreich markierst sowie einen Daumen oben dalässt
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
  • Ich schätze er hat etwas ähnliches wie den "GWD" aus seinem Godfather Edit rausgenommen.


    GWD= Grundwehrdienst oder auch GWD-Note (Godfather-Klassiker)


    Aber die Fehlerzeile brauchen wa trotzdem :)

    Heyy. Die Errors kommen immer durch folgende Zeile im Script:



    Log("Login, Spieler",string);


  • Wieso wird bei dieser Funktion das zuletzt erstellte Fahrzeug, nicht zurück an seinen Herkunftsort gebracht?



    ocmd:rac(playerid)
    {
    if(pInfo[playerid][pAdmin] < 3)return 1;
    if(AdminDuty(playerid) == 0)return SCM(playerid, COLOR_LIGHTRED, "Du bist nicht im Dienst!");
    for(new i;i<GetVehiclePoolSize();i++)
    {
    if(IsVehicleEmpty(i) == 0)continue;
    SetVehicleToRespawn(i);
    }
    new string[75];
    format(string, sizeof string, "Teammitglied %s respawnt alle unbesetzten Fahrzeuge.", getName(playerid)),
    SCMTA(COLOR_LIGHTBLUE, string),
    playerProtocol(playerid, "hat alle unbesetzten Fahrzeuge respawnt");
    return 1;
    }

  • for(new i;i<GetVehiclePoolSize();i++)

    Schreibe es:


    for(new i=GetVehiclePoolSize(); i!=0; i--)


    Autos starten bei 1 und enden bei der letzten ID.


    Ergo wäre nur folgendes richtig:


    for(new i=1;i<=GetVehiclePoolSize();i++)


    Allerdings ist das nicht so performant, wie mein erstes Beispiel (da jeden Durchgang die Funktion aufgerufen werden würde)! :)

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Beitrag von Dr. Frauenarzt ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: Behoben ().
  • Wie bekomme ich die playerid bei OnVehicleDeath?


    edit: Meine natürlich OnVehicleDeath


    Bei meiner Funktion bin ich mir nicht sicher, ob der Spieler noch in dem Fahrzeug ist


    stock GetPlayerFromDeadCar(vehicleid)
    {
    for(new i = GetPlayerPoolSize(); i != -1; --i)
    {
    if(IsPlayerConnected(i))
    {
    if(IsPlayerInVehicle(i,vehicleid) && GetPlayerState(i) == PLAYER_STATE_DRIVER)
    {
    return i;
    }
    }
    }
    return 999;
    }

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • @JacLos
    Du kannst es z.B so machen.


    //EDIT



    stock GetDriverID(id)
    {
    for(new i;i<GetMaxPlayers();i++)
    {
    if(!IsPlayerConnected(i) || GetPlayerState(i) != PLAYER_STATE_DRIVER)continue;
    if(GetPlayerVehicleID(i) == id)return i;
    }
    return INVALID_PLAYER_ID;
    }


    public OnVehicleDeath(vehicleid, killerid)
    {
    new playerid = GetDriverID(vehicleid);
    if(playerid != INVALID_PLAYER_ID)
    {
    //In dem Fahrzeug sitzt jemand drinne, playerid ist der Fahrer
    }
    else
    {
    //Das Fahrzeug hat keinen Fahrer
    }
    return 1;
    }

  • Hey, habe dir dafür eben eine Funktion zusammen getippt. Vom Grundsatz her gehst du mit einer Schleife durch alle Spieler die verbunden sind und in einem Fahrzeug sitzen.
    Wenn dessen Fahrzeug-ID die gesuchte ist und er der Fahrer ist, wird die ID zurück gegeben.


    Um ganz sicher zu sein könntest du noch abfragen ob der Spieler i sich mittels IsPlayerInRangeOfPoint noch in einem Radius x befindet.


    Oder habe ich etwas missverstanden? :D

    stock GetVehicleDriver(vehicleid) {
    for(new i; i <= GetPlayerPoolSize(); i++) {
    if(IsPlayerConnected(i) && IsPlayerInAnyVehicle(i)) {
    if(GetPlayerVehicle(i) == vehicleid && GetPlayerState(i) == PLAYER_STATE_DRIVER)
    return i;
    }
    }
    return INVALID_PLAYER_ID;
    }


    public OnVehicleDeath(vehicleid, killerid) {
    new playerid = GetVehicleDriver(vehicleid);
    if(playerid != INVALID_PLAYER_ID) {
    // hier dann die Aktion
    }
    return 1;
    }

    LG

  • Also erstmal danke für eure Hilfe ihr beiden :)


    Allerdings unterscheiden sich eure Funktionen nur minimal von meiner,


    und diese funktionieren leider auch nicht (habs natürlich ausprobiert)


    Ich hab in der Zwischenzeit auch mal Experimentiert mit OnPlayerDeath & IsPlayerInAnyVehicle


    habe allerdings den Verdacht, dass der Spieler beim Tod des Fahrzeuges nicht mehr im Fahrzeug ist,


    oder, dass das Fahrzeug zu schnell verschwindet.

  • Tatsache, habe es gerade ausprobiert.


    Habe gerade ein bisschen rumprobiert.
    killerid kannst du auch nutzen.


    Aber, probier mal das aus.



    new LastDriver[MAX_VEHICLES];


    public OnPlayerStateChange(playerid, newstate, oldstate)
    {
    if(newstate&PLAYER_STATE_DRIVER)
    {
    if(IsValidVehicle(GetPlayerVehicleID(playerid)) //Weil beim Tod auch die State auf Driver gewechselt wird.
    {
    LastDriver[GetPlayerVehicleID(playerid)] = playerid;
    }
    }
    }


    public OnPlayerExitVehicle(playerid, vehicleid)
    {
    LastDriver[vehicleid] = INVALID_VEHICLE_ID;
    return 1;
    }


    public OnVehicleDeath(vehicleid, killerid)
    {
    if(IsPlayerConnected(LastDriver[vehicleid]))
    {
    if(killerid != LastDriver[vehicleid])
    {
    SendClientMessage(LastDriver[vehicleid], -1, "Dein Fahrzeug wurde zerstört.");
    }
    else
    {
    SendClientMessage(killerid, -1, "Du hast ein fremdes Fahrzeug zerstört.");
    }
    }
    return 1;
    }


    //bei Ongamemodeinit
    for(new i = MAX_VEHICLES, k; k < i; k++)
    {
    LastDriver[k] = INVALID_PLAYER_ID;
    }

  • Mal eine kurze frage,


    Egal was ich angebe Vehicleid nur wird immer 0 angezeigt beim Kennzeichen.


    Verstehe ich nicht :/ möchte unter /dl nur die normale id angezeigt bekommen...


    Code
    for(new i=0;i<sizeof(pTaxifahrer);i++)
    	{
    		format(string, sizeof(string), "{2C140F}LyD {050E2B}- %d", Vehicle[pTaxifahrer[i]][vehID]);
    		SetVehicleNumberPlate(pTaxifahrer[i], string);
    		pTaxiSchild[pTaxifahrer[i]][0] = CreateObject(19308, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
    		AttachObjectToVehicle(pTaxiSchild[pTaxifahrer[i]][0], pTaxifahrer[i], 0.000000, -0.934999, 0.914999, 0.000000, 0.000000, 0.000000);
    		aiVehicles[pTaxifahrer[i]] = VEH_TAXICAR;
    	}
  • format(string, sizeof(string), "{2C140F}LyD {050E2B}- %d", Vehicle[pTaxifahrer[i]][vehID]);

    Ich rate einfach mal ins Blaue @Kasakow hat da schon ganz recht mit seiner Aussage.


    Schreib es mal so:


    format(string, sizeof(string), "{2C140F}LyD {050E2B}- %d", pTaxifahrer[i]);

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Beitrag von Dr. Frauenarzt ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: - ().