Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- new const VERSION[ ] = "1.0.0";
- #include < amxmodx >
- #include < fun >
- #include < engine >
- #include < cstrike >
- #include < fakemeta >
- #include < hamsandwich >
- #include < cs_team_changer >
- #include "ogc_zp/defines.inc"
- // ===================================================================================
- // >> INTEGERS
- // ===================================================================================
- new gD_status[ 33 ], gD_ammopacks[ 33 ], gD_zombieClass[ 33 ];
- new gMsg_DeathMsg, gMsg_ScoreAttrib;
- // ===================================================================================
- // >> BOOLEANS
- // ===================================================================================
- new bool: gB_alive[ 33 ], bool: gB_connected[ 33 ];
- // ===================================================================================
- // >> BITS
- // ===================================================================================
- new gBi_Round, gBi_PreRound;
- // ===================================================================================
- // >> FLOATS
- // ===================================================================================
- new Float: gF_damagesAP[ 33 ], Float: gF_gameTime, gF_spawnProtect[ 33 ];
- // ===================================================================================
- // >> STRINGS
- // ===================================================================================
- new gZ_ClassName[ MAX_CLASS ][ 32 ];
- new gS_playerName[ 33 ][ 32 ];
- new const player[ ] = "player";
- new const entity_hud[ ] = "entity_hud";
- // ===================================================================================
- // >> INIT - PRECACHE
- // ===================================================================================
- public plugin_init( )
- {
- #define PRE false
- #define POST true
- register_plugin( "[ZP] Main Core", VERSION, "AREAAZ" );
- register_dictionary( "zombie_plague.txt" );
- //--------> EVENTS
- register_event( "HLTV", "EVENT__HLTV", "a", "1=0", "2=0" );
- register_logevent( "EVENT__ROUND_END", 2, "1=Round_End" );
- //--------> HAMSANDWICH
- RegisterHam( Ham_Spawn, player, "HAM__POST_SPAWN", POST );
- RegisterHam( Ham_Killed, player, "HAM__POST_Killed", POST );
- RegisterHam( Ham_TakeDamage, player, "HAM__POST_TakeDamage", POST );
- RegisterHam( Ham_TakeDamage, player, "HAM__PRE_TakeDamage", PRE );
- //--------> FAKEMETA
- register_forward( FM_ClientUserInfoChanged, "FM__POST_ClientUserInfoChanged", POST );
- //--------> ENGINE
- register_think( entity_hud, "ENGINE__THINK_EntityHud" );
- register_touch( "weaponbox", player, "ENGINE__TOUCH_WeaponBox" );
- gF_gameTime = get_gametime( ) + 1.0;
- new const entity = create_entity( "info_target" );
- entity_set_string( entity, EV_SZ_classname, entity_hud );
- entity_set_float( entity, EV_FL_nextthink, gF_gameTime );
- //--------> OTHERS
- gMsg_DeathMsg = get_user_msgid( "DeathMsg" );
- gMsg_ScoreAttrib = get_user_msgid( "ScoreAttrib" );
- gBi_Round = ROUND_NOMODE;
- }
- public plugin_init_bots( const id )
- {
- RegisterHamFromEntity( Ham_Spawn, id, "HAM__POST_SPAWN", POST );
- RegisterHamFromEntity( Ham_Killed, id, "HAM__POST_Killed", POST );
- RegisterHamFromEntity( Ham_TakeDamage, id, "HAM__POST_TakeDamage", POST );
- RegisterHamFromEntity( Ham_TakeDamage, id, "HAM__PRE_TakeDamage", PRE );
- HAM__POST_SPAWN( id );
- }
- public plugin_precache( )
- {
- precache_sound( SOUND_ARMOR_HIT );
- }
- // ===================================================================================
- // >> AMXMODX
- // ===================================================================================
- public client_putinserver( id )
- {
- gB_connected[ id ] = true;
- static g_registered;
- if( !g_registered && is_user_bot( id ) )
- {
- g_registered = 1;
- set_task( 0.4, "plugin_init_bots", id );
- }
- }
- public client_disconnect( id )
- {
- gB_connected[ id ] = false;
- gB_alive[ id ] = false;
- gF_damagesAP[ id ] = 0.0;
- gD_status[ id ] = STATUS_HUMAN;
- gD_ammopacks[ id ] = 0;
- }
- public EVENT__HLTV( )
- {
- remove_task( TASK_ID_BEGIN );
- switch( random( 100 ) )
- {
- case 0..5:
- {
- gBi_PreRound = ROUND_NEMESIS;
- }
- case 6..10:
- {
- gBi_PreRound = ROUND_SWARM;
- }
- case 11..100:
- {
- gBi_PreRound = ROUND_SURVIVOR;
- }
- default:
- {
- gBi_PreRound = ROUND_NORMAL;
- }
- }
- gBi_Round = ROUND_NOMODE;
- set_task( TASK_TIME_BEGIN, "TASK__BeginRound", TASK_ID_BEGIN );
- arrayset( gD_status, STATUS_HUMAN, 32 );
- }
- public EVENT__ROUND_END( )
- {
- static Float: lastTime;
- if( gF_gameTime - lastTime > 0.5 )
- {
- lastTime = gF_gameTime;
- new players[ 32 ], num;
- get_players( players, num, "h" );
- new playersCT[ 32 ], playersT[ 32 ];
- new ctTeam, tTeam;
- for( new i = 0, id = players[ 0 ]; i < num; id = players[ ++ i ] )
- {
- switch( cs_get_user_team( id ) )
- {
- case CS_TEAM_CT:
- {
- playersCT[ ctTeam ] = id;
- ++ ctTeam;
- }
- case CS_TEAM_T:
- {
- playersT[ tTeam ] = id;
- ++ tTeam;
- }
- }
- }
- client_print( 0, print_chat, "%d %d", ctTeam, tTeam );
- new player;
- while( tTeam - ctTeam > 1 )
- {
- player = 0;
- while( !player )
- {
- player = playersT[ random_num( 0, tTeam - 1 ) ];
- }
- cs_set_team( player, _: CS_TEAM_CT );
- -- tTeam;
- ++ ctTeam;
- }
- while( ctTeam - tTeam > 1 )
- {
- player = 0;
- while( !player )
- {
- player = playersCT[ random_num( 0, ctTeam - 1 ) ];
- }
- cs_set_team( player, _: CS_TEAM_T );
- -- ctTeam;
- ++ tTeam;
- }
- if( !CORE__GET_PLAYERS_COUNT( STATUS_ZOMBIE, 1 ) && !CORE__GET_PLAYERS_COUNT( STATUS_NEMESIS, 1 ) )
- {
- set_hudmessage( 0, 0, 200, HUD_EVENT_X, HUD_EVENT_Y, 0, 0.0, 3.0, 2.0, 1.0, HUD_CHAN_EVENT );
- show_hudmessage( 0, "%L", LANG_PLAYER, "WIN_HUMAN" );
- }
- else if( !CORE__GET_PLAYERS_COUNT( STATUS_HUMAN, 1 ) && !CORE__GET_PLAYERS_COUNT( STATUS_SURVIVOR, 1 ) )
- {
- set_hudmessage( 200, 0, 0, HUD_EVENT_X, HUD_EVENT_Y, 0, 0.0, 3.0, 2.0, 1.0, HUD_CHAN_EVENT );
- show_hudmessage( 0, "%L", LANG_PLAYER, "WIN_ZOMBIE" );
- }
- else
- {
- set_hudmessage( 200, 0, 0, HUD_EVENT_X, HUD_EVENT_Y, 0, 0.0, 3.0, 2.0, 1.0, HUD_CHAN_EVENT );
- show_hudmessage( 0, "%L", LANG_PLAYER, "WIN_NO_ONE" );
- }
- }
- }
- // ===================================================================================
- // >> ENGINE
- // ===================================================================================
- public ENGINE__THINK_EntityHud( const entity )
- {
- for( new id = 1; id <= MAX_PLAYERS; id ++ )
- {
- if( gB_connected[ id ] )
- {
- if( gB_alive[ id ] )
- {
- switch( gD_status[ id ] )
- {
- case STATUS_SURVIVOR:
- {
- set_hudmessage( 0, 0, 255, HUD_STATS_X, HUD_STATS_Y, 2, 0.0, 1.1, 0.0, 0.0, HUD_CHAN_STATS );
- show_hudmessage( id, "%L >> %L: %d - %L %d", id, "CLASS_SURVIVOR", id, "ZOMBIE_ATTRIB1", get_user_health( id ), id, "AMMO_PACKS1", gD_ammopacks[ id ] );
- }
- case STATUS_HUMAN:
- {
- set_hudmessage( 0, 0, 255, HUD_STATS_X, HUD_STATS_Y, 2, 0.0, 1.1, 0.0, 0.0, HUD_CHAN_STATS );
- show_hudmessage( id, "%L >> %L: %d - %L %d", id, "CLASS_HUMAN", id, "ZOMBIE_ATTRIB1", get_user_health( id ), id, "AMMO_PACKS1", gD_ammopacks[ id ] );
- }
- case STATUS_NEMESIS:
- {
- set_hudmessage( 255, 0, 0, HUD_STATS_X, HUD_STATS_Y, 2, 0.0, 1.1, 0.0, 0.0, HUD_CHAN_STATS );
- show_hudmessage( id, "%L >> %L: %d - %L %d", id, "CLASS_NEMESIS", id, "ZOMBIE_ATTRIB1", get_user_health( id ), id, "AMMO_PACKS1", gD_ammopacks[ id ] );
- }
- case STATUS_ZOMBIE:
- {
- set_hudmessage( 255, 0, 0, HUD_STATS_X, HUD_STATS_Y, 2, 0.0, 1.1, 0.0, 0.0, HUD_CHAN_STATS );
- show_hudmessage( id, "%s >> %L: %d - %L %d", gZ_ClassName[ gD_zombieClass[ id ] ], id, "ZOMBIE_ATTRIB1", get_user_health( id ), id, "AMMO_PACKS1", gD_ammopacks[ id ] );
- }
- }
- }
- else
- {
- new const spectated = entity_get_int( id, EV_INT_iuser2 );
- if( gB_alive[ spectated ] )
- {
- new class[ 32 ];
- switch( gD_status[ spectated ] )
- {
- case STATUS_SURVIVOR: format( class, charsmax( class ), "%L", id, "CLASS_SURVIVOR" );
- case STATUS_HUMAN: format( class, charsmax( class ), "%L", id, "CLASS_HUMAN" );
- case STATUS_NEMESIS: format( class, charsmax( class ), "%L", id, "CLASS_NEMESIS" );
- case STATUS_ZOMBIE: copy( class, charsmax( class ), gZ_ClassName[ gD_zombieClass[ spectated ] ] );
- }
- set_hudmessage( 255, 255, 255, HUD_SPECT_X, HUD_SPECT_Y, 2, 0.0, 1.1, 0.0, 0.0, HUD_CHAN_STATS );
- show_hudmessage( id, "%L %s^nHP: %d - %L %s - %L %d", id, "SPECTATING", gS_playerName[ spectated ], get_user_health( spectated ), id, "CLASS_CLASS", class, id, "AMMO_PACKS1", gD_ammopacks[ spectated ] );
- }
- }
- }
- }
- entity_set_float( entity, EV_FL_nextthink, ++ gF_gameTime );
- }
- public ENGINE__TOUCH_WeaponBox( const weapon, const id )
- {
- if( CORE__GET_HUMAN( id ) )
- {
- return PLUGIN_CONTINUE;
- }
- return PLUGIN_HANDLED;
- }
- // ===================================================================================
- // >> HAMSANDWICH
- // ===================================================================================
- public HAM__POST_SPAWN( const id )
- {
- if( is_user_alive( id ) )
- {
- gB_alive[ id ] = true;
- remove_task( id + TASK_ID_RESPAWN );
- strip_user_weapons( id );
- give_item( id, "weapon_knife" );
- if( CORE__GET_CURRENT_MODE( ROUND_RESPAWN ) ) // RESPAWN AS ZOMBIE
- {
- CORE__SET_PLAYER_STATUS( id, STATUS_ZOMBIE );
- }
- else // HUMAN
- {
- gD_status[ id ] = STATUS_HUMAN;
- give_item( id, "weapon_m4a1" );
- cs_set_user_bpammo( id, CSW_M4A1, 9999 );
- }
- }
- }
- public HAM__POST_Killed( const victim, const attacker )
- {
- gB_alive[ victim ] = false;
- if( CORE__GET_CURRENT_MODE( ROUND_NOMODE ) )
- {
- set_task( 0.1, "TASK__RespawnMe", TASK_ID_RESPAWN );
- }
- else
- {
- gD_status[ victim ] = STATUS_ZOMBIE;
- if( CORE__GET_PLAYERS_COUNT( STATUS_HUMAN, true ) == 1 )
- {
- gBi_Round &= ~( ROUND_ABLE_ARMOR | ROUND_INFECT );
- }
- if( CORE__GET_CURRENT_MODE( ROUND_RESPAWN ) )
- {
- set_task( TASK_TIME_RESPAWN, "TASK__RespawnMe", TASK_ID_RESPAWN + victim );
- }
- }
- }
- public HAM__POST_TakeDamage( const victim, const inflictor, const attacker, const Float: damages, const damage_bits )
- {
- if( ( 1 <= attacker <= MAX_PLAYERS ) && CORE__GET_HUMAN( attacker ) && CORE__GET_ZOMBIE( victim ) )
- {
- if( CORE__GET_SURVIVOR( attacker ) )
- {
- gF_damagesAP[ attacker ] += ( damages / 2 );
- }
- else
- {
- gF_damagesAP[ attacker ] += damages;
- }
- if( gF_damagesAP[ attacker ] >= AP_DMG_NEEDED )
- {
- ++ gD_ammopacks[ attacker ];
- gF_damagesAP[ attacker ] = 0.0;
- }
- }
- }
- public HAM__PRE_TakeDamage( const victim, const inflictor, const attacker, const Float: damages, const damage_bits )
- {
- if( CORE__GET_CURRENT_MODE( ROUND_NOMODE ) || ( damage_bits & DMG_FALL ) || ( damage_bits & DMG_NADE ) )
- {
- return HAM_SUPERCEDE;
- }
- if( ( 1 <= attacker <= MAX_PLAYERS ) )
- {
- if( CORE__GET_ZOMBIE( attacker ) == CORE__GET_ZOMBIE( victim ) )
- {
- return HAM_SUPERCEDE;
- }
- if( CORE__GET_ZOMBIE( attacker ) )
- {
- if( CORE__GET_NEMESIS( attacker ) )
- {
- SetHamParamFloat( 4, NEMESIS_DMG );
- }
- else
- {
- if( CORE__GET_CURRENT_MODE( ROUND_ABLE_ARMOR ) )
- {
- new const Float: armor = entity_get_float( victim, EV_FL_armorvalue );
- if( armor )
- {
- emit_sound( victim, CHAN_BODY, SOUND_ARMOR_HIT, 1.0, ATTN_NORM, 0, PITCH_NORM );
- if( armor - damages > 0.0 )
- {
- entity_set_float( victim, EV_FL_armorvalue, armor - damages );
- }
- else
- {
- cs_set_user_armor( victim, 0, CS_ARMOR_NONE );
- }
- return HAM_SUPERCEDE;
- }
- else if( CORE__GET_CURRENT_MODE( ROUND_INFECT ) )
- {
- CORE__SET_PLAYER_STATUS( victim, STATUS_ZOMBIE, attacker );
- return HAM_SUPERCEDE;
- }
- }
- else if( CORE__GET_CURRENT_MODE( ROUND_INFECT ) )
- {
- CORE__SET_PLAYER_STATUS( victim, STATUS_ZOMBIE, attacker );
- return HAM_SUPERCEDE;
- }
- }
- }
- else
- {
- if( CORE__GET_ZOMBIE( victim ) && ( gF_gameTime - gF_spawnProtect[ victim ] ) < 5.0 )
- {
- cs_set_user_armor( attacker, 0, CS_ARMOR_NONE );
- if( CORE__GET_PLAYERS_COUNT( STATUS_ZOMBIE ) < 15 )
- {
- CORE__SET_PLAYER_STATUS( attacker, STATUS_ZOMBIE, victim );
- }
- return HAM_SUPERCEDE;
- }
- }
- }
- return HAM_IGNORED;
- }
- // ===================================================================================
- // >> FAKEMETA
- // ===================================================================================
- public FM__POST_ClientUserInfoChanged( const id, const info[ ], const key[ ] )
- {
- get_user_name( id, gS_playerName[ id ], charsmax( gS_playerName[ ] ) );
- }
- // ===================================================================================
- // >> CORE
- // ===================================================================================
- CORE__SET_PLAYER_STATUS( const id, const type, const attacker = 0 )
- {
- strip_user_weapons( id );
- give_item( id, "weapon_knife" );
- gD_status[ id ] = type;
- if( attacker )
- {
- emessage_begin( MSG_BROADCAST, gMsg_DeathMsg );
- ewrite_byte( attacker );
- ewrite_byte( id );
- emessage_end( );
- emessage_begin( MSG_BROADCAST, gMsg_ScoreAttrib );
- ewrite_byte( id );
- if( get_user_flags( id ) & ADMIN_LEVEL_E )
- {
- ewrite_byte( 4 );
- }
- else
- {
- ewrite_byte( 0 );
- }
- emessage_end( );
- set_user_frags( attacker, get_user_frags( attacker ) + 1 );
- }
- switch( type )
- {
- case STATUS_ZOMBIE, STATUS_NEMESIS:
- {
- cs_set_team( id, _: CS_TEAM_T );
- if( type == STATUS_NEMESIS )
- {
- set_user_health( id, get_playersnum( ) * 8000 );
- }
- else
- {
- set_user_health( id, 9000 );
- }
- }
- case STATUS_HUMAN, STATUS_SURVIVOR:
- {
- cs_set_team( id, _: CS_TEAM_CT );
- if( type == STATUS_SURVIVOR )
- {
- give_item( id, "weapon_m249" );
- cs_set_user_bpammo( id, CSW_M249, 9999 );
- set_user_health( id, get_playersnum( ) * 500 );
- }
- else
- {
- }
- }
- }
- if( CORE__GET_PLAYERS_COUNT( STATUS_HUMAN, true ) == 1 )
- {
- gBi_Round &= ~( ROUND_ABLE_ARMOR | ROUND_INFECT );
- }
- }
- CORE__GET_PLAYERS_COUNT( const type, const alive = 0 )
- {
- new count;
- if( alive )
- {
- for( new id = 1; id <= MAX_PLAYERS; id ++ )
- {
- if( gB_alive[ id ] && gD_status[ id ] == type )
- {
- ++ count;
- }
- }
- }
- else
- {
- for( new id = 1; id <= MAX_PLAYERS; id ++ )
- {
- if( gD_status[ id ] == type )
- {
- ++ count;
- }
- }
- }
- return count;
- }
- // ===================================================================================
- // >> UTIL
- // ===================================================================================
- // ===================================================================================
- // >> TASKS
- // ===================================================================================
- public TASK__BeginRound( )
- {
- new players[ 32 ], num;
- get_players( players, num, "ah" );
- switch( gBi_PreRound )
- {
- case ROUND_NORMAL:
- {
- gBi_Round = ( ROUND_NORMAL | ROUND_RESPAWN | ROUND_ABLE_ARMOR | ROUND_INFECT );
- new id, loop;
- switch( num )
- {
- case 1..10: loop = 1;
- case 11..19: loop = 2;
- case 20..30: loop = 3;
- case 31..32: loop = 4;
- }
- for( new i = 0; i < loop; i ++ )
- {
- id = 0;
- while( CORE__GET_ZOMBIE( id ) || !id )
- {
- id = players[ random_num( 0, num - 1 ) ];
- }
- CORE__SET_PLAYER_STATUS( id, STATUS_ZOMBIE );
- }
- if( loop == 1 )
- {
- set_hudmessage( 255, 0, 0, HUD_EVENT_X, HUD_EVENT_Y, 0, 0.0, 5.0, 1.0, 1.0, HUD_CHAN_EVENT );
- show_hudmessage( 0, "%L", LANG_PLAYER, "NOTICE_FIRST", gS_playerName[ id ] );
- }
- else
- {
- set_hudmessage( 255, 0, 0, HUD_EVENT_X, HUD_EVENT_Y, 0, 0.0, 5.0, 1.0, 1.0, HUD_CHAN_EVENT );
- show_hudmessage( 0, "%L", LANG_PLAYER, "NOTICE_MULTI" );
- }
- for( loop = 0, id = players[ 0 ]; loop < num; id = players[ ++ loop ] )
- {
- if( !CORE__GET_ZOMBIE( id ) )
- {
- cs_set_team( id, _: CS_TEAM_CT );
- }
- }
- }
- case ROUND_NEMESIS:
- {
- new i, id = players[ random_num( 0, num - 1 ) ];
- CORE__SET_PLAYER_STATUS( id, STATUS_NEMESIS );
- set_hudmessage( 255, 0, 0, HUD_EVENT_X, HUD_EVENT_Y, 0, 0.0, 5.0, 1.0, 1.0, HUD_CHAN_EVENT );
- show_hudmessage( 0, "%L", LANG_PLAYER, "NOTICE_NEMESIS", gS_playerName[ id ] );
- gBi_Round = ROUND_NEMESIS;
- for( i = 0, id = players[ 0 ]; i < num; id = players[ ++ i ] )
- {
- if( !CORE__GET_NEMESIS( id ) )
- {
- cs_set_team( id, _: CS_TEAM_CT );
- }
- }
- }
- case ROUND_SURVIVOR:
- {
- new i, id = players[ random_num( 0, num - 1 ) ];
- CORE__SET_PLAYER_STATUS( id, STATUS_SURVIVOR );
- set_hudmessage( 255, 0, 0, HUD_EVENT_X, HUD_EVENT_Y, 0, 0.0, 5.0, 1.0, 1.0, HUD_CHAN_EVENT );
- show_hudmessage( 0, "%L", LANG_PLAYER, "NOTICE_SURVIVOR", gS_playerName[ id ] );
- gBi_Round = ROUND_SURVIVOR;
- for( i = 0, id = players[ 0 ]; i < num; id = players[ ++ i ] )
- {
- if( !CORE__GET_SURVIVOR( id ) )
- {
- CORE__SET_PLAYER_STATUS( id, STATUS_ZOMBIE );
- }
- }
- }
- case ROUND_SWARM:
- {
- if( num < 4 )
- {
- gBi_PreRound = ROUND_NORMAL;
- TASK__BeginRound( );
- }
- else
- {
- gBi_Round = ROUND_SWARM;
- for( new i = 0, id = players[ 0 ]; i < num; id = players[ ++ i ] )
- {
- if( cs_get_user_team( id ) == CS_TEAM_T )
- {
- CORE__SET_PLAYER_STATUS( id, STATUS_ZOMBIE );
- }
- }
- set_hudmessage( 255, 0, 0, HUD_EVENT_X, HUD_EVENT_Y, 0, 0.0, 5.0, 1.0, 1.0, HUD_CHAN_EVENT );
- show_hudmessage( 0, "%L", LANG_PLAYER, "NOTICE_SWARM" );
- }
- }
- }
- }
- public TASK__RespawnMe( id )
- {
- id -= TASK_ID_RESPAWN;
- if( gB_connected[ id ] )
- {
- ExecuteHamB( Ham_CS_RoundRespawn, id );
- }
- }
Add Comment
Please, Sign In to add comment