From 8f6058b86a94450e07dcdd576fc7a77ac6a293cc Mon Sep 17 00:00:00 2001 From: Steven Howard Date: Thu, 11 Oct 2018 00:40:49 +0100 Subject: [PATCH] starting on damage feed, ideal for dmers --- .../irresistible/anticheat/damage_feed.pwn | 176 ++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 gamemodes/irresistible/anticheat/damage_feed.pwn diff --git a/gamemodes/irresistible/anticheat/damage_feed.pwn b/gamemodes/irresistible/anticheat/damage_feed.pwn new file mode 100644 index 0000000..813c7dc --- /dev/null +++ b/gamemodes/irresistible/anticheat/damage_feed.pwn @@ -0,0 +1,176 @@ +/* + * Irresistible Gaming (c) 2018 + * Developed by Steven Howard + * Module: anticheat/damage_feed.pwn + * Purpose: damage feed for dmers + */ + +/* ** Includes ** */ +#include < YSI\y_hooks > + +/* ** Definitions ** */ +#define MAX_FEED_HEIGHT ( 5 ) +#define HIDE_FEED_DELAY ( 3000 ) +#define MAX_UPDATE_RATE ( 250 ) + +/* ** Variables ** */ +enum E_DAMAGE_FEED +{ + E_ISSUER, E_NAME[ MAX_PLAYER_NAME ], Float: E_AMOUNT, + E_WEAPON, E_TICK, +}; + +static stock + g_damageGiven [ MAX_PLAYERS ][ MAX_FEED_HEIGHT ][ E_DAMAGE_FEED ], + g_damageTaken [ MAX_PLAYERS ][ MAX_FEED_HEIGHT ][ E_DAMAGE_FEED ], + + PlayerText: g_damageFeedTakenTD [ MAX_PLAYERS ] = { PlayerText: INVALID_TEXT_DRAW, ... }, + PlayerText: g_damageFeedGivenTD [ MAX_PLAYERS ] = { PlayerText: INVALID_TEXT_DRAW, ... }, + + p_damageFeedTimer [ MAX_PLAYERS ], + p_lastFeedUpdate [ MAX_PLAYERS ] +; + +/* ** Hooks ** */ +hook OnPlayerConnect( playerid ) +{ + for( new i = 0; i < sizeof( g_damageGiven[ ] ); i ++) { + g_damageGiven[ playerid ][ i ][ E_TICK ] = 0; + g_damageTaken[ playerid ][ i ][ E_TICK ] = 0; + } + + p_lastFeedUpdate[ playerid ] = GetTickCount( ); + return 1; +} + +/* ** Functions ** */ +function OnPlayerFeedUpdate( playerid ) +{ + return 1; +} + +stock UpdateDamageFeed( playerid, bool: modified = false ) +{ +/* ** Textdraws ** */ + if ( g_damageFeedGivenTD[ playerid] == PlayerText: INVALID_TEXT_DRAW ) + { + new PlayerText: handle = CreatePlayerTextDraw( playerid, 200.000000, 340.000000, "_"); + + if ( handle == PlayerText: INVALID_TEXT_DRAW ) + return print("[DAMAGE FEED ERROR]: Unable to create TD (given damage)" ), 0; + + PlayerTextDrawAlignment( playerid, handle, 2 ); + PlayerTextDrawBackgroundColor( playerid, handle, 255 ); + PlayerTextDrawFont( playerid, handle, 1 ); + PlayerTextDrawLetterSize( playerid, handle, 0.200000, 0.899999 ); + PlayerTextDrawColor( playerid, handle, -16776961 ); + PlayerTextDrawSetOutline( playerid, handle, 1 ); + PlayerTextDrawSetProportional( playerid, handle, 1 ); + PlayerTextDrawSetSelectable( playerid, handle, 0 ); + + g_damageFeedGivenTD[ playerid ] = handle; + } + + + if ( g_damageFeedTakenTD[ playerid] == PlayerText: INVALID_TEXT_DRAW ) + { + new PlayerText: handle = CreatePlayerTextDraw( playerid, 440.000000, 340.000000,, "_"); + + if ( handle == PlayerText: INVALID_TEXT_DRAW ) + return print("[DAMAGE FEED ERROR]: Unable to create TD (taken damage)" ), 0; + + PlayerTextDrawBackgroundColor( playerid, handle, 255 ); + PlayerTextDrawFont( playerid, handle, 1 ); + PlayerTextDrawLetterSize( playerid, handle, 0.200000, 0.899999 ); + PlayerTextDrawColor( playerid, handle, 16711935 ); + PlayerTextDrawSetOutline( playerid, handle, 1 ); + PlayerTextDrawSetProportional( playerid, handle, 1 ); + PlayerTextDrawSetSelectable( playerid, handle, 0 ); + + g_damageFeedTakenTD[ playerid ] = handle; + } + +/* ** Core ** */ + + new szTick = GetTickCount( ); + if ( szTick == 0) szTick = 1; + new low_tick = ( szTick + 1 ); + + for( new i = 0; i < sizeof( g_damageGiven[ ] ) - 1; i ++) + { + if ( !g_damageGiven[ playerid ][ i ][ E_TICK ] ) { + break; + } + + if ( szTick - g_damageGiven[ playerid ][ i ][ E_TICK ] >= HIDE_FEED_DELAY ) + { + modified = true; + + for (new j = i; j < sizeof( g_damageGiven[ ] ) - 1; j++) { + g_damageGiven[ playerid ][ j ][ E_TICK ] = 0; + } + + break; + } + + if (g_damageGiven[ playerid ][ i ][ E_TICK ] < low_tick) { + low_tick = g_damageGiven[ playerid ][ i ][ E_TICK ]; + } + } + + for( new i = 0; i < sizeof( g_damageTaken[ ] ) - 1; i ++) + { + if ( !g_damageTaken[ playerid ][ i ][ E_TICK ] ) { + break; + } + + if ( szTick - g_damageTaken[ playerid ][ i ][ E_TICK ] >= HIDE_FEED_DELAY ) + { + modified = true; + + for (new j = i; j < sizeof( g_damageTaken[ ] ) - 1; j++) { + g_damageTaken[ playerid ][ j ][ E_TICK ] = 0; + } + + break; + } + + if (g_damageTaken[ playerid ][ i ][ E_TICK ] < low_tick) { + low_tick = g_damageTaken[ playerid ][ i ][ E_TICK ]; + } + } + + if ( p_damageFeedTimer[ playerid ] != -1 ) { + KillTimer( p_damageFeedTimer[ playerid ] ); + } + + if ( szTick - p_lastFeedUpdate[ playerid ] < MAX_UPDATE_RATE && modified ) + { + p_damageFeedTimer[ playerid ] = SetTimerEx( "OnPlayerFeedUpdate", MAX_UPDATE_RATE - ( szTick - low_tick ) + 10, false, "d", playerid ); + } + else + { + if ( lowest_tick == tick + 1 ) { + p_damageFeedTimer[playerid] = -1; + modified = true; + } else { + p_damageFeedTimer[playerid] = SetTimerEx( "OnPlayerFeedUpdate", HIDE_FEED_DELAY - ( szTick - lowest_tick ) + 10, false, "i", playerid ); + } + + if (modified) + { + UpdateDamageFeedLabel( playerid ); + + p_lastFeedUpdate[ playerid ] = szTick; + } + } +} + +stock UpdateDamageFeedLabel( playerid ) +{ + new + szLabel[ 64 * MAX_FEED_HEIGHT ] + ; + + FOR +} \ No newline at end of file