i don't know if that is what you are looking for, but here is a code snippet i released a while ago for kicking an AFK leveling player (showing a warning message to the player before kicking).
Thanks to @Darn for adding warning message and some improvments.
Code:
struct afk{
int x;
int y;
int cd;
bool Warning;
};
map<DWORD, afk> afkMap;
void __fastcall ApplyDamage_hooked(int* thisMonster, void *_edx, int* PlayerArray, int a3, int Damage, int a5, int a6, int a7, int a8){
auto_ptr<KPlayer> Player(new KPlayer(PlayerArray));
auto_ptr<KServer> Server;
int WarningDelay = 10;//display a warning after 10min
int KickDelay = 15; //kick after 15min
int _WarningDelay = WarningDelay * 60000;
int _KickDelay = KickDelay * 60000;
int pid = Player->GetPid();//PlayerArray[113];
int x = Player->GetX();//PlayerArray[83];
int y = Player->GetY();//PlayerArray[84];
if(afkMap[pid].x != x || afkMap[pid].y != y){
afkMap[pid].x = (x);
afkMap[pid].y = (y);
afkMap[pid].cd = (GetTickCount64());
afkMap[pid].Warning = (false);
}
if(!afkMap[pid].Warning && GetTickCount64() > (afkMap[pid].cd + _WarningDelay)){
afkMap[pid].Warning = (true);
Player->ChatMessage("Server", "Warning, move now or get kicked in %i min.", (KickDelay - WarningDelay));
}
else if(afkMap[pid].Warning && GetTickCount64() > (afkMap[pid].cd + _KickDelay))
{
Player->Kick("You've been kicked for AFK leveling");
Server->ConsoleWrite(TextColor::DARK_MAGENTA, "Player: %s Kicked for AFK leveling at X:%i Y:%i", Player->GetName(), Player->GetX(), Player->GetY());
afkMap.erase(pid);
}
else{//Apply dmg to the Monster
Server::CMonsterReal::ApplyDamage(thisMonster,PlayerArray,a3,Damage,a5,a6,a7,a8);
}
}
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){
auto_ptr<LunaCore> Core(new LunaCore());
Core->Init(ul_reason_for_call, Exports::ServerSide);
Core->Register(&(PVOID&)Server::CMonsterReal::ApplyDamage, ApplyDamage_hooked);
return Core->Run();
}