Beiträge von Manyula

    Hallo,


    ich hätte zwei Fragen:


    1. Ist es möglich das Intervall eines Timers zu ändern während er schon läuft?


    2. Ich hab vor eine Logdatei für sämtliche Spieleraktionen anzulegen, also Geldflüsse, Teleports, etc. Ist es besser, wenn ich alöe Aktionen in die Serverlog printe oder eine separate Logdatei in die ich alles reinschreiben lasse?


    Danke!

    includes für separate Systeme sind der beste Weg seinen Code in Pawn zu strukturieren. In einem großen Codeblock verliere ich schnell die Übersicht, also schreibe ich alles in eine Include, und hooke die Funktionen einfach.

    Hallo!


    Wenn ein Spieler stirbt, werden seine Koordinaten unter OnPlayerDeath in der globalen Variable "pDeathLoc[MAX_PLAYERS][4]" erfasst, also X, Y, Z und facing angle.
    public OnPlayerDeath(playerid, killerid, reason)
    {
    if(GetPlayerVirtualWorld(playerid) == 0)
    {
    SetPlayerHealth(playerid, FLOAT_INFINITY); //...um die Todesanimation zu überspringen und sofort wieder an der Todesposition zu spawnen
    ClearAnimations(playerid);
    GetPlayerPos(playerid, pDeathLoc[playerid][0], pDeathLoc[playerid][1], pDeathLoc[playerid][2]);
    GetPlayerFacingAngle(playerid, pDeathLoc[playerid][3]);
    }
    }
    In diesem Falle setze ich die HP des Spielers auf unendlich, sodass die Todesanimation übersprungen wird. Das führ zudem dazu, dass OnPlayerDeath und OnPlayerSpawn direkt aufeinander aufgerufen werden. Dass der Spieler gespawnt wird, heißt nach einem Tod aber nicht, dass er wieder am Leben ist, was bedeutet, dass die Spielervariable "IsPlayerDead[playerid]" auf true ist. Er ist viel mehr in einer Art "Downstate". Erst nach Ablauf des Timers oder die Betätigung eines CMD wird die Variable "IsPlayerDead[playerid]" auf false gesetzt, sodass der Spieler wieder als "lebendig" angesehen wird.


    In einer Include vertiefe ich das Wiederbelebungssystem. An der Todesposition soll u.a. ein Mapicon gesetzt werden.
    public OnPlayerDeath(playerid, killerid, reason)
    {
    if(GetPlayerVirtualWorld(playerid) == 0)
    {
    RezzMapIcon[playerid] = CreateDynamicMapIcon(pDeathLoc[playerid][0], pDeathLoc[playerid][1], pDeathLoc[playerid][2], 58, -1, 0, -1, -1, 100.0, MAPICON_LOCAL);
    RezzLabel[playerid] = CreateDynamic3DTextLabel("", C_RED, pDeathLoc[playerid][0], pDeathLoc[playerid][1], pDeathLoc[playerid][2], 100.0, playerid, INVALID_VEHICLE_ID, 0, 0, -1, -1, 100.0); //Hier wird das Mapicon gesetzt
    BleedOutTimer[playerid] = SetTimerEx("BleedOut", 1000, true, "i", playerid);
    switch(pInfo[playerid][Language])
    {
    case LANGUAGE_DE: PlayerTextDrawSetString(playerid, BleedoutTD[playerid], "~r~30~w~~n~~n~~n~Druecke ~r~~k~~VEHICLE_ENTER_EXIT~~w~ um zu respawnen!");
    case LANGUAGE_EN: PlayerTextDrawSetString(playerid, BleedoutTD[playerid], "~r~30~w~~n~~n~~n~Press ~r~~k~~VEHICLE_ENTER_EXIT~~w~ to respawn!");
    }
    PlayerTextDrawShow(playerid, BleedoutTD[playerid]);
    }
    return BO_OnPlayerDeath(playerid, killerid, reason);
    }


    Jetzt gibt es entweder die Möglichkeit im "Downstate" zu respawnen (CMD), zu verbluten (Timer) oder wiederbelebt zu werden (ebenfalls Timer).
    CMD:respawn(playerid, params[])
    {
    RespawnPlayerAtHospital(playerid);
    SetPlayerHealth(playerid, 100);
    IsPlayerDead[playerid] = false;
    ClearAnimations(playerid);
    KillTimer(BleedOutTimer[playerid]);
    BleedOutPoints[playerid] = 30;
    PlayerTextDrawHide(playerid, BleedoutTD[playerid]);
    DestroyDynamicMapIcon(RezzMapIcon[playerid]); //Mapicon wird zerstört
    DestroyDynamic3DTextLabel(RezzLabel[playerid]);
    return 1;
    }


    //oder


    forward BleedOut(playerid);
    public BleedOut(playerid)
    {
    if(!BeingRezzed[playerid]) //Spieler wird von niemandem wiederbelebt
    {
    BleedOutPoints[playerid]--;
    new string3D[3],
    stringTD[72];
    format(string3D, sizeof(string3D), "%d", BleedOutPoints[playerid]);
    UpdateDynamic3DTextLabelText(RezzLabel[playerid], C_RED, string3D);
    switch(pInfo[playerid][Language])
    {
    case LANGUAGE_DE: format(stringTD, sizeof(stringTD), "~r~%d~w~~n~~n~~n~Druecke ~r~~k~~VEHICLE_ENTER_EXIT~~w~ um zu respawnen!", BleedOutPoints[playerid]);
    case LANGUAGE_EN: format(stringTD, sizeof(stringTD), "~r~%d~w~~n~~n~~n~Press ~r~~k~~VEHICLE_ENTER_EXIT~~w~ to respawn!", BleedOutPoints[playerid]);
    }
    PlayerTextDrawSetString(playerid, BleedoutTD[playerid], stringTD);
    }
    if(BeingRezzed[playerid]) //Spieler wird von einem oder mehreren Spielern wiederbelebt
    {
    BleedOutPoints[playerid] += (2*PlayersRezzingPlayer[playerid]);
    new string3D[3],
    stringTD[72];
    format(string3D, sizeof(string3D), "%d", BleedOutPoints[playerid]);
    UpdateDynamic3DTextLabelText(RezzLabel[playerid], C_RED, string3D);
    switch(pInfo[playerid][Language])
    {
    case LANGUAGE_DE: format(stringTD, sizeof(stringTD), "~r~%d~w~~n~~n~~n~Druecke ~r~~k~~VEHICLE_ENTER_EXIT~~w~ um zu respawnen!", BleedOutPoints[playerid]);
    case LANGUAGE_EN: format(stringTD, sizeof(stringTD), "~r~%d~w~~n~~n~~n~Press ~r~~k~~VEHICLE_ENTER_EXIT~~w~ to respawn!", BleedOutPoints[playerid]);
    }
    PlayerTextDrawSetString(playerid, BleedoutTD[playerid], stringTD);
    }
    if(BleedOutPoints[playerid] < 0) //Der Spieler verblutet und respawnt
    {
    new stringTD[14];
    switch(pInfo[playerid][Language])
    {
    case LANGUAGE_DE: format(stringTD, sizeof(stringTD), "Verblutet");
    case LANGUAGE_EN: format(stringTD, sizeof(stringTD), "Bled to death");
    }
    PlayerTextDrawHide(playerid, BleedoutTD[playerid]);
    GameTextForPlayer(playerid, stringTD, 3000, 5);
    KillTimer(BleedOutTimer[playerid]);
    DestroyDynamic3DTextLabel(RezzLabel[playerid]);
    DestroyDynamicMapIcon(RezzMapIcon[playerid]); //Mapicon wird zerstört
    BleedOutPoints[playerid] = 30;
    cmd_respawn(playerid, "");
    }
    if(BleedOutPoints[playerid] >= 100) //Der Spieler wurde vollständig geheilt/wiederbelebt
    {
    SetPlayerPos(playerid, pDeathLoc[playerid][0], pDeathLoc[playerid][1], pDeathLoc[playerid][2]);
    SetPlayerFacingAngle(playerid, pDeathLoc[playerid][3]);
    KillTimer(BleedOutTimer[playerid]);
    DestroyDynamic3DTextLabel(RezzLabel[playerid]);
    DestroyDynamicMapIcon(RezzMapIcon[playerid]); //Mapicon wird zerstört
    PlayerTextDrawHide(playerid, BleedoutTD[playerid]);
    BleedOutPoints[playerid] = 30;
    }
    return 1;
    }


    Mal ein Beispiel:
    Der Spieler stirbt. Ich weiß im moment nicht, ob man dann selbst als Spieler das Mapicon sofort auf seinem Radar sieht, aber ich seh es auf jeden Fall nicht. Das ist aber nicht das Problem.
    Der Spieler respawnt und stirbt ein zweites Mal. Dieses Mal sehe ich das Mapicon von der vorherigen Todesposition!
    Und das zieht sich so durch. Ich sehe nie das Mapicon von der momentanen Spielerposition, sondern immer auf den Koordinaten, wo der Spieler einen Tod zuvor gestorben ist!


    Push!

    Ich schätze mal, hier fühlen sich eher diejenigen angesprochen, die etwas fortgeschrittener im Bereich Scripting sind. Allerdings versteh ich nicht ganz, was mit dem Satz "Mit Java ist in SA:MP mehr möglich" oder eben mit C++. Was genau ist damit gemeint? Hat es da konkrete Beispiele?


    Um auf dein Anliegen zurückzukommen:
    1. Freeroam. Ist weniger anfällig auf Interferenzen zwischen den Scriptern.
    2. Muss nicht zwangsweise ein Server draus werden. Wenn jmd etwas nicht passt, lädt er sich dem GM runter und setzt seinen eigenen Server auf, mit seinem Team aus 12-jährigen.
    3. Bin unentschlossen, aber mir sagt PAWN am meisten zu. Allerdings hab ich keine Ahnung worin die verschiedenen Möglichkeiten der einzelnen Sprachen liegen (siehe Frage oben).

    Du musst bedenken, dass du nicht überprüfst was der Spieler eingibt. Im Moment kann er nicht nur Ganzzahlen eingeben, sondern auch Zeichenketten. Schau mal nach der Funktion "IsNumeric" (ist nicht nativ, du musst selbst die stock Funktion anlegen!). Desweiteren ist strval() auch interessant. Schau einfach mal nach diesen zweien und frag, wenn du wieder hängst! ;)

    Ich habe printf am Ende der Timerfunktion eingefügt, das dürfte eigentlich dasselbe sein.
    Ich hab es jetzt noch einmal in der if-Abfrage gemacht.


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

    Gesagt, getan.


    [14:29:12] 29
    [14:29:13] 28
    [14:29:14] 27
    [14:29:15] 26
    [14:29:16] 25
    [14:29:17] 24
    [14:29:18] 23
    [14:29:19] 22
    [14:29:20] 21
    [14:29:21] 20
    [14:29:22] 19
    [14:29:23] 18
    [14:29:24] 17
    [14:29:25] 16
    [14:29:26] 15
    [14:29:27] 14
    [14:29:28] 13
    [14:29:29] 12
    [14:29:30] 11
    [14:29:31] 10
    [14:29:32] 9
    [14:29:33] 8
    [14:29:34] 7
    [14:29:35] 6
    [14:29:36] 5
    [14:29:37] 4
    [14:29:38] 3
    [14:29:39] 2
    [14:29:40] 1
    [14:29:41] 0


    Aufgerufen wird es. Dennoch wird es nicht angezeigt. -.-

    Im 1-sekündigen Timer wird die Variable BleedOutPoints[playerid] für jeden Spieler herab gezählt und dann in den Gametext formatiert.
    Komischerweise wird aber die Zahl "1" nicht angezeigt. Das sieht dann z.B. so aus:


    "2~n~Druecke ENTER um zu respawnen!"
    "~n~Druecke ENTER um zu respawnen""
    "0~n~Druecke ENTER um zu respawnen!"


    Hier der Quellcode:
    forward BleedOut(playerid);
    public BleedOut(playerid)
    {
    if(!BeingRezzed[playerid])
    {
    BleedOutPoints[playerid]--;
    new string3D[3],
    stringGT[65];
    format(string3D, sizeof(string3D), "%d", BleedOutPoints[playerid]);
    UpdateDynamic3DTextLabelText(RezzLabel[playerid], C_RED, string3D);
    switch(pInfo[playerid][Language])
    {
    case LANGUAGE_DE: format(stringGT, sizeof(stringGT), "~r~%d~w~~n~Druecke ~r~~k~~VEHICLE_ENTER_EXIT~~w~ um zu respawnen!", BleedOutPoints[playerid]);
    case LANGUAGE_EN: format(stringGT, sizeof(stringGT), "~r~%d~w~~n~Press ~r~~k~~VEHICLE_ENTER_EXIT~~w~ to respawn!", BleedOutPoints[playerid]);
    }
    GameTextForPlayer(playerid, stringGT, 1000, 5);
    }
    if(BleedOutPoints[playerid] < 0)
    {
    new stringGT[14];
    switch(pInfo[playerid][Language])
    {
    case LANGUAGE_DE: format(stringGT, sizeof(stringGT), "Verblutet");
    case LANGUAGE_EN: format(stringGT, sizeof(stringGT), "Bled to death");
    }
    GameTextForPlayer(playerid, stringGT, 3000, 5);
    KillTimer(BleedOutTimer[playerid]);
    DestroyDynamic3DTextLabel(RezzLabel[playerid]);
    BleedOutPoints[playerid] = 30;
    cmd_respawn(playerid, "");
    }
    if(BleedOutPoints[playerid] >= 100)
    {
    SetPlayerPos(playerid, pDeathLoc[playerid][0], pDeathLoc[playerid][1], pDeathLoc[playerid][2]);
    SetPlayerFacingAngle(playerid, pDeathLoc[playerid][3]);
    KillTimer(BleedOutTimer[playerid]);
    DestroyDynamic3DTextLabel(RezzLabel[playerid]);
    BleedOutPoints[playerid] = 30;
    }
    return 1;
    }


    Ja, aber das würde das Spiel nicht crashen.


    Probleme verursachen eher ungültige Zeiten und/oder gungültige GameTextStyle.


    Kann sein, das der Gametextstyle den Crash auslöst.
    Am besten du schaust hier mal rein
    http://wiki.sa-mp.com/wiki/GameTextForPlayer


    Danke, das war der entscheidende Tipp. Die Makros für Textdraws und Gametexts sind nicht dieselben, das hat das Spiel gecrasht. Danke!


    EDIT: Neues Problem!


    Im 1-sekündigen Timer wird ja die Variable BleedOutPoints[playerid] für jeden Spieler herab gezählt und dann in den Gametext formatiert.
    Komischerweise wird aber die Zahl "1" nicht angezeigt. Das sieht dann z.B. so aus:


    "2~n~Druecke ENTER um zu respawnen!"
    "~n~Druecke ENTER um zu respawnen""
    "0~n~Druecke ENTER um zu respawnen!"

    Hallo,


    ich bin gerade dabei ein Wiederbelebungssystem zu machen. Also, so funktioniert das ganze:
    Der Spieler stirbt und wird durch SetPlayerHealth auf unendlich HP sofort wieder respawnt. So wird die eigentliche Sterbeanimation "unterbunden". Wenn der Spieler also wieder unmittelbar gespawnt ist, lass ich ihn nochmal die Sterbeanimation durchführen. Das erlaubt es mir den Spieler liegen zu lassen, ohne, dass er gezwungenermaßen respawnt wird. Während ein Spieler also im "Downstate" ist, verblutet er. Andere Spieler können zum angeschlagenen Spieler hin und ihn wiederbeleben. Die verbleibende Lebensdauer wird mit BleedOutPoints festgelegt, die beim Verbluten stetig sinken, oder eben beim Wiederbeleben steigen.


    Quellcode zur Include

    Spoiler anzeigen
    new BleedOutTimer[MAX_PLAYERS];
    new BleedOutPoints[MAX_PLAYERS] = 30;
    new bool:BeingRezzed[MAX_PLAYERS] = false;
    new bool:Rezzing[MAX_PLAYERS] = false;
    new PlayersRezzingPlayer[MAX_PLAYERS];
    new Text3D:RezzLabel[MAX_PLAYERS];

    Spoiler anzeigen
    public OnPlayerDeath(playerid, killerid, reason)
    {
    RezzLabel[playerid] = CreateDynamic3DTextLabel("", C_RED, pDeathLoc[playerid][0], pDeathLoc[playerid][1], pDeathLoc[playerid][2], 100.0, playerid, INVALID_VEHICLE_ID, 0, 0, -1, -1, 100.0);
    BleedOutTimer[playerid] = SetTimerEx("BleedOut", 1000, true, "i", playerid);
    switch(pInfo[playerid][Language])
    {
    case LANGUAGE_DE: GameTextForPlayer(playerid, "30~n~~n~Druecke ~r~~k~~KEY_SECONDARY_ATTACK~~w~ um zu respawnen!", 1000, 5);
    case LANGUAGE_EN: GameTextForPlayer(playerid, "30~n~~n~Press ~r~~k~~KEY_SECONDARY_ATTACK~~w~ to respawn!", 1000, 5);
    }
    return BO_OnPlayerDeath(playerid, killerid, reason);
    }

    Spoiler anzeigen
    forward BO_OnPlayerDeath(playerid, killerid, reason);
    #if defined _ALS_OnPlayerDeath
    #undef OnPlayerDeath
    #else
    #define _ALS_OnPlayerDeath
    #endif
    #define OnPlayerDeath BO_OnPlayerDeath

    Spoiler anzeigen
    //=========================================================================================================================================================================================

    Spoiler anzeigen
    forward BleedOut(playerid);
    public BleedOut(playerid)
    {
    if(!BeingRezzed[playerid])
    {
    BleedOutPoints[playerid]--;
    new string3D[3],
    stringGT[64];
    format(string3D, sizeof(string3D), "%d", BleedOutPoints[playerid]);
    UpdateDynamic3DTextLabelText(RezzLabel[playerid], C_RED, string3D);
    switch(pInfo[playerid][Language])
    {
    case LANGUAGE_DE: format(stringGT, sizeof(stringGT), "%d~n~~n~Druecke ~r~~k~~KEY_SECONDARY_ATTACK~~w~ um zu respawnen!", BleedOutPoints[playerid]);
    case LANGUAGE_EN: format(stringGT, sizeof(stringGT), "%d~n~~n~Press ~r~~k~~KEY_SECONDARY_ATTACK~~w~ to respawn!", BleedOutPoints[playerid]);
    }
    GameTextForPlayer(playerid, stringGT, 1000, 5);
    }
    if(BeingRezzed[playerid])
    {
    BleedOutPoints[playerid] += (2*PlayersRezzingPlayer[playerid]);
    new string3D[3],
    stringGT[64];
    format(string3D, sizeof(string3D), "%d", BleedOutPoints[playerid]);
    UpdateDynamic3DTextLabelText(RezzLabel[playerid], C_RED, string3D);
    switch(pInfo[playerid][Language])
    {
    case LANGUAGE_DE: format(stringGT, sizeof(stringGT), "%d~n~~n~Druecke ~r~~k~~KEY_SECONDARY_ATTACK~~w~ um zu respawnen!", BleedOutPoints[playerid]);
    case LANGUAGE_EN: format(stringGT, sizeof(stringGT), "%d~n~~n~Press ~r~~k~~KEY_SECONDARY_ATTACK~~w~ to respawn!", BleedOutPoints[playerid]);
    }
    GameTextForPlayer(playerid, stringGT, 1000, 5);
    }
    if(BleedOutPoints[playerid] <= 0)
    {
    new stringGT[14];
    switch(pInfo[playerid][Language])
    {
    case LANGUAGE_DE: format(stringGT, sizeof(stringGT), "Verblutet");
    case LANGUAGE_EN: format(stringGT, sizeof(stringGT), "Bled to death");
    }
    GameTextForPlayer(playerid, stringGT, 3000, 5);
    KillTimer(BleedOutTimer[playerid]);
    DestroyDynamic3DTextLabel(RezzLabel[playerid]);
    BleedOutPoints[playerid] = 30;
    cmd_respawn(playerid, "");
    }
    if(BleedOutPoints[playerid] >= 100)
    {
    SetPlayerPos(playerid, pDeathLoc[playerid][0], pDeathLoc[playerid][1], pDeathLoc[playerid][2]);
    SetPlayerFacingAngle(playerid, pDeathLoc[playerid][3]);
    KillTimer(BleedOutTimer[playerid]);
    DestroyDynamic3DTextLabel(RezzLabel[playerid]);
    BleedOutPoints[playerid] = 30;
    }
    return 1;
    }

    Spoiler anzeigen
    //=========================================================================================================================================================================================

    Spoiler anzeigen
    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    if(newkeys & KEY_CTRL_BACK) //H
    {
    new closestID = GetClosestPlayer(playerid, 1.0);
    if(IsPlayerDead[closestID])
    {
    if(!Rezzing[playerid] && GetPlayerState(playerid) == PLAYER_STATE_ONFOOT)
    {
    PlayersRezzingPlayer[closestID]++;
    SetPlayerFacingAngleToPlayer(playerid, closestID);
    Rezzing[playerid] = true;
    BeingRezzed[closestID] = true;
    }
    else if(Rezzing[playerid] && GetPlayerState(playerid) == PLAYER_STATE_ONFOOT)
    {
    ClearAnimations(playerid);
    Rezzing[playerid] = false;
    if(PlayersRezzingPlayer[closestID] == 0) BeingRezzed[closestID] = false;
    }
    }
    else return 1;
    }
    if(newkeys & KEY_SECONDARY_ATTACK)
    {
    if(IsPlayerDead[playerid])
    {
    cmd_respawn(playerid, "");
    }
    }
    return BO_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
    }

    Spoiler anzeigen
    forward BO_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
    #if defined _ALS_OnPlayerKeyStateChange
    #undef OnPlayerKeyStateChange
    #else
    #define _ALS_OnPlayerKeyStateChange
    #endif
    #define OnPlayerKeyStateChange BO_OnPlayerKeyStateChange


    Quellcode zum Hauptscript

    Spoiler anzeigen
    public OnPlayerSpawn(playerid)
    {
    //Anderer Code...
    if(pInfo[playerid][JustLoggedIn] == false && pInfo[playerid][JustRegistered] == false)
    {
    if(!IsPlayerDead[playerid])
    {
    UseTeleports[playerid] = true;
    SetSpawnProtection(playerid);
    ClearAnimations(playerid);
    }
    else
    {
    SetPlayerPos(playerid, pDeathLoc[playerid][0], pDeathLoc[playerid][1], pDeathLoc[playerid][2]);
    SetPlayerFacingAngle(playerid, pDeathLoc[playerid][3]);
    SetCameraBehindPlayer(playerid);
    TogglePlayerControllable(playerid, 0);
    ApplyAnimation(playerid, "PED", "KO_shot_front", 4.1, 0, 1, 1, 1, 1);
    }
    return 1;
    }
    return 1;
    }

    Spoiler anzeigen
    public OnPlayerDeath(playerid, killerid, reason)
    {
    if(GetPlayerVirtualWorld(playerid) == 0)
    {
    SetPlayerHealth(playerid, FLOAT_INFINITY);
    ClearAnimations(playerid);
    GetPlayerPos(playerid, pDeathLoc[playerid][0], pDeathLoc[playerid][1], pDeathLoc[playerid][2]);
    GetPlayerFacingAngle(playerid, pDeathLoc[playerid][3]);
    }

    Spoiler anzeigen
    SendDeathMessage(killerid, playerid, reason);
    IsPlayerDead[playerid] = true;

    Spoiler anzeigen
    new kID[MAX_PLAYER_NAME];
    GetPlayerName(killerid, kID, sizeof(kID));
    format(LastKilledPlayer[playerid], MAX_PLAYER_NAME, "%s", kID);

    Spoiler anzeigen
    new money = GetPlayerMoney(playerid);
    if(killerid != INVALID_PLAYER_ID) //Killed by another player
    {
    if(!strcmp(kID, LastKilledPlayer[playerid], true, MAX_PLAYER_NAME))
    {
    TimesLastKilledPlayer[playerid]++;
    switch(TimesLastKilledPlayer[playerid])
    {
    case 1:
    {
    GivePlayerMoneyEx(killerid, money/100*5);
    GivePlayerMoneyEx(playerid, -money/100*15);
    SetPlayerScore(killerid, GetPlayerScore(playerid) + 1);
    }
    case 2:
    {
    GivePlayerMoneyEx(killerid, money/100*2);
    GivePlayerMoneyEx(playerid, -money/100*15);
    SetPlayerScore(killerid, GetPlayerScore(playerid) + 1);
    }
    case 3:
    {
    GivePlayerMoneyEx(killerid, money/100*1);
    GivePlayerMoneyEx(playerid, -money/100*15);
    SetPlayerScore(killerid, GetPlayerScore(playerid) + 1);
    }
    }
    }
    else
    {
    GivePlayerMoneyEx(killerid, money/100*10);
    GivePlayerMoneyEx(playerid, -money/100*15);
    SetPlayerScore(killerid, GetPlayerScore(playerid) + 1);
    }
    }
    if(killerid == INVALID_PLAYER_ID) //Suicide
    {
    GivePlayerMoneyEx(playerid, -money/100*15);
    }
    pInfo[playerid][Deaths] += 1;
    return 1;
    }

    Hallo,


    also, wenn ich mithilfe des /akill [ID] Commands einen Spieler töte, dann wird mir in der Deutschen Sprache das richtige ausgegeben.


    [17:37:49] »ADMIN« Admin {007DFF}[AMBt]Manyula {00D9AD}hat {007DFF}[AMBt]Manyula {00D9AD}gekillt!
    Schalte ich jedoch auf die Englische Sprachausgabe um, spuckt er mir das hier aus.
    [17:37:11] »ADMIN« Admin {007DFF}$s {00D9AD}killed {00005B}ÿÿll 0{00D9AD}!
    Die Textausgaben sind aus dem Chatlog entnommen. Die Farbcodes werden mir Ingame natürlich nicht angezeigt.


    Hier ist der Code.
    stock SendLanguageMessageToAll(color, textDE[], textEN[])
    {
    for(new i; i < MAX_PLAYERS; i++)
    {
    if(pInfo[i][Language] == LANGUAGE_DE) return SendClientMessageToAll(color, textDE);
    if(pInfo[i][Language] == LANGUAGE_EN) return SendClientMessageToAll(color, textEN);
    }
    return 1;
    }
    COMMAND:akill(playerid, params[])
    {
    if(pInfo[playerid][AdminLevel] < 5 && !IsPlayerAdmin(playerid)) SendLanguageMessage(playerid, C_RED, "»ERROR« Du hast einen zu niedrigen Adminlevel, um diese Aktion auszuführen!", "»ERROR« Your admin level is too low to execute this action!");
    else
    {
    new PlayerWhoGetsKilled,
    stringDE[128],
    stringEN[128],
    pName[MAX_PLAYER_NAME],
    AdminName[MAX_PLAYER_NAME];


    if(sscanf(params, "u", PlayerWhoGetsKilled)) return SendLanguageMessage(playerid, C_RED, "»WARNUNG« Gebrauch: /akill [ID]!", "»WARNING« Usage: /akill [ID]!");
    if(!IsPlayerConnected(PlayerWhoGetsKilled)) return SendLanguageMessage(playerid, C_RED, "»WARNUNG« Dieser Spieler ist nicht online!", "»WARNING« This player is not online!");


    if(!IsPlayerDead[PlayerWhoGetsKilled])
    {
    SetPlayerHealth(PlayerWhoGetsKilled, 0);
    GetPlayerName(playerid, AdminName, sizeof(AdminName));
    GetPlayerName(PlayerWhoGetsKilled, pName, sizeof(pName));
    format(stringDE, sizeof(stringDE), "»ADMIN« Admin {%06x}%s "#C_TURQUOISE_E"hat {%06x}%s "#C_TURQUOISE_E"gekillt!", GetPlayerColor(playerid) >>> 8, AdminName, GetPlayerColor(PlayerWhoGetsKilled) >>> 8, pName);
    format(stringEN, sizeof(stringEN), "»ADMIN« Admin {%06x}$s "#C_TURQUOISE_E"killed {%06x}%s"#C_TURQUOISE_E"!", GetPlayerColor(playerid) >>> 8, AdminName, GetPlayerColor(PlayerWhoGetsKilled) >>> 8, pName);
    SendLanguageMessageToAll(C_TURQUOISE, stringDE, stringEN);
    }
    else SendLanguageMessage(playerid, C_RED, "»WARNUNG« Der Spieler ist bereits tot. Warte bis er wieder respawnt!", "»WARNING« The player is already dead. Wait until he respawns!");
    }
    return 1;
    }

    Hallo!


    Ich habe ein kleines "tag-matchiges" Problem mit meiner stock Funktion "SetPlayerFacingAngleToPlayer" in meinem Wiederbelebungssystem.


    Hier die Funktion.
    [pwn=1145]stock SetPlayerFacingAngleToPlayer(playerid, targetid)
    {
    new Float:p[3], t[3];
    GetPlayerPos(playerid, p[0], p[1], p[2]);
    GetPlayerPos(targetid, t[0], t[1], t[2]);
    new Float:a = 180.0-atan2(p[0]-t[0], p[1]-t[1]);
    SetPlayerFacingAngle(playerid, a);
    }[/pwn]


    Hier die Verwendung bei Betätigung der Taste H.
    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    if(newkeys & KEY_CTRL_BACK) //H
    {
    new closestID = GetClosestPlayer(playerid, 1.0);
    if(IsPlayerDead[closestID])
    {
    if(!Rezzing[playerid] && GetPlayerState(playerid) == PLAYER_STATE_ONFOOT)
    {
    PlayersRezzingPlayer[closestID]++;
    SetPlayerFacingAngleToPlayer(playerid, closestID);
    Rezzing[playerid] = true;
    BeingRezzed[closestID] = true;
    }
    else if(Rezzing[playerid] && GetPlayerState(playerid) == PLAYER_STATE_ONFOOT)
    {
    ClearAnimations(playerid);
    Rezzing[playerid] = false;
    if(PlayersRezzingPlayer[closestID] == 0) BeingRezzed[closestID] = false;
    }
    }
    else return 1;
    }
    return BO_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
    }


    forward BO_OnPlayerKeyStateChange(playerid, newkeys, oldkeys);
    #if defined _ALS_OnPlayerKeyStateChange
    #undef OnPlayerKeyStateChange
    #else
    #define _ALS_OnPlayerKeyStateChange
    #endif
    #define OnPlayerKeyStateChange BO_OnPlayerKeyStateChange


    Errormeldungen
    (1149) : warning 213: tag mismatch
    (1149) : warning 213: tag mismatch
    (1149) : warning 213: tag mismatch

    Hallo,


    ich sitze momentan an einem Anglersystem. Verschiedene Fische gibt es zu verschiedenen Zeiten zu fangen. Das ganze ist in vielen switches verpackt.


    case JANUAR:
    {
    new Karpfen[30];
    new Forelle[12];
    new Barsch[2];
    new Makrele[9];
    new Hecht[24];
    new Seebarsch[23];
    }


    Soweit so gut. Die Zellengrößen sind "Fangpunkte". Sie sind Indikatoren für die Wahrscheinlichkeit den jeweiligen Fisch zu fangen. So hat der Karpfen
    z.B. 30 Fangpunkte.
    Das Fangen soll später so aussehen, dass mit der Eingabe eines CMDs (/angeln) ein sich wiederholdender Timer gestartet wird (3000ms). Alle 3s wird
    überprüft, ob man einen Fisch am Haken hat. Weiter gehts also zur Berechnung OB ein Fisch und mit welcher Wahrscheinlichkeit er am haken hängt.


    {
    new Hecht[24];
    for(new i = 0; i < sizeof(Hecht); i++)
    {
    Hecht[i] = random(500);
    for(new j = 0; j < i; j++)
    {
    if(Hecht[j] == Hecht[i])
    {
    i--;
    break;
    }
    }
    }
    //etc...
    }


    Nehmen wir den Beispielmonat Januar, in dem es z.B. einen Hecht zu fangen gibt. Die Basis-Fangpunkte-Anzahl errechnet sich aus den Fangpunkten aller
    in dem Monat verfügbaren Fische (30+12+2+9+24+23 = 100), die dann einfach mit 5 multipliziert wird (= 500). Die Fangpunkte der einzelnen Fische werden
    nun zufällig auf die 500 Zellen verteilt, wobei keine Zelle 2x belegt werden kann.


    Beispiel:
    Barsch belegt 234, 11.
    Makrele belegt 0, 14, 499, 222, 123, 122, 11, 67, 89.


    Um wieder zurück auf den Timer zu sprechen zu kommen: Alle 3 Sekunden wird also überprüft, ob man einen "Treffer" gelandet hat. Dabei ist es also auch
    vorgesehen, dass man mal etwas länger dasitzt um einen Fisch an den Haken zu kriegen.


    Frage: Es ist nicht gerade zeilensparend jeder einzelnen Variable die Werte zuweisen, wie ich es im obigen Codeblock gemacht habe. Gibt es da eine
    andere Möglichkeit ohne die Variablen umzubenennen?
    Und wie berechne ich am besten die Gesamtanzahl an Zellen aller in einem Monat vorkommenden Variablen/Fische? Mit strlen?


    Meinst du nicht, dass du damit ein paar Jahre zu spät kommst. Mittlerweile kennt glaube ich jeder hier schon ganz Los Santos.
    Was anderes wäre es, wenn es bei GTA 5 wäre. Dort gibt es nämlich viele Dinge zum entdecken. Aber in San Andreas? :huh:


    Es ist wirklich erstaunlich, wie viele mein Anliegen falsch interpretieren. 8|


    Es geht mir absolut nicht darum dem Spieler etwas zu zeigen, das er noch nicht kennt. SA kennen die meisten hier vllt sogar besser als ihre eigene Westentasche. Es geht mir darum, was ihr in SA sehenswert findet, egal, ob ihr es schon gesehen habt, oder nicht. Lasst mich es einmal so formulieren:
    Ihr habt einen Freund bei euch, der total begeistert von Leveldesign und 3D-Modellieren ist. Was würdet ihr ihm in San Andreas zeigen, das sehenswert wäre?


    Nachtrag: Ich hab eine Email von einem unregistrierten User bekommen, und dieser scheint mein Anliegen wunderbar verstanden zu haben. Hier das Zitat. ;)