Skip to content

Commit 23dc099

Browse files
authored
Release 1.2.0 (#69)
2 parents 1826b47 + b848332 commit 23dc099

27 files changed

+307
-101
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
### Zombie Panic Mod for Counter-Strike 1.6
2-
__Version:__ 1.0.0
2+
__Version:__ 1.2.0
33

44
### Download latest:
55
- [Releases](../../releases)

assets/addons/amxmodx/configs/zombiepanic.cfg

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ zp_flashlight_consumption_rate 0.5
1212
zp_flashlight_recovery_rate 0.5
1313

1414
// [Zombie Panic] Gamerules
15-
zp_zombie_lives 20
15+
zp_zombie_lives 0
16+
zp_zombie_lives_per_player 2
1617

1718
// [Zombie Panic] Infection
1819
zp_infection_chance 10

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "zombiepanic",
3-
"version": "1.1.0",
3+
"version": "1.2.0",
44
"description": "Zombie Panic Mod",
55
"scripts": {
66
"gulp": "gulp",

src/include/zombiepanic.inc

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,25 @@
11
/*
2+
1.2.0
3+
Additions and improvements:
4+
Reduced crowbar damage to 25
5+
Added crowbar knockback
6+
Zombie lives are now related to the number of survivors
7+
Zombies number are now related to the number of survivors
8+
Added chooseteam command for spectators
9+
Zombies no longer respawn after round ends
10+
Magnum no longer eject brass when shooting
11+
Added blink effect at the end of the transformation
12+
Added unselectable characters support
13+
14+
Cvars:
15+
Added zp_zombie_lives_per_player cvar
16+
17+
Fixes:
18+
Fixed client crashes related to weapon icon names
19+
Fixed crosshair flickering
20+
Fixed zombie vision external fade handling
21+
Fixed zombie vision fade effect when respawning
22+
223
1.1.0
324
Additions and improvements:
425
Added infection (10% chance by default)
@@ -34,7 +55,9 @@ native bool:ZP_Player_ToggleFlashlight(pPlayer);
3455
native bool:ZP_Player_ToggleZombieVision(pPlayer);
3556
native bool:ZP_Player_IsInfected(pPlayer);
3657
native bool:ZP_Player_IsTransforming(pPlayer);
37-
native ZP_Player_SetInfected(pPlayer, bool:bValue);
58+
native bool:ZP_Player_IsPartialZombie(pPlayer);
59+
native ZP_Player_SetInfected(pPlayer, bool:bValue, pInfector = 0);
60+
native bool:ZP_Player_SetCharacter(pPlayer, const szCharacter[]);
3861

3962
forward ZP_Fw_PlayerJoined(pPlayer);
4063
forward ZP_Fw_PlayerPanic(pPlayer);
@@ -43,6 +66,7 @@ forward ZP_Fw_Player_AimItem(pPlayer, pItem);
4366
forward ZP_Fw_PlayerInfected(pPlayer, pInfector);
4467
forward ZP_Fw_PlayerTransformationDeath(pPlayer);
4568
forward ZP_Fw_PlayerTransformed(pPlayer);
69+
forward ZP_Fw_PlayerEquiped(pPlayer);
4670

4771
// Player inventory
4872

src/include/zombiepanic_const.inc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#define ZP_TITLE "Zombie Panic"
2-
#define ZP_VERSION "1.1.0"
2+
#define ZP_VERSION "1.2.0"
33

44
#define ZP_HUMAN_TEAM 2
55
#define ZP_ZOMBIE_TEAM 1

src/include/zombiepanic_utils.inc

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,3 +143,24 @@ stock bool:UTIL_IsPlayerSpectator(pPlayer) {
143143
new iTeam = get_member(pPlayer, m_iTeam);
144144
return iTeam < 1 || iTeam > 2;
145145
}
146+
147+
stock UTIL_PlayerKnockback(pVictim, pAttacker, Float:flForce) {
148+
static Float:vecOrigin[3];
149+
pev(pVictim, pev_origin, vecOrigin);
150+
151+
static Float:vecAttackerOrigin[3];
152+
pev(pAttacker, pev_origin, vecAttackerOrigin);
153+
154+
static Float:vecDir[3];
155+
xs_vec_sub(vecOrigin, vecAttackerOrigin, vecDir);
156+
157+
new Float:flLen = xs_vec_len_2d(vecDir);
158+
159+
static Float:vecVelocity[3];
160+
pev(pVictim, pev_velocity, vecVelocity);
161+
for (new i = 0; i < 2; ++i) {
162+
vecVelocity[i] = (vecDir[i] / flLen) * flForce;
163+
}
164+
165+
set_pev(pVictim, pev_velocity, vecVelocity);
166+
}

src/scripts/api/api_custom_weapons.sma

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -568,7 +568,11 @@ public OnPlayerPreThink_Post(pPlayer) {
568568
}
569569

570570
public OnPlayerTakeDamage(pPlayer, pInflictor, pAttacker) {
571-
g_pKillerItem = pInflictor;
571+
if (pAttacker && ExecuteHam(Ham_IsPlayer, pAttacker) && pInflictor == pAttacker) {
572+
g_pKillerItem = get_member(pAttacker, m_pActiveItem);
573+
} else {
574+
g_pKillerItem = pInflictor;
575+
}
572576
}
573577

574578
public OnPlayerTakeDamage_Post() {
@@ -600,10 +604,12 @@ public OnMessage_DeathMsg(iMsgId, iDest, pPlayer) {
600604

601605
static szIcon[64];
602606
GetStringData(iHandler, CW_Data_Icon, szIcon, charsmax(szIcon));
607+
603608
if (szIcon[0] == '^0') {
604609
GetStringData(iHandler, CW_Data_Name, szIcon, charsmax(szIcon));
605610
}
606611

612+
607613
set_msg_arg_string(4, szIcon);
608614

609615
return PLUGIN_CONTINUE;
@@ -736,16 +742,16 @@ ItemPostFrame(this) {
736742
new iPrimaryAmmoAmount = get_member(pPlayer, m_rgAmmo, iPrimaryAmmoIndex);
737743
new iSecondaryAmmoAmount = get_member(pPlayer, m_rgAmmo, iSecondaryAmmoIndex);
738744

739-
if (flInReload && flNextAttack <= 0.0) {
740-
CompleteReload(this);
741-
}
742-
743745
new Float:flReloadEndTime = get_member(this, m_Weapon_flNextReload);
744746
if (flReloadEndTime && flReloadEndTime < get_gametime()) {
745747
set_member(this, m_Weapon_flNextReload, 0.0);
746748
ExecuteBindedFunction(CWB_Pump, this);
747749
}
748750

751+
if (flInReload && flNextAttack <= 0.0) {
752+
CompleteReload(this);
753+
}
754+
749755
if ((button & IN_ATTACK2) && flNextSecondaryAttack <= 0) {
750756
if (iSecondaryAmmoIndex > 0 && !iSecondaryAmmoAmount) {
751757
set_member(this, m_Weapon_fFireOnEmpty, 1);
@@ -822,6 +828,7 @@ WeaponHolster(this) {
822828
SetWeaponPrediction(pPlayer, true);
823829
set_member(this, m_Weapon_fInReload, 0);
824830
set_member(this, m_Weapon_fInSpecialReload, 0);
831+
set_member(this, m_Weapon_flNextReload, 0.0);
825832

826833
if (ExecuteBindedFunction(CWB_Holster, this) > PLUGIN_CONTINUE) {
827834
return;

src/scripts/core/zombiepanic.sma

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#define AUTHOR "Hedgehog Fog"
1111

1212
new g_pFwConfigLoaded;
13-
new g_pFwResult;
13+
new g_iFwResult;
1414

1515
new g_pCvarVersion;
1616

@@ -50,7 +50,7 @@ public plugin_cfg() {
5050
server_cmd("exec %s/zombiepanic.cfg", szConfigDir);
5151
server_exec();
5252

53-
ExecuteForward(g_pFwConfigLoaded, g_pFwResult);
53+
ExecuteForward(g_pFwConfigLoaded, g_iFwResult);
5454
}
5555

5656
public OnVersionCvarChange() {

src/scripts/core/zp_characters.sma

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ enum CharacterData {
2727
Character_HumanDeathSounds,
2828
Character_PanicSounds,
2929
Character_ZombieAmbientSounds,
30-
Character_ZombieDeathSounds
30+
Character_ZombieDeathSounds,
31+
Character_IsSelectable
3132
}
3233

3334
new gmsgClCorpse;
@@ -36,6 +37,7 @@ new g_szCharacterDir[MAX_RESOURCE_PATH_LENGTH];
3637

3738
new Array:g_rgCharactersData[CharacterData];
3839
new Trie:g_iCharactersMap;
40+
new Array:g_iSelectableCharacters;
3941
new g_iCharacterCount = 0;
4042

4143
new g_iPlayerCharacter[MAX_PLAYERS + 1] = { -1, ... };
@@ -68,10 +70,25 @@ public plugin_init() {
6870
g_iCwSwipeHandler = CW_GetHandler(ZP_WEAPON_SWIPE);
6971
}
7072

73+
public plugin_natives() {
74+
register_native("ZP_Player_SetCharacter", "Native_SetCharacter");
75+
}
76+
7177
public plugin_end() {
7278
DestroyCharactersStore();
7379
}
7480

81+
/*--------------------------------[ Natives ]--------------------------------*/
82+
83+
public bool:Native_SetCharacter(iPluginId, iArgc) {
84+
new pPlayer = get_param(1);
85+
86+
new szCharacter[32];
87+
get_string(2, szCharacter, charsmax(szCharacter));
88+
89+
return SetCharacter(pPlayer, szCharacter);
90+
}
91+
7592
/*--------------------------------[ Forwards ]--------------------------------*/
7693

7794
public client_connect(pPlayer) {
@@ -148,6 +165,17 @@ public Task_Ambient(iTaskId) {
148165

149166
/*--------------------------------[ Methods ]--------------------------------*/
150167

168+
bool:SetCharacter(pPlayer, const szCharacter[]) {
169+
new iCharacter;
170+
if (!TrieGetCell(g_iCharactersMap, szCharacter, iCharacter)) {
171+
return false;
172+
}
173+
174+
g_iPlayerCharacter[pPlayer] = iCharacter;
175+
176+
return true;
177+
}
178+
151179
UpdatePlayerModel(pPlayer) {
152180
new iCharacter = g_iPlayerCharacter[pPlayer];
153181

@@ -174,12 +202,13 @@ UpdatePlayerCharacter(pPlayer, bool:bOverride = false) {
174202
get_user_info(pPlayer, CHARACTER_KEY, szCharacter, charsmax(szCharacter));
175203

176204
new iCharacter;
177-
if (!TrieGetCell(g_iCharactersMap, szCharacter, iCharacter)) {
205+
if (!TrieGetCell(g_iCharactersMap, szCharacter, iCharacter)
206+
|| !ArrayGetCell(Array:g_rgCharactersData[Character_IsSelectable], iCharacter)) {
178207
if (!bOverride) {
179208
return;
180209
}
181210

182-
iCharacter = random(g_iCharacterCount);
211+
iCharacter = ArrayGetCell(g_iSelectableCharacters, random(ArraySize(g_iSelectableCharacters)));
183212
}
184213

185214
g_iPlayerCharacter[pPlayer] = iCharacter;
@@ -219,6 +248,8 @@ CreateCharacter() {
219248
CrateCharacterSoundsData(iCharacter, Character_ZombieAmbientSounds);
220249
CrateCharacterSoundsData(iCharacter, Character_ZombieDeathSounds);
221250

251+
ArraySetCell(Array:g_rgCharactersData[Character_IsSelectable], iCharacter, true);
252+
222253
g_iCharacterCount++;
223254

224255
return iCharacter;
@@ -289,6 +320,14 @@ LoadCharacter(const szName[]) {
289320
LoadCharacterSoundsData(iCharacter, iSoundsDoc, "zombie.ambient", Character_ZombieAmbientSounds);
290321
LoadCharacterSoundsData(iCharacter, iSoundsDoc, "zombie.death", Character_ZombieDeathSounds);
291322

323+
if (json_object_has_value(iDoc, "selectable")) {
324+
ArraySetCell(Array:g_rgCharactersData[Character_IsSelectable], iCharacter, json_object_get_bool(iDoc, "selectable"));
325+
}
326+
327+
if (ArrayGetCell(Array:g_rgCharactersData[Character_IsSelectable], iCharacter)) {
328+
ArrayPushCell(g_iSelectableCharacters, iCharacter);
329+
}
330+
292331
return iCharacter;
293332
}
294333

@@ -315,6 +354,7 @@ LoadCharacterSoundsData(iCharacter, JSON:iSoundDoc, const szKey[], CharacterData
315354

316355
InitializeCharactersStore() {
317356
g_iCharactersMap = TrieCreate();
357+
g_iSelectableCharacters = ArrayCreate(_, RESERVED_CHARACTER_COUNT);
318358

319359
g_rgCharactersData[Character_HumanModel] = ArrayCreate(MAX_RESOURCE_PATH_LENGTH, RESERVED_CHARACTER_COUNT);
320360
g_rgCharactersData[Character_ZombieModel] = ArrayCreate(MAX_RESOURCE_PATH_LENGTH, RESERVED_CHARACTER_COUNT);
@@ -323,6 +363,7 @@ InitializeCharactersStore() {
323363
g_rgCharactersData[Character_PanicSounds] = ArrayCreate(_, RESERVED_CHARACTER_COUNT);
324364
g_rgCharactersData[Character_ZombieAmbientSounds] = ArrayCreate(_, RESERVED_CHARACTER_COUNT);
325365
g_rgCharactersData[Character_ZombieDeathSounds] = ArrayCreate(_, RESERVED_CHARACTER_COUNT);
366+
g_rgCharactersData[Character_IsSelectable] = ArrayCreate(_, RESERVED_CHARACTER_COUNT);
326367
}
327368

328369
DestroyCharactersStore() {
@@ -331,6 +372,7 @@ DestroyCharactersStore() {
331372
}
332373

333374
TrieDestroy(g_iCharactersMap);
375+
ArrayDestroy(g_iSelectableCharacters);
334376

335377
ArrayDestroy(Array:g_rgCharactersData[Character_HumanModel]);
336378
ArrayDestroy(Array:g_rgCharactersData[Character_ZombieModel]);

src/scripts/core/zp_flashlight.sma

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@
1515

1616
#define TASKID_FLASHLIGHT_HUD 100
1717

18-
#define FLASHLIGHT_CHARGE_MAX 100.0
19-
#define FLASHLIGHT_CHARGE_DEF FLASHLIGHT_CHARGE_MAX
18+
#define FLASHLIGHT_MAX_BRIGHTNESS 160.0
2019
#define FLASHLIGHT_RATE 0.025
21-
#define FLASHLIGHT_MAX_DISTANCE 1024.0
20+
#define FLASHLIGHT_MAX_DISTANCE 768.0
2221
#define FLASHLIGHT_MAX_CHARGE 100.0
2322
#define FLASHLIGHT_MIN_CHARGE 0.0
23+
#define FLASHLIGHT_DEF_CHARGE FLASHLIGHT_MAX_CHARGE
2424
#define FLASHLIGHT_MIN_CHARGE_TO_ACTIVATE 10.0
2525

2626
enum PlayerFlashlight {
@@ -74,7 +74,7 @@ public OnPlayerSpawn_Post(pPlayer) {
7474
}
7575

7676
SetPlayerFlashlight(pPlayer, false);
77-
g_rgPlayerFlashlight[pPlayer][PlayerFlashlight_Charge] = FLASHLIGHT_CHARGE_DEF;
77+
g_rgPlayerFlashlight[pPlayer][PlayerFlashlight_Charge] = FLASHLIGHT_DEF_CHARGE;
7878
set_pev(pPlayer, pev_framerate, 1.0);
7979

8080
return HAM_HANDLED;
@@ -223,17 +223,20 @@ CreatePlayerFlashlightLight(pPlayer) {
223223
new Float:flDistance = get_distance_f(vecStart, vecEnd);
224224
if (flDistance <= FLASHLIGHT_MAX_DISTANCE) {
225225
// TODO: Remove this hardcoded shit
226-
new Float:flRadius = 4.0 + (flDistance / 64.0);
227-
new Float:flBrightness = floatmax(255.0 - flDistance / 4.0, 0.0);
228-
229-
new iColor[3];
230-
for (new i = 0; i < 3; ++i) {
231-
iColor[i] = floatround(flBrightness);
226+
new Float:flDistanceRatio = (flDistance / FLASHLIGHT_MAX_DISTANCE);
227+
new Float:flBrightness = FLASHLIGHT_MAX_BRIGHTNESS * (1.0 - flDistanceRatio);
228+
if (flBrightness > 1.0) {
229+
new iColor[3];
230+
for (new i = 0; i < 3; ++i) {
231+
iColor[i] = floatround(flBrightness);
232+
}
233+
234+
new Float:flRadius = 4.0 + (16.0 * flDistanceRatio);
235+
new iLifeTime = max(1, floatround(FLASHLIGHT_RATE * 10));
236+
new iDecayRate = 10 / iLifeTime;
237+
238+
UTIL_Message_Dlight(vecEnd, floatround(flRadius), iColor, iLifeTime, iDecayRate);
232239
}
233-
234-
new iLifeTime = max(1, floatround(FLASHLIGHT_RATE * 10));
235-
new iDecayRate = 10 / iLifeTime;
236-
UTIL_Message_Dlight(vecEnd, floatround(flRadius), iColor, iLifeTime, iDecayRate);
237240
}
238241
}
239242

0 commit comments

Comments
 (0)