Beiträge von xerox102

    Damit meine ich aber jetzt nicht, dass ein Mapper dir im Script helfen kann.
    Du musst im sagen, auf welchen Koordinaten sich das ursprüngliche Objekt befindet, er kann dir dann die Koordinaten schicken, wo ein offenes Tor gut passen würde.


    Die Koordinaten musst immer noch du raussuchen, hoffe das ist dir klar :P

    Ganz einfach, du brauchst als erstes selbstgemappte Schranken, diese solltest du dir von einem Mapper deiner Wahl sowohl im geöffneten, als auch im geschlossenen Zustand zukommen lassen.


    Hast du diese, hast du auch Koordinaten.
    Jetzt machst du einen Timer, der sich stetig wiederholt, welcher abruft, ob sich der Bot, welcher den Zug bedient, näher als 200m zu der Schrankenkoordinate befindet. ist dies der Fall, setzt du einfach mithilfe von MoveObject die Schranken nach unten.


    Soweit alles klar?

    Könnte ich schon machen, aber ich habe das Gefühl, du bist ein bisschen selbst mit dem Script überfordert. Ich würde an deiner Stelle noch ein bisschen überdenken, ob das wirklich das richtige für dich ist.


    Ich werde aber trotz allem versuchen, dir nochmal über diesen Thread hier zu helfen. (Bedenke bitte meinen Rat, das Script ist wohl noch zu hoch für dich...)


    Also:
    Jedes Objekt, das verschoben werden soll, hat einen Ursprung. Suche in deinem Gamemode den Befehl, der die Bewegung des Tores auslöst.
    In diesem befindet sich ein Code ala "MoveObject(irgendeineID, mehr, andere, variablen)", diese ID, die als erstes Parameter in MoveObject steht, ist der Schlüssel, die Koordinaten, die dahinter stehen, sind die Position, zu welcher das Objekt verschoben wird.


    Es könnte auch sein, dass dieser Befehl nur zu einem Timer verweist, in diesem Fall enthält der Timer die Zeile mit dem entsprechenden MoveObject Befehl.


    Sollen die Koordinaten angepasst werden, wende dich am besten an einen Mapper, die sind eher für sowas zuständig. (Da man über MTA leichter die Koordinaten rausfinden kann, an die das Objekt eigentlich muss)


    Wenn du jetzt noch die ursprüngliche Position des Objektes suchst, brauchst du eine Zeile, die ca. so aussehen müsste: "irgendeineID = CreateObject(variablen);"


    Die Koordinaten, die du dort findest, sind die, in welchen sich das Tor im geschlossenen Zustand befindet.


    Hoffe, das hat dir etwas geholfen, wenn nicht, überleg dir bitte, dir ein anderes Script zum üben zuzulegen.

    Korrigier die Koordinaten der entsprechenden MoveObject Commands.
    Wenn ein Tor nach unten aufgehen soll, sollte sich nur die Z Achse unterscheiden, ansonsten musst du die Objekte in MTA oder einem anderen Map Editor neu erstellen und die Koordinaten sichern ;)

    Hallo,
    ich benutze schon eigentlich seit meinem Scriptingbeginn das Filesystem dini. Da ich jedoch nie an einem releasebaren Script gearbeitet habe, fehlen bei diesen Scripts auch einige Dinge. Da ich dies in naher Zukunft jedoch tun werde, brauche ich dort natürlich auch dinge wie ein Autosystem etc.
    Damit dieses möglichst professionell wird, soll es natürlich dynamisch sein.
    Nun braucht man natürlich für dynamische Systeme Dateien, in denen bspw. InGame neu erstellte Fahrzeuge oder Häuser für den nächsten GameMode Restart gespeichert werden sollen.


    Mit dini habe ich bisher nur mit den Befehlen:
    dini_Exists
    dini_Create
    dini_IntSet
    dini_Int
    dini_FloatSet
    dini_FloatGet
    dini_Set
    dini_Get


    gearbeitet. Diese funktionieren dafür allerdings nicht, da ich ein Ergebnis haben möchte wie bspw.:


    carID1, x, y, z, float, etc, etc, etc


    mit diesen Funktionen allerdings nur Zeilen der Struktur


    x=y


    möglich sind




    Meine Frage wäre also, wie ich eine Struktur wie das oben genannte Beispiel erzeuge.
    Ist dies mit dini möglich oder brauche ich dafür ein anderes Filesystem?
    Ist es überhaupt mit einem FileSystem möglich?


    Manche werden sagen, mach das doch mit MySQL, allerdings bin ich davon kein großer Freund
    andere werden sagen, leg doch für jedes Fahrzeug eine eigene Datei an. Das mag bei den Häusern vielleicht sinnvoll sein, aber für jedes Userauto und für jedes Autohausauto eine eigene Datei anzulegen wäre doch recht umständlich...


    Hoffe, jemand kann mir da helfen.


    MfG,
    xerox

    Mach auf jeden Fall nicht noch einen Reallife Server.
    Die Flut daran ist viel zu groß, selbst wenn du es schaffst, in monatelanger oder gar jahrelanger Arbeit ein sau gutes Script zu fabrizieren, es würde in der Masse der Godfather untergehen.

    Es könnte sein, wenn du mehrere SAMP Server Verzeichnisse hast (also 2 verschiedene SAMP Ordner mit jeweils einem Pawn Compiler), dass das Script vom anderen Compiler compiled wird, d.h., du müsstest es in den anderen Pawn Ordner auch noch schmeißen.


    Am besten vermeidest du das, in dem du das Script rechtsklickst, Öffnen Mit, und dann das "Pawno.exe" in dem Ordner auswählst, mit dem du arbeitest :)

    Nein, du kannst aber natürlich die entsprechende Meldung simulieren.
    Heißt, du baust einen Auslöser für den entsprechenden Befehl ein, beispielsweise einen Timer, ein bestimmtes Wort oder einen manuellen Command, der das ganze auslösen soll. Dann führst du einfach die entsprechende Aktion aus, beispielsweise einen Kick, und schickst eine Meldung via SendClientMessageToAll, der Bot hätte das gemacht.


    Beispielsweise hast du einen normalen Kick befehl, dieser enthält die Zeile:

    format(randomtextvariable, sizeof(randomtextvariable), "Der Spieler %s wurde von %s gekickt! Grund: %s", spielername, adminname, grund);
    SendClientMessageToAll(0xFF0000AA, randomtextvariable);


    In diesem Fall wird den Spielern mitgeteilt, das der Spieler von selbigem Admin gekickt wird.


    Wenn du jetzt einen /botkick [id] befehl erstellst, kannst du dort einfach folgendes ausgeben lassen:



    format(randomtextvariable, sizeof(randomtextvariable), "Der Spieler %s wurde von [NPC]RandomLeuteKickBot gekickt! Grund: BotKick!", spielername);
    SendClientMessageToAll(0xFF0000AA, randomtextvariable);


    Der Spieler würde zwar dadurch immer noch von einem Spieler gekickt werden, die Spieler würden aber die Meldung erhalten, es wäre ein bot.
    Wenn du jetzt z.B. Badword abfragen unter OnPlayerText oder einen Timer hast, der ein AntiCheat überprüft, dann kickt nichtmal mehr ein Spieler, sondern das System.



    Lange Rede kurzer Sinn:
    Der Spieler wird immer vom SYSTEM gekickt.
    Die Frage ist nur, ob es durch einen Spieler ausgelöst (--> /kick)
    oder durch abfragen ausgelöst ist (-->automatischer kick "durch bot")

    Der Name wird theoretisch von mir direkt beim Connecten abgefragt und in dieser oberen Variable gespeichert, würde das nicht funktionieren, könnte auch die Loginabfrage, ob schon ein Account existiert, nicht funktionieren. Ich versuchs aber trotzdem (wenns klappt, bin ich dieser Variable böse.)


    //Edit: Wie schon gedacht, hat leider nix gebracht..
    //Edit2: 4#Future - wie du weiter unten im Post sehen kannst, habe ich dann bereits den Ordner in "Accounts" unbenannt und dabei auch den / entfernt. Daran liegts also auch nicht. :S
    //Edit3: Ich weiß echt nicht, was ich noch ausprobieren soll. Ich würde das Script neu schreiben, aber ich würds ja wieder gleich schreiben, also wär das ziemlich sinnlos...

    Hallu Leute,
    ich muss heut irgendwie nen kompletten Blackout haben, ich bekomm ne einfache dini Funktion net hin...
    hier der Code:


    stock save(id)
    {
    new accFormat[18+MAX_PLAYER_NAME];
    format(accFormat, sizeof(accFormat), "/SpielerDaten/%s.ini", Spieler[id][Name]);
    if(!dini_Exists(accFormat)) dini_Create(accFormat);
    dini_IntSet(accFormat, "Admin", Spieler[id][Admin]);
    GetPlayerPos(id, Spieler[id][posX], Spieler[id][posY], Spieler[id][posZ]);
    dini_FloatSet(accFormat, "posX", Spieler[id][posX]);
    dini_FloatSet(accFormat, "posY", Spieler[id][posY]);
    dini_FloatSet(accFormat, "posZ", Spieler[id][posZ]);
    dini_IntSet(accFormat, "Geld", GetPlayerMoney(id));
    }


    in die .ini wird aber nix geschrieben, ich versteh einfach net, was falsch sein soll <.<



    //Edit: Ich hab jetz sau viel rumprobiert, die Stock Funktion direkt eingefügt, den SpielerDaten Ordner umbenannt, aber nichts will funktionieren.
    Derzeit befinden sich alle Accounts im Ordner "Accounts" in Scriptfiles
    Beim registrieren habe ich folgenden Code:


    format(accFormat, sizeof(accFormat), "Accounts/%s.ini", Spieler[playerid][Name]);
    dini_Create(accFormat);
    SendClientMessage(playerid, 0x00FF00AA, "Account erfolgreich angelegt");
    new pass = udb_hash(inputtext);
    dini_IntSet(accFormat, "Passwort", pass);


    Und die dini wird auch ohne Probleme erstellt und es wird das Passwort reingeschrieben.
    Bei OnPlayerDisconnect habe ich derzeit folgenden Code:
    if(Spieler[playerid][eingeloggt] == 1)
    {
    format(accFormat, sizeof(accFormat), "Accounts/%s.ini", Spieler[playerid][Name]);
    if(!dini_Exists(accFormat)) dini_Create(accFormat);
    dini_IntSet(accFormat, "Admin", Spieler[playerid][Admin]);
    GetPlayerPos(playerid, Spieler[playerid][posX], Spieler[playerid][posY], Spieler[playerid][posZ]);
    dini_FloatSet(accFormat, "posX", Spieler[playerid][posX]);
    dini_FloatSet(accFormat, "posY", Spieler[playerid][posY]);
    dini_FloatSet(accFormat, "posZ", Spieler[playerid][posZ]);
    dini_IntSet(accFormat, "Geld", GetPlayerMoney(playerid));
    Spieler[playerid][Admin] = 0;
    Spieler[playerid][eingeloggt] = 0;
    }


    Diese Daten werden allerdings NICHT gespeichert!!
    Und ja, der Spieler IST eingeloggt, wenn er sich eingeloggt hat. Ich hab diesbezüglich schon eine Debug Abfrage gemacht.

    Du machst einfach BEIDE MoveObjects in einem Befehl:


    forward GateClosetGate();


    new lspdtor1;
    new lspdtor2;


    lspdtor1=CreateObject(968, 1544.6899414063, -1630.8994140625, 13.300000190735, 0, 90, 90);
    lspdtor2=CreateObject(980, 1587.5, -1637.9000244141, 15, 0, 0, 0);


    if(strcmp("/gate",cmdtext,true,10)==0)
    {
    MoveObject(lspdtor1,1544.6899414063, -1630.8994140625, 13.300000190735,2.0,0,0,90);
    MoveObject(lspdtor2,1587.5, -1630.9000244141, 15, 2.0, 0, 0,0);
    SetTimer("GateClosetGate",5000,0);
    SendClientMessage(playerid, COLOR_RED, "Du hast die Schranke für 5 Sekunden geöffnet");
    return 1;
    }


    public GateClosetGate()
    {
    MoveObject(lspdtor1,1544.6899414063, -1630.8994140625, 13.300000190735,2.0,0,90,90);
    MoveObject(lspdtor2,1587.5, -1637.9000244141, 15, 2.0, 0, 0,0);
    return 1;
    }


    Is ja ansich nicht so schwer oder? Wie beim public einfach beide MoveObjects in eins :)

    Es heißt übrigens nicht einspeeren, sondern einsperren.



    So sollte es gehen:
    ocmd:einspeeren(playerid,params[])
    {
    if(!isPlayerInFrak(playerid,1))return SendClientMessage(playerid,Rot,"Du bist nicht In dieser Fraktion!");
    new player,string[256],pID;
    if(sscanf(params,"u",player))return SendClientMessage(playerid,Blau,"[Benutzung:] /einspeeren [ID]");
    if(player == INVALID_PLAYER_ID)return SendClientMessage(playerid,Rot,"Dieser Spieler ist Nicht Online!");
    format(string,sizeof(string),"Beamter %s hat %s Ins Gefängniss gesteckt.",SpielerName(player));
    SendClientMessage(player,Rot,string);
    SetPlayerPos(player,-1607.2662,719.9185,12.2784); //Du musst die ID der Variable player porten, nicht den, der den CMD eingibt
    format(string,sizeof(string),"Du hast %s ins Gefängniss Gesteckt.",SpielerName(pID));
    SendClientMessage(playerid,Hellgrün,string);
    return 1;
    }