-
Notifications
You must be signed in to change notification settings - Fork 9
/
l4d2_dlc2_levelup.sp
19051 lines (16328 loc) · 598 KB
/
l4d2_dlc2_levelup.sp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <sdkhooks>
#include <geoip>
#include <dhooks>
#include <adminmenu>
#include <left4dhooks>
#undef REQUIRE_PLUGIN
#undef REQUIRE_EXTENSIONS
#tryinclude <l4d2_skill_detect>
#tryinclude <weaponhandling>
// #tryinclude <l4d_info_editor>
#tryinclude <infected_ability_touch_hook>
public Plugin myinfo =
{
name = "娱乐插件",
author = "zonde306",
description = "",
version = "1.2.5",
url = "https://forums.alliedmods.net/",
};
#define SOUND_Bomb "weapons/grenade_launcher/grenadefire/grenade_launcher_explode_1.wav"
#define SOUND_BCLAW "animation/bombing_run_01.wav"
#define SOUND_FREEZE "physics/glass/glass_impact_bullet4.wav"
#define SOUND_GOOD "level/gnomeftw.wav"
#define SOUND_BAD "npc/moustachio/strengthattract05.wav"
#define SOUND_WARP "ambient/energy/zap7.wav"
#define SOUND_Ball "physics/destruction/explosivegasleak.wav"
#define PARTICLE_BLOOD "blood_impact_infected_01"
#define SOUND_GIFT_PICKUP "ui/gift_pickup.wav"
#define SOUND_AWARD_BIG "ui/pickup_secret01.wav"
#define SOUND_AWARD_LITTLE "ui/littlereward.wav"
#define SOUND_STUN "plats/churchbell_end.wav"
#define SOUND_ANGRY "ui/survival_teamrec.wav"
#define SOUND_BELL "level/bell_normal.wav"
#define SOUND_REGULAR "level/scoreregular.wav"
#define SOUND_CLICK "level/timer_bell.wav"
#define SOUND_PUCK "level/puck_fail.wav"
#define SOUND_FLYING "level/loud/climber.wav"
#define SOUND_CRASH "level/loud/adrenaline_impact.wav"
#define SOUND_RESURRECT "level/loud/wamover.wav"
#define SOUND_HINT "buttons/bell1.wav"
#define SOUND_LEVELUP "ui/bigreward.wav"
#define SOUND_AMMO "items/itempickup.wav"
#define SOUND_CROW "ambient/animal/crow_2.wav"
#define SOUND_EXPLOSIVE "weapons/hegrenade/explode5.wav"
#define SOUND_GIFT "ui/gift_drop.wav"
// #define SOUND_BILE_BGM "music/terror/pukricide.wav"
#define g_flSoH_rate 0.4
#define ZC_SMOKER 1
#define ZC_BOOMER 2
#define ZC_HUNTER 3
#define ZC_SPITTER 4
#define ZC_JOCKEY 5
#define ZC_CHARGER 6
#define ZC_WITCH 7
#define ZC_TANK 8
#define ZC_SURVIVOR 9
#define TEAM_SPECTATORS 1
#define TEAM_SURVIVORS 2
#define TEAM_INFECTED 3
#define CVAR_FLAGS FCVAR_PROTECTED|FCVAR_NOT_CONNECTED|FCVAR_DONTRECORD
#define DMG_CHOKE (1 << 20)
#define DMG_MELEE (1 << 21)
#define DMG_STUMBLE (1 << 25)
#define DMG_HEADSHOT (1 << 30)
#define DMG_DISMEMBER (1 << 31)
#define DAMAGE_NO 0
#define DAMAGE_EVENTS_ONLY 1
#define DAMAGE_YES 2
#define DAMAGE_AIM 3
#define IMPULS_FLASHLIGHT 100
#define AMMOTYPE_PISTOL 1
#define AMMOTYPE_MAGNUM 2
#define AMMOTYPE_ASSAULTRIFLE 3
#define AMMOTYPE_MINIGUN 4
#define AMMOTYPE_SMG 5
#define AMMOTYPE_M60 6
#define AMMOTYPE_SHOTGUN 7
#define AMMOTYPE_AUTOSHOTGUN 8
#define AMMOTYPE_HUNTINGRIFLE 9
#define AMMOTYPE_SNIPERRIFLE 10
#define AMMOTYPE_TURRET 11
#define AMMOTYPE_PIPEBOMB 12
#define AMMOTYPE_MOLOTOV 13
#define AMMOTYPE_VOMITJAR 14
#define AMMOTYPE_PAINPILLS 15
#define AMMOTYPE_FIRSTAID 16
#define AMMOTYPE_GRENADELAUNCHER 17
#define AMMOTYPE_ADRENALINE 18
#define AMMOTYPE_CHAINSAW 19
#define g_flSoHAutoS 0.666666
#define g_flSoHAutoI 0.4
#define g_flSoHAutoE 0.675
#define g_flSoHSpasS 0.5
#define g_flSoHSpasI 0.375
#define g_flSoHSpasE 0.699999
#define g_flSoHPumpS 0.5
#define g_flSoHPumpI 0.5
#define g_flSoHPumpE 0.6
#define TRACE_TOLERANCE 25.0
Handle g_pfnFindUseEntity = null, g_pfnResetEntityState = null;
// StringMap g_WeaponClipSize, g_WeaponDamage;
const int g_iMaxClip = 254; // 游戏所允许的最大弹匣数量 8bit,但是 255 会被显示为 0,超过会溢出
const int g_iMaxAmmo = 1023; // 游戏所允许的最大子弹数量 10bit,超过会溢出
const int g_iMaxHealHealth = 1268; // 游戏所允许的最大治疗量,超过会溢出
const float g_fIncapShovePenalty = 0.1; // 连续倒地推惩罚时间
const int g_iIncapShoveNumTrace = 11;
const float g_fIncapShoveDegree = 90.0;
const float g_fJumpHeight = 35.0; // 跳跃高度
const float g_fJumpHeightDucking = 52.0; // 跳跃高度(蹲下)
#define IsValidClient(%1) (1 <= %1 <= MaxClients && IsClientInGame(%1))
#define IsValidAliveClient(%1) (1 <= %1 <= MaxClients && IsClientInGame(%1) && IsPlayerAlive(%1) && !GetEntProp(%1, Prop_Send, "m_isGhost"))
#define IsSurvivorHeld(%1) (GetEntPropEnt(%1, Prop_Send, "m_jockeyAttacker") > 0 || GetEntPropEnt(%1, Prop_Send, "m_pummelAttacker") > 0 || GetEntPropEnt(%1, Prop_Send, "m_pounceAttacker") > 0 || GetEntPropEnt(%1, Prop_Send, "m_tongueOwner") > 0 || GetEntPropEnt(%1, Prop_Send, "m_carryAttacker") > 0)
#define IsNullVector(%1) (%1[0] == NULL_VECTOR[0] || %1[1] == NULL_VECTOR[1] || %1[2] == NULL_VECTOR[2])
#define NATIVE_EXISTS(%0) (GetFeatureStatus(FeatureType_Native, %0) == FeatureStatus_Available)
int g_clSkill_1[MAXPLAYERS+1], g_clSkill_2[MAXPLAYERS+1], g_clSkill_3[MAXPLAYERS+1], g_clSkill_4[MAXPLAYERS+1], g_clSkill_5[MAXPLAYERS+1];
const int SKL_1_MaxHealth = (1 << 0);
const int SKL_1_Movement = (1 << 1);
const int SKL_1_ReviveHealth = (1 << 2);
const int SKL_1_DmgExtra = (1 << 3);
const int SKL_1_MagnumInf = (1 << 4);
const int SKL_1_Gravity = (1 << 5);
const int SKL_1_Firendly = (1 << 6);
const int SKL_1_RapidFire = (1 << 7);
const int SKL_1_Armor = (1 << 8);
const int SKL_1_NoRecoil = (1 << 9);
const int SKL_1_KeepClip = (1 << 10);
const int SKL_1_ReviveBlock = (1 << 11);
const int SKL_1_DisplayHealth = (1 << 12);
const int SKL_1_MultiUpgrade = (1 << 13);
const int SKL_1_Button = (1 << 14);
const int SKL_1_GettingUP = (1 << 15);
const int SKL_1_NightVision = (1 << 16);
const int SKL_1_QuickUse = (1 << 17);
const int SKL_2_Chainsaw = (1 << 0);
const int SKL_2_Excited = (1 << 1);
const int SKL_2_PainPills = (1 << 2);
const int SKL_2_FullHealth = (1 << 3);
const int SKL_2_Defibrillator = (1 << 4);
const int SKL_2_HealBouns = (1 << 5);
const int SKL_2_PipeBomb = (1 << 6);
const int SKL_2_SelfHelp = (1 << 7);
const int SKL_2_Defensive = (1 << 8);
const int SKL_2_DoubleJump = (1 << 9);
const int SKL_2_ProtectiveSuit = (1 << 10);
const int SKL_2_Magnum = (1 << 11);
const int SKL_2_LadderRambos = (1 << 12);
const int SKL_2_IncapCrawling = (1 << 13);
const int SKL_2_ShoveFatigue = (1 << 14);
const int SKL_2_QuickRevive = (1 << 15);
const int SKL_2_PrototypeGrenade = (1 << 16);
const int SKL_2_AutoReload = (1 << 17);
const int SKL_3_Sacrifice = (1 << 0);
const int SKL_3_Respawn = (1 << 1);
const int SKL_3_IncapFire = (1 << 2);
const int SKL_3_ReviveBonus = (1 << 3);
const int SKL_3_Freeze = (1 << 4);
const int SKL_3_Kickback = (1 << 5);
const int SKL_3_GodMode = (1 << 6);
const int SKL_3_SelfHeal = (1 << 7);
const int SKL_3_BunnyHop = (1 << 8);
const int SKL_3_Parachute = (1 << 9);
const int SKL_3_MoreAmmo = (1 << 10);
const int SKL_3_TempSanctuary = (1 << 11);
const int SKL_3_Ricochet = (1 << 12);
const int SKL_3_Accurate = (1 << 13);
const int SKL_3_Cure = (1 << 14);
const int SKL_3_Minigun = (1 << 15);
const int SKL_3_HandGrenade = (1 << 16);
const int SKL_3_DamageScale = (1 << 17);
const int SKL_4_ClawHeal = (1 << 0);
const int SKL_4_DmgExtra = (1 << 1);
const int SKL_4_DuckShover = (1 << 2);
const int SKL_4_FastFired = (1 << 3);
const int SKL_4_SniperExtra = (1 << 4);
const int SKL_4_FastReload = (1 << 5);
const int SKL_4_MachStrafe = (1 << 6);
const int SKL_4_MoreDmgExtra = (1 << 7);
const int SKL_4_Defensive = (1 << 8);
const int SKL_4_ClipSize = (1 << 9);
const int SKL_4_Shove = (1 << 10);
const int SKL_4_TempRespite = (1 << 11);
const int SKL_4_Terror = (1 << 12);
const int SKL_4_ReviveCount = (1 << 13);
const int SKL_4_MeleeExtra = (1 << 14);
const int SKL_4_MoreGrenade = (1 << 15);
const int SKL_4_MultiGrenade = (1 << 16);
const int SKL_4_LastStand = (1 << 17);
const int SKL_5_FireBullet = (1 << 0);
const int SKL_5_ExpBullet = (1 << 1);
const int SKL_5_RetardBullet = (1 << 2);
const int SKL_5_DmgExtra = (1 << 3);
const int SKL_5_Vampire = (1 << 4);
const int SKL_5_InfAmmo = (1 << 5);
const int SKL_5_Overkill = (1 << 6);
const int SKL_5_RocketDude = (1 << 7);
const int SKL_5_ClipHold = (1 << 8);
const int SKL_5_Sneak = (1 << 9);
const int SKL_5_MeleeRange = (1 << 10);
const int SKL_5_ShoveRange = (1 << 11);
const int SKL_5_TempRegen = (1 << 12);
const int SKL_5_Resurrect = (1 << 13);
const int SKL_5_Lethal = (1 << 14);
const int SKL_5_Machine = (1 << 15);
const int SKL_5_Robot = (1 << 16);
const int SKL_5_ThrowMelee = (1 << 17);
const int SKL_5_DamageDelay = (1 << 18);
new g_ttTankKilled = 0;
new g_iNextPAttO = -1;
new g_iVMStartTimeO = -1;
new g_iShotStartDurO = -1;
new g_iShotInsertDurO = -1;
new g_iShotEndDurO = -1;
new g_iPlayRateO = -1;
new g_iShotRelStateO = -1;
new g_iNextAttO = -1;
new g_iTimeIdleO = -1;
new g_iActiveWO = -1;
new g_iViewModelO = -1;
int g_iVelocityO = -1;
// int g_iBileTimestamp = -1;
new g_clSkillPoint[MAXPLAYERS+1] = {0, ...};
new g_ttDefibUsed[MAXPLAYERS+1] = {0, ...};
new g_ttOtherRevived[MAXPLAYERS+1] = {0, ...};
new g_ttSpecialKilled[MAXPLAYERS+1] = {0, ...};
new g_ttCommonKilled[MAXPLAYERS+1] = {0, ...};
new g_ttGivePills[MAXPLAYERS+1] = {0, ...};
new g_ttProtected[MAXPLAYERS+1] = {0, ...};
new g_ttCleared[MAXPLAYERS+1] = {0, ...};
new g_ttPaincEvent[MAXPLAYERS+1] = {0, ...};
new g_ttRescued[MAXPLAYERS+1] = {0, ...};
new g_csSlapCount[MAXPLAYERS+1] = {0, ...};
Handle g_hRPActive = null;
Handle g_hRPColddown[MAXPLAYERS+1];
new bool:g_cdCanTeleport[MAXPLAYERS+1] = {false, ...};
new bool:g_bHasVampire[MAXPLAYERS+1] = {false, ...};
new bool:g_bHasRetarding[MAXPLAYERS+1] = {false, ...};
float g_fNextGunShover[MAXPLAYERS+1];
float g_fNextHandGrenade[MAXPLAYERS+1];
// new bool:g_bCanDoubleJump[MAXPLAYERS+1] = {false, ...};
// new bool:g_bHanFirstRelease[MAXPLAYERS+1] = {false, ...};
float g_fMaxSpeedModify[MAXPLAYERS+1] = {1.0, ...};
float g_fMaxGravityModify[MAXPLAYERS+1] = {1.0, ...};
// float g_fNextCalmTime[MAXPLAYERS+1] = {0.0, ...};
int g_iIncapShoveIgnore[g_iIncapShoveNumTrace + 1];
bool g_bIsHitByVomit[MAXPLAYERS+1] = {false, ...};
bool g_bIsOnBile[MAXPLAYERS+1] = {false, ...};
// bool g_bIsInvulnerable[MAXPLAYERS+1];
bool g_bDeadlineHint[MAXPLAYERS+1];
int g_iExtraAmmo[MAXPLAYERS+1];
int g_iExtraArmor[MAXPLAYERS+1];
float g_fAccurateShot[MAXPLAYERS+1];
bool g_bOnRocketDude[MAXPLAYERS+1];
int g_iDamageChance[MAXPLAYERS+1];
int g_iDamageChanceMin[MAXPLAYERS+1];
int g_iDamageChanceMax[MAXPLAYERS+1];
int g_iDamageBase[MAXPLAYERS+1];
bool g_bIsVerified[MAXPLAYERS+1];
// ArrayList g_aDoorHandled;
Handle g_hTimerSurvival = null;
int g_iGlowModel[MAXPLAYERS+1];
int g_iGlowOwner[4096];
int g_iExtraPrimaryAmmo[MAXPLAYERS+1];
float g_fPressedTime[MAXPLAYERS+1];
float g_fLotteryStartTime = 0.0;
float g_fNextAccurateShot[MAXPLAYERS+1];
int g_iMaxReviveCount[MAXPLAYERS+1];
float g_fSacrificeTime[MAXPLAYERS+1];
float g_fMinigunTime[MAXPLAYERS+1];
Handle g_hTimerMinigun[MAXPLAYERS+1];
float g_fNightVision[MAXPLAYERS+1];
bool g_bFirstLoaded[MAXPLAYERS+1];
bool g_bHasGuilty[MAXPLAYERS+1];
float g_fQuickUse[MAXPLAYERS+1];
enum struct DelayedDamageInfo_t {
float time;
int attacker;
int inflictor;
float damage;
int damagetype;
int weapon;
}
ArrayList g_DelayDamage[MAXPLAYERS+1] = { null, ... };
enum struct TDInfo_t {
int dmg;
int dmg_type;
bool headshot;
bool death;
}
#define MAX_CACHED_MESSAGES 8
StringMap g_mTotalDamage[MAXPLAYERS+1];
// int g_iMessageChannel = 0;
// char g_sCacheMessage[MAXPLAYERS+1][MAX_CACHED_MESSAGES][64];
// Handle g_hClearCacheMessage[MAXPLAYERS+1];
bool g_bIsGamePlaying = false;
enum
{
JF_None = 0,
JF_HasJumping = 1,
JF_CanDoubleJump = 2,
JF_FirstReleased = 4,
JF_CanBunnyHop = 8,
JF_HasFirstJump = 16
};
#define LG_MODE_MANUAL 1
#define LG_MODE_AUTO 2
MoveType mtLastMoveType[MAXPLAYERS+1];
int g_iJumpFlags[MAXPLAYERS+1] = {0, ...};
// int g_iTotalDamage[MAXPLAYERS+1][MAXPLAYERS+1] = {0, ...};
// int g_iLastDamage[MAXPLAYERS+1][MAXPLAYERS+1] = {0, ...};
int g_iIsInCombat[MAXPLAYERS+1] = {-1, ...};
int g_iIsSneaking[MAXPLAYERS+1] = {-1, ...};
int g_iIsInBattlefield[MAXPLAYERS+1] = {-1, ...};
new String:g_soundLevel[80];
new String:g_sndPortalERROR[80];
new String:g_sndPortalFX[80];
new String:g_particle[80];
new Handle:g_CvarSoundLevel = INVALID_HANDLE;
new Handle:g_Cvarautomenu = INVALID_HANDLE;
ConVar g_Cvarhppack = null;
new Handle:cv_sndPortalERROR = INVALID_HANDLE;
new Handle:cv_sndPortalFX = INVALID_HANDLE;
new Handle:cv_particle = INVALID_HANDLE;
// new Handle:sdkRevive = INVALID_HANDLE;
// new Handle:hRoundRespawn = INVALID_HANDLE;
// new Handle:sdkCallPushPlayer = INVALID_HANDLE;
// new Handle:g_hGameConf = INVALID_HANDLE;
// new Handle: sdkAdrenaline = INVALID_HANDLE;
int g_iOldMeleeSwingRange = 0/*, g_iOldShoveSwingRange = 0*/, g_iOldShoveCharger = -1;
StringMap g_tMeleeRange, g_tShoveRange, g_tWeaponSkin;
const int g_iUnknownMeleeRange = 90;
const int g_iUnknownShoveRange = 90;
// new Float:cung_cdSaveCount[MAXPLAYERS+1][100][3];
new g_cdSaveCount[MAXPLAYERS+1];
new Float:g_fOldMovement[MAXPLAYERS+1];
new g_clAngryMode[MAXPLAYERS+1];
new g_clAngryPoint[MAXPLAYERS+1];
float g_fForgiveOfTK[MAXPLAYERS+1];
float g_fForgiveOfFF[MAXPLAYERS+1];
int g_iForgiveTKTarget[MAXPLAYERS+1];
int g_iForgiveFFTarget[MAXPLAYERS+1];
Handle g_hTimerRenderHealthBar = null;
bool g_bIsTankRock[2049];
#define SPRITE_BEAM "materials/sprites/laserbeam.vmt"
#define SPRITE_HALO "materials/sprites/halo01.vmt"
#define SPRITE_GLOW "materials/sprites/glow.vmt"
#define SOUND_IMPACT1 "physics/flesh/flesh_impact_bullet1.wav"
#define SOUND_IMPACT2 "physics/concrete/concrete_impact_bullet1.wav"
#define SOUND_STEEL "physics/metal/metal_solid_impact_hard5.wav"
// #define SOUND_WARP "ambient/energy/zap9.wav"
#define MODEL_SMOKER "models/infected/smoker.mdl"
#define MODEL_BOOMER "models/infected/boomer.mdl"
#define MODEL_HUNTER "models/infected/hunter.mdl"
#define MODEL_SPITTER "models/infected/spitter.mdl"
#define MODEL_JOCKEY "models/infected/jockey.mdl"
#define MODEL_CHARGER "models/infected/charger.mdl"
#define MODEL_TANK "models/infected/hulk.mdl"
static const char g_sndShoveInfected[][] = {
"player/survivor/hit/rifle_swing_hit_infected7.wav",
"player/survivor/hit/rifle_swing_hit_infected8.wav",
"player/survivor/hit/rifle_swing_hit_infected9.wav",
"player/survivor/hit/rifle_swing_hit_infected10.wav",
"player/survivor/hit/rifle_swing_hit_infected11.wav",
"player/survivor/hit/rifle_swing_hit_infected12.wav",
};
static const char g_sndShoveMiss[][] = {
"player/survivor/swing/swish_weaponswing_swipe5.wav",
"player/survivor/swing/swish_weaponswing_swipe6.wav",
};
new g_BeamSprite;
new g_HaloSprite;
// new g_GlowSrpite;
int g_iModelBeam;
#define MOLOTOV 0
#define EXPLODE 1
int g_iReloadWeaponEntity[MAXPLAYERS+1];
int g_iReloadWeaponClip[MAXPLAYERS+1];
int g_iReloadWeaponOldClip[MAXPLAYERS+1];
int g_iReloadWeaponKeepClip[MAXPLAYERS+1];
int g_iReloadWeaponUpgrade[MAXPLAYERS+1];
int g_iReloadWeaponUpgradeClip[MAXPLAYERS+1];
float g_fIncapShoveTimeout[MAXPLAYERS+1] = {0.0, ...};
char g_sLastWeapon[MAXPLAYERS+1][64];
int g_iLastWeaponClip[MAXPLAYERS+1];
bool g_bLastWeaponDual[MAXPLAYERS+1];
// int g_iOldRealHealth[MAXPLAYERS+1];
int g_iLastWeaponAmmo[MAXPLAYERS+1];
float g_fTimedButton[2048+1] = { -1.0, ... };
Handle g_hTimerAutoReload[MAXPLAYERS+1];
//装备附加
new g_iRoundEvent = 0;
float g_fNextRoundEvent = 0.0;
new String:g_szRoundEvent[64];
// 增加部位需要同时增加 g_clCurEquip 大小
enum EquipPart_t {
EquipPart_Head, // 头部
EquipPart_Body, // 身体
EquipPart_Hand, // 手部
EquipPart_Foot, // 脚部
}
enum EquipPrefix_t {
EquipPrefix_Fire, // 烈火(主伤害)
EquipPrefix_Water, // 流水(主生命)
EquipPrefix_Sky, // 破天(主跳跃)
EquipPrefix_Wind, // 疾风(主速度)
EquipPrefix_Lucky, // 惊魄(主暴击)
}
// 属性值上限
const int g_iMaxEquipDamage = 100; // 字面值
const int g_iMaxEquipHealth = 200; // 百分比
const int g_iMaxEquipSpeed = 20; // 百分比
const int g_iMaxEquipGravity = 25; // 百分比
const int g_iMaxEquipCrit = 1000; // 千分比
enum struct EquipData_t {
int hashID; // 装备唯一ID
bool valid; // 装备是否存在
EquipPrefix_t prefix; // 装备类型
EquipPart_t parts; // 装备部位
int damage; // 伤害加成(基础)
int health; // 生命上限加成
int speed; // 移动速度加成
int gravity; // 跳跃高度加成
int crit; // 暴击率加成
int effect; // 装备附魔效果,参考 RebuildEquipStr 里的定义
int ID; // 数据库使用的ID,存档用
// 字符串(仅显示用)
char sPrefix[32];
char sParts[32];
char sEffect[128];
char sNamed[32];
}
StringMap g_mEquipData[MAXPLAYERS+1];
new g_clCurEquip[MAXPLAYERS+1][4]; //当前装备部件所在栏位
int g_iActiveEffects[MAXPLAYERS+1];
// new SelectEqm[MAXPLAYERS+1]; //选择的装备
new bool:g_csHasGodMode[MAXPLAYERS+1] = { false, ...}; //无敌天赋无限子弹判断
Handle g_timerRespawn[MAXPLAYERS+1] = {null, ...};
const int g_iMaxEqmEffects = 72;
// bool g_bIgnorePreventStagger[MAXPLAYERS+1];
//玩家基本资料
char g_szSavePath[256];
KeyValues g_kvSavePlayer[MAXPLAYERS+1];
//附加
float g_ctPainPills[MAXPLAYERS+1], g_ctFullHealth[MAXPLAYERS+1], g_ctDefibrillator[MAXPLAYERS+1],
g_ctPipeBomb[MAXPLAYERS+1], g_ctGodMode[MAXPLAYERS+1], g_ctSelfHeal[MAXPLAYERS+1], g_ctConvTemp[MAXPLAYERS+1];
new g_stFallDamageKilled = 0;
bool g_bHasTeleportActived = false;
bool g_bHasFirstJoin[MAXPLAYERS+1];
bool g_bHasJumping[MAXPLAYERS+1];
// bool g_bIsPaincEvent = false;
// bool g_bIsPaincIncap = false;
int g_iChaseEntity[MAXPLAYERS+1];
Handle g_hChaseTimer[MAXPLAYERS+1];
new bool:g_bIsAngryCritActive = false;
new bool:g_bIsAngryLastStandActive = false;
new bool:g_bIsAngryBloodthirstyActive = false;
new bool:g_bIsAngryActive = false;
#define STAR_1_MDL "models/editor/air_node_hint.mdl"
#define STAR_2_MDL "models/editor/air_node.mdl"
#define MUSHROOM_MDL "models/editor/node_hint.mdl"
#define CHAIN_MDL "models/editor/scriptedsequence.mdl"
#define GOMBA_MDL "models/editor/overlay_helper.mdl"
#define LUMA_MDL "models/items/l4d_gift.mdl"
#define INDICATOR_MDL "models/extras/info_speech.mdl"
#define SLOT_NUM 20
#define REWARD_SOUND "ui/pickup_guitarriff10.wav"
int g_iBulletFired[MAXPLAYERS+1];
float g_fFreezeTime[MAXPLAYERS+1] = {0.0, ...};
int g_iWeaponSpeedEntity[MAXPLAYERS+1];
float g_fWeaponSpeedUpdate[MAXPLAYERS+1];
int g_iWeaponSpeedTotal = 0;
bool g_bIsPluginCrawling = false;
Database g_Database = null;
int g_iUserID[MAXPLAYERS+1];
ConVar g_pCvarCommonKilled, g_pCvarDefibUsed, g_pCvarGivePills, g_pCvarOtherRevived, g_pCvarProtected,
g_pCvarSpecialKilled, g_pCvarCleared, g_pCvarPaincEvent, g_pCvarRescued, g_pCvarTankDeath, g_pCvarReimburse,
g_pCvarSurvivorBot, g_pCvarInfectedBot, g_pCvarEquipment, g_pCvarGiveEquipment, g_pCvarRoundEnd, g_pCvarEventFlow,
g_pCvarTankHealth, g_pCvarSpecialHealth;
ConVar g_hCvarGodMode, g_hCvarInfinite, g_hCvarBurnNormal, g_hCvarBurnHard, g_hCvarBurnExpert, g_hCvarReviveHealth,
g_hCvarZombieSpeed, g_hCvarLimpHealth, g_hCvarDuckSpeed, g_hCvarMedicalTime, g_hCvarReviveTime, g_hCvarGravity,
g_hCvarShovRange, g_hCvarShovTime, g_hCvarMeleeRange, g_hCvarAdrenTime, g_hCvarDefibTime, g_hCvarZombieHealth,
g_hCvarIncapCount, g_hCvarPaincEvent, g_hCvarLimitSmoker, g_hCvarLimitBoomer, g_hCvarLimitHunter, g_hCvarLimitSpitter,
g_hCvarLimitJockey, g_hCvarLimitCharger, g_hCvarLimitSpecial, g_hCvarAccele, g_hCvarCollide, g_hCvarVelocity,
g_hCvarFirstAidMaxHeal, g_hCvarPainPillsMaxHeal, g_hCvarIncapCrawling, g_hCvarChargerShove;
// int g_iZombieSpawner = -1;
int g_iCommonHealth = 50;
bool /*g_bRoundFirstStarting = false, */g_bLateLoad = false;
ConVar g_pCvarKickSteamId, g_pCvarAllow, g_pCvarValidity, g_pCvarGiftChance, g_pCvarStartPoints, g_pCvarRP, g_pCvarRE, g_pCvarAS,
g_pCvarSaveStats, g_pCvarBotRP, g_pCvarBotBuy;
Handle g_hDetourTestMeleeSwingCollision = null, g_hDetourTrySwing = null/*, g_hDetourIsInvulnerable = null*/,
/*g_hDetourAmmoMaxCarry = null, */g_hDetourScriptAllowDamage = null;
Handle g_pfnOnSwingStart = null, g_pfnOnPummelEnded = null, g_pfnEndCharge = null, g_pfnOnCarryEnded = null, g_pfnIsInvulnerable = null, g_pfnCreateGift = null;
GlobalForward g_fwOnUpdateStatus, g_fwOnGiveHealth, g_fwOnGiveAmmo, g_fwOnGiveArmor, g_fwOnGivePoints, g_fwOnGiveEquipment, g_fwOnSkillLearn, g_fwOnSkillForget,
g_fwOnFreeze, g_fwOnGiftPickup, g_fwOnLottery, g_fwOnRoundEvent, g_fwOnAngrySkill, g_fwOnAngryPoint;
ConVar g_pCvarInCombat, g_pCvarSneaking, g_pCvarInBattlefield;
public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
{
g_bLateLoad = late;
RegPluginLibrary("l4d2_dlc2_levelup");
// void LV_GiveHealth(int client, int amount, bool limited, bool convertable)
CreateNative("LV_GiveHealth", Native_AddHealth);
// void LV_GiveAmmo(int client, int amount, int limited)
CreateNative("LV_GiveAmmo", Native_AddAmmo);
// void LV_GiveArmor(int client, int amount, bool helmet)
CreateNative("LV_GiveArmor", Native_AddArmor);
// void LV_GivePoints(int client, int amount)
CreateNative("LV_GivePoints", Native_GiveSkillPoints);
// int LV_GetPoints(int client)
CreateNative("LV_GetPoints", Native_GetSkillPoints);
// int LV_GiveEquipment(int client, int parts)
CreateNative("LV_GiveEquipment", Native_GiveEquipment);
// void LV_GenerateRandom(int client, int capable)
CreateNative("LV_GenerateRandom", Native_GenerateRandomStatus);
// bool LV_SaveToFile(int client, bool checkpoint)
CreateNative("LV_SaveToFile", Native_SaveToFile);
// bool LV_LoadFromFile(int client, bool checkpoint)
CreateNative("LV_LoadFromFile", Native_LoadFromFile);
// bool LV_GetSkill(int client, int level, int skill)
CreateNative("LV_GetSkill", Native_GetSkill);
// void LV_GiveSkill(int client, int level, int skill)
CreateNative("LV_GiveSkill", Native_GiveSkill);
// void LV_RemoveSkill(int client, int level, int skill)
CreateNative("LV_RemoveSkill", Native_RemoveSkill);
// int LV_GetEffects(int client, int effect)
CreateNative("LV_GetEffects", Native_GetEffects);
// int LV_GetPower(int client)
CreateNative("LV_GetPower", Native_GetPower);
// int LV_GetAvgPower(int team, bool avg, bool aliveOnly, bool hunamOnly)
CreateNative("LV_GetAvgPower", Native_GetAvgPower);
// void LV_GetAttrs(int client, int& damage, int& health, int& speed, int& gravity, int& crit, bool withSkill)
CreateNative("LV_GetAttrs", Native_GetAttrs);
// int LV_GetAngrySkill(int client)
CreateNative("LV_GetAngrySkill", Native_GetAngrySkill);
// void LV_SetAngrySkill(int client, int skill)
CreateNative("LV_SetAngrySkill", Native_SetAngrySkill);
// int LV_GetAngryPoints(int client)
CreateNative("LV_GetAngryPoints", Native_GetAngryPoints);
// void LV_SetAngryPoints(int client, int amount)
CreateNative("LV_GiveAngryPoints", Native_GiveAngryPoints);
// int LV_GetRoundEvent()
CreateNative("LV_GetRoundEvent", Native_GetRoundEvent);
// void LV_SetRoundEvent(int event)
CreateNative("LV_SetRoundEvent", Native_SetRoundEvent);
// void LV_FreezePlayer(int client, float duration)
CreateNative("LV_Freeze", Native_FreezePlayer);
// void LV_GetTempHealth(int client)
CreateNative("LV_GetTempHealth", Native_GetTempHealth);
// int LV_GetCurrentAttacker(int client)
CreateNative("LV_GetCurrentAttacker", Native_GetCurrentAttacker);
// int LV_GetCurrentVictim(int client)
CreateNative("LV_GetCurrentVictim", Native_GetCurrentVictim);
// int LV_GetArmor(int client)
CreateNative("LV_GetArmor", Native_GetArmor);
// int LV_GetAmmo(int client)
CreateNative("LV_GetAmmo", Native_GetAmmo);
// void LV_GetEquipment(int client, int[] results, int size_results)
CreateNative("LV_GetEquipment", Native_GetEquipment);
// void LV_TriggerAngry(int client, int mode)
CreateNative("LV_TriggerAngry", Native_TriggerAngry);
// void LV_TriggerGift(int client, int mode)
CreateNative("LV_TriggerGift", Native_TriggerGift);
// void LV_TriggerLottery(int client, int mode)
CreateNative("LV_TriggerLottery", Native_TriggerLottery);
// float LV_GetFreezeTimer(int client)
CreateNative("LV_GetFreezeTimer", Native_GetFreezeTimer);
// void LV_SetFreezeTimer(int client, float time)
CreateNative("LV_SetFreezeTimer", Native_SetFreezeTimer);
// bool LV_IsSneaking(int client)
CreateNative("LV_IsSneaking", Native_IsSneaking);
// bool LV_IsInCombat(int client)
CreateNative("LV_IsInCombat", Native_IsInCombat);
// bool LV_IsInBattleField(int client)
CreateNative("LV_IsInBattleField", Native_IsInBattleField);
// Action LV_OnUpdateStatus(int client, bool& heal, int& damage, int& health, int& speed, int& gravity, int& critChance, int& critDamageMin, int& critDamageMax, int[] effects, int num_effects)
g_fwOnUpdateStatus = CreateGlobalForward("LV_OnUpdateStatus", ET_Hook, Param_Cell, Param_CellByRef, Param_CellByRef, Param_CellByRef, Param_CellByRef, Param_CellByRef, Param_CellByRef, Param_CellByRef, Param_CellByRef, Param_Array, Param_Cell);
// Action LV_OnGiveHealth(int client, int& amount, bool& limited, bool& convertable)
g_fwOnGiveHealth = CreateGlobalForward("LV_OnGiveHealth", ET_Hook, Param_Cell, Param_CellByRef, Param_CellByRef, Param_CellByRef);
// Action LV_OnGiveAmmo(int client, int& amount, int& limited)
g_fwOnGiveAmmo = CreateGlobalForward("LV_OnGiveAmmo", ET_Hook, Param_Cell, Param_CellByRef, Param_CellByRef);
// Action LV_OnGiveAmmo(int client, int& amount, bool& helmet)
g_fwOnGiveArmor = CreateGlobalForward("LV_OnGiveArmor", ET_Hook, Param_Cell, Param_CellByRef, Param_CellByRef);
// Action LV_OnGivePoints(int client, int& amount)
g_fwOnGivePoints = CreateGlobalForward("LV_OnGivePoints", ET_Hook, Param_Cell, Param_CellByRef);
// Action LV_OnGiveEquipment(int client, int& parts)
g_fwOnGiveEquipment = CreateGlobalForward("LV_OnGiveEquipment", ET_Hook, Param_Cell, Param_CellByRef);
// Action LV_OnSkillLearn(int client, int& level, int& skill, bool& free)
g_fwOnSkillLearn = CreateGlobalForward("LV_OnSkillLearn", ET_Hook, Param_Cell, Param_CellByRef, Param_CellByRef, Param_CellByRef);
// Action LV_OnSkillForget(int client, int& level, int& skill)
g_fwOnSkillForget = CreateGlobalForward("LV_OnSkillForget", ET_Hook, Param_Cell, Param_CellByRef, Param_CellByRef);
// Action LV_OnSkillForget(int client, float& duration)
g_fwOnFreeze = CreateGlobalForward("LV_OnFreeze", ET_Hook, Param_Cell, Param_CellByRef);
// Action LV_OnGift(int client, int& reward)
g_fwOnGiftPickup = CreateGlobalForward("LV_OnGift", ET_Hook, Param_Cell, Param_CellByRef);
// Action LV_OnLottery(int client, int& reward)
g_fwOnLottery = CreateGlobalForward("LV_OnLottery", ET_Hook, Param_Cell, Param_CellByRef);
// Action LV_OnRoundEvent(int& event)
g_fwOnRoundEvent = CreateGlobalForward("LV_OnRoundEvent", ET_Hook, Param_CellByRef);
// Action LV_OnArgryTrigger(int client, int& mode)
g_fwOnAngrySkill = CreateGlobalForward("LV_OnArgryTrigger", ET_Hook, Param_Cell, Param_CellByRef);
// Action LV_OnGiveArgryPoints(int client, int& amount)
g_fwOnAngryPoint = CreateGlobalForward("LV_OnGiveArgryPoints", ET_Hook, Param_Cell, Param_CellByRef);
MarkNativeAsOptional("Lethal_SetAllowedClient");
MarkNativeAsOptional("Protector_SetAllowedClient");
MarkNativeAsOptional("Robot_SetAllowedClient");
MarkNativeAsOptional("IncapWeapon_SetAllowedClient");
MarkNativeAsOptional("SelfHelp_SetAllowedClient");
MarkNativeAsOptional("PrototypeGrenade_SetAllowedClient");
MarkNativeAsOptional("ThrowMelee_SetAllowedClient");
return APLRes_Success;
}
bool g_bHaveLethal = false, g_bHaveProtector = false, g_bHaveRobot = false, g_bHaveIncapWeapon = false,
g_bHaveWeaponHandling = false, g_bHaveSelfHelp = false, g_bHaveGrenades = false, g_bHaveMelee = false,
g_bHaveDamageHook = false;
// 这几个暂时没有 inc 文件
native bool Lethal_SetAllowedClient(int client, bool enable);
native bool Protector_SetAllowedClient(int client, bool enable);
native bool Robot_SetAllowedClient(int client, bool enable);
native bool IncapWeapon_SetAllowedClient(int client, bool enable);
native bool SelfHelp_SetAllowedClient(int client, bool enable);
native bool PrototypeGrenade_SetAllowedClient(int client, bool enable);
native bool ThrowMelee_SetAllowedClient(int client, bool enable);
public void OnAllPluginsLoaded()
{
g_bHaveLethal = LibraryExists("lethal_helpers");
g_bHaveProtector = LibraryExists("protector_helpers");
g_bHaveRobot = LibraryExists("robot_helpers");
g_bHaveIncapWeapon = LibraryExists("incapweapon_helpers");
g_bHaveWeaponHandling = LibraryExists("WeaponHandling");
g_bHaveSelfHelp = LibraryExists("self_help_includes");
g_bHaveGrenades = LibraryExists("prototype_grenades_includes");
g_bHaveMelee = LibraryExists("throwmelee_helpers");
}
public void OnLibraryAdded(const char[] libary)
{
if(!strcmp(libary, "lethal_helpers"))
g_bHaveLethal = true;
else if(!strcmp(libary, "protector_helpers"))
g_bHaveProtector = true;
else if(!strcmp(libary, "robot_helpers"))
g_bHaveRobot = true;
else if(!strcmp(libary, "incapweapon_helpers"))
g_bHaveIncapWeapon = true;
else if(!strcmp(libary, "WeaponHandling"))
g_bHaveWeaponHandling = true;
else if(!strcmp(libary, "self_help_includes"))
g_bHaveSelfHelp = true;
else if(!strcmp(libary, "prototype_grenades_includes"))
g_bHaveGrenades = true;
else if(!strcmp(libary, "throwmelee_helpers"))
g_bHaveMelee = true;
}
public void OnLibraryRemoved(const char[] libary)
{
if(!strcmp(libary, "lethal_helpers"))
g_bHaveLethal = false;
else if(!strcmp(libary, "protector_helpers"))
g_bHaveProtector = false;
else if(!strcmp(libary, "robot_helpers"))
g_bHaveRobot = false;
else if(!strcmp(libary, "incapweapon_helpers"))
g_bHaveIncapWeapon = false;
else if(!strcmp(libary, "WeaponHandling"))
g_bHaveWeaponHandling = false;
else if(!strcmp(libary, "self_help_includes"))
g_bHaveSelfHelp = false;
else if(!strcmp(libary, "prototype_grenades_includes"))
g_bHaveGrenades = false;
else if(!strcmp(libary, "throwmelee_helpers"))
g_bHaveMelee = false;
}
public void OnPluginStart()
{
g_pCvarAllow = CreateConVar("lv_enable", "1", "是否开启插件(的各种提示),并不影响技能和属性生效", FCVAR_NONE, true, 0.0, true, 1.0);
g_Cvarautomenu = CreateConVar("lv_automenu", "1", "是否在需要时候自动弹出天赋菜单", FCVAR_NONE, true, 0.0, true, 1.0);
g_pCvarKickSteamId = CreateConVar("lv_autokick", "0", "是否禁止 SteamID 不正确的玩家加入", FCVAR_NONE, true, 0.0, true, 1.0);
g_pCvarRP = CreateConVar("lv_enable_rp", "1", "是否开启人品功能", FCVAR_NONE, true, 0.0, true, 1.0);
g_pCvarRE = CreateConVar("lv_enable_re", "1", "是否开启天启功能", FCVAR_NONE, true, 0.0, true, 1.0);
g_pCvarAS = CreateConVar("lv_enable_as", "1", "是否开启怒气技功能", FCVAR_NONE, true, 0.0, true, 1.0);
g_Cvarhppack = CreateConVar("lv_hppack", "0", "是否开启开局自动回血", FCVAR_NONE, true, 0.0, true, 1.0);
g_pCvarSaveStats = CreateConVar("lv_save_stats", "0", "保存奖励计数(进度)", FCVAR_NONE, true, 0.0, true, 1.0);
g_pCvarEquipment = CreateConVar("lv_enable_eq", "1", "是否开启装备功能", FCVAR_NONE, true, 0.0, true, 1.0);
g_pCvarSurvivorBot = CreateConVar("lv_survivor_bot", "0", "为生还者机器人生存随机属性.0=禁用.1/2/4/8/16=技能.32/64/128/256=装备.262144=怒气技(或许)\n512/1024/2048/4096=满级装备.8192/16384/32768/65536/131702=满级技能.524288=怒气技(必然)", FCVAR_NONE, true, 0.0, true, 1048575.0);
g_pCvarInfectedBot = CreateConVar("lv_infected_bot", "0", "为感染者机器人生存随机属性.0=禁用.1/2/4/8/16=技能.32/64/128/256=装备.262144=怒气技(或许)\n512/1024/2048/4096=满级装备.8192/16384/32768/65536/131702=满级技能.524288=怒气技(必然)", FCVAR_NONE, true, 0.0, true, 1048575.0);
g_CvarSoundLevel = CreateConVar("lv_sound_level", "items/suitchargeok1.wav", "天赋技能选单声音文件途径");
cv_particle = CreateConVar("lv_portals_particle", "electrical_arc_01_system", "存读点特效", FCVAR_NONE);
cv_sndPortalERROR = CreateConVar("lv_portals_sounderror","buttons/blip2.wav", "存点声音文件途径", FCVAR_NONE);
cv_sndPortalFX = CreateConVar("lv_portals_soundfx","ui/pickup_misc42.wav", "读点声音文件途径", FCVAR_NONE);
g_pCvarValidity = CreateConVar("lv_save_validity","86400", "存档有效期(秒),过期重置.0=无限", FCVAR_NONE, true, 0.0);
g_pCvarGiftChance = CreateConVar("lv_gift_chance","1", "特感死亡掉落礼物几率(1~100)", FCVAR_NONE, true, 0.0, true, 100.0);
g_pCvarStartPoints = CreateConVar("lv_starter_points","3", "初始硬币数量", FCVAR_NONE, true, 0.0, true, 30.0);
g_pCvarReimburse = CreateConVar("lv_expired_reimburse","1750", "存档过期重置补偿率(补偿硬币=先前战斗力/补偿率).0=禁用", FCVAR_NONE, true, 0.0);
g_pCvarBotRP = CreateConVar("lv_bot_rp","15", "机器人开门时触发人品事件的几率(1~100)", FCVAR_NONE, true, 0.0, true, 100.0);
g_pCvarBotBuy = CreateConVar("lv_bot_buy","30", "机器人开门时触发购物的几率(1~100)", FCVAR_NONE, true, 0.0, true, 100.0);
g_pCvarGiveEquipment = CreateConVar("lv_give_eq", "3000", "获得装备所需最小战斗力,低于该值无法随机获得(开箱除外)", FCVAR_NONE, true, 0.0);
g_pCvarCommonKilled = CreateConVar("lv_bonus_common_kill", "150", "干掉多少普感奖励一硬币.0=禁用", FCVAR_NONE, true, 0.0);
g_pCvarDefibUsed = CreateConVar("lv_bonus_defib_used", "6", "治疗/电击多少次队友奖励一硬币.0=禁用", FCVAR_NONE, true, 0.0);
g_pCvarGivePills = CreateConVar("lv_bonus_give_pills", "20", "给队友递药/针多少次奖励一硬币.0=禁用", FCVAR_NONE, true, 0.0);
g_pCvarOtherRevived = CreateConVar("lv_bonus_revive", "15", "救起队友多少次奖励一硬币.0=禁用", FCVAR_NONE, true, 0.0);
g_pCvarProtected = CreateConVar("lv_bonus_protect", "40", "保护队友多少次奖励一硬币.0=禁用", FCVAR_NONE, true, 0.0);
g_pCvarSpecialKilled = CreateConVar("lv_bonus_special_kill", "30", "干掉多少特感奖励一硬币.0=禁用", FCVAR_NONE, true, 0.0);
g_pCvarCleared = CreateConVar("lv_bonus_cleared", "10", "清理多少个区域奖励一硬币.0=禁用", FCVAR_NONE, true, 0.0);
g_pCvarPaincEvent = CreateConVar("lv_bonus_painc_event", "10", "守住多波个尸潮奖励一硬币.0=禁用", FCVAR_NONE, true, 0.0);
g_pCvarRescued = CreateConVar("lv_bonus_rescue", "30", "救援队友多少次奖励一硬币.0=禁用", FCVAR_NONE, true, 0.0);
g_pCvarTankDeath = CreateConVar("lv_bonus_tank", "1", "是否开启Tank死亡奖励.0=禁用.1=启用", FCVAR_NONE, true, 0.0, true, 1.0);
g_pCvarRoundEnd = CreateConVar("lv_bonus_end", "1", "是否开启生还者过关奖励.0=禁用.1=启用进门奖励.2=启用全队奖励.3=启用全部奖励", FCVAR_NONE, true, 0.0, true, 3.0);
g_pCvarEventFlow = CreateConVar("lv_event_flows", "-1.0", "在路程达进度到多少时触发天启事件.-1=禁用.0~100=路程百分比", FCVAR_NONE, true, -1.0, true, 100.0);
g_pCvarTankHealth = CreateConVar("lv_tank_health", "0", "基于生还者平均战斗力的Tank血量加成(倍率)", FCVAR_NONE, true, 0.0);
g_pCvarSpecialHealth = CreateConVar("lv_special_health", "0", "基于生还者平均战斗力的特感血量加成(倍率)", FCVAR_NONE, true, 0.0);
AutoExecConfig(true, "l4d2_dlc2_levelup");
g_iNextPAttO = FindSendPropInfo("CBaseCombatWeapon","m_flNextPrimaryAttack");
g_iShotStartDurO = FindSendPropInfo("CBaseShotgun","m_reloadStartDuration");
g_iShotInsertDurO = FindSendPropInfo("CBaseShotgun","m_reloadInsertDuration");
g_iShotEndDurO = FindSendPropInfo("CBaseShotgun","m_reloadEndDuration");
g_iPlayRateO = FindSendPropInfo("CBaseCombatWeapon","m_flPlaybackRate");
g_iShotRelStateO = FindSendPropInfo("CBaseShotgun","m_reloadState");
g_iNextAttO = FindSendPropInfo("CTerrorPlayer","m_flNextAttack");
g_iTimeIdleO = FindSendPropInfo("CTerrorGun","m_flTimeWeaponIdle");
g_iVMStartTimeO = FindSendPropInfo("CTerrorViewModel","m_flLayerStartTime");
g_iActiveWO = FindSendPropInfo("CBaseCombatCharacter","m_hActiveWeapon");
g_iViewModelO = FindSendPropInfo("CTerrorPlayer","m_hViewModel");
g_iVelocityO = FindSendPropInfo("CBasePlayer", "m_vecVelocity[0]");
// g_iBileTimestamp = FindSendPropInfo("CTerrorPlayer", "m_itTimer") + 8;
g_hCvarGodMode = FindConVar("god");
// g_hCvarInfinite = FindConVar("sv_infinite_ammo");
g_hCvarInfinite = FindConVar("sv_infinite_primary_ammo");
g_hCvarBurnNormal = FindConVar("survivor_burn_factor_normal");
g_hCvarBurnHard = FindConVar("survivor_burn_factor_hard");
g_hCvarBurnExpert = FindConVar("survivor_burn_factor_expert");
g_hCvarReviveHealth = FindConVar("survivor_revive_health");
g_hCvarZombieSpeed = FindConVar("z_speed");
g_hCvarLimpHealth = FindConVar("survivor_limp_health");
g_hCvarDuckSpeed = FindConVar("survivor_crouch_speed");
g_hCvarMedicalTime = FindConVar("first_aid_kit_use_duration");
g_hCvarReviveTime = FindConVar("survivor_revive_duration");
g_hCvarGravity = FindConVar("sv_gravity");
g_hCvarShovRange = FindConVar("z_gun_range");
g_hCvarShovTime = FindConVar("z_gun_swing_interval");
g_hCvarMeleeRange = FindConVar("melee_range");
g_hCvarAdrenTime = FindConVar("adrenaline_duration");
g_hCvarDefibTime = FindConVar("defibrillator_use_duration");
g_hCvarZombieHealth = FindConVar("z_health");
g_hCvarIncapCount = FindConVar("survivor_max_incapacitated_count");
g_hCvarPaincEvent = FindConVar("director_panic_forever");
g_hCvarLimitSpecial = FindConVar("z_max_player_zombies");
g_hCvarLimitSmoker = FindConVar("z_smoker_limit");
g_hCvarLimitBoomer = FindConVar("z_boomer_limit");
g_hCvarLimitHunter = FindConVar("z_hunter_limit");
g_hCvarLimitSpitter = FindConVar("z_spitter_limit");
g_hCvarLimitJockey = FindConVar("z_jockey_limit");
g_hCvarLimitCharger = FindConVar("z_charger_limit");
g_hCvarAccele = FindConVar("sv_airaccelerate");
g_hCvarCollide = FindConVar("sv_bounce");
g_hCvarVelocity = FindConVar("sv_maxvelocity");
g_hCvarFirstAidMaxHeal = FindConVar("first_aid_kit_max_heal");
g_hCvarPainPillsMaxHeal = FindConVar("pain_pills_health_threshold");
g_hCvarIncapCrawling = FindConVar("survivor_allow_crawling");
g_hCvarChargerShove = FindConVar("z_charger_allow_shove");
g_pCvarInCombat = CreateConVar("lv_concept_incombat", "", "");
g_pCvarSneaking = CreateConVar("lv_concept_sneaking", "", "");
g_pCvarInBattlefield = CreateConVar("lv_concept_inbattlefield", "", "");
g_pCvarInCombat.AddChangeHook(ConVarChaged_Concept);
g_pCvarSneaking.AddChangeHook(ConVarChaged_Concept);
g_pCvarInBattlefield.AddChangeHook(ConVarChaged_Concept);
HookConVarChange(g_hCvarZombieHealth, ConVarChaged_ZombieHealth);
g_iCommonHealth = g_hCvarZombieHealth.IntValue;
// g_WeaponClipSize = new StringMap();
// g_WeaponDamage = new StringMap();
// g_aDoorHandled = CreateArray();
BuildPath(Path_SM, g_szSavePath, sizeof(g_szSavePath), "data/l4d2_dlc2_levelup");
RegConsoleCmd("sm_lv", Command_Levelup, "", FCVAR_HIDDEN);
// RegConsoleCmd("sm_rpg", Command_Levelup, "", FCVAR_HIDDEN);
RegConsoleCmd("sm_perks", Command_Levelup, "", FCVAR_HIDDEN);
RegConsoleCmd("sm_skills", Command_Levelup, "", FCVAR_HIDDEN);
RegConsoleCmd("sm_skill", Command_Levelup, "", FCVAR_HIDDEN);
RegConsoleCmd("sm_shop", Command_Shop, "", FCVAR_HIDDEN);
RegConsoleCmd("sm_buy", Command_Shop, "", FCVAR_HIDDEN);
RegConsoleCmd("sm_b", Command_Shop, "", FCVAR_HIDDEN);
RegConsoleCmd("sm_rp", Command_RandEvent, "", FCVAR_HIDDEN);
RegConsoleCmd("sm_ldw", Command_RandEvent, "", FCVAR_HIDDEN);
// RegConsoleCmd("sm_cd", Command_SavePoint, "", FCVAR_HIDDEN);
// RegConsoleCmd("sm_dd", Command_LoadPoint, "", FCVAR_HIDDEN);
// RegConsoleCmd("sm_ld", Command_BackPoint, "", FCVAR_HIDDEN);
RegAdminCmd("sm_botbuy", Command_BotBuy, ADMFLAG_CHEATS);
RegAdminCmd("sm_botrp", Command_BotRP, ADMFLAG_CHEATS);
// AddCommandListener(Command_Say, "say");
// AddCommandListener(Command_Say, "say_team");
AddCommandListener(Command_Give, "give");
AddCommandListener(Command_Away, "go_away_from_keyboard");
// AddCommandListener(Command_Scripted, "scripted_user_func");
HookEvent("pills_used", Event_PillsUsed);
HookEvent("adrenaline_used", Event_AdrenalineUsed);
HookEvent("heal_success", Event_HealSuccess);
HookEvent("player_spawn", Event_PlayerSpawn);
HookEvent("player_entered_start_area", Event_PlayerEnterStartArea);
HookEvent("player_first_spawn", Event_PlayerSpawn);
// HookEvent("player_first_spawn", Event_PlayerSpawnNotify);
HookEvent("bot_player_replace", Event_PlayerReplaceBot);
HookEvent("player_bot_replace", Event_BotReplacePlayer);
HookEvent("player_incapacitated", Event_PlayerIncapacitated);
HookEvent("player_incapacitated_start", Event_PlayerIncapacitatedStart);
HookEvent("player_death", Event_PlayerDeath);
HookEvent("infected_death", Event_InfectedDeath);
HookEvent("tank_killed", Event_TankKilled);
HookEvent("player_hurt", Event_PlayerHurt);
HookEvent("player_team", Event_PlayerTeam);
HookEvent("infected_hurt", Event_InfectedHurt);
HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
HookEvent("defibrillator_used", Event_DefibrillatorUsed);
HookEvent("revive_success", Event_ReviveSuccess);
HookEvent("weapon_reload", Event_WeaponReload);
HookEvent("weapon_fire", Event_WeaponFire);
HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
HookEvent("map_transition", Event_RoundEnd, EventHookMode_PostNoCopy);
HookEvent("mission_lost", Event_RoundEnd, EventHookMode_PostNoCopy);
HookEvent("round_start_pre_entity", Event_RoundEnd, EventHookMode_PostNoCopy);
HookEvent("round_start_post_nav", Event_RoundEnd, EventHookMode_PostNoCopy);
HookEvent("finale_vehicle_leaving", Event_RoundEnd, EventHookMode_PostNoCopy);
HookEvent("map_transition", Event_RoundWin, EventHookMode_PostNoCopy);
HookEvent("finale_win", Event_FinaleWin, EventHookMode_PostNoCopy);
HookEvent("finale_vehicle_leaving", Event_FinaleVehicleLeaving);
HookEvent("mission_lost", Event_MissionLost, EventHookMode_PostNoCopy);
HookEvent("player_falldamage", Event_PlayerFallDamage);
HookEvent("award_earned", Event_AwardEarned);
// HookEvent("player_complete_sacrifice", Event_PlayerSacrifice);
HookEvent("scavenge_match_finished", Event_VersusFinish);
HookEvent("versus_match_finished", Event_VersusFinish);
HookEvent("player_jump", Event_PlayerJump);
HookEvent("player_jump_apex", Event_PlayerJumpApex);
HookEvent("door_open", Event_DoorEvent);
HookEvent("door_close", Event_DoorEvent);
HookEvent("all_weapons_out_of_ammo", Event_DoorEvent);
// HookEvent("area_cleared", Event_AreaCleared);
// HookEvent("create_panic_event", Event_PaincEventStart, EventHookMode_PostNoCopy);
// HookEvent("panic_event_finished", Event_PaincEventStop, EventHookMode_PostNoCopy);
HookEvent("survivor_rescued", Event_SurvivorRescued);
HookEvent("weapon_drop", Event_WeaponDropped);
HookEvent("ammo_pickup", Event_AmmoPickup);
HookEvent("ammo_pile_weapon_cant_use_ammo", Event_AmmoPickup);
// HookEvent("weapon_out_of_ammo", Event_AmmoPickup);
// HookEvent("all_weapons_out_of_ammo", Event_AmmoPickup);
// HookEvent("ammo_pack_used_fail_doesnt_use_ammo", Event_AmmoPickup);
// HookEvent("ammo_pack_used_fail_full", Event_AmmoPickup);
HookEvent("item_pickup", Event_WeaponPickuped);
HookEvent("player_use", Event_PlayerUsed);
HookEvent("upgrade_pack_added", Event_UpgradePickup);
// HookEvent("upgrade_incendiary_ammo", Event_UpgradePickup);
// HookEvent("upgrade_explosive_ammo", Event_UpgradePickup);
HookEvent("player_now_it", Event_PlayerHitByVomit);
HookEvent("player_no_longer_it", Event_PlayerVomitTimeout);
HookEvent("player_shoved", Event_PlayerShoved);
HookEvent("entity_shoved", Event_EntityShoved);
HookEvent("bullet_impact", Event_BulletImpact);
HookEvent("christmas_gift_grab", Event_GiftPickup);
HookEvent("player_left_start_area", Event_PlayerLeftStartArea, EventHookMode_PostNoCopy);
HookEvent("survival_round_start", Event_PlayerLeftStartArea, EventHookMode_PostNoCopy);
HookEvent("scavenge_round_start", Event_PlayerLeftStartArea, EventHookMode_PostNoCopy);
HookEvent("player_left_safe_area", Event_PlayerLeftStartArea, EventHookMode_PostNoCopy);
HookEvent("start_holdout", Event_PlayerLeftStartArea, EventHookMode_PostNoCopy);
HookEvent("versus_round_start", Event_PlayerLeftStartArea, EventHookMode_PostNoCopy);
// HookEvent("survival_at_30min", Event_SurvivalAt30Min, EventHookMode_PostNoCopy);
// HookEvent("survival_at_10min", Event_SurvivalAt10Min, EventHookMode_PostNoCopy);
// HookEvent("tongue_grab", Event_PlayerGrabbed);
// HookEvent("lunge_pounce", Event_PlayerGrabbed);
// HookEvent("jockey_ride", Event_PlayerGrabbed);
// HookEvent("charger_pummel_start", Event_PlayerGrabbed);
// HookEvent("charger_carry_start", Event_PlayerGrabbed);
// HookEvent("jockey_ride_end", Event_PlayerReleased);
// HookEvent("charger_pummel_end", Event_PlayerReleased);
// HookEvent("charger_carry_end", Event_PlayerReleased);
// HookEvent("tongue_release", Event_PlayerReleased);
// HookEvent("pounce_stopped", Event_PlayerReleased);
// HookEvent("pounce_end", Event_PlayerReleased);
// HookEvent("player_ledge_grab", Event_PlayerLedgeGrabbed);
// HookEvent("revive_begin", Event_PlayerReviveBegging);