From 04b88c16a95c56b367d0cacd5be4463fe02c3795 Mon Sep 17 00:00:00 2001 From: Lukasz Wlasinksi Date: Sun, 19 Sep 2004 09:51:05 +0000 Subject: [PATCH] many changes , bomb countdown fix, custom_weapon_add fix, bomb damage support in death,damage forwards, added gasnades plugin with custom weapon support so gas damage/kills will be detected by csstats. --- dlls/csx/plugins/miscstats.sma | 50 +++---- dlls/csx/plugins/miscstats.txt | 44 ++++++ dlls/csx/plugins/tp/amx_csx_gasnades.sma | 177 +++++++++++++++++++++++ dlls/csx/source/CMisc.h | 7 +- dlls/csx/source/meta_api.cpp | 4 +- dlls/csx/source/rank.cpp | 46 +++--- dlls/csx/source/rank.h | 5 +- dlls/csx/source/usermsg.cpp | 18 ++- 8 files changed, 285 insertions(+), 66 deletions(-) create mode 100755 dlls/csx/plugins/miscstats.txt create mode 100755 dlls/csx/plugins/tp/amx_csx_gasnades.sma diff --git a/dlls/csx/plugins/miscstats.sma b/dlls/csx/plugins/miscstats.sma index 4bd7c338..6a8da848 100755 --- a/dlls/csx/plugins/miscstats.sma +++ b/dlls/csx/plugins/miscstats.sma @@ -138,9 +138,11 @@ new g_HeadShots[7][] = { "HS_MSG_7" } -new g_teamsNames[2][] = { +new g_teamsNames[4][] = { "TERRORIST", - "CT" + "CT", + "TERRORISTS", + "CTS" } public plugin_init() { @@ -244,11 +246,13 @@ public client_death(killer,victim,wpnindex,hitplace,TK) { new eppl[32], epplnum get_players(eppl,epplnum,"ae",g_teamsNames[team]) if (epplnum) { - new message[128] - format(message,127,"%d %s%s Remaining...",epplnum,g_teamsNames[team],(epplnum==1)?"":"S" ) - set_hudmessage(255,255,255,0.02,0.85,2, 0.05, 0.1, 0.02, 3.0, 3) - for(new a=0; a +#include +#include +#include + +new g_Gas +//---------------------------------------------------------------------------------------------- +public plugin_init() +{ + register_plugin("Gasgrenades", "1.3 (CSX)", "RichoDemus/AssKicR/T(+)rget") + + register_cvar("amx_gasnades", "1") + register_cvar("amx_gasdmg", "10") + register_cvar("amx_gascheck", "3") + register_cvar("amx_gasradius", "200") + register_cvar("amx_smokegasp", "1") + register_cvar("amx_gasobeyFF", "1") + + g_Gas = custom_weapon_add("gasnade",0,"gasnade") +} +//---------------------------------------------------------------------------------------------- +public plugin_precache() +{ + precache_sound("player/gasp1.wav") + precache_sound("player/gasp2.wav") +} + +public gas(par[]) +{ + new grenadeid = par[1] + new id = par[0] + + if ( !is_valid_ent(grenadeid) ) + return + + new player[3], inum, Float:temp_grenade[3], grenade[3], players[32] + if(get_cvar_num("amx_gasobeyFF") != 1) + get_players(players, inum) // Get number of players + else{ + new FFOn = get_cvar_num("mp_friendlyfire") + if(FFOn == 0){ + new team[33] + get_user_team(id, team, 32) + if(equali(team, "CT")) + get_players(players, inum, "ae", "TERRORIST") + else + get_players(players, inum, "ae", "CT") + } + else + get_players(players, inum) // Get number of players + } + entity_get_vector(grenadeid, EV_VEC_origin, temp_grenade) // Get the position of the grenade + grenade[0] = floatround(temp_grenade[0]) + grenade[1] = floatround(temp_grenade[1]) + grenade[2] = floatround(temp_grenade[2]) + for(new i = 0; i < inum; ++i){ // Loop through all players + get_user_origin(players[i],player,0) + new distance = get_distance(grenade, player) + + if((distance < get_cvar_num("amx_gasradius"))){ // Check who is standing close + if(get_cvar_num("amx_smokegasp") != 0){ + if(get_cvar_num("amx_gascheck") >= 1){ + new number = random_num(1, 2) + if(is_user_alive(players[i])){ + switch (number){ + case 1:emit_sound(players[i], CHAN_VOICE, "player/gasp1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM) + case 2:emit_sound(players[i], CHAN_VOICE, "player/gasp2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM) + } + } + } + } + message_begin(MSG_ONE, get_user_msgid("Damage"), {0,0,0}, players[i]) + write_byte(30) // dmg_save + write_byte(30) // dmg_take + write_long((1 << 16)) // visibleDamageBits + write_coord(grenade[0]) // damageOrigin.x + write_coord(grenade[1]) // damageOrigin.y + write_coord(grenade[2]) // damageOrigin.z + message_end() + if(is_user_alive(id)) + ExtraDamage(players[i], id, get_cvar_num("amx_gasdmg"), "gasgrenade") + } + } + set_task(get_cvar_float("amx_gascheck"), "gas",grenadeid,par,2) // If the grenade still exists we do a new check in get_cvar_num("amx_gascheck") second +} +//---------------------------------------------------------------------------------------------- +public grenade_throw(index,greindex,wId){ + if ( task_exists(greindex) ) + remove_task(greindex) + if( get_cvar_num("amx_gasnades") !=1 || wId != CSW_SMOKEGRENADE ) + return PLUGIN_CONTINUE + if (g_Gas) custom_weapon_shot(g_Gas,index) + new par[2] + par[0] = index + par[1] = greindex + set_task(1.5, "gas", greindex,par,2) + return PLUGIN_CONTINUE +} +//---------------------------------------------------------------------------------------------- +stock ExtraDamage(id, attacker, damage, weaponDescription[]) +{ + if(is_user_alive(id)) + { + new userHealth = get_user_health(id) + set_user_health(id, userHealth - damage) + if (g_Gas) + custom_weapon_dmg(g_Gas,attacker,id,damage) + + if(userHealth - damage <= 0) + { + logKill(attacker, id, weaponDescription) + if(get_user_team(id) != get_user_team(attacker)) + { + // The person dying shouldn't get negative credit for this kill (so add it back) + set_user_frags(id, get_user_frags(id) + 1) + // The killing should get credit for the frag + set_user_frags(attacker, get_user_frags(attacker) + 1) + } + else + { + // The person dying shouldn't get negative credit for this kill (so add it back) + set_user_frags(id, get_user_frags(id) + 1) + // The killer killed a teammember or self + // Engine gives credit for the kill so let's take away that + 1 + set_user_frags(attacker, get_user_frags(attacker) - 2) + } + }else{ + if(get_cvar_num("mp_logdetail") == 3){ + logDmg(attacker, id, weaponDescription,"body",damage,userHealth-damage) + } + } + } +} +//---------------------------------------------------------------------------------------------- +/* Log a kill using standard HL-logging format */ +stock logKill(attacker, victim, weaponDescription[]) +{ + // Save Hummiliation + new namea[24], namev[24], authida[20], authidv[20], teama[10], teamv[10] + + // Info On Attacker + get_user_name(attacker, namea, 23) + get_user_team(attacker, teama, 9) + get_user_authid(attacker, authida, 19) + // Info On Victim + get_user_name(victim, namev, 23) + get_user_team(victim, teamv, 9) + get_user_authid(victim, authidv, 19) + // Log This Kill + log_message("^"%s<%d><%s><%s>^" killed ^"%s<%d><%s><%s>^" with ^"%s^"", + namea, get_user_userid(attacker), authida, teama, namev, get_user_userid(victim), authidv, teamv, weaponDescription) +} + +/* Log damage using standard HL-logging format */ +stock logDmg(attacker, victim, weaponDescription[],hit[],damage,health) +{ + // Save Hummiliation + new namea[24], namev[24], authida[20], authidv[20], teama[10], teamv[10] + + // Info On Attacker + get_user_name(attacker, namea, 23) + get_user_team(attacker, teama, 9) + get_user_authid(attacker, authida, 19) + // Info On Victim + get_user_name(victim, namev, 23) + get_user_team(victim, teamv, 9) + get_user_authid(victim, authidv, 19) + // Log This Damage + log_message("^"%s<%d><%s><%s>^" attacked ^"%s<%d><%s><%s>^" with ^"%s^" (hit ^"%s^") (damage ^"%d^") (health ^"%d^")", + namea,get_user_userid(attacker),authida,teama,namev,get_user_userid(victim),authidv,teamv,weaponDescription,hit,damage,health) +} + + + +//---------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/dlls/csx/source/CMisc.h b/dlls/csx/source/CMisc.h index d13122f5..1996f334 100755 --- a/dlls/csx/source/CMisc.h +++ b/dlls/csx/source/CMisc.h @@ -8,9 +8,10 @@ #define MAX_CWEAPONS 6 -#define CSW_HEGRENADE 4 -#define CSW_SMOKEGRENADE 9 -#define CSW_FLASHBANG 25 +#define CSW_HEGRENADE 4 +#define CSW_C4 6 +#define CSW_SMOKEGRENADE 9 +#define CSW_FLASHBANG 25 // ***************************************************** // class CPlayer diff --git a/dlls/csx/source/meta_api.cpp b/dlls/csx/source/meta_api.cpp index c6cd7ba2..11e45cef 100755 --- a/dlls/csx/source/meta_api.cpp +++ b/dlls/csx/source/meta_api.cpp @@ -287,8 +287,8 @@ void SetModel_Post(edict_t *e, const char *m){ switch(m[9]){ case 'h': w_id = CSW_HEGRENADE; - g_grenades.put(e, 1.75, 4, pPlayer); - pPlayer->saveShot(4); + g_grenades.put(e, 2.0, 4, pPlayer); + pPlayer->saveShot(CSW_HEGRENADE); break; case 'f': if (m[10]=='l') w_id = CSW_FLASHBANG; diff --git a/dlls/csx/source/rank.cpp b/dlls/csx/source/rank.cpp index 29f08f79..c0d0c87c 100755 --- a/dlls/csx/source/rank.cpp +++ b/dlls/csx/source/rank.cpp @@ -273,36 +273,30 @@ static cell AMX_NATIVE_CALL get_statsnum(AMX *amx, cell *params) return g_rank.getRankNum(); } -static cell AMX_NATIVE_CALL register_cwpn(AMX *amx, cell *params){ // name,logname,melee=0 - int i; - bool bFree = false; +static cell AMX_NATIVE_CALL register_cwpn(AMX *amx, cell *params){ // name,melee=0,logname + int i,iLen; for ( i=MAX_WEAPONS;i= MAX_WEAPONS+MAX_CWEAPONS || !weaponData[weapon].ammoSlot ){ // only for custom weapons + if ( weapon < MAX_WEAPONS || weapon >= MAX_WEAPONS+MAX_CWEAPONS || !weaponData[weapon].used ){ // only for custom weapons MF_RaiseAmxError(amx,AMX_ERR_NATIVE); MF_PrintSrvConsole("Weapon ID Is Not Valid!\n"); return 0; @@ -361,7 +355,7 @@ static cell AMX_NATIVE_CALL custom_wpn_shot(AMX *amx, cell *params){ // player,w } int weapon = params[1]; - if ( weapon < MAX_WEAPONS || weapon >= MAX_WEAPONS+MAX_CWEAPONS || !weaponData[weapon].ammoSlot ){ + if ( weapon < MAX_WEAPONS || weapon >= MAX_WEAPONS+MAX_CWEAPONS || !weaponData[weapon].used ){ MF_RaiseAmxError(amx,AMX_ERR_NATIVE); MF_PrintSrvConsole("Weapon ID Is Not Valid!\n"); return 0; @@ -375,7 +369,7 @@ static cell AMX_NATIVE_CALL custom_wpn_shot(AMX *amx, cell *params){ // player,w static cell AMX_NATIVE_CALL get_wpnname(AMX *amx, cell *params){ int id = params[1]; - if (id<0 || id>=MAX_WEAPONS+MAX_CWEAPONS ){ + if (id<1 || id>=MAX_WEAPONS+MAX_CWEAPONS ){ MF_RaiseAmxError(amx,AMX_ERR_NATIVE); MF_PrintSrvConsole("Weapon ID Is Not Valid!\n"); return 0; @@ -385,7 +379,7 @@ static cell AMX_NATIVE_CALL get_wpnname(AMX *amx, cell *params){ static cell AMX_NATIVE_CALL get_wpnlogname(AMX *amx, cell *params){ int id = params[1]; - if (id<0 || id>=MAX_WEAPONS+MAX_CWEAPONS ){ + if (id<1 || id>=MAX_WEAPONS+MAX_CWEAPONS ){ MF_RaiseAmxError(amx,AMX_ERR_NATIVE); MF_PrintSrvConsole("Weapon ID Is Not Valid!\n"); return 0; @@ -395,7 +389,7 @@ static cell AMX_NATIVE_CALL get_wpnlogname(AMX *amx, cell *params){ static cell AMX_NATIVE_CALL is_melee(AMX *amx, cell *params){ int id = params[1]; - if (id<0 || id>=MAX_WEAPONS+MAX_CWEAPONS ){ + if (id<1 || id>=MAX_WEAPONS+MAX_CWEAPONS ){ MF_RaiseAmxError(amx,AMX_ERR_NATIVE); MF_PrintSrvConsole("Weapon ID Is Not Valid!\n"); return 0; diff --git a/dlls/csx/source/rank.h b/dlls/csx/source/rank.h index 2c822a92..03d5227e 100755 --- a/dlls/csx/source/rank.h +++ b/dlls/csx/source/rank.h @@ -14,9 +14,10 @@ extern AMX_NATIVE_INFO stats_Natives[]; struct weaponsVault { - char* name; - char* logname; + char name[32]; + char logname[16]; short int ammoSlot; + bool used; bool melee; }; diff --git a/dlls/csx/source/usermsg.cpp b/dlls/csx/source/usermsg.cpp index 436db283..0b90a6ce 100755 --- a/dlls/csx/source/usermsg.cpp +++ b/dlls/csx/source/usermsg.cpp @@ -34,14 +34,13 @@ void Client_WeaponList(void* mValue){ wpnList |= (1<saveHit( mPlayer , weapon , damage, aim ); + else if ( strcmp("grenade",STRING(enemy->v.classname))==0 ) // ? more checks ? + weapon = CSW_C4; } } @@ -90,7 +91,8 @@ void Client_Damage_End(void* mValue){ MF_ExecuteForward( iFDamage,pAttacker->index , mPlayer->index , damage, weapon, aim, TA ); if ( !mPlayer->IsAlive() ){ - pAttacker->saveKill(mPlayer,weapon,( aim == 1 ) ? 1:0 ,TA); + if ( weapon != CSW_C4 ) + pAttacker->saveKill(mPlayer,weapon,( aim == 1 ) ? 1:0 ,TA); MF_ExecuteForward( iFDeath,pAttacker->index, mPlayer->index, weapon, aim, TA ); } }