Beiträge von Woozie

    //edit sry ich teste sowas mal

    Jo, aber du hast vergessen einen Timer zu starten ;). Ohne Timer wird die Funktion gar nicht erst angesprungen (außer, man ruft sie manuell via Callback auf. Z.B. OnPlayerEnterVehicle...)


    Nachtrag:
    Habe i durch playerid ersetzt. Jetzt gehts auch ^^


    new timer=0;


    forward Geldcheck


    public OnGamemodeInit()
    {
    timer=SetTimer("GeldCheck",1000,1); // jede Sekunde wird die Funktion Geldcheck aufgerufen
    }


    public OnGameModeExit()
    {
    DestroyTimer(timer);
    }


    public GeldCheck()
    {
    for(new playerid = 0;playerid<MAX_PLAYERS;playerid++)
    {
    if(GetPlayerMoney(playerid) >= 0)
    {
    SendClientMessage(playerid, FARBE_ROT, "Lass den Geldcheat aus!");
    ResetPlayerMoney(playerid);
    Kick(playerid);
    }
    }
    return 1;
    }

    Kill den Timer bei OnPlayerDisconnect und speicher den Restwert (Minuten, Stunden was weiß ich) in ein Datenfeld (Tabelle@MySQL, Datei). Bei OnPlayerConnect lädst du diesen Wert wieder. Bei OnPlayerSpawn setzt du den Spieler wieder innen Knast und Settimer.

    Warum so kompliziert?
    Ich hab in meinem GM soetwas drin:


    public OnPlayerDeath(playerid, killerid, reason)
    {
    SetSpawnInfo(playerid,0,GetPlayerSkin(playerid),-2651.4666, 632.5606,14.4531,182.2998, 0, 0, 0, 0, 0, 0);
    }

    Da ich in letzter Zeit häufiger Fragen zu MySQL lese, veröffentliche ich hier mal meine INC Datei mit nützlichen Funktionen, um schneller und einfacher auf eine DB zuzugreifen. Natürlich wird beim Aufruf eines SQL Statements geprüft, ob eine Verbindung zur DB besteht. Falls nicht, wird versucht, sie herzustellen.


    Wenn man diese INC in sein Script einbindet, muß man nur noch folgende String setzen:
    MYSQL_HOST="";
    MYSQL_DB="";
    MYSQL_USER="";
    MYSQL_PASS="";


    Ich denke mal, ich brauche hier nichts zu erklären. Hier nun der Downloadlink und die Befehlsübersicht.


    PS.:
    In der INC ist noch der PW Hash aus der DUDB.INC drin, da ich ihn brauche und nicht extra die DUDB.INC einbinden wollte.


    breadfish.de/wcf/attachment/788/


    :: Befehlsübersicht:
    - OpenMySQL() - Liefert 0 oder 1 zurück (0 false / 1 true bzw. Zugriff zur DB erfolgreich)


    - CloseMySQL() - Liefert 0 oder 1 zurück (0 false / 1 true bzw. Zugriff zur DB erfolgreich)


    - QueryMySQL(field[],table[],where[],option[]) - Liefert Anzahl der Zeilen zurück. (WHERE und OPTION sind hierbei optional)
    QueryMySQL ist aufgebaut wie ein SELECT Statement von MySQL. Beispiel.: SELECT Feld1, Feld2, Feld8 FROM tabelle WHERE Feld1='89' LIMIT 1

    - InsertMySQL(table[],field[]) - Liefert 0 oder 1 zurück (1 = Daten erfolgreich in Tabelle eingefügt)


    - UpdateMySQL(table[],set[],where[]) - Liefert 0 oder 1 zurück. (1 = Daten erfolgreich in Tabelle aktualisiert)


    - DeleteMySQL(table[],where[]) - Liefert 0 oder 1 zurück. (1 = Daten erfolgreich in Tabelle gelöscht)


    - ReadMySQL() - Liefert Zeile zurück, welche mit strtok gesplittet werden muß
    Anmerkung: ich habe diese Funktion nur proforma eingebaut - selber nutze ich sie aber nie!


    Folgende Befehle funktionieren nur in Verbindung mit QueryMySQL:
    - GetMySQLField_Int("Spaltenname") - Liefert einen Integerwert zurück
    - GetMySQLField("Spaltenname") - Liefert einen String zurück
    - GetMySQLField_Float("Spaltenname") - Liefert einen Floatwert zurück



    Hier noch ein kleines Beispiel:
    Oben in deinem PAWN Code natürlich folgendes einfügen, sonst klappts net ;)


    #include <mysql>


    new mysqlresult[1024];


    Beispiel für das Auslesen:

    new Float:var,var2=0,var3[256];


    if (QueryMySQL("*","tabellenname","","")>0)
    {
    while(samp_mysql_fetch_row(mysqlresult))
    {
    var=GetMySQLField_Float("Floatfeld");
    var2=GetMySQLField_Int("Integerfeld");
    var3=GetMySQLField("Stringfeld");


    printf("Floatfeld:%f - Integergeld:%d - Stringfeld:%s",var,var2,var3);
    }
    }



    Beispiel für Einfügen von Daten:
    new mystr[256];
    new Float:health,alter,name[32];
    alter=22; name="Candy"; health=100.0000;
    format (mystr,sizeof(mystr),"Name='%s', Alter='%d', Gesundheit='%f'",name,alter,health);
    if (!InsertMySQL("tabelle",mystr)) {print("Daten konnten nicht eingefügt werden!");}



    Beispiel für das Aktualisieren vorhandener Daten:
    new mystr[256];
    format (mystr,sizeof(mystr),"Alter='%d', Gesundheit='%f'",name,alter,health);
    if (!UpdateMySQL("tabelle",mystr,"Name='Candy'")) {print("Daten konnten nicht aktualisiert werden!");}



    Löschen von Daten:
    if (!DeleteMySQL("Tabelle","Name='Candy'")) {print("Daten konnten nicht gelöscht werden!");}

    auch hier empfehle ich das Wiki als Nachschlagewerk ^^


    meinAuto=CreateVehicle(vehicleid,x+2,y,z,angle,-1,-1,-1);


    CreateVehicle gibt die vehicleid des erstellten Fahrzeuges zurück ;)

    Kommt drauf an, was du damit machen willst?
    Wie mein Vorredner schon sagte, lasse ich alle Pickups bei OnGameModeInit erstellen, aber z.B. bei Paintball lasse ich sie auch woanderst löschen und erstellen ;). Aber bei OnGameModeInit macht das mehr Sinn, da du die Pickups bestimmt nicht verändert möchtest, im laufenden Betrieb oder?

    oh, bitte, das sind Grundlagen beim PAWN. Wie wäre es, wenn du dir das Wiki mal anschaust? -.-


    OnPlayerPickupPickup(playerid,pickupid)
    {
    if (pickupid==arenapickup)
    {
    setplayerinteriori(intid);
    setplayerpos(playerid,x,y,z);
    setplayerfacingangle(playerid,a);
    }
    return 1;
    }


    Erklärung:
    arenapickup=id deines Pickups
    intid=Interior ID der gewünschten Arena
    x,y,z,a=Zielkoordinaten in der Arena

    1. wenn Auto auf dem Kopf liegt, kannst du nix gegen eine Explosion machen (außer nen Timer vielleicht, aber das wäre irrsinn)
    2.
    erstell einen Timer, der einmal in der Sekunde aufgerufen wird
    Frag darin deine Cars per For...Schleife ab, ob deren Health<350 ist.
    Falls ja, carhealth[carid]=350;cardestroyed[carid]=1;


    Wenn man nun in ein Auto einsteigen möchte, frag bei OnPlayerStateChange(...) ab, welche carid das Auto hat (nicht vehicleid!!!). Wenn das Auto mit carid einen Schaden hat (cardestroyed[carid]==1), dann freeze den Spielern einfach. Fertig.
    Bei OnPlayerKeyChange(...) fragst du einfach ab, ob Spieler im Auto sitzt, dieses kaputt ist (cardestroyed) und ob Spieler Taste ENTER (Auto ein/aussteigen) drückt, falls ja, removeplayerfromvehicle und unfreeze (toggelplayercontrollable)


    Nachtrag zu 2.
    wenn Auto Totalschaden hat und du carhealth[carid]=350; machst, mußt du natürlich auch per SetVehicleHealth den Wert 350 setzen.


    Nachtrag zu 2. zweite Runde ^^:
    vor der IF Abfrage mit Health<350 wäre es natürlich sinnvoll, wenn du die Health Variable mit den aktuellen Wert aus dem jeweiligem Car bestückst ;) (zur Erinnerung: GetVehicleHealth)

    Nice, sowas ähnliches habe ich mit Alkohol und Gesundheit gemacht, nur mit dem Unterschied, daß man keinen nervigen Text bekommt, sondern einfach den jeweiligen Skin langsamer laufen läßt ^^.
    Bei Alkohol läuft man bei mir besoffen und bei Erschöpfung (wenig Health) wie ein alter Opa. ;)


    1. if (strcmp("/buy32", cmdtext, true, 10) == 0)
    {
    2. if(PlayerToPoint(4.0, playerid,1536.6609,-1645.1080,13.5469 ))
    {
    3. if(GetPlayerMoney(playerid) > 3499) {GivePlayerWeapon(playerid, 32,150);GivePlayerMoney(playerid, -3500);} else {SendClientMessage(playerid, COLOR_WHITE, "Du Hast nicht genügend geld o.o");}
    }
    else {SendClientMessage(playerid, COLOR_WHITE, "Du bist nicht am richtigen Ort!");}
    return 1;
    }


    Zur Erklärung hab ich mal 1. - 3. reingemacht, gehört im PWN nicht rein.


    1. IF Abfrage, ob CMD=/buy32 ist
    2. IF Abfrage: befindet sich Spieler in den genannten Radius
    {
    3. IF Abfrage: hat Spieler mehr als 3499, dann {GivePlayerWeapon....} ELSE: {Spieler hat weniger als 3500, dann Mitteilung:"nicht genug Kohle"}
    }
    2. ELSE: Nicht am richtigen Ort


    Klar? ^^
    Das letzte ELSE bezieht sich auf die IF Anweisung bei PlayerToPoint.

    xD wen du so genau bist ist deins auch falsch :D


    dan musste es 999 heisen :D

    100pro sign :thumbup:
    Flüchtigkeitsfehler. Mach als variable=random(999)+1;
    Denn random(999) sucht er zufällig 0-999 aus und dann einfach plus 1 ;)
    und schon klappts auch mit der Nachbarin ;)

    if (strcmp("/buy32", cmdtext, true, 10) == 0)
    {
    if(PlayerToPoint(4.0, playerid,1536.6609,-1645.1080,13.5469 ))
    {
    if(GetPlayerMoney(playerid) > 3499) {GivePlayerWeapon(playerid, 32,150);GivePlayerMoney(playerid, -3500);}
    else {SendClientMessage(playerid, COLOR_WHITE, "Du Hast nicht genügend geld o.o");}
    }
    else {SendClientMessage(playerid, COLOR_WHITE, "Du bist nicht am richtigen Ort!");}
    return 1;
    }

    Ok, du möchtest reale 24 Stunden abzählen und keine gespielten 24 Stunden? Wo ist da das Problem?
    Wenn du einem Spieler etwas verbietest, nimm 4 Variablen (z.B. Tag, Monat, Stunde, Minute). Dort schreibst du die Werte rein und speicherst diese 4 Werte in seine Userfile/DB.
    Wenn der Spieler am nächsten Tag wieder IG kommt, frag im Script beim Login diese Werte ab.


    z.B.
    If (aktuellerTag>userTag[playerid] && (aktuelleStunde>userStunde[playerid] || (aktuelleStunde==userStunde[playerid] && aktuelleMinute>userMinute[playerid]))) <--- erlaube Spieler wieder diese Funktion


    Nachtrag:
    Kleiner Fehler bei Monatsanfang. Du kannst natürlich noch mit Monat abfragen, was besser wäre als Zusatz. ^^