Beiträge von Mostey

    Wenn ich eine Leiste unten mit den Stats ausgeben möchte, wie mache ich das dann am besten? Bin jetzt so weit, das die Daten zwar korrekt für jeden Spieler angezeigt werden, allerdings immer nur für einen. Wenn der Nächste connected, verschwindet die Statsleiste bei mir und taucht bei demjenigen auf, der sich frisch mit dem Server verbunden hat. Wie mache ich das für alle?



    new Text:textdrawname[MAX_PLAYERS];
    new Text:textdrawlevel[MAX_PLAYERS];
    new Text:textdrawkills[MAX_PLAYERS];
    new Text:textdrawdeaths[MAX_PLAYERS];
    new Text:textdrawkd[MAX_PLAYERS];
    new Text:textdrawexp[MAX_PLAYERS];


    stock SetPlayerTextDraws(playerid)
    {
    new namestring[256],
    levelstring[256],
    killsstring[256],
    deathsstring[256],
    kdstring[256],
    expstring[256],
    lcnstring[256],
    yakustring[256];


    format(namestring,sizeof(namestring),"Name: %s",PlayerName(playerid));
    TextDrawSetString(textdrawname[playerid],namestring);
    TextDrawShowForPlayer(playerid,textdrawname[playerid]);


    format(levelstring,sizeof(levelstring),"Level: %d",GetPVarInt(playerid,"Level"));
    TextDrawSetString(textdrawlevel[playerid],levelstring);
    TextDrawShowForPlayer(playerid,textdrawlevel[playerid]);


    format(killsstring,sizeof(killsstring),"Kills: %d", GetPVarInt(playerid,"Kills"));
    TextDrawSetString(textdrawkills[playerid],killsstring);
    TextDrawShowForPlayer(playerid,textdrawkills[playerid]);


    format(deathsstring,sizeof(deathsstring),"Deaths: %d", GetPVarInt(playerid,"Deaths"));
    TextDrawSetString(textdrawdeaths[playerid],deathsstring);
    TextDrawShowForPlayer(playerid,textdrawdeaths[playerid]);


    format(kdstring,sizeof(kdstring),"K/D: %0.2f",Float:GetPVarInt(playerid,"Kills") / Float:GetPVarInt(playerid,"Deaths"));
    TextDrawSetString(textdrawkd[playerid], kdstring);
    TextDrawShowForPlayer(playerid,textdrawkd[playerid]);


    format(expstring,sizeof(expstring),"EXP: %d",GetPVarInt(playerid,"EXP"));
    TextDrawSetString(textdrawexp[playerid], expstring);
    TextDrawShowForPlayer(playerid,textdrawexp[playerid]);

    format(lcnstring,sizeof(lcnstring),"La Cosa Nostra: %d",lcnpunkte);
    TextDrawSetString(textdrawlcn, lcnstring);
    TextDrawShowForAll(textdrawlcn);


    format(yakustring,sizeof(yakustring),"Yakuza: %d",yakuzapunkte);
    TextDrawSetString(textdrawyaku, yakustring);
    TextDrawShowForAll(textdrawyaku);


    return 1;
    }


    unter OnPlayerSpawn ist der Methodenaufruf: SetPlayerTextDraws(playerid)


    -> Wenn Spieler spawnt, sollen die Textdraws angezeigt werden.


    unter OnPlayerDeath ist dieser für die playerid und killerid: SetPlayerTextDraws(killerid); SetPlayerTextDraws(playerid);


    Was stimmt hier nicht? Normalerweise müsste das doch funktionieren...

    Servus, hab jetzt mal nach einiger Zeit Pause wieder das Scripten angefangen und mir ist direkt etwas komisches aufgefallen, als ich die Scriptauswahl erstellen wollte.


    Und zwar ist es ja so, dass dort die Spielerposition (Modelposition) und die Kameraposition angegeben werden, somit habe ich diese rausgesucht und dementsprechend eingesetzt. Nur die Kamera schaut nur leider jetzt in die falsche Richtung und der Skin natürlich auch. Hab mal überprüft ob das an den Koordinaten liegt, kann aber eigentlich nicht sein. Und soweit ich weiß, bringt die FacingAngle dort auch nicht viel, da sie doch nur die Richtung des Modelkopfes angibt, oder?


    Ist das neu? Damals habe ich das Problem nämlich nicht gehabt, da hat der Skin immer in die Richtung geschaut, wie ich's gesaved habe.

    Scheint wohl nicht das Problem zu sein, habe deinen Stock mal eingefügt und die Fehler ausgebessert, im String eingefügt und er kann den Rangnamen immernoch nicht auslesen.


    Hier nochmal den Stock den ich jetzt drinnen habe:
    stock RankName(playerid)
    {
    new rname[20];
    switch(GetPVarInt(playerid,"Fraktion"))
    {
    case 0:{rname="Kein";}
    case 1:
    {
    switch(GetPVarInt(playerid,"Rank"))
    {
    case 0:{rname="Döner-Ali";}
    case 2:{rname="Blabla";}
    case 3:{rname="Verrückter";}
    case 4:{rname="Schrumpfhirn";}
    case 5:{rname="Mörder";}
    case 6:{rname="Muhkuh";}
    }
    }
    }
    return 0;
    }


    Und hier der Auszug aus dem /f Befehl:
    if(sscanf(params, "s", text))return SendClientMessage(playerid, 0x0087FFFF, "Benutzung: /f [TEXT]");
    for(new i = 0; i < GetMaxPlayers(); i++)
    {
    if(IsPlayerConnected(i))
    {
    if(GetPVarInt(playerid, "Fraktion") == GetPVarInt(i, "Fraktion"))
    {
    new string[128];
    format(string,sizeof(string),"***%s %s: %s***",RankName(playerid), SpielerName(playerid),text);
    SendClientMessage(i, tuerkis, string);
    }
    }



    PS: Nette Rangnamen 8)


    Du musst doch irgendwo auch "FrakName" oder so haben ... nimm das mal dazu.
    Aber bitte vorher erst schauen..


    Ja habe ich, wenn ich das dazu nehme gehts aber trotzdem nicht.


    Hab das ganze mal mit %d (also als Zahl) gemacht und dort liest er dann eine 6 aus, die wird im Fraktionschat auch angezeigt, wenn ich das %d in %s umändere, wird nichts angezeigt. (Was ja auch klar ist weil ich in der Userdatei unter Rang eine 6 stehen habe. Die Rangnamen sind bei mir oben definiert, werden aber dann trotzdem nicht ausgelesen.


    Wie mache ich das denn, das er mit dini anstatt eine Zahl (in dem Fall 6) ein Wort bzw. Rangnamen schreibt?

    Moin, würde gerne zusätzlich im Fraktionschat einer Fraktion den Rangnamen anzeigen lassen, dies funktioniert bei mir aber leider nicht.


    ocmd:f(playerid,params[])
    {
    if(GetPVarInt(playerid,"Fraktion") == 0)return SendClientMessage(playerid, 0x0087FFFF, "Du bist in keiner Fraktion!");
    new text[128];
    if(sscanf(params, "s", text))return SendClientMessage(playerid, weiss, "Benutzung: /f [TEXT]");
    for(new i = 0; i < GetMaxPlayers(); i++)
    {
    if(IsPlayerConnected(i))
    {
    if(GetPVarInt(playerid, "Fraktion") == GetPVarInt(i, "Fraktion"))
    {


    new string[128];
    format(string,sizeof(string),"***%s %s: %s***",GetPVarInt(playerid,"Rang"), SpielerName(playerid),text);
    SendClientMessage(i, tuerkis, string);
    }
    }
    }
    return 1;
    }


    stock Rang (playerid,frakid)
    {
    if(GetPVarInt(playerid,"Rang")==frakid) return 1;
    return 0;
    }


    //Fraktionen + Ränge
    //Taxi
    #define taxirangname1 "Lehrling"
    #define taxirangname2 "Fahrer"


    Ich habe mich in der .ini manuell auf Rang 1 gesetzt und bei mir erscheint der Rang nicht. Das selbe mit Rang 2.


    Danke für deine schnelle Antwort, der Fehler besteht aber weiterhin :S


    Funktioniert wunderbar, Danke!


    Mhm, versuche gerade einen Umgebungschat zu erstellen der mit /uc eingeschaltet werden soll und wenn man nochmal /uc eingibt wieder ausgeschaltet werden soll.
    Wie immer bekomme Ich auch dies nicht ohne eure Hilfe hin :(


    Denn sobald ich Ingame /uc eingebe und dann etwas schreibe sieht der Chat nämlich so aus wenn ich ein simples "hallo" eingebe:


    (([UC]: Mostey: ))
    Mostey: hallo



    new uc[MAX_PLAYERS]; // variable is oben im script


    public OnPlayerText(playerid, text[])
    {
    if(uc[playerid] == 1)
    {
    new string[256];
    new Float:x, Float:y, Float:z;
    new text1[256];
    GetPlayerPos(playerid,x,y,z);
    {
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(IsPlayerInRangeOfPoint(i,25,x,y,z))
    {
    format(string,sizeof string,"(( [UC]: %s: %s {FFFFFF}))",SpielerName(playerid),text1);
    SendClientMessage(i,weiss,string);
    }
    }
    }
    }
    return 1;
    }


    public OnPlayerCommandText(playerid, cmdtext[])
    {
    if (strcmp("/uc", cmdtext, true, 10) ==0)
    {
    if (uc[playerid] == 0)
    {
    uc[playerid] = 1;
    SendClientMessage(playerid,gelb,"Du hast den Umgebungschat eingeschaltet");
    }
    else if (uc[playerid] == 1)
    {
    uc[playerid] = 0;
    SendClientMessage(playerid,gelb,"Du hast den Umgebungschat ausgeschaltet");
    }
    return 1;
    }




    EDIT: Variante 2, Ergebnis is das selbe:

    Spoiler anzeigen
    if (strcmp("/uc", cmdtext, true, 10) ==0)
    {
    if (uc[playerid] == 0)
    {
    SendClientMessage(playerid,gelb,"Du hast den Umgebungschat eingeschaltet");
    new string[256];
    new Float:x, Float:y, Float:z;
    new text1[256];
    GetPlayerPos(playerid,x,y,z);
    {
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(IsPlayerInRangeOfPoint(i,25,x,y,z))
    {
    format(string,sizeof string,"(( [UC]: %s: %s {FFFFFF}))",SpielerName(playerid),text1);
    SendClientMessage(i,weiss,string);
    uc[playerid] = 1;
    }
    }
    }
    }
    else if (uc[playerid] == 1)
    {
    uc[playerid] = 0;
    SendClientMessage(playerid,gelb,"Du hast den Umgebungschat ausgeschaltet");
    }
    return 1;
    }

    @Travelga
    Return vergessen?

    Mostey
    Du kannst im OnPlayerEnterVehicle Calllback kein RemovePlayerFromVehicle bzw IsPlayerInVehicle verwenden, weil der Spieler ja noch nicht im Fahrzeug drinnen ist wenn das Callback aufgerufen wird.
    Setzt das unter OnPlayerStateChange rein und überprüfe ob newstate == PLAYER_STATE_DRIVER ist, dann sollte das klappen.


    Danke, funktioniert nun!


    Nun habe ich mal einen Minijob erstellt bei dem Checkpoints abgefahren werden müssen. Immer wenn er in einen Checkpoint reinfährt soll er für 2 Sekunden gefreezed werden und einen Zufallsbetrag zwischen 40-80$ bekommen.


    Das ganze funktioniert mit Timer wunderbar bei mir, die anderen (Tester) werden aber nur gefreezed und danach nicht mehr entfreezed. Hab keine Ahnung wie ich das beheben soll.
    public vom Timer
    public lieferantbeladen(playerid)
    {
    TogglePlayerControllable(playerid,1);
    return 1;
    }


    public OnPlayerEnterCheckpoint
    if(Checkpoint[playerid] == 1) //get punkt arrive und danach cp1
    {
    if(GetPlayerVehicleID(playerid) < 6)
    {
    SendClientMessage(playerid,gelb,"Paketdienst HQ: Dein Lieferwagen wird nun mit Paketen beladen!");
    TogglePlayerControllable(playerid,0);
    SetTimer("lieferantbeladen",5000,true);
    DisablePlayerCheckpoint(playerid);
    SetPlayerCheckpoint(playerid,-2047.5917,-97.9564,35.1641,4);
    GameTextForPlayer(playerid,"~y~Fahrschule",3000,6);
    Checkpoint[playerid] = 2;
    }
    else
    {
    SendClientMessage(playerid,rot,"Du brauchst einen Lieferwagen!");
    }
    }


    für den Zufallsbetrag habe ich jetzt eine Variable erstellt:

    new lohn = random(80);


    Dann bekommt er aber einen Zufallsbetrag zwischen 0 und 80$ was ich eigentlich nicht möchte. Wie gebe ich denn eine bestimmte "Spanne" in einer Variable an?

    Ich möchte das der Spieler nicht in das Fahrzeug einsteigen kann wenn er nicht im Dienst ist, bekomme das aber leider nicht hin. (Er geht durch ein Pickup in den Dienst)


    public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
    {
    if(IsPlayerInVehicle(playerid,498))
    {
    if(Dienst2[playerid] == 0)
    {
    RemovePlayerFromVehicle(playerid);
    SendClientMessage(playerid,GELB,"Du bist nicht im Dienst!");
    }


    else if(Dienst2[playerid] == 1)
    {
    SendClientMessage(playerid,ROT,"Fahre nun die Checkpoints ab");
    }
    }
    return 1;
    }


    Das Dienstpickup
    if(pickupid==dienstsps)
    {
    if(Dienst2[playerid] == 0)
    {
    new string[128];
    SetPlayerColor(playerid,GELB);
    format(string,sizeof(string),"PS HQ: %s hat den Dienst als Lieferant begonnen",SpielerName(playerid));
    SendClientMessageToAll(TUERKIS,string);
    Dienst2[playerid] = 1;
    }
    else if(Dienst2[playerid] ==1)
    {
    new string[128];
    SetPlayerColor(playerid,ROT);
    format(string,sizeof(string),"PS HQ: %s hat den Dienst als Lieferant beendet",SpielerName(playerid));
    SendClientMessageToAll(TUERKIS,string);
    Dienst2[playerid] = 0;
    }
    }


    mfg

    Benutze am besten einfache For-Schleife.
    http://wiki.sa-mp.com/wiki/For#for


    Solltest du damit nicht zurechtkommen Adde mich mal in Skype.
    Das kann man alles schlecht erklären, ohne endlos-lange Schreiben zu müssen ;)


    Danke für den Link, hab mir dazu aber noch ein anderes Tutorial durchgelesen und bin jetzt auf das gewünschte Ergebnis gekommen.


    Nebenbei könntest du mir eventuell auch bei einem anderen Problem weiterhelfen: Ich habe einen Arrestbefehl erstellt, d.h. man kann mit /arrest ID Zeit Grund einen Spieler für x Minuten einsperren. Der Befehl funktioniert wunderbar, allerdings möchte ich den entsprechenden Timer einbauen, damit der Spieler dann nach diesen x Minuten für die er eingesperrt wurde automatisch zu einer gewünschten Stelle teleportiert wurde.


    Der Befehl:
    ocmd:arrest(playerid, params[])
    {
    new Zeit, pID,string[128];
    new Grund;
    if(sscanf(params,"uds",pID,Zeit, Grund)) return SendClientMessage(playerid,ROT,"Benutze: /arrest ID Zeit Grund");
    if(IsPlayerConnected(pID))
    {
    if(IsPlayerInRangeOfPoint(playerid,10,257.4440,86.2518,1002.4453))
    {
    format(string,sizeof(string), "Verbrecher %s wurde von %s für %d Minuten wegen %s eingesperrt",SpielerName(pID),SpielerName(playerid),Zeit, Grund);
    SendClientMessageToAll(ROT,string);
    SetPlayerPos(pID,264.0817,77.4369,1001.0391);
    SetPlayerInterior(pID,6);
    SetPlayerFacingAngle(pID,273.6652);
    SetCameraBehindPlayer(pID);
    }
    else
    {
    SendClientMessage(playerid, ROT, "Du bist nicht am Arrest Point");
    }
    }
    else
    {
    SendClientMessage(playerid,ROT,"Diesen Spieler gibt es nicht");
    }
    return 1;
    }


    mfg

    Du musst einmal eine Schleife durch alle Spieler laufen lassen und dann abfragen.
    Wenn du ein Admin-System in deinem Script hast, die Anfrage anpassen, da IsPlayerAdmin nur true ausgibt, wenn der Spieler ein Rcon-Admin ist.


    Und wie mache ich das am besten? Adminsystem habe ich noch nicht eingebaut, möchte ich auch vorerst nicht. Mir geht es erstmal darum das er dort angezeigt wird, wenn er als Rcon Admin eingeloggt ist.


    Hoffe das ist nicht untergegangen :S

    Moin, ich mal wieder, bin noch an den Strings hängen geblieben und habe mich mal an einem /admins Befehl versucht.


    Ergebnis war das:
    if (strcmp("/admins", cmdtext, true, 10) ==0)
    {
    new Player[MAX_PLAYER_NAME],string[128];
    if(IsPlayerAdmin(playerid))
    GetPlayerName(playerid,Player,sizeof(Player));
    format(string,sizeof(string), "Admins online: %s",Player);
    SendClientMessage(playerid,ROT,string);
    return 1;
    }


    Ingame funktioniert das zum Teil, wenn ich nicht als rcon Admin eingeloggt bin kommt nur "Admins online:", wenn ich eingeloggt bin "Admins online: Mostey"
    Andere sehen aber dann meinen Namen nicht, wenn ich als rcon Admin eingeloggt bin, bei denen kommt dann garnichts unter "Admins online"


    Bitte auch erklären was ich falsch gemacht habe, möchte das ja schließlich auch lernen und nicht alles nur kopieren und einfügen.
    Da hätte ich auch noch eine Frage, wie lasse ich denn mehrere Admins anzeigen? Hab ja im String nur ein %s drinn, was eigentlich nur einen Spieler angibt, oder lieg ich da falsch?


    Danke übrigens an die beiden anderen die mir letztens bei dem /dienst Befehl geholfen haben :)

    Hab das mal mit deiner Version probiert jedoch geht das auch nicht, kann immernoch nicht aus dem Dienst gehen bzw. es kommt keine Meldung und der Skin sowie die Farbe wird nicht zurückgesetzt.


    Wobei ich deine Version um einiges übersichtlicher und verständlicher finde. Danke :)

    Danke für die Korrektur, nun wird der Name auch ausgelesen.
    Im Umkleideraum bekomme ich aber 2 mal hinternander die Dienstmeldung und wenn ich den Befehl nochmal eingebe, wechselt er die Farbe und Skin nicht und ich bekomm keine Meldung das ich aus dem Dienst bin.


    Bin mir relativ sicher das es an einem return 1 liegt, nur weiß ich nicht wie ich das Problem selbst beheben soll.


    if (strcmp("/dienst", cmdtext, true, 10) ==0)
    {
    if(IsPlayerInRangeOfPoint(playerid,10,256.2878,75.3668,1003.6406))
    {
    new name2[MAX_PLAYER_NAME], string[128];
    GetPlayerName(playerid, name2, sizeof(name2));
    format(string, sizeof(string), "Beamter %s ist nun im Dienst", name2);
    SendClientMessageToAll(ROT,string);
    SetPlayerColor(playerid,PINK);
    SetPlayerSkin(playerid,266);
    }
    else
    {
    SendClientMessage(playerid,PINK,"Du bist nicht im Umkleideraum");
    return 1;
    }
    if(!dienst[playerid]) // ! bedeutet, dass es gleich 0 ist
    {
    new name2[MAX_PLAYER_NAME], string[128];
    GetPlayerName(playerid, name2, sizeof(name2));
    format(string, sizeof(string), "Beamter %s ist nun im Dienst", name2);
    SendClientMessageToAll(ROT,string);
    SetPlayerColor(playerid,PINK);
    SetPlayerSkin(playerid,266);
    }
    else
    {
    new name2[MAX_PLAYER_NAME], string[128];
    GetPlayerName(playerid, name2, sizeof(name2));
    format(string, sizeof(string), "Beamter %s ist nun nicht mehr im Dienst", name2);
    SendClientMessageToAll(ROT,string);
    SetPlayerColor(playerid,ROT);
    SetPlayerSkin(playerid,0);
    }
    return 1;


    }

    Danke, geht nun :)


    Möchte nun zusätzlich den Befehl "/dienst" mit einbringen, wenn derjenige den Befehl in einer bestimmten Range eingibt, soll die Namensfarbe in Pink geändert werden und eine Meldung an alle Spieler erfolgen, das Person x nun im Dienst ist. Das mit der Namensfarbe funktioniert auch, nur sobald ich den Befehl eingebe kommt in der Meldung nur "Beamter ist im Dienst", wo eigentlich der Name dazwischen sollte.


    if (strcmp("/dienst", cmdtext, true, 10) ==0)
    {
    if(IsPlayerInRangeOfPoint(playerid,10,256.2878,75.3668,1003.6406))
    {
    new name2,string[128];
    name2 = GetPlayerName(playerid,string,sizeof(string));
    format(string, sizeof(string), "Beamter %s ist nun im Dienst", name2);
    SendClientMessageToAll(ROT,string);
    SetPlayerColor(playerid,PINK);
    }
    else
    {
    SendClientMessage(playerid,PINK,"Du bist nicht im Umkleideraum");
    }
    return 1;


    }


    Und wie bringe ich das mit ein wenn die Farbe wieder auf die vorherige Farbe zurückgesetzt wird wenn er den selben Befehl nochmal eingibt?


    mfg

    Moin


    Bin derzeit dabei pawn zu lernen und hab diesbezüglich ein kleines Anliegen: Ich möchte das ich mich mit dem Befehl /heal im LSPD in einem Bestimmten Punkt bzw in einem bestimmten Raum auf 100 HP healen lassen kann. Wenn ich nicht in dem Raum im LSPD bin soll eine Meldung kommen das ich mich nicht im Gunshop befinde. Ansonsten soll eine Meldung kommen die besagt, das ich mich ausgerüstet habe.


    Wenn ich jetzt aber /heal eingebe, kommen zwar die richtigen Meldungen, ich werde aber gehealt wenn ich mich nicht in dem Raum im LSPD befinde. Und wenn ich mich in dem Raum befinde werde ich nicht gehealt.


    So, hier der Code:
    if (strcmp("/heal", cmdtext, true, 10) ==0)
    {
    {
    if(IsPlayerInRangeOfPoint(playerid,10,256.2878,75.3668,1003.6406)) SendClientMessage(playerid,ROT,"Du hast dich ausgerüstet");
    SetPlayerHealth(playerid,100);
    return 1;
    }


    if(!IsPlayerInRangeOfPoint(playerid,10,256.2878,75.3668,1003.6406)) SendClientMessage(playerid,ROT,"Du bist nicht im Gunshop");
    return 1;
    }


    mfg