Skip to content

Commit

Permalink
Merge pull request #46 from e54385991/0.19-improve-playerload
Browse files Browse the repository at this point in the history
0.19 improve playerload
  • Loading branch information
schwarper committed May 27, 2024
2 parents 5f2af1c + 07f7653 commit 33b4570
Show file tree
Hide file tree
Showing 2 changed files with 169 additions and 113 deletions.
164 changes: 91 additions & 73 deletions Store/src/database/database.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using Dapper;
using Microsoft.Extensions.Logging;
using MySqlConnector;
using static Store.Store;
using static StoreApi.Store;
Expand Down Expand Up @@ -108,110 +109,127 @@ SELECT 1 FROM store_items
throw;
}
}


public static async Task LoadPlayer(CCSPlayerController player)
{
Credits.SetOriginal(player, -1);
Credits.Set(player, -1);

try
//Instance.Logger.LogInformation($" LoadPlayer {player.SteamID} ");
async Task LoadDataAsync(int attempt = 1)
{
using MySqlConnection connection = await ConnectAsync();
try
{
using MySqlConnection connection = await ConnectAsync();

SqlMapper.GridReader multiQuery = await connection.QueryMultipleAsync(@"
SqlMapper.GridReader multiQuery = await connection.QueryMultipleAsync(@"
SELECT * FROM store_players WHERE SteamID = @SteamID;
SELECT * FROM store_items WHERE SteamID = @SteamID AND(DateOfExpiration > @Now OR DateOfExpiration = '0001-01-01 00:00:00');
SELECT * FROM " + equipTableName + @" WHERE SteamID = @SteamID"
,
new
{
player.SteamID,
DateTime.Now
});
,
new
{
player.SteamID,
DateTime.Now
});

Store_Player playerData = await multiQuery.ReadFirstOrDefaultAsync<Store_Player>();
Store_Player playerData = await multiQuery.ReadFirstOrDefaultAsync<Store_Player>();

IEnumerable<Store_Item> items = await multiQuery.ReadAsync<Store_Item>();
IEnumerable<Store_Item> items = await multiQuery.ReadAsync<Store_Item>();

IEnumerable<Store_Equipment> equipments = await multiQuery.ReadAsync<Store_Equipment>();
IEnumerable<Store_Equipment> equipments = await multiQuery.ReadAsync<Store_Equipment>();

Server.NextFrame(() =>
{
if (playerData == null)
{
Store_Player newPlayer = new()
{
SteamID = player.SteamID,
PlayerName = player.PlayerName,
Credits = Instance.Config.Credits["start"],
OriginalCredits = Instance.Config.Credits["start"],
DateOfJoin = DateTime.Now,
DateOfLastJoin = DateTime.Now,
bPlayerIsLoaded = true,
};
Instance.GlobalStorePlayers.Add(newPlayer);
InsertNewPlayer(player);
}
else
Server.NextFrame(() =>
{
Store_Player? existingPlayer = Instance.GlobalStorePlayers.FirstOrDefault(p => p.SteamID == playerData.SteamID);
if (existingPlayer != null)
if (playerData == null)
{
existingPlayer.PlayerName = playerData.PlayerName;
existingPlayer.Credits = Convert.ToInt32(playerData.Credits);
existingPlayer.OriginalCredits = existingPlayer.Credits;
existingPlayer.DateOfJoin = playerData.DateOfJoin;
existingPlayer.DateOfLastJoin = playerData.DateOfLastJoin;
existingPlayer.bPlayerIsLoaded = true;
Store_Player newPlayer = new()
{
SteamID = player.SteamID,
PlayerName = player.PlayerName,
Credits = Instance.Config.Credits["start"],
OriginalCredits = Instance.Config.Credits["start"],
DateOfJoin = DateTime.Now,
DateOfLastJoin = DateTime.Now,
bPlayerIsLoaded = true,
};
Instance.GlobalStorePlayers.Add(newPlayer);
InsertNewPlayer(player);
}
else
{
playerData.OriginalCredits = Convert.ToInt32(playerData.Credits);
Store_Player? existingPlayer = Instance.GlobalStorePlayers.FirstOrDefault(p => p.SteamID == playerData.SteamID);
if (existingPlayer != null)
{
existingPlayer.PlayerName = playerData.PlayerName;
existingPlayer.Credits = Convert.ToInt32(playerData.Credits);
existingPlayer.OriginalCredits = existingPlayer.Credits;
existingPlayer.DateOfJoin = playerData.DateOfJoin;
existingPlayer.DateOfLastJoin = playerData.DateOfLastJoin;
existingPlayer.bPlayerIsLoaded = true;
}
else
{
playerData.OriginalCredits = Convert.ToInt32(playerData.Credits);
Instance.GlobalStorePlayers.Add(playerData);
}
Instance.GlobalStorePlayers.Add(playerData);
}
}
foreach (Store_Item newItem in items)
{
Store_Item? existingItem = Instance.GlobalStorePlayerItems.FirstOrDefault(i => i.SteamID == newItem.SteamID && i.UniqueId == newItem.UniqueId && i.Type == newItem.Type);
if (existingItem != null)
foreach (Store_Item newItem in items)
{
existingItem.Price = newItem.Price;
existingItem.DateOfExpiration = newItem.DateOfExpiration;
Store_Item? existingItem = Instance.GlobalStorePlayerItems.FirstOrDefault(i => i.SteamID == newItem.SteamID && i.UniqueId == newItem.UniqueId && i.Type == newItem.Type);
if (existingItem != null)
{
existingItem.Price = newItem.Price;
existingItem.DateOfExpiration = newItem.DateOfExpiration;
}
else
{
Instance.GlobalStorePlayerItems.Add(newItem);
}
}
else
foreach (Store_Equipment newEquipment in equipments)
{
Instance.GlobalStorePlayerItems.Add(newItem);
Store_Equipment? existingEquipment = Instance.GlobalStorePlayerEquipments.FirstOrDefault(e => e.SteamID == newEquipment.SteamID && e.UniqueId == newEquipment.UniqueId);
if (existingEquipment != null)
{
existingEquipment.Type = newEquipment.Type;
existingEquipment.Slot = newEquipment.Slot;
}
else
{
Instance.GlobalStorePlayerEquipments.Add(newEquipment);
}
}
});
}
catch (Exception ex)
{
Instance.Logger.LogError($"Error loading player {player.SteamID} attempt {attempt}: {ex.Message}");
if (attempt < 3)
{
Instance.Logger.LogInformation($"Retrying to load player {player.SteamID} (attempt {attempt + 1})");
await Task.Delay(5000);
await LoadDataAsync(attempt + 1);
}
foreach (Store_Equipment newEquipment in equipments)
else
{
Store_Equipment? existingEquipment = Instance.GlobalStorePlayerEquipments.FirstOrDefault(e => e.SteamID == newEquipment.SteamID && e.UniqueId == newEquipment.UniqueId);
if (existingEquipment != null)
{
existingEquipment.Type = newEquipment.Type;
existingEquipment.Slot = newEquipment.Slot;
}
else
{
Instance.GlobalStorePlayerEquipments.Add(newEquipment);
}
Credits.SetOriginal(player, -1);
Credits.Set(player, -1);
}
});
}
catch (Exception)
{
Credits.SetOriginal(player, -1);
Credits.Set(player, -1);
}
}

await LoadDataAsync();
}


public static void InsertNewPlayer(CCSPlayerController player)
{
ExecuteAsync(@"
Expand Down Expand Up @@ -360,4 +378,4 @@ public static void ResetDatabase()

Server.ExecuteCommand("_restart");
}
}
}
118 changes: 78 additions & 40 deletions Store/src/event/event.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities;
using CounterStrikeSharp.API.Modules.Timers;
using CounterStrikeSharp.API.Modules.Utils;
using static CounterStrikeSharp.API.Core.Listeners;
Expand All @@ -17,6 +18,7 @@ public static void Unload()
Instance.RemoveListener<OnServerPrecacheResources>(OnServerPrecacheResources);
Instance.RemoveListener<OnTick>(OnTick);
Instance.RemoveListener<OnEntityCreated>(OnEntityCreated);
Instance.RemoveListener<OnClientAuthorized>(OnClientAuthorized);
}

public static void Load()
Expand All @@ -26,24 +28,89 @@ public static void Load()
Instance.RegisterListener<OnTick>(OnTick);
Instance.RegisterListener<OnEntityCreated>(OnEntityCreated);


Instance.RegisterEventHandler<EventPlayerConnectFull>(OnPlayerConnectFull);
Instance.RegisterEventHandler<EventPlayerDisconnect>(OnPlayerDisconnect);
Instance.RegisterEventHandler<EventPlayerDeath>(OnPlayerDeath);
Instance.RegisterListener<OnClientAuthorized>(OnClientAuthorized);

Instance.AddTimer(5.0F, () =>
{
StartCreditsTimer();
});
}

public static void StartCreditsTimer()
{
Instance.AddTimer(Instance.Config.Credits["interval_active_inactive"], () =>
{
if (GameRules.IgnoreWarmUp())
{
return;
}
foreach (var player in Utilities.GetPlayers())
{
if (player == null
|| !player.IsValid
|| player.PlayerPawn == null
|| !player.PlayerPawn.IsValid
|| player.PlayerPawn.Value == null
|| player.UserId == null
|| player.IsBot
|| player.IsHLTV)
{
continue;
}
CsTeam team = player.Team;
switch (team)
{
case CsTeam.Terrorist:
case CsTeam.CounterTerrorist:
if (Instance.Config.Credits["amount_active"] > 0)
{
Credits.Give(player, Instance.Config.Credits["amount_active"]);
player.PrintToChatMessage("credits_earned<active>", Instance.Config.Credits["amount_active"]);
}
break;
case CsTeam.Spectator:
if (Instance.Config.Credits["amount_inactive"] > 0)
{
Credits.Give(player, Instance.Config.Credits["amount_inactive"]);
player.PrintToChatMessage("credits_earned<inactive>", Instance.Config.Credits["amount_inactive"]);
}
break;
}
}
}, TimerFlags.REPEAT);
}



public static void OnMapStart(string mapname)
{
Instance.GlobalStoreItemTypes.ForEach((type) =>
{
type.MapStart();
});

Instance.AddTimer(5.0F, () =>
{
GameRules.GlobalGameRules = Utilities.FindAllEntitiesByDesignerName<CCSGameRulesProxy>("cs_gamerules").First().GameRules!;
}, TimerFlags.STOP_ON_MAPCHANGE);

Database.ExecuteAsync("DELETE FROM store_items WHERE DateOfExpiration < NOW() AND DateOfExpiration > '0001-01-01 00:00:00';", null);

List<Store_Item> itemsToRemove = Instance.GlobalStorePlayerItems
.Where(item => item.DateOfExpiration < DateTime.Now && item.DateOfExpiration > DateTime.MinValue)
.ToList();

string store_equipmentTableName = Instance.Config.Settings.TryGetValue("database_equip_table_name", out string? tablename) ? tablename : "store_equipment";


foreach (Store_Item? item in itemsToRemove)
{
Database.ExecuteAsync($"DELETE FROM {store_equipmentTableName} WHERE SteamID == @SteamID AND UniqueId == @UniqueId", new { item.SteamID, item.UniqueId });
Expand Down Expand Up @@ -100,6 +167,17 @@ public static void OnEntityCreated(CEntityInstance entity)
Item_CustomWeapon.OnEntityCreated(entity);
}

private static void OnClientAuthorized(int playerSlot, SteamID steamId)
{
CCSPlayerController? player = Utilities.GetPlayerFromSlot(playerSlot);
if (player == null)
{
return;
}

Task.Run(() => Database.LoadPlayer(player));
}

public static HookResult OnPlayerConnectFull(EventPlayerConnectFull @event, GameEventInfo info)
{
CCSPlayerController? player = @event.Userid;
Expand All @@ -109,51 +187,12 @@ public static HookResult OnPlayerConnectFull(EventPlayerConnectFull @event, Game
return HookResult.Continue;
}

Task.Run(() => Database.LoadPlayer(player));

if (!Instance.GlobalDictionaryPlayer.TryGetValue(player, out Player? value))
{
value = new Player();
Instance.GlobalDictionaryPlayer.Add(player, value);
}

value.CreditIntervalTimer = Instance.AddTimer(Instance.Config.Credits["interval_active_inactive"], () =>
{
if (GameRules.IgnoreWarmUp())
{
return;
}
CsTeam Team = player.Team;
switch (Team)
{
case CsTeam.Terrorist:
case CsTeam.CounterTerrorist:
{
if (Instance.Config.Credits["amount_active"] > 0)
{
Credits.Give(player, Instance.Config.Credits["amount_active"]);
player.PrintToChatMessage("credits_earned<active>", Instance.Config.Credits["amount_active"]);
}
break;
}
case CsTeam.Spectator:
{
if (Instance.Config.Credits["amount_inactive"] > 0)
{
Credits.Give(player, Instance.Config.Credits["amount_inactive"]);
player.PrintToChatMessage("credits_earned<inactive>", Instance.Config.Credits["amount_inactive"]);
}
break;
}
}
}, TimerFlags.REPEAT | TimerFlags.STOP_ON_MAPCHANGE);

return HookResult.Continue;
}

Expand Down Expand Up @@ -181,7 +220,6 @@ public static HookResult OnPlayerDisconnect(EventPlayerDisconnect @event, GameEv

return HookResult.Continue;
}

public static HookResult OnPlayerDeath(EventPlayerDeath @event, GameEventInfo info)
{
if (GameRules.IgnoreWarmUp())
Expand Down

0 comments on commit 33b4570

Please sign in to comment.