Skip to content

Commit

Permalink
Merge branch 'master' into wizmerge
Browse files Browse the repository at this point in the history
  • Loading branch information
sleepyyapril authored Dec 23, 2024
2 parents 4b1e01e + bfb32cf commit 2e038d9
Show file tree
Hide file tree
Showing 10 changed files with 171 additions and 1 deletion.
2 changes: 1 addition & 1 deletion Content.Client/Jittering/JitteringSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ private void OnShutdown(EntityUid uid, JitteringComponent jittering, ComponentSh

private void OnAnimationCompleted(EntityUid uid, JitteringComponent jittering, AnimationCompletedEvent args)
{
if(args.Key != _jitterAnimationKey)
if (args.Key != _jitterAnimationKey || jittering.LifeStage >= ComponentLifeStage.Stopping)
return;

if (TryComp(uid, out AnimationPlayerComponent? animationPlayer)
Expand Down
61 changes: 61 additions & 0 deletions Content.Server/Traits/TraitSystem.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,24 @@
using System.Linq;
using Content.Server.Administration.Logs;
using Content.Server.Administration.Systems;
using Content.Server.Chat.Managers;
using Content.Server.GameTicking;
using Content.Server.Players.PlayTimeTracking;
using Content.Shared.CCVar;
using Content.Shared.Chat;
using Content.Shared.Customization.Systems;
using Content.Shared.Database;
using Content.Shared.Players;
using Content.Shared.Roles;
using Content.Shared.Traits;
using Robust.Server.Player;
using Robust.Shared.Configuration;
using Content.Shared.Whitelist;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Robust.Shared.Serialization.Manager;
using Robust.Shared.Utility;
using Timer = Robust.Shared.Timing.Timer;

namespace Content.Server.Traits;

Expand All @@ -21,6 +30,11 @@ public sealed class TraitSystem : EntitySystem
[Dependency] private readonly PlayTimeTrackingManager _playTimeTracking = default!;
[Dependency] private readonly IConfigurationManager _configuration = default!;
[Dependency] private readonly IComponentFactory _componentFactory = default!;
[Dependency] private readonly IAdminLogManager _adminLog = default!;
[Dependency] private readonly AdminSystem _adminSystem = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly IChatManager _chatManager = default!;

public override void Initialize()
{
Expand All @@ -32,6 +46,9 @@ public override void Initialize()
// When the player is spawned in, add all trait components selected during character creation
private void OnPlayerSpawnComplete(PlayerSpawnCompleteEvent args)
{
var pointsTotal = _configuration.GetCVar(CCVars.GameTraitsDefaultPoints);
var traitSelections = _configuration.GetCVar(CCVars.GameTraitsMax);

foreach (var traitId in args.Profile.TraitPreferences)
{
if (!_prototype.TryIndex<TraitPrototype>(traitId, out var traitPrototype))
Expand All @@ -48,8 +65,15 @@ private void OnPlayerSpawnComplete(PlayerSpawnCompleteEvent args)
out _))
continue;

// To check for cheaters. :FaridaBirb.png:
pointsTotal += traitPrototype.Points;
--traitSelections;

AddTrait(args.Mob, traitPrototype);
}

if (pointsTotal < 0 || traitSelections < 0)
PunishCheater(args.Mob);
}

/// <summary>
Expand All @@ -60,4 +84,41 @@ public void AddTrait(EntityUid uid, TraitPrototype traitPrototype)
foreach (var function in traitPrototype.Functions)
function.OnPlayerSpawn(uid, _componentFactory, EntityManager, _serialization);
}

/// <summary>
/// On a non-cheating client, it's not possible to save a character with a negative number of traits. This can however
/// trigger incorrectly if a character was saved, and then at a later point in time an admin changes the traits Cvars to reduce the points.
/// Or if the points costs of traits is increased.
/// </summary>
private void PunishCheater(EntityUid uid)
{
_adminLog.Add(LogType.AdminMessage, LogImpact.High,
$"{ToPrettyString(uid):entity} attempted to spawn with an invalid trait list. This might be a mistake, or they might be cheating");

if (!_configuration.GetCVar(CCVars.TraitsPunishCheaters)
|| !_playerManager.TryGetSessionByEntity(uid, out var targetPlayer))
return;

// For maximum comedic effect, this is plenty of time for the cheater to get on station and start interacting with people.
var timeToDestroy = _random.NextFloat(120, 360);

Timer.Spawn(TimeSpan.FromSeconds(timeToDestroy), () => VaporizeCheater(targetPlayer));
}

/// <summary>
/// https://www.youtube.com/watch?v=X2QMN0a_TrA
/// </summary>
private void VaporizeCheater (Robust.Shared.Player.ICommonSession targetPlayer)
{
_adminSystem.Erase(targetPlayer);

var feedbackMessage = $"[font size=24][color=#ff0000]{"You have spawned in with an illegal trait point total. If this was a result of cheats, then your nonexistence is a skill issue. Otherwise, feel free to click 'Return To Lobby', and fix your trait selections."}[/color][/font]";
_chatManager.ChatMessageToOne(
ChatChannel.Emotes,
feedbackMessage,
feedbackMessage,
EntityUid.Invalid,
false,
targetPlayer.Channel);
}
}
7 changes: 7 additions & 0 deletions Content.Shared/CCVar/CCVars.cs
Original file line number Diff line number Diff line change
Expand Up @@ -430,6 +430,13 @@ public static readonly CVarDef<bool>
public static readonly CVarDef<int> GameTraitsDefaultPoints =
CVarDef.Create("game.traits_default_points", 10, CVar.REPLICATED);

/// <summary>
/// Whether the game will SMITE people who used cheat engine to spawn with all of the traits.
/// Illegal trait totals will still be logged even if this is disabled.
/// If you are intending to decrease the trait points availability, or modify the costs of traits, consider temporarily disabling this.
/// </summary>
public static readonly CVarDef<bool> TraitsPunishCheaters =
CVarDef.Create("game.traits_punish_cheaters", true, CVar.REPLICATED);

/// <summary>
/// Whether to allow characters to select loadout items.
Expand Down
30 changes: 30 additions & 0 deletions Resources/Changelog/Changelog.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8757,3 +8757,33 @@ Entries:
id: 6587
time: '2024-12-22T10:26:41.0000000+00:00'
url: https://github.com/Simple-Station/Einstein-Engines/pull/1366
- author: juniwoofs
changes:
- type: Add
message: two new cuddly friends to the station! (harpy and morty plush)
id: 6588
time: '2024-12-22T19:24:58.0000000+00:00'
url: https://github.com/Simple-Station/Einstein-Engines/pull/1369
- author: VMSolidus
changes:
- type: Add
message: >-
Implemented Anti-cheat for Traits. Attempting to join a round with an
illegal traits list will result in hilarious consequences.
id: 6589
time: '2024-12-22T19:55:22.0000000+00:00'
url: https://github.com/Simple-Station/Einstein-Engines/pull/1358
- author: VMSolidus
changes:
- type: Add
message: Prisoners now spawn with a Pacifier Implant.
id: 6590
time: '2024-12-22T19:56:21.0000000+00:00'
url: https://github.com/Simple-Station/Einstein-Engines/pull/1341
- author: sleepyyapril
changes:
- type: Fix
message: Fixed jittering displacing your character when shaken.
id: 6591
time: '2024-12-22T19:57:10.0000000+00:00'
url: https://github.com/Simple-Station/Einstein-Engines/pull/1334
2 changes: 2 additions & 0 deletions Resources/Prototypes/Entities/Markers/Spawners/Random/toy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@
- PlushieTrystan
- PlushieSlips
- PlushieJester
- PlushieHarpy
- PlushieMort
chance: 0.5
offset: 0.2

Expand Down
60 changes: 60 additions & 0 deletions Resources/Prototypes/Entities/Objects/Fun/toys.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1966,3 +1966,63 @@
- type: Sprite
sprite: Objects/Fun/toys.rsi
state: shadowkin

- type: entity
parent: BasePlushie
id: PlushieMort
name: morty plushie
description: A plushie of the lovely Morty. It's a resilient, yet sensitive type of plush.
components:
- type: Sprite
sprite: Objects/Fun/toys.rsi
state: mortplush

- type: entity
parent: BasePlushie
id: PlushieHarpy
name: harpy plushie
description: A soft plushie of a harpy! A small tag on it guarantees that all feathers are ethically sourced.
components:
- type: Sprite
sprite: Objects/Fun/toys.rsi
state: harpyplushie
- type: StaminaDamageOnHit
damage: 0.8
- type: EmitSoundOnActivate
sound:
path: /Audio/DeltaV/Voice/Harpy/caw1.ogg
params:
variation: 0.05
- type: EmitSoundOnUse
sound:
path: /Audio/DeltaV/Voice/Harpy/caw1.ogg
- type: EmitSoundOnCollide
sound:
path: /Audio/DeltaV/Voice/Harpy/caw1.ogg
params:
variation: 0.05
- type: EmitSoundOnLand
sound:
path: /Audio/DeltaV/Voice/Harpy/caw1.ogg
params:
variation: 0.05
- type: UseDelay
delay: 0.8
- type: MeleeWeapon
wideAnimationRotation: -135
attackRate: 0.5
damage:
types:
Blunt: 0
soundHit:
path: /Audio/DeltaV/Voice/Harpy/caw1.ogg
params:
variation: 0.05
soundSwing:
path: /Audio/DeltaV/Voice/Harpy/caw1.ogg
params:
variation: 0.05
soundNoDamage:
path: /Audio/DeltaV/Voice/Harpy/caw1.ogg
params:
variation: 0.05
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@
- !type:CharacterTraitRequirement
traits:
- ShadowkinBlackeye
special:
- !type:AddComponentSpecial
components:
- type: Pacified

- type: startingGear
id: PrisonerGear
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions Resources/Textures/Objects/Fun/toys.rsi/meta.json
Original file line number Diff line number Diff line change
Expand Up @@ -389,6 +389,12 @@
},
{
"name": "shadowkin"
},
{
"name": "mortplush"
},
{
"name": "harpyplushie"
}
]
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 2e038d9

Please sign in to comment.