Implement traits system (#10693)

This commit is contained in:
Visne
2022-09-10 17:40:06 +02:00
committed by GitHub
parent e1782ec22b
commit 4cc5fa239e
17 changed files with 3006 additions and 29 deletions

View File

@@ -27,6 +27,7 @@ namespace Content.Server.Database
.Preference
.Include(p => p.Profiles).ThenInclude(h => h.Jobs)
.Include(p => p.Profiles).ThenInclude(h => h.Antags)
.Include(p => p.Profiles).ThenInclude(h => h.Traits)
.AsSingleQuery()
.SingleOrDefaultAsync(p => p.UserId == userId.UserId);
@@ -156,6 +157,7 @@ namespace Content.Server.Database
{
var jobs = profile.Jobs.ToDictionary(j => j.JobName, j => (JobPriority) j.Priority);
var antags = profile.Antags.Select(a => a.AntagName);
var traits = profile.Traits.Select(t => t.TraitName);
var sex = Sex.Male;
if (Enum.TryParse<Sex>(profile.Sex, true, out var sexVal))
@@ -211,7 +213,8 @@ namespace Content.Server.Database
backpack,
jobs,
(PreferenceUnavailableMode) profile.PreferenceUnavailable,
antags.ToList()
antags.ToList(),
traits.ToList()
);
}
@@ -254,6 +257,10 @@ namespace Content.Server.Database
humanoid.AntagPreferences
.Select(a => new Antag {AntagName = a})
);
entity.Traits.AddRange(
humanoid.TraitPreferences
.Select(t => new Trait {TraitName = t})
);
return entity;
}

View File

@@ -160,9 +160,6 @@ namespace Content.Server.Nutrition.Components
{
_currentHunger -= frametime * ActualDecayRate;
UpdateCurrentThreshold();
if (_currentHungerThreshold != HungerThreshold.Dead)
return;
}
private void UpdateCurrentThreshold()

View File

@@ -1,12 +1,8 @@
using Content.Server.Nutrition.Components;
using JetBrains.Annotations;
using Robust.Shared.Random;
using Content.Shared.MobState.Components;
using Content.Shared.Movement.Components;
using Content.Shared.Alert;
using Content.Server.Administration.Logs;
using Content.Shared.Database;
using Content.Shared.Damage;
using Content.Shared.Movement.Systems;
namespace Content.Server.Nutrition.EntitySystems
@@ -43,6 +39,7 @@ namespace Content.Server.Nutrition.EntitySystems
private void OnRefreshMovespeed(EntityUid uid, ThirstComponent component, RefreshMovementSpeedModifiersEvent args)
{
// TODO: This should really be taken care of somewhere else
if (_jetpack.IsUserFlying(component.Owner))
return;

View File

@@ -0,0 +1,40 @@
using Content.Server.GameTicking;
using Content.Shared.Traits;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.Manager;
namespace Content.Server.Traits;
public sealed class TraitSystem : EntitySystem
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly ISerializationManager _serializationManager = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PlayerSpawnCompleteEvent>(OnPlayerSpawnComplete);
}
// When the player is spawned in, add all trait components selected during character creation
private void OnPlayerSpawnComplete(PlayerSpawnCompleteEvent args)
{
foreach (var traitId in args.Profile.TraitPreferences)
{
if (!_prototypeManager.TryIndex<TraitPrototype>(traitId, out var traitPrototype))
{
Logger.Warning($"No trait found with ID {traitId}!");
return;
}
// Add all components required by the prototype
foreach (var entry in traitPrototype.Components.Values)
{
var comp = (Component) _serializationManager.Copy(entry.Component);
comp.Owner = args.Mob;
EntityManager.AddComponent(args.Mob, comp);
}
}
}
}