Beiträge von Kaliber

    Einmal nur kurz am Rande, wie kann ich denn ein Wort vom Textdraw farbig machen?
    Habe es schon mit einem HTML Code versucht, so wie es auch bei Messages klappt, geht aber nicht.


    Ne nicht mit HTML sondern einfach so:


    Code
    ~r~    rot
    ~g~    grün
    ~b~    blau
    ~w~    weiß
    ~y~    gelb
    ~p~    pink
    ~l~     schwarz
    ~h~    hellere Farbe
    ~n~    Absatz


    mfg. :thumbup:

    Wie sieht es denn aus, wenn ich das ganze in einer Schleife mache? Dann wird der Timer ja auch immer wieder gesetzt...


    Das ist nicht für Schleifen ausgelegt...nur für Localen Code der 1. Ebene :D


    Genauso if-Bedingungen oder ähnliches ist hier nicht möglich...man muss dafür dann halt eine neue Instanz aufrufen.


    mfg. :thumbup:

    Guten Mittag euch allen,


    ich habe mich mal ein bisschen umgeschaut und gesehen, dass einige Personen nach einer sleep Funktion in Pawn suchen.
    Doch wie sie festgestellt haben gibt es sowas wie in Java (Thread.sleep(1000);) nicht...


    Also habe ich mal so eine Funktion geschrieben:


    1. Beispiele:


    Also, so funktioniert die Funktion:


    public OnGameModeInit() //Mal als Beispiel genommen
    {
    print("test"); //Wird normal ohne Verzögerung aufgerufen
    sleep(1000)<a>; //Hier findet ein Timeout von 1000ms statt
    print("test2"); //Dann wird das geprintet
    sleep(1000)<b>; //Wieder Timeout von 1000ms
    print("test3"); //und dann wird geprintet
    return 1;
    }


    //Oder wenn man Parameter noch übergeben will
    public OnPlayerConnect(playerid) //Mal als Beispiel
    {
    SendClientMessage(playerid,-1,"hi");
    pSleep(1000)<a,"i",playerid>; //Unten ist eine nähere Erklärung
    SendClientMessage(playerid,-1,"hallo nach 1000ms!");
    }


    2. Nähere Funktions Erklärung


    Also, das sleep(1000)...sollte jedem klar sein ^^ sleep so heißt halt die Funktion und 1000 ist das Attribut für die Millisekunden von dem Timeout :)
    Was ich dann noch gemacht habe, z.B. dieses <a> steht für den Namen des Callbacks der Aufgerufen wird, sobald der Timeout zuende ist!


    Wichtig: Das darf nicht doppelt vorkommen, man kann in einem Script nicht 2x <a> machen oder 2x <b>, diese Reihe weiter fortführen!! Egal wie! Nichts doppelt machen!
    Einfach so: <a>, dann <b>, dann <c>,...usw und wenn man dann 26 Buchstaben durch hat, dann <aa>, <bb> usw :)


    Zu pSleep, ist zu sagen, dass mit dem "i" ist halt wie bei SetTimerEx und steht für den Typ der Variable (i = Integer) und danach kommen halt die ganzen Variablen.
    //Wenn man mehr Variablen übergeben will, macht man einfach:
    pSleep(1000)<a,"ii",playerid,x);


    3. Source Code:


    Der Source Code beschränkt sich nur auf ein kleines Makro, was ihr oben im Script einfügen könnt und sieht folgender maßen aus:


    //(c) by Kaliber
    #define sleep(%0)<%1>; SetTimer("@sleep_"#%1#,%0,0); return 1;}\
    @sleep_%1();@sleep_%1() {


    #define pSleep(%0)<%1,%2,%3>; SetTimerEx("@sleep_"#%1#,%0,0,%2,%3); return 1;}\
    @sleep_%1(%3);@sleep_%1(%3) {


    4. Schlusswort
    Ich würde mich über ein kleines Feedback freuen :)


    mfg. :thumbup:


    //Edited: pSleep

    Es ist vil nicht platz sparend aber wenn ich eine schleife mit vielen objecten habe wird das nicht viel resosen verbauchen oder wie das heißt ?
    oder wird beides gleich viel verbrauchen ?
    was währe am besten ?


    Es heißt Ressourcen :)


    und es ist sparender wenn du nur 1ne Variable machst, anstatt 5 oder so ^^
    Was irgendwie ja auch logisch ist...dann wird nämlich nur 1ne Variable im Speicher angelegt und nicht 5...


    Wieso ist eine Schleife nicht passend?


    Ist sie :)


    Wieso wird dafür mehr Zeit verbraucht?


    Nun, es wird mehr Zeit verbrauchst...aber wir reden hier von 0.01ms oder so ^^ Und das nur 1x nämlich wenn der Callback OnGameModeInit aufgerufen wird...
    Abgesehen davon, dass es 0.001ms länger dauert, hat man Zeilen gespart, es ist eine schönere Übersicht und man kann Problemlos auch noch 99 weitere Texturen dran hängen ;)


    //Edit:
    Was H4rd_B4se am Ende seines Beitrags geschrieben hat, ist auch eine sehr elegante Lösung! :)


    mfg. :thumbup:

    Tut mir leid, bin noch zu sehr an Java gewöhnt, aber im Prinzip gibt beides das selbe aus.


    Nein nicht direkt ^^


    double gibt z.B. in Java auch Kommazahlen aus, sprich 1.23 ;)


    Aber %d gibt eben nur ganze Integer aus ... und mit %f muss man Floats ausgeben ;)


    mfg. :thumbup:

    Erstmal ist der Name nicht vom Datentyp double, sondern String, weshalb du auch mit diesem arbeiten musst.


    %d steht nicht für double sondern für dezimal.


    und bei deinem Beispiel ist die Variable string überflüssig...da kann man direkt name verwenden ;)


    mfg. :thumbup:

    Das was man am pRP Script halt bearbeiten muss: ForumUrl,BindIP,TSIp...


    Hast du evtl die Makros leer gemacht und dann returnt?


    Sprich sowas:


    #define test ""


    //In irgendeiner Funktion oder Callback
    return test;


    Dann würde das nämlich auch crashen ;)


    mfg. :thumbup:

    Das funktioniert nicht, da OnPlayerConnect nur dann aufgerufen wird, wenn ein Spieler auf den Server connected und er sich nicht an der Position 359.2563,183.4888,1008.3828 befindet.


    Sprich du müsstest permanent abfragen ob sich der Spieler an dieser Position befindet...das macht man über einen Timer und ich bin mir sicher, dass in deinem Script schon solche Funktionen aufgerufen werden über einen Timer. Schau doch mal, wo die anderen IsPlayerInRangeOfPoint abfragen gemacht werden und schreibe es dazu ;)


    mfg. :thumbup:

    Schreib deinen Befehl mal so:


    ocmd:heal(playerid,params[]) {
    if(!MedicUS[playerid]) return scm(playerid,c_error,"Du bist kein Medic.");
    if(!params[0]) return scm(playerid,c_error,"Verwendung: /heal [spielerid]");
    new Float:Q[3],pID=strval(params);GetPlayerPos(playerid,Q[0],Q[1],Q[2]);
    if(!IsPlayerInRangeOfPoint(pID,2.5,Q[0],Q[1],Q[2])) return scm(playerid,c_error,"Du bist nicht in der Nähe eines Teampartners!");
    new string[128],name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    format(string,sizeof(string),"Du wurdest von Medic {00E6D7}%s {FFFFFF}geheilt!",name),scm(pID,-1,string);
    GetPlayerName(pID,name,sizeof(name));
    format(string,sizeof(string),"Du hast Soldat {00E6D7}%s {FFFFFF}geheilt!",name),scm(playerid,-1,str2);
    return SetPlayerHealth(pID,100);
    }


    mfg. :thumbup:

    Schreib das mal so:


    new nachricht[64], ip[16];
    GetPlayerIp(playerid,ip,sizeof(ip));
    format(nachricht,sizeof(nachricht),"Herzliche Willkommen %s!(%i) Dein Account wurde nicht gefunden! Bitte erstell einen! /n Zur Sicherheit wurde deine IP (%s) gespeichert!",Spielername(playerid),playerid,ip);


    mfg. :thumbup:

    public leben()
    {
    for(new i = 0; i<MAX_PLAYERS; i++)
    SetPlayerHealth(i, -5);
    return 1;
    }


    So würden alle Leute auf dem Server nach 50sek -5 Leben haben...bzw sterben ;)


    So muss man es machen:


    public leben() {
    new i,Float:health;
    for(; i<MAX_PLAYERS; i++) if(IsPlayerConnected(i)) GetPlayerHealth(i,health),SetPlayerHealth(i, health-5.0);
    return 1;
    }


    mfg. :thumbup: