diff --git a/cstrike/data.pk3dir/particles/fx_smokenade.cfg b/cstrike/data.pk3dir/particles/fx_smokenade.cfg index e5449caa..1df4014a 100644 --- a/cstrike/data.pk3dir/particles/fx_smokenade.cfg +++ b/cstrike/data.pk3dir/particles/fx_smokenade.cfg @@ -1,6 +1,7 @@ r_part effect { - texture ball + texture "particles/fteparticlefont.tga" + tcoords 97 97 191 191 256 count 1 scale 512 scalefactor 1 diff --git a/src/server/cstrike/buy.c b/src/server/cstrike/buy.c index fc8eca34..5b02214d 100644 --- a/src/server/cstrike/buy.c +++ b/src/server/cstrike/buy.c @@ -75,6 +75,25 @@ CSEv_BuyWeapon_f(float fWeapon) } if ((pl.money - g_cstrikeWeaponPrice[iWeapon]) >= 0) { + /* let's check if we've got a limit */ + int maxit; + maxit = rules.MaxItemPerSlot(); + if (maxit > 0) { + int wantslot = g_weapons[iWeapon].slot; + int c; + for (int i = 0; i < g_weapons.length; i++) { + if (pl.g_items & g_weapons[i].id && g_weapons[i].slot == wantslot) { + c++; + + /* we're over the slot limit. */ + if (c >= maxit) { + pl.activeweapon = i; + CSEv_DropWeapon(); + } + } + } + } + Weapons_AddItem(pl, iWeapon); Money_AddMoney(pl, -g_cstrikeWeaponPrice[iWeapon]); Sound_Play(pl, CHAN_ITEM, "buy.weapon"); diff --git a/src/server/cstrike/gamerules.cpp b/src/server/cstrike/gamerules.cpp index eb3bb9fa..00cfcbd7 100644 --- a/src/server/cstrike/gamerules.cpp +++ b/src/server/cstrike/gamerules.cpp @@ -220,4 +220,4 @@ void CSGameRules::PlayerKill(player pl) { Damage_Apply(pl, pl, pl.health, WEAPON_NONE, DMG_SKIP_ARMOR); -} +} diff --git a/src/server/cstrike/gamerules.h b/src/server/cstrike/gamerules.h index 8d87341c..907a7f43 100644 --- a/src/server/cstrike/gamerules.h +++ b/src/server/cstrike/gamerules.h @@ -74,4 +74,5 @@ class CSMultiplayerRules:CSGameRules virtual void(player) PlayerMakeSpectator; virtual void(player, int) PlayerRespawn; virtual entity(float) PlayerFindSpawn; + virtual int(void) MaxItemPerSlot; }; diff --git a/src/server/cstrike/gamerules_multiplayer.cpp b/src/server/cstrike/gamerules_multiplayer.cpp index 9c063026..eb46cf42 100644 --- a/src/server/cstrike/gamerules_multiplayer.cpp +++ b/src/server/cstrike/gamerules_multiplayer.cpp @@ -788,6 +788,12 @@ CSMultiplayerRules::PlayerSpawn(player pl) forceinfokey(pl, "*team", "0"); } +int +CSMultiplayerRules::MaxItemPerSlot(void) +{ + return 1; +} + void CSMultiplayerRules::CSMultiplayerRules(void) { diff --git a/src/server/gamerules.cpp b/src/server/gamerules.cpp index 64c1dc9f..6bb5571b 100644 --- a/src/server/gamerules.cpp +++ b/src/server/gamerules.cpp @@ -104,6 +104,12 @@ CGameRules::SpectatorThink(player pl) //print("SpectatorThink!\n"); }*/ +int +CGameRules::MaxItemPerSlot(void) +{ + return -1; +} + void CGameRules::CGameRules(void) { diff --git a/src/server/gamerules.h b/src/server/gamerules.h index 8a528483..207c9d61 100644 --- a/src/server/gamerules.h +++ b/src/server/gamerules.h @@ -38,6 +38,8 @@ class CGameRules virtual void(void) LevelNewParms; virtual void(player) LevelChangeParms; + virtual int(void) MaxItemPerSlot; + /* spectator */ /*virtual void(player) SpectatorConnect; virtual void(player) SpectatorDisconnect; diff --git a/src/server/valve/items.cpp b/src/server/valve/items.cpp index db4e8a05..81b7ef73 100644 --- a/src/server/valve/items.cpp +++ b/src/server/valve/items.cpp @@ -17,6 +17,8 @@ /* PICKUP ITEMS */ class item_pickup:CBaseTrigger { + int m_iClip; + int m_iWasDropped; int id; void(void) item_pickup; @@ -72,7 +74,10 @@ void item_pickup::Respawn(void) think = __NULL__; nextthink = -1; - sound(this, CHAN_ITEM, "items/suitchargeok1.wav", 1, ATTN_NORM, 150); + + if (!m_iWasDropped) + sound(this, CHAN_ITEM, "items/suitchargeok1.wav", 1, ATTN_NORM, 150); + droptofloor(); } diff --git a/src/shared/valve/fx_explosion.c b/src/shared/valve/fx_explosion.c index 51b26285..cc6c2aa5 100755 --- a/src/shared/valve/fx_explosion.c +++ b/src/shared/valve/fx_explosion.c @@ -16,6 +16,7 @@ #ifdef CLIENT var int FX_EXPLOSION_MAIN; +var int FX_EXPLOSION_BS; void FX_Explosion_Init(void) @@ -25,6 +26,7 @@ FX_Explosion_Init(void) precache_sound("weapons/explode5.wav"); precache_model("sprites/fexplo.spr"); FX_EXPLOSION_MAIN = particleeffectnum("fx_explosion.main"); + FX_EXPLOSION_BS = particleeffectnum("fx_explosion.blacksmoke"); } #endif @@ -56,6 +58,7 @@ FX_Explosion(vector vecPos) eExplosion.nextthink = time + 0.05f; pointparticles(FX_EXPLOSION_MAIN, vecPos, [0,0,0], 1); + pointparticles(FX_EXPLOSION_BS, vecPos, [0,0,0], 1); #endif } diff --git a/src/shared/valve/weapon_common.c b/src/shared/valve/weapon_common.c index b2df0094..c0db727d 100644 --- a/src/shared/valve/weapon_common.c +++ b/src/shared/valve/weapon_common.c @@ -284,6 +284,25 @@ int Weapons_AddItem(player pl, int w) entity oldself = self; self = pl; + /* let's check if we've got a limit */ + int maxit; + CGameRules rules = (CGameRules)g_grMode; + maxit = rules.MaxItemPerSlot(); + if (maxit > 0) { + int wantslot = g_weapons[w].slot; + int c; + for (int i = 0; i < g_weapons.length; i++) { + if (pl.g_items & g_weapons[i].id && g_weapons[i].slot == wantslot) { + c++; + + /* we're over the slot limit. */ + if (c >= maxit) { + return FALSE; + } + } + } + } + /* in case programmer decided not to add a pickup callback */ if (g_weapons[w].pickup == __NULL__) { if (pl.g_items & g_weapons[w].id) { @@ -384,7 +403,7 @@ void CSEv_DropWeapon(void) if (!pl.activeweapon) return; - item_pickup drop = spawn(item_pickup); + item_pickup drop = spawn(item_pickup, m_iWasDropped: TRUE, m_iClip: pl.a_ammo1); drop.setitem(pl.activeweapon); setorigin(drop, pl.origin); drop.solid = SOLID_NOT; diff --git a/valve/data.pk3dir/particles/fx_explosion.cfg b/valve/data.pk3dir/particles/fx_explosion.cfg index 376ab32f..33a6712f 100644 --- a/valve/data.pk3dir/particles/fx_explosion.cfg +++ b/valve/data.pk3dir/particles/fx_explosion.cfg @@ -9,7 +9,7 @@ r_part ember scalefactor 1 friction 8 gravity 50 - die 1 + die 1.5 blend add randomvel 5 veladd 1 @@ -51,4 +51,19 @@ r_part main friction 1 blend add assoc expgib -} +} + +r_part blacksmoke +{ + texture "particles/fteparticlefont.tga" + tcoords 97 97 191 191 256 + count 1 + scale 324 + scalefactor 1 + die 3 + alpha 1 + rgb 0 0 0 + spawnmode ball + gravity -25 + veladd -20 +}