Skip to content

Commit 1a7c544

Browse files
fix(cannot buy),update(cs#),fix(player invalid)
fix(cannot buy): cannot buy after infinite grenades when player join fix(player invalid): player or pawn may be invalid and cause exception. update(cs#): 239 to 242
1 parent b41bef0 commit 1a7c544

12 files changed

+213
-63
lines changed

FunBulletTeleport.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public override void Fun(FunMatchPlugin plugin)
1717
if (Enabled == false) return HookResult.Stop;
1818
Vector Position = new Vector(@event.X,@event.Y,@event.Z);
1919
var oringin = @event.Userid!.OriginalControllerOfCurrentPawn.Get()!;
20+
if (oringin is null) return HookResult.Continue;
2021
var oringinpawn = oringin.PlayerPawn.Get();
2122
if (oringinpawn is null) return HookResult.Continue;
2223
oringinpawn!.Teleport(Position);

FunC4EveryWhere.cs

Lines changed: 156 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,207 @@
11
namespace FunMatchPlugin;
2+
3+
using System.Runtime.InteropServices;
24
using CounterStrikeSharp.API;
35
using CounterStrikeSharp.API.Core;
6+
using CounterStrikeSharp.API.Core.Translations;
47
using CounterStrikeSharp.API.Modules.Cvars;
58
using CounterStrikeSharp.API.Modules.Entities.Constants;
9+
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
610
using CounterStrikeSharp.API.Modules.Timers;
11+
using CounterStrikeSharp.API.Modules.Utils;
712

813
// gameRules not working https://github.com/roflmuffin/CounterStrikeSharp/issues/489
914
public class FunC4EveryWhere : FunBaseClass
1015
{
11-
public override string Decription => "C4 EveryWhere C4大战";
16+
public override string Decription => "C4 EveryWhere 10s to explode C4大战 10s爆炸";
1217
public FunC4EveryWhere(FunMatchPlugin plugin) : base(plugin){}
13-
public CCSGameRules gameRules;
14-
private Timer roundTimer;
18+
public CCSGameRules? gameRules = null;
19+
private Timer? roundTimer = null;
20+
21+
private Timer? roundTimer90 = null;
22+
private Timer? roundTimer60 = null;
23+
private Timer? roundTimer110 = null;
24+
private bool TeamHasWon = false;
25+
private CTeam? Team_CT;
26+
private CTeam? Team_T;
27+
28+
private BasePlugin.GameEventHandler<EventBombPlanted>? EventBombPlantedHandler=null;
29+
private BasePlugin.GameEventHandler<EventPlayerDeath>? EventPlayerDeathHandler=null;
1530
public override void Fun(FunMatchPlugin plugin)
1631
{
1732
Enabled = true;
18-
//ConVar.Find("mp_weapons_allow_heavyassaultsuit").SetValue(true);
33+
ConVar.Find("sv_cheats")!.SetValue(true);
1934
ConVar.Find("mp_autokick")!.SetValue(false);
2035
ConVar.Find("mp_c4timer")!.SetValue(10);
2136
ConVar.Find("mp_plant_c4_anywhere")!.SetValue(true);
2237
ConVar.Find("mp_c4_cannot_be_defused")!.SetValue(true);
2338
ConVar.Find("mp_anyone_can_pickup_c4")!.SetValue(true);
24-
ConVar.Find("mp_ignore_round_win_conditions")!.SetValue(true);
25-
39+
//ConVar.Find("mp_ignore_round_win_conditions")!.SetValue(true);
40+
ConVar.Find("sv_cheats")!.SetValue(false);
41+
42+
var gameRulesProxie = Utilities.FindAllEntitiesByDesignerName<CCSGameRulesProxy>("cs_gamerules");
43+
var CTeamArray = Utilities.FindAllEntitiesByDesignerName<CTeam>("cs_team_manager").ToArray();
44+
gameRules = gameRulesProxie.First().GameRules!;
45+
foreach (var t in CTeamArray)
46+
{
47+
if (t.Teamname == "CT")
48+
Team_CT = t;
49+
if (t.Teamname == "TERRORIST")
50+
Team_T = t;
51+
}
52+
53+
if (gameRules is null || Team_CT is null || Team_T is null)
54+
{
55+
Console.WriteLine("[C4 everywhere] Exception No Gamesrules/Team CTorT Found");
56+
return;
57+
}
58+
2659
var Allplayers = Utilities.GetPlayers();
2760
foreach (var p in Allplayers)
2861
{
62+
if (!p.IsValid) continue;
2963
p.RemoveWeapons();
3064
p.GiveNamedItem(CsItem.C4);
3165
p.GiveNamedItem(CsItem.Knife);
32-
//p.GiveNamedItem(CsItem.Kevlar);
33-
//p.GiveNamedItem(CsItem.KevlarHelmet);
34-
//p.GiveNamedItem<CItemHeavyAssaultSuit>("CItemHeavyAssaultSuit");
35-
//CCSPlayerController player = Utilities.GetPlayerFromUserid(id);
36-
// DesignerName == "cs_gamerules" var gameRules = entity.As<CCSGameRules>(); CCSGameRulesProxy
37-
//var b = p.Buttons; mp_c4timer 20 mp_plant_c4_anywhere true mp_c4_cannot_be_defused true mp_anyone_can_pickup_c4 true
38-
//b.HasFlag(PlayerButtons.Forward); mp_ignore_round_win_conditions 0
66+
p.RemoveAllItemsOnNextRoundReset = true;
3967
}
68+
plugin.RegisterEventHandler<EventBombPlanted> (EventBombPlantedHandler = (@event,info)=>
69+
{
70+
if (Enabled == false) return HookResult.Stop;
71+
var player = @event.Userid!.OriginalControllerOfCurrentPawn.Get();
72+
if (player is null || !player.IsValid) return HookResult.Continue;
73+
player.GiveNamedItem(CsItem.C4);
74+
return HookResult.Continue;
75+
});
4076

41-
roundTimer = plugin.AddTimer(30, ()=>CTWin() , TimerFlags.STOP_ON_MAPCHANGE);
77+
if(gameRules.WarmupPeriod) return;
4278

43-
plugin.RegisterEventHandler<EventPlayerDeath> ((@event,info)=>
79+
roundTimer = plugin.AddTimer(120, ()=>CTWin() , TimerFlags.STOP_ON_MAPCHANGE);
80+
roundTimer60 = plugin.AddTimer(60, ()=>Server.PrintToChatAll(StringExtensions.ReplaceColorTags("{RED}") + "[C4 Everywhere] 60s Left 剩余60s") , TimerFlags.STOP_ON_MAPCHANGE);
81+
roundTimer90 = plugin.AddTimer(90, ()=>Server.PrintToChatAll(StringExtensions.ReplaceColorTags("{RED}") + "[C4 Everywhere] 30s Left 剩余30s") , TimerFlags.STOP_ON_MAPCHANGE);
82+
roundTimer110 = plugin.AddTimer(110, ()=>Server.PrintToChatAll(StringExtensions.ReplaceColorTags("{RED}") + "[C4 Everywhere] 10s Left 剩余10s") , TimerFlags.STOP_ON_MAPCHANGE);
83+
84+
plugin.RegisterEventHandler<EventPlayerDeath> (EventPlayerDeathHandler = (@event,info)=>
4485
{
45-
var entities = Utilities.FindAllEntitiesByDesignerName<CBaseEntity>("cs_gamerules").ToArray();
46-
foreach (var e in entities.Where(x => x.DesignerName == "cs_gamerules"))
86+
if (Enabled == false) return HookResult.Stop;
87+
if (TeamHasWon == true) return HookResult.Stop;
88+
int ct_num = AlivePlayerNum(CsTeam.CounterTerrorist);
89+
int t_num = AlivePlayerNum(CsTeam.Terrorist);
90+
if (@event.Userid is null || !@event.Userid.IsValid) return HookResult.Continue;
91+
if (@event.Userid.Team == CsTeam.CounterTerrorist)
92+
ct_num --;
93+
if (@event.Userid.Team == CsTeam.Terrorist)
94+
t_num --;
95+
if (t_num == 0 && ct_num == 0)
4796
{
48-
gameRules = e.As<CCSGameRules>();
49-
Console.WriteLine($"PlayerKilled {gameRules.AccountCT} {gameRules.AccountTerrorist} {gameRules.NumCT} {gameRules.NumTerrorist}");
50-
Console.WriteLine($"{gameRules.RoundEndFunFactData1} {gameRules.RoundEndReason} {gameRules.RoundEndWinnerTeam}");
51-
//gameRules.TerminateRound(1,RoundEndReason.TerroristsWin);
52-
break;
97+
//gameRules.TerminateRound(3.0f,RoundEndReason.RoundDraw);
98+
TerminateRoundFix(3.0f,RoundEndReason.RoundDraw);
99+
roundTimer!.Kill();
100+
roundTimer60!.Kill();
101+
roundTimer90!.Kill();
102+
roundTimer110!.Kill();
103+
TeamHasWon = true;
104+
var q = @event.Userid.Team;
53105
}
54-
55-
return HookResult.Continue;
56-
});
57-
/*
58-
plugin.RegisterEventHandler<EventRoundFreezeEnd> ((@event,info)=>
59-
{
60-
var entities = Utilities.FindAllEntitiesByDesignerName<CBaseEntity> ("cs_gamerules");
61-
foreach (var e in entities)
106+
else if (t_num == 0)
107+
{
108+
//gameRules.TerminateRound(3.0f,RoundEndReason.CTsWin);
109+
TerminateRoundFix(3.0f,RoundEndReason.TargetBombed);
110+
roundTimer!.Kill();
111+
roundTimer60!.Kill();
112+
roundTimer90!.Kill();
113+
roundTimer110!.Kill();
114+
TeamHasWon = true;
115+
Team_CT!.Score++;
116+
Utilities.SetStateChanged(Team_CT,"CTeam", "m_iScore");
117+
}
118+
else if (ct_num == 0)
62119
{
63-
gameRules = e.As<CCSGameRules>();
64-
break;
120+
//gameRules.TerminateRound(3.0f,RoundEndReason.TerroristsWin);
121+
TerminateRoundFix(3.0f,RoundEndReason.BombDefused);
122+
roundTimer!.Kill();
123+
roundTimer60!.Kill();
124+
roundTimer90!.Kill();
125+
roundTimer110!.Kill();
126+
TeamHasWon = true;
127+
Team_T!.Score++;
128+
Utilities.SetStateChanged(Team_T,"CTeam", "m_iScore");
65129
}
66-
Console.WriteLine($"FreezeEnd {gameRules.AccountCT} {gameRules.AccountTerrorist} {gameRules.NumCT} {gameRules.NumTerrorist}");
67-
//roundTimer = plugin.AddTimer(30, ()=>CTWin() , TimerFlags.STOP_ON_MAPCHANGE);
68-
return HookResult.Stop;
130+
return HookResult.Continue;
69131
});
70-
*/
132+
71133
}
72134
private void CTWin()
73135
{
74-
var csEntities = Utilities.FindAllEntitiesByDesignerName<CBaseEntity>("cs_").ToArray();
75-
foreach (var entity in csEntities.Where(x => x.DesignerName == "cs_gamerules"))
136+
//gameRules!.TerminateRound(0.1f,RoundEndReason.CTsWin);
137+
//gameRules!.RoundWinStatus = 8;
138+
//gameRules!.TotalRoundsPlayed++;
139+
//gameRules!.ITotalRoundsPlayed++;
140+
TerminateRoundFix(3.0f,RoundEndReason.CTsWin);
141+
roundTimer!.Kill();
142+
roundTimer60!.Kill();
143+
roundTimer90!.Kill();
144+
roundTimer110!.Kill();
145+
TeamHasWon = true;
146+
Team_CT!.Score++;
147+
Utilities.SetStateChanged(Team_CT,"CTeam", "m_iScore");
148+
149+
}
150+
151+
private int AlivePlayerNum(CsTeam csTeam)
152+
{
153+
int players = 0;
154+
foreach (var player in Utilities.GetPlayers().Where(player => player.IsValid && player.Connected == PlayerConnectedState.PlayerConnected && player.PawnIsAlive))
76155
{
77-
// gameRules not working https://github.com/roflmuffin/CounterStrikeSharp/issues/489
78-
var gameRules = entity.As<CCSGameRules>();
79-
gameRules.CTTimeOutActive = true;
80-
gameRules.TerminateRound(0,RoundEndReason.CTsWin);
156+
if (player.Team == csTeam)
157+
players++;
81158
}
82-
ConVar.Find("mp_ignore_round_win_conditions")!.SetValue(false);
83-
Console.WriteLine("CTWIN");
84-
}
159+
return players;
160+
}
161+
85162
public override void EndFun(FunMatchPlugin plugin)
86163
{
87164
Enabled = false;
165+
ConVar.Find("sv_cheats")!.SetValue(true);
88166
ConVar.Find("mp_autokick")!.SetValue(true);
89167
ConVar.Find("mp_c4timer")!.SetValue(40);
90168
ConVar.Find("mp_plant_c4_anywhere")!.SetValue(false);
91169
ConVar.Find("mp_c4_cannot_be_defused")!.SetValue(false);
92170
ConVar.Find("mp_anyone_can_pickup_c4")!.SetValue(false);
93171
ConVar.Find("mp_ignore_round_win_conditions")!.SetValue(false);
94-
//roundTimer.Kill();
172+
ConVar.Find("sv_cheats")!.SetValue(false);
173+
if (roundTimer is not null)
174+
roundTimer!.Kill();
175+
if (roundTimer60 is not null)
176+
roundTimer60!.Kill();
177+
if (roundTimer90 is not null)
178+
roundTimer90!.Kill();
179+
if (roundTimer110 is not null)
180+
roundTimer110!.Kill();
181+
TeamHasWon = false;
182+
if (EventBombPlantedHandler is not null)
183+
plugin.DeregisterEventHandler(EventBombPlantedHandler);
184+
if (EventPlayerDeathHandler is not null)
185+
plugin.DeregisterEventHandler(EventPlayerDeathHandler);
186+
187+
}
188+
189+
// to be fixed in https://github.com/roflmuffin/CounterStrikeSharp/issues/489
190+
public void TerminateRoundFix(float delay, RoundEndReason roundEndReason)
191+
{
192+
if (gameRules is null) return;
193+
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
194+
TerminateRound(gameRules!.Handle,delay, roundEndReason, 0, 0);
195+
else
196+
TerminateRoundLinux(gameRules!.Handle, roundEndReason, 0, 0, delay);
197+
95198
}
199+
public static MemoryFunctionVoid<nint, float, RoundEndReason, nint, uint> TerminateRoundFunc =
200+
new(GameData.GetSignature("CCSGameRules_TerminateRound"));
201+
public static Action<IntPtr, float, RoundEndReason, nint, uint> TerminateRound = TerminateRoundFunc.Invoke;
202+
public static MemoryFunctionVoid<nint, RoundEndReason, nint, uint, float> TerminateRoundLinuxFunc =
203+
new(GameData.GetSignature("CCSGameRules_TerminateRound"));
204+
public static Action<IntPtr, RoundEndReason, nint, uint, float> TerminateRoundLinux = TerminateRoundLinuxFunc.Invoke;
205+
96206
}
97207

FunHealTeammates.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,10 @@ public override void Fun(FunMatchPlugin plugin)
8080

8181
if (Enabled == false) return HookResult.Stop;
8282
Timer ?playerTimer;
83-
CCSPlayerPawn ?pawn = @event.Userid!.OriginalControllerOfCurrentPawn.Get()!.PlayerPawn.Get();
83+
if (!@event.Userid!.IsValid) return HookResult.Continue;
84+
var oringin = @event.Userid!.OriginalControllerOfCurrentPawn.Get()!;
85+
if (oringin is null) return HookResult.Continue;
86+
CCSPlayerPawn ?pawn = oringin.PlayerPawn.Get();
8487
if (pawn is null) return HookResult.Continue;
8588
playerTimer = plugin.AddTimer(BurnAfterSecond,() => BurnPlayer(pawn!),TimerFlags.REPEAT);
8689
playerTimersDict.TryAdd((int)@event.Userid.UserId!,playerTimer);
@@ -92,6 +95,7 @@ public override void Fun(FunMatchPlugin plugin)
9295

9396
if (Enabled == false) return HookResult.Stop;
9497
Timer ?playerTimer;
98+
if (!@event.Userid!.IsValid) return HookResult.Continue;
9599
playerTimersDict.TryGetValue((int)@event.Userid!.UserId!,out playerTimer);
96100
if (playerTimer is null) return HookResult.Continue;
97101
playerTimer.Kill();

FunHealthRaid.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,11 @@ public override void EndFun(FunMatchPlugin plugin)
2121
plugin.DeregisterEventHandler(EventPlayerHurtHandler!);
2222
foreach (var p in Allplayers)
2323
{
24-
CCSPlayerPawn? pawn = p.OriginalControllerOfCurrentPawn.Get()!.PlayerPawn.Get();
24+
var oringin = p!.OriginalControllerOfCurrentPawn.Get()!;
25+
if (oringin is null) continue;
26+
CCSPlayerPawn ?pawn = oringin.PlayerPawn.Get();
27+
if (pawn is null) continue;
28+
if (!pawn!.IsValid) continue;
2529
pawn!.MaxHealth = 100;
2630
pawn!.Health = 100;
2731
Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iMaxHealth");
@@ -36,7 +40,11 @@ public override void Fun(FunMatchPlugin plugin)
3640
var Allplayers = Utilities.GetPlayers();
3741
foreach (var p in Allplayers)
3842
{
39-
CCSPlayerPawn? pawn = p.OriginalControllerOfCurrentPawn.Get()!.PlayerPawn.Get();
43+
var oringin = p!.OriginalControllerOfCurrentPawn.Get()!;
44+
if (oringin is null) continue;
45+
CCSPlayerPawn ?pawn = oringin.PlayerPawn.Get();
46+
if (pawn is null) continue;
47+
if (!pawn!.IsValid) continue;
4048
p.GiveNamedItem(CsItem.Kevlar);
4149
p.GiveNamedItem(CsItem.KevlarHelmet);
4250
pawn!.MaxHealth = initHP;

FunHighHP.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ public override void Fun(FunMatchPlugin plugin)
1818
Allplayers = Utilities.GetPlayers();
1919
foreach (var p in Allplayers)
2020
{
21-
CCSPlayerPawn? pawn = p.PlayerPawn.Get();
21+
var oringin = p!.OriginalControllerOfCurrentPawn.Get()!;
22+
if (oringin is null) continue;
23+
CCSPlayerPawn ?pawn = oringin.PlayerPawn.Get();
24+
if (pawn is null) continue;
25+
if (!pawn!.IsValid) continue;
2226
p.GiveNamedItem(CsItem.Kevlar);
2327
p.GiveNamedItem(CsItem.KevlarHelmet);
2428
pawn!.MaxHealth = maxHP;
@@ -34,7 +38,11 @@ public override void EndFun(FunMatchPlugin plugin)
3438
Allplayers = Utilities.GetPlayers();
3539
foreach (var p in Allplayers)
3640
{
37-
CCSPlayerPawn? pawn = p.OriginalControllerOfCurrentPawn.Get()!.PlayerPawn.Get();
41+
var oringin = p!.OriginalControllerOfCurrentPawn.Get()!;
42+
if (oringin is null) continue;
43+
CCSPlayerPawn ?pawn = oringin.PlayerPawn.Get();
44+
if (pawn is null) continue;
45+
if (!pawn!.IsValid) continue;
3846
pawn!.MaxHealth = 100;
3947
pawn!.Health = 100;
4048
pawn!.ArmorValue = 100;

FunInfiniteGrenade.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public override void Fun(FunMatchPlugin plugin)
1717
if (Enabled) return;
1818
Enabled = true;
1919
//ConVar.Find("mp_weapons_allow_heavyassaultsuit").SetValue(true);
20+
ConVar.Find("sv_cheats")!.SetValue(true);
2021
ConVar.Find("mp_autokick")!.SetValue(false);
2122
ConVar.Find("sv_infinite_ammo")!.SetValue(1);
2223
ConVar.Find("ammo_grenade_limit_total")!.SetValue(10);
@@ -25,10 +26,12 @@ public override void Fun(FunMatchPlugin plugin)
2526
ConVar.Find("mp_weapons_allow_pistols")!.SetValue(0);
2627
ConVar.Find("mp_weapons_allow_smgs")!.SetValue(0);
2728
ConVar.Find("mp_weapons_allow_heavy")!.SetValue(0);
29+
ConVar.Find("sv_cheats")!.SetValue(false);
2830
var Allplayers = Utilities.GetPlayers();
2931
bool BombHasGiven = false;
3032
foreach (var p in Allplayers)
3133
{
34+
if (!p.IsValid) continue;
3235
p.RemoveWeapons();
3336
p.GiveNamedItem(CsItem.HE);
3437
p.GiveNamedItem(CsItem.Knife);
@@ -44,6 +47,7 @@ public override void Fun(FunMatchPlugin plugin)
4447
public override void EndFun(FunMatchPlugin plugin)
4548
{
4649
Enabled = false;
50+
ConVar.Find("sv_cheats")!.SetValue(true);
4751
ConVar.Find("mp_autokick")!.SetValue(true);
4852
ConVar.Find("sv_infinite_ammo")!.SetValue(0);
4953
ConVar.Find("ammo_grenade_limit_total")!.SetValue(5);
@@ -52,6 +56,7 @@ public override void EndFun(FunMatchPlugin plugin)
5256
ConVar.Find("mp_weapons_allow_pistols")!.SetValue(-1);
5357
ConVar.Find("mp_weapons_allow_smgs")!.SetValue(-1);
5458
ConVar.Find("mp_weapons_allow_heavy")!.SetValue(-1);
59+
ConVar.Find("sv_cheats")!.SetValue(false);
5560
Server.PrintToChatAll(StringExtensions.ReplaceColorTags("{RED}") + "[FunMatchPlugin] " + "If U Cannot Buy guns,Reconnect 如果手雷结束后买不了枪 请重新连接服务器");
5661
}
5762
}

FunJumpOrDie.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ public override void Fun(FunMatchPlugin plugin)
5454

5555
if (Enabled == false) return HookResult.Stop;
5656
playerTimer ?playerTimer = new();
57+
if (!@event.Userid!.IsValid) return HookResult.Continue;
5758
playerTimersDict.TryGetValue((int)@event.Userid!.UserId!,out playerTimer);
5859
if (playerTimer is null) return HookResult.Continue;
5960
if (playerTimer.timer is not null) playerTimer.timer.Kill();
@@ -66,7 +67,10 @@ public override void Fun(FunMatchPlugin plugin)
6667

6768
if (Enabled == false) return HookResult.Stop;
6869
playerTimer playerTimer = new();
69-
CCSPlayerPawn ?pawn = @event.Userid!.OriginalControllerOfCurrentPawn.Get()!.PlayerPawn.Get();
70+
if (!@event.Userid!.IsValid) return HookResult.Continue;
71+
var oringin = @event.Userid!.OriginalControllerOfCurrentPawn.Get()!;
72+
if (oringin is null) return HookResult.Continue;
73+
CCSPlayerPawn ?pawn = oringin.PlayerPawn.Get();
7074
if (pawn is null) return HookResult.Continue;
7175
playerTimer.timer = plugin.AddTimer(BurnAfterSecond,() => BurnPlayer(pawn),TimerFlags.REPEAT);
7276
playerTimersDict.TryAdd((int)@event.Userid.UserId!,playerTimer);

0 commit comments

Comments
 (0)