Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improved player index #76

Merged
merged 1 commit into from
Nov 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions Commands.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ private void RegisterCommands()
{
AddCommand($"css_{Config.Additional.CommandKill}", "kill yourself", (player, info) =>
{
if (!Utility.IsPlayerValid(player) || !player!.PlayerPawn.IsValid) return;
if (player == null || !Utility.IsPlayerValid(player) || player.PlayerPawn.Value == null || !player!.PlayerPawn.IsValid) return;

player.PlayerPawn.Value.CommitSuicide(true, false);
});
Expand Down Expand Up @@ -60,11 +60,11 @@ private void SetupKnifeMenu()
player!.PrintToChat(Utility.ReplaceTags(temp));
}

g_playersKnife[(int)player!.EntityIndex!.Value.Value] = knifeKey;
g_playersKnife[(int)player!.Index] = knifeKey;

if (player!.PawnIsAlive && g_bCommandsAllowed)
{
g_changedKnife.Add((int)player.EntityIndex!.Value.Value);
//g_changedKnife.Add((int)player.Index);
RefreshWeapons(player);
//RefreshPlayerKnife(player);

Expand All @@ -73,7 +73,7 @@ private void SetupKnifeMenu()
*/
}
if (weaponSync != null)
Task.Run(() => weaponSync.SyncKnifeToDatabase((int)player.EntityIndex!.Value.Value, knifeKey));
Task.Run(() => weaponSync.SyncKnifeToDatabase((int)player.Index, knifeKey));
}
}
};
Expand All @@ -84,7 +84,7 @@ private void SetupKnifeMenu()
AddCommand($"css_{Config.Additional.CommandKnife}", "Knife Menu", (player, info) =>
{
if (!Utility.IsPlayerValid(player) || !g_bCommandsAllowed) return;
int playerIndex = (int)player!.EntityIndex!.Value.Value;
int playerIndex = (int)player!.Index;

if (commandCooldown != null && DateTime.UtcNow >= commandCooldown[playerIndex].AddSeconds(Config.CmdRefreshCooldownSeconds) && playerIndex > 0 && playerIndex < commandCooldown.Length)
{
Expand All @@ -110,7 +110,7 @@ private void SetupSkinsMenu()
{
if (!Utility.IsPlayerValid(player)) return;

int playerIndex = (int)player!.EntityIndex!.Value.Value;
int playerIndex = (int)player!.Index;
string selectedWeapon = option.Text;
if (classNamesByWeapon.TryGetValue(selectedWeapon, out string? selectedWeaponClassname))
{
Expand All @@ -126,9 +126,9 @@ private void SetupSkinsMenu()
// Function to handle skin selection for the chosen weapon
var handleSkinSelection = (CCSPlayerController? p, ChatMenuOption opt) =>
{
if (p == null || !p.IsValid || !p.EntityIndex.HasValue) return;
if (p == null || !p.IsValid || p.Index <= 0) return;

playerIndex = (int)p.EntityIndex.Value.Value;
playerIndex = (int)p.Index;

var steamId = new SteamID(p.SteamID);
var firstSkin = skinsList?.FirstOrDefault(skin =>
Expand Down Expand Up @@ -204,7 +204,7 @@ private void SetupSkinsMenu()
AddCommand($"css_{Config.Additional.CommandSkinSelection}", "Skins selection menu", (player, info) =>
{
if (!Utility.IsPlayerValid(player)) return;
int playerIndex = (int)player!.EntityIndex!.Value.Value;
int playerIndex = (int)player!.Index;

if (commandCooldown != null && DateTime.UtcNow >= commandCooldown[playerIndex].AddSeconds(Config.CmdRefreshCooldownSeconds) && playerIndex > 0 && playerIndex < commandCooldown.Length)
{
Expand All @@ -226,8 +226,8 @@ private void OnCommandRefresh(CCSPlayerController? player, CommandInfo command)
if (!Config.Additional.CommandWpEnabled || !Config.Additional.SkinEnabled || !g_bCommandsAllowed) return;
if (!Utility.IsPlayerValid(player)) return;
string temp = "";
if (!player!.EntityIndex.HasValue) return;
int playerIndex = (int)player!.EntityIndex!.Value.Value;
if (player == null || player.Index <= 0) return;
int playerIndex = (int)player!.Index;
if (playerIndex != 0 && DateTime.UtcNow >= commandCooldown[playerIndex].AddSeconds(Config.CmdRefreshCooldownSeconds))
{
commandCooldown[playerIndex] = DateTime.UtcNow;
Expand Down
33 changes: 18 additions & 15 deletions Events.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,9 +85,9 @@ private void OnClientDisconnect(int playerSlot)
if (player == null || !player.IsValid || player.IsHLTV) return;

if (Config.Additional.KnifeEnabled)
g_playersKnife.Remove((int)player.EntityIndex!.Value.Value);
g_playersKnife.Remove((int)player.Index);
if (Config.Additional.SkinEnabled)
gPlayerWeaponsInfo.Remove((int)player.EntityIndex!.Value.Value);
gPlayerWeaponsInfo.Remove((int)player.Index);
}

private HookResult OnPlayerSpawn(EventPlayerSpawn @event, GameEventInfo info)
Expand All @@ -100,7 +100,7 @@ private HookResult OnPlayerSpawn(EventPlayerSpawn @event, GameEventInfo info)

if (Config.Additional.KnifeEnabled)
{
g_knifePickupCount[(int)player.EntityIndex!.Value.Value] = 0;
g_knifePickupCount[(int)player.Index] = 0;
if (!PlayerHasKnife(player))
GiveKnifeToPlayer(player);
}
Expand Down Expand Up @@ -134,13 +134,13 @@ private HookResult OnItemPickup(EventItemPickup @event, GameEventInfo info)
if (@event.Defindex == 42 || @event.Defindex == 59)
{
CCSPlayerController? player = @event.Userid;
if (!Utility.IsPlayerValid(player) || !player.PawnIsAlive || g_knifePickupCount[(int)player.EntityIndex!.Value.Value] >= 2) return HookResult.Continue;
if (!Utility.IsPlayerValid(player) || !player.PawnIsAlive || g_knifePickupCount[(int)player.Index] >= 2) return HookResult.Continue;

if (g_playersKnife.ContainsKey((int)player.EntityIndex!.Value.Value)
if (g_playersKnife.ContainsKey((int)player.Index)
&&
g_playersKnife[(int)player.EntityIndex!.Value.Value] != "weapon_knife")
g_playersKnife[(int)player.Index] != "weapon_knife")
{
g_knifePickupCount[(int)player.EntityIndex!.Value.Value]++;
g_knifePickupCount[(int)player.Index]++;

RemovePlayerKnife(player, true);
AddTimer(0.3f, ()=> GiveKnifeToPlayer(player));
Expand Down Expand Up @@ -176,29 +176,32 @@ private void OnEntitySpawned(CEntityInstance entity)
{
try
{

if (!weapon.IsValid) return;
if (weapon.OwnerEntity.Value == null) return;
if (!weapon.OwnerEntity.Value.EntityIndex.HasValue)
/*
if (weapon.OwnerEntity.Index > 0)
{
for (int i = 1; i <= Server.MaxPlayers; i++)
{
CCSPlayerController? ghostPlayer = Utilities.GetPlayerFromIndex(i);
if (!Utility.IsPlayerValid(ghostPlayer)) continue;
if (g_changedKnife.Contains((int)ghostPlayer.EntityIndex!.Value.Value))
if (g_changedKnife.Contains((int)ghostPlayer.Index))
{
ChangeWeaponAttributes(weapon, ghostPlayer, isKnife);
g_changedKnife.Remove((int)ghostPlayer.EntityIndex!.Value.Value);
g_changedKnife.Remove((int)ghostPlayer.Index);
break;
}
}
return;

}

if (!weapon.OwnerEntity.Value.EntityIndex.HasValue) return;
int weaponOwner = (int)weapon.OwnerEntity.Value.EntityIndex.Value.Value;
*/
if (weapon.OwnerEntity.Index <= 0) return;
int weaponOwner = (int)weapon.OwnerEntity.Index;
var pawn = new CBasePlayerPawn(NativeAPI.GetEntityFromIndex(weaponOwner));
if (!pawn.IsValid) return;
var playerIndex = (int)pawn.Controller.Value.EntityIndex!.Value.Value;

var playerIndex = (int)pawn.Controller.Index;
var player = Utilities.GetPlayerFromIndex(playerIndex);
if (!Utility.IsPlayerValid(player)) return;

Expand Down
2 changes: 1 addition & 1 deletion Utility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ internal static bool IsPlayerValid(CCSPlayerController? player)

internal static string BuildDatabaseConnectionString()
{
if (Config == null) return String.Empty;
if (Config == null) return string.Empty;
var builder = new MySqlConnectionStringBuilder
{
Server = Config.DatabaseHost,
Expand Down
52 changes: 26 additions & 26 deletions WeaponAction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ public partial class WeaponPaints
{
internal static void ChangeWeaponAttributes(CBasePlayerWeapon? weapon, CCSPlayerController? player, bool isKnife = false)
{
if (weapon == null || !weapon.IsValid || !Utility.IsPlayerValid(player)) return;
if (player == null || weapon == null || !weapon.IsValid || !Utility.IsPlayerValid(player)) return;

int playerIndex = (int)player!.EntityIndex!.Value.Value;
int playerIndex = (int)player.Index;

if (!gPlayerWeaponsInfo.ContainsKey(playerIndex)) return;

Expand Down Expand Up @@ -55,7 +55,7 @@ internal static void ChangeWeaponAttributes(CBasePlayerWeapon? weapon, CCSPlayer
internal static void GiveKnifeToPlayer(CCSPlayerController? player)
{
if (!_config.Additional.KnifeEnabled || player == null || !player.IsValid) return;
if (g_playersKnife.TryGetValue((int)player.EntityIndex!.Value.Value, out var knife))
if (g_playersKnife.TryGetValue((int)player.Index, out var knife))
{
player.GiveNamedItem(knife);
}
Expand All @@ -77,7 +77,7 @@ internal static void GiveKnifeToPlayer(CCSPlayerController? player)
}
internal void RemovePlayerKnife(CCSPlayerController? player, bool force = false)
{
if (player == null || !player.IsValid || !player.PawnIsAlive) return;
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PawnIsAlive) return;
if (player.PlayerPawn.Value.WeaponServices == null || player.PlayerPawn.Value.ItemServices == null) return;

var weapons = player.PlayerPawn.Value.WeaponServices.MyWeapons;
Expand All @@ -88,16 +88,16 @@ internal void RemovePlayerKnife(CCSPlayerController? player, bool force = false)

foreach (var weapon in weapons)
{
if (weapon != null && weapon.IsValid && weapon.Value.IsValid)
if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid)
{
//if (weapon.Value.AttributeManager.Item.ItemDefinitionIndex == 42 || weapon.Value.AttributeManager.Item.ItemDefinitionIndex == 59)
if (weapon.Value.DesignerName.Contains("knife") || weapon.Value.DesignerName.Contains("bayonet"))
{
if (!force)
{
if (!weapon.Value.EntityIndex.HasValue) return;
int weaponEntityIndex = (int)weapon.Value.EntityIndex!.Value.Value;
NativeAPI.IssueClientCommand((int)player.EntityIndex!.Value.Value - 1, "slot3");
if ((int)weapon.Index <= 0) return;
int weaponEntityIndex = (int)weapon.Index;
NativeAPI.IssueClientCommand((int)player.Index - 1, "slot3");
AddTimer(0.35f, () => service.DropActivePlayerWeapon(weapon.Value));

AddTimer(1.0f, () =>
Expand All @@ -123,35 +123,35 @@ internal void RemovePlayerKnife(CCSPlayerController? player, bool force = false)

internal void RefreshPlayerKnife(CCSPlayerController? player)
{
if (player == null || !player.IsValid || !player.PawnIsAlive) return;
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PawnIsAlive) return;
if (player.PlayerPawn.Value.WeaponServices == null || player.PlayerPawn.Value.ItemServices == null) return;

var weapons = player.PlayerPawn.Value.WeaponServices.MyWeapons;
if (weapons != null && weapons.Count > 0)
{
CCSPlayer_ItemServices service = new CCSPlayer_ItemServices(player.PlayerPawn.Value.ItemServices.Handle);
CCSPlayer_ItemServices service = new(player.PlayerPawn.Value.ItemServices.Handle);
//var dropWeapon = VirtualFunction.CreateVoid<nint, nint>(service.Handle, GameData.GetOffset("CCSPlayer_ItemServices_DropActivePlayerWeapon"));

foreach (var weapon in weapons)
{
if (weapon != null && weapon.IsValid && weapon.Value.IsValid)
if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid)
{
//if (weapon.Value.AttributeManager.Item.ItemDefinitionIndex == 42 || weapon.Value.AttributeManager.Item.ItemDefinitionIndex == 59)
if (weapon.Value.DesignerName.Contains("knife") || weapon.Value.DesignerName.Contains("bayonet"))
{
if (!weapon.Value.EntityIndex.HasValue) return;
int weaponEntityIndex = (int)weapon.Value.EntityIndex!.Value.Value;
NativeAPI.IssueClientCommand((int)player.EntityIndex!.Value.Value - 1, "slot3");
if (weapon.Index <= 0) return;
int weaponEntityIndex = (int)weapon.Index;
NativeAPI.IssueClientCommand((int)player.Index - 1, "slot3");
AddTimer(0.22f, () =>
{
if (player.PlayerPawn.Value.WeaponServices.ActiveWeapon.Value.DesignerName.Contains("knife")
if (player.PlayerPawn.Value.WeaponServices.ActiveWeapon.Value!.DesignerName.Contains("knife")
||
player.PlayerPawn.Value.WeaponServices.ActiveWeapon.Value.DesignerName.Contains("bayonet")
player.PlayerPawn.Value.WeaponServices.ActiveWeapon.Value!.DesignerName.Contains("bayonet")
)
{
if (player.PawnIsAlive)
{
NativeAPI.IssueClientCommand((int)player.EntityIndex!.Value.Value - 1, "slot3");
NativeAPI.IssueClientCommand((int)player.Index - 1, "slot3");
service.DropActivePlayerWeapon(weapon.Value);
GiveKnifeToPlayer(player);
}
Expand All @@ -164,7 +164,7 @@ internal void RefreshPlayerKnife(CCSPlayerController? player)
{
CEntityInstance? knife = Utilities.GetEntityFromIndex<CEntityInstance>(weaponEntityIndex);

if (knife != null && knife.IsValid && knife.Handle != -1 && knife.EntityIndex.HasValue)
if (knife != null && knife.IsValid && knife.Handle != -1 && knife.Index > 0)
{
knife.Remove();
}
Expand All @@ -183,14 +183,14 @@ internal void RefreshSkins(CCSPlayerController? player)
{
if (!Utility.IsPlayerValid(player) || !player!.PawnIsAlive) return;

AddTimer(0.18f, () => NativeAPI.IssueClientCommand((int)player.EntityIndex!.Value.Value - 1, "slot3"));
AddTimer(0.25f, () => NativeAPI.IssueClientCommand((int)player.EntityIndex!.Value.Value - 1, "slot2"));
AddTimer(0.38f, () => NativeAPI.IssueClientCommand((int)player.EntityIndex!.Value.Value - 1, "slot1"));
AddTimer(0.18f, () => NativeAPI.IssueClientCommand((int)player.Index - 1, "slot3"));
AddTimer(0.25f, () => NativeAPI.IssueClientCommand((int)player.Index - 1, "slot2"));
AddTimer(0.38f, () => NativeAPI.IssueClientCommand((int)player.Index - 1, "slot1"));
}

internal void RefreshWeapons(CCSPlayerController? player)
{
if (player == null || !player.IsValid || !player.PawnIsAlive) return;
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PawnIsAlive) return;
if (player.PlayerPawn.Value.WeaponServices == null || player.PlayerPawn.Value.ItemServices == null) return;

var weapons = player.PlayerPawn.Value.WeaponServices.MyWeapons;
Expand All @@ -201,9 +201,9 @@ internal void RefreshWeapons(CCSPlayerController? player)

foreach (var weapon in weapons)
{
if (weapon != null && weapon.IsValid && weapon.Value.IsValid)
if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid)
{
if (!weapon.Value.EntityIndex.HasValue || !weapon.Value.DesignerName.Contains("weapon_")) continue;
if (weapon.Index <= 0 || !weapon.Value.DesignerName.Contains("weapon_")) continue;
//if (weapon.Value.AttributeManager.Item.ItemDefinitionIndex == 42 || weapon.Value.AttributeManager.Item.ItemDefinitionIndex == 59)
try
{
Expand Down Expand Up @@ -249,14 +249,14 @@ internal static bool PlayerHasKnife(CCSPlayerController? player)
return false;
}

if (player.PlayerPawn.Value.WeaponServices == null || player.PlayerPawn.Value.ItemServices == null)
if (player.PlayerPawn.Value == null || player.PlayerPawn.Value.WeaponServices == null || player.PlayerPawn.Value.ItemServices == null)
return false;

var weapons = player.PlayerPawn.Value.WeaponServices.MyWeapons;
if (weapons == null || weapons.Count <= 0) return false;
foreach (var weapon in weapons)
{
if (weapon != null && weapon.IsValid && weapon.Value.IsValid)
if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid)
{
if (weapon.Value.DesignerName.Contains("knife") || weapon.Value.DesignerName.Contains("bayonet"))
{
Expand Down
2 changes: 1 addition & 1 deletion WeaponPaints.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig<WeaponPaintsConfig
internal static Dictionary<int, Dictionary<int, WeaponInfo>> gPlayerWeaponsInfo = new Dictionary<int, Dictionary<int, WeaponInfo>>();
internal static Dictionary<int, int> g_knifePickupCount = new Dictionary<int, int>();
internal static Dictionary<int, string> g_playersKnife = new();
internal static List<int> g_changedKnife = new();
//internal static List<int> g_changedKnife = new();
internal bool g_bCommandsAllowed = true;

internal static List<JObject> skinsList = new List<JObject>();
Expand Down
9 changes: 1 addition & 8 deletions WeaponPaints.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,9 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="CounterStrikeSharp.API" Version="1.0.80" />
<PackageReference Include="CounterStrikeSharp.API" Version="1.0.84" />
<PackageReference Include="Dapper" Version="2.1.24" />
<PackageReference Include="MySqlConnector" Version="2.3.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>

<ItemGroup>
<Reference Include="CounterStrikeSharp.API">
<HintPath>deps\CounterStrikeSharp.API.dll</HintPath>
</Reference>
</ItemGroup>

</Project>
4 changes: 2 additions & 2 deletions WeaponSynchronization.cs
Original file line number Diff line number Diff line change
Expand Up @@ -229,9 +229,9 @@ internal async Task GetWeaponPaintsFromDatabase(int playerIndex)

internal async Task SyncWeaponPaintsToDatabase(CCSPlayerController? player)
{
if (!Utility.IsPlayerValid(player)) return;
if (player == null || !Utility.IsPlayerValid(player)) return;

int playerIndex = (int)player!.EntityIndex!.Value.Value;
int playerIndex = (int)player.Index;
string steamId = new SteamID(player.SteamID).SteamId64.ToString();

using var connection = new MySqlConnection(_databaseConnectionString);
Expand Down