/sms failt: SMS wird nur an ID '0' gesendet ...

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.


    Kurz und knapp: ich habe ein SMS System in MySQL geschrieben und die SMSen werden nur an ID 0 gesendet...


    Code:



    ocmd:sms(playerid,params[])
    {
    new number,targetid,target[256],player[MAX_PLAYER_NAME],string[256],text[64];
    if(!PhoneState[playerid])return SendClientMessage(playerid,COLOR_RED,"Dein Handy ist ausgeschaltet!");
    if(sscanf(params,"is",number,text))return SendClientMessage(playerid,0xFFA300FF,"Benutzung: /sms <Telefonnummer> <Text>");
    if(GetPlayerMoney(playerid) <= 5)return SendClientMessage(playerid,COLOR_RED,"Dein Guthaben ist leer, du kannst keine SMS mehr versenden!");
    target = mysql_GetStringI("phoneinfos","name","number",number);
    targetid = GetPlayerID(target);
    GetPlayerName(playerid,player,sizeof(player));
    GetPlayerName(targetid,target,sizeof(target));
    new Float:xm, Float:ym, Float:zm,maxplayers=GetMaxPlayers();
    if(GetPlayerPos(playerid,xm,ym,zm))
    {
    for(new i=0;i<maxplayers;i++){
    if(IsPlayerConnected(i) && (i==playerid || IsPlayerInRangeOfPoint(i,20,xm,ym,zm))) {
    new name[MAX_PLAYER_NAME],str[256];
    GetPlayerName(playerid,name,sizeof(name));
    format(str,sizeof(str),"* %s nimmt sein Handy raus.",name);
    SendClientMessage(i,0xC2A2DAFF,str);
    }
    }
    }
    if(!IsPlayerConnected(targetid))return SendClientMessage(playerid,COLOR_RED,"Senden der Nachricht fehlgeschlagen!");
    if(!PhoneState[targetid])return SendClientMessage(playerid,COLOR_RED,"Dieser Spieler hat sein Handy ausgeschaltet!");
    PlayerPlaySound(playerid, 1150, 0.0, 0.0, 0.0);
    GivePlayerMoney(playerid,-5);
    format(string,sizeof(string),"SMS: %s, Empfänger: %s (%i)",text,target,number);
    SendClientMessage(playerid,0xFFFF00FF,string);
    format(string,sizeof(string),"SMS: %s, Absender: %s (%i)",text,player,mysql_GetInt("phoneinfos","number","name",player));
    SendClientMessage(targetid,0xFFFF00FF,string);
    printf("[sms] %s (%s -> %s)",text,player,target);
    return 1;
    }


    Code
    [14:28:24] [chat] [Gredsoft]: Schreib Marti mal eine SMS (/sms 8112 Blabla)[14:28:31] [sms] test (Timo_Sacred -> Gredsoft)[14:28:35] [chat] [Timo_Sacred]: geklappt

    Spoiler anzeigen
    Meine Nummer: 1337, die vom anderen: 8112... Er hat /sms 8112 eingegeben und die SMS kommt an meine Nummer. -.-


    Screen:


    (Yeah, Telefonnummer 1337 ftw o.O)


    Grüße
    Gredsoft


    (Struktur der Tabelle 'phoneinfos': name - number)

  • if(sscanf(params,"ds",number,text))


    das muss doch ein "d" sein, oder irre ich mich?


    ach, und warum lässt du es aus einer DB auslesen?

    Ich nehme immer i.. Ist ja eine Nummer?


    Ich habe das in MySQL, was daran so falsch / schwer? Müsste doch auch gehen? 8|


    H4rd_B4se

  • Du kannst doch auch einfach aus eine Schleife auslesen, oder nicht?

    Was meinst du? Dafür habe ich ja den Stock "GetPlayerID": H4rd_B4se



    stock GetPlayerID(const Name[])
    {
    for(new i; i<MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i)) {
    new pName[MAX_PLAYER_NAME];
    GetPlayerName(i, pName, sizeof(pName));
    if(strcmp(Name, pName, true)==0) {
    return i;
    }
    }
    }
    return 1;
    }

  • ach quatsch, was laber ich :D
    hab mich grad voll verwirrt :wacko:
    ich kapier nicht, warum du es mit MySQL machst, einfach mit einer Schleife wär doch einfacher?

    Achso! Genau! Gute Idee! Mach ich mal grad. xD


    H4rd_B4se So müsst's gehen, oder:



    ocmd:sms(playerid,params[])
    {
    new number,targetid,target[MAX_PLAYER_NAME],player[MAX_PLAYER_NAME],string[256],text[64];
    if(!PhoneState[playerid])return SendClientMessage(playerid,COLOR_RED,"Dein Handy ist ausgeschaltet!");
    if(sscanf(params,"is",number,text))return SendClientMessage(playerid,0xFFA300FF,"Benutzung: /sms <Telefonnummer> <Text>");
    if(GetPlayerMoney(playerid) <= 5)return SendClientMessage(playerid,COLOR_RED,"Dein Guthaben ist leer, du kannst keine SMS mehr versenden!");
    targetid = 999999;
    for(new i = 0; i < MAX_PLAYERS; i++) {
    new tn[MAX_PLAYER_NAME];
    GetPlayerName(i,tn,sizeof(tn));
    if(mysql_GetInt("phoneinfos","number","name",tn) == number) {
    targetid = i;
    }
    }
    GetPlayerName(playerid,player,sizeof(player));
    GetPlayerName(targetid,target,sizeof(target));
    new Float:xm, Float:ym, Float:zm,maxplayers=GetMaxPlayers();
    if(GetPlayerPos(playerid,xm,ym,zm))
    {
    for(new i=0;i<maxplayers;i++){
    if(IsPlayerConnected(i) && (i==playerid || IsPlayerInRangeOfPoint(i,20,xm,ym,zm))) {
    new name[MAX_PLAYER_NAME],str[256];
    GetPlayerName(playerid,name,sizeof(name));
    format(str,sizeof(str),"* %s nimmt sein Handy raus.",name);
    SendClientMessage(i,0xC2A2DAFF,str);
    }
    }
    }
    if(targetid == 999999)return SendClientMessage(playerid,COLOR_RED,"Senden der Nachricht fehlgeschlagen!");
    if(!IsPlayerConnected(targetid))return SendClientMessage(playerid,COLOR_RED,"Senden der Nachricht fehlgeschlagen!");
    if(!PhoneState[targetid])return SendClientMessage(playerid,COLOR_RED,"Dieser Spieler hat sein Handy ausgeschaltet!");
    PlayerPlaySound(playerid, 1150, 0.0, 0.0, 0.0);
    GivePlayerMoney(playerid,-5);
    format(string,sizeof(string),"SMS: %s, Empfänger: %s (%i)",text,target,number);
    SendClientMessage(playerid,0xFFFF00FF,string);
    format(string,sizeof(string),"SMS: %s, Absender: %s (%i)",text,player,mysql_GetInt("phoneinfos","number","name",player));
    SendClientMessage(targetid,0xFFFF00FF,string);
    printf("[sms] %s (%s -> %s)",text,player,target);
    return 1;
    }


    (Unsauber mit targetid = 999999? o.O)

    Einmal editiert, zuletzt von Gredsoft ()

  • Eine unthreaded Query pro Spieler in einer Schleife würde deinen Server bei mehreren Spielern zum laggen bringen.
    Viel besser könntest du den Namen direkt über MySQL abfragen und schauen, ob der Spieler online ist.
    Oder die lässt die Nummer auslesen und an eine Variable übergeben, während der jeweilige Spieler sich einloggt.


    Wenn dein komplettes Script so geschrieben wurde, wird es von MySQL Querys gekillt. :D


    Grüße

  • Wenn dein komplettes Script so geschrieben wurde, wird es von MySQL Querys gekillt. :D

    Ja, es ist so geschrieben. Ist das etwa der Grund, wieso es immer beim Connecten oder bei anderen Vorgängen mit MySQL jeden Spieler zum Laggen bringt? X(


    Wie kann ich das umschreiben? Habe mit Threads oder so keine Ahnung... D:


    // EDIT: Ah, kk. #define THREAD_blabla, OnQueryFinish etc. :/


    Danke für deine Hilfe tonyalva ^^