mirror of
https://github.com/MSWS/TTT.git
synced 2025-12-06 22:36:35 -08:00
Compare commits
15 Commits
0.17.0-dev
...
0.18.0-dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4ce453dccd | ||
|
|
31f1403b9b | ||
|
|
d12cfa5eab | ||
|
|
9022416053 | ||
|
|
6524772d4f | ||
|
|
bd8125b7a0 | ||
|
|
695d34c10c | ||
|
|
9d3ecbe7fb | ||
|
|
85dac3622a | ||
|
|
9e4c29e3f7 | ||
|
|
453ba14126 | ||
|
|
91750a1067 | ||
|
|
dd6b8c00fe | ||
|
|
d9ad08aa27 | ||
|
|
35191f23e1 |
@@ -11,7 +11,7 @@ namespace TTT.CS2.Configs;
|
||||
|
||||
public class CS2TaserConfig : IStorage<TaserConfig>, IPluginModule {
|
||||
public static readonly FakeConVar<int> CV_PRICE = new(
|
||||
"css_ttt_shop_taser_price", "Price of the Taser item", 100,
|
||||
"css_ttt_shop_taser_price", "Price of the Taser item", 120,
|
||||
ConVarFlags.FCVAR_NONE, new RangeValidator<int>(0, 10000));
|
||||
|
||||
public static readonly FakeConVar<string> CV_WEAPON = new(
|
||||
|
||||
@@ -6,6 +6,7 @@ using Microsoft.Extensions.DependencyInjection;
|
||||
using TTT.API.Events;
|
||||
using TTT.API.Game;
|
||||
using TTT.API.Player;
|
||||
using TTT.CS2.Extensions;
|
||||
using TTT.Game.Events.Game;
|
||||
using TTT.Game.Events.Player;
|
||||
using TTT.Game.Listeners;
|
||||
@@ -36,8 +37,8 @@ public class LateSpawnListener(IServiceProvider provider)
|
||||
|
||||
Server.NextWorldUpdate(() => {
|
||||
foreach (var player in Utilities.GetPlayers()
|
||||
.Where(p => p.LifeState != (int)LifeState_t.LIFE_ALIVE
|
||||
&& p.Team != CsTeam.Spectator && p.Team != CsTeam.None))
|
||||
.Where(p => p.GetHealth() <= 0 && p.Team != CsTeam.Spectator
|
||||
&& p.Team != CsTeam.None))
|
||||
player.Respawn();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ using TTT.API;
|
||||
using TTT.API.Events;
|
||||
using TTT.API.Game;
|
||||
using TTT.API.Player;
|
||||
using TTT.CS2.Extensions;
|
||||
using TTT.Game.Events.Player;
|
||||
|
||||
namespace TTT.CS2.GameHandlers;
|
||||
@@ -44,7 +45,7 @@ public class TeamChangeHandler(IServiceProvider provider) : IPluginModule {
|
||||
};
|
||||
|
||||
if (games.ActiveGame is not { State: State.IN_PROGRESS }) {
|
||||
if (player != null && player.LifeState != (int)LifeState_t.LIFE_ALIVE)
|
||||
if (player != null && player.GetHealth() <= 0)
|
||||
Server.NextWorldUpdate(player.Respawn);
|
||||
return HookResult.Continue;
|
||||
}
|
||||
@@ -65,8 +66,10 @@ public class TeamChangeHandler(IServiceProvider provider) : IPluginModule {
|
||||
return HookResult.Continue;
|
||||
var apiPlayer = converter.GetPlayer(ev.Userid);
|
||||
|
||||
var playerDeath = new PlayerDeathEvent(apiPlayer);
|
||||
bus.Dispatch(playerDeath);
|
||||
Server.NextWorldUpdate(() => {
|
||||
var playerDeath = new PlayerDeathEvent(apiPlayer);
|
||||
bus.Dispatch(playerDeath);
|
||||
});
|
||||
return HookResult.Continue;
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Commands;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using MAULActainShared.plugin;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using TTT.API;
|
||||
@@ -36,7 +37,7 @@ public class TraitorChatHandler(IServiceProvider provider) : IPluginModule {
|
||||
try {
|
||||
maulService ??= EgoApi.MAUL.Get();
|
||||
if (maulService != null) {
|
||||
maulService.getChatShareService().OnChatShare += OnOnChatShare;
|
||||
maulService.getChatShareService().OnChatShare += OnChatShare;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -48,17 +49,21 @@ public class TraitorChatHandler(IServiceProvider provider) : IPluginModule {
|
||||
|
||||
public void Dispose() {
|
||||
if (maulService != null)
|
||||
maulService.getChatShareService().OnChatShare -= OnOnChatShare;
|
||||
maulService.getChatShareService().OnChatShare -= OnChatShare;
|
||||
}
|
||||
|
||||
public void Start() { }
|
||||
|
||||
private void OnOnChatShare(CCSPlayerController? player, CommandInfo info,
|
||||
private void OnChatShare(CCSPlayerController? player, CommandInfo info,
|
||||
ref bool canceled) {
|
||||
if (player == null) return;
|
||||
if (!info.GetArg(0).Equals("say_team", StringComparison.OrdinalIgnoreCase))
|
||||
return;
|
||||
var result = onSay(player, info);
|
||||
if (result == HookResult.Handled) canceled = true;
|
||||
if (player.Team == CsTeam.CounterTerrorist) return;
|
||||
var result = onSay(player, info);
|
||||
canceled = true;
|
||||
if (result == HookResult.Handled) return;
|
||||
player?.ExecuteClientCommandFromServer("say " + info.ArgString);
|
||||
}
|
||||
|
||||
private HookResult onSay(CCSPlayerController? player,
|
||||
|
||||
@@ -16,11 +16,11 @@ public static class ArmorItemServicesCollection {
|
||||
}
|
||||
|
||||
public class ArmorItem(IServiceProvider provider) : BaseItem(provider) {
|
||||
private readonly ArmorConfig config = provider
|
||||
.GetService<IStorage<ArmorConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new ArmorConfig();
|
||||
private ArmorConfig config
|
||||
=> Provider.GetService<IStorage<ArmorConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new ArmorConfig();
|
||||
|
||||
private readonly IPlayerConverter<CCSPlayerController> converter =
|
||||
provider.GetRequiredService<IPlayerConverter<CCSPlayerController>>();
|
||||
|
||||
@@ -17,11 +17,11 @@ public static class BodyPaintServicesCollection {
|
||||
|
||||
public class BodyPaintItem(IServiceProvider provider)
|
||||
: RoleRestrictedItem<TraitorRole>(provider) {
|
||||
private readonly BodyPaintConfig config = provider
|
||||
.GetService<IStorage<BodyPaintConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new BodyPaintConfig();
|
||||
private BodyPaintConfig config
|
||||
=> Provider.GetService<IStorage<BodyPaintConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new BodyPaintConfig();
|
||||
|
||||
public override string Name => Locale[BodyPaintMsgs.SHOP_ITEM_BODY_PAINT];
|
||||
|
||||
|
||||
@@ -18,11 +18,11 @@ public static class ClusterGrenadeServiceCollection {
|
||||
|
||||
public class ClusterGrenadeItem(IServiceProvider provider)
|
||||
: RoleRestrictedItem<TraitorRole>(provider) {
|
||||
private readonly ClusterGrenadeConfig config = provider
|
||||
.GetService<IStorage<ClusterGrenadeConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new ClusterGrenadeConfig();
|
||||
private ClusterGrenadeConfig config
|
||||
=> Provider.GetService<IStorage<ClusterGrenadeConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new ClusterGrenadeConfig();
|
||||
|
||||
public override string Name
|
||||
=> Locale[ClusterGrenadeMsgs.SHOP_ITEM_CLUSTER_GRENADE];
|
||||
|
||||
@@ -17,8 +17,8 @@ using TTT.API.Storage;
|
||||
namespace TTT.CS2.Items.ClusterGrenade;
|
||||
|
||||
public class ClusterGrenadeListener(IServiceProvider provider) : IPluginModule {
|
||||
private readonly ClusterGrenadeConfig config =
|
||||
provider.GetService<IStorage<ClusterGrenadeConfig>>()
|
||||
private ClusterGrenadeConfig config
|
||||
=> provider.GetService<IStorage<ClusterGrenadeConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new ClusterGrenadeConfig();
|
||||
|
||||
@@ -28,11 +28,11 @@ public class DnaListener(IServiceProvider provider) : BaseListener(provider) {
|
||||
private readonly IBodyTracker bodies =
|
||||
provider.GetRequiredService<IBodyTracker>();
|
||||
|
||||
private readonly DnaScannerConfig config = provider
|
||||
.GetService<IStorage<DnaScannerConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new DnaScannerConfig();
|
||||
private DnaScannerConfig config
|
||||
=> Provider.GetService<IStorage<DnaScannerConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new DnaScannerConfig();
|
||||
|
||||
private readonly Dictionary<string, DateTime> lastMessages = new();
|
||||
private readonly IShop shop = provider.GetRequiredService<IShop>();
|
||||
|
||||
@@ -18,11 +18,11 @@ public static class DnaScannerServiceCollection {
|
||||
|
||||
public class DnaScanner(IServiceProvider provider)
|
||||
: RoleRestrictedItem<DetectiveRole>(provider) {
|
||||
private readonly DnaScannerConfig config = provider
|
||||
.GetService<IStorage<DnaScannerConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new DnaScannerConfig();
|
||||
private DnaScannerConfig config
|
||||
=> Provider.GetService<IStorage<DnaScannerConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new DnaScannerConfig();
|
||||
|
||||
public override string Name => Locale[DnaMsgs.SHOP_ITEM_DNA];
|
||||
public override string Description => Locale[DnaMsgs.SHOP_ITEM_DNA_DESC];
|
||||
|
||||
@@ -18,11 +18,11 @@ public static class OneHitKnifeServiceCollection {
|
||||
|
||||
public class OneHitKnife(IServiceProvider provider)
|
||||
: RoleRestrictedItem<TraitorRole>(provider) {
|
||||
private readonly OneHitKnifeConfig config = provider
|
||||
.GetService<IStorage<OneHitKnifeConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new OneHitKnifeConfig();
|
||||
private OneHitKnifeConfig config
|
||||
=> Provider.GetService<IStorage<OneHitKnifeConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new OneHitKnifeConfig();
|
||||
|
||||
public override string Name
|
||||
=> Locale[OneHitKnifeMsgs.SHOP_ITEM_ONE_HIT_KNIFE];
|
||||
|
||||
@@ -13,8 +13,8 @@ namespace TTT.CS2.Items.OneHitKnife;
|
||||
|
||||
public class OneHitKnifeListener(IServiceProvider provider)
|
||||
: BaseListener(provider) {
|
||||
private readonly OneHitKnifeConfig config =
|
||||
provider.GetService<IStorage<OneHitKnifeConfig>>()
|
||||
private OneHitKnifeConfig config
|
||||
=> Provider.GetService<IStorage<OneHitKnifeConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new OneHitKnifeConfig();
|
||||
|
||||
@@ -18,11 +18,11 @@ public static class PoisonShotServiceCollection {
|
||||
|
||||
public class PoisonShotsItem(IServiceProvider provider)
|
||||
: RoleRestrictedItem<TraitorRole>(provider) {
|
||||
private readonly PoisonShotsConfig config = provider
|
||||
.GetService<IStorage<PoisonShotsConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new PoisonShotsConfig();
|
||||
private PoisonShotsConfig config
|
||||
=> Provider.GetService<IStorage<PoisonShotsConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new PoisonShotsConfig();
|
||||
|
||||
public override string Name => Locale[PoisonShotMsgs.SHOP_ITEM_POISON_SHOTS];
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ public class PoisonShotsListener(IServiceProvider provider)
|
||||
|
||||
private readonly IShop shop = provider.GetRequiredService<IShop>();
|
||||
|
||||
private readonly ISet<string> killedWithPoison = new HashSet<string>();
|
||||
private readonly Dictionary<string, IPlayer> killedWithPoison = new();
|
||||
|
||||
public override void Dispose() {
|
||||
base.Dispose();
|
||||
@@ -118,7 +118,7 @@ public class PoisonShotsListener(IServiceProvider provider)
|
||||
if (dmgEvent.IsCanceled) return true;
|
||||
|
||||
if (online.Health - config.PoisonConfig.DamagePerTick <= 0) {
|
||||
killedWithPoison.Add(online.Id);
|
||||
killedWithPoison[online.Id] = effect.Shooter;
|
||||
var deathEvent = new PlayerDeathEvent(online)
|
||||
.WithKiller(effect.Shooter as IOnlinePlayer)
|
||||
.WithWeapon($"[{Locale[PoisonShotMsgs.SHOP_ITEM_POISON_SHOTS]}]");
|
||||
@@ -167,8 +167,10 @@ public class PoisonShotsListener(IServiceProvider provider)
|
||||
[UsedImplicitly]
|
||||
[EventHandler]
|
||||
public void OnRagdollSpawn(BodyCreateEvent ev) {
|
||||
if (!killedWithPoison.Contains(ev.Body.OfPlayer.Id)) return;
|
||||
if (ev.Body.Killer == null || ev.Body.Killer.Id == ev.Body.OfPlayer.Id)
|
||||
ev.IsCanceled = true;
|
||||
if (!killedWithPoison.TryGetValue(ev.Body.OfPlayer.Id, out var shooter))
|
||||
return;
|
||||
if (ev.Body.Killer != null && ev.Body.Killer.Id != ev.Body.OfPlayer.Id)
|
||||
return;
|
||||
ev.Body.Killer = shooter as IOnlinePlayer;
|
||||
}
|
||||
}
|
||||
@@ -18,8 +18,8 @@ public static class PoisonSmokeServiceCollection {
|
||||
|
||||
public class PoisonSmokeItem(IServiceProvider provider)
|
||||
: RoleRestrictedItem<TraitorRole>(provider) {
|
||||
private readonly PoisonSmokeConfig config =
|
||||
provider.GetService<IStorage<PoisonSmokeConfig>>()
|
||||
private PoisonSmokeConfig config
|
||||
=> Provider.GetService<IStorage<PoisonSmokeConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new PoisonSmokeConfig();
|
||||
|
||||
@@ -25,8 +25,8 @@ namespace TTT.CS2.Items.PoisonSmoke;
|
||||
|
||||
public class PoisonSmokeListener(IServiceProvider provider)
|
||||
: BaseListener(provider), IPluginModule {
|
||||
private readonly PoisonSmokeConfig config =
|
||||
provider.GetService<IStorage<PoisonSmokeConfig>>()
|
||||
private PoisonSmokeConfig config
|
||||
=> Provider.GetService<IStorage<PoisonSmokeConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new PoisonSmokeConfig();
|
||||
|
||||
@@ -24,8 +24,8 @@ public static class SilentAWPServiceCollection {
|
||||
|
||||
public class SilentAWPItem(IServiceProvider provider)
|
||||
: RoleRestrictedItem<TraitorRole>(provider), IPluginModule {
|
||||
private readonly SilentAWPConfig config =
|
||||
provider.GetService<IStorage<SilentAWPConfig>>()
|
||||
private SilentAWPConfig config
|
||||
=> Provider.GetService<IStorage<SilentAWPConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new SilentAWPConfig();
|
||||
|
||||
@@ -46,7 +46,8 @@ public class DamageStation(IServiceProvider provider)
|
||||
public override string Description
|
||||
=> Locale[StationMsgs.SHOP_ITEM_STATION_HURT_DESC];
|
||||
|
||||
private readonly ISet<string> killedWithStation = new HashSet<string>();
|
||||
private Dictionary<string, StationInfo> killedWithStation =
|
||||
new Dictionary<string, StationInfo>();
|
||||
|
||||
override protected void onInterval() {
|
||||
var players = finder.GetOnline();
|
||||
@@ -88,7 +89,7 @@ public class DamageStation(IServiceProvider provider)
|
||||
damageAmount = -dmgEvent.DmgDealt;
|
||||
|
||||
if (player.Health + damageAmount <= 0) {
|
||||
killedWithStation.Add(player.Id);
|
||||
killedWithStation[player.Id] = info;
|
||||
var playerDeath = new PlayerDeathEvent(player)
|
||||
.WithKiller(info.Owner as IOnlinePlayer)
|
||||
.WithWeapon($"[{Name}]");
|
||||
@@ -116,8 +117,11 @@ public class DamageStation(IServiceProvider provider)
|
||||
[UsedImplicitly]
|
||||
[EventHandler]
|
||||
public void OnRagdollSpawn(BodyCreateEvent ev) {
|
||||
if (!killedWithStation.Contains(ev.Body.OfPlayer.Id)) return;
|
||||
if (ev.Body.Killer == null || ev.Body.Killer.Id == ev.Body.OfPlayer.Id)
|
||||
ev.IsCanceled = true;
|
||||
if (!killedWithStation.TryGetValue(ev.Body.OfPlayer.Id,
|
||||
out var stationInfo))
|
||||
return;
|
||||
if (ev.Body.Killer != null && ev.Body.Killer.Id != ev.Body.OfPlayer.Id)
|
||||
return;
|
||||
ev.Body.Killer = stationInfo.Owner as IOnlinePlayer;
|
||||
}
|
||||
}
|
||||
@@ -15,8 +15,8 @@ using TTT.Karma.lang;
|
||||
namespace TTT.CS2.Listeners;
|
||||
|
||||
public class KarmaBanner(IServiceProvider provider) : BaseListener(provider) {
|
||||
private readonly KarmaConfig config =
|
||||
provider.GetService<IStorage<KarmaConfig>>()
|
||||
private KarmaConfig config
|
||||
=> Provider.GetService<IStorage<KarmaConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new KarmaConfig();
|
||||
|
||||
@@ -45,7 +45,7 @@ public class RoundTimerListener(IServiceProvider provider)
|
||||
.TotalSeconds);
|
||||
Server.ExecuteCommand("mp_ignore_round_win_conditions 1");
|
||||
foreach (var player in Utilities.GetPlayers()
|
||||
.Where(p => p.LifeState != (int)LifeState_t.LIFE_ALIVE && p is {
|
||||
.Where(p => p.GetHealth() <= 0 && p is {
|
||||
Team: CsTeam.CounterTerrorist or CsTeam.Terrorist
|
||||
}))
|
||||
player.Respawn();
|
||||
@@ -60,7 +60,7 @@ public class RoundTimerListener(IServiceProvider provider)
|
||||
if (ev.NewState == State.IN_PROGRESS)
|
||||
Server.NextWorldUpdate(() => {
|
||||
foreach (var player in Utilities.GetPlayers()
|
||||
.Where(p => p.LifeState != (int)LifeState_t.LIFE_ALIVE && p is {
|
||||
.Where(p => p.GetHealth() <= 0 && p is {
|
||||
Team: CsTeam.CounterTerrorist or CsTeam.Terrorist
|
||||
}))
|
||||
player.Respawn();
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Core.Attributes.Registration;
|
||||
using JetBrains.Annotations;
|
||||
using TTT.API;
|
||||
using TTT.CS2.API;
|
||||
|
||||
@@ -52,6 +54,14 @@ public class CS2AliveSpoofer : IAliveSpoofer, IPluginModule {
|
||||
onTick);
|
||||
}
|
||||
|
||||
[UsedImplicitly]
|
||||
[GameEventHandler]
|
||||
public HookResult OnDisconnect(EventPlayerDisconnect ev) {
|
||||
if (ev.Userid == null) return HookResult.Continue;
|
||||
_fakeAlivePlayers.Remove(ev.Userid);
|
||||
return HookResult.Continue;
|
||||
}
|
||||
|
||||
private void onTick() {
|
||||
_fakeAlivePlayers.RemoveWhere(p => !p.IsValid || p.Handle == IntPtr.Zero);
|
||||
foreach (var player in _fakeAlivePlayers) {
|
||||
|
||||
@@ -21,25 +21,6 @@ public class DamageDealingHelper {
|
||||
|
||||
var damageInfo = new CTakeDamageInfo(infoPtr);
|
||||
|
||||
// var attackerInfo = new CAttackerInfo() {
|
||||
// AttackerUserId =
|
||||
// attacker != null && attacker.UserId != null ?
|
||||
// (ushort)attacker.UserId :
|
||||
// unchecked((ushort)(-1)),
|
||||
// AttackerPawn = attacker != null ? attacker.Pawn.Raw : 0,
|
||||
// NeedInit = false,
|
||||
// TeamNum =
|
||||
// attacker != null && attacker.Pawn.Value != null ?
|
||||
// attacker.Pawn.Value.TeamNum :
|
||||
// 0,
|
||||
// TeamChecked = 0,
|
||||
// IsWorld = attacker == null,
|
||||
// IsPawn = attacker != null,
|
||||
// };
|
||||
|
||||
// Marshal.StructureToPtr(attackerInfo, new IntPtr(infoPtr.ToInt64() + 0x80),
|
||||
// false);
|
||||
|
||||
Schema.SetSchemaValue(damageInfo.Handle, "CTakeDamageInfo", "m_hInflictor",
|
||||
attacker != null ? attacker.Pawn.Raw : 0);
|
||||
Schema.SetSchemaValue(damageInfo.Handle, "CTakeDamageInfo", "m_hAttacker",
|
||||
|
||||
@@ -48,9 +48,9 @@ public record KarmaConfig {
|
||||
/// <summary>
|
||||
/// Amount of karma a player will gain at the end of each round.
|
||||
/// </summary>
|
||||
public int KarmaPerRound { get; init; } = 3;
|
||||
public int KarmaPerRound { get; init; } = 1;
|
||||
|
||||
public int KarmaPerRoundWin { get; init; } = 5;
|
||||
public int KarmaPerRoundWin { get; init; } = 2;
|
||||
|
||||
public int INNO_ON_TRAITOR { get; init; } = 5;
|
||||
public int TRAITOR_ON_DETECTIVE { get; init; } = 1;
|
||||
|
||||
@@ -19,8 +19,11 @@ public sealed class KarmaStorage(IServiceProvider provider) : IKarmaService {
|
||||
private const bool EnableCache = true;
|
||||
private readonly IEventBus _bus = provider.GetRequiredService<IEventBus>();
|
||||
|
||||
private readonly IStorage<KarmaConfig>? _configStorage =
|
||||
provider.GetService<IStorage<KarmaConfig>>();
|
||||
private KarmaConfig _configStorage
|
||||
=> provider.GetService<IStorage<KarmaConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new KarmaConfig();
|
||||
|
||||
private readonly SemaphoreSlim _flushGate = new(1, 1);
|
||||
|
||||
@@ -38,12 +41,6 @@ public sealed class KarmaStorage(IServiceProvider provider) : IKarmaService {
|
||||
public string Version => GitVersionInformation.FullSemVer;
|
||||
|
||||
public void Start() {
|
||||
// Load configuration first
|
||||
if (_configStorage is not null)
|
||||
// Synchronously wait here since IKarmaService.Start is sync
|
||||
_config = _configStorage.Load().GetAwaiter().GetResult()
|
||||
?? new KarmaConfig();
|
||||
|
||||
// Open a dedicated connection used only by this service
|
||||
_connection = new SqliteConnection(_config.DbString);
|
||||
_connection.Open();
|
||||
|
||||
@@ -18,11 +18,11 @@ public static class StickerExtensions {
|
||||
|
||||
public class Stickers(IServiceProvider provider)
|
||||
: RoleRestrictedItem<DetectiveRole>(provider) {
|
||||
private readonly StickersConfig config = provider
|
||||
.GetService<IStorage<StickersConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new StickersConfig();
|
||||
private StickersConfig config
|
||||
=> Provider.GetService<IStorage<StickersConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new StickersConfig();
|
||||
|
||||
public override string Name => Locale[StickerMsgs.SHOP_ITEM_STICKERS];
|
||||
|
||||
|
||||
@@ -15,8 +15,8 @@ public static class HealthshotServiceCollection {
|
||||
}
|
||||
|
||||
public class HealthshotItem(IServiceProvider provider) : BaseItem(provider) {
|
||||
private readonly HealthshotConfig config =
|
||||
provider.GetService<IStorage<HealthshotConfig>>()
|
||||
private HealthshotConfig config
|
||||
=> Provider.GetService<IStorage<HealthshotConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new HealthshotConfig();
|
||||
|
||||
@@ -17,11 +17,11 @@ public static class DeagleServiceCollection {
|
||||
|
||||
public class OneShotDeagleItem(IServiceProvider provider)
|
||||
: BaseItem(provider), IWeapon {
|
||||
private readonly OneShotDeagleConfig deagleConfigStorage = provider
|
||||
.GetService<IStorage<OneShotDeagleConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new OneShotDeagleConfig();
|
||||
private OneShotDeagleConfig deagleConfigStorage
|
||||
=> Provider.GetService<IStorage<OneShotDeagleConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new OneShotDeagleConfig();
|
||||
|
||||
public override string Name => Locale[DeagleMsgs.SHOP_ITEM_DEAGLE];
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ public class GlovesListener(IServiceProvider provider)
|
||||
private readonly Dictionary<IPlayer, int> uses = new();
|
||||
|
||||
[UsedImplicitly]
|
||||
[EventHandler]
|
||||
[EventHandler(Priority = Priority.LOW)]
|
||||
public void BodyCreate(BodyCreateEvent ev) {
|
||||
if (ev.Body.Killer == null || !useGloves(ev.Body.Killer)) return;
|
||||
if (ev.Body.Killer is not IOnlinePlayer online) return;
|
||||
|
||||
@@ -17,8 +17,8 @@ public class RoleAssignCreditor(IServiceProvider provider)
|
||||
provider.GetService<IStorage<ShopConfig>>()?.Load().GetAwaiter().GetResult()
|
||||
?? new ShopConfig(provider);
|
||||
|
||||
private readonly KarmaConfig karmaConfig =
|
||||
provider.GetService<IStorage<KarmaConfig>>()
|
||||
private KarmaConfig karmaConfig
|
||||
=> Provider.GetService<IStorage<KarmaConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new KarmaConfig();
|
||||
@@ -50,8 +50,8 @@ public class RoleAssignCreditor(IServiceProvider provider)
|
||||
}
|
||||
|
||||
private float getKarmaScale(float percent) {
|
||||
if (percent >= 0.9) return 1.1f;
|
||||
if (percent >= 0.8f) return 1;
|
||||
if (percent >= 0.9) return 1;
|
||||
if (percent >= 0.8f) return 0.9f;
|
||||
if (percent >= 0.5) return 0.8f;
|
||||
if (percent >= 0.3) return 0.5f;
|
||||
return 0.25f;
|
||||
|
||||
@@ -11,11 +11,11 @@ using TTT.API.Storage;
|
||||
namespace TTT.Shop;
|
||||
|
||||
public class PeriodicRewarder(IServiceProvider provider) : ITerrorModule {
|
||||
private readonly ShopConfig config = provider
|
||||
.GetService<IStorage<ShopConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new ShopConfig(provider);
|
||||
private ShopConfig config
|
||||
=> provider.GetService<IStorage<ShopConfig>>()
|
||||
?.Load()
|
||||
.GetAwaiter()
|
||||
.GetResult() ?? new ShopConfig(provider);
|
||||
|
||||
private readonly IPlayerFinder finder =
|
||||
provider.GetRequiredService<IPlayerFinder>();
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
namespace ShopAPI.Configs;
|
||||
|
||||
public record OneShotDeagleConfig : ShopItemConfig {
|
||||
public override int Price { get; init; } = 100;
|
||||
public override int Price { get; init; } = 125;
|
||||
public bool DoesFriendlyFire { get; init; } = true;
|
||||
public bool KillShooterOnFF { get; init; } = false;
|
||||
public string Weapon { get; init; } = "revolver";
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
namespace ShopAPI.Configs.Traitor;
|
||||
|
||||
public record GlovesConfig : ShopItemConfig {
|
||||
public override int Price { get; init; } = 50;
|
||||
public int MaxUses { get; init; } = 3;
|
||||
public override int Price { get; init; } = 40;
|
||||
public int MaxUses { get; init; } = 5;
|
||||
}
|
||||
Reference in New Issue
Block a user