Beiträge von BlackLegend

    Dieser Fehler tritt auf, wenn die klickbare Fläche rund um ein Textdraw nicht explizit angegeben wurde.
    Definiert wird diese durch die Funktion "TextDrawTextSize" bzw. "PlayerTextDrawTextSize" - siehe Wiki Eintarg:


    Zitat

    Note: This function defines the clickable area for use with PlayerTextDrawSetSelectable, whether a box is shown or not.


    In deinem Fall müssen die beiden Werte jeweils für die anklickbaren Textdraws angepasst werden.
    Dazu spiele einfach ein bisschen an den Werten herum und achte darauf, wie sich die anklickbare Fläche, also in welchem Bereich das jeweilige Textdraw markiert wird, verändert.




    BlackLegend

    Ich würde dir empfehlen, das ganze als Include zu machen, denn dann könntest du Hooking Verwenden und würdest "SendClientMessage" weiter verwenden können, anstatt eine extra Funktion zu basteln.
    OnPlayerText wird übrigends aufgerufen, wenn der Spieler etwas in den Chat schreibt. Je nachdem, wie das bei dir im Script ist, (ob du da nun mit einem limitiertem Chat Radius, SendClientMessage o.Ä. arbeitest) müsstest du das auch noch anpassen.





    BlackLegend

    Du könntest immer, wenn SendClientMessage aufgerufen wird (am besten mit Hooking arbeiten), die zu sendende Nachricht in ein Array speichern.
    Dieses Array sollte dann die letzten Nachrichten enthalten, die der Spieler erhalten hat (sollten so hundert Stück sein).
    Nach jeder Nachricht löschst du den Chat beim Spieler und lässt die gespeicherten Nachrichten erneut ausgeben, sendest aber jede 10. Zeile
    (es würde für dein Vorhaben aber auch einfach die 10. letzte Zeile reichen) anstatt der eigentlichen Nachricht einfach eine leere Zeile.
    Dann würde es so aussehen, dass der Chat "verkleinert" ist, zumindest solange, bis der Spieler auf die Idee kommt zu scrollen.
    Mit diesem Trick könnte man, wenn auch nicht sehr elegant, dein Problem lösen.
    Man könnte dies auch mit einem Plugin umgehen, so ist es jedoch einfacher zu realisieren.




    BlackLegend

    Wenn man MoveObject verwendet und damit dann das Objekt unter die Minimalhöhe schiebt, damit das Objekt nicht mehr zu sehen ist, dann ist das Objekt trotzdem immer noch da.
    Macht man das einmal, ist das kein Problem, doch irgendwann würde es dann soviele Objekte geben, dass diese nicht mehr geladen werden bzw. es bei den Spielern anfängt zu laggen.
    Außerdem ist es viel sinnvoller das Objekt zu zerstören, als es nur "unsichtbar" zu machen.


    Die richtige Frage wäre in diesem Fall also: Warum MoveObject verwenden, wenn es DestroyObject gibt?
    Informiere dich am Besten nocheinmal über die SA:MP Limits.





    BlackLegend

    error 028: invalid subscript (not an array or too many subscripts): "unsterblich"


    Logisch, wenn du sowohl die Funktion, als auch die Variable "unsterblich" nennst.
    Gebe der Funktion einfach einen anderen Namen und das Problem sollte gelöst sein:


    forward funsterblich(playerid);
    public funsterblich(playerid)
    {
    SetPlayerHealth(playerid, 9999);
    SetPlayerArmour(playerid, 9999);
    SetVehicleHealth(GetPlayerVehicleID(playerid), 10000.0);
    return 1;
    }
    Befehl:


    if(strcmp(cmd, "/adminduty", true)==0 || strcmp(cmd, "/aod", true)==0)
    {
    if(IsPlayerConnected(playerid))
    {
    if(gPlayerLogged[playerid] == 0)
    {
    SendClientMessage(playerid, COLOR_GREY, " Du musst eingeloggt sein !");
    return 1;
    }
    if(SpielerInfo[playerid][pAdmin] >= 1)
    {
    if(AdminDuty[playerid] == 0)
    {
    AdminDuty[playerid] = 1;
    SetPlayerArmour(playerid, 99999);
    SetPlayerHealth(playerid, 99999);
    SetPlayerColor(playerid, 0xC46F3585);
    unsterblich[playerid] = SetTimerEx("funsterblich", 2000, true,"i",playerid);
    SendClientMessageToAll(COLOR_YELLOW,"Ein Teammitglied geht nun in den Dienst");
    return 1;
    }
    else if(AdminDuty[playerid] == 1)
    {
    AdminDuty[playerid] = 0;
    SetPlayerArmour(playerid, 100);
    SetPlayerHealth(playerid, 100);
    KillTimer(unsterblich[playerid]);
    SetPlayerColor(playerid,TEAM_HIT_COLOR);
    GetPlayerName(playerid, sendername, sizeof(sendername));
    SendClientMessageToAll(COLOR_YELLOW,"Ein Teammitglied ist aus den Dienst gegangen");
    return 1;
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_RED, "Du bist kein Teammitglied!");
    return 1;
    }
    }
    return 1;
    }




    BlackLegend

    Dein Ansatz ist garnicht so verkehrt, allerdings hast du einen kleinen Denkfehler drinnen. Du möchtest die ID des Fahrzeuges ermitteln, in dem sich der Spieler befindet und anschließend fragst du ab, ob der Spieler sich vorher in einem Fahrzeug befunden hat. Das heißt also, der Spieler kann sich nicht in einem Fahrzeug befinden, wenn er sich vorher als Fahrer oder Beifahrer in einem Fahrzeug befand und er seine Position verändert hat.
    Um dein Vorhaben zu realisieren, musst du das letzte Fahrzeug des Spielers speichern, zum Beispiel so:


    new oldVehicle[MAX_PLAYERS];


    public OnPlayerConnect(playerid)
    {
    oldVehicle[playerid] = 0;
    }


    public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
    {
    oldVehicle[playerid] = vehicleid;
    }


    Dann setzt du das entsprechend in deinem Ansatz um:


    public OnPlayerStateChange(playerid, newstate, oldstate)
    {
    if(oldstate == PLAYER_STATE_DRIVER)
    {
    if(NormalLocked[oldVehicle[playerid]] == 1)
    {
    NormalLocked[oldVehicle[playerid]] = 0;
    //Hier natürlich daran denken, die Parameter des Fahrzeuges zu ändern, um es zu öffnen.
    }
    }
    return 1;
    }


    BlackLegend

    Das ist durchaus möglich und sehr sinnvoll.
    Es gibt diverse Kilometerzähler da draußen, zum Beispiel von Pille: http://pastebin.com/Vj7enCud.
    Den könntest du benutzen und etwas editieren und so deinen Bedürfnissen anpassen, von den Berechnungen her ist dort alles enthalten.





    BlackLegend

    Mit $_GET['Variablenname'] kannst du die entsprechende Variable auslesen. Vorher solltest du aber überprüfen, ob die entsprechende Variable gesetzt und ihr ein Wert zugewisen worden ist.


    PHP
    if(isset($_GET['action']))
    {
    	if(!empty($_GET['action']))
    	{
    		if($_GET['action'] != "")
    		{
                $userid = $_GET['userid']
            } 
        }
    }





    BlackLegend

    Kannst du natürlich so machen, aber ressourcensparender ist das ganz sicher nicht, es hat überhaubt keine Auswirkung auf den finalen Ressourcenverbrauch.
    Wieviel Ressourcen (Arbeitsspeicher, CPU) ein Script bzw. Programm verbraucht hängt davon ab, wieviele Variablen es besitzt und welche Funktionen aufgerufen bzw. im Endeffekt Berechnungen durchgeführt werden. Ich würde dir davon abraten, dass so zu schreiben, da es später sehr unübersichtlich werden kann, ist aber deine Entscheidung.




    BlackLegend


    (e) Fehler ausgebessert

    Ich glaube, du hast das mit den If-Abfragen nochnicht richtig verstanden oder einfach das else vergessen. Die If Abfrage betrifft nur den nachstehenden Code (in deinem fall SendClientMessage) bzw. Codeblock. Das else bewirkt, dass der Code, der unter dem else ausgeführt wird, wenn die If Bedingung nicht erfüllt ist.


    if(GetPlayerScore(playerid) != 2 && SpielerInfo[playerid][pRespektpunkte] != 4)
    return SendClientMessage(playerid, Rot, "Nicht genügend Respektpunkte!");
    else
    {
    SpielerInfo[playerid][pRespektpunkte]=0;
    SetPlayerScore(playerid, 3);
    SavePlayer(playerid);
    }



    BlackLegend

    Wenn du, wie du sagtest, das Passwort kennst, dann entpack doch einfach die Dateien und erstelle dann ein neues ZIP Archiv.
    Das wäre die einfachste Lösung und das Passwort ist dann mit Sicherheit weg.





    BlackLegend

    Zum Thema, dass die Sockets nicht geschlossen werden: OnGameModeExit wird nur aufgerufen, wenn ein anderer Gamemode geladen oder der Server über einen RCON Befehl, nicht jedoch über Putty oder ähnliches, geschlossen wird. Das heißt du müsstest dir dort etwas anderes einfallen lassen, villeicht ein extra Programm, was prüft, ob der Server aus und der Port offen ist und diesen dann schließt.
    Ansonsten wäre wirklich die Samp Rcon Query API sinnvoll, da du so gleich Rcon Befehle an den Server senden und diese dann über das Script auswerten kannst.



    BlackLegend

    Probier es mal so, für String Werte musst du ' benutzen (also einen einzelnen Strich), für Integer nicht:


    stock mysql_GetTankeString(Table[], Field[], Where[], Is)
    {
    new query[128], Get[128];
    mysql_real_escape_string(Table, Table);
    mysql_real_escape_string(Field, Field);
    mysql_real_escape_string(Where, Where);
    format(query, 128, "SELECT `%s`FROM `%s` WHERE `%s`= %d", Field, Table, Where, Is);
    mysql_query(query);
    mysql_store_result();
    mysql_fetch_row(Get);
    mysql_free_result();
    return Get;
    }


    BlackLegend

    Bei Uncuff hast du die Playerids verwechselt, "playerid" ist immer der Spieler, der den Befehl ausführt, du möchtest die Handschellen aber dem Spieler abnehmen, den der Auslöser des Befehls, zum Beispiel ein Cop, angibt.


    In deinem Fall wäre die richtige Variable "giveplayerid".


    Ersetze einfach


    RemovePlayerAttachedObject(playerid,0);


    durch


    RemovePlayerAttachedObject(giveplayerid,0);




    Hier nocheinmal der komplette Code:
    if(strcmp(cmd, "/uncuff", true) == 0)
    {
    if(IsPlayerConnected(playerid))
    {
    if(IsACop(playerid))
    {
    if(OnDuty[playerid] == 1)
    {
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp)) {
    SendClientMessage(playerid, COLOR_LIGHTBLUE, "Benutze: /uncuff [SpielerID]");
    return 1;
    }
    giveplayerid = ReturnUser(tmp);
    if(IsPlayerConnected(giveplayerid))
    {
    if(giveplayerid != INVALID_PLAYER_ID)
    {
    if (ProxDetectorS(8.0, playerid, giveplayerid))
    {
    if(giveplayerid == playerid) { SendClientMessage(playerid, COLOR_GREY, "Du kannst dich nicht selber uncuffen!"); return 1; }
    if(PlayerCuffed[giveplayerid])
    {
    GetPlayerName(giveplayerid, giveplayer, sizeof(giveplayer));
    GetPlayerName(playerid, sendername, sizeof(sendername));
    format(string, sizeof(string), "%s hat ihnen die Handschellen abgenommen.", sendername);
    SendClientMessage(giveplayerid, COLOR_LIGHTBLUE, string);
    format(string, sizeof(string), "Sie haben %s die Handschellen abgenommen.", giveplayer);
    SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
    format(string, sizeof(string), "%s nimmt %s Handschellen ab.", sendername ,giveplayer);
    ProxDetector(30.0, playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
    TogglePlayerControllable(giveplayerid, 0);
    PlayerCuffed[giveplayerid] = 0;
    RemovePlayerAttachedObject(giveplayerid,0);
    }
    else
    {
    SendClientMessage(playerid, COLOR_RED, "Spieler ist nicht gecufft.");
    return 1;
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_RED, "Spieler ist nicht in ihrer Nähe.");
    return 1;
    }
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_RED, "Spieler ist offline.");
    return 1;
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_RED, "Sie sind nicht im Dienst.");
    }
    }
    else
    {
    SendClientMessage(playerid,COLOR_RED,"Sie sind kein Staatsdiener.");
    }
    return 1;
    }
    }



    BlackLegend

    Bei folgendem Code ist eine Klammer zu viel:


    if(PlayerInfo[playerid][pLeader] == 5 ||PlayerInfo[playerid][pLeader] == 13 ||PlayerInfo[playerid][pLeader] == 14 ||PlayerInfo[playerid][pLeader] == 19 ||PlayerInfo[playerid][pLeader] == 16) /* Hier */ ||PlayerInfo[playerid][pLeader] ==17 ||PlayerInfo[playerid][pLeader] == 18)


    So sollte es richtig sein:


    if(PlayerInfo[playerid][pLeader] == 5 ||PlayerInfo[playerid][pLeader] == 13 ||PlayerInfo[playerid][pLeader] == 14 ||PlayerInfo[playerid][pLeader] == 19 ||PlayerInfo[playerid][pLeader] == 16 ||PlayerInfo[playerid][pLeader] ==17 ||PlayerInfo[playerid][pLeader] == 18)



    BlackLegend

    Markus: Ich glaube du verstehst sein Problem nicht. Er war am Scripten und dann hat sich sein PC aufgehangen. Da ihm keine andere Option einfiel, schaltete er den PC einfach aus.
    Als er ihn wieder anschaltete war alles, was er bisher gescriptet hat, verschwunden.


    b2T:
    Wenn du kein Backup von dem Script hast, bleibt dir nichts anderes übrig, als neu anzufangen, da dein Script beim Absturz des PC´s schlicht und einfach nicht gespeichert wurde.
    Warum es nun aber nach dem Neustart komplett weg ist, ist seltsam. Wielange arbeitest du denn schon an dem Script? Wenn du erst heute, vor dem Absturz angefangen hast,
    ist es logisch, dass der Inhalt weg ist, da dieser nochnicht gespeichert wurde. Ansonsten wäre ein weiterer Grunde, dass beim Abturz einer der Sektoren der Festplatte beschädigt bzw. verändert wurde.



    BlackLegend

    Dann aber bitte nicht den von Saturn, da bekommste wirklich mehr für dein Geld, allein schon die Grafikkarte ist nicht wirklich gut für Gaming geeignet (zumindest nicht für den Preis), und 3TB Festplatte benötigst du sowieso nicht.
    Wenn du nun wirklich auf einen Fertig PC bestehst, würde ich dir den vorschlagen:
    http://www.medion.com/de/prod/…R%C2%AE+X5368+D/210017061


    Wobei es nicht umbedingt ein Core i7 sein muss, zum Gaming reicht nen i5 auch aus, aber so oder so packt dieser PC jedes Spiel auf
    maximalen Einstellungen locker und sollte die nächsten Jahre auch sehr gut überstehen.
    Wenn du jedoch sparen möchtest, würde ich dir wirklich empfehlen entweder wie schon gesagt dir den PC selbst zusammen zu bauen oder eben
    einen mit nem etwas schlechteren Prozessor nehmen.



    BlackLegend

    Als erstes benötigtst du, wie bereits gesagt, einen Webspace, dort legst du eine Datei ab, deren Inhalt die aktuellste Version des Keybinders ist.


    Beispiel:
    Dateiname: "Version.txt"
    Inhalt: 0.1


    Danach erstellst du in deinem Keybinder Script eine neue Variable, die nennst du am besten "Version".


    Code
    Version = 0.2


    Dann folgt darunter die Update Funktion, dabei wird die Datei auf dem Wespace runtergeladen und ausgelesen.
    Das Ergebnis wird in einer Variable gespeichert. Diese Variable wird mit der bereits erstellten Variable "Version" verglichen,
    sollte sie größer sein, wird man gefragt, ob man updaten möchte, drückt man dann auf Ja, erfolgt das Update.
    Dabei wird zuerst die neue Version heruntergeladen und mit der alten ausgetauscht.
    Dazu bedient man sich als Programmierer eines Shellscriptes, da ein Programm sich nicht von alleine aktualisieren kann.
    Dieses unter Windows genannte "Bash Script", hat die Aufgabe, die bereits vorhandene Version zu löschen, die neue Version umzubenennen und diese zu starten.
    Als letztes beendet sich das alte Programm.




    BlackLegend

    Für ein ähnliches System habe ich auch so etwas benötigt, gelöst habe ich es so:


    stock GetXYInFrontOfPos(&Float:PosX, &Float:PosY, Float:Angle, Float:distance)
    {
    PosX += (distance * floatsin(-Angle, degrees));
    PosY += (distance * floatcos(-Angle, degrees));
    }


    GetXYInFrontOfPos(Variable1, Variable2, ZAngle, distance);//Position X, Position Y, Z Achse, in welcher Entfernung




    Für dein Beispiel könnte das so aussehen:


    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    if(newkeys & KEY_FIRE)
    {
    if(!IsPlayerInAnyVehicle(playerid)) return 1;
    if(!rpgvar[GetPlayerVehicleID(playerid)]) return 1;
    new veh = GetPlayerVehicleID(playerid);
    new Float:X, Float:Y, Float:Z, Float:A;
    GetVehiclePos(veh, X, Y, Z);
    GetVehicleZAngle(veh,A);
    new rak = CreateObject(345, X, Y, Z+0.75, 0, 0, A, 300.0);
    const Float:fScale = 200.0;
    GetXYInFrontOfPos(X, Y, A, fScale);//Ich gehe mal davon aus, dass fScale die Entfernung ist, also wie weit die Rakete fliegen soll.
    MoveObject(rak, X, Y, Z,30.0);
    SetTimerEx("Exp", 2200, 0, "d",rak);
    }
    return 1;
    }


    Ungetestet, sollte aber, wenn ich nichts vergessen habe, funktionieren.



    BlackLegend