Beiträge von JustMe.77

    Ne, das würde nicht helfen, da ich soeben bemerkt habe das es auf die Reihenfolge ankommt wann man die Textdraws erstellt.
    Sprich Lösung: Reihenfolge ändern wann die Textdraws erstellt werden.


    Jetzt habe ich noch eine andere Frage:


    Ich habe kürzlich mit Hilfe von @Jeffry ein "Skill System erstellt, womit es 6 verschiedene Level gibt (0 dazugezählt). Jetzt würde ich die gerne alle in einem Textdraw anzeigen lassen, aber ich habe das viel zu umständlich gemacht (es funktioniert, aber es geht definitiv einfacher), nur die Frage ist wie :D


    So schaut der Befehl aus:



    Für jedes Level wird eine andere Farbe & eine andere Größe verwendet, wie könnte ich das einfacher, zeilensparender schreiben?


    Info:


    Beispiel Skill Code:



    if(pData[playerid][P_DeathExplosion] >= 1 && random(10) < pData[playerid][P_DeathExplosion])
    {
    //Player is Skill Level 1+ and Deathexplosion appeared
    new Float:x, Float:y, Float:z;
    GetPlayerPos(playerid, x, y, z);
    CreateExplosion(x, y, z, 10, 2.5);
    }



    if(pData[playerid][P_ArmourSpawn] >= 1 && random(10) < pData[playerid][P_ArmourSpawn])
    {
    //Player is Skill Level 1+ and Deathexplosion appeared
    SetPlayerArmour(playerid, 30);
    }

    Hi, ist das ein eventuell bekannter Fehler, falls ja wie kann ich ihn beheben?


    Ich zeige per Befehl zwei verschiedene Textdraws. Ich zeige Textdraw A als erstes (Hintergrund) und zeige danach dem Spieler Textdraw B, trotzdem befindet sich TextDraw B hinter TextDraw A.

    Hey,


    wie kann ich, wenn ich ein Timer verwende um etwas bestimmtes für X Sekunden zu verhindern ausgeben wie lange man noch warten muss?
    Sprich, das sich die Zeit immer aktuallisiert.


    Beispiel:


    Du musst noch 10 Sekunden warten..
    Du musst noch 5 Sekunden warten etc.

    Das erste Problem habe ich behoben, danke :)


    Zum zweiten, wie genau frage ich das denn ab? Ich glaube das liegt hier ran:



    // playerskills



    format(Query, sizeof(Query), "SELECT * FROM `playerskills` WHERE Name = '%s'", GetName(id));
    mysql_query(MySQL, Query);



    //Skill System
    pData[id][P_DoubleEXP] = cache_get_field_content_int(0, "DoubleEXP");
    pData[id][P_DoubleWeed] = cache_get_field_content_int(0, "DoubleWeed");
    pData[id][P_DeathExplosion] = cache_get_field_content_int(0, "DeathExplosion");


    Edit:


    So sieht die neue Warning aus:


    [20:19:34] [ERROR] CMySQLResult::GetRowDataByName() - invalid row index ('0')



    @Jeffry

    Wieso tauchen diese Meldungen in der MySQLLog auf? Bin die ganze Zeit am suchen aber kann nicht finden was ich falsch gemacht habe (wie denn auch wenn's keine Zeilenangabe gibt?)


    [19:54:12] [ERROR] CMySQLQuery::Execute[()] - (error #1054) Unknown column 'Name' in 'where clause'
    [20:06:47] [WARNING] cache_get_field_content_int - no active cache
    [20:06:47] [WARNING] cache_get_field_content_int - no active cache
    [20:06:47] [WARNING] cache_get_field_content_int - no active cache

    Alles klar, dankeschön.


    Letze Frage (denke ich :D):


    Mit EXP Skill Level 5 besteht ja die Möglichkeit das zu 50 % die Funktion nicht aufgerufen wird und der Spieler somit keine EXP erhält, da EXP Level ja nicht 0 & 5 gleichzeitig sein kann.
    Das alles könnte ich mit einem boolean lösen, gibt's da auch andere, bessere Varienten für?

    Habe mein Level auf 5 gesetzt und mit folgendem Befehl überprüft ob ich auch Level 5 habe.


    EDIT:


    Ach ich denke ich weiß woran das liegt, müsste playerid zu killerid umändern da dass ganze ja in OnPlayerDeath stattfindet, ich versuch's mal :) !

    Hmm, die Double XP Funktion wird irgendwie nicht aufgerufen, kommt immer nur die "normale" EXP Anzahl.



    if(pData[playerid][P_DoubleEXP] == 0) // Double EXP Skill Level 0



    {
    PlayerTextDrawShow(killerid, PlayerKill[killerid][0]);
    PlayerTextDrawShow(killerid, PlayerKill[killerid][1]);
    SetTimerEx("KillTextdrawPlayerKill", 3000, false, "ii", killerid, 0);
    pData[killerid][P_Weed] += 5;
    GivePlayerExp(killerid, 25);
    SendClientMessageToAll(COLOR_RED , "DEBUG: Normal EXP called");
    }



    else if(pData[playerid][P_DoubleEXP] >= 1)//Double EXP Skill Level 1+
    {



    if(random(10) < pData[playerid][P_DoubleEXP])
    {



    PlayerTextDrawShow(killerid, PlayerKill[killerid][0]);
    PlayerTextDrawShow(killerid, PlayerKill[killerid][1]);
    new exp = 25*(pData[playerid][P_DoubleEXP]+1);
    new str[16];
    format(str, sizeof(str), "+%d", exp);
    PlayerTextDrawSetString(playerid, PlayerKill[killerid][0], str);
    PlayerTextDrawSetString(playerid, PlayerKill[killerid][1], "Double EXP");
    SetTimerEx("KillTextdrawPlayerKill", 3000, false, "ii", killerid, 0);
    GivePlayerExp(killerid, exp);
    SendClientMessageToAll(COLOR_GREEN , "DEBUG: DOUBLE EXP called");
    }
    }



    }

    Dann muss ich ein anderen Weg wählen..


    Hatte das so geplant.


    Double EXP (EXP x2) Level 0: Normale EXP (+25 XP) , Level 1: (10 %), Level 2 (20%), Level 3(30%), Level 4(40%), Level 5(50%) - Chance das man doppelte EXP Bekommt.


    Also muss ich das doch so umständlich machen und für jedes Skill Level die Funktionen erneut kopieren und einfügen?


    Sprich so, mit der jeweiligen Zufälligkeit pro Level?




    if(pData[playerid][P_DoubleEXP] == 1)
    {
    PlayerTextDrawShow(killerid, PlayerKill[killerid][0]);
    PlayerTextDrawShow(killerid, PlayerKill[killerid][1]);
    PlayerTextDrawSetString(playerid, PlayerKill[killerid][0], "+50");
    PlayerTextDrawSetString(playerid, PlayerKill[killerid][1], "Double EXP");
    SetTimerEx("KillTextdrawPlayerKill", 3000, false, "ii", killerid, 0);
    GivePlayerExp(killerid, 50);



    }



    else if(pData[playerid][P_DoubleEXP] == 2)



    {
    PlayerTextDrawShow(killerid, PlayerKill[killerid][0]);
    PlayerTextDrawShow(killerid, PlayerKill[killerid][1]);
    PlayerTextDrawSetString(playerid, PlayerKill[killerid][0], "+50");
    PlayerTextDrawSetString(playerid, PlayerKill[killerid][1], "Double EXP");
    SetTimerEx("KillTextdrawPlayerKill", 3000, false, "ii", killerid, 0);
    GivePlayerExp(killerid, 50);



    }



    else if(pData[playerid][P_DoubleEXP] == 3)
    {
    PlayerTextDrawShow(killerid, PlayerKill[killerid][0]);
    PlayerTextDrawShow(killerid, PlayerKill[killerid][1]);
    PlayerTextDrawSetString(playerid, PlayerKill[killerid][0], "+50");
    PlayerTextDrawSetString(playerid, PlayerKill[killerid][1], "Double EXP");
    SetTimerEx("KillTextdrawPlayerKill", 3000, false, "ii", killerid, 0);
    GivePlayerExp(killerid, 50);
    }

    new exp = 25*(pData[playerid][P_DoubleEXP]+1);


    schaut schonmal gut aus, so werde ich es versuchen (btw, wofür steht die +1 dahinter)


    Aber ich rede auch z.B. von den restlichen Funktionen. Es wird ja, wie bereits erwähnt 5 Skill Level geben (+ normale (0)) und ich möchte nicht jedes mal folgendes bei jeder Abfrage verwenden.


    Edit:


    Ach, ich bemerke gerade ich kanns ja so machen, habe das übersehen


    else if(pData[playerid][P_DoubleEXP] >= 1)//Double EXP Skill Level 1+


    dachte ich hätte jetzt jedes mal else if(pData[playerid][P_DoubleEXP] = 1)//Double EXP Skill Level 1+ (mit 1, 2, 3, 4, & 5) machen müssen.


    Aber wenn ich das so wie du machst mit >=1 dann kann ich nicht verschiedene Zufallschancen bestimmen, oder?

    Hallo, habe mal eine Frage.


    Ich bin dabei ein "Skill System" zu erstellen und ich weiß auch wie ich genau vorgehen muss, aber ich bin mir 100 % sicher das sich das auch einfacher lösen lässt, nur habe ich keine Ahnung wie genau ich das anstellen soll.


    Nehmen wir folgendes Beispiel:


    Wenn man einen bestimmten Spieler tötet, erhält man Geld. Je nach Skill Level, hat man eine CHANCE doppeltes Geld zu bekommen. In OnPlayerDeath erstelle ich nun 5 "Skill Level" Abfragen womit ich ihn dann verschiedene Werte gebe.


    Nun habe ich mir das so vorgestellt (ungetestet)



    if(pData[playerid][P_DoubleEXP] == 0) // Double EXP Skill Level 0
    {
    PlayerTextDrawShow(killerid, PlayerKill[killerid][0]);
    PlayerTextDrawShow(killerid, PlayerKill[killerid][1]);
    SetTimerEx("KillTextdrawPlayerKill", 3000, false, "ii", killerid, 0);
    pData[killerid][P_Weed] += 5;
    GivePlayerExp(killerid, 25);
    }






    if(pData[playerid][P_DoubleEXP] == 1) //Double EXP Skill Level 1
    switch(random(10))
    {



    case 0..1:
    {
    PlayerTextDrawShow(killerid, PlayerKill[killerid][0]);
    PlayerTextDrawShow(killerid, PlayerKill[killerid][1]);
    PlayerTextDrawSetString(playerid, PlayerKill[killerid][0], "+50");
    PlayerTextDrawSetString(playerid, PlayerKill[killerid][1], "Double EXP");
    SetTimerEx("KillTextdrawPlayerKill", 3000, false, "ii", killerid, 0);
    GivePlayerExp(killerid, 50);
    return 1;
    }



    }

    }
    }


    Könnte ich nicht irgendwie einfach nur das Geld/die EXP multiplizieren beim jeweiligen Skill Level anstatt immer wieder alles davon zu kopieren?

    Welchen denn genau? Davon steht ja nichts in der Log.
    Eventuell die hier?



    format(Query,sizeof(Query),"UPDATE `players` SET Admin = %d, Level = %d, Kills = %d, Deaths = %d, Ratio = '%f', Weed = %d, Exp = %d, MExp = %d, Banned = %d, Skin = %d, Color = %d, Weather = %d, Time = %d, AL = %d, ReceivedBonus = %d, DoubleEXP = %d, WHERE Name = '%s'",

    Hi, wieso taucht das in meiner MySQL Log aus? Mehr als 500 mal.



    [19:13:51] [ERROR] CMySQLQuery::Execute[()] - (error #1064) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE Name = '[LnD]JustMe.77'' at line 1
    [19:13:51] [ERROR] CMySQLQuery::Execute[()] - (error #1064) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE Name = ''' at line 1

    Ist mir klar, sonst hätte ich nicht gefragt ^^


    Habe es während Jeffry geantwortet hat so fertig gestellt:



    new serverstarting = 0;
    new RST;



    //Ongamemodeinit


    RST = SetTimer("RunStartingTime", 900, true);
    new svstarting[128];
    format(svstarting, sizeof(svstarting),"hostname .: [LnD] 77 BattleArena [Starting %d%%] [Ultra-h.com] :.", serverstarting);
    SendRconCommand(svstarting);



    forward RunStartingTime();
    public RunStartingTime() {
    new rand = random(9);
    serverstarting += rand;
    new svstarting[128];
    format(svstarting, sizeof(svstarting),"hostname .: [LnD] 77 BattleArena [Starting %d%%] [Ultra-h.com] :.", serverstarting);
    SendRconCommand(svstarting);
    if(serverstarting >= 99) {
    SendRconCommand("password 0");
    KillTimer(RST);
    SendRconCommand(SV_NAME);
    }
    return 1;
    }