Beiträge von Manyula

    Hi,


    es geht um mein Trashcan System. Mit Enter kann man also in der Nähe einer Mülltonne ein wenig durch den Müll wühlen. Dieser Wühlvorgang dauert 4 Sekunden. Nun wollte ich es einrichten, dass man in diesen 4 Sekunden den Vorgang per Enter wieder abbrechen kann.
    Hat man fertig gewühlt, kann man dieselbe Tonne erst nach 30min wieder durchstöbern. Folgender Code setzt dies aber nicht um, bzw. ich kriege es nicht hin, dass, wenn eine Mülltonne durchwühlt worden ist, dass sie danach nicht mehr verfügbar ist. Desweiteren bin ich mir nicht sicher, wie ich die Zeit zurücksetze (siehe Code Zeile 25).


    if(newkeys & KEY_SECONDARY_ATTACK)
    {
    for(new i = 0; i < MAX_TRASH_CANS; i++)
    {
    if(IsPlayerInRangeOfPoint(playerid, 2.0, TrashCans[i][0], TrashCans[i][1], TrashCans[i][2]))
    {
    if(!AlreadySearching[playerid]) //Wenn der Spieler an eine Mülltonne geht und sie durchsucht.
    {
    if(gettime() < TrashCans_ID[i])
    {
    new stringDE[128],
    stringEN[128];
    format(stringDE, sizeof(stringDE), "»WARNUNG« Diese Mülltonne wurde schon geplündert. Versuche es in %imin noch einmal.", (TrashCans_ID[i] - gettime())/60);
    format(stringEN, sizeof(stringEN), "»WARNING« This trash can has already been emptied. Try again in %imin.", (TrashCans_ID[i] - gettime())/60);
    TrashCans_ID[i] = gettime() + 30*60;
    return SendLanguageMessage(playerid, C_RED, stringDE, stringEN);
    }
    TrashCanLootTimer[playerid] = SetTimerEx("TrashCanLoot", 4000, false, "i", playerid, i);
    ApplyAnimation(playerid, "BD_FIRE", "BD_Panic_Loop", 4.1, 0, 0, 0, 0, 4000, 1);
    SendLanguageMessage(playerid, C_PINK, "»SPIELER« Du stöberst in der Mülltonne rum...", "»PLAYER« You rummage through the trash...");
    AlreadySearching[playerid] = true;
    }
    else //Wenn der Spieler bereits an einer Mülltonne ist und schon am Wühlen ist.
    {
    TrashCans_ID[i] = 0; //Wenn Abbruch, dann Zeit zurücksetzen.
    SendLanguageMessage(playerid, C_RED, "»WARNUNG« Du hast aufgehört im Müll zu wühlen.", "»WARNING« You stopped rummaging through the trash.");
    ClearAnimations(playerid);
    KillTimer(TrashCanLootTimer[playerid]);
    AlreadySearching[playerid] = false;
    }
    }
    }
    }

    Also, ich bleibe jetzt bei dem Ändern der Farben, da mit das mit SetPlayerMarkerForPlayer doch zu sehr die Suche nach der Nadel im Heuhaufen ist...


    Jeffry, ich möchte mich ganz herzlich bei dir für dein Durchhaltevermögen bedanken, sieht man echt nicht oft hier im Forum. Props to you. ;)

    Damit funktioniert es schon mal, nur wie behalte ich dann die Farbe für den Chat bei?
    Zurzeit setze ich die Spielerfarbe bei OnPlayerSpawn. Wenn ich nun ins DM gehe, dann ändern sich die Chatfarben.


    Cheers, 007, lange nichts mehr von dir gehört. ;)

    Aso... sorry.^^ Also, der oben genannte Code funktioniert nicht. Also muss der Fehler irgendwo im GM versteckt sein? D: Lass die Schnitzeljagd beginnen. -.-


    EDIT: Ich habe die starke Vermutung, dass es etwas mit SetPlayerColor zu tun hat. Ich habe es momentan unter OnPlayerSpawn stehen.
    SetPlayerColor(playerid, 0x007BFFFF);
    Könnte das evtl. die Marker beeinträchtigen?

    Wie gesagt, ich verwende die Funktion nur in dem genannten Beispiel, sonst in keiner Include und in keinem filterscript.
    Ich hab auch alle Timer-Funktionen überprüft, in keiner ist auch nur annähernd eine solche Funktion verwendet worden.


    Direkt beim Betreten der virtuellen Welt wird doch nur der CMD aufgerufen und kein Callback. Also kann es nur innerhalb des CMD etwas sein.
    Sonst hätt ich gesagt, dass evtl. unter OnPlayerSPawn etwas sein könnte, aber das betrifft ja nicht den ersten Spawn, sondern REspawn.

    So, ich habe nun den exakt selben Code auf einem separaten Script laufen lassen, und siehe da - es funktioniert. Eben nur nicht in meinem eigentlichen GM. Es muss an irgendetwas anderem liegen...
    Hier ist der Code.


    #include <a_samp>
    #include <zcmd>


    #undef MAX_PLAYERS
    #define MAX_PLAYERS 2


    main()
    {
    print("Blank Gamemode by your name here");
    }


    COMMAND:bf(playerid, params[])
    {
    SetPlayerVirtualWorld(playerid, 7);
    SendClientMessage(playerid, -1, "World 7.");
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    printf("World(%d) = %d | %d != %d", i, GetPlayerVirtualWorld(i), i, playerid);
    if(GetPlayerVirtualWorld(i) == 7 && i != playerid)
    {
    printf("Verstecke Marker bei ID %d von ID %d", i, playerid);
    SetPlayerMarkerForPlayer(i, playerid, (GetPlayerColor(playerid) & 0xFFFFFF00));
    printf("Verstecke Marker bei ID %d von ID %d", playerid, i);
    SetPlayerMarkerForPlayer(playerid, i, (GetPlayerColor(i) & 0xFFFFFF00));
    }
    }
    return 1;
    }


    COMMAND:exit(playerid, params[])
    {
    SetPlayerVirtualWorld(playerid, 0);
    return 1;
    }


    public OnGameModeInit()
    {
    SetGameModeText("Blank Script");
    AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
    return 1;
    }


    public OnPlayerRequestClass(playerid, classid)
    {
    SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746);
    SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746);
    return 1;
    }

    Nein, ich verwende die Funktion nur in diesem Fall. Unter OnPlayerUpdate stimmt auch alles.


    Vllt wäre es noch nennenswert, dass ich den Code in einer Include ausführe, aber das dürfte normalerweise keinen Unterschied machen...


    Du meintest doch, dass es bei dir klappt? Wie genau führst du den Code aus? Per CMD?

    Mir ist bei der Messung etwas aufgefallen.


    Ich habe einen kleinen Fehler in meiner AFK Funktion drin, und habe debuggt, in jeder if-Abfrage einmal was geprintet. Nebenher habe ich auch die Zeitmessung laufen lassen.


    Printe ich nur die Zeitmessung in die Konsole, dann dauert die Ausführung der Funktion 0-1ms.
    Printe ich aber mehrere Sachen, also nach jeder if-Abfrage etwas zum Debuggen, dann schwankt die Ausführungszeit zwischen 3ms und 7ms.

    Jetzt hab ich mehr Informationen als ich überhaupt verstehen kann. :D
    Trotzdem find ichs schön, dass hier eine Diskussion entstanden ist. ;)


    Ich habe jetzt mal gemessen, wie lange meine Funktion bei einem Spieler braucht. Das hier ist dabei rausgekommen.
    [08:27:17] Time to execute the function: 0ms
    [08:27:22] Time to execute the function: 0ms
    [08:27:27] Time to execute the function: 0ms
    [08:27:32] Time to execute the function: 0ms
    [08:27:37] Time to execute the function: 0ms
    [08:27:42] Time to execute the function: 0ms
    [08:27:47] Time to execute the function: 0ms
    [08:27:52] Time to execute the function: 0ms
    [08:27:57] Time to execute the function: 0ms
    [08:28:02] Time to execute the function: 0ms
    [08:28:07] Time to execute the function: 0ms
    [08:28:12] Time to execute the function: 0ms
    [08:28:17] Time to execute the function: 0ms
    [08:28:22] Time to execute the function: 1ms
    [08:28:27] Time to execute the function: 0ms
    [08:28:32] Time to execute the function: 0ms
    [08:28:37] Time to execute the function: 0ms
    [08:28:42] Time to execute the function: 0ms
    [08:28:47] Time to execute the function: 0ms
    [08:28:52] Time to execute the function: 0ms
    [08:28:57] Time to execute the function: 0ms
    [08:29:02] Time to execute the function: 0ms
    [08:29:07] Time to execute the function: 0ms
    [08:29:12] Time to execute the function: 0ms
    [08:29:17] Time to execute the function: 0ms


    Ich denke mal, das spricht für sich.

    Das ist mir auch aufgefallen, dennoch habe ich den Radar Marker von ID 1 immer noch gesehen. D:


    Also, das hier ist der CMD zum Verlassen des DMs.
    COMMAND:exit(playerid, params[])
    {
    if(!IsPlayerInDM[playerid]) return SendLanguageMessage(playerid, C_RED, "»WARNUNG« Du bist in keinem DM! Benutze "#C_DARK_RED_E"/DM"#C_RED_E" für eine Liste der DMs!", "»WARNING« You aren't in a DM! Use "#C_DARK_RED_E"/DM"#C_RED_E" for a list of DMs!");
    if(BufferCMD(playerid)) return 1;

    new pName[MAX_PLAYER_NAME],
    stringDE[128],
    stringEN[128];
    ResetPlayerWeapons(playerid);
    RestoreWeaponSkillLevel(playerid);
    ReturnPlayerWeapons(playerid);
    ReturnPlayerHPandAP(playerid);


    SetPlayerVirtualWorld(playerid, 0);
    SetPlayerInterior(playerid, 0);
    SetPlayerPos(playerid, GlobalX[playerid], GlobalY[playerid], GlobalZ[playerid]);
    SetPlayerFacingAngle(playerid, GlobalFacingAngle[playerid]);


    GetPlayerName(playerid, pName, sizeof(pName));
    format(stringDE, sizeof(stringDE), "»DEATHMATCH« {%06x}%s "#C_DM_E"hat das DM verlassen! [/verlassen]", GetPlayerColor(playerid) >>> 8, pName);
    format(stringEN, sizeof(stringEN), "»DEATHMATCH« {%06x}%s "#C_DM_E"has left the DM! [/exit]", GetPlayerColor(playerid) >>> 8, pName);
    SendLanguageMessageToAll(C_DM, stringDE, stringEN);
    IsPlayerInDM[playerid] = false;
    UseTeleports[playerid] = true;

    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerVirtualWorld(i) == 7 && i != playerid)
    {
    SetPlayerMarkerForPlayer(i, playerid, (GetPlayerColor(playerid)));
    SetPlayerMarkerForPlayer(playerid, i, (GetPlayerColor(i)));
    }
    }
    return 1;
    }


    Und das hier der CMD zum Betreten des DMs mit der virtuellen Welt 7.
    COMMAND:bf(playerid, params[])
    {
    new Random = random(sizeof(RandomSpawnsBF)),
    pName[MAX_PLAYER_NAME],
    stringDE[128],
    stringEN[128];
    GetPlayerName(playerid, pName, sizeof(pName));
    format(stringDE, sizeof(stringDE), "»DEATHMATCH« {%06x}%s "#C_DM_E"hat das Battlefield-DM betreten! [/BF]", GetPlayerColor(playerid) >>> 8, pName);
    format(stringEN, sizeof(stringEN), "»DEATHMATCH« {%06x}%s "#C_DM_E"has joined the Battlefield-DM ! [/BF]", GetPlayerColor(playerid) >>> 8, pName);
    AddToDM(playerid, stringDE, stringEN, RandomSpawnsBF[Random][0], RandomSpawnsBF[Random][1], RandomSpawnsBF[Random][2], RandomSpawnsBF[Random][3], M4, 1000, UZI, 99999, GRENADE, 5, COMBAT_SHOTGUN, 500, 7, 0);
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    printf("World(%d) = %d | %d != %d", i, GetPlayerVirtualWorld(i), i, playerid);
    if(GetPlayerVirtualWorld(i) == 7 && i != playerid)
    {
    printf("Verstecke Marker bei ID %d von ID %d", i, playerid);
    SetPlayerMarkerForPlayer(i, playerid, (GetPlayerColor(playerid) & 0xFFFFFF00));
    printf("Verstecke Marker bei ID %d von ID %d", playerid, i);
    SetPlayerMarkerForPlayer(playerid, i, (GetPlayerColor(i) & 0xFFFFFF00));
    }
    }
    return 1;
    }


    Es müsste wirklich alles stimmen. Ich kann dich auch gerne über Hamachi auf meinen Server kommen lassen, wenn das bei der Problemlösung hilft.

    Ich habe es gestern Abend mit 2 Spielern getestet, und da hat es ebenfalls nicht funktioniert. Ich werde bei Gelegenheit dazu auch nochmal den Log posten.


    EDIT:
    [22:32:28] World(0) = 0 | 0 != 1
    [22:32:28] World(1) = 7 | 1 != 1
    [22:32:28] World(2) = 0 | 2 != 1
    [22:32:28] World(3) = 0 | 3 != 1
    [22:32:28] World(4) = 0 | 4 != 1
    [22:32:28] World(5) = 0 | 5 != 1
    [22:32:28] World(6) = 0 | 6 != 1
    [22:32:28] World(7) = 0 | 7 != 1
    [22:32:28] World(8) = 0 | 8 != 1
    [22:32:28] World(9) = 0 | 9 != 1
    [22:32:28] World(10) = 0 | 10 != 1
    [22:32:28] World(11) = 0 | 11 != 1
    [22:32:28] World(12) = 0 | 12 != 1
    [22:32:28] World(13) = 0 | 13 != 1
    [22:32:28] World(14) = 0 | 14 != 1
    [22:32:28] World(15) = 0 | 15 != 1
    [22:32:28] World(16) = 0 | 16 != 1
    [22:32:28] World(17) = 0 | 17 != 1
    [22:32:28] World(18) = 0 | 18 != 1
    [22:32:28] World(19) = 0 | 19 != 1
    [22:32:28] World(20) = 0 | 20 != 1
    [22:32:28] World(21) = 0 | 21 != 1
    [22:32:28] World(22) = 0 | 22 != 1
    [22:32:28] World(23) = 0 | 23 != 1
    [22:32:28] World(24) = 0 | 24 != 1
    [22:32:28] World(25) = 0 | 25 != 1
    [22:32:28] World(26) = 0 | 26 != 1
    [22:32:28] World(27) = 0 | 27 != 1
    [22:32:28] World(28) = 0 | 28 != 1
    [22:32:28] World(29) = 0 | 29 != 1
    [22:32:28] World(30) = 0 | 30 != 1
    [22:32:28] World(31) = 0 | 31 != 1
    [22:32:28] World(32) = 0 | 32 != 1
    [22:32:28] World(33) = 0 | 33 != 1
    [22:32:28] World(34) = 0 | 34 != 1
    [22:32:28] World(35) = 0 | 35 != 1
    [22:32:28] World(36) = 0 | 36 != 1
    [22:32:28] World(37) = 0 | 37 != 1
    [22:32:28] World(38) = 0 | 38 != 1
    [22:32:28] World(39) = 0 | 39 != 1
    [22:32:28] World(40) = 0 | 40 != 1
    [22:32:28] World(41) = 0 | 41 != 1
    [22:32:28] World(42) = 0 | 42 != 1
    [22:32:28] World(43) = 0 | 43 != 1
    [22:32:28] World(44) = 0 | 44 != 1
    [22:32:28] World(45) = 0 | 45 != 1
    [22:32:28] World(46) = 0 | 46 != 1
    [22:32:28] World(47) = 0 | 47 != 1
    [22:32:28] World(48) = 0 | 48 != 1
    [22:32:28] World(49) = 0 | 49 != 1


    [22:32:31] World(0) = 7 | 0 != 0
    [22:32:31] World(1) = 7 | 1 != 0
    [22:32:31] Verstecke Marker bei ID 1 von ID 0
    [22:32:31] Verstecke Marker bei ID 0 von ID 1
    [22:32:31] World(2) = 0 | 2 != 0
    [22:32:31] World(3) = 0 | 3 != 0
    [22:32:31] World(4) = 0 | 4 != 0
    [22:32:31] World(5) = 0 | 5 != 0
    [22:32:31] World(6) = 0 | 6 != 0
    [22:32:31] World(7) = 0 | 7 != 0
    [22:32:31] World(8) = 0 | 8 != 0
    [22:32:31] World(9) = 0 | 9 != 0
    [22:32:31] World(10) = 0 | 10 != 0
    [22:32:31] World(11) = 0 | 11 != 0
    [22:32:31] World(12) = 0 | 12 != 0
    [22:32:31] World(13) = 0 | 13 != 0
    [22:32:31] World(14) = 0 | 14 != 0
    [22:32:31] World(15) = 0 | 15 != 0
    [22:32:31] World(16) = 0 | 16 != 0
    [22:32:31] World(17) = 0 | 17 != 0
    [22:32:31] World(18) = 0 | 18 != 0
    [22:32:31] World(19) = 0 | 19 != 0
    [22:32:31] World(20) = 0 | 20 != 0
    [22:32:31] World(21) = 0 | 21 != 0
    [22:32:31] World(22) = 0 | 22 != 0
    [22:32:31] World(23) = 0 | 23 != 0
    [22:32:31] World(24) = 0 | 24 != 0
    [22:32:31] World(25) = 0 | 25 != 0
    [22:32:31] World(26) = 0 | 26 != 0
    [22:32:31] World(27) = 0 | 27 != 0
    [22:32:31] World(28) = 0 | 28 != 0
    [22:32:31] World(29) = 0 | 29 != 0
    [22:32:31] World(30) = 0 | 30 != 0
    [22:32:31] World(31) = 0 | 31 != 0
    [22:32:31] World(32) = 0 | 32 != 0
    [22:32:31] World(33) = 0 | 33 != 0
    [22:32:31] World(34) = 0 | 34 != 0
    [22:32:31] World(35) = 0 | 35 != 0
    [22:32:31] World(36) = 0 | 36 != 0
    [22:32:31] World(37) = 0 | 37 != 0
    [22:32:31] World(38) = 0 | 38 != 0
    [22:32:31] World(39) = 0 | 39 != 0
    [22:32:31] World(40) = 0 | 40 != 0
    [22:32:31] World(41) = 0 | 41 != 0
    [22:32:31] World(42) = 0 | 42 != 0
    [22:32:31] World(43) = 0 | 43 != 0
    [22:32:31] World(44) = 0 | 44 != 0
    [22:32:31] World(45) = 0 | 45 != 0
    [22:32:31] World(46) = 0 | 46 != 0
    [22:32:31] World(47) = 0 | 47 != 0
    [22:32:31] World(48) = 0 | 48 != 0
    [22:32:31] World(49) = 0 | 49 != 0

    Jetzt steht Jeffrys Wort gegen Snipers.


    Sniper meint, ich soll für alle Spieler einen eigenen Timer mit Primzahl Intervall erstellen, und Jeffry meint, dass alles in einem Timer weniger auf den CPU geht. D:
    Langsam bin ich total verwirrt.

    Also Variante 1. Also macht es nichts, wenn ich 50 SetTimerEx parallel für 50 Spieler laufen lasse, bzw. es ist effizienter als ein globaler Timer, der 50 Berechnungen durchführt? Ah, jetzt machts Sinn...^^
    Wenn ich das richtig verstehe, dann sollte man auch vermeiden mehrere SetTimerEx für einen Spieler parallel laufen zu lassen, nicht wahr?

    Ich würd gerne kurz auf die Beispiel-Problematik zurückkommen.
    Ich kann nicht eindeutig rauslesen, was Sniper damit meint, dass SetTimerEx in meinem Fall zu empfehlen ist.


    Ist jetzt gemeint, dass ich von Beginn an für jeden Spieler SetTimerEx verwende, und darin den Positions-Check mache und eben eine Variable hochzähle...


    oder ist gemeint, dass ich einen SetTimer laufen lassen soll (Primzahl Intervall), das die Checks durchführt und bei Erfüllug der Bedingung einen Timer startet?

    Und da schließt sich wieder der Kreis. ;)
    Kann man pauschal sagen, was "kleinere" und "größere" Berechnungen sind?
    Ja, Primzahlen machen ja Sinn, weil es keine Überschneidungen mit den Berechnungen anderer Timer geben kann, da hast du recht.