Beiträge von IPrototypeI

    Zum ersten kannst du mit timestamps arbeiten einfach eine zusätzliche account variabel erstellen oder ein extra array und den wert das gettime zurück gibt drin speichern und die 20 sekunden dazu rechnen und das ganze abprüfen.
    new timestamp[MAX_PLAYERS];



    if(strcmp("/usedrugs", cmd, true) == 0)
    {
    if(timestamp[playerid] > gettime())return SendClientMessage(playerid,-1,"Du kannst noch nicht diesen Befehl nutzen");
    if(IsPlayerConnected(playerid))
    {
    if(PlayerInfo[playerid][pDrugs] >= 2)
    {
    new Float:Health;
    GetPlayerName(playerid,sendername,sizeof(sendername));
    GetPlayerHealth(playerid, Health);
    PlayerStoned[playerid] += 1;
    if(PlayerStoned[playerid] >= 3)
    {
    PlayerStonedTime[playerid] = 180;
    }
    if(PlayerStonedTime[playerid] > 0)
    {
    GameTextForPlayer(playerid, "~w~Du bist~n~~p~bekifft", 4000, 1);
    SetPlayerDrunkLevel(playerid,GetPlayerDrunkLevel(playerid) +3000);
    }
    if(PlayerInfo[playerid][pDrugPerk] > 0)
    {
    new hp = 5 * PlayerInfo[playerid][pDrugPerk];
    SetPlayerHealth(playerid, Health + hp);
    }
    else
    {
    SetPlayerHealth(playerid, Health + 4);
    }
    timestamp[playerid] = gettime() + 20;
    PlayerInfo[playerid][pDrugs] -= 2;
    OnePlayAnim(playerid, "FOOD", "EAT_Burger", 3.0, 0, 0, 0, 0, 0); // Eat Burger
    format(string, sizeof(string), "* %s pfeift sich 2 Gramm getrocknetes Gras rein.", sendername);
    ProxDetector(20.0, playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
    format(string,sizeof(string),"* %s nutzt usedrugs", sendername);
    EnterToLog("usedrugs",string);
    }
    else
    {
    SendClientMessage(playerid, COLOR_ERRORTEXT, " Du hast keine Drogen !");
    }
    }
    return 1;
    }



    if(strcmp("/admins", cmd, true) == 0)
    {
    SendClientMessage(playerid, COLOR_GREY, "Admins Online:");
    new AdminRangName[25];
    for(new i = 0; i < MAX_PLAYERS; i++){
    if(!IsPlayerConnected(i)|| (PlayerInfo[i][pAdmin] == 0 && AFKModus[i] == 1))continue;
    switch( PlayerInfo[i][pAdmin]){
    case -1:AdminRangName = "Beschwerdemoderator";
    case 1:AdminRangName = "Supporter";
    case 2:AdminRangName = "OberSupporter";
    case 3:AdminRangName = "Moderator";
    case 4:AdminRangName = "SuperModerator";
    case 5:AdminRangName = "Admin";
    case 6:AdminRangName = "SuperAdmin";
    case 1337: AdminRangName = "Fulladmin";
    case default: AdminRangName = "Unknown";

    }
    format(string, sizeof(string), "%s: %s[%d]", AdminRangName, sendername,i);
    SendClientMessage(playerid, COLOR_GREY, string);
    }
    return 1;
    }

    Auch wenns älter ist, ihr könnt einfach mit dem Pinsel auf die stelle drücken wo der Lichteffekt sein soll.
    Die Option mit dem schein wählt ihr bevor ich drück rechtsklick aus, dann seht ihr unten die "Pinselformen".



    Am schnellsten würde es gehen mit dem Verlaufswerkzeug und dort natürlich den Verlauf auf Radialverlauf umstellen.
    Jedoch kann man bei deiner Methode genauer arbeiten.

    Ich zeig dir mal wie ich da sganze in meinem selfmade habe.


    Als erstes habe ich ein 2 Dimensionales Array erstellt mit gepackten strings daher wird auch char verwendet un dieses ausrufezeichen der Vorteil daran es wird weniger memory benötigt
    pro Zelle 1 Bit da nur werte von 0 - 254 gespeichert werden können aufgrund der verwendung von char was den datentyp ändert.
    Das const steht für einen konstanten werden was zusätzlich beim ausführen von funktionen den dynamischen memory reduziert.


    stock const WeaponNames[44][20 char] = {
    !"Unarmed",!"Brass Knuckles",!"Golf Club",!"Night Stick",!"Knife",!"Baseball Bat",!"Shovel",!"Katana",
    !"Chainsaw",!"Purple Dildo",!"White Dildo",!"Long White Dildo",!"White Dildo 2",!"Flowers",!"Cane",
    !"Grenades",!"Tear Gas",!"Molotovs",!"Pistol",!"Silenced Pistol",!"Desert Eagle",!"Shotgun",!"Sawn Off Shotgun",
    !"Combat Shotgun",!"Micro Uzi",!"Mac 10",!"MP5",!"AK47",!"M4",!"Tec9",!"Rifle",!"Sniper Rifle",!"RPG",!"Missile Launcher",
    !"Flame Thrower",!"Minigun",!"Sachel Charges",!"Detonator",!"Spray Paint",!"Fire Extinguisher",!"Camera",
    !"Nightvision Goggles",!"Thermal Goggles",!"Parachute"
    };


    Nun zum Befehl:


    CMD->giveweapon(playerid,params[]){
    new gun[3];
    if(sscanf(params,"uk<weapon>d",gun[0],gun[1],gun[2]))return SendClientMessage(playerid,-1,"Benutze: /giveweapon [ID/Name] [Munition]");
    else if(!IsPlayerConnected(gun[0]))return SendClientMessage(playerid,COLOR_YELLOW,"Der Spieler ist nicht Online!");
    else if(gun[1] == -1)return SendClientMessage(playerid,COLOR_RED,"Falsche Waffenid");
    GivePlayerWeapon(gun[0],gun[1],gun[2]);
    new string[20];
    strunpack(string,WeaponNames[(gun[1]-(18 > gun[1])?(3):(0))]);
    format(ALLSTRING,64,"Du hast dir eine %s mit %d Schuss gegeben",string,gun[2]);
    SendClientMessage(gun[0],COLOR_GREEN,ALLSTRING);
    return 1;
    }
    Ich verwende hier mein eigenen CMD prozessor daher CMD-> das wichtige ist heir der specifer k<weapon> das bedeutet das du einen eigenen specifer erstellen kannst der sieht so aus und ist schon standartmäßig in der sscanf2 include vorhanden daher benutze die plugin version also sscanf 2.8.1

    SSCANF:weapon(string[])
    {
    new ret = strval(string);
    if (0 <= ret <= 18 || 22 <= ret <= 46)return ret;
    else if (!strcmp(string, "Unarmed")) return 0;
    else if (!strcmp(string, "Brass Knuckles")) return 1;
    else if (!strcmp(string, "Golf Club")) return 2;
    else if (!strcmp(string, "Night Stick")) return 3;
    else if (!strcmp(string, "Knife")) return 4;
    else if (!strcmp(string, "Baseball Bat")) return 5;
    else if (!strcmp(string, "Shovel")) return 6;
    else if (!strcmp(string, "Pool cue")) return 7;
    else if (!strcmp(string, "Katana")) return 8;
    else if (!strcmp(string, "Chainsaw")) return 9;
    else if (!strcmp(string, "Purple Dildo")) return 10;
    else if (!strcmp(string, "White Dildo")) return 11;
    else if (!strcmp(string, "Long White Dildo")) return 12;
    else if (!strcmp(string, "White Dildo 2")) return 13;
    else if (!strcmp(string, "Flowers")) return 14;
    else if (!strcmp(string, "Cane")) return 15;
    else if (!strcmp(string, "Grenades")) return 16;
    else if (!strcmp(string, "Tear Gas")) return 17;
    else if (!strcmp(string, "Molotovs")) return 18;
    else if (!strcmp(string, "Pistol")) return 22;
    else if (!strcmp(string, "Silenced Pistol")) return 23;
    else if (!strcmp(string, "Desert Eagle")) return 24;
    else if (!strcmp(string, "Shotgun")) return 25;
    else if (!strcmp(string, "Sawn Off Shotgun")) return 26;
    else if (!strcmp(string, "Combat Shotgun")) return 27;
    else if (!strcmp(string, "Micro Uzi")) return 28;
    else if (!strcmp(string, "Mac 10")) return 28;
    else if (!strcmp(string, "MP5")) return 29;
    else if (!strcmp(string, "AK47")) return 30;
    else if (!strcmp(string, "M4")) return 31;
    else if (!strcmp(string, "Tec9")) return 32;
    else if (!strcmp(string, "Rifle")) return 33;
    else if (!strcmp(string, "Sniper Rifle")) return 34;
    else if (!strcmp(string, "RPG")) return 35;
    else if (!strcmp(string, "Missile Launcher")) return 36;
    else if (!strcmp(string, "Flame Thrower")) return 37;
    else if (!strcmp(string, "Minigun")) return 38;
    else if (!strcmp(string, "Sachel Charges")) return 39;
    else if (!strcmp(string, "Detonator")) return 40;
    else if (!strcmp(string, "Spray Paint")) return 41;
    else if (!strcmp(string, "Fire Extinguisher")) return 42;
    else if (!strcmp(string, "Camera")) return 43;
    else if (!strcmp(string, "Nightvision Goggles")) return 44;
    else if (!strcmp(string, "Thermal Goggles")) return 45;
    else if (!strcmp(string, "Parachute")) return 46;
    return -1;
    }


    Was halt ein kleiner nachteil ist um memory zu sparen benutz ich hier ein ternären operator


    WeaponNames[(gun[1]-(18 > gun[1])?(3):(0))]
    Da gewisse waffenids nicht gefüllt sind also nummern werden hier übersprungen.

    So weit ich es weiß, gehen PVars auf den RAM und Enums auf den CPU. Der RAM sollte weniger wichtig sein, weshalb man PVars bevorzugen sollte.


    Korrigiert mich, falls ich mich irren sollte.

    Mit CPU vs Memory in dem zusammenhang ist gemeint das PVars weniger Memory verbrauchen jedoch in der verarbeitung langsamer sind und andersrum.
    Zum Thema Memory stimmt das nur soweit das nicht für jeden Spieler was gespeichert wird da die PVars wenn sie erstellt werden sich den Memory nehmen und wenn diese zurück gesetzt werden geben sie das ganze wieder frei. Bei Integer , Floats oder Arrays ist das ganze so das die den memory nicht wieder freigeben und reservieren sich somit den Speicherplatz.


    Enums an sich verbrauchen kein Memory daher sollte man hier eher von einem Array sprechen.


    xD zu dem kann man via #emit auch von gamemodes auf das ganze zugreifen also auf die arrays das ist auch kein Problem oder man schreib sich funktionen und ruft diese via CallRemoteFunction auf.

    mich wundert es warum du mit cosinus rechnest du hast die Hypotenuse nicht gegeben obwohl du diese berechnen kannst durch den Satz des Pythagoras.


    atan2 und atan ist das selbe


    Beispiel: du hast ein Dreieck dort ist die ankathete 15 zentimeter und die gegenkathete 18 zentimeter
    daher rechnen wir Gegenkathete durch Ankathete


    18/15


    bei atan2 würde das so aussehen atan2(18,15);
    und bei atan(18.0/15.0);
    Ergebniss bei beiden 50.19442891 Grad.


    Der unterschied liegt in der Verwendung

    stock FacingAngleToVehicle(playerid,vehicleid){
    new Float: Pos[6];
    GetPlayerPos(playerid, Pos[0], Pos[1], Pos[2]);
    GetVehiclePos(vehicleid, Pos[3], Pos[4],Pos[5]);
    printf("%f",(180.0-atan2(Pos[0]-Pos[3],Pos[1]-Pos[4])));
    return SetPlayerFacingAngle(playerid,180.0-atan2(Pos[0]-Pos[3],Pos[1]-Pos[4]));
    }


    sollte so ohne probleme gehen

    Zu den meisten Plugins muss man sagen - Die Bots nutzen keine Spielerslots, ergo du verstößt gegen die SA:MP Lizens.


    Schau mal im Showroom - InGameNPC by Hami - dort stehen mehr Infos (Plugins/Includes) :)


    xD nur komisch das sie im offiziellen Forum downloadbar sind. 1. Nehmen diese einen Slot ein nur für den Spieler sind diese nicht sichtbar wie ganz normale NPCs auch. Es sind auch ganz normale NPCs nur das mit der recorddatei getrickst wird und du die Handlungen nicht selbst recorden musst.


    Desweitern wurde das CNPC plugin verboten da man aus den NPCs ghostuser machen konnte um somit die useranzahl auf den Servern zu pushen.


    //edit der link zu dem FNPC
    http://forum.sa-mp.com/showthread.php?t=428066


    zu dem gibts dort lustige Testskripts auf der code.google Seite.

    zwischen 4 - 10 oder ab 4 oder 10 zeichen ist möglich dazu musst du nur die länge des passworts via der funktion strlen bestimmen und diese in einer if
    abfrage vergleichen.


    Beim Dialog ist es natürlich der inputtext bei einem command( Beispiel /register [passwort]) musst du das ganze splitten


    if(4 > strlen(inputtext) > 10)return SendClientMessage(playerid,-1,"Das Passwort muss zwischen 4 un 10 zeichen sein");
    oder bei einer mindestlänge


    if(4 > strlen(inputtext))return SendClientMessage(playerid,-1,"Das Passwort muss mindestens 4 Zeichen lang sein");


    Beziehungsweise
    if(10 > strlen(inputtext))return SendClientMessage(playerid,-1,"Das Passwort muss mindestens 10 Zeichen lang sein");

    stimmt dann das so wie oben?
    `Passwort` varchar(24) NOT NULL ,


    bekomme da immer 0 angezeigt..


    Sofern der user nur 24 Zeichen als Passwort eintragen darf , ja.
    Wenn du eine Tabelle erstellst ist es normal das nix enthalten ist du musst erst via dem SQL befehl INSERT einträge hinzufügen dies tust du bei der Registration des Users beim speichern dann mit dem SQL Befehl UPDATE und beim Laden mit SELECT jedoch haben die SQL Befehle ein uterschiedlichen Syntax

    Es kommt drauf an du kannst über dein skript tabellen erstellen oder via phpmyadmin oder navicat es gibt viele Wege dies zu tun.


    varchar sind für Strings varchar(länge) also dahinter gibt man die länge an für den string. Int ist für integer der wert dahinter als int(5) ist nicht relvant
    damit kann man die Anzeigebreite einstellen.
    NOT NULL bedeutet das in dem Feld was eingetragen wird mann kan auch nur NULL verwenden was bedeutet kein Wert macht man jedoch standartmäßig nicht.
    kein Wert bedeutet das auch dann 0 ein gültiger Wert ist.


    Hier mal eine übersicht zu den Datentypen
    http://dev.mysql.com/doc/refma…storage-requirements.html

    Ich habe ein GF script es basiert zurzeit auf Dini aber ich will es auf MySQL scripten, muss ich nur bei OnPlayerConnect das was geladen wird & bei OnPlayerDisconnect das was gespeichert wird ändern? ^^


    Ja genau nur das Laden und das Speichern des Spielers musst du ändern zu dem auch das erstellen eines Accounts( hiermit ist das erstellen eines files gemeint, wenn sich ein user registiert).

    Du setzt ja den wert +1 daher ist der auch temporär gespeichert. Du kannst das ganze normal auslesen der Wert wird dein random +1 sein wie du es willst.



    aber als kleine korrektur bei den if abfragen
    GetPVarInt(i,"CallID") 
    gibt einen wert zurück daher macht es kein sin den Inkrementoperator bei dem Namen hinzusetzen.


    Zudem muss man nicht umbedingt ein
    Inkrementoperator benutzten


    SetPVarInt(i,"CallID",callid+1);
    würde auch gehen

    Daher auch
    SetPVarInt(i,"CallID",++callid);


    Das ist die Präfix Version des Inkrementoperator, die wo du benutzt ist die Postfix version davon.
    Der unterschied dazwischen ist das bei der die variabeln bevor sie genutzt wird um 1 erhöht
    Präfix


    #define IsPlayerAnAdmin(%0,%1) (Spieler[%0][Admin] >= %1)


    so geht das ganze :D

    Nee brauchst du nicht machen das problem ist , das sscanf hier den ausgelesenen String nicht splittet.


    Das liegt wahrscheinlich daran das du nicht das sscanf plugin benutzt oder die reine sscanf Funktion in deinem skript hast


    Die hier


    stock sscanf(string[], format[], {Float,_}:...)
    {
    #if defined isnull
    if (isnull(string))
    #else
    if (string[0] == 0 || (string[0] == 1 && string[1] == 0))
    #endif
    {
    return format[0];
    }
    #pragma tabsize 4
    new
    formatPos = 0,
    stringPos = 0,
    paramPos = 2,
    paramCount = numargs(),
    delim = ' ';
    while (string[stringPos] && string[stringPos] <= ' ')
    {
    stringPos++;
    }
    while (paramPos < paramCount && string[stringPos])
    {
    switch (format[formatPos++])
    .............