Beiträge von Manyula

    Hi,


    ich habe mich nun letztens etwas mit Hooking beschäftigt, und mithilfe dessen mein Script in Includes unterteilt, um alles für mich übersichtlicher zu gestalten.
    Nun habe ich meine Deathmatches in eine Include gepackt: Die Arrays für die Spawnpositionen, die Pickups, die Worldboundaries, etc.


    Ich arbeite hier mit VirtualWorlds, d.h. ich frage in folgendem Sinne ab.


    //Unter OnPlayerSpawn
    switch(VirtualWorld)
    {
    case 1: UseTeleports[playerid] = false;
    }
    //Und so weiter bis case X
    Das steht in meiner Include.


    In dem "Mutter-Script", wo ich mein DM System inkludiere, steht folgendes.


    //Auch unter OnPlayerSpawn
    switch(VirtualWorld)
    {
    case 0: UseTeleports[playerid] = false; //0 = normale Spielwelt
    }
    //nur case 0, da die anderen cases in der DM Include sind.


    Jetzt möchte ich verhindern, dass bevor der Spieler überhaupt spawnt, also noch in der Skin-Selection ist, sich teleportieren kann.
    Ich habe nun versucht UseTeleports[playerid] = false; unter OnPlayerSpawn, OnPlayerConnect und OnPlayerRequestClass zu packen, aber es hilft nichts.
    Der Spieler kann sich jederzeit teleportieren.


    Weiß jemand weiter?


    EDIT: Danke, hat sich erledigt. Die Lösung war nur eine if-Abfrage weit entfernt. ;)

    Ja, die Damage Berechnung ist problematisch, weil der Schaden bei einigen Waffen nicht einheitlich ist. Zum Beispiel macht die Sawnoff geringeren Schaden aus der Ferne als aus nächster Nähe, oder eine Explosion einer Granate macht weniger Schaden, je weiter du von ihr weg bist. Sowas lässt sich kaum ressourcenschonend akkurat berechnen. Da müsste man irgendwie mit Disanzen arbeiten, bei Sawnoff z.B. die Schadensbereiche in verschiedene Distanz-Bereiche gliedern. Bei Granaten ist das schwerer, da man ermitteln müsste, wo die Granate aufkommt/explodiert.

    Ich kann mir nicht vorstellen, dass Markus das nicht hinkriegen könnte... Wenn das ein GameMode für Gelegenheitsspieler ist, dann wird also kein Speichersystem verwendet. Alles, was man tun muss ist einen Boolean zu erstellen, dann abzufragen ob er true oder false ist, und dementsprechend per CallRemoteFunction entweder OnPlayerGiveDamage (kein lagshot) oder OnPlayerTakeDamage (lagshot) aufrufen.

    Was ist das für ein GameMode? Wie viele Zeilen hat er? Welche Systeme sind enthalten? Wer ist der Scripter?
    Markus ist doch dein Bruder, richtig? Er kanns dir doch machen, das dürfte kein großer Aufwand sein das in eine Include oder in ein Filterscript zu packen.

    Erstens: Inwiefern Inkompabilität vorprogrammiert?


    Zweitens: Ich habe nun "return BANK_OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]);" unter dem entsprechenden Callback returnt, allerdings kriege ich die Fehlermeldung "error 029: invalid expression, assumed zero". Wie mache ich das bei den Dialogen? Nur einmal am Ende des Callbacks oder nach jedem einzelnen Dialog returnen?

    Okay, macht soweit Sinn. Eine etwas spezifischere Frage hätte ich allerdings noch.
    Wenn ich versuche zu kompilieren, dann zeigt er mir an, dass z.B. eine Color define fehlt oder pInfo, eine Variable aus dem Acc-System.
    Muss ich dann alle defines bzw mein acc enum in jedem Include haben, um darauf zugreifen zu können?
    MUSS ich die einzelnen Includes ganz oben im Script inkludieren?

    Ah, also auf mein Beispiel übertragen wäre das dann so: Wir nehmen mal OnDialogResponse.


    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    /*
    code
    */
    return BANK_SYSTEM_OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]);
    }


    forward BANK_SYSTEM_OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]);
    #if defined _ALS_OnDialogResponse
    #undef OnDialogResponse
    #else
    #define _ALS_OnDialogResponse
    #endif
    #define OnDialogResponse BANK_SYSTEM_OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])


    Damit ich das jetzt nicht alles verwechsel: Der obige Code gehört in die Include, nicht in das "Mother-Script"?


    Im Script selber nichts? Versteh ich nicht ganz.^^

    Mit Includes lässt sich ja dann auch Struktur ins Script bringen. Wie genau stelle ich das jetzt an?


    In habe jetzt z.B. ein Bank System, dass ich separat in einer Include haben möchte, und benutze dafür 3 Callbacks: OnGameModeInit, OnDialogResonse und OnPlayerEnterDynamicCP.
    Die 3 Callbacks muss ich dann IN der Include hooken, nicht wahr? Beispielsweise:


    forward BANK_SYSTEM_OnGameModeInit(); //Callback forwarden


    public OnGameModeInit() //Callback normal aufrufen
    {
    //Code
    return 1;
    }


    //Callback hooken


    #if defined _ALS_OnGameModeInit
    #undef OnGameModeInit
    #else
    #define _ALS_OnGameModeInit
    #endif
    #define OnGameModeInit BANK_SYSTEM_OnGameModeInit


    Um die ganzen Systeme, die ich dann nach und nach machen werde, brauche ich ja dann ein "Mother-Script", wo ich die ganzen Systeme inkludieren kann.
    In diesem muss ich dann CallLocalFunction benutzen:


    public OnGameModeInit()
    {
    CallLocalFuntion("BANK_SYSTEM_OnGameModeInit", ""); //Bin mir nicht ganz im Klaren darüber, wie die Funktion handzuhaben ist, das Wiki hilft mir nicht wirklich.
    return 1;
    }


    Stimmt das soweit?

    Hi, liebe Community,


    Ich habe mich gefragt, ob es sinnvoll ist einen großen GameMode zu zerstückeln und seine einzelnen Systeme jeweils in eine Include zu packen.


    Ich bin dann auf folgendes Thema gestoßen ((Viele) Incudes erstellen sinnvoll oder nicht?), und habe dort die Antwort gefunden, dass es durchaus Sinn macht.


    Nun habe ich aber noch eine weitere Frage: Wie unterteile ich die Systeme am sinnvollsten? Wirklich nach Systemen, oder nach Callbacks? Wenn ich in jedem System einen Dialog verwende, muss dann ja auch in jeder Include separat das Callback dazu aufgerufen werden.


    Was meint ihr dazu?


    MfG, Many

    GameTextForPlayer kommt nicht in Frage, da ich das Textdraw an eine bestimte Stelle platzieren möchte, nicht mitten auf den Screen.


    Ich habe nach einer Möglichkeit gesucht das Textdraw zu positionieren, und bin auf die obige konventionelle Methode gestoßen. Es hat doch ziemlich viele "Textdraw"-Befehle, und die Vielfalt verwirrt mich ein bisschen... :S


    Also, ich möchte das Textdraw an den genannten Koordinaten (455.55, 364) positionieren und nach 5 Sekunden verschwinden lassen.
    Zudem möchte ich unter Geldgewinn (grünes Textdraw) und Geldverlust (rotes Textdraw) unterscheiden. Und, wenn ich dazwischen unterscheiden möchte, dann brauche ich doch die Abfrage?


    Könntet ihr mir einen kleinen Schritt-für-Schritt-Plan machen? Ohne jeglichen Code, man will ja was lernen.


    Danke!

    Hi,


    ich wollte mir eine kleine stock Funktion schreiben, die GivePlayerMoney mit einem einfachen Textdraw erweitert.
    Wenn ein Spieler generell Geld verliert, soll die Zahl rot sein, wenn er welches kriegt, dann grün.


    stock GivePlayerMoneyWithTextdraw(playerid, money)
    {
    new PlayerMoney = GetPlayerMoney(playerid);
    if(PlayerMoney++)
    {
    new Text:MoneyTextdraw;
    MoneyTextdraw = TextDrawCreate(455.55 ,364 , money); //error 035: argument type mismatch (argument 3)
    TextDrawFont(MoneyTextdraw , 3);
    TextDrawLetterSize(MoneyTextdraw , 0.8, 5.6000000000000005);
    TextDrawColor(MoneyTextdraw , 0x008E00FF);
    TextDrawSetOutline(MoneyTextdraw , false);
    TextDrawSetProportional(MoneyTextdraw , true);
    TextDrawSetShadow(MoneyTextdraw , 1);
    GivePlayerMoney(playerid, money);
    }
    if(PlayerMoney--)
    {
    new Text:MoneyTextdraw;
    MoneyTextdraw = TextDrawCreate(455.55 ,364 , money); //error 035: argument type mismatch (argument 3)
    TextDrawFont(MoneyTextdraw , 3);
    TextDrawLetterSize(MoneyTextdraw , 0.8, 5.6000000000000005);
    TextDrawColor(MoneyTextdraw , 0xFF0000FF);
    TextDrawSetOutline(MoneyTextdraw , false);
    TextDrawSetProportional(MoneyTextdraw , true);
    TextDrawSetShadow(MoneyTextdraw , 1);
    GivePlayerMoney(playerid, money);
    }
    return 1;
    }


    Das ist nun vorerst mein Ansatz, auch, wenn es willkürlich zusammengewürfelt ist.
    Ich könnte einen kleinen Denkanstoß gebrauchen. :)

    Hi,


    ich hab jetzt ein kleines DM erstellt, in dem einige Waffen-Pickups rumliegen.


    new BF_Weapon[7];


    public OnGameModeInit()
    {
    BF_Weapon[0] = CreateDynamicPickup(342, 3, 120.5242, 1934.8777, 22.7578, 7, -1, -1, 100.0); //Grenade
    BF_Weapon[1] = CreateDynamicPickup(342, 3, 279.4142, 1829.5718, 21.4766, 7, -1, -1, 100.0); //Grenade
    }


    //CMD zum Beitritt in das DM
    GivePlayerWeapon(playerid, Weapons[16][0], 5); //Grenade


    //Und unter OnPlayerSpawn auch dasselbe
    GivePlayerWeapon(playerid, Weapons[16][0], 5); //Grenade


    Nun gibt er mir aber komischerweise immer 7 Granaten auf die Hand (5 von Spawn ab + 7 im Pickup = 13), obwohl ich unter GivePlayerWeapon nur 5 Granaten angegeben habe.
    Wenn ich folgendes mache...


    public OnPlayerPickUpDynamicPickup(playerid, pickupid)
    {
    if(pickupid == BF_Weapon[0]) return GivePlayerWeapon(playerid, Weapons[16][0], 5); //Grenade

    ... dann werden weitere 5 Granaten drauf gelegt (13 + 5 = 18).


    Weiß jemand weiter? Gibt es vllt eine default Ammo-Menge für jedes Waffen-Pickup? Wenn ja, wie kann man die umgehen?


    Danke im Voraus!


    MfG, Many

    Hallo,


    besteht die Möglichkeit einem Spieler eine vorgefertigte Zeichenkette in die Chatbar einzufügen, also es praktisch vom Script aus eintippen zu lassen?


    Beispiel: Wenn man in einem CMD Dialog einen CMD auswählt, der mehrere Parameter hat (z.B. /givecash [ID] [Amount]), dass, wenn man draufklickt, sich automatisch die Chatbar öffnet, und ein Muster, oder eine "Schablone" eingetippt wird, anstatt der Fehlermeldung, dass der CMD fehlerhaft verwendet wurde.

    Ich hab zurzeit Schwierigkeiten die Sprache in der Userfile zu speichern... Ich hab das jetzt mit einem enum gemacht, da ich sehr oft gelesen hab, dass das defines vorgezogen wird.
    Integer bedeutet doch eig "1" (true) oder "0" (false), oder? Wie speicher ich dass dann in der Userfile ab?


    Ich hab mir das im Prinzip so gedacht:
    "Wenn LANGUAGE_DE gleich 1 & LANGUAGE_EN gleich 0, dann speichere LANGUAGE_DE"
    ... und umgekehrt?
    Dann hab ich 2 if-Abfragen, was gespeichert werden soll.
    Wie liefe das mit defines ab? Ich hoffe, ich hab mich verständlicher ausgedrückt...


    ___________________________________________________________________________________________________________________________________________________________


    EDIT: Ich hab mich dumm, wie ein Hornochse angestellt, ich hab es jetzt hingekriegt. Mit den defines ist es am einfachsten.
    Vielen Dank für die Antworten!


    ~ done

    Ok, ich steig seh jetzt mal ab von den strings, und arbeite mit Werten...


    Sprachen Enumerator
    enum Languages
    {
    LANGUAGE_DE,
    LANGUAGE_EN
    }
    new pLanguage[MAX_PLAYERS][Languages];


    Speichern der Userdatei (OnPlayerDisconnect)
    new INI:file = INI_Open(Path(playerid));
    INI_SetTag(file, "User Data");
    INI_WriteString(file, "IP", pInfo[playerid][IP]);
    INI_WriteInt(file, "AdminLevel", pInfo[playerid][AdminLevel]);
    INI_WriteInt(file, "Money", GetPlayerMoney(playerid));
    INI_WriteInt(file, "Bank", pInfo[playerid][Bank]);
    INI_WriteInt(file, "Score", GetPlayerScore(playerid));
    INI_WriteInt(file, "Kills", pInfo[playerid][Kills]);
    INI_WriteInt(file, "Deaths", pInfo[playerid][Deaths]);
    INI_WriteInt(file, "Language", GetPlayerLanguage(playerid));
    INI_Close(file);
    return 1;


    Laden der Userdatei
    public loadaccount_user(playerid, name[], value[])
    {
    INI_String("Password", pInfo[playerid][Password], 129);
    INI_String("IP", pInfo[playerid][IP], 16);
    INI_Int("AdminLevel", pInfo[playerid][AdminLevel]);
    INI_Int("Money", pInfo[playerid][Money]);
    INI_Int("Bank", pInfo[playerid][Bank]);
    INI_Int("Score", pInfo[playerid][Score]);
    INI_Int("Kills", pInfo[playerid][Kills]);
    INI_Int("Deaths", pInfo[playerid][Deaths]);
    INI_Int("Language", GetPlayerLanguage(playerid)); //error 022: must be lvalue (non-constant)
    return 1;
    }


    Ermitteln der Sprache des Spielers
    stock GetPlayerLanguage(playerid)
    {
    if(pLanguage[playerid][LANGUAGE_DE])
    {
    pLanguage[playerid][LANGUAGE_EN] = 0;
    return pLanguage[playerid][LANGUAGE_DE] = 1;
    }
    if(pLanguage[playerid][LANGUAGE_EN])
    {
    pLanguage[playerid][LANGUAGE_DE] = 0;
    return pLanguage[playerid][LANGUAGE_EN] = 1;
    }
    return 1;
    }


    Nun spuckt er mir folgende Fehlermeldung aus: error 022: must be lvalue (non-constant)
    Stimmt was an der stock Funktion nicht?