Beiträge von Jeffry

    Der timer ist viel zu schnell.


    Nein...und eine Aussage ohne Begründung macht wenig Sinn.


    Je schneller desto genauer, am Besten wäre es, den ganzen Teil unter OnPlayerUpdate zu setzen. Ich habe damit schon einige Tests gemacht.
    Warum?
    => Wenn du einen 10 Sekunden Timer nimmst kannst du "kostenlos" im Kreis fahren. Daher ein kleiner timer, das macht dem Server auch gar nichts aus.

    //Unter die Includes
    new Float:OldPos[MAX_PLAYERS][3];


    //OnGameModeInit
    SetTimer("PosTimer", 100, 1);


    //Unten im Code
    forward PosTimer();
    public PosTimer()
    {
    new Float:x, Float:y, Float:z, Float:d, Float:v;
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    GetPlayerPos(i, x,y,z);
    if(OldPos[i][0] != 0.0 && OldPos[i][1] != 0.0 && OldPos[i][2] != 0.0)
    {
    d=floatsqroot(((OldPos[i][0]-x)*(OldPos[i][0]-x))+((OldPos[i][1]-y)*(OldPos[i][1]-y))+((OldPos[i][2]-z)*(OldPos[i][2]-z))); //Distanz
    v = d / 100.0 * GasMax[GetVehicleModel(GetPlayerVehicleID(i))-400][aVerbrauch]; //Verbrauch = Distanz von 100km * max.verbrauch(vehicle)
    Tank[i] -= v; //Vom Tank des Spielers (wenn du das Auto willst, i zu GetPlayerVehicleID ändern) abziehen.
    }
    OldPos[i][0] = x;
    OldPos[i][1] = y;
    OldPos[i][2] = z;
    }
    return 1;
    }


    //OnPlayerEnterVehicle / OnPlayerStateChange
    OldPos[i][0] = 0.0;
    OldPos[i][1] = 0.0;
    OldPos[i][2] = 0.0;


    Ich hab es etwas kommentiert, falls dir was unklar ist kann ich es dir gerne explizit erklären.
    Den Tank[] solltest du halt irgendwo schon gesetzt haben, gegebenenfalls die Variable zu deiner umbenennen. Darauf achten, dass i = Spieler IDs sind.

    Du darfst das nicht übder die MODEL-ID (980) aufrufen, sondern über die OBJEKT-ID.
    new Objekt; //unter die includes
    Objekt = CreateObject(980, ...);


    IsPlayerNearObject(playerid, Objekt, 5.0);


    Wenn jeder Spieler sein Objekt woanders hat, dann musst du eben noch ein [MAX_PLAYERS] bei "new" hinzufügen, und bei Objekt ein [playerid] jeweils.

    Wie vermutet ein Problem mit dem Port. Nicht ganz das was ich eingangs beschrieben hatte, aber laut stackoverflow gibt kann man das relativ simpel lösen:


    1.) Öffne die "cmd" (Home-Button => cmd eintippen => Enter (wenn nötig, als Admin Starten))
    2.) sc delete mysql eintippen
    3.) XAMPP neu starten.


    http://stackoverflow.com/quest…path-ports-already-in-use


    Skype ist nicht bei allen das Problem, aber ich weiß, dass es bei mir das Problem war, deshalb musste ich den Port 80 ändern. Probiere es mal wie oben beschrieben, wenn es dann tut, kannste ja mal Skype öffnen, ob es dann immer noch tut, rein aus Neugierde.
    Falls es nicht tut, poste bitte wieder einen Screenshot.

    Wie ich es gesagt hatte. Lebenswichtig ist bei [killerid] abfragen IMMER:
    if(killerid != INVALID_PLAYER_ID)


    public OnPlayerDeath(playerid, killerid, reason)
    {
    GivePM(playerid,100);
    SetPVarInt(playerid,"mech_dienst",0);
    SetPVarInt(playerid,"pizza_dienst",0);
    SetPVarInt(playerid,"farm_dienst",0);
    SetPVarInt(playerid,"taxiduty",0);
    SetPVarInt(playerid, "d_dienst", 0);
    SetPVarInt(playerid, "m_dienst", 0);
    SetPVarInt(playerid, "dienst", 0);
    SetPVarInt(playerid, "fdienst", 0);
    LoseProperty(playerid);
    SetPVarInt(playerid,"Dead",1);
    lastkillerID[playerid] = killerid;
    if(pVars[playerid][Auswahl] == 1)return 0;
    if(killerid != INVALID_PLAYER_ID)
    {
    if(pInfo[killerid][Fraktion] != 4 && pInfo[killerid][Fraktion] != 9)
    {
    new Zeuge = GetNearestPlayer(killerid,25.0);
    if(Zeuge != -1 && pInfo[killerid][Fraktion] > 0 && pInfo[Zeuge][Fraktion] != pInfo[killerid][Fraktion])
    {
    new str3[128],strZ[128];
    new grund[128] = "Mord";
    pInfo[killerid][lastreason] = grund;
    format(strZ,sizeof(strZ),"Du hast ein Verbrechen [Mord] begangen - Zeuge: %s",SpielerName[Zeuge]);
    format(str3,sizeof(str3),"Aktuelles Wantedlevel: %i",pInfo[killerid][Wanteds]);
    SendClientMessage(killerid,0xFFFA00FF,str3);
    SendClientMessage(killerid,COLOR_RED,strZ);
    SendCrimeMessageEx("[HQ] Verbrechen: {FF9933}%s hat einen Mord begangen, Zeuge: %s",SpielerName[killerid],SpielerName[Zeuge]);
    new Wantedsterne = GetPlayerWantedLevel(killerid);
    SetPlayerWantedLevel(killerid,Wantedsterne+1);
    pInfo[killerid][Wanteds]++;
    new Float:x,Float:y,Float:z;
    GetPlayerPos(killerid,x,y,z);
    SetCrimeMarker(x,y,z);
    }
    else SendClientMessage(killerid,COLOR_RED,"Du hast ein Verbrechen [Mord] begangen - Zeuge: Keiner");
    }
    else if(pInfo[killerid][Fraktion]==4 || pInfo[killerid][Fraktion]==9 && pInfo[playerid][Wanteds] > 0)
    {
    new Bonus = pInfo[playerid][Wanteds] * 1000;
    pInfo[playerid][JailTime] = pInfo[playerid][Wanteds] * 60000 * 4;
    GameTextForPlayer(killerid,"~g~Straftaeter getoetet",3000,3);
    GivePM(killerid,Bonus/10);
    FrakInfo[pInfo[playerid][Fraktion]][f_Kasse] += Bonus;
    }
    }
    if(Spawned[playerid] == 1 && pInfo[playerid][JailTime] < 1 || killerid == INVALID_PLAYER_ID)
    {
    ResetPlayerWeapons(playerid);
    new str[128];
    format(str,sizeof(str),"Du bist im Krankenhaus~n~~g~Behandlung: ~r~%d Minuten",sVars[KrankenhausZeit]*1000/60000);
    GameTextForPlayer(playerid,str,sVars[KrankenhausZeit]*1000,3);
    SetTimerEx("KrankenhausTimer",sVars[KrankenhausZeit]*1000,0,"i",playerid);
    TogglePlayerControllable(playerid, 0);
    new Float:xx, Float:yy, Float:zz;
    GetPlayerPos(playerid, xx, yy, zz);
    if((xx > -992.5172 && xx < 4000.0000) && (yy < 528.0000 && yy > -4000.0000)) //Los Santos
    {
    KrankenhausLS[playerid] = 1;
    SetPlayerPos(playerid,1162.871704, -1339.109619, 14.297291);
    SetPlayerCameraPos(playerid, 1223.379028, -1333.354126, 33.809105);
    SetPlayerCameraLookAt(playerid, 1178.824829, -1325.804077, 13.284119);
    SetPlayerInterior(playerid, 0);
    //Los Santos
    }
    if((xx > -4000.0000 && xx< -992.5172) && (yy < 4000.0000 && yy > -4000.0000)) //San Fierro
    {
    KrankenhausSF[playerid] = 1;
    SetPlayerPos(playerid,1162.871704, -1339.109619, 14.297291);
    SetPlayerCameraPos(playerid, -2452.4099,628.8833,64.9522);
    SetPlayerCameraLookAt(playerid, -2618.7205,649.4597,67.2017);
    SetPlayerInterior(playerid, 0);
    //San Fierro
    }
    if((xx > -992.5172 && xx< 4000.0000) && (yy < 4000.0000 && yy > 528.0000)) //Las Venturas
    {
    KrankenhausLV[playerid] = 1;
    SetPlayerPos(playerid,1162.871704, -1339.109619, 14.297291);
    SetPlayerCameraPos(playerid,1617.1127,1889.3317,33.4111);
    SetPlayerCameraLookAt(playerid,1607.3221,1818.3948,31.4688);
    SetPlayerInterior(playerid, 0);
    //Las Venturas
    }
    }
    if(killerid != INVALID_PLAYER_ID)
    {
    if((GangWar[pInfo[playerid][Fraktion]][Gegner]==pInfo[killerid][Fraktion] && GangWar[pInfo[playerid][Fraktion]][Gegner]!=0) || (GangWar[pInfo[killerid][Fraktion]][Gegner]==pInfo[playerid][Fraktion] && GangWar[pInfo[killerid][Fraktion]][Gegner]!=0))
    {
    GameTextForPlayer(playerid,"~r~Gangwarkill",2000,6);
    GameTextForPlayer(killerid,"~g~Gangwarkill",2000,6);
    new frak = pInfo[killerid][Fraktion];
    FrakInfo[frak][f_Kasse] += 200;
    UpdateFrak(FrakInfo[frak][f_Kasse],GangWar[frak][Gegner],GangWar[frak][WarGrund],FrakInfo[frak][f_Gehalt],frak);
    }
    }
    pInfo[playerid][MaskeOben]=0;
    pInfo[playerid][Maske]=0;
    RemovePlayerAttachedObject(playerid,1);
    for(new i; i<MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i) && !IsPlayerNPC(i))
    {
    ShowPlayerNameTagForPlayer(i, playerid, 1);
    }
    }
    return 1;
    }



    Wegen dem Problem des "nicht-spawnens":
    Setze bei OnPlayerDeath KrankenhausLS[playerid] = 1 bei LS, = 2 bei SF und = 3 bei LV.
    Bei OnPlayerSpawn:
    if(Krankenhaus[playerid] == 1)
    {
    SetPlayerPos(playerid,1162.871704, -1339.109619, 14.297291);
    SetPlayerCameraPos(playerid, 1223.379028, -1333.354126, 33.809105);
    SetPlayerCameraLookAt(playerid, 1178.824829, -1325.804077, 13.284119);
    SetPlayerInterior(playerid, 0);
    }
    if(Krankenhaus[playerid] == 2)
    //usw...


    Position bei OnPlayerDeath zu setzen ist schlecht, das geht nicht.

    Wenn Apache nicht geht, kommt bei euch ein Fehler zwecks des Port 80? Anstatt ein Bild von deinem weißen Browser zu posten, poste bitte mal was apache sagt, bzw. ein Screenshot von Xampp, wie es da aussieht.
    Habt ihr Skype offen? Wenn ja, und es ein Fehler mit dem Port 80 gibt, dann muss der Port von apache geändert werden.

    Ich wollte nur wissen, ob es anderen ähnlich geht bei OnPlayerDeath, denn das ist der einzige Abschnitt im Script, in dem
    theoretisch korrekter Code permanent nicht funktioniert.


    Nein.
    Generell ist OnPlayerDeath nichts anderes als jedes andere callback. Viele Fehler passieren eben, weil viele Leute nicht auf die killerid achten, die ist nämlich INVALID_PLAYER_ID bei suizid.
    Kann auch daran liegen, dass ein Filterscript davor schon den Code abschießt, falls du da welche am Laufen hast.


    Ansonsten poste doch einfach mal deinen theoretisch korrekten Code, am besten das ganze OnPlayerDeath, vielleicht findet sich doch ein Fehler. Am callback liegt's jedenfalls nicht, sondern an einem deiner Codes.

    stock SpielerHatNeWaffe(playerid)
    {
    new Waffe[2]; //temporäre Variable
    for (new i = 0; i < 13; i++) //Schleife durch alle waffen-slots
    {
    GetPlayerWeaponData(playerid, i, Waffe[0], Waffe[1]);
    if(Waffe[0] > 0 && Waffe[1] > 0) return 1; //Wenn eine Waffe vorhanden ist, und mehr als 0 Schüsse drin sind, geben 1 (wahr) zurück.
    }
    return 0; //bei keinem Treffer gebe 0 (falsch) zurück.
    }


    GetPlayerWeapon mit SpielerHatNeWaffe ersetzen, und die obige Funktion ganz unten in deinem GM einfügen.

    Du hast i und playerid vertauscht, z.T.


    VID = GetPlayerVehicleID(i);
    zu:
    VID = GetPlayerVehicleID(playerid);


    if(GetPlayerMoney(i) >= FillUp+4)
    zu:
    if(GetPlayerMoney(playerid) >= FillUp+4)



    (Unter Vorbehalt sind vielleicht noch mehr drinne, je nach dem was so manche Variable/Funktion macht, überprüf das bitte.)

    Also, ich hab mir jetzt mal den Code angeschaut, den du anfangs gepostet hast. Ich sehe da auch keinen Fehler, das kann aber auch daran liegen, dass ich mich mit dem Threaded Plugin nie beschäftigt habe.
    Das original-topic im Englischen Forum weißt ja auch speziell darauf hin:


    Ich passe an der Stelle. Falls jemand die Lösung kennt würde es mich auch interessieren.


    Ansonsten, wenn sich keine Lösung findet, kann ich dir nur raten: Mach entweder ein Register System mit R5 oder mach es ganz klassisch mit Dateien, das ist für Anfänger wesentlich besser geeignet. Ich arbeite noch immer mit Dateien als Statistik-Speicher in meinem Server, es ist einfach viel komfortabler als MySQL, wenn man sich richtig auskennt im Umgang mit Files und Strings.


    Sorry, alles weiß ich auch nicht. :)

    if(strcmp(cmd, "/tanken", true) == 0)
    {
    if(IsPlayerConnected(playerid))
    {
    for(new i = 0; i<MAX_TANKEN; i++) //Hier die Schleife
    {
    if(IsPlayerInRangeOfPoint(playerid, 8.0, TankenInfo[i][tPosX], TankenInfo[i][tPosY], TankenInfo[i][tPosZ])) //Ist der Spieler bei der Tanke?
    {
    //if(IsANoTachoVehicle(GetPlayerVehicleID(playerid)))
    //{
    // SendClientMessage(playerid,COLOR_RED,"* Ein Fahrrad hat keinen Tank!"); //Erstmal entfernt.
    //}
    //else
    //{
    new VID;
    new FillUp;
    new string[256];
    VID = GetPlayerVehicleID(i);
    FillUp = GetGasMax(GetVehicleModel(VID)) - Gas[VID];
    if(GetPlayerMoney(i) >= FillUp+4)
    {
    SetTimer("Fillup",RefuelWait,0);
    Refueling[playerid] = 1;
    FreezePlayer(playerid);
    TankenInfo[i][tLiter] -= FillUp;
    UpdateTankenLabel(i);
    format(string, sizeof(string), "* Tankstelle: {FFFFFF}Du betankst dein Fahrzeug an der %s Tankstelle!", TankenInfo[i][tDescr]);
    SendClientMessage(playerid,COLOR_LIGHTBLUE,string);
    SendClientMessage(playerid,COLOR_LIGHTBLUE,"* Tankstelle: {FFFFFF}Bitte warte bis es aufgetankt wurde!");
    return 1;
    }
    else
    {
    format(string,sizeof(string),"* Du hast nicht genug Geld zum Tanken auf der Hand! Kosten: %d$",FillUp);
    return SendClientMessage(i,COLOR_LIGHTGREEN,string);
    }
    }
    }
    //SendClientMessage(playerid,COLOR_RED,"* Du befindest dich an keiner Tankstelle!");
    //return 1;
    GameTextForPlayer(playerid,"~r~DU BIST AN KEINER TANKSTELLE!",4000,3); //Kommt immer bei der zweiten Tanke die ich erstelle.
    }
    }


    Was habe ich gemacht?
    1) return bei "Du hast nicht genug Geld" hinzugefügt.
    2) GameText aus der Schleife geholt, das muss unter die Schleife, da der Punkt nicht erreicht wird, wenn er an einer Tankstelle ist, ansonsten wird dieser Punkt aufgerufen.


    Tip: if(IsPlayerConnected(playerid)) kannst du weg machen. Wenn der Spieler den Command eingibt, wird er auch verbunden sein. ;)

    Das darfst du mit zcmd nicht machen.


    OnPlayerCommandText(playerid,"/q");
    zu:
    CallLolcalFunction("OnPlayerCommandText", "ds", playerid, "/q");


    Allerdings wird er dir das Spiel nicht schließen, /q wird als, über OnPlayerCommandText "gefakter" command, nicht erkannt.

    sInfo[playerid][pGeburtsdatum] = strval(inputtext);
    Das Geburtsdatum ist kein Integer (und gleich zwei mal kein Float.....), sondern ein String.


    format(sInfo[playerid][pGeburtsdatum], 11, "%s", inputtext);


    Außerdem musst du in deinem enum pGeburtsdatum zu pGeburtsdatum[11] ändern.
    Achte auch darauf, dass pGeburtsdatum in deiner Datenbank ein VARCHAR ist.