Beiträge von Hagi

    Wenn ein Zeichen im noch nicht gepakten (wann wird der denn gepackt ?)String 4 Byte groß ist, also 32 Bit, müsste dann die reservierung new string[128]; nicht theoretisch vervierfacht werden ? Oder bezieht sich das [128] auf den gepackten String, wo ja jedes Zeichen nur 1 Byte (8 Bit) groß ist ?

    Hab mal eine allgemeinbildene Frage:


    Wenn man einen String mit [128] reserviert, sind das dann Bit oder Byte ?
    Weil ich meine 1 Zeichen aus dem ASCII sind doch 8 Bit oder ?


    PS: Sollte es in einen anderen Bereich gehören bitte dorthin schieben, habs jetzt nur hier rein gemacht weil ich mich auf, aus meinem Script stammende, string[128] beziehe.

    Platzhalter für Strings sind %s


    Dein Ping: [%d]
    in
    Dein Ping: [%s]


    ps du reservierst da viel speicherplatz in deinen strings.
    128 würd allemal reichen

    also wenn man /dm3 macht soll / kill deaktiviert werden ?


    isclosed = 1; // kommt in /dm3 rein


    Und dann kill so


    if(!strcmp(cmdtext, "/kill", true))
    {
    if(isclosed == 0)
    {
    SetPlayerHealth(playerid, 0.0);
    }
    else
    {
    SendClientMessage(playerid,0xFFFFFFAA,"Der Command wurde deaktiviert weil jemand im dm3 ist");
    }
    return 1;
    }


    Wenn es nur für die Spieler deaktiviert werden soll die in dm3 sind dann so:


    new isclosed[MAX_PLAYERS]; // alternativ SetPVarInt(playerid,"isclosed",0);


    dann im /dm3


    isclosed[playerid] = 1; // alternativ SetPVarInt(playerid,"isclosed",1);


    und /kill so


    if(!strcmp(cmdtext, "/kill", true))
    {
    if(isclosed[playerid] == 0) // oder alternativ if(GetPVarInt(playerid,"isclosed") == 0)
    {
    SetPlayerHealth(playerid, 0.0);
    }
    else
    {
    SendClientMessage(playerid,0xFFFFFFAA,"Der Command wurde deaktiviert weil du im dm3 bist);
    }
    return 1;
    }

    Xivo, der nativ sieht wie folgt aus


    TextDrawHideForPlayer(playerid, Text:text);


    Also musst du TextDrawHideForPlayer(i,playerclick[i]);

    machen


    @dit || @Tafil


    if(isclosed == 0) // wenn also die commands ativiert sind
    {
    return 1;
    }
    else
    {
    SendClientMessage(playerid,farbe,"CMD Deaktiviert");
    }

    Du könntest über eine Variable cmd sperren.

    new isclosed;

    Je nachdem ob an oder aus sein soll


    isclosed = 1;
    //oder
    isclosed = 0;


    Jetzt in den einzelnen Commands


    if(isclosed == 0) // wenn also die commands ativiert sind


    Bei Commands die nicht vom Sperren betroffen sein soll, die abfrage einfach weglassen

    public DeleteTextdraw(playerid)
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    TextDrawDestroy(playerclick[i]);// <-- STELLE GEMEINT
    }
    return 1;
    }


    Würd ich jetzt mal sagen.


    @dir ||@cinema


    Ja links unten und rechts oben, wobei links unten IMMEr kleiner als rechts oben sein soll.
    Das Problem ist nur es gibt meines wissens nach kein nativ um zu ÜBerprüfen ob ein Spieler in einer GangZone ist
    Löscht den textdraw von jedem Spieler

    Mit nem Radius kann man da jetzt nicht arbeiten da eine Zone ja ein Rechteck ist.


    Man bräuchte eine Funktion wie IsPlayerInZone.
    Leider gibt es diese nur mit einem, mir nicht bekannten, Include.
    Vllt kannst du damit ja was anfangen

    Klick

    Ganz unten ist was das heißt mic_zone


    wo man es runterladen kann weiß ich leider auch nicht

    Ne wird nicht verworfen, zumindest laut meiner Logik her nicht


    new maxplayers = GetMaxPlayers(); // variable wird erstellt
    #undef MAX_PLAYERS // define wird gelöscht , variable aber nicht
    #define MAX_PLAYERS maxplayers // define wird mit vorhandener variable erstellt


    Die Frage ist nun ob man ein define mit einer Variable definieren kann


    @dit |@ cinema


    Du kanst für jede Reihe ein Array machen new
    reihe1[2] // 2 da 3 felder
    reihe2[2] // 2 da 3 felder
    reihe3[2] // 2 da 3 felder
    /*
    reihe1[0] | reihe1[1] | reihe1[2] --> 1 | 2 | 3
    reihe2[0] | reihe2[1] | reihe2[2] --> 4 | 5 | 6
    reihe3[0] | reihe3[1] | reihe3[2] --> 7 | 8 | 9
    */


    Denke du willst Tic Tac Toe machen ^^. Also legst du einfach die playerid als inhalt der Array-Zelle fest


    reihe1[0] = playerid;


    @dit: mit einem array gehts natürlich auch


    new reihe[2/*reihe*/][2/*spalte*/];

    Ui dann weis ich auch grad nicht , vllt weiß ja jemand anders weiter



    -----------


    Hab jetzt aber selber mal ne Frage.
    Man macht ja um Recourcen zu sparen MaxPlayers immer nur so hoch wie Slots verfügbar sind

    #undef MAX_PLAYERS
    #define MAX_PLAYERS 100


    aber kann man nicht theoretisch auch sowas machen ?


    new maxplayers = GetMaxPlayers();
    #undef MAX_PLAYERS
    #define MAX_PLAYERS maxplayers


    Weil wenn ich das so in nen Befehl mache, sagt er mir maxplayers seie nicht definiert und einmal es würde nicht benutzt.


    Und wäre es Recorcensparender die Slotanzahl als MAxPlayers festzulegen oder jede Sekunde zu schaun wie viele Spieler online sind (getMaxPlayers) ?

    Mach mal das und sag uns was in der log steht


    printf("Leader: %d || Member: %d",PlayerInfo[playerid][pLeader],PlayerInfo[playerid][pMember]);



    Vllt ist der Fehler auch ganz einfach zu einfach wie z.B. dass du nicht in dem Team bist ;)

    Ansonsten kannst du auch einfach das in OnPlayertext reinmachen


    new oocstring[128];
    new pname[MAX_PLAYER_NAME];
    GetPlayerName(playerid,pname,sizeof(pname));
    format(string,sizeof(string),"%s sagt %s",pname,text);
    SendClientMessageToAll(farbe,oocstring);

    Hier ist doch schon der Fehler, wenn der Spieler in der Fraktion 10 ist, wird er rausgeschmissen


    if(pLeader == 10 || pMember == 10)
    {
    SendClientMessage(playerid,COLOR_GREY," Du hast kein Zugriff auf dieses Fahrzeug!");
    TogglePlayerControllable(playerid, 0);
    TogglePlayerControllable(playerid, 1);
    }



    Muss es dann doch eher so sein


    if(pLeader != 10 || pMember != 10)
    {
    SendClientMessage(playerid,COLOR_GREY," Du hast kein Zugriff auf dieses Fahrzeug!");
    TogglePlayerControllable(playerid, 0);
    TogglePlayerControllable(playerid, 1);
    }


    hier machs so



    if(strcmp(cmdtext, "/triggero", true) == 0)
    {
    new namestring[128];
    new pname[MAX_PLAYER_NAME];
    GetPlayerName(playerid,pname,sizeof(pname));


    if(strcmp(namestring,"[LSR]Trigger",false))
    {
    MoveObject(triggersgarage,837.3857421875, -2634.8369140625, 7.8192596435547,2);
    SendClientMessage(playerid,green," Deine Garage ist offen");
    }
    return 1;
    }


    "Namestring" ist nur die bezeichnung für einen String, Zeichenkette, muss demnach auch nicht anders genannt werden

    new namestring[128];
    new pname[MAX_PLAYER_NAME];
    GetPlayerName(playerid,pname,sizeof(pname));
    format(namestring,sizeof(namestring),"%s",pname);
    if(strcmp(namestring,"hierdername",false))
    {
    //tuwasmantuenmuss
    }

    new countdown = 0;
    forward checkcountdown();


    dann z.B. ein dcmd command


    dcmd_countdown(playerid,params[])
    {
    new sekunden;


    if(sscanf(params, "d",sekunden))
    {
    return SendClientMessage(playerid,weiß,"Benutzung: /countdown [sekunden]");
    }
    countdown = sekunden;
    SetTimer("checkcountdown",1000,0);
    }


    public checkcountdown()
    {
    if(countdown >= 1)
    {
    new string[128];
    format(string,sizeof(string),"~r~%d",countdown);
    GameTextForAll(string,1000,3);
    countdown --;
    SetTimer("checkcountdown",1000,0);
    }
    else
    {
    GameTextForAll("~g~ GO GO GO",1000,3);
    }
    }


    Ich hoffe das funktioniert, bin leider grad etwas müde