new const ITEMS[][ITEM] = {
{WEAPON_SG550, "SG-550"},
{WEAPON_XM1014, "XM1014"},
"sound/rww/RoundStart.mp3",
new const PLUGINS[][] = {
HOOK_CHAIN_LAST // DO NOT EDIT
HAM_HOOKS_LAST // DO NOT EDIT
new HookChain:roundEndPre, HookChain:addAccount;
new HookChain:hookChains[HOOK_CHAIN_LAST], HamHook:hamForwards[HAM_HOOKS_LAST];
new mp_round_infinite, round_infinite[32];
new mp_forcerespawn, forcerespawn;
new mp_respawn_immunitytime, respawn_immunitytime;
new csstats_pause, aes_track_pause;
new warmUpTime, warmUpMode, warmUpReward;
new bool:enabled = false;
new timer, hudSync, hudSyncStats;
new sounds[sizeof(SOUNDS)], soundsNum = 0;
new item, WeaponIdType:itemId, itemName[32], itemTitle[32];
new kills[MAX_PLAYERS + 1];
public plugin_precache() {
for (new i = 0; i < sizeof(SOUNDS); i++) {
if (file_exists(SOUNDS[i], true)) {
precache_generic(SOUNDS[i]);
register_plugin("[ReAPI] WurmUp", "0.3", "F@nt0M & h1k3");
roundEndPre = RegisterHookChain(RG_RoundEnd, "RoundEnd_Pre", false);
addAccount = RegisterHookChain(RG_CBasePlayer_AddAccount, "CBasePlayer_AddAccount_Pre", false);
hookChains[SPAWN] = RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn_Post", true);
hookChains[ON_SPAWN_EQUIP] = RegisterHookChain(RG_CBasePlayer_OnSpawnEquip, "CBasePlayer_OnSpawnEquip_Pre", false);
hookChains[HAS_RESTRICT_ITEM] = RegisterHookChain(RG_CBasePlayer_HasRestrictItem, "CBasePlayer_HasRestrictItem_Pre", false);
hookChains[DROP_PLAYER_ITEM] = RegisterHookChain(RG_CBasePlayer_DropPlayerItem, "CBasePlayer_DropPlayerItem_Pre", false);
hookChains[ADD_PLAYER_ITEM] = RegisterHookChain(RG_CBasePlayer_AddPlayerItem, "CBasePlayer_AddPlayerItem_Pre", false);
hookChains[DEAD_PLAYER_WEAPONS] = RegisterHookChain(RG_CSGameRules_DeadPlayerWeapons, "CSGameRules_DeadPlayerWeapons_Pre", false);
hookChains[GIVE_C4] = RegisterHookChain(RG_CSGameRules_GiveC4, "CSGameRules_GiveC4_Pre", false);
hookChains[KILLED] = RegisterHookChain(RG_CBasePlayer_Killed, "CBasePlayer_Killed_Post", true);
hamForwards[GAME_PLAYER_EQUIP] = RegisterHam(Ham_Use, "game_player_equip", "HamHookSupercede", false);
hamForwards[PLAYE_WEAPON_STRIP] = RegisterHam(Ham_Use, "player_weaponstrip", "HamHookSupercede", false);
hamForwards[ARMOURY_ENTITY] = RegisterHam(Ham_CS_Restart, "armoury_entity", "HamHookSupercede", false);
// Toggle_Forwards(false);
mp_round_infinite = get_cvar_pointer("mp_round_infinite");
mp_forcerespawn = get_cvar_pointer("mp_forcerespawn");
mp_respawn_immunitytime = get_cvar_pointer("mp_respawn_immunitytime");
csstats_pause = get_cvar_pointer("csstats_pause");
aes_track_pause = get_cvar_pointer("aes_track_pause");
hudSync = CreateHudSyncObj();
hudSyncStats = CreateHudSyncObj();
BuyZone_ToogleSolid(SOLID_NOT);
warmUpTime = create_cvar("warmup_time", "60", .has_min = true, .min_val = 0.0);
warmUpMode = create_cvar("warmup_mode", "0", .has_min = true, .min_val = 0.0, .has_max = true, .max_val = 1.0);
warmUpReward = create_cvar("warmup_reward", "0", .has_min = true, .min_val = 0.0);
BuyZone_ToogleSolid(SOLID_TRIGGER);
DisableHookChain(roundEndPre);
set_member_game(m_bCompleteReset, true);
set_member_game(m_bGameStarted, true);
rg_round_end(0.1, WINSTATUS_DRAW, ROUND_GAME_COMMENCE, "");
DisableHookChain(addAccount);
remove_task(TASK_ID_TIMER);
remove_task(TASK_ID_FINISH);
public RoundEnd_Pre(const WinStatus:status, const ScenarioEventEndRound:event) {
if (event != ROUND_GAME_COMMENCE) {
new time = get_pcvar_num(warmUpTime);
DisableHookChain(roundEndPre);
DisableHookChain(addAccount);
Players_GiveItems(false);
arrayset(kills, 0, sizeof(kills));
set_task(1.0, "TaskTimer", TASK_ID_TIMER, .flags = "a", .repeat = time);
SetHookChainReturn(ATYPE_BOOL, false);
public CBasePlayer_AddAccount_Pre(const id, const amount, const RewardType:type) {
if (get_pcvar_num(warmUpTime) == 0) {
new reward = get_pcvar_num(warmUpReward);
SetHookChainArg(2, ATYPE_INTEGER, amount + (kills[id] * reward));
SetHookChainArg(2, ATYPE_INTEGER, 0);
SetHookChainArg(2, ATYPE_INTEGER, 1);
public CBasePlayer_Spawn_Post(const id) {
public CBasePlayer_OnSpawnEquip_Pre(const id) {
public CBasePlayer_HasRestrictItem_Pre() {
SetHookChainReturn(ATYPE_BOOL, true);
public CBasePlayer_DropPlayerItem_Pre() {
SetHookChainReturn(ATYPE_INTEGER, 0);
public CBasePlayer_AddPlayerItem_Pre() {
SetHookChainReturn(ATYPE_INTEGER, 0);
public CSGameRules_DeadPlayerWeapons_Pre() {
SetHookChainReturn(ATYPE_INTEGER, GR_PLR_DROP_GUN_NO);
public CSGameRules_GiveC4_Pre() {
public CBasePlayer_Killed_Post(const id, const killer) {
if (id != killer && is_user_connected(killer)) {
public HamHookSupercede() {
set_hudmessage(135, 206, 235, .x = -1.0, .y = 0.08, .holdtime = 0.9, .channel = -1);
ShowSyncHudMsg(0, hudSync, "Разминка на %s!^nРестарт через %d сек", itemTitle, timer);
if (csstats_pause || aes_track_pause) {
set_hudmessage(255, 0, 0, .x = -1.0, .y = 0.05, .holdtime = 0.9, .channel = -1);
ShowSyncHudMsg(0, hudSyncStats, "[Статистика Отключена]");
BuyZone_ToogleSolid(SOLID_TRIGGER);
set_task(0.2, "TaskFinish", TASK_ID_FINISH);
DisableHookChain(roundEndPre);
set_member_game(m_bCompleteReset, true);
set_member_game(m_bGameStarted, true);
rg_round_end(0.1, WINSTATUS_DRAW, ROUND_GAME_COMMENCE, "");
set_hudmessage(135, 206, 235, .x = -1.0, .y = 0.08, .holdtime = 5.0, .channel = -1);
ShowSyncHudMsg(0, hudSync, "Разминка окончена!");
if (csstats_pause || aes_track_pause) {
set_hudmessage(255, 0, 0, .x = -1.0, .y = 0.05, .holdtime = 5.0, .channel = -1);
ShowSyncHudMsg(0, hudSyncStats, "[Статистика Включена]");
DisableHookChain(addAccount);
Toggle_Forwards(const bool:enable) {
for (new i = 0; i < HOOK_CHAIN_LAST; i++) {
EnableHookChain(hookChains[i]);
DisableHookChain(hookChains[i]);
for (new i = 0; i < HAM_HOOKS_LAST; i++) {
EnableHamForward(hamForwards[i]);
DisableHamForward(hamForwards[i]);
Toggle_Cvars(const bool:enable) {
get_pcvar_string(mp_round_infinite, round_infinite, charsmax(round_infinite));
set_pcvar_string(mp_round_infinite, "1");
forcerespawn = get_pcvar_num(mp_forcerespawn);
set_pcvar_num(mp_forcerespawn, 3);
respawn_immunitytime = get_pcvar_num(mp_respawn_immunitytime);
set_pcvar_num(mp_respawn_immunitytime, 3);
set_pcvar_num(csstats_pause, 1);
set_pcvar_num(aes_track_pause, 1);
set_pcvar_string(mp_round_infinite, round_infinite);
set_pcvar_num(mp_forcerespawn, forcerespawn);
set_pcvar_num(mp_respawn_immunitytime, respawn_immunitytime);
set_pcvar_num(csstats_pause, 0);
set_pcvar_num(aes_track_pause, 0);
Toggle_Plugins(const bool:enable) {
for (new i = 0; i < sizeof(PLUGINS); i++) {
unpause("ac", PLUGINS[i]);
Players_GiveItems(const bool:defaultItems) {
new players[MAX_PLAYERS], num;
get_players(players, num, "ah");
for (new i = 0, player; i < num; i++) {
rg_remove_all_items(player);
rg_give_default_items(player);
Player_GiveItem(const id) {
DisableHookChain(HookChain:hookChains[ADD_PLAYER_ITEM]);
rg_give_item(id, "weapon_knife", GT_APPEND);
new ent = rg_give_item(id, itemName, GT_APPEND);
rg_set_user_bpammo(id, itemId, rg_get_iteminfo(ent, ItemInfo_iMaxAmmo1));
EnableHookChain(HookChain:hookChains[ADD_PLAYER_ITEM]);
while ((ent = rg_find_ent_by_class(ent, "armoury_entity"))) {
if(get_member(ent, m_Armoury_iCount) > 0) {
set_entvar(ent, var_effects, get_entvar(ent, var_effects) | EF_NODRAW);
set_entvar(ent, var_solid, SOLID_NOT);
set_member(ent, m_Armoury_iCount, 0);
BuyZone_ToogleSolid(const solid) {
while ((ent = rg_find_ent_by_class(ent, "func_buyzone"))) {
set_entvar(ent, var_solid, solid);
new lastItemStr[3], lastItem;
if (get_localinfo("warmup_last_item", lastItemStr, charsmax(lastItemStr))) {
lastItem = str_to_num(lastItemStr);
switch (get_pcvar_num(warmUpMode)) {
item = (lastItem + 1) % sizeof(ITEMS);
item = random(100) % sizeof(ITEMS);
} while (item == lastItem && tries < sizeof(ITEMS));
itemId = ITEMS[item][ITEM_ID];
rg_get_weapon_info(itemId, WI_NAME, itemName, charsmax(itemName));
copy(itemTitle, charsmax(itemTitle), ITEMS[item][ITEM_TITLE]);
num_to_str(item, lastItemStr, charsmax(lastItemStr));
set_localinfo("warmup_last_item", lastItemStr);
new sound = (soundsNum > 1) ? sounds[random(100) % soundsNum] : 0;
client_cmd(0, "mp3 play ^"%s^"", SOUNDS[sound]);