Motorschaden problem / SendPlayerMessage Spam

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hallo ich habe mal ein bisjen an einen Motorschadensystem gefummelt bloß 1 sache funzt nicht so wie ich es will sonst geht alles.
    unzwar es wird wenn das fahrzeug bei schaden 315 ist natürlich geht dann der motor aus und es kommt die meldung motorschaden halt und so bloß die wird immer gespamt die meldung jede sekunde. ich will das sie nur 1 mal kommt wie mache ich das? habe natürlich nen timer auf 1 Sekunde der den Public aufruft
    public GlobalTimer()
    {
    new vid, Float:h_vid;
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i) && IsPlayerInAnyVehicle(i))
    {
    vid = GetPlayerVehicleID(i);
    GetVehicleHealth(vid, h_vid);
    if(h_vid <= 315)
    {
    //TogglePlayerControllable(i, 0);
    SetVehicleParamsEx(VID,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    SendClientMessage(i, COLOR_RED, "Motorschaden! Bitte rufen sei einen ADAC.");
    return 1;
    }
    }
    }
    return 0;
    }


    danke euch
    Liebe grüße
    HaxXorr :)


    //edit: Überschrift geändert

    Einmal editiert, zuletzt von Barney_Gumble ()

  • Dein Globaler Timer wird wahrscheinlich immer wiederholt werden, dadurch wird alles jedesmal beim Timer Aufruf wiederholt - somit auch die SendClientMessage.


    Die Meldung, wenn das Fahrzeug einen Motorschaden hat, sollte dann wohl eher bei OnPlayerStateChange rein. ;)

  • Irgendwie kriege ich das nicht so hin, kann mir da vielleicht einer ne Vorlage geben, oder wenn ihr so nett wärt mir das zurecht machen, damit ich das nur einfügen muss.
    Wäre echt nett
    Liebe Grüße und Danke
    HaxXorr :)


    habe es jetzt so :( geht aber nicht bzw. es passiert nichts habe alles ausprobiert
    new vehicleid = GetPlayerVehicleID(playerid);
    new Float:vHP;
    GetVehicleHealth(vehicleid, vHP);
    if(vHP <= 310)
    {
    SendClientMessage(playerid, COLOR_RED, "Motorschaden!");
    TogglePlayerControllable(playerid, 0);
    }


    //edit code eingefügt

    Einmal editiert, zuletzt von Barney_Gumble ()

  • SetTimer("GlobalTimer", 1000, 1);

    public GlobalTimer()
    {
    new VID, Float:h_vid;
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i) && IsPlayerInAnyVehicle(i))
    {
    VID = GetPlayerVehicleID(i);
    GetVehicleHealth(VID, h_vid);
    if(h_vid <= 310)
    {
    TogglePlayerControllable(i, 0);
    SendClientMessage(i, 0xFF6900AA, "Dieses Fahrzeug hat nun einen Motorschaden");
    }
    }
    }
    }

  • new GlobalerTimer;


    GlobalerTimer = SetTimer("GlobalTimer", 1000, 1);


    public GlobalTimer()
    {
    new VID, Float:h_vid;
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i) && IsPlayerInAnyVehicle(i))
    {
    VID = GetPlayerVehicleID(i);
    GetVehicleHealth(VID, h_vid);
    if(h_vid <= 310)
    {
    TogglePlayerControllable(i, 0);
    SendClientMessage(i, 0xFF6900AA, "Dieses Fahrzeug hat nun einen Motorschaden");
    KillTimer(GlobalerTimer);
    }
    }
    }
    }
    Versuch es mal so, und falls das Fahrzeug dann wieder repariert ist, startest du den Timer halt wieder.
    MfG
    Maxx

  • das wird imme rnoch die ganze zeit gespamt.
    Dieses Fahrzeug hat nun einen Motorschaden

  • bekomme nen warning
    C:\Users\JuliaN\Desktop\SAMP\gamemodes\Force.PWN(35406) : warning 209: function "GlobalTimer" should return a value


    habs dann so probiert ging auch ohne warnings
    public GlobalTimer()
    {
    new VID, Float:h_vid;
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i) && IsPlayerInAnyVehicle(i))
    {
    VID = GetPlayerVehicleID(i);
    GetVehicleHealth(VID, h_vid);
    if(h_vid <= 310)
    {
    TogglePlayerControllable(i, 0);
    SendClientMessage(i, 0xFF6900AA, "Dieses Fahrzeug hat nun einen Motorschaden");
    KillTimer(GlobalerTimer);
    }
    }
    }
    return 1;
    }
    Es spamt aber immer noch jede Sekunde

    Einmal editiert, zuletzt von Barney_Gumble ()

  • He wie genau soll ich das machen?
    GW Maxx 3 000 Profilaufrufe ;D

  • Ja aber warum geht das heir nicht alle meinten in anderen threads ich sollte es so machen
    Das unter OnPlayerStateChange. Da ist es ja auch drunte rmit Du bist kein Mitglied der Grove Street oder so wenn man in dne Grove Street car steigt:
    new vehicleid = GetPlayerVehicleID(playerid);
    new Float:vHP;
    GetVehicleHealth(vehicleid, vHP);
    if(vHP <= 400 && newstate == PLAYER_STATE_DRIVER)
    {
    SetVehicleHealth(vehicleid, 300.0);
    SendClientMessage(playerid, COLOR_RED, "Motorschaden!");
    TogglePlayerControllable(playerid, false);
    }
    Warum geht das nicht ingame passiert dann garnichts


    Das hier ist das von dma daher habe ich das ja. Aber wie gesagt auch da wird immer Motorschaden gespamt
    static bool:playerMessageMotorschade[MAX_PLAYERS] = { false }; /* Man kann nie sichersein ob er es auch als 0 initalisiert, (C/++) */
    forward GlobalTimer(/*void*/);
    public OnGameModeInit() {
    SetTimer("GlobalTimer", 1000, 1); /* Solltest du schon ein anders Script von mir mit Globaltimer haben, die zeile */
    }
    public OnPlayerDisconnect(playerid) {
    playerMessageMotorschaden[playerid] = false;
    return 1; /* -> true */
    }
    public OnPlayerExitVehicle(playerid, vehicleid) { /* hier bin ich mir nicht sicher, bitte prüfen wie das Callback heißt :> */
    if(playerMessageMotorschade[playerid] == true)
    playerMessageMotorschade[playerid] = false;
    }
    public GlobalTimer() {
    new VID, Float:h_vid;
    for(new i = 0; i < MAX_PLAYERS; i++) {
    if(IsPlayerConnected(i) && IsPlayerInAnyVehicle(i)) {
    VID = GetPlayerVehicleID(i);
    GetVehicleHealth(VID, h_vid);
    if(h_vid <= 310) {
    TogglePlayerControllable(i, 0);
    SendClientMessage(playerid, 0xFF6900AA, "Dieses Fahrzeug hat nun einen Motorschaden");
    playerMessageMotorschade[i] = true;
    } } } }




    //edit: DMA'S motorsystem eingefügt

    Einmal editiert, zuletzt von Barney_Gumble ()

  • Also du stellst dich echt an :D


    Also als erstes wird dieser Timer dir irgendwann Kopfschmerzen verursachen. Such dir ein Timer der eventuell schon in deinem Script läuft und füge es dort ein :)



    public GlobalTimer()
    { new VID, Float:h_vid;
    for(new i = 0; i < MAX_PLAYERS; i++)
    { if(IsPlayerConnected(i) && IsPlayerInAnyVehicle(i))
    { VID = GetPlayerVehicleID(i); GetVehicleHealth(VID, h_vid);
    if(h_vid <= 310)
    { TogglePlayerControllable(i, 0);
    if(playerMessageMotorschade[i] == 0)
    {
    SendClientMessage(playerid, 0xFF6900AA, "Dieses Fahrzeug hat nun einen Motorschaden");
    }
    playerMessageMotorschade[i] = true;
    } } } }


    //...

  • Danke es geht, es wird nun nicht mehr gespamt. Aber trotzdem liegt noch 1 Problem vor wenn ich dann aussteige und wieder einsteige kommt die meldung nicht mehr.

  • public OnPlayerExitVehicle(playerid, vehicleid) { /* hier bin ich mir nicht sicher, bitte prüfen wie das Callback heißt :> */ if(playerMessageMotorschade[playerid] == true) playerMessageMotorschade[playerid] = false; }

  • verstehe ich irgendwie nicht ganz.
    Habe damit nen bisl gefummelt blos kriege es nciht hin

  • habs so drinne
    if(playerMessageMotorschade[playerid] == true)
    {
    playerMessageMotorschade[playerid] = false;
    }


    geht trotzdem nicht hatte es auch so drinne wie dus oben geschrieben hast:
    if(playerMessageMotorschade[playerid] == true)
    playerMessageMotorschade[playerid] = false;
    }


    geht auch nicht bzw. wenn ich aussteige und wieder einsteige nachm motorschaden kommt der text nicht mehr motorschaden

  • Bei OnPlayerExitVehicle


    if(playerMessageMotorschade[playerid] == 1)
    {
    playerMessageMotorschade[playerid] = 0;
    }


    Bitte guck auch nach nicht das davor irgendwo ein return 1; drin steckt

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen