Tag mismatch with enum and integers
#1

Hello, in my gamemode I have an include called callbackflooddetector that tells me if a player floods certain callbacks, because some players do that with specialized hacking tools as a way of attacking my server. Until now I was using defines for the callbacks that I want to detect flood on, but since the number of those callbacks also affects the number of cells of one of my arrays, I now thought it was better to use an enum.
To avoid very long chunks of code, I'm posting only the lines that are relevant to my problem, instead of the entire include.

This was my include before, when using defines:
pawn Код:
#if defined _calflodet_included
    #endinput
#endif
#define _calflodet_included

#include <a_samp>

#define mintimebetweencallbacks 200 // In miliseconds.

#define cfdOnDialogResponse                 0
#define cfdOnEnterExitModShop               1
#define cfdOnPlayerClickMap                 2
#define cfdOnPlayerClickPlayer              3
#define cfdOnPlayerClickPlayerTextDraw      4
#define cfdOnPlayerClickTextDraw            5
#define cfdOnPlayerDisconnect               6
#define cfdOnPlayerEditAttachedObject       7
#define cfdOnPlayerEditObject               8
#define cfdOnPlayerEnterCheckpoint          9
#define cfdOnPlayerEnterRaceCheckpoint      10
#define cfdOnPlayerEnterVehicle             11
#define cfdOnPlayerExitVehicle              12
#define cfdOnPlayerExitedMenu               13
#define cfdOnPlayerInteriorChange           14
#define cfdOnPlayerLeaveCheckpoint          15
#define cfdOnPlayerLeaveRaceCheckpoint      16
#define cfdOnPlayerObjectMoved              17
#define cfdOnPlayerPickUpPickup             18
#define cfdOnPlayerRequestClass             19
#define cfdOnPlayerRequestSpawn             20
#define cfdOnPlayerSelectObject             21
#define cfdOnPlayerSelectedMenuRow          22
#define cfdOnPlayerStateChange              23
#define cfdOnVehicleRespray                 24

new stock lastcallbacktime[MAX_PLAYERS][25]; // This is where I would have to manually change the number of cells if I add or remove defines.

stock checkcallbackflood(playerid, callback)
{
    new currenttime, bool:flood;
    currenttime = GetTickCount();
    if( (currenttime - lastcallbacktime[playerid][callback]) < mintimebetweencallbacks )
    {
        flood = true;
    }
    lastcallbacktime[playerid][callback] = currenttime;
    if(flood)
    {
        CallRemoteFunction("OnCallbackFlood", "ii", playerid, callback); // I use CallRemoteFunction so I can use this custom callback in filterscripts too.
        return 1;
    }
    return 0;
}
And this is my new code, using an enum instead:
pawn Код:
#if defined _calflodet_included
    #endinput
#endif
#define _calflodet_included

#include <a_samp>

#define mintimebetweencallbacks 200 // In miliseconds.

enum cfdCallbacks
{
    cfdOnDialogResponse,
    cfdOnEnterExitModShop,
    cfdOnPlayerClickMap,
    cfdOnPlayerClickPlayer,
    cfdOnPlayerClickPlayerTextDraw,
    cfdOnPlayerClickTextDraw,
    cfdOnPlayerDisconnect,
    cfdOnPlayerEditAttachedObject,
    cfdOnPlayerEditObject,
    cfdOnPlayerEnterCheckpoint,
    cfdOnPlayerEnterRaceCheckpoint,
    cfdOnPlayerEnterVehicle,
    cfdOnPlayerExitVehicle,
    cfdOnPlayerExitedMenu,
    cfdOnPlayerInteriorChange,
    cfdOnPlayerLeaveCheckpoint,
    cfdOnPlayerLeaveRaceCheckpoint,
    cfdOnPlayerObjectMoved,
    cfdOnPlayerPickUpPickup,
    cfdOnPlayerRequestClass,
    cfdOnPlayerRequestSpawn,
    cfdOnPlayerSelectObject,
    cfdOnPlayerSelectedMenuRow,
    cfdOnPlayerStateChange,
    cfdOnVehicleRespray,
};

new stock lastcallbacktime[MAX_PLAYERS][cfdCallbacks]; // Now, if I add or remove callbacks from the enum, the number of cells will be automatically adjusted.

stock checkcallbackflood(playerid, callback)
{
    new currenttime, bool:flood;
    currenttime = GetTickCount();
    if( (currenttime - lastcallbacktime[playerid][callback]) < mintimebetweencallbacks )
    {
        flood = true;
    }
    lastcallbacktime[playerid][callback] = currenttime;
    if(flood)
    {
        CallRemoteFunction("OnCallbackFlood", "ii", playerid, callback); // I use CallRemoteFunction so I can use this custom callback in filterscripts too.
        return 1;
    }
    return 0;
}
However, now that I'm using that enum, when I compile my gamemode with pawno I get 2 tag mismatch warnings, one for this line:
pawn Код:
if( (currenttime - lastcallbacktime[playerid][callback]) < mintimebetweencallbacks )
and the other for this one:
pawn Код:
lastcallbacktime[playerid][callback] = currenttime;
Why is this happening if all of them are just plain integers?
Reply
#2

Bump.
Reply
#3

Код:
new stock lastcallbacktime[MAX_PLAYERS][25];
?

Код:
new lastcallbacktime[MAX_PLAYERS][25];
Reply
#4

Quote:
Originally Posted by Golf
Посмотреть сообщение
Код:
new stock lastcallbacktime[MAX_PLAYERS][25];
?

Код:
new lastcallbacktime[MAX_PLAYERS][25];
Thanks for the reply but removing the 'stock' doesn't solve my problem.
Reply
#5

pawn Код:
#if defined _calflodet_included
    #endinput
#endif
#define _calflodet_included

#include <a_samp>

#define mintimebetweencallbacks 200 // In miliseconds.

enum cfdCallbacks
{
    cfdOnDialogResponse,
    cfdOnEnterExitModShop,
    cfdOnPlayerClickMap,
    cfdOnPlayerClickPlayer,
    cfdOnPlayerClickPlayerTextDraw,
    cfdOnPlayerClickTextDraw,
    cfdOnPlayerDisconnect,
    cfdOnPlayerEditAttachedObject,
    cfdOnPlayerEditObject,
    cfdOnPlayerEnterCheckpoint,
    cfdOnPlayerEnterRaceCheckpoint,
    cfdOnPlayerEnterVehicle,
    cfdOnPlayerExitVehicle,
    cfdOnPlayerExitedMenu,
    cfdOnPlayerInteriorChange,
    cfdOnPlayerLeaveCheckpoint,
    cfdOnPlayerLeaveRaceCheckpoint,
    cfdOnPlayerObjectMoved,
    cfdOnPlayerPickUpPickup,
    cfdOnPlayerRequestClass,
    cfdOnPlayerRequestSpawn,
    cfdOnPlayerSelectObject,
    cfdOnPlayerSelectedMenuRow,
    cfdOnPlayerStateChange,
    cfdOnVehicleRespray
};

new lastcallbacktime[MAX_PLAYERS][cfdCallbacks];

stock checkcallbackflood(playerid, cfdCallbacks:callback)
{
    new currenttime = GetTickCount(), bool:flood = false;
    if((currenttime - lastcallbacktime[playerid][callback]) < mintimebetweencallbacks)
    {
        flood = true; //Do you need this?
        CallRemoteFunction("OnCallbackFlood", "ii", playerid, callback);
    }
    lastcallbacktime[playerid][callback] = currenttime;
    return 1;
}
Reply
#6

Quote:
Originally Posted by Threshold
Посмотреть сообщение
pawn Код:
stock checkcallbackflood(playerid, cfdCallbacks:callback)
YESSS!!! This solved my problem!! Thank you very much!
I never thought cfdCallbacks:callback was correct code, how did you learn that?
Reply
#7

Good question. Lol. I'm not really sure.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)