Fraktionen auf MySQL Basis

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
  • Moin moin, ich brauche für meine Fraktionen einen kleinen Denkanstoss...
    Ich versuche jetzt z.B. den Spieler an seinem Fraktionsort Spawnen zu lassen welchen ich in MySQL speichern werde, da er im Spiel erstellbar sein sollte.
    Ich habe nun damit begonnen eine enumtabelle zu tippen, welche so aussieht:
    enum TeamDaten
    {
    pKasse, //Das Geld in der Fraktionskasse
    pSpawn, //Die Spawncoordinaten 000.0000,000.000,000.000
    pLeader, // Hier soll einzig und alleine der Leader der Fraktion eingetragen sein
    pMember, // Hier sollen alle Member durch ein "," getrennt gespeichert werden.
    pGeld1, //Geld Rang 1
    pGeld2, // Geld Rang 2
    pGeld3, // Geld Rang 3
    pGeld4 // Geld Leader wird durch Admin festgelegt.
    }
    new TeamInfo[MAX_PLAYERS][TeamDaten];


    Die Frage ist jetzt, wie ordne ich die Fraktion dem Spieler zu bzw. wie durchsuche ich alle Fraktionen nach dem Spielernamen?
    public OnPlayerSpawn(playerid)
    {
    SetPlayerSkin(playerid,SpielerInfo[playerid][pSkin]);
    SetPlayerPos(playerid,SpielerInfo[playerid][pposx],SpielerInfo[playerid][pposy],SpielerInfo[playerid][pposz]);
    return 1;
    }


    Gibt es eine effizientere Abfrage als eine solche?
    if(SpielerInfo[playerid][Mitglied] == 1 ||SpielerInfo[playerid][Leader] == 1)



    Und wie soll ich die Fraktion bei OnGameModeExit speichern, denn ich habe ja keinen Spielernamen dem ich die Daten zuordnen kann ^^

  • Ja, wenn du im Spielerenum einen Wert angibst, der die ID der Fraktion übermittelt. Danach kannst du dann diese ID benutzen um den Enum der selben anzusprechen.


    Mein CS:GO Server: 62.75.168.39:27016


    Ich bin so hungrig, dass ich vor lauter Durst nicht weiß, was ich rauchen soll - so müde bin ich!
    Freedom is just another word for 'Nothing left to lose'

  • Du gehst das komplett falsch an.



    enum TeamDaten
    {
    pID, //FraktionsID
    pKasse, //Das Geld in der Fraktionskasse
    pSpawn, //Die Spawncoordinaten 000.0000,000.000,000.000
    pLeader, // Hier soll einzig und alleine der Leader der Fraktion eingetragen sein
    pGeld1, //Geld Rang 1
    pGeld2, // Geld Rang 2
    pGeld3, // Geld Rang 3
    pGeld4 // Geld Leader wird durch Admin festgelegt.
    }
    new TeamInfo[MAX_FACTIONS[TeamDaten];


    Du legst für alle Fraktionen eine ID fest, welche dann als Schlüssel dient, um dem Spieler eine Fraktion zuzuordnen.


    1 wäre beispielsweise SAPD, 2 FBI, etc.


    Du lässt dann beim User im Account einfach diese ID speichern, so erübrigt sich das Auflisten der Mitglieder im Array.

  • Ja, wenn du im Spielerenum einen Wert angibst, der die ID der Fraktion übermittelt. Danach kannst du dann diese ID benutzen um den Enum der selben anzusprechen.



    Ich habe da ein Problem:

    Code
    error 017: undefined symbol "MAX_FACTIONS"


    Wie definiere ich MAX_FACTIONS ?

  • enum TeamDaten
    {
    pID, //FraktionsID
    pKasse, //Das Geld in der Fraktionskasse
    pSpawn, //Die Spawncoordinaten 000.0000,000.000,000.000
    pLeader, // Hier soll einzig und alleine der Leader der Fraktion eingetragen sein
    pGeld1, //Geld Rang 1
    pGeld2, // Geld Rang 2
    pGeld3, // Geld Rang 3
    pGeld4 // Geld Leader wird durch Admin festgelegt.
    }
    new TeamInfo[MAX_FACTIONS[TeamDaten];
    So wird es nicht funktionieren da:
    pSpawn ein Integer Wert ist und die Spawn Koordinaten aus 3 Punkten bestehen, welche als Float's deklariert werden müssen.
    pLeader wird auch nicht funktionieren da der Leader nur als SpielerID gespeichert werden würde.


    Versuch die Variante von Leijat,
    da wo du das Spieler Enum hast schreibst du noch 'pFraktion' oder so rein.
    Bei einem Invite gibst du diesem Wert dann die FraktionsID.
    Und so musst du nur abfragen, ob der Spieler die FraktionsID hat und nicht mit den beiden Abfragen.


  • Stimmt, total übersehen. ;)

  • Hab mal eine kleine Offtopic frage, gibt es beim SetPlayerScore eiggentlich einen Maximalwert den man geben kann oder könnte ich das Level des Spielers jetzt auch auf 1000 setzen?


    http://wiki.sa-mp.com/wiki/Limits


    Keinen, allerdings sollte dieser nicht den Wertebereich einer Integervariable übersteigen, wäre allerdings, soweit ich weiß, im Millionenbereich.


  • http://wiki.sa-mp.com/wiki/Limits


    Keinen, allerdings sollte diese nicht den Wertebereich einer Integervariable übersteigen, wäre allerdings, soweit ich weiß, im Millionenbereich.


    Danke, ich würde dann so den Skin und das Gehalt in der Fraktion zuweisen.
    z.B. alles zwischen Rang 3 und 5 bekommt Skin1 und Gehalt1


    Mittlerweile habe ich das Problem mit den Skins fast gelöst:
    stock FrakSkin(playerid,skin[])
    {
    new score = GetPlayerScore(playerid),skin;
    switch(score)
    {
    case 3,4,5,6: skin = pskin1;
    case 7,8,9,10: skin = pskin2;
    case 10<: skin = pskin3;
    return skin;
    }
    }


    public OnPlayerSpawn(playerid)
    {
    if(SpielerInfo[playerid][pFraktion]== 0)
    {
    SetPlayerSkin(playerid,SpielerInfo[playerid][pSkin]);
    SetPlayerPos(playerid,SpielerInfo[playerid][pposx],SpielerInfo[playerid][pposy],SpielerInfo[playerid][pposz]);
    }
    else
    {
    if(GetPVarInt(playerid,"Gestorben") == 1)
    {
    SetPlayerSkin(playerid,FrakSkin[skin]);
    SetPlayerPos(playerid,TeamInfo[SpielerInfo[playerid][pFraktion]][px],TeamInfo[SpielerInfo[playerid][pFraktion]][py],TeamInfo[SpielerInfo[playerid][pFraktion]][pz]);
    DeletePVar(playerid,"Gestorben");
    }
    else
    {
    SetPlayerPos(playerid,SpielerInfo[playerid][pposx],SpielerInfo[playerid][pposy],SpielerInfo[playerid][pposz]);
    }
    }
    return 1;
    }

  • Beitrag von Kinimod ()

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Mit dem Stock FrakSkin möchte ich das Spielerlevel abfragen, anhand dessen möchte ich das dass Script anhand von switch bei bestimmten Leveln die Variable "pskin1" , "pskin2" oder "pskin3"
    zurückgibt, mit der Variable pskin1, 2 oder 3 möchte ich dann unter onplayerspawn den Skin zuweisen indem ich die Variable bei
    SetPlayerSkin(playerid,FraktSkin[skin]);
    Eintrage......



    //Edit:
    Soweit habe ich nicht gedacht, ich habe mir einen Fehler geleistet...
    SetPlayerSkin(playerid,TeamInfo[SpielerInfo[playerid][pFraktion]][FraktSkin(skin)]);
    Denn das Spiel kennt pskin1 ja nicht als Skin id ^^

  • stock FrakSkin(playerid,skin[])
    {
    new score = GetPlayerScore(playerid),skin; //634
    switch(score)
    {
    case 3,4,5,6: skin = pskin1;
    case 7,8,9,10: skin = pskin2;
    case 10<: skin = pskin3;
    return skin;
    }
    }


    Code
    C:\Users\Sven Meyer\Desktop\SAMP-Server\gamemodes\script.pwn(167) : error 017: undefined symbol "skin"
    pwn(634) : warning 219: local variable "skin" shadows a variable at a preceding level
    pwn(637) : error 017: undefined symbol "pskin1"
    pwn(638) : error 017: undefined symbol "pskin2"
    pwn(639) : error 029: invalid expression, assumed zero
    pwn(639) : error 017: undefined symbol "pskin3"
    pwn(640) : error 002: only a single statement (or expression) can follow each "case"
    pwn(640) : warning 215: expression has no effect
    pwn(632) : warning 203: symbol is never used: "skin"
    pwn(632 -- 642) : error 054: unmatched closing brace ("}")


    SetPlayerSkin(playerid,TeamInfo[SpielerInfo[playerid][pFraktion]][FrakSkin(skin)]); //167


    Code
    (167) : error 017: undefined symbol "skin"
  • Zitat

    local variable "skin" shadows a variable at a preceding level


    bedeutet: Du hast auf gleicher Zugriffsebene bereits eine Variable "skin" deklariert.


    Zugriffsebene bedeutet, dass die Variable dort zugreifbar ist, da Du nur Variablen dort verwenden kannst, wo sie auch zugreifbar sind, also entweder eine globale Variable oder eine Variable, welche in dieser Funktion genutzt wird.
    Und da wohl global schon eine Variable "skin" existiert, kommt eine Warnung.


    Zitat

    pwn(637) : error 017: undefined symbol "pskin1"
    pwn(638) : error 017: undefined symbol "pskin2"


    Es wurden nie Variablen deklariert, die pskin1 und pskin2 heißen.


    Zitat

    pwn(639) : error 029: invalid expression, assumed zero


    case 10<: skin = pskin3;


    was macht das Vergleichszeichen "<" dort? Das ist ein Syntaxfehler und somit ein ungültiger Ausdruck.


    Zitat

    error 002: only a single statement (or expression) can follow each "case"
    pwn(640) : warning 215: expression has no effect


    Ich gehe mal davon aus, dass es sich dabei um eine Nachwirkung der ersten Warnung handelt.