Beiträge von Hagi

    Auch bei einem Objektstreamer können nur maximal 1000 Objekte gleichzeitig eingestreamt werden. Ich weiß nicht wie nah alle Objekte zusammen stehen. Aber wenn alle Objekte nah beieinander sind, kann es passieren, dass diese nicht alle gestreamt werden können.

    Da es sich bei der eingabe nicht um atomare Werte handelt müssen die erstmal gesplitet werden. Dafür kannst du Strmid zum ausschneiden und strfind zum auslesen der Character Position nach dem . (0 beim Tag) verwenden. Alternativ geht auch eine split Funktion mit dem Delimiter '.'.


    Wenn du dann drei Variablen hast, nämlich tag,monat & jahr, gehts weiter (strval) nicht vergessen.


    Mit dem aktuellen Datum:


    new d,m,y,alter;
    getday(y,m,d);


    if(m < monat)
    {
    alter = y-jahr-1;
    }
    else if(m == monat)
    {
    if(d < tag)
    {
    alter = y-jahr-1;
    }
    else
    {
    alter = y-jahr;
    }
    }
    else
    {
    alter = y-jahr;
    }


    Denke so sollte das funktionieren.

    Dann hast du einen schwerwiegenden Fehler in deinem Script, mit dem der Compiler nicht umgehen kann und deshalb abschmiert.


    1. Versuch die als letztes getätigten Änderung auf Fehler zu überprüfen.


    2. Kommentier Teil für Teil das Script aus, um den Fehler zu finden.

    DeAMX funktioniert aber nur bedingt. Meist ist der entstehende Quellcode nicht zu gebrauchen, sprich alles ist anders benannt. Wenn man sich da reinfuchst kann man das wieder rekonstruieren, aber das dauert. Aber nen Versuch ist es wert.

    hm mal überlegen eigentlich sollte sowas funktionieren:


    new radiotimer;
    radiotimer = SetTimer("autoradio",1000,1);
    forward autoradio();
    native IsValidVehicle(vehicleid);


    new radiostream[MAX_VEHICLES][64]; // hier steht der radiostream eines Fahrzeugs drin (muss beim einschalten den Radios gesetzt und beim ausschalten gelöscht werden


    public autoradio()
    {
    for(new i = 0;i<MAX_PLAYERS;i++)
    {
    if(!IsPlayerConnected(i)) continue;
    new vehid = getPlayerNearestVehicle(i);
    if(vehid == -1) continue;
    new Float:x,Float:y,Float:z;
    GetVehiclePos(vehid,x,y,z);
    new Float:distance = getDistanceToPoint(i,x,y,z);
    if(distance < 20.0)
    {
    // hier dann den audiostream einspielen, müsste man noch ausarbeiten wie man den speichert falls kein Spieler im Auto sitzt
    PlayAudioStreamForPlayer(i,radiostream[vehid],x,y,z,20.0,1);
    }
    else
    {
    //Wenn das nächste Auto weiter als 20 Einheiten entfernt ist, wird der Stream beendet, ob einer läuft oder nicht.
    StopAudioStreamForPlayer(i);
    continue;
    }
    }
    }


    getDistanceToPoint(playerid,Float:x,Float:y,Float:z)
    {
    new Float:px,Float:py,Float:pz;
    GetPlayerPos(playerid,px,py,pz);
    return floatsqroot(floatpower(x-px,2)+floatpower(y-py,2)+floatpower(z-pz,2));
    }


    getVehicleDistanceToPoint(vehicleid,Float:x,Float:y,Float:z)
    {
    new Float:px,Float:py,Float:pz;
    GetVehiclePos(vehicleid,px,py,pz);
    return floatsqroot(floatpower(x-px,2)+floatpower(y-py,2)+floatpower(z-pz,2));
    }


    getPlayerNearestVehicle(playerid)
    {
    new vehid = -1,Float:distance = 999999.9;
    new Float:x,Float:y,Float:z;
    GetPlayerPos(playerid,x,y,z);
    for(new i = 0;i<MAX_VEHICLES;i++)
    {
    if(!IsValidVehicle(i)) continue;
    if(getVehicleDistanceToPoint(i,x,y,z) < distance)
    {
    distance = getVehicleDistanceToPoint(i,x,y,z);
    vehid = i;
    }
    }
    }


    Hab ich jetzt alles im Editor geschrieben. Ka ob das so funktioniert. Aber nen versuch ist es wert :D


    Das beendet den Stream zwar nicht, durch die entsprechende Regulierung in PlayAudioStreamForPlayer könnte das aber dennoch funktionieren.

    Eigentlich bleibt dir da nur nen Timer, der alle Spieler durchgeht und die Entfernung zum nächsten Auto berechnet. Ist diese Entfernung unter einem Limit wird der Strea eingespielt, welcher für das Auto gespeichert ist.


    Also einen Timer (vllt nen 1 Sekunden delay) machen.


    Problem: Bei schnellen Fahrzeugen kann das eventuell nicht funktionieren, da der Stream ein paar Sekunden zum laden benötigt.

    Also so schwer ist es jetzt nicht die Sequenz zu ändern oder?


    dcmd_showlic(playerid,params[])
    {
    new pID, name[MAX_PLAYER_NAME], Oname[MAX_PLAYER_NAME], str1[64], str2[64];
    if(sscanf(params,"u",pID))return SendClientMessage(playerid,Gelb,"Benutze:/showlic [id]");
    GetPlayerName(playerid,name,sizeof(name));
    GetPlayerName(pID,Oname,sizeof(Oname));
    format(str1,sizeof(str1),"Du zeigst %s deine Lizenzen",Oname);
    format(str2,sizeof(str2),"%s zeigt dir seine Lizenzen",name);//3319
    SendClientMessage(playerid,Grün,str1);
    SendClientMessage(pID,Grün,str2);
    ShowLicense(playerid,pID);
    return 1;
    }

    Bitte printe mal deine Fraktion in die Server_log



    printf("Fraktion: %d",GetPVarInt(playerid,"Fraktion"));
    switch(GetPVarInt(playerid,"Fraktion"))
    {
    case 0:{}
    case 1:
    {
    SetPlayerPos(playerid,lspdspawn);
    SetPlayerColor(playerid,BLUE);
    }
    case 2:
    {
    SetPlayerPos(playerid,sekspawn);
    GivePlayerWeapon(playerid,24,100);
    }
    case 3:
    {
    SetPlayerPos(playerid,srspawn);
    SetPlayerColor(playerid,GREEN);
    }
    }

    Naja das geht schon:



    getPlayerIDFromString(idorname[])
    {
    if(strlen(idorname) == 0) return -1;
    new id = -1;
    if(isNumeric(idorname))
    {
    if(!IsPlayerConnected(strval(idorname))) return -1;
    id = strval(idorname);
    }
    else
    {
    for(new i = 0;i<MAX_PLAYERS;i++)
    {
    if(!IsPlayerConnected(i)) continue;
    new pname[24];
    GetPlayerName(i,pname,sizeof(pname));
    if(strcmp(pname,idorname,true) == 0)
    {
    id = i;
    break;
    }
    }
    }
    return id;
    }

    Eh nein, da strval aus einem String einen Integer macht (sofern möglich). Also kannst du damit keinen Namen in eine ID verwandeln.
    Du kannst aber alle Spieler mit einer for durchlaufen, von jedem den Namen auslesen und mit inputtext vergleichen (strcmp).