Beiträge von Jeffry

    new Float:CarHealth,chealth,string[512],string1[128],kmh,modelid,veh,Float:Distance;


    zu:
    new Float:CarHealth,chealth,string[512],string1[128],kmh,modelid,veh;


    Warum auch immer der Compiler da keinen Fehler bringt.



    Dann sollte es klappen, da du es ja unten mit "new Distance..." deklarierst.





    [BE]Mika2828: Entweder du hilfst konstruktiv, oder du lässt es ganz. Den Schlaumeier zu spielen ohne zu helfen bringt rein gar nichts. :thumbdown:

    8| Das macht gar keinen Sinn.


    Kannst du mal den gesamten Timer (auch wie du ihn startest (und wo)) posten, damit ich es selbst testen kann, ob bei mir das gleiche ausgegeben wird, wenn man ingame fährt? Irgendwo muss da ein Fehler sein, vielleicht aber gar nicht in dem Teil den du gepostet hast.

    Also dort wo bei dir der erste große Wert raus kommt, kommt bei mir:
    [12/09/2014 21:11:46] -328.983337 | 833.730590 | 13.970005 | -328.748352 | 832.689819 | 13.986113 |
    [12/09/2014 21:11:46] distance = 1


    Ich habe die Werte einfach gesetzt, kommt ja aufs gleiche raus.


    Füge mal unter OnGameModeInit den Code ein, und poste was kommt wenn du den Server startest:
    new i;
    pNewKM[0][i] = -328.983337;
    pNewKM[1][i] = 833.730590;
    pNewKM[2][i] = 13.970006;
    pOldKM[0][i] = -328.748352;
    pOldKM[1][i] = 832.689819;
    pOldKM[2][i] = 13.986114;
    printf("%f | %f | %f | %f | %f | %f |",pNewKM[0][i],pNewKM[1][i],pNewKM[2][i],pOldKM[0][i],pOldKM[1][i],pOldKM[2][i]);
    new Distance=floatround(floatsqroot( ((pNewKM[0][i]-pOldKM[0][i])*(pNewKM[0][i]-pOldKM[0][i])) +((pNewKM[1][i]-pOldKM[1][i])*(pNewKM[1][i]-pOldKM[1][i])) + ((pNewKM[2][i]-pOldKM[2][i])*(pNewKM[2][i]-pOldKM[2][i])) ));
    printf("distance = %d", Distance);

    Debugge es mal, ich sehe da eigentlich nichts was falsch ist.
    GetVehiclePos(veh,pNewKM[0][i],pNewKM[1][i],pNewKM[2][i]);
    printf("%f | %f | %f | %f | %f | %f |",pNewKM[0][i],pNewKM[1][i],pNewKM[2][i],pOldKM[0][i],pOldKM[1][i],pOldKM[2][i]);
    new Distance=floatround(floatsqroot( ((pNewKM[0][i]-pOldKM[0][i])*(pNewKM[0][i]-pOldKM[0][i])) +((pNewKM[1][i]-pOldKM[1][i])*(pNewKM[1][i]-pOldKM[1][i])) + ((pNewKM[2][i]-pOldKM[2][i])*(pNewKM[2][i]-pOldKM[2][i])) ));
    printf("distance = %d", Distance);
    KM[veh] += Distance;
    printf("KM[veh] = %d", KM[veh]);
    pOldKM[0][i] = pNewKM[0][i];
    pOldKM[1][i] = pNewKM[1][i];
    pOldKM[2][i] = pNewKM[2][i];
    format(string,sizeof string,"%d KM",KM[veh]);
    TextDrawSetString(KManzeige[veh],string);
    Dann poste den Log.



    Alternativ: http://forum.sa-mp.com/showthread.php?t=404367

    GetVehiclePos(veh,pNewKM[0][i],pNewKM[1][i],pNewKM[2][i]);
    new Distance=floatround(floatsqroot( ((pNewKM[0][i]-pOldKM[0][i])*(pNewKM[0][i]-pOldKM[0][i])) +((pNewKM[1][i]-pOldKM[1][i])*(pNewKM[1][i]-pOldKM[1][i])) + ((pNewKM[2][i]-pOldKM[2][i])*(pNewKM[2][i]-pOldKM[2][i])) ));
    KM[veh] += Distance;
    pOldKM[0][i] = pNewKM[0][i];
    pOldKM[1][i] = pNewKM[1][i];
    pOldKM[2][i] = pNewKM[2][i];
    format(string,sizeof string,"%d KM",KM[veh]);
    TextDrawSetString(KManzeige[veh],string);


    Wie sieht es damit aus?

    new Menu:CurrentMenu = GetPlayerMenu(playerid);
    if(CurrentMenu == BOMB)
    {
    switch(row)//rot,gelb,grün,blau
    {
    case 0://rot
    {
    GetPlayerPos(playerid, PlayerExplosionX[1], PlayerExplosionY[1], PlayerExplosionZ[1]);
    SendClientMessage(playerid, COLOR_LIGHTRED, "Bombe wurde gelegt! Du hast den ROTEN Draht genommen!");
    bombe = CreatePickup(1252,1,PlayerExplosionX[1], PlayerExplosionY[1], PlayerExplosionZ[1],-1);
    ApplyAnimation(playerid, "BOMBER", "BOM_Plant", 4.0, 0, 0, 0, 0, 0);
    bombexplotimer = SetTimerEx("bombexplode",300000,0,"i",playerid);
    BombStatus = 1;
    Bombactivated=1;
    bombdrahtchoosen = 1;
    bombdraht1 = 1;
    bombdraht2 = 0;
    bombdraht3 = 0;
    bombdraht4 = 0;
    bombzone = GangZoneCreate(PlayerExplosionX[1]-random(60), PlayerExplosionY[1]-random(60), PlayerExplosionX[1]+random(60), PlayerExplosionY[1]+random(60));
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsACop(i))
    {
    SendClientMessage(i,COLOR_RED,"BOMBENALARM: Es wurde eine Bombe gelegt!");
    GangZoneShowForPlayer(i,bombzone,COLOR_RED);
    GangZoneFlashForPlayer(i,bombzone,COLOR_GREEN);
    if(IsPlayerInFrac(i, 22))
    {
    SendClientMessage(i, COLOR_RED, "ZENTRALE: Es wurde eine Bombe gelegt!");
    SendClientMessage(i, COLOR_RED, "ZENTRALE: Das Gebiet blinkt rot - grün.");
    SendClientMessage(i, COLOR_RED, "ZENTRALE: Begeben sie sich sofort zur Basis!");
    GangZoneShowForPlayer(i,bombzone,COLOR_RED);
    GangZoneFlashForPlayer(i,bombzone,COLOR_GREEN);
    }
    }
    }
    }
    case 1://gelb maul kadoffel
    {
    GetPlayerPos(playerid, PlayerExplosionX[1], PlayerExplosionY[1], PlayerExplosionZ[1]);
    SendClientMessage(playerid, COLOR_LIGHTRED, "Bombe wurde gelegt! Du hast den GELBEN Draht genommen!");
    bombe = CreatePickup(1252,1,PlayerExplosionX[1], PlayerExplosionY[1], PlayerExplosionZ[1],-1);
    ApplyAnimation(playerid, "BOMBER", "BOM_Plant", 4.0, 0, 0, 0, 0, 0);
    bombexplotimer = SetTimerEx("bombexplode",300000,0,"i",playerid);
    BombStatus = 1;
    Bombactivated=1;
    bombdrahtchoosen = 1;
    bombdraht1 = 0;
    bombdraht2 = 1;
    bombdraht3 = 0;
    bombdraht4 = 0;
    bombzone = GangZoneCreate(PlayerExplosionX[1]-random(60), PlayerExplosionY[1]-random(60), PlayerExplosionX[1]+random(60), PlayerExplosionY[1]+random(60));
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsACop(i))
    {
    SendClientMessage(i,COLOR_RED,"BOMBENALARM: Es wurde eine Bombe gelegt!");
    GangZoneShowForPlayer(i,bombzone,COLOR_RED);
    GangZoneFlashForPlayer(i,bombzone,COLOR_GREEN);
    }
    }
    }
    case 2://grün
    {
    GetPlayerPos(playerid, PlayerExplosionX[1], PlayerExplosionY[1], PlayerExplosionZ[1]);
    SendClientMessage(playerid, COLOR_LIGHTRED, "Bombe wurde gelegt! Du hast den GRÜNEN Draht genommen!");
    bombe = CreatePickup(1252,1,PlayerExplosionX[1], PlayerExplosionY[1], PlayerExplosionZ[1],-1);
    ApplyAnimation(playerid, "BOMBER", "BOM_Plant", 4.0, 0, 0, 0, 0, 0);
    bombexplotimer = SetTimerEx("bombexplode",300000,0,"i",playerid);
    BombStatus = 1;
    Bombactivated=1;
    bombdrahtchoosen = 1;
    bombdraht1 = 0;
    bombdraht2 = 0;
    bombdraht3 = 1;
    bombdraht4 = 0;
    bombzone = GangZoneCreate(PlayerExplosionX[1]-random(60), PlayerExplosionY[1]-random(60), PlayerExplosionX[1]+random(60), PlayerExplosionY[1]+random(60));
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsACop(i))
    {
    SendClientMessage(i,COLOR_RED,"BOMBENALARM: Es wurde eine Bombe gelegt!");
    GangZoneShowForPlayer(i,bombzone,COLOR_RED);
    GangZoneFlashForPlayer(i,bombzone,COLOR_GREEN);
    }
    }
    }
    case 3://blau
    {
    GetPlayerPos(playerid, PlayerExplosionX[1], PlayerExplosionY[1], PlayerExplosionZ[1]);
    SendClientMessage(playerid, COLOR_LIGHTRED, "Bombe wurde gelegt! Du hast den BLAUEN Draht genommen!");
    bombe = CreatePickup(1252,1,PlayerExplosionX[1], PlayerExplosionY[1], PlayerExplosionZ[1],-1);
    ApplyAnimation(playerid, "BOMBER", "BOM_Plant", 4.0, 0, 0, 0, 0, 0);
    bombexplotimer = SetTimerEx("bombexplode",300000,0,"i",playerid);
    BombStatus = 1;
    Bombactivated=1;
    bombdrahtchoosen = 1;
    bombdraht1 = 0;
    bombdraht2 = 0;
    bombdraht3 = 0;
    bombdraht4 = 1;
    bombzone = GangZoneCreate(PlayerExplosionX[1]-random(60), PlayerExplosionY[1]-random(60), PlayerExplosionX[1]+random(60), PlayerExplosionY[1]+random(60));
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsACop(i))
    {
    SendClientMessage(i,COLOR_RED,"BOMBENALARM: Es wurde eine Bombe gelegt!");
    GangZoneShowForPlayer(i,bombzone,COLOR_RED);
    GangZoneFlashForPlayer(i,bombzone,COLOR_GREEN);
    }
    }
    }
    }
    }


    Teste es mal. Ich glaube nicht, dass es funktioniert, weil hier immer noch Code fehlt.
    Außerdem ist der Code wirklich chaotisch.



    Wenn es immer noch explodiert, kannst du ja vor dr Explosion das einfügen:
    if(Bombactivated == 0) return 1;

    Function Bombtimer(time,playerid)
    {
    new string[8];
    format(string,sizeof(string),"%d",time);
    GameTextForPlayer(playerid,string,1000,4);
    if(time>0)
    {
    time--;
    bombtimer = SetTimerEx("Bombtimer",1000,0,"ii",time,playerid);
    }
    else
    {
    SetTimer("Abkling", 120000 , 0);
    KillTimer(bombtimer);
    KillTimer(bombexplotimer);
    SendClientMessageToAll(COLOR_BM,string);
    GangZoneDestroy(bombzone);
    DestroyPickup(bombe);
    Bombactivated=0;
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsACop(i))
    {
    GameTextForPlayer(i,"Bombe entschaerft!",1000,4);
    GangZoneStopFlashForPlayer(i,bombzone);
    GangZoneHideForPlayer(i,bombzone);
    }
    }
    }
    return 1;
    }


    Das wird aber nicht den Fehler beheben, sondern nur eine Reihe anderer Fehler.


    Poste bitte den Code der nach dem Anzeigen des Menüs bis zur Explosion kommt.

    Mir ist noch nicht ganz klar, warum die globalen Variablen zu Caption, Menutext und Buttons unbedingt nötig sind.


    Diese sind für die Aktualisierung der Dialoge notwendig. Vor allem für die Funktion "UpdateDialogForAll", da der Server ja sonst nicht weiß, was er dort hinschreiben soll, das heißt du müsstest es wieder jedes mal selbst angeben, und das wollen wir ja nicht. :)


    Ich hoffe, deine Frage ist damit beantwortet. Falls nicht, oder falls du noch weitere Fragen hast, einfach fragen.

    Ich gebe dir ein paar gute Tipps wie du dir es selbst sehr gut beibringen kannst, so habe ich es zumindest vor fast 5 Jahren gelernt.


    Du solltest dich zu aller erst mit den Grundlagen der Programmierung beschäftigen, bevor du anfängst einen vorhandenen Gamemode zu "vergewaltigen", dazu gehört nämlich ein Grundwissen, welches bei dir offensichtlich fehlt.


    Ich erkläre dir mal wie du am besten lernen kannst, damit du in Zukunft auch verstehst, was ein Code ist, und wann du welchen Code benutzen musst, weil so hat das doch recht wenig Sinn, wenn du nicht mal weißt welchen Code du uns zeigen sollst um das Problem zu beheben.


    Also ich habe PAWN gelernt, indem ich mir den LAdmin4v2 (damals sehr neu) genommen habe, und versucht habe, die einzelnen Teile zu verstehen. Dann habe ich einfach losgelegt, und überlegt, welcher Teil das tut, was ich will. Den Code hab ich mir dann angeschaut, und so für den neuen Code verändert, dass er seinen Zweck erfüllt hat.


    Wichtig: Fang klein an, jeder tut das, nimm nicht gleich einen Gamemode und verunstalte den, du wirst nichts kapieren. Ich arbeite nun über 4 1/2 Jahre mit PAWN und mein Wissen ist noch lange nicht komplett, im Gegenteil.
    Falls dir jemand sagt, du sollst dir die PAWN Doc durchlesen, lass es, genauso rate ich dir davon ab das wiki in allen Einzelteilen durchzulesen. Du wirst es nicht verstehen. Das kannst du in 3 Jahren machen, wenn du es verstehst, und selbst dann wirst du den Großteil in der Pawn Doc nicht auf Anhieb verstehen.


    Noch was: Ausprobieren. Du kannst nichts kaputt machen. Das einzige was passieren kann, ist dass du Errors bekommst. Na und? Für was gibt es STRG+Z. Einfach probieren, wenn du nicht weiter kommst, lass es, oder frag nach Hilfe, sofern es im kleinen Bereich ist.


    Learning By Doing nennt sich das. Nicht aufgeben, einfach machen machen machen. Das muss nicht immer perfekt sein, und muss auch nicht immer Sinn ergeben, hauptsache du machst was. Zum Anfang kannst du dir z.B. vornehmen, einen FilterScript der hier im Forum veröffentlicht wurde (einen einfachen) nachzumachen. Musst ihn ja nicht auch veröffentlichen, aber nur zur Übung einfach nachmachen. Wenn du hängst, kannst du ja nachsehen, was falsch ist.


    Meiner Meinung nach besser als alles andere.


    Wie machst du das?
    Du suchst dir einen Filterscript der irgendwas macht, sei es ein Auto Spawn Menu.
    Schau dir zuerst mal an, was der FilterScript denn machst (z.B. ein Auto-Menu, um Auto's zu spawnen). Dann überlegst du, was du denn alles dafür brauchst, suchst dir die Funktionen zusammen (Google, SAMP Wiki) und legst los so ein Menu zu erstellen. Wenn du irgendwo hängst, kannst du einen Blick in den Code werfen, und ein paar Zeilen, die du denkst zu verstehen abschreiben, dann siehst du ja was passiert.
    Am Besten ist es aber, wenn du es ganz ohne in den Code zu schauen hin bekommst, deshalb fang mit leichten Dingen an.
    Bis du erst mal richtig rein findest vergehen mit Sicherheit 1-3 Monate! Also nicht verzagen, du wirst am Anfang ziemlich oft stecken bleiben und auf die Nase fallen (ist wie laufen lernen). Ich weiß das von mir. Wenn du einmal drinne bist, dann gehts jeden Tag besser.


    PS: Ich hab es ganz alleine gelernt. Die einzige Hilfestellung die ich damals hatte war ein /kill Command aus 6 Zeilen code, den mir jemand gemacht hat. Den gebe ich dir auch:
    if(strcmp(cmdtext, "/kill", true) == 0)
    {
    SetPlayerHealth(playerid, 0.0);
    SendClientMessage(playerid, 0xFF0000FF, "Du hast dich selbst getötet.");
    return 1;
    }
    Probiere aus, mit diesem Code klar zu kommen.
    Das fügst du im callback OnPlayerCommandText ein. Dann auf den Compiler drücken, und Server neu starten.
    Wenn du damit klar kommst, gehe weiter und versuche Dinge selbst zu erstellen.


    Und am wichtigsten: Immer dranbleiben!
    Viel Erfolg!

    Du könntest ihn spawnen (erste Zeile die du auskommmentiert hast) und eine Variable auf 1 setzen, damit du weißt, dass der Spieler in die Selektion muss. Vor dem spawnen SetSpawnInfo nicht vergessen.


    Dann bei OnPlayerSpawn abfragen, und ihn dort in deine selbst gemachte Selektion setzen. Dann hast du den Spawn Button weg.

    Darf ich fragen wieso du überhaupt die Zeit abfragst?
    Der Timer wird erst dann ausgeführt, wenn die angegebene Zeit abgelaufen ist.


    Ja da hast du Recht. In diesem Fall würde es sogar reichen, einfach den Timer zu starten wenn die Taste gedrückt wird, und zu beenden falls sie losgelassen wird.
    Der Timer wird auf die gewünschte Zeit gesetzt, und darf sich nicht wiederholen.


    Wäre hier sicher die schönere Variante.

    CMD:ashow(playerid,params[])
    {
    if(!IstSpielerAdmin(playerid,3)) return SCM(playerid,weiss,"Sie haben keine Berechtigung.");
    if(!strlen(params)) return SCM(playerid,weiss,"Nutze /ashow [Text]");
    new text[200];
    format(text,sizeof(text),"Admin Ankündigung: ''%s''",params);
    InfoTextForAll("Admin Ankündigung",text,5000);
    return 1;
    }