Beiträge von Goldkiller

    Wie Ich sehe ist dein Beispiel auch aus dem SA:MP Wikipedia.
    Du hast wahrscheinlich ein wichtiges Detail vergessen ;) .


    Zitat

    ShowPlayerNameTagForPlayer
    Important Note: ShowPlayerNameTags must be set to 1 to be able to show name tags with ShowPlayerNameTagForPlayer, that means that in order to be effective you need to ShowPlayerNameTagForPlayer(playerid, 0) ahead of time(OnPlayerConnect is a good spot).



    public OnGameModeInit( )
    {
    ShowNameTags( 1 );
    }


    if(!strcmp(cmdtext,"/nameoff")) {
    for(new i ; i < MAX_PLAYERS ; i++) {
    if(IsPlayerConnected(i)) {
    if(i != playerid) {
    ShowPlayerNameTagForPlayer(playerid,i,false);
    }
    }
    }
    SendClientMessage(playerid,COLOR_ORANGE,"Dein Nametag ist für alle Mitspieler nun nicht mehr sichtbar");
    return 1;
    }

    Das kannst du mit Timern machen oder mit Ticks.
    Ich benutzt dazu immer Ticks.


    new
    tickCommand1[MAX_PLAYERS];

    #define TICK_COMMAND1_BLOCK 60*5*1000


    public OnPlayerCommandText(playerid, cmdtext[])
    {
    if (strcmp("/mycommand", cmdtext, true, 10) == 0)
    {
    new
    tickNow = GetTickCount();
    if( (tickCommand1[playerid] + (TICK_COMMAND1_BLOCK) ) < tickNow){
    return SendClientMessage(playerid,COLOR_YELLOW,"Du kannst diesen befehl nur alle 5 Minuten benutzen");
    }
    tickCommand1[playerid] = tickNow;
    // Was passieren soll ab hier.
    return 1;
    }
    return 0;
    }

    Mit GetTickCount() erhälst du eine Wert der angibt vor wievielen MS der Server gestartet wurde.Damit kannst du arbeiten und an Hand dieses Wertes berechnen ob seit dem angegeben Tick-Wert bis zum erneuten eingeben des Befehles eine bestimmte Zeit verstrichen ist.
    Ist vielleicht bisher schwer zu verstehen :wacko: .

    Wenn du folgendes Clever kombinierst hast du das gewünschte Ergebniss.


    new
    Float:X,
    Float:Y,
    Float:Z,
    vehicleid = 0;
    GetPlayerPos(playerid, X,Y, Z );
    GetClosestVehicle(X, Y, Z, 15.0, vehicleid);
    if(vehicleid){
    // Mach was
    }


    stock GetClosestVehicle(Float:x1, Float:y1, Float:z1, Float:dist, &veh){
    new
    i,
    Float:vDist,
    Float:x2,
    Float:y2,
    Float:z2;
    for(new v = 1 ; v < MAX_VEHICLES ; v++) {
    GetVehiclePos(v, x2, y2, z2);
    x1 -= x2;
    y1 -= y2;
    z1 -= z2;
    vDist = ((x1*x1)+(y1*y1)+(z1*z1));
    if( vDist < dist){
    veh = v;
    dist = vDist;
    }
    }
    return 1;
    }

    Der Lösungsweg wurde hier schon Teilweise genannt.Man besorgt sich zuerst die Position des Spielers in dessen Umkreis ein Fahrzeug gesucht werden soll.Danach wird durch alle Fahrzeuge geloopt und geschaut ob es in einem bestimmten Umkreis zum Spieler steht.Dabei wird automatisch das Fahrzeug ausgewählt,welches am nächsten zum Spieler steht.


    Sowas passiert wenn man nicht ließt und das Script versteht.Es reicht doch dass man es "haben will". :pinch:
    public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
    {
    new modelid;
    modelid = GetVehicleModel(vehicleid);
    if((modelid == 445) || (modelid == 466) || (modelid == 516) || (modelid == 550) )
    {
    new
    skin = GetPlayerSkin(playerid)
    if ((skin == 105) || (skin == 106) || (skin == 107))
    {
    //tu nichts
    }
    else
    {
    RemovePlayerFromVehicle(playerid);
    SendClientMessage(playerid, RED,"Du kommst nicht aus der Grove Street");
    }
    }
    return 1;
    }


    Dir Fehlen definitiv die Grundlagen.
    if (GetPlayerSkin(playerid)== 105 || 106 || 107); // Wie man dort ';' am Ende machen kann ...

    Liegt auch daran,dass folgendes nicht richtig ist.
    if (GetVehicleModel(vehicleid)== 445||466||516||550);

    So kannst du es aber nicht abfragen.Du musst es einzelnt abfragen.
    new
    modelid == GetVehicleModel(vehicleid);
    if((modelid == 445) || (modelid == 466) ) {


    }
    So musst du es auch mit den Skins machen.


    Wenn man ihn mit SetTimer startet kann man +- 100 ms machen... dann am besten Primzahlen verwenden, schon ist dazwischen immer genug Zeit. Das ist halt das problem - hier muss die veränderung mindestens 1000 ms sein, das ist meistens zu viel für sowas...


    Seh Ich auch so.


    Zitat

    Tja aber ich hab noch nicht viele gesehen, die Timer aus diesem Grund mit 1007 ms der 894 ms oder sonst was starten ;D
    Du musst es nicht benutzen, wenns dein Server nicht schafft. :)
    Und wenn ich die Include auf ms umschreiben hab ich leider einen Timer der evtl. unnötig im 1 ms Takt läuft.. viel Spass damit ;D


    Ich nutz es zB so.
    tAchievments = SetTimer("Achievment_DoShit",((5*1000) + 64),true);
    tVehicleExport = SetTimer("VehicleExport_DoShit",((VEHICLEEXPORT_ROUND_TIME * 1000) - 27),true);
    tStunting = SetTimer("Stunting_DoShit",((30*1000) + 57),true);
    tStuntingGod = SetTimer("Stunting_Infinity",((2*1000) - 91),true);

    Sind jetzt nur Beispiele.
    Zu diesem Thema hat Y_Less mal einen ganz Interessanten Beitrag im SA-MP.COM Forum verfasst.Ich such den mal,da steht drin wieso man es eigentlich nicht so machen sollte, wie es im Include von Rafeleder gemacht wird.
    Wie auch immer, ich sag nicht,dass es schlecht es was du da gemacht hast. Ich hab es ja selber auch so ähnlich lange Zeit selbst gemacht.



    Ich tippe außerdem das Fisch ein Doppelaccount ist,eventuell kleiner_opa :p

    Wieso willst du die Geschwindikeit bzw die wucht des Aufpralls mitberechnen?


    Eigentlich würde es ausreichen wenn du nur sinkende car-hp überprüfst. GTA selber berechnet ja die wucht, da je nach stärke des Unfalls die HP des Fahrzeues mehr oder minder sinkt.


    Er hat vollkommen Recht.Das funktioniert 100% bis auf einen Ausnahmefall,dass ist aber ein GTA Fehler.


    public OnVehicleHealthChange(vehicleid,playerid, Float:oldhealth, Float:newhealth)
    {
    new
    Float:tempf = (oldhealth - newhealth);
    if(tempf > 50.0) {
    new
    Float:pHealth;
    GetPlayerHealth(playerid,pHealth);
    SetPlayerHealth(playerid,(pHealth - (tempf / 10)));
    SetPlayerDrunkLevel(playerid,( 2000 + ((floatround((tempf / 40))) * 26) ));
    }
    }

    So hatte ( OnVehicleHealthChange ) Ich es mal Zeitweise in einem Script.Ging mir aber relativ schnell auf die Nerven.
    Das Callback hab Ich damals nach dem Prinzip aus diesem Script ( YUP - Y_Less's Update Peripherals - 0.3 ) nachgestellt.


    Ich nehme aber stark an du willst eine einfachere Lösung haben :whistling:

    Liegt daran,dass du nicht weisst was du da benutzt.Es gibt da verschiedene Wege,entweder du schaust dir dieses Tutorial an oder du entfernst diese Zeilen

    new text[256];
    text = strget(cmdtext,1);

    und änderst diese
    format(string, sizeof(string), "[Officer %s: %s]", sendername, text);
    in
    format(string, sizeof(string), "[Officer %s: %s]", sendername, cmdtext[3]);


    Bei Lust und Laune kannst du auch folgendes ändern.
    if(!strlen(strget(cmdtext,1))) return SendClientMessage(playerid, COLOR_RED, "Benutzte: /m [TEXT]");
    in
    if(!strlen(cmdtext[2])) return SendClientMessage(playerid, COLOR_RED, "Benutzte: /m [TEXT]");


    //Edit : Mh,komische Formatierung :\
    //Edit 2 : Achja,falls du nicht verstanden hast wieso Ich es so und nicht Anders geändert habe, Schau dir die Grundlagen an :whistling: . In der Tutorial Sektion findest du dazu genug.

    Probier es mal mit
    #pragma dynmaic 32768
    Damit erhöht sich jedenfalls der Wert der via heapspace() ausgegeben wird,ob es hilft weiss Ich nicht.Hab nie Probleme mit der Scriptgröße gehabt.
    Du machst wohl irgendwas falsch o0.

    stock DeleteAllFriends(playerid)
    {
    for(new f = 0; f < MAX_PLAYER_FRIENDS; f++)
    {
    strmid(Freunde[playerid][f],"0",0,1);
    format(string,128,"Freundesliste komplett gelöscht!",name);
    SendClientMessage(playerid,COLOR_GREEN,string);
    }
    }

    Da hast dich wohl vertan.
    Du brauchst da doch kein format(),außerdem gehört format() + SendClientMessage wohl eher nicht in den Loop :P

    new Float:Bestzeitrace1;
    Bestzeitrace1 = secrace1[playerid].milisecrace1[playerid];


    Ja klar,wenn das funktioniert ...


    Wie auch immer,so mach Ich es ungefähr ( Basic Methode )
    new
    tickRace_Start,
    tickRace_Finish[MAX_PLAYERS];

    // Wenn das Rennen startet
    tickRace_Start = GetTickCount();

    // Wenn Spieler Rennen beendet
    new
    ticks;
    tickRace_Finish[playerid] = GetTickCount();
    ticks = tickRace_Finish[playerid] - tickRace_Start;
    // Um es umzurechnen in Sekunden,Minute usw.
    new
    _msec,
    _sec,
    _min,
    _hour;
    ConvertMSec(ticks,_msec,_sec,_min,_hour);
    printf("Rennzeit von SpielerID %d : %dmin %dsec %dmsec",playerid,_min,_sec,_msec);

    // Funktion die Ich irgendwann mal geschrieben hab um ticks / MSec umzurechnen
    stock ConvertMSec(msecs,&msec,&sec,&min,&hour) {
    new
    rest;
    sec = 0;
    min = 0;
    hour = 0;
    msec = 0;
    hour = (msecs / ((60*60) * 1000));
    rest = (msecs % ((60*60) * 1000));


    min = (rest / (60 * 1000));
    rest = (rest % (60 * 1000));


    sec = (rest / 1000);
    rest = (rest % 1000);
    msec = rest;
    return 1;
    }

    AdnaN,Ich weiss nicht wieso bei dir wetterID ein Array ist.Daher :
    Public OnPlayerCommandText(playerid, cmdtext[])
    {
    dcmd(setweather,10,cmdtext);
    return 0;
    }
    dcmd_setweather(playerid,params[])
    {
    new
    wetterID;
    if(sscanf(params, "d",wetterID)) {
    return SendClientMessage(playerid,FARBE,"INFO: /setweather [WetterID]");
    }
    SetWeather(wetterID);
    SendClientMessage(playerid,FARBE,"INFO: Wetter geändert");
    return 1;
    }