mirror of
https://github.com/WWhiteDreamProject/wwdpublic.git
synced 2026-04-29 03:27:41 +03:00
# Description Picked 400 commits (and skipped many, many more) from WizDen since #540. Stopped at commit 332f54a3aebe669f6e50d26e7b047f0bdc28e0fb (Lobby Refactor). --- # TODO - [x] Pick - [x] Compile - [x] Fix runtime errors - [ ] Fix up humanoid profile editor - [ ] Test everything --- # Changelog 🆑 - add: Merged 400 WizDen PRs. Happy testing! --------- Co-authored-by: Plykiya <58439124+Plykiya@users.noreply.github.com> Co-authored-by: FungiFellow <151778459+FungiFellow@users.noreply.github.com> Co-authored-by: osjarw <62134478+osjarw@users.noreply.github.com> Co-authored-by: Ubaser <134914314+UbaserB@users.noreply.github.com> Co-authored-by: beck-thompson <107373427+beck-thompson@users.noreply.github.com> Co-authored-by: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Co-authored-by: Magnus Larsen <i.am.larsenml@gmail.com> Co-authored-by: Hanz <41141796+Hanzdegloker@users.noreply.github.com> Co-authored-by: Kukutis96513 <146854220+Kukutis96513@users.noreply.github.com> Co-authored-by: potato1234_x <79580518+potato1234x@users.noreply.github.com> Co-authored-by: Gotimanga <127038462+Gotimanga@users.noreply.github.com> Co-authored-by: Mangohydra <156087924+Mangohydra@users.noreply.github.com> Co-authored-by: TsjipTsjip <19798667+TsjipTsjip@users.noreply.github.com> Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com> Co-authored-by: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Co-authored-by: Morb <14136326+Morb0@users.noreply.github.com> Co-authored-by: MilenVolf <63782763+MilenVolf@users.noreply.github.com> Co-authored-by: KrasnoshchekovPavel <119816022+KrasnoshchekovPavel@users.noreply.github.com> Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Co-authored-by: DrSmugleaf <10968691+DrSmugleaf@users.noreply.github.com> Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com> Co-authored-by: KittenColony <149278380+KittenColony@users.noreply.github.com> Co-authored-by: ShadowCommander <shadowjjt@gmail.com> Co-authored-by: Mr. 27 <45323883+Dutch-VanDerLinde@users.noreply.github.com> Co-authored-by: T-Stalker <43253663+DogZeroX@users.noreply.github.com> Co-authored-by: ERROR404 <100093430+ERORR404V1@users.noreply.github.com> Co-authored-by: Errant <35878406+Errant-4@users.noreply.github.com> Co-authored-by: Jezithyr <jezithyr@gmail.com> Co-authored-by: Psychpsyo <60073468+Psychpsyo@users.noreply.github.com> Co-authored-by: no <165581243+pissdemon@users.noreply.github.com> Co-authored-by: K-Dynamic <20566341+K-Dynamic@users.noreply.github.com> Co-authored-by: Ciac32 <aknoxlor@gmail.com> Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com> Co-authored-by: NotSoDana <75203942+NotSoDana@users.noreply.github.com> Co-authored-by: Simon <63975668+Simyon264@users.noreply.github.com> Co-authored-by: Repo <47093363+Titian3@users.noreply.github.com> Co-authored-by: Tayrtahn <tayrtahn@gmail.com> Co-authored-by: nao fujiwara <awkwarddryad@gmail.com> Co-authored-by: Michael <107807667+Doc-Michael@users.noreply.github.com> Co-authored-by: Vasilis <vasilis@pikachu.systems> Co-authored-by: Lamrr <96937466+Lamrr@users.noreply.github.com> Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Co-authored-by: Jay <67732946+DuskyJay@users.noreply.github.com> Co-authored-by: Just-a-Unity-Dev <67359748+Just-a-Unity-Dev@users.noreply.github.com> Co-authored-by: nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com> Co-authored-by: Flareguy <78941145+Flareguy@users.noreply.github.com> Co-authored-by: Tyzemol <85772526+Tyzemol@users.noreply.github.com> Co-authored-by: Alzore <140123969+Blackern5000@users.noreply.github.com> Co-authored-by: Pok <113675512+Pok27@users.noreply.github.com> Co-authored-by: RumiTiger <154005209+RumiTiger@users.noreply.github.com> Co-authored-by: Verm <32827189+Vermidia@users.noreply.github.com> Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com> Co-authored-by: Killerqu00 <47712032+Killerqu00@users.noreply.github.com> Co-authored-by: Ty Ashley <42426760+TyAshley@users.noreply.github.com> Co-authored-by: exincore <me@exin.xyz> Co-authored-by: 0x6273 <0x40@keemail.me> Co-authored-by: Kara <lunarautomaton6@gmail.com> Co-authored-by: Ygg01 <y.laughing.man.y@gmail.com> Co-authored-by: Łukasz Mędrek <lukasz@lukaszm.xyz> Co-authored-by: Hannah Giovanna Dawson <karakkaraz@gmail.com> Co-authored-by: TurboTracker <130304754+TurboTrackerss14@users.noreply.github.com> Co-authored-by: OnsenCapy <101037138+LGRuthes@users.noreply.github.com> Co-authored-by: pigeonpeas <147350443+pigeonpeas@users.noreply.github.com> Co-authored-by: Cojoke <83733158+Cojoke-dot@users.noreply.github.com> Co-authored-by: Tornado Tech <54727692+Tornado-Technology@users.noreply.github.com> Co-authored-by: Rio <110139251+Riolume@users.noreply.github.com> Co-authored-by: vorkathbruh <152932728+vorkathbruh@users.noreply.github.com> Co-authored-by: Sphiral <145869023+SphiraI@users.noreply.github.com> Co-authored-by: PrPleGoo <PrPleGoo@users.noreply.github.com> Co-authored-by: Moomoobeef <62638182+Moomoobeef@users.noreply.github.com> Co-authored-by: username <113782077+whateverusername0@users.noreply.github.com> Co-authored-by: Boaz1111 <149967078+Boaz1111@users.noreply.github.com> Co-authored-by: Джексон Миссиссиппи <tripwiregamer@gmail.com> Co-authored-by: Brandon Li <48413902+aspiringLich@users.noreply.github.com> Co-authored-by: Jajsha <101492056+Zap527@users.noreply.github.com> Co-authored-by: RiceMar1244 <138547931+RiceMar1244@users.noreply.github.com> Co-authored-by: IProduceWidgets <107586145+IProduceWidgets@users.noreply.github.com> Co-authored-by: youtissoum <51883137+youtissoum@users.noreply.github.com> Co-authored-by: ike709 <ike709@users.noreply.github.com> Co-authored-by: icekot8 <93311212+icekot8@users.noreply.github.com> Co-authored-by: keronshb <54602815+keronshb@users.noreply.github.com> Co-authored-by: VMSolidus <evilexecutive@gmail.com> Co-authored-by: Geekyhobo <66805063+Geekyhobo@users.noreply.github.com> Co-authored-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> # Conflicts: # Content.Client/Input/ContentContexts.cs # Content.Client/Lobby/LobbyState.cs # Content.Client/Lobby/UI/HumanoidProfileEditor.xaml # Content.Client/Lobby/UI/LobbyGui.xaml # Content.Client/Lobby/UI/LobbyGui.xaml.cs # Content.Client/Preferences/UI/CharacterSetupGui.xaml.cs # Content.Client/UserInterface/Systems/MenuBar/Widgets/GameTopMenuBar.xaml # Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs # Content.Server/Fluids/EntitySystems/PuddleSystem.Spillable.cs # Content.Server/GameTicking/GameTicker.Spawning.cs # Content.Shared/Alert/AlertType.cs # Content.Shared/Input/ContentKeyFunctions.cs # Content.Shared/Preferences/HumanoidCharacterProfile.cs # Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs # Resources/ConfigPresets/EinsteinEngines/default.toml # Resources/Prototypes/Alerts/alerts.yml # Resources/Prototypes/Entities/Clothing/OuterClothing/coats.yml # Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml # Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml # Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml # Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml # Resources/Prototypes/Recipes/Crafting/Graphs/improvised/makeshiftstunprod.yml # Resources/Prototypes/Voice/speech_emotes.yml # Resources/keybinds.yml
227 lines
11 KiB
C#
227 lines
11 KiB
C#
/* WD edit
|
|
|
|
#nullable enable
|
|
using System.Linq;
|
|
using Content.Server.Body.Components;
|
|
using Content.Server.GameTicking;
|
|
using Content.Server.GameTicking.Presets;
|
|
using Content.Server.GameTicking.Rules.Components;
|
|
using Content.Server.Mind;
|
|
using Content.Server.NPC.Systems;
|
|
using Content.Server.Pinpointer;
|
|
using Content.Server.Roles;
|
|
using Content.Server.Shuttles.Components;
|
|
using Content.Server.Station.Components;
|
|
using Content.Shared.CCVar;
|
|
using Content.Shared.Damage;
|
|
using Content.Shared.FixedPoint;
|
|
using Content.Shared.GameTicking;
|
|
using Content.Shared.Hands.Components;
|
|
using Content.Shared.Inventory;
|
|
using Content.Shared.NPC.Systems;
|
|
using Content.Shared.NukeOps;
|
|
using Robust.Server.GameObjects;
|
|
using Robust.Shared.GameObjects;
|
|
using Robust.Shared.Map.Components;
|
|
|
|
namespace Content.IntegrationTests.Tests.GameRules;
|
|
|
|
[TestFixture]
|
|
public sealed class NukeOpsTest
|
|
{
|
|
/// <summary>
|
|
/// Check that a nuke ops game mode can start without issue. I.e., that the nuke station and such all get loaded.
|
|
/// </summary>
|
|
[Test]
|
|
public async Task TryStopNukeOpsFromConstantlyFailing()
|
|
{
|
|
await using var pair = await PoolManager.GetServerClient(new PoolSettings
|
|
{
|
|
Dirty = true,
|
|
DummyTicker = false,
|
|
Connected = true,
|
|
InLobby = true
|
|
});
|
|
|
|
var server = pair.Server;
|
|
var client = pair.Client;
|
|
var entMan = server.EntMan;
|
|
var mapSys = server.System<MapSystem>();
|
|
var ticker = server.System<GameTicker>();
|
|
var mindSys = server.System<MindSystem>();
|
|
var roleSys = server.System<RoleSystem>();
|
|
var invSys = server.System<InventorySystem>();
|
|
var factionSys = server.System<NpcFactionSystem>();
|
|
|
|
Assert.That(server.CfgMan.GetCVar(CCVars.GridFill), Is.False);
|
|
server.CfgMan.SetCVar(CCVars.GridFill, true);
|
|
|
|
// Initially in the lobby
|
|
Assert.That(ticker.RunLevel, Is.EqualTo(GameRunLevel.PreRoundLobby));
|
|
Assert.That(client.AttachedEntity, Is.Null);
|
|
Assert.That(ticker.PlayerGameStatuses[client.User!.Value], Is.EqualTo(PlayerGameStatus.NotReadyToPlay));
|
|
|
|
// Opt into the nukies role.
|
|
await pair.SetAntagPref("NukeopsCommander", true);
|
|
|
|
// There are no grids or maps
|
|
Assert.That(entMan.Count<MapComponent>(), Is.Zero);
|
|
Assert.That(entMan.Count<MapGridComponent>(), Is.Zero);
|
|
Assert.That(entMan.Count<StationMapComponent>(), Is.Zero);
|
|
Assert.That(entMan.Count<StationMemberComponent>(), Is.Zero);
|
|
Assert.That(entMan.Count<StationCentcommComponent>(), Is.Zero);
|
|
|
|
// And no nukie related components
|
|
Assert.That(entMan.Count<NukeopsRuleComponent>(), Is.Zero);
|
|
Assert.That(entMan.Count<NukeopsRoleComponent>(), Is.Zero);
|
|
Assert.That(entMan.Count<NukeOperativeComponent>(), Is.Zero);
|
|
Assert.That(entMan.Count<NukeOpsShuttleComponent>(), Is.Zero);
|
|
Assert.That(entMan.Count<NukeOperativeSpawnerComponent>(), Is.Zero);
|
|
|
|
// Ready up and start nukeops
|
|
await pair.WaitClientCommand("toggleready True");
|
|
Assert.That(ticker.PlayerGameStatuses[client.User!.Value], Is.EqualTo(PlayerGameStatus.ReadyToPlay));
|
|
await pair.WaitCommand("forcepreset Nukeops");
|
|
await pair.RunTicksSync(10);
|
|
|
|
// Game should have started
|
|
Assert.That(ticker.RunLevel, Is.EqualTo(GameRunLevel.InRound));
|
|
Assert.That(ticker.PlayerGameStatuses[client.User!.Value], Is.EqualTo(PlayerGameStatus.JoinedGame));
|
|
Assert.That(client.EntMan.EntityExists(client.AttachedEntity));
|
|
var player = pair.Player!.AttachedEntity!.Value;
|
|
Assert.That(entMan.EntityExists(player));
|
|
|
|
// Maps now exist
|
|
Assert.That(entMan.Count<MapComponent>(), Is.GreaterThan(0));
|
|
Assert.That(entMan.Count<MapGridComponent>(), Is.GreaterThan(0));
|
|
Assert.That(entMan.Count<StationDataComponent>(), Is.EqualTo(2)); // The main station & nukie station
|
|
Assert.That(entMan.Count<StationMemberComponent>(), Is.GreaterThan(3)); // Each station has at least 1 grid, plus some shuttles
|
|
Assert.That(entMan.Count<StationCentcommComponent>(), Is.EqualTo(1));
|
|
|
|
// And we now have nukie related components
|
|
Assert.That(entMan.Count<NukeopsRuleComponent>(), Is.EqualTo(1));
|
|
Assert.That(entMan.Count<NukeopsRoleComponent>(), Is.EqualTo(1));
|
|
Assert.That(entMan.Count<NukeOperativeComponent>(), Is.EqualTo(1));
|
|
Assert.That(entMan.Count<NukeOpsShuttleComponent>(), Is.EqualTo(1));
|
|
|
|
// The player entity should be the nukie commander
|
|
var mind = mindSys.GetMind(player)!.Value;
|
|
Assert.That(entMan.HasComponent<NukeOperativeComponent>(player));
|
|
Assert.That(roleSys.MindIsAntagonist(mind));
|
|
Assert.That(roleSys.MindHasRole<NukeopsRoleComponent>(mind));
|
|
|
|
Assert.That(factionSys.IsMember(player, "Syndicate"), Is.True);
|
|
Assert.That(factionSys.IsMember(player, "NanoTrasen"), Is.False);
|
|
|
|
var roles = roleSys.MindGetAllRoles(mind);
|
|
var cmdRoles = roles.Where(x => x.Prototype == "NukeopsCommander" && x.Component is NukeopsRoleComponent);
|
|
Assert.That(cmdRoles.Count(), Is.EqualTo(1));
|
|
|
|
// The game rule exists, and all the stations/shuttles/maps are properly initialized
|
|
var rule = entMan.AllComponents<NukeopsRuleComponent>().Single().Component;
|
|
var mapRule = entMan.AllComponents<LoadMapRuleComponent>().Single().Component;
|
|
foreach (var grid in mapRule.MapGrids)
|
|
{
|
|
Assert.That(entMan.EntityExists(grid));
|
|
Assert.That(entMan.HasComponent<MapGridComponent>(grid));
|
|
Assert.That(entMan.HasComponent<StationMemberComponent>(grid));
|
|
}
|
|
Assert.That(entMan.EntityExists(rule.NukieOutpost));
|
|
Assert.That(entMan.EntityExists(rule.NukieShuttle));
|
|
Assert.That(entMan.EntityExists(rule.TargetStation));
|
|
|
|
Assert.That(entMan.HasComponent<MapGridComponent>(rule.NukieOutpost));
|
|
Assert.That(entMan.HasComponent<MapGridComponent>(rule.NukieShuttle));
|
|
|
|
Assert.That(entMan.HasComponent<StationMemberComponent>(rule.NukieOutpost));
|
|
Assert.That(entMan.HasComponent<StationDataComponent>(rule.TargetStation));
|
|
|
|
var nukieShuttlEnt = entMan.AllComponents<NukeOpsShuttleComponent>().FirstOrDefault().Uid;
|
|
Assert.That(entMan.EntityExists(nukieShuttlEnt));
|
|
|
|
EntityUid? nukieStationEnt = null;
|
|
foreach (var grid in mapRule.MapGrids)
|
|
{
|
|
if (entMan.HasComponent<StationMemberComponent>(grid))
|
|
{
|
|
nukieStationEnt = grid;
|
|
break;
|
|
}
|
|
}
|
|
|
|
Assert.That(entMan.EntityExists(nukieStationEnt));
|
|
var nukieStation = entMan.GetComponent<StationMemberComponent>(nukieStationEnt!.Value);
|
|
|
|
var nukieStation = entMan.GetComponent<StationMemberComponent>(rule.NukieOutpost!.Value);
|
|
Assert.That(entMan.EntityExists(nukieStation.Station));
|
|
Assert.That(nukieStation.Station, Is.Not.EqualTo(rule.TargetStation));
|
|
|
|
Assert.That(server.MapMan.MapExists(mapRule.Map));
|
|
var nukieMap = mapSys.GetMap(mapRule.Map!.Value);
|
|
Assert.That(server.MapMan.MapExists(rule.NukiePlanet));
|
|
var nukieMap = mapSys.GetMap(rule.NukiePlanet!.Value);
|
|
|
|
var targetStation = entMan.GetComponent<StationDataComponent>(rule.TargetStation!.Value);
|
|
var targetGrid = targetStation.Grids.First();
|
|
var targetMap = entMan.GetComponent<TransformComponent>(targetGrid).MapUid!.Value;
|
|
Assert.That(targetMap, Is.Not.EqualTo(nukieMap));
|
|
|
|
Assert.That(entMan.GetComponent<TransformComponent>(player).MapUid, Is.EqualTo(nukieMap));
|
|
Assert.That(entMan.GetComponent<TransformComponent>(nukieStationEnt.Value).MapUid, Is.EqualTo(nukieMap));
|
|
Assert.That(entMan.GetComponent<TransformComponent>(nukieShuttlEnt).MapUid, Is.EqualTo(nukieMap));
|
|
Assert.That(entMan.GetComponent<TransformComponent>(rule.NukieOutpost!.Value).MapUid, Is.EqualTo(nukieMap));
|
|
Assert.That(entMan.GetComponent<TransformComponent>(rule.NukieShuttle!.Value).MapUid, Is.EqualTo(nukieMap));
|
|
|
|
// The maps are all map-initialized, including the player
|
|
// Yes, this is necessary as this has repeatedly been broken somehow.
|
|
Assert.That(mapSys.IsInitialized(nukieMap));
|
|
Assert.That(mapSys.IsInitialized(targetMap));
|
|
Assert.That(mapSys.IsPaused(nukieMap), Is.False);
|
|
Assert.That(mapSys.IsPaused(targetMap), Is.False);
|
|
|
|
EntityLifeStage LifeStage(EntityUid? uid) => entMan.GetComponent<MetaDataComponent>(uid!.Value).EntityLifeStage;
|
|
Assert.That(LifeStage(player), Is.GreaterThan(EntityLifeStage.Initialized));
|
|
Assert.That(LifeStage(nukieMap), Is.GreaterThan(EntityLifeStage.Initialized));
|
|
Assert.That(LifeStage(targetMap), Is.GreaterThan(EntityLifeStage.Initialized));
|
|
Assert.That(LifeStage(nukieStationEnt.Value), Is.GreaterThan(EntityLifeStage.Initialized));
|
|
Assert.That(LifeStage(nukieShuttlEnt), Is.GreaterThan(EntityLifeStage.Initialized));
|
|
Assert.That(LifeStage(rule.NukieOutpost), Is.GreaterThan(EntityLifeStage.Initialized));
|
|
Assert.That(LifeStage(rule.NukieShuttle), Is.GreaterThan(EntityLifeStage.Initialized));
|
|
Assert.That(LifeStage(rule.TargetStation), Is.GreaterThan(EntityLifeStage.Initialized));
|
|
|
|
// Make sure the player has hands. We've had fucking disarmed nukies before.
|
|
Assert.That(entMan.HasComponent<HandsComponent>(player));
|
|
Assert.That(entMan.GetComponent<HandsComponent>(player).Hands.Count, Is.GreaterThan(0));
|
|
|
|
// While we're at it, lets make sure they aren't naked. I don't know how many inventory slots all mobs will be
|
|
// likely to have in the future. But nukies should probably have at least 3 slots with something in them.
|
|
var enumerator = invSys.GetSlotEnumerator(player);
|
|
int total = 0;
|
|
while (enumerator.NextItem(out _))
|
|
{
|
|
total++;
|
|
}
|
|
Assert.That(total, Is.GreaterThan(3));
|
|
|
|
// Finally lets check the nukie commander passed basic training and figured out how to breathe.
|
|
var totalSeconds = 30;
|
|
var totalTicks = (int) Math.Ceiling(totalSeconds / server.Timing.TickPeriod.TotalSeconds);
|
|
int increment = 5;
|
|
var resp = entMan.GetComponent<RespiratorComponent>(player);
|
|
var damage = entMan.GetComponent<DamageableComponent>(player);
|
|
for (var tick = 0; tick < totalTicks; tick += increment)
|
|
{
|
|
await pair.RunTicksSync(increment);
|
|
Assert.That(resp.SuffocationCycles, Is.LessThanOrEqualTo(resp.SuffocationCycleThreshold));
|
|
Assert.That(damage.TotalDamage, Is.EqualTo(FixedPoint2.Zero));
|
|
}
|
|
|
|
//ticker.SetGamePreset((GamePresetPrototype?)null); WD edit
|
|
server.CfgMan.SetCVar(CCVars.GridFill, false);
|
|
await pair.SetAntagPref("NukeopsCommander", false);
|
|
await pair.CleanReturnAsync();
|
|
}
|
|
}
|
|
|
|
*/
|