Skip to content

Commit

Permalink
Expansion of warmup functionality. Added new mode 'All Weapons'. Mino…
Browse files Browse the repository at this point in the history
…r changes.
  • Loading branch information
d3m37r4 committed Dec 9, 2023
1 parent 8e234c4 commit 5b70c48
Show file tree
Hide file tree
Showing 2 changed files with 165 additions and 21 deletions.
6 changes: 6 additions & 0 deletions cstrike/addons/amxmodx/configs/regg/regg-main.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,12 @@ regg_free_armor 0
// Время разминки в секундах
regg_warmup_time "60"

// Тип разминки
// 0 - Всё оружие
// 1 - Только ножи
//
regg_warmup_type "1"

// Удалять объекты на карте, заложники, зона закупки и т.д
regg_block_map_conditions "1"

Expand Down
180 changes: 159 additions & 21 deletions cstrike/addons/amxmodx/scripting/regg_warmup.sma
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,21 @@ enum _:game_cvars_s {
Float:GCForceRespawn,
GCTimelimit,
GCFraglimit,
GCGivePlayerC4,
GCWeaponsAllowMapPlaced,
GCTDefaultGrenades[32],
GCTDefaultWeaponsSecondary[32],
GCTDefaultWeaponsPrimary[32],
GCCTDefaultGrenades[32],
GCTGivePlayerKnife,
GCCTGivePlayerKnife,
GCCTDefaultWeaponsSecondary[32],
GCCTDefaultWeaponsPrimary[32],
GCRefillBpammoWeapons,
GCStartMoney,
GCBuyAnywhere,
Float:GCBuyTime,
GCItemStaytime,
};
new GameCvars[game_cvars_s];

Expand Down Expand Up @@ -47,24 +61,40 @@ enum state_s {
StateDisable,
};

enum warmuptype_s {
WarmupTypeAllWeapons,
WarmupTypeOnlyKnife,
};
new warmuptype_s:WarmupType;

enum costtype_s {
CostTypeWeapon,
CostTypeClip,
};
new WeaponIdType:DefaultWeaponCost[WeaponIdType][costtype_s];

new ReGG_Mode:Mode = ReGG_ModeNone;
new WarmupTime;
new SyncHud;

new bool:DebugMode;

#define getLangKey(%0) fmt("%l", %0)

public plugin_init() {
register_plugin("[ReGG] WarmUp", REGG_VERSION_STR, "Jumper & d3m37r4");

registerHooks();
toggleHooks(StateDisable);
getDefaultWeaponCost();

bind_pcvar_num(create_cvar(
"regg_warmup_time", "60",
.has_min = true, .min_val = 0.0
), WarmupTime);
bind_pcvar_num(create_cvar(
"regg_warmup_type", "1",
.has_min = true, .min_val = 0.0,
.has_max = true, .max_val = 1.0
), WarmupType);

SyncHud = CreateHudSyncObj();
DebugMode = bool:(plugin_flags() & AMX_FLAG_DEBUG);
Expand All @@ -78,6 +108,7 @@ public plugin_pause() {

restoreGameCvars();
toggleHooks(StateDisable);
(WarmupType == WarmupTypeAllWeapons) && makeAllWeaponsFree(.make_free = true);

Status = StatusNone;
}
Expand All @@ -98,15 +129,6 @@ public ReGG_StartPre(const ReGG_Mode:mode) {
return PLUGIN_HANDLED;
}

public CBasePlayer_HasRestrictItem_Pre(const id, const ItemID:item, const ItemRestType:type) {
if(item == ITEM_KNIFE) {
return HC_CONTINUE;
}

SetHookChainReturn(ATYPE_BOOL, true);
return HC_SUPERCEDE;
}

public CBasePlayer_Spawn_Post(const id) {
if(!is_user_alive(id)) {
return HC_CONTINUE;
Expand Down Expand Up @@ -149,13 +171,14 @@ public startWarmUp() {

changeGameCvars();
toggleHooks(StateEnable);
(WarmupType == WarmupTypeAllWeapons) && makeAllWeaponsFree(.make_free = true);

set_member_game(m_bCompleteReset, false);
rg_round_end(
.tmDelay = 0.0,
.st = WINSTATUS_DRAW,
.event = ROUND_GAME_COMMENCE,
.message = _replace_string_ex(getLangKey("REGG_WARMUP_START"), "$n", "^r", true),
.message = "",
.sentence = "",
.trigger = true
);
Expand All @@ -172,6 +195,7 @@ public stopWarmUp() {

restoreGameCvars();
toggleHooks(StateDisable);
(WarmupType == WarmupTypeAllWeapons) && makeAllWeaponsFree(.make_free = false);

for(new player = 1; player <= MaxClients; player++) {
if(!is_user_alive(player)) {
Expand All @@ -189,7 +213,6 @@ public stopWarmUp() {
}

registerHooks() {
Hooks[HookHasRestrictItem] = RegisterHookChain(RG_CBasePlayer_HasRestrictItem, "CBasePlayer_HasRestrictItem_Pre", false);
Hooks[HookPlayerSpawn] = RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn_Post", true);
Hooks[HookPlayerKilled] = RegisterHookChain(RG_CBasePlayer_Killed, "CBasePlayer_Killed_Post", true);
Hooks[HookRoundEnd] = RegisterHookChain(RG_RoundEnd, "RoundEnd_Pre", false);
Expand Down Expand Up @@ -226,9 +249,69 @@ changeGameCvars() {
GameCvars[GCFraglimit] = get_pcvar_num(pcvar);
set_pcvar_num(pcvar, 0);

pcvar = get_cvar_pointer("mp_give_player_c4");
GameCvars[GCGivePlayerC4] = get_pcvar_num(pcvar);
set_pcvar_num(pcvar, 0);

pcvar = get_cvar_pointer("mp_weapons_allow_map_placed");
GameCvars[GCWeaponsAllowMapPlaced] = get_pcvar_num(pcvar);
set_pcvar_num(pcvar, 0);

if(WarmupType == WarmupTypeOnlyKnife) {
pcvar = get_cvar_pointer("mp_t_default_grenades");
get_pcvar_string(pcvar, GameCvars[GCTDefaultGrenades], charsmax(GameCvars[GCTDefaultGrenades]));
set_pcvar_string(pcvar, "");

pcvar = get_cvar_pointer("mp_t_default_weapons_secondary");
get_pcvar_string(pcvar, GameCvars[GCTDefaultWeaponsSecondary], charsmax(GameCvars[GCTDefaultWeaponsSecondary]));
set_pcvar_string(pcvar, "");

pcvar = get_cvar_pointer("mp_t_default_weapons_primary");
get_pcvar_string(pcvar, GameCvars[GCTDefaultWeaponsPrimary], charsmax(GameCvars[GCTDefaultWeaponsPrimary]));
set_pcvar_string(pcvar, "");

pcvar = get_cvar_pointer("mp_ct_default_grenades");
get_pcvar_string(pcvar, GameCvars[GCCTDefaultGrenades], charsmax(GameCvars[GCCTDefaultGrenades]));
set_pcvar_string(pcvar, "");

pcvar = get_cvar_pointer("mp_ct_default_weapons_secondary");
get_pcvar_string(pcvar, GameCvars[GCCTDefaultWeaponsSecondary], charsmax(GameCvars[GCCTDefaultWeaponsSecondary]));
set_pcvar_string(pcvar, "");

pcvar = get_cvar_pointer("mp_ct_default_weapons_primary");
get_pcvar_string(pcvar, GameCvars[GCCTDefaultWeaponsPrimary], charsmax(GameCvars[GCCTDefaultWeaponsPrimary]));
set_pcvar_string(pcvar, "");
}

pcvar = get_cvar_pointer("mp_t_give_player_knife");
GameCvars[GCTGivePlayerKnife] = get_pcvar_num(pcvar);
set_pcvar_num(pcvar, 1);

pcvar = get_cvar_pointer("mp_ct_give_player_knife");
GameCvars[GCCTGivePlayerKnife] = get_pcvar_num(pcvar);
set_pcvar_num(pcvar, 1);

if(WarmupType == WarmupTypeAllWeapons) {
pcvar = get_cvar_pointer("mp_refill_bpammo_weapons");
GameCvars[GCRefillBpammoWeapons] = get_pcvar_num(pcvar);
set_pcvar_num(pcvar, 3);

pcvar = get_cvar_pointer("mp_startmoney");
GameCvars[GCStartMoney] = get_pcvar_num(pcvar);
set_pcvar_num(pcvar, 999999); // We set maximum possible value, it will still be trimmed taking into account 'mp_maxmoney'.

pcvar = get_cvar_pointer("mp_buy_anywhere");
GameCvars[GCBuyAnywhere] = get_pcvar_num(pcvar);
set_pcvar_num(pcvar, 1);
}

pcvar = get_cvar_pointer("mp_buytime");
GameCvars[GCBuyTime] = get_pcvar_float(pcvar);
set_pcvar_float(pcvar, WarmupType == WarmupTypeOnlyKnife ? 0.0 : -1.0);

pcvar = get_cvar_pointer("mp_item_staytime");
GameCvars[GCItemStaytime] = get_pcvar_num(pcvar);
set_pcvar_num(pcvar, 0);
}

restoreGameCvars() {
Expand All @@ -249,16 +332,71 @@ restoreGameCvars() {
pcvar = get_cvar_pointer("mp_fraglimit");
set_pcvar_num(pcvar, GameCvars[GCFraglimit]);

pcvar = get_cvar_pointer("mp_give_player_c4");
set_pcvar_num(pcvar, GameCvars[GCGivePlayerC4]);

pcvar = get_cvar_pointer("mp_weapons_allow_map_placed");
set_pcvar_num(pcvar, GameCvars[GCWeaponsAllowMapPlaced]);
}

// https://github.com/d3m37r4/AMXX_Plugins/blob/aecab54d525389c0cc9cc274ff87a518b9369521/Simple_WarmUp_Mode/simple_warmup_mode.sma#L514
stock _replace_string_ex(const _buffer[], const _search[], const _string[], bool:_caseSensitive = true) {
new buffer[MAX_FMT_LENGTH];
if(WarmupType == WarmupTypeOnlyKnife) {
pcvar = get_cvar_pointer("mp_t_default_grenades");
set_pcvar_string(pcvar, GameCvars[GCTDefaultGrenades]);

pcvar = get_cvar_pointer("mp_t_default_weapons_secondary");
set_pcvar_string(pcvar, GameCvars[GCTDefaultWeaponsSecondary]);

pcvar = get_cvar_pointer("mp_t_default_weapons_primary");
set_pcvar_string(pcvar, GameCvars[GCTDefaultWeaponsPrimary]);

pcvar = get_cvar_pointer("mp_ct_default_grenades");
set_pcvar_string(pcvar, GameCvars[GCCTDefaultGrenades]);

pcvar = get_cvar_pointer("mp_ct_default_weapons_secondary");
set_pcvar_string(pcvar, GameCvars[GCCTDefaultWeaponsSecondary]);

pcvar = get_cvar_pointer("mp_ct_default_weapons_primary");
set_pcvar_string(pcvar, GameCvars[GCCTDefaultWeaponsPrimary]);
}

pcvar = get_cvar_pointer("mp_t_give_player_knife");
set_pcvar_num(pcvar, GameCvars[GCTGivePlayerKnife]);

pcvar = get_cvar_pointer("mp_ct_give_player_knife");
set_pcvar_num(pcvar, GameCvars[GCCTGivePlayerKnife]);

formatex(buffer, charsmax(buffer), _buffer);
replace_string(buffer, charsmax(buffer), _search, _string, _caseSensitive);
if(WarmupType == WarmupTypeAllWeapons) {
pcvar = get_cvar_pointer("mp_refill_bpammo_weapons");
set_pcvar_num(pcvar, GameCvars[GCRefillBpammoWeapons]);

return buffer;
}
pcvar = get_cvar_pointer("mp_startmoney");
set_pcvar_num(pcvar, GameCvars[GCStartMoney]);

pcvar = get_cvar_pointer("mp_buy_anywhere");
set_pcvar_num(pcvar, GameCvars[GCBuyAnywhere]);
}

pcvar = get_cvar_pointer("mp_buytime");
set_pcvar_float(pcvar, GameCvars[GCBuyTime]);

pcvar = get_cvar_pointer("mp_item_staytime");
set_pcvar_num(pcvar, GameCvars[GCItemStaytime]);
}

getDefaultWeaponCost() {
for(new WeaponIdType:weapon = WEAPON_P228; weapon <= WEAPON_P90; weapon++) {
if(weapon != WEAPON_C4 && weapon != WEAPON_KNIFE) {
DefaultWeaponCost[weapon][CostTypeWeapon] = rg_get_weapon_info(weapon, WI_COST);
DefaultWeaponCost[weapon][CostTypeClip] = rg_get_weapon_info(weapon, WI_CLIP_COST);
}
}
}

// Алексеич (https://dev-cs.ru/members/3/) would have thought that we were talking about French fries *kappa*
makeAllWeaponsFree(bool:make_free = true) {
for(new WeaponIdType:weapon = WEAPON_P228; weapon <= WEAPON_P90; weapon++) {
if(weapon != WEAPON_C4 && weapon != WEAPON_KNIFE) {
rg_set_weapon_info(weapon, WI_COST, make_free ? 0 : DefaultWeaponCost[weapon][CostTypeWeapon]);
rg_set_weapon_info(weapon, WI_CLIP_COST, make_free ? 0 : DefaultWeaponCost[weapon][CostTypeClip]);
}
}
}

0 comments on commit 5b70c48

Please sign in to comment.