[SAMMELTHREAD] Kleine Scripting Fragen

Dein Problem konnte durch einen User gelöst werden? Bedank dich bei ihm indem du seinen Beitrag als Hilfreich markierst sowie einen Daumen oben dalässt
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Wenn es nicht nach dem Level des Getöteten gehen soll, dann mache es so:
    if(killerid != INVALID_PLAYER_ID)
    {
    if(pData[killerid][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[killerid][P_DoubleEXP] >= 1)//Double EXP Skill Level 1+
    {
    if(random(10) < pData[killerid][P_DoubleEXP])
    {
    PlayerTextDrawShow(killerid, PlayerKill[killerid][0]);
    PlayerTextDrawShow(killerid, PlayerKill[killerid][1]);
    new exp = 25*(pData[killerid][P_DoubleEXP]+1);
    new str[16];
    format(str, sizeof(str), "+%d", exp);
    PlayerTextDrawSetString(killerid, PlayerKill[killerid][0], str);
    PlayerTextDrawSetString(killerid, PlayerKill[killerid][1], "Double EXP");
    SetTimerEx("KillTextdrawPlayerKill", 3000, false, "ii", killerid, 0);
    GivePlayerExp(killerid, exp);
    SendClientMessageToAll(COLOR_GREEN , "DEBUG: DOUBLE EXP called");
    }
    }
    }


    Wie herum du das haben willst war deinem ursprünglichen Code nicht zu entnehmen, deshalb habe ich es einfach gelassen wie es war.
    Versuche es mal so.

  • 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?


    Mit freundlichen Grüßen
    JustMe.77 8)

  • Dazu kannst du es etwas umstellen, dann klappt das ohne Aufwand.
    Ich habe dir in den Kommentaren beschrieben, wann welcher Teil ausgeführt wird:
    if(killerid != INVALID_PLAYER_ID)
    {
    if(pData[killerid][P_DoubleEXP] >= 1 && random(10) < pData[killerid][P_DoubleEXP])
    {
    //Spieler ist Level 1+ und die Zufallschance passt.
    PlayerTextDrawShow(killerid, PlayerKill[killerid][0]);
    PlayerTextDrawShow(killerid, PlayerKill[killerid][1]);
    new exp = 25*(pData[killerid][P_DoubleEXP]+1);
    new str[16];
    format(str, sizeof(str), "+%d", exp);
    PlayerTextDrawSetString(killerid, PlayerKill[killerid][0], str);
    PlayerTextDrawSetString(killerid, PlayerKill[killerid][1], "Double EXP");
    SetTimerEx("KillTextdrawPlayerKill", 3000, false, "ii", killerid, 0);
    GivePlayerExp(killerid, exp);
    SendClientMessageToAll(COLOR_GREEN , "DEBUG: DOUBLE EXP called");
    }
    else
    {
    //Spieler ist Level 0 oder die Zufallschance hat nicht gepasst.
    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");
    }
    }

  • 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


    Mit freundlichen Grüßen
    JustMe.77 8)

  • [19:54:12] [ERROR] CMySQLQuery::Execute[()] - (error #1054) Unknown column 'Name' in 'where clause'

    Irgendwo hast du ein Query, welches auf eine Tabelle mit ..."WHERE Name"... zugreift, in der Tabelle aber keine Spalte Name vorhanden ist. Füge diese hinzu.



    [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

    Irgendwo greifst du mit cache_get_field_content_int auf einen Cache zu, ohne zuvor abgefragt zu haben, ob die num_rows nicht 0 sind (cache_get_data).




    Wo genau im Code das ist kann man anhand der Fehlermeldungen nicht sagen. Das muss man herausfinden, über die Zeit zu der es passiert.

  • 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


    Mit freundlichen Grüßen
    JustMe.77 8)

    Einmal editiert, zuletzt von JustMe.77 ()

  • Der erste print wird immer ausgeführt, der 2te allerdings nie, obwohl ich auf Save drücke. Wo liegt diesmal der Fehler?



    public OnPlayerEditObject(playerid, playerobject, objectid, response, Float:fX, Float:fY, Float:fZ, Float:fRotX, Float:fRotY, Float:fRotZ)
    {
    print("OnPlayerEditObject 1 aufgerufen.");
    new Float:oldX, Float:oldY, Float:oldZ,Float:oldRotX, Float:oldRotY, Float:oldRotZ;
    GetObjectPos(objectid, oldX, oldY, oldZ);
    GetObjectRot(objectid, oldRotX, oldRotY, oldRotZ);
    if(!playerobject)return;
    {
    if(!IsValidObject(objectid))return;
    MoveObject(objectid,fX,fY,fZ,0);
    }
    if(response == EDIT_RESPONSE_FINAL)
    {
    print("OnPlayerEditObject 2 aufgerufen.");
    new query[256];
    new id=GetPVarInt(playerid,"ATMID");
    mysql_format(dbhandle,query,sizeof(query),"UPDATE atms SET x='%f',y='%f',z='%f',rx='%f',ry='%f',rz='%f' WHERE id='%i'",fX,fY,fZ,fRotX,fRotY,fRotZ,id);
    mysql_function_query(dbhandle,query,false,"","");
    updateATM(id);
    }
    if(response == EDIT_RESPONSE_CANCEL)
    {
    // Spieler hat abgebrochen
    if(!playerobject) // Objekt ist kein Player-Objekt
    {
    SetObjectPos(objectid, oldX, oldY, oldZ);
    SetObjectRot(objectid, oldRotX, oldRotY, oldRotZ);
    }
    }
    }

    RTL - Das N steht für Niveau!
    MfG,
    StreetS


    Jegliche Freundesanfragen, die für mich keinen Sinn ergeben, werden professionell Ignoriert. (Gleiche mit Skype!)
    Wer es nicht kapiert wird in Breadfish & Skype blockiert.


    - Stolzer PAWN Scripter der Klasse Beherrscht

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Sofern ich etwas im Text schreibe, soll eine Animation kommen. Nun, diese wird auch gesetzt, jedoch nicht richtig beendet. Er bleibt dann etwas komisch stehen, so als würden wir Menschen die Brust rausdrücken und den Rücken gerade machen.



    ApplyAnimation(playerid,"PED","IDLE_CHAT",4.1,0,0,0,1,4);
    KillTimer(TextTimer[playerid]);
    TextTimer[playerid] = SetTimerEx("SetzRedeAnim",3000,false,"i",playerid);



    forward SetzRedeAnim(playerid);
    public SetzRedeAnim(playerid)
    {
    ClearAnimations(playerid);
    return 1;
    }


    Was ist falsch ?

  • Du musst die Animation nicht durch einen Timer extra clearen.


    Schreib die Animation einfach so, dann endet sie automatisch:


    ApplyAnimation(playerid,"PED","IDLE_CHAT",4.1,0,0,0,0,0);

    ast2ufdyxkb1.png


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

  • den er mehr als 6 hat, um 2 Sekunden länger die Animation hat ?

    Zum Beispiel so:



    new length = strlen(text);
    if(length > 6) length = (length-6)*500; //Du solltest nur pro Zeichen nur 500ms machen..bei 100 Zeichen...würde der ja über ne Minute da stehen und labern
    ApplyAnimation(playerid,"PED","IDLE_CHAT",4.1,0,0,0,0,2000+length);

    ast2ufdyxkb1.png


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

  • Kann man eigentlich in der Console Farben ausgeben ?

    //Edit: Gibt keinen Color parameter in der server.cfg kannst aber n rechtsklick machen und die Farbe auswählen xD


    Wenn du allerdings unterschiedliche Zeilen farbig ausgeben willst, brauchst du ein Plugin: http://forum.sa-mp.com/showthread.php?t=61796


    mfg. :thumbup:

    ast2ufdyxkb1.png


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

  • Zum Beispiel so:


    new length = strlen(text);if(length > 6) length = (length-6)*500; //Du solltest nur pro Zeichen nur 500ms machen..bei 100 Zeichen...würde der ja über ne Minute da stehen und labernApplyAnimation(playerid,"PED","IDLE_CHAT",4.1,0,0,0,0,2000+length);

    Klappt perfekt, danke. Jetzt noch eine Frage, welchen Parameter muss ich ändern, damit der Spieler sich während der Animation selbst bewegen kann ?

  • Klappt perfekt, danke. Jetzt noch eine Frage, welchen Parameter muss ich ändern, damit der Spieler sich während der Animation selbst bewegen kann ?

    In Animationen kann man sich grundsätzlich nicht frei bewegen. Es gibt Animation wo man läuft, da könnte man die FacingAngle vom Spieler z.B. ändern und dann kann man je nach Kamera Vektor ein laufen simulieren.


    Allerdings ist das normalerweise nicht der Fall. Das ist auch der Unterschied zu den SpecialActions. Mit denen kann man sich bewegen, mit Animationen nicht :)

    ast2ufdyxkb1.png


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

  • Hallo, ich habe meine ältere MySQL Version auf die aktuellste Version aktualisiert und habe nun ein Problem.



    stock DB_Check_Charakter(playerid,charid) //DB_Check_Charakter(playerid,charid)
    {
    new AccountID = DB_GetAccountID(playerid);
    printf("AccountID: %d",AccountID);
    new dbstring[256];
    format(dbstring, sizeof(dbstring), "SELECT ID FROM `"CHARAKTERTABLE"` WHERE AccountID = '%d' AND CHAR = '%d'", AccountID,charid);
    mysql_query(DB_Main,dbstring,true);
    new num_rows, num_fields;
    cache_get_data(num_rows, num_fields);
    printf(dbstring);
    printf("DB_Check_Charakter: %d | %d",num_rows,num_fields);
    if(num_rows == 1){return true;} else {return false;}
    }


    Er gibt hier immer nur 0 zurück obwohl die Abfrage laut Print stimmt auch die ID etc.
    Mit der älteren Version ging es auf der altmodischen Art.


    Hier die Print´s:

    Code
    [21:08:00] AccountID: 8
    [21:08:00] SELECT ID FROM `charakter` WHERE AccountID = '8' AND CHAR = '1'
    [21:08:00] DB_Check_Charakter: 0 | 0


    Der DB Ausschnitt:



    ====================================================
    Anmerkung:
    Bei der neueren Version hat er mir ständig den Fehler angezeigt:


    Code
    ....\a_mysql.inc(228) : error 017: undefined symbol "AMX_GetRelativeAddress"
    ....\a_mysql.inc(231) : error 017: undefined symbol "Callback_Array"

    Diese habe ich aber ausgeklammert.

    „Auge um Auge - und die ganze Welt wird blind sein.“
    - Mahatma Gandhi