mirror of
https://github.com/WWhiteDreamProject/wwdpublic.git
synced 2026-04-19 06:28:40 +03:00
<!-- This is a semi-strict format, you can add/remove sections as needed but the order/format should be kept the same Remove these comments before submitting --> # Description the adding AI is now up to y'all because i'm not touching loadout code for name datasets, but it shouldn't be too bad from here --------- Signed-off-by: sleepyyapril <123355664+sleepyyapril@users.noreply.github.com> Signed-off-by: SolStar <44028047+ewokswagger@users.noreply.github.com> Signed-off-by: deltanedas <39013340+deltanedas@users.noreply.github.com> Co-authored-by: themias <89101928+themias@users.noreply.github.com> Co-authored-by: Verm <32827189+Vermidia@users.noreply.github.com> Co-authored-by: DrSmugleaf <10968691+DrSmugleaf@users.noreply.github.com> Co-authored-by: Sphiral <145869023+SphiraI@users.noreply.github.com> Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com> Co-authored-by: Mr. 27 <45323883+Dutch-VanDerLinde@users.noreply.github.com> Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com> Co-authored-by: Alzore <140123969+Blackern5000@users.noreply.github.com> Co-authored-by: ravage <142820619+ravage123321@users.noreply.github.com> Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Co-authored-by: Intoxicating-Innocence <188202277+Intoxicating-Innocence@users.noreply.github.com> Co-authored-by: Saphire <lattice@saphi.re> Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: Errant <35878406+Errant-4@users.noreply.github.com> Co-authored-by: Tayrtahn <tayrtahn@gmail.com> Co-authored-by: CaasGit <87243814+CaasGit@users.noreply.github.com> Co-authored-by: BramvanZijp <56019239+BramvanZijp@users.noreply.github.com> Co-authored-by: Boaz1111 <149967078+Boaz1111@users.noreply.github.com> Co-authored-by: NakataRin <45946146+NakataRin@users.noreply.github.com> Co-authored-by: Kara <lunarautomaton6@gmail.com> Co-authored-by: Plykiya <58439124+Plykiya@users.noreply.github.com> Co-authored-by: SlamBamActionman <slambamactionman@gmail.com> Co-authored-by: Doomsdrayk <robotdoughnut@comcast.net> Co-authored-by: Brandon Hu <103440971+Brandon-Huu@users.noreply.github.com> Co-authored-by: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Co-authored-by: ElectroJr <leonsfriedrich@gmail.com> Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com> Co-authored-by: DrSmugleaf <DrSmugleaf@users.noreply.github.com> Co-authored-by: Julian Giebel <juliangiebel@live.de> Co-authored-by: nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com> Co-authored-by: Repo <47093363+Titian3@users.noreply.github.com> Co-authored-by: Chief-Engineer <119664036+Chief-Engineer@users.noreply.github.com> Co-authored-by: icekot8 <93311212+icekot8@users.noreply.github.com> Co-authored-by: AJCM-git <60196617+AJCM-git@users.noreply.github.com> Co-authored-by: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Co-authored-by: no <165581243+pissdemon@users.noreply.github.com> Co-authored-by: Tornado Tech <54727692+Tornado-Technology@users.noreply.github.com> Co-authored-by: osjarw <62134478+osjarw@users.noreply.github.com> Co-authored-by: Simon <63975668+Simyon264@users.noreply.github.com> Co-authored-by: TGRCDev <tgrc@tgrc.dev> Co-authored-by: Milon <milonpl.git@proton.me> Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com> Co-authored-by: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com> Co-authored-by: Fildrance <fildrance@gmail.com> Co-authored-by: pa.pecherskij <pa.pecherskij@interfax.ru> Co-authored-by: chavonadelal <156101927+chavonadelal@users.noreply.github.com> Co-authored-by: SolStar <44028047+ewokswagger@users.noreply.github.com> Co-authored-by: K-Dynamic <20566341+K-Dynamic@users.noreply.github.com> Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com> Co-authored-by: ArchRBX <5040911+ArchRBX@users.noreply.github.com> Co-authored-by: archrbx <punk.gear5260@fastmail.com> Co-authored-by: Radezolid <snappednexus@gmail.com> Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Co-authored-by: EmoGarbage404 <retron404@gmail.com> Co-authored-by: MilenVolf <63782763+MilenVolf@users.noreply.github.com> Co-authored-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com> Co-authored-by: Velcroboy <velcroboy333@hotmail.com> Co-authored-by: neuPanda <chriseparton@gmail.com> Co-authored-by: neuPanda <spainman0@yahoo.com> Co-authored-by: Dvir <39403717+dvir001@users.noreply.github.com> Co-authored-by: Whatstone <whatston3@gmail.com> Co-authored-by: VideoKompany <135313844+VlaDOS1408@users.noreply.github.com> (cherry picked from commit 93ed70acfeda357133a701f637d3faeec02749bb)
155 lines
5.0 KiB
C#
155 lines
5.0 KiB
C#
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;
|
|
using Robust.Shared.Prototypes;
|
|
using Robust.Shared.Utility;
|
|
|
|
namespace Content.Shared.Lathe;
|
|
|
|
/// <summary>
|
|
/// This handles...
|
|
/// </summary>
|
|
public abstract class SharedLatheSystem : EntitySystem
|
|
{
|
|
[Dependency] private readonly IPrototypeManager _proto = default!;
|
|
[Dependency] private readonly SharedMaterialStorageSystem _materialStorage = default!;
|
|
|
|
private readonly Dictionary<string, List<LatheRecipePrototype>> _inverseRecipeDictionary = new();
|
|
|
|
public override void Initialize()
|
|
{
|
|
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)
|
|
{
|
|
return _proto.TryIndex<LatheRecipePrototype>(recipe, out var proto) && CanProduce(uid, proto, amount, component);
|
|
}
|
|
|
|
public bool CanProduce(EntityUid uid, LatheRecipePrototype recipe, int amount = 1, LatheComponent? component = null)
|
|
{
|
|
if (!Resolve(uid, ref component))
|
|
return false;
|
|
if (!HasRecipe(uid, recipe, component))
|
|
return false;
|
|
|
|
foreach (var (material, needed) in recipe.Materials)
|
|
{
|
|
var adjustedAmount = AdjustMaterial(needed, recipe.ApplyMaterialDiscount, component.MaterialUseMultiplier);
|
|
|
|
if (_materialStorage.GetMaterialAmount(uid, material) < adjustedAmount * amount)
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
private void OnEmagged(EntityUid uid, EmagLatheRecipesComponent component, ref GotEmaggedEvent args)
|
|
{
|
|
args.Handled = true;
|
|
}
|
|
|
|
public static int AdjustMaterial(int original, bool reduce, float multiplier)
|
|
=> reduce ? (int) MathF.Ceiling(original * multiplier) : original;
|
|
|
|
protected abstract bool HasRecipe(EntityUid uid, LatheRecipePrototype recipe, LatheComponent component);
|
|
|
|
private void OnPrototypesReloaded(PrototypesReloadedEventArgs obj)
|
|
{
|
|
if (!obj.WasModified<LatheRecipePrototype>())
|
|
return;
|
|
BuildInverseRecipeDictionary();
|
|
}
|
|
|
|
private void BuildInverseRecipeDictionary()
|
|
{
|
|
_inverseRecipeDictionary.Clear();
|
|
foreach (var latheRecipe in _proto.EnumeratePrototypes<LatheRecipePrototype>())
|
|
{
|
|
if (latheRecipe.Result == null)
|
|
continue;
|
|
|
|
_inverseRecipeDictionary.GetOrNew(latheRecipe.Result).Add(latheRecipe);
|
|
}
|
|
}
|
|
|
|
public bool TryGetRecipesFromEntity(string prototype, [NotNullWhen(true)] out List<LatheRecipePrototype>? recipes)
|
|
{
|
|
recipes = new();
|
|
if (_inverseRecipeDictionary.TryGetValue(prototype, out var r))
|
|
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;
|
|
}
|
|
}
|