[SAMMELTHREAD] Kleine Scripting Fragen

  • Hier, schau dir das mal an, das wäre eine Möglichkeit:


    Includes richtig erstellen | Hooking ganz einfach


    Und in deinem Makro musst du dann in dem do __SendClientMessage verwenden



    native __SendClientMessage(playerid, color, const message[]) = SendClientMessage;


    stock _SendClientMessage(playerid, color, const message[], _args[])
    {
    if(!strlen(_args))return __SendClientMessage(playerid, color, message);
    new str[256];
    format(str, sizeof(str), string, _args);
    return __SendClientMessage(playerid, color, str);
    }
    #if defined _ALS_SendClientMessage
    #undef SendClientMessage
    #else
    #define _ALS_SendClientMessage
    #endif
    #define SendClientMessage _SendClientMessage

    Ich weiß nicht, ob ich mich gerade blöd anstelle, aber so funktioniert es auch nicht. :/

  • Ich weiß nicht, ob ich mich gerade blöd anstelle, aber so funktioniert es auch nicht. :/

    Ja, so geht das auch nicht.


    Also wenn du es wirklich über so n schläden Hook machen willst, dann haste da n richtiges gefummel mit den Argumenten.


    Gibt aufwändige Möglichkeiten, wie: http://forum.sa-mp.com/showpost.php?p=669874&postcount=3


    oder mit YSI etwas eleganter: http://forum.sa-mp.com/showpost.php?p=3366595&postcount=3


    da drum herum zu kommen, aber im Endeffekt ist es eigentlich nicht so das was du willst.


    Ich verstehe dein Problem mit der Umbenennung nicht?


    Wieso nennst du es nicht SCME, ist viel einfacher und schneller getippt und sauberer.

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Ich erstelle einen 3DTextLabel , welcher nur für bestimmte Spieler anzeigt wird (Admins)


    Klappt auch, doch wenn ich es wieder löschen will wird es nur für eine Person gelöscht, bei den anderen bleibt es sichtbar.


    Testumgebung: 2 Spieler, beide Admin (hier Rang 3 und höher) für den einen wird es gelöscht, beim anderen nicht.


    Code:




    //Erstellung
    for(new j = 0; j < MAX_PLAYERS; j++){
    if(!IsPlayerConnected(j))continue;
    if(!IsPlayerAnAdmin(j, 3))continue;
    eventBar[i][barlabel] = CreateDynamic3DTextLabel(str, COLOR_TWHITE, pos[0], pos[1], pos[2], 5.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 1, GetPlayerVirtualWorld(playerid), GetPlayerInterior(playerid), j);
    }


    //Löschung
    for(new i = 0; i < MAX_EVENT_BARRICADE; i++){
    if(eventBar[i][baractive] == 1){
    eventBar[i][baractive] = 0;
    DestroyDynamicObject(eventBar[i][barobject]);
    DestroyDynamic3DTextLabel(eventBar[i][barlabel]);
    }


    }

    Einmal editiert, zuletzt von Domain_26 ()

  • Klappt auch, doch wenn ich es wieder löschen will wird es nur für eine Person gelöscht, bei den anderen bleibt es sichtbar.

    Das Problem ist, dass du es für alle Spieler in die gleiche Variable schreibst, somit wird nur die Label ID des letzten Labels gespeichert.
    Du musst die playerid für die das Label erstellt wird, mitgeben, in deinem Fall "j".
    eventBar[i][barlabel][j] = CreateDynamic3DTextLabel...


    Im enum dann auch:
    Text3D:barlabel[MAX_PLAYERS],

  • Warum wird beim Aufrufen des Befehls, ein "Run time error" ausgelöst?


    Code
    1. [debug] Run time error 5: "Invalid memory access"
    2. [debug] AMX backtrace:
    3. [debug] #0 00009960 in public ocmd_inventory (playerid=0, params[]=@00052d84 " ") at ...\sampserver\pawno\include\modules\inventory\invInventory.inc:63
    4. [debug] #1 native CallLocalFunction () from samp-server.exe
    5. [debug] #2 000004c8 in public OnPlayerCommandText (playerid=0, cmdtext[]=@00052d58 "/inventory") at ...\sampserver\pawno\include\includes\ocmd.inc:78


    [pwn=60]
    ocmd:inventory(playerid, params[]) {
    new str[256], frmt[496];
    for(new i=0; i < MAX_PLAYER_ITEMS; i++) {
    if(Items[i][itemBesitzerID] != PlayerAccount[playerid][playerDBID])continue;


    format(frmt, sizeof(frmt), "%s%d. Item: %s (%d) | Amount: %d | Total Weight: %0.2f\n", frmt, i+1, /*Items[i][itemName]*/getItemName(Items[i][itemID]), Items[i][itemID], Items[i][itemAmount], (ItemList[Items[i][itemID]][itemlWeight]*Items[i][itemAmount]));
    }
    if(!strlen(frmt))return SendClientMessage(playerid, -1, "Es befinden sich keine Items in deinem Inventar.");
    return SendClientMessage(playerid, -1, frmt);
    }
    [/pwn]

  • Hast du sicher die Neuste Version von OCMD? :D


    Da gab es nämlich mal diesen Fehler :)


    Wenn du die Neuste Version hast, dann evtl mal so schreiben ocmd:inventory(playerid) {

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S


  • Hast du irgendwelche Warnungen im Compiler stehen, oder eine Meldung bezüglich Stack/Heap Size

    Code
    1. Header size: 4028 bytes
    2. Code size: 71924 bytes
    3. Data size: 339288 bytes
    4. Stack/heap size: 80000 bytes; estimated max. usage: unknown, due to recursion
    5. Total requirements: 495240 bytes


    Entferne auch mal das str[256], aus dem Befehl, das ist ungenutzt, eine Warnung müsste daher mindestens da sein.

    Gleicher Fehler.

  • Wieviele Objekte dürfen an einen Ort sein?

    Das kommt darauf an, es sind nur 1000 möglich an einem Ort.


    Allerdings, wenn du viel CreateObject nutzt, sind natürlich viel weniger an einem Ort möglich, da diese Slots verbraucht sind.


    In diesem Sinne, behalte das im Hinterkopf.


    Es kann aber auch gut sein, dass die Draw/Streamdistance einfach bescheiden eingestellt ist :)

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Das kommt darauf an, es sind nur 1000 möglich an einem Ort.
    Allerdings, wenn du viel CreateObject nutzt, sind natürlich viel weniger an einem Ort möglich, da diese Slots verbraucht sind.


    In diesem Sinne, behalte das im Hinterkopf.


    Es kann aber auch gut sein, dass die Draw/Streamdistance einfach bescheiden eingestellt ist :)



    onfoot_rate 40
    incar_rate 40
    weapon_rate 40
    stream_distance 300.0
    stream_rate 1000

    :thumbsup: e239e1-1575930766.png :thumbsup:

  • Das bezieht sich ja nur auf CreateObject und generell kann man das für einzelne Objekte ja umstellen :D


    Egal, wie dem auch sei, drück doch einfach mal F5 wenn du da hin gehst zu deinen Objekten und schau wie viele Slots voll sind, dann weißt du es, woran es liegt :)

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Ja, wie du siehst ObjectSlotsUsed ist bei 999.


    Sprich du lädst zu viele Objekte :)


    Falls du irgendwo CreateObject nutzt, solltest du überlegen es auf CreateDynamicObject zu ändern, andernfalls ummappen könnte helfen oder die DrawDistance von kleineren Objekten umsetzen (das aber ne ganz schöne fuddel Arbeit)...


    :)

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • wie kann ich das verhindern das wenn man in der luft fällt und man verlässt den server nicht wieder in der luft ist ?
    ich lasse so seinen letzten punkt saven

    public OnPlayerDisconnect(playerid, reason)
    {
    GetPlayerPos(playerid, SpielerInfo[playerid][pLastX], SpielerInfo[playerid][pLastY], SpielerInfo[playerid][pLastZ]);
    return true;
    }

    ist da eine veriable hilfreich oder wie kann man es an besten lösen ?