Add support for printing reagents in lathes (#30476)
* Add support for reagents in lathes * missing locale
This commit is contained in:
@@ -1,5 +1,8 @@
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Linq;
|
||||
using Content.Shared.Emag.Systems;
|
||||
using Content.Shared.Examine;
|
||||
using Content.Shared.Localizations;
|
||||
using Content.Shared.Materials;
|
||||
using Content.Shared.Research.Prototypes;
|
||||
using JetBrains.Annotations;
|
||||
@@ -23,10 +26,21 @@ public abstract class SharedLatheSystem : EntitySystem
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<EmagLatheRecipesComponent, GotEmaggedEvent>(OnEmagged);
|
||||
SubscribeLocalEvent<LatheComponent, ExaminedEvent>(OnExamined);
|
||||
SubscribeLocalEvent<PrototypesReloadedEventArgs>(OnPrototypesReloaded);
|
||||
|
||||
BuildInverseRecipeDictionary();
|
||||
}
|
||||
|
||||
private void OnExamined(Entity<LatheComponent> ent, ref ExaminedEvent args)
|
||||
{
|
||||
if (!args.IsInDetailsRange)
|
||||
return;
|
||||
|
||||
if (ent.Comp.ReagentOutputSlotId != null)
|
||||
args.PushMarkup(Loc.GetString("lathe-menu-reagent-slot-examine"));
|
||||
}
|
||||
|
||||
[PublicAPI]
|
||||
public bool CanProduce(EntityUid uid, string recipe, int amount = 1, LatheComponent? component = null)
|
||||
{
|
||||
@@ -40,7 +54,7 @@ public abstract class SharedLatheSystem : EntitySystem
|
||||
if (!HasRecipe(uid, recipe, component))
|
||||
return false;
|
||||
|
||||
foreach (var (material, needed) in recipe.RequiredMaterials)
|
||||
foreach (var (material, needed) in recipe.Materials)
|
||||
{
|
||||
var adjustedAmount = AdjustMaterial(needed, recipe.ApplyMaterialDiscount, component.MaterialUseMultiplier);
|
||||
|
||||
@@ -72,6 +86,9 @@ public abstract class SharedLatheSystem : EntitySystem
|
||||
_inverseRecipeDictionary.Clear();
|
||||
foreach (var latheRecipe in _proto.EnumeratePrototypes<LatheRecipePrototype>())
|
||||
{
|
||||
if (latheRecipe.Result == null)
|
||||
continue;
|
||||
|
||||
_inverseRecipeDictionary.GetOrNew(latheRecipe.Result).Add(latheRecipe);
|
||||
}
|
||||
}
|
||||
@@ -83,4 +100,55 @@ public abstract class SharedLatheSystem : EntitySystem
|
||||
recipes.AddRange(r);
|
||||
return recipes.Count != 0;
|
||||
}
|
||||
|
||||
public string GetRecipeName(ProtoId<LatheRecipePrototype> proto)
|
||||
{
|
||||
return GetRecipeName(_proto.Index(proto));
|
||||
}
|
||||
|
||||
public string GetRecipeName(LatheRecipePrototype proto)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(proto.Name))
|
||||
return Loc.GetString(proto.Name);
|
||||
|
||||
if (proto.Result is { } result)
|
||||
{
|
||||
return _proto.Index(result).Name;
|
||||
}
|
||||
|
||||
if (proto.ResultReagents is { } resultReagents)
|
||||
{
|
||||
return ContentLocalizationManager.FormatList(resultReagents
|
||||
.Select(p => Loc.GetString("lathe-menu-result-reagent-display", ("reagent", _proto.Index(p.Key).LocalizedName), ("amount", p.Value)))
|
||||
.ToList());
|
||||
}
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
[PublicAPI]
|
||||
public string GetRecipeDescription(ProtoId<LatheRecipePrototype> proto)
|
||||
{
|
||||
return GetRecipeDescription(_proto.Index(proto));
|
||||
}
|
||||
|
||||
public string GetRecipeDescription(LatheRecipePrototype proto)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(proto.Description))
|
||||
return Loc.GetString(proto.Description);
|
||||
|
||||
if (proto.Result is { } result)
|
||||
{
|
||||
return _proto.Index(result).Description;
|
||||
}
|
||||
|
||||
if (proto.ResultReagents is { } resultReagents)
|
||||
{
|
||||
// We only use the first one for the description since these descriptions don't combine very well.
|
||||
var reagent = resultReagents.First().Key;
|
||||
return _proto.Index(reagent).LocalizedDescription;
|
||||
}
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user