Workbench and crystals (#1502)

* solutionResource

* fuck research system + QoL workbench update

* colorful quartz returns

* Refactor workbench skill requirements handling

Replaces the SkillRequired requirement with a direct RequiredSkills field on CP14WorkbenchRecipePrototype. Updates client and server logic to check skills directly, simplifying recipe skill checks and related UI logic.

* Initial commit

Add initial project files and setup.
This commit is contained in:
Red
2025-07-05 20:44:38 +03:00
committed by GitHub
parent c01351c1ef
commit 14b0fc5b4a
47 changed files with 1074 additions and 1528 deletions

View File

@@ -1,14 +0,0 @@
<Control xmlns="https://spacestation14.io">
<Button Name="Button">
<GridContainer Columns="2">
<TextureRect Name="View"
Stretch="KeepAspectCentered"
Margin="0,0,4,0"
MinSize="48 48"
MaxSize="48 48"
HorizontalAlignment="Center"
VerticalExpand="True" />
<Label Name="Name" />
</GridContainer>
</Button>
</Control>

View File

@@ -1,60 +0,0 @@
using Content.Shared._CP14.Skill;
using Content.Shared._CP14.Skill.Prototypes;
using Robust.Client.AutoGenerated;
using Robust.Client.GameObjects;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Prototypes;
namespace Content.Client._CP14.ResearchTable;
[GenerateTypedNameReferences]
public sealed partial class CP14ResearchRecipeControl : Control
{
[Dependency] private readonly IEntityManager _entity = default!;
[Dependency] private readonly IPrototypeManager _prototype = default!;
public event Action<CP14ResearchUiEntry, CP14SkillPrototype>? OnResearch;
private readonly SpriteSystem _sprite;
private readonly CP14SharedSkillSystem _skillSystem;
private readonly CP14SkillPrototype _skillPrototype;
private readonly bool _craftable;
public CP14ResearchRecipeControl(CP14ResearchUiEntry entry)
{
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
_sprite = _entity.System<SpriteSystem>();
_skillSystem = _entity.System<CP14SharedSkillSystem>();
_skillPrototype = _prototype.Index(entry.ProtoId);
_craftable = entry.Craftable;
Button.OnPressed += _ => OnResearch?.Invoke(entry, _skillPrototype);
UpdateColor();
UpdateName();
UpdateView();
}
private void UpdateColor()
{
if (_craftable)
return;
Button.ModulateSelfOverride = Color.FromHex("#302622");
}
private void UpdateName()
{
Name.Text = $"{Loc.GetString(_skillSystem.GetSkillName(_skillPrototype))}" ;
}
private void UpdateView()
{
View.Texture =_sprite.Frame0(_skillPrototype.Icon);
}
}

View File

@@ -1,34 +0,0 @@
using Content.Shared._CP14.Skill;
using Robust.Client.UserInterface;
namespace Content.Client._CP14.ResearchTable;
public sealed class CP14ResearchTableBoundUserInterface : BoundUserInterface
{
private CP14ResearchTableWindow? _window;
public CP14ResearchTableBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
{
}
protected override void Open()
{
base.Open();
_window = this.CreateWindow<CP14ResearchTableWindow>();
_window.OnResearch += entry => SendMessage(new CP14ResearchMessage(entry.ProtoId));
}
protected override void UpdateState(BoundUserInterfaceState state)
{
base.UpdateState(state);
switch (state)
{
case CP14ResearchTableUiState recipesState:
_window?.UpdateState(recipesState);
break;
}
}
}

View File

@@ -1,72 +0,0 @@
<DefaultWindow xmlns="https://spacestation14.io"
xmlns:graphics="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
Title="{Loc 'cp14-research-table-title'}"
SetSize="700 500"
MinSize="700 300">
<BoxContainer Orientation="Horizontal">
<!-- Main -->
<BoxContainer HorizontalExpand="True" VerticalExpand="True" Orientation="Horizontal">
<!-- Product list (left side UI) -->
<BoxContainer MinWidth="350" HorizontalExpand="True" Orientation="Vertical" Margin="0 0 10 0">
<BoxContainer Orientation="Horizontal" HorizontalExpand="True">
<!-- Search Bar -->
<LineEdit Name="SearchBar" Margin="4" PlaceHolder="Search" HorizontalExpand="True" />
<OptionButton Name="OptionCategories" Access="Public" MinSize="130 0" />
</BoxContainer>
<!-- Crafts container -->
<ScrollContainer HorizontalExpand="True" VerticalExpand="True" MinSize="0 200">
<BoxContainer Name="CraftsContainer" Orientation="Vertical" HorizontalExpand="True" />
</ScrollContainer>
</BoxContainer>
<!-- Craft view (right side UI) -->
<BoxContainer MinWidth="350" Orientation="Vertical" HorizontalExpand="True"
VerticalExpand="True">
<PanelContainer HorizontalExpand="True" VerticalExpand="True">
<!-- Background -->
<PanelContainer.PanelOverride>
<graphics:StyleBoxFlat BackgroundColor="#41332f" />
</PanelContainer.PanelOverride>
<!-- Content -->
<BoxContainer HorizontalExpand="True" VerticalExpand="True" Orientation="Vertical">
<!-- Item info -->
<!-- icon -->
<TextureRect Name="ItemView"
Stretch="KeepAspectCentered"
Margin="5"
MinSize="64 64"
MaxSize="64 64"
HorizontalAlignment="Left" />
<!-- name & description -->
<BoxContainer Margin="5 0 0 0" HorizontalExpand="True" VerticalExpand="True"
Orientation="Vertical">
<RichTextLabel Name="ItemName" Margin="5" />
<RichTextLabel Name="ItemDescription" Margin="5" />
</BoxContainer>
<controls:HLine Color="#404040" Thickness="2" Margin="0 5" />
<!-- Required title -->
<Label Margin="5 0 0 0" Text="{Loc 'cp14-research-recipe-list'}" />
<!-- Craft requirements content -->
<!-- Added by code -->
<BoxContainer
Margin="5 0 0 0"
Name="ItemRequirements"
Orientation="Vertical" VerticalExpand="True"
HorizontalExpand="True" />
<controls:HLine Color="#404040" Thickness="5" Margin="0 5" />
<!-- Craft button -->
<Button Name="CraftButton" Text="{Loc 'cp14-research-craft'}" />
</BoxContainer>
</PanelContainer>
</BoxContainer>
</BoxContainer>
</BoxContainer>
</DefaultWindow>

View File

@@ -1,235 +0,0 @@
using Content.Client._CP14.Workbench;
using Content.Shared._CP14.Skill;
using Content.Shared._CP14.Skill.Prototypes;
using Content.Shared._CP14.Skill.Restrictions;
using Robust.Client.AutoGenerated;
using Robust.Client.GameObjects;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Prototypes;
namespace Content.Client._CP14.ResearchTable;
[GenerateTypedNameReferences]
public sealed partial class CP14ResearchTableWindow : DefaultWindow
{
private const int AllCategoryId = -1;
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly ILogManager _log = default!;
[Dependency] private readonly IEntityManager _entity = default!;
private readonly SpriteSystem _sprite;
private readonly CP14SharedSkillSystem _skillSystem;
public event Action<CP14ResearchUiEntry>? OnResearch;
private readonly Dictionary<int, LocId> _categories = new();
private CP14ResearchTableUiState? _cachedState;
private CP14ResearchUiEntry? _selectedEntry;
private string _searchFilter = string.Empty;
private ISawmill Sawmill { get; init; }
public CP14ResearchTableWindow()
{
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
_sprite = _entity.System<SpriteSystem>();
_skillSystem = _entity.System<CP14SharedSkillSystem>();
Sawmill = _log.GetSawmill("cp14_research_table_window");
SearchBar.OnTextChanged += OnSearchChanged;
CraftButton.OnPressed += OnCraftPressed;
OptionCategories.OnItemSelected += OnCategoryItemSelected;
}
public void UpdateRecipesVisibility()
{
if (_cachedState is null)
return;
CraftsContainer.RemoveAllChildren();
var recipes = new List<CP14ResearchUiEntry>();
foreach (var entry in _cachedState.Skills)
{
if (!_prototype.TryIndex(entry.ProtoId, out var indexedEntry))
{
Sawmill.Error($"No recipe prototype {entry.ProtoId} retrieved from cache found");
continue;
}
if (!ProcessSearchFilter(indexedEntry))
continue;
if (!ProcessSearchCategoryFilter(indexedEntry))
continue;
recipes.Add(entry);
}
recipes.Sort(CP14ResearchUiEntry.CompareTo);
foreach (var recipe in recipes)
{
var control = new CP14ResearchRecipeControl(recipe);
control.OnResearch += RecipeSelect;
CraftsContainer.AddChild(control);
}
if (_selectedEntry is not null && !recipes.Contains(_selectedEntry.Value))
RecipeSelectNull();
}
public void UpdateState(CP14ResearchTableUiState recipesState)
{
_cachedState = recipesState;
_categories.Clear();
OptionCategories.Clear();
OptionCategories.AddItem(Loc.GetString("cp14-recipe-category-all"), AllCategoryId);
var categories = new List<LocId>();
var count = 0;
foreach (var skill in recipesState.Skills)
{
if (!_prototype.TryIndex(skill.ProtoId, out var indexedSkill))
continue;
if (!_prototype.TryIndex(indexedSkill.Tree, out var indexedTree))
continue;
if (categories.Contains(indexedTree.Name))
continue;
categories.Add(indexedTree.Name);
}
categories.Sort((a, b) => string.Compare(Loc.GetString(a), Loc.GetString(b), StringComparison.Ordinal));
foreach (var category in categories)
{
OptionCategories.AddItem(Loc.GetString(category), count);
_categories.Add(count, category);
count++;
}
UpdateRecipesVisibility();
}
private void OnSearchChanged(LineEdit.LineEditEventArgs _)
{
_searchFilter = SearchBar.Text.Trim().ToLowerInvariant();
UpdateRecipesVisibility();
}
private void OnCraftPressed(BaseButton.ButtonEventArgs _)
{
if (_selectedEntry is null)
return;
OnResearch?.Invoke(_selectedEntry.Value);
}
private void OnCategoryItemSelected(OptionButton.ItemSelectedEventArgs obj)
{
OptionCategories.SelectId(obj.Id);
UpdateRecipesVisibility();
}
private bool ProcessSearchFilter(CP14SkillPrototype indexedEntry)
{
if (_searchFilter == string.Empty)
return true;
return Loc.GetString(_skillSystem.GetSkillName(indexedEntry)).Contains(_searchFilter);
}
private bool ProcessSearchCategoryFilter(CP14SkillPrototype indexedEntry)
{
// If we are searching through all categories, we simply skip the current filter
if (OptionCategories.SelectedId == AllCategoryId)
return true;
if (!_categories.TryGetValue(OptionCategories.SelectedId, out var selectedCategory))
{
Sawmill.Error($"Non-existent {OptionCategories.SelectedId} category id selected. Filter skipped");
return true;
}
if (!_prototype.TryIndex(indexedEntry.Tree, out var indexedTree))
{
Sawmill.Error($"Non-existent {indexedEntry.Tree} category prototype id. Filter skipped");
return true;
}
return indexedTree.Name == selectedCategory;
}
private void RecipeSelect(CP14ResearchTableUiState recipesState)
{
foreach (var skill in recipesState.Skills)
{
RecipeSelect(skill, _prototype.Index(skill.ProtoId));
break;
}
}
private void RecipeSelect(CP14ResearchUiEntry cachedEntry)
{
if (_cachedState is null)
return;
if (_cachedState.Skills.Contains(cachedEntry))
{
Sawmill.Warning($"The selected cache option {cachedEntry} isn't found in recipes");
return;
}
RecipeSelect(cachedEntry, _prototype.Index(cachedEntry.ProtoId));
}
private void RecipeSelect(CP14ResearchUiEntry entry, CP14SkillPrototype skill)
{
_selectedEntry = entry;
ItemView.Texture = _sprite.Frame0(skill.Icon);
ItemName.Text = _skillSystem.GetSkillName(skill);
ItemDescription.Text = _skillSystem.GetSkillDescription(skill);
ItemRequirements.RemoveAllChildren();
foreach (var restriction in skill.Restrictions)
{
switch (restriction)
{
case Researched researched:
foreach (var requirement in researched.Requirements)
{
ItemRequirements.AddChild(new CP14WorkbenchRequirementControl(requirement));
}
break;
}
}
CraftButton.Disabled = !entry.Craftable;
}
private void RecipeSelectNull()
{
_selectedEntry = null;
ItemView.Texture = null;
ItemName.Text = string.Empty;
ItemDescription.Text = string.Empty;
ItemRequirements.RemoveAllChildren();
CraftButton.Disabled = true;
}
}

View File

@@ -37,12 +37,14 @@ public sealed partial class CP14WorkbenchRequirementControl : Control
{
View.Visible = true;
View.Texture = _sprite.Frame0(texture);
View.Modulate = requirement.GetRequirementColor(_proto);
}
var entityView = requirement.GetRequirementEntityView(_proto);
if (entityView is not null)
{
EntityView.Visible = true;
EntityView.Modulate = requirement.GetRequirementColor(_proto);
EntityView.SetPrototype(entityView);
}
}

View File

@@ -3,9 +3,11 @@
* https://github.com/space-wizards/space-station-14/blob/master/LICENSE.TXT
*/
using Content.Client._CP14.Skill;
using Content.Shared._CP14.Workbench;
using Content.Shared._CP14.Workbench.Prototypes;
using Robust.Client.AutoGenerated;
using Robust.Client.Player;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
@@ -18,8 +20,11 @@ public sealed partial class CP14WorkbenchWindow : DefaultWindow
{
private const int AllCategoryId = -1;
[Dependency] private readonly IPlayerManager _player = default!;
[Dependency] private readonly IEntityManager _entManager = default!;
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly ILogManager _log = default!;
private CP14ClientSkillSystem _skill;
public event Action<CP14WorkbenchUiRecipesEntry>? OnCraft;
@@ -36,6 +41,8 @@ public sealed partial class CP14WorkbenchWindow : DefaultWindow
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
_skill = _entManager.System<CP14ClientSkillSystem>();
Sawmill = _log.GetSawmill("cp14_workbench_window");
SearchBar.OnTextChanged += OnSearchChanged;
@@ -65,6 +72,22 @@ public sealed partial class CP14WorkbenchWindow : DefaultWindow
if (!ProcessSearchCategoryFilter(indexedEntry))
continue;
if (_player.LocalEntity is not null)
{
var skilled = true;
foreach (var skill in indexedEntry.RequiredSkills)
{
if (!_skill.HaveSkill(_player.LocalEntity.Value, skill))
{
skilled = false;
break;
}
}
if (!skilled)
continue;
}
recipes.Add(entry);
}
@@ -84,6 +107,9 @@ public sealed partial class CP14WorkbenchWindow : DefaultWindow
public void UpdateState(CP14WorkbenchUiRecipesState recipesState)
{
if (_player.LocalEntity is null)
return;
_cachedState = recipesState;
_categories.Clear();

View File

@@ -1,199 +0,0 @@
using Content.Server.DoAfter;
using Content.Shared._CP14.ResearchTable;
using Content.Shared._CP14.Skill;
using Content.Shared._CP14.Skill.Components;
using Content.Shared._CP14.Skill.Prototypes;
using Content.Shared._CP14.Skill.Restrictions;
using Content.Shared.DoAfter;
using Content.Shared.UserInterface;
using Robust.Server.Audio;
using Robust.Server.GameObjects;
using Robust.Shared.Prototypes;
namespace Content.Server._CP14.ResearchTable;
public sealed class CP14ResearchSystem : CP14SharedResearchSystem
{
[Dependency] private readonly EntityLookupSystem _lookup = default!;
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly UserInterfaceSystem _userInterface = default!;
[Dependency] private readonly DoAfterSystem _doAfter = default!;
[Dependency] private readonly AudioSystem _audio = default!;
private IEnumerable<CP14SkillPrototype> _allSkills = [];
public override void Initialize()
{
base.Initialize();
_allSkills = _proto.EnumeratePrototypes<CP14SkillPrototype>();
SubscribeLocalEvent<CP14ResearchTableComponent, BeforeActivatableUIOpenEvent>(OnBeforeUIOpen);
SubscribeLocalEvent<CP14ResearchTableComponent, CP14ResearchMessage>(OnResearch);
SubscribeLocalEvent<CP14ResearchTableComponent, CP14ResearchDoAfterEvent>(OnResearchEnd);
SubscribeLocalEvent<PrototypesReloadedEventArgs>(OnReloadPrototypes);
}
private void OnReloadPrototypes(PrototypesReloadedEventArgs ev)
{
_allSkills = _proto.EnumeratePrototypes<CP14SkillPrototype>();
}
private void OnResearchEnd(Entity<CP14ResearchTableComponent> table, ref CP14ResearchDoAfterEvent args)
{
if (args.Cancelled || args.Handled)
return;
if (!_proto.TryIndex(args.Skill, out var indexedSkill))
return;
var placedEntities = _lookup.GetEntitiesInRange(Transform(table).Coordinates,
table.Comp.ResearchRadius,
LookupFlags.Uncontained);
if (!CanResearch(indexedSkill, placedEntities, args.User))
return;
if (!TryComp<CP14SkillStorageComponent>(args.User, out var storage))
return;
if (storage.ResearchedSkills.Contains(args.Skill) || storage.LearnedSkills.Contains(args.Skill))
return;
storage.ResearchedSkills.Add(args.Skill);
Dirty(args.User, storage);
foreach (var restriction in indexedSkill.Restrictions)
{
switch (restriction)
{
case Researched researched:
foreach (var req in researched.Requirements)
{
req.PostCraft(EntityManager, _proto, placedEntities, args.User);
}
break;
}
}
_audio.PlayPvs(table.Comp.ResearchSound, table);
UpdateUI(table, args.User);
args.Handled = true;
}
private void OnResearch(Entity<CP14ResearchTableComponent> ent, ref CP14ResearchMessage args)
{
if (!TryComp<CP14SkillStorageComponent>(args.Actor, out var storage))
return;
if (storage.ResearchedSkills.Contains(args.Skill) || storage.LearnedSkills.Contains(args.Skill))
return;
if (!_proto.TryIndex(args.Skill, out var indexedSkill))
return;
StartResearch(ent, args.Actor, indexedSkill);
}
private void OnBeforeUIOpen(Entity<CP14ResearchTableComponent> ent, ref BeforeActivatableUIOpenEvent args)
{
UpdateUI(ent, args.User);
}
private void UpdateUI(Entity<CP14ResearchTableComponent> entity, EntityUid user)
{
var placedEntities = _lookup.GetEntitiesInRange(Transform(entity).Coordinates, entity.Comp.ResearchRadius);
if (!TryComp<CP14SkillStorageComponent>(user, out var storage))
return;
var researches = new List<CP14ResearchUiEntry>();
foreach (var skill in _allSkills)
{
var researchable = false;
var canCraft = true;
var hidden = false;
foreach (var restriction in skill.Restrictions)
{
if (storage.ResearchedSkills.Contains(skill) || storage.LearnedSkills.Contains(skill))
continue;
switch (restriction)
{
case SpeciesWhitelist speciesWhitelist: //We cant change species of our character, so hide it
if (!speciesWhitelist.Check(EntityManager, user, skill))
hidden = true;
break;
case NeedPrerequisite prerequisite:
if (!storage.ResearchedSkills.Contains(prerequisite.Prerequisite))
hidden = true;
break;
case Researched researched:
researchable = true;
foreach (var req in researched.Requirements)
{
if (!req.CheckRequirement(EntityManager, _proto, placedEntities, user))
{
canCraft = false;
}
}
break;
}
}
if (!researchable || hidden)
continue;
var entry = new CP14ResearchUiEntry(skill, canCraft);
researches.Add(entry);
}
_userInterface.SetUiState(entity.Owner, CP14ResearchTableUiKey.Key, new CP14ResearchTableUiState(researches));
}
private void StartResearch(Entity<CP14ResearchTableComponent> table, EntityUid user, CP14SkillPrototype skill)
{
var researchDoAfter = new CP14ResearchDoAfterEvent()
{
Skill = skill
};
var doAfterArgs = new DoAfterArgs(EntityManager,
user,
TimeSpan.FromSeconds(table.Comp.ResearchSpeed),
researchDoAfter,
table,
table)
{
BreakOnMove = true,
BreakOnDamage = true,
NeedHand = true,
};
_doAfter.TryStartDoAfter(doAfterArgs);
_audio.PlayPvs(table.Comp.ResearchSound, table);
}
private bool CanResearch(CP14SkillPrototype skill, HashSet<EntityUid> entities, EntityUid user)
{
foreach (var restriction in skill.Restrictions)
{
switch (restriction)
{
case Researched researched:
foreach (var req in researched.Requirements)
{
if (!req.CheckRequirement(EntityManager, _proto, entities, user))
return false;
}
break;
}
}
return true;
}
}

View File

@@ -87,7 +87,7 @@ public sealed partial class CP14TradingPlatformSystem : CP14SharedTradingPlatfor
foreach (var req in indexedRequest.Requirements)
{
req.PostCraft(EntityManager, Proto, itemPlacer.PlacedEntities, null);
req.PostCraft(EntityManager, Proto, itemPlacer.PlacedEntities);
}
_audio.PlayPvs(ent.Comp.SellSound, Transform(ent).Coordinates);

View File

@@ -3,12 +3,16 @@
* https://github.com/space-wizards/space-station-14/blob/master/LICENSE.TXT
*/
using Content.Shared._CP14.Skill;
using Content.Shared._CP14.Workbench;
using Content.Shared.Placeable;
namespace Content.Server._CP14.Workbench;
public sealed partial class CP14WorkbenchSystem
{
[Dependency] private readonly CP14SharedSkillSystem _skill = default!;
private void OnCraft(Entity<CP14WorkbenchComponent> entity, ref CP14WorkbenchUiCraftMessage args)
{
if (!entity.Comp.Recipes.Contains(args.Recipe))
@@ -20,9 +24,12 @@ public sealed partial class CP14WorkbenchSystem
StartCraft(entity, args.Actor, prototype);
}
private void UpdateUIRecipes(Entity<CP14WorkbenchComponent> entity, EntityUid user)
private void UpdateUIRecipes(Entity<CP14WorkbenchComponent> entity)
{
var placedEntities = _lookup.GetEntitiesInRange(Transform(entity).Coordinates, entity.Comp.WorkbenchRadius);
if (!TryComp<ItemPlacerComponent>(entity.Owner, out var placer))
return;
var placedEntities = placer.PlacedEntities;
var recipes = new List<CP14WorkbenchUiRecipesEntry>();
foreach (var recipeId in entity.Comp.Recipes)
@@ -31,21 +38,16 @@ public sealed partial class CP14WorkbenchSystem
continue;
var canCraft = true;
var hidden = false;
foreach (var requirement in indexedRecipe.Requirements)
{
if (!requirement.CheckRequirement(EntityManager, _proto, placedEntities, user))
if (!requirement.CheckRequirement(EntityManager, _proto, placedEntities))
{
canCraft = false;
if (requirement.HideRecipe)
hidden = true;
break;
}
}
if (hidden)
continue;
var entry = new CP14WorkbenchUiRecipesEntry(recipeId, canCraft);
recipes.Add(entry);

View File

@@ -6,12 +6,11 @@
using System.Numerics;
using Content.Server.DoAfter;
using Content.Server.Popups;
using Content.Server.Stack;
using Content.Shared._CP14.Skill;
using Content.Shared._CP14.Workbench;
using Content.Shared._CP14.Workbench.Prototypes;
using Content.Shared.Chemistry.EntitySystems;
using Content.Shared.DoAfter;
using Content.Shared.Stacks;
using Content.Shared.Placeable;
using Content.Shared.UserInterface;
using Robust.Server.Audio;
using Robust.Server.GameObjects;
@@ -25,26 +24,21 @@ public sealed partial class CP14WorkbenchSystem : CP14SharedWorkbenchSystem
[Dependency] private readonly AudioSystem _audio = default!;
[Dependency] private readonly EntityLookupSystem _lookup = default!;
[Dependency] private readonly DoAfterSystem _doAfter = default!;
[Dependency] private readonly StackSystem _stack = default!;
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly PopupSystem _popup = default!;
[Dependency] private readonly UserInterfaceSystem _userInterface = default!;
[Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly IRobustRandom _random = default!;
private EntityQuery<MetaDataComponent> _metaQuery;
private EntityQuery<StackComponent> _stackQuery;
public override void Initialize()
{
base.Initialize();
_metaQuery = GetEntityQuery<MetaDataComponent>();
_stackQuery = GetEntityQuery<StackComponent>();
SubscribeLocalEvent<CP14WorkbenchComponent, MapInitEvent>(OnMapInit);
SubscribeLocalEvent<CP14WorkbenchComponent, ItemPlacedEvent>(OnItemPlaced);
SubscribeLocalEvent<CP14WorkbenchComponent, ItemRemovedEvent>(OnItemRemoved);
SubscribeLocalEvent<CP14WorkbenchComponent, BeforeActivatableUIOpenEvent>(OnBeforeUIOpen);
SubscribeLocalEvent<CP14WorkbenchComponent, CP14WorkbenchUiCraftMessage>(OnCraft);
@@ -65,9 +59,19 @@ public sealed partial class CP14WorkbenchSystem : CP14SharedWorkbenchSystem
}
}
private void OnItemRemoved(Entity<CP14WorkbenchComponent> ent, ref ItemRemovedEvent args)
{
UpdateUIRecipes(ent);
}
private void OnItemPlaced(Entity<CP14WorkbenchComponent> ent, ref ItemPlacedEvent args)
{
UpdateUIRecipes(ent);
}
private void OnBeforeUIOpen(Entity<CP14WorkbenchComponent> ent, ref BeforeActivatableUIOpenEvent args)
{
UpdateUIRecipes(ent, args.User);
UpdateUIRecipes(ent);
}
private void OnCraftFinished(Entity<CP14WorkbenchComponent> ent, ref CP14CraftDoAfterEvent args)
@@ -97,7 +101,7 @@ public sealed partial class CP14WorkbenchSystem : CP14SharedWorkbenchSystem
foreach (var req in recipe.Requirements)
{
req.PostCraft(EntityManager, _proto, placedEntities, args.User);
req.PostCraft(EntityManager, _proto, placedEntities);
}
//We teleport result to workbench AFTER craft.
@@ -106,7 +110,7 @@ public sealed partial class CP14WorkbenchSystem : CP14SharedWorkbenchSystem
_transform.SetCoordinates(resultEntity, Transform(ent).Coordinates.Offset(new Vector2(_random.NextFloat(-0.25f, 0.25f), _random.NextFloat(-0.25f, 0.25f))));
}
UpdateUIRecipes(ent, args.User);
UpdateUIRecipes(ent);
args.Handled = true;
}
@@ -137,9 +141,14 @@ public sealed partial class CP14WorkbenchSystem : CP14SharedWorkbenchSystem
private bool CanCraftRecipe(CP14WorkbenchRecipePrototype recipe, HashSet<EntityUid> entities, EntityUid user)
{
foreach (var skill in recipe.RequiredSkills)
{
if (!_skill.HaveSkill(user, skill))
return false;
}
foreach (var req in recipe.Requirements)
{
if (!req.CheckRequirement(EntityManager, _proto, entities, user))
if (!req.CheckRequirement(EntityManager, _proto, entities))
return false;
}

View File

@@ -1,17 +0,0 @@
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
namespace Content.Shared._CP14.ResearchTable;
[RegisterComponent, NetworkedComponent]
public sealed partial class CP14ResearchTableComponent : Component
{
[DataField]
public float ResearchSpeed = 3f;
[DataField]
public float ResearchRadius = 0.5f;
[DataField]
public SoundSpecifier ResearchSound = new SoundCollectionSpecifier("PaperScribbles");
}

View File

@@ -1,19 +0,0 @@
using Content.Shared._CP14.Skill.Prototypes;
using Content.Shared.DoAfter;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
namespace Content.Shared._CP14.ResearchTable;
public abstract class CP14SharedResearchSystem : EntitySystem
{
}
[Serializable, NetSerializable]
public sealed partial class CP14ResearchDoAfterEvent : DoAfterEvent
{
[DataField(required: true)]
public ProtoId<CP14SkillPrototype> Skill = default!;
public override DoAfterEvent Clone() => this;
}

View File

@@ -1,61 +0,0 @@
using Content.Shared._CP14.Skill.Prototypes;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
namespace Content.Shared._CP14.Skill;
[Serializable, NetSerializable]
public enum CP14ResearchTableUiKey
{
Key,
}
[Serializable, NetSerializable]
public sealed class CP14ResearchMessage(ProtoId<CP14SkillPrototype> skill) : BoundUserInterfaceMessage
{
public readonly ProtoId<CP14SkillPrototype> Skill = skill;
}
[Serializable, NetSerializable]
public sealed class CP14ResearchTableUiState(List<CP14ResearchUiEntry> skills) : BoundUserInterfaceState
{
public readonly List<CP14ResearchUiEntry> Skills = skills;
}
[Serializable, NetSerializable]
public readonly struct CP14ResearchUiEntry(ProtoId<CP14SkillPrototype> protoId, bool craftable) : IEquatable<CP14ResearchUiEntry>
{
public readonly ProtoId<CP14SkillPrototype> ProtoId = protoId;
public readonly bool Craftable = craftable;
public int CompareTo(CP14ResearchUiEntry other)
{
return Craftable.CompareTo(other.Craftable);
}
public override bool Equals(object? obj)
{
return obj is CP14ResearchUiEntry other && Equals(other);
}
public bool Equals(CP14ResearchUiEntry other)
{
return ProtoId.Id == other.ProtoId.Id;
}
public override int GetHashCode()
{
return HashCode.Combine(ProtoId, Craftable);
}
public override string ToString()
{
return $"{ProtoId} ({Craftable})";
}
public static int CompareTo(CP14ResearchUiEntry left, CP14ResearchUiEntry right)
{
return right.CompareTo(left);
}
}

View File

@@ -1,4 +1,3 @@
using Content.Shared._CP14.ResearchTable;
using Content.Shared._CP14.Skill.Prototypes;
using Content.Shared.FixedPoint;
using Robust.Shared.GameStates;
@@ -11,7 +10,7 @@ namespace Content.Shared._CP14.Skill.Components;
/// Component that stores the skills learned by a player and their progress in the skill trees.
/// </summary>
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)]
[Access(typeof(CP14SharedSkillSystem), typeof(CP14SharedResearchSystem))]
[Access(typeof(CP14SharedSkillSystem))]
public sealed partial class CP14SkillStorageComponent : Component
{
/// <summary>

View File

@@ -36,20 +36,12 @@ public sealed partial class UnlockRecipes : CP14SkillEffect
var affectedRecipes = new List<CP14WorkbenchRecipePrototype>();
foreach (var recipe in allRecipes)
{
foreach (var req in recipe.Requirements)
foreach (var req in recipe.RequiredSkills)
{
switch (req)
if (req == skill)
{
case SkillRequired skillReq:
foreach (var skillReqSkill in skillReq.Skills)
{
if (skillReqSkill == skill)
{
affectedRecipes.Add(recipe);
break;
}
}
break;
affectedRecipes.Add(recipe);
break;
}
}
}

View File

@@ -97,7 +97,7 @@ public abstract partial class CP14SharedTradingPlatformSystem : EntitySystem
foreach (var requirement in indexedRequest.Requirements)
{
if (!requirement.CheckRequirement(EntityManager, Proto, itemPlacer.PlacedEntities, null))
if (!requirement.CheckRequirement(EntityManager, Proto, itemPlacer.PlacedEntities))
return false;
}

View File

@@ -16,39 +16,25 @@ public enum CP14WorkbenchUiKey
}
[Serializable, NetSerializable]
public sealed class CP14WorkbenchUiCraftMessage : BoundUserInterfaceMessage
public sealed class CP14WorkbenchUiCraftMessage(ProtoId<CP14WorkbenchRecipePrototype> recipe)
: BoundUserInterfaceMessage
{
public readonly ProtoId<CP14WorkbenchRecipePrototype> Recipe;
public CP14WorkbenchUiCraftMessage(ProtoId<CP14WorkbenchRecipePrototype> recipe)
{
Recipe = recipe;
}
public readonly ProtoId<CP14WorkbenchRecipePrototype> Recipe = recipe;
}
[Serializable, NetSerializable]
public sealed class CP14WorkbenchUiRecipesState : BoundUserInterfaceState
public sealed class CP14WorkbenchUiRecipesState(List<CP14WorkbenchUiRecipesEntry> recipes) : BoundUserInterfaceState
{
public readonly List<CP14WorkbenchUiRecipesEntry> Recipes;
public CP14WorkbenchUiRecipesState(List<CP14WorkbenchUiRecipesEntry> recipes)
{
Recipes = recipes;
}
public readonly List<CP14WorkbenchUiRecipesEntry> Recipes = recipes;
}
[Serializable, NetSerializable]
public readonly struct CP14WorkbenchUiRecipesEntry : IEquatable<CP14WorkbenchUiRecipesEntry>
public readonly struct CP14WorkbenchUiRecipesEntry(ProtoId<CP14WorkbenchRecipePrototype> protoId, bool craftable)
: IEquatable<CP14WorkbenchUiRecipesEntry>
{
public readonly ProtoId<CP14WorkbenchRecipePrototype> ProtoId;
public readonly bool Craftable;
public CP14WorkbenchUiRecipesEntry(ProtoId<CP14WorkbenchRecipePrototype> protoId, bool craftable)
{
ProtoId = protoId;
Craftable = craftable;
}
public readonly ProtoId<CP14WorkbenchRecipePrototype> ProtoId = protoId;
public readonly bool Craftable = craftable;
public int CompareTo(CP14WorkbenchUiRecipesEntry other)
{

View File

@@ -3,6 +3,7 @@
* https://github.com/space-wizards/space-station-14/blob/master/LICENSE.TXT
*/
using Content.Shared._CP14.Skill.Prototypes;
using Content.Shared.Tag;
using Robust.Shared.Audio;
using Robust.Shared.Prototypes;
@@ -27,6 +28,9 @@ public sealed class CP14WorkbenchRecipePrototype : IPrototype
[DataField(required: true)]
public List<CP14WorkbenchCraftRequirement> Requirements = new();
[DataField]
public HashSet<ProtoId<CP14SkillPrototype>> RequiredSkills = new();
[DataField(required: true)]
public EntProtoId Result;

View File

@@ -12,8 +12,6 @@ namespace Content.Shared._CP14.Workbench.Requirements;
public sealed partial class MaterialResource : CP14WorkbenchCraftRequirement
{
public override bool HideRecipe { get; set; } = false;
[DataField(required: true)]
public ProtoId<MaterialPrototype> Material;
@@ -23,8 +21,7 @@ public sealed partial class MaterialResource : CP14WorkbenchCraftRequirement
public override bool CheckRequirement(
EntityManager entManager,
IPrototypeManager protoManager,
HashSet<EntityUid> placedEntities,
EntityUid? user)
HashSet<EntityUid> placedEntities)
{
var count = 0;
foreach (var ent in placedEntities)
@@ -56,7 +53,7 @@ public sealed partial class MaterialResource : CP14WorkbenchCraftRequirement
return true;
}
public override void PostCraft(EntityManager entManager, IPrototypeManager protoManager, HashSet<EntityUid> placedEntities, EntityUid? user)
public override void PostCraft(EntityManager entManager, IPrototypeManager protoManager, HashSet<EntityUid> placedEntities)
{
var stackSystem = entManager.System<SharedStackSystem>();
@@ -118,11 +115,6 @@ public sealed partial class MaterialResource : CP14WorkbenchCraftRequirement
return $"{Loc.GetString(indexedMaterial.Name)} x{Count}";
}
public override EntityPrototype? GetRequirementEntityView(IPrototypeManager protoManager)
{
return null;
}
public override SpriteSpecifier? GetRequirementTexture(IPrototypeManager protoManager)
{
return !protoManager.TryIndex(Material, out var indexedMaterial) ? null : indexedMaterial.Icon;

View File

@@ -11,8 +11,6 @@ namespace Content.Shared._CP14.Workbench.Requirements;
public sealed partial class ProtoIdResource : CP14WorkbenchCraftRequirement
{
public override bool HideRecipe { get; set; } = false;
[DataField(required: true)]
public EntProtoId ProtoId;
@@ -21,15 +19,14 @@ public sealed partial class ProtoIdResource : CP14WorkbenchCraftRequirement
public override bool CheckRequirement(EntityManager entManager,
IPrototypeManager protoManager,
HashSet<EntityUid> placedEntities,
EntityUid? user)
HashSet<EntityUid> placedEntities)
{
var indexedIngredients = IndexIngredients(entManager, placedEntities);
return indexedIngredients.TryGetValue(ProtoId, out var availableQuantity) && availableQuantity >= Count;
}
public override void PostCraft(EntityManager entManager,IPrototypeManager protoManager, HashSet<EntityUid> placedEntities, EntityUid? user)
public override void PostCraft(EntityManager entManager,IPrototypeManager protoManager, HashSet<EntityUid> placedEntities)
{
var requiredCount = Count;
@@ -77,11 +74,6 @@ public sealed partial class ProtoIdResource : CP14WorkbenchCraftRequirement
return indexedProto;
}
public override SpriteSpecifier? GetRequirementTexture(IPrototypeManager protoManager)
{
return null;
}
private Dictionary<EntProtoId, int> IndexIngredients(EntityManager entManager, HashSet<EntityUid> ingredients)
{
var indexedIngredients = new Dictionary<EntProtoId, int>();

View File

@@ -1,63 +0,0 @@
using Content.Shared._CP14.Skill;
using Content.Shared._CP14.Skill.Prototypes;
using Content.Shared._CP14.Workbench.Prototypes;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
namespace Content.Shared._CP14.Workbench.Requirements;
public sealed partial class SkillRequired : CP14WorkbenchCraftRequirement
{
public override bool HideRecipe { get; set; } = true;
[DataField(required: true)]
public List<ProtoId<CP14SkillPrototype>> Skills = new();
public override bool CheckRequirement(EntityManager entManager,
IPrototypeManager protoManager,
HashSet<EntityUid> placedEntities,
EntityUid? user)
{
if (user is null)
return false;
var knowledgeSystem = entManager.System<CP14SharedSkillSystem>();
var haveAllSkills = true;
foreach (var skill in Skills)
{
if (!knowledgeSystem.HaveSkill(user.Value, skill))
{
haveAllSkills = false;
break;
}
}
return haveAllSkills;
}
public override double GetPrice(EntityManager entManager,
IPrototypeManager protoManager)
{
return 0;
}
public override void PostCraft(EntityManager entManager, IPrototypeManager protoManager, HashSet<EntityUid> placedEntities, EntityUid? user)
{
}
public override string GetRequirementTitle(IPrototypeManager protoManager)
{
return string.Empty;
}
public override EntityPrototype? GetRequirementEntityView(IPrototypeManager protoManager)
{
return null;
}
public override SpriteSpecifier? GetRequirementTexture(IPrototypeManager protoManager)
{
return null;
}
}

View File

@@ -0,0 +1,116 @@
using Content.Shared.Chemistry.EntitySystems;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.FixedPoint;
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.Workbench.Requirements;
public sealed partial class SolutionResource : CP14WorkbenchCraftRequirement
{
[DataField(required: true)]
public ProtoId<ReagentPrototype> Reagent = default!;
/// <summary>
/// How much impurity from other reagents is allowed?
/// </summary>
[DataField(required: true)]
public float Purity = 1f;
[DataField(required: true)]
public FixedPoint2 Amount = 1f;
[DataField]
public EntProtoId DummyEntityIcon = "CP14LiquidDropDummy";
public override bool CheckRequirement(EntityManager entManager,
IPrototypeManager protoManager,
HashSet<EntityUid> placedEntities)
{
var solutionSys = entManager.System<SharedSolutionContainerSystem>();
foreach (var ent in placedEntities)
{
if (!solutionSys.TryGetDrawableSolution(ent, out var soln, out var solution))
continue;
var volume = solution.Volume;
foreach (var (id, quantity) in solution.Contents)
{
if (id.Prototype != Reagent)
continue;
if (quantity < Amount)
continue;
//Purity check
if (quantity / volume < Purity)
continue;
return true;
}
}
return false;
}
public override void PostCraft(EntityManager entManager, IPrototypeManager protoManager, HashSet<EntityUid> placedEntities)
{
var solutionSys = entManager.System<SharedSolutionContainerSystem>();
foreach (var ent in placedEntities)
{
if (!solutionSys.TryGetDrawableSolution(ent, out var soln, out var solution))
continue;
var volume = solution.Volume;
foreach (var (id, quantity) in solution.Contents)
{
if (id.Prototype != Reagent)
continue;
if (quantity < Amount)
continue;
//Purity check
if (quantity / volume < Purity)
continue;
solutionSys.RemoveEachReagent(soln.Value, Amount);
return;
}
}
}
public override double GetPrice(EntityManager entManager, IPrototypeManager protoManager)
{
if (!protoManager.TryIndex(Reagent, out var indexedReagent))
return 0;
return indexedReagent.PricePerUnit * (double)Amount;
}
public override string GetRequirementTitle(IPrototypeManager protoManager)
{
if (!protoManager.TryIndex(Reagent, out var indexedReagent))
return string.Empty;
return Loc.GetString("cp14-workbench-reagent-req",
("reagent", indexedReagent.LocalizedName),
("count", Amount),
("purity", Purity * 100));
}
public override EntityPrototype? GetRequirementEntityView(IPrototypeManager protoManager)
{
if (!protoManager.TryIndex(DummyEntityIcon, out var indexedEnt))
return null;
return indexedEnt;
}
public override Color GetRequirementColor(IPrototypeManager protoManager)
{
if (!protoManager.TryIndex(Reagent, out var indexedReagent))
return Color.White;
return indexedReagent.SubstanceColor;
}
}

View File

@@ -12,8 +12,6 @@ namespace Content.Shared._CP14.Workbench.Requirements;
public sealed partial class StackGroupResource : CP14WorkbenchCraftRequirement
{
public override bool HideRecipe { get; set; } = false;
[DataField(required: true)]
public ProtoId<CP14StackGroupPrototype> Group;
@@ -22,8 +20,7 @@ public sealed partial class StackGroupResource : CP14WorkbenchCraftRequirement
public override bool CheckRequirement(EntityManager entManager,
IPrototypeManager protoManager,
HashSet<EntityUid> placedEntities,
EntityUid? user)
HashSet<EntityUid> placedEntities)
{
if (!protoManager.TryIndex(Group, out var indexedGroup))
return false;
@@ -47,8 +44,7 @@ public sealed partial class StackGroupResource : CP14WorkbenchCraftRequirement
}
public override void PostCraft(EntityManager entManager, IPrototypeManager protoManager,
HashSet<EntityUid> placedEntities,
EntityUid? user)
HashSet<EntityUid> placedEntities)
{
var stackSystem = entManager.System<SharedStackSystem>();
@@ -75,13 +71,6 @@ public sealed partial class StackGroupResource : CP14WorkbenchCraftRequirement
}
}
public override double GetPrice(EntityManager entManager,
IPrototypeManager protoManager)
{
//Idk how to price this, so we just return 0.
return 0;
}
public override string GetRequirementTitle(IPrototypeManager protoManager)
{
var indexedGroup = protoManager.Index(Group);
@@ -89,11 +78,6 @@ public sealed partial class StackGroupResource : CP14WorkbenchCraftRequirement
return $"{Loc.GetString(indexedGroup.Name)} x{Count}";
}
public override EntityPrototype? GetRequirementEntityView(IPrototypeManager protoManager)
{
return null;
}
public override SpriteSpecifier? GetRequirementTexture(IPrototypeManager protoManager)
{
var indexedGroup = protoManager.Index(Group);

View File

@@ -4,7 +4,6 @@
*/
using Content.Shared._CP14.Trading.Systems;
using Content.Shared._CP14.Workbench.Prototypes;
using Content.Shared.Stacks;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
@@ -13,8 +12,6 @@ namespace Content.Shared._CP14.Workbench.Requirements;
public sealed partial class StackResource : CP14WorkbenchCraftRequirement
{
public override bool HideRecipe { get; set; } = false;
[DataField(required: true)]
public ProtoId<StackPrototype> Stack;
@@ -23,8 +20,7 @@ public sealed partial class StackResource : CP14WorkbenchCraftRequirement
public override bool CheckRequirement(EntityManager entManager,
IPrototypeManager protoManager,
HashSet<EntityUid> placedEntities,
EntityUid? user)
HashSet<EntityUid> placedEntities)
{
var count = 0;
foreach (var ent in placedEntities)
@@ -45,8 +41,7 @@ public sealed partial class StackResource : CP14WorkbenchCraftRequirement
}
public override void PostCraft(EntityManager entManager, IPrototypeManager protoManager,
HashSet<EntityUid> placedEntities,
EntityUid? user)
HashSet<EntityUid> placedEntities)
{
var stackSystem = entManager.System<SharedStackSystem>();
@@ -92,11 +87,6 @@ public sealed partial class StackResource : CP14WorkbenchCraftRequirement
return $"{Loc.GetString(indexedStack.Name)} x{Count}";
}
public override EntityPrototype? GetRequirementEntityView(IPrototypeManager protoManager)
{
return null;
}
public override SpriteSpecifier? GetRequirementTexture(IPrototypeManager protoManager)
{
return !protoManager.TryIndex(Stack, out var indexedStack) ? null : indexedStack.Icon;

View File

@@ -3,7 +3,6 @@
* https://github.com/space-wizards/space-station-14/blob/master/LICENSE.TXT
*/
using Content.Shared._CP14.Workbench.Prototypes;
using Content.Shared.Tag;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
@@ -12,8 +11,6 @@ namespace Content.Shared._CP14.Workbench.Requirements;
public sealed partial class TagResource : CP14WorkbenchCraftRequirement
{
public override bool HideRecipe { get; set; } = false;
[DataField(required: true)]
public ProtoId<TagPrototype> Tag;
@@ -29,8 +26,7 @@ public sealed partial class TagResource : CP14WorkbenchCraftRequirement
public override bool CheckRequirement(
EntityManager entManager,
IPrototypeManager protoManager,
HashSet<EntityUid> placedEntities,
EntityUid? user)
HashSet<EntityUid> placedEntities)
{
var tagSystem = entManager.System<TagSystem>();
@@ -49,7 +45,7 @@ public sealed partial class TagResource : CP14WorkbenchCraftRequirement
return true;
}
public override void PostCraft(EntityManager entManager, IPrototypeManager protoManager, HashSet<EntityUid> placedEntities, EntityUid? user)
public override void PostCraft(EntityManager entManager, IPrototypeManager protoManager, HashSet<EntityUid> placedEntities)
{
var tagSystem = entManager.System<TagSystem>();
@@ -66,12 +62,6 @@ public sealed partial class TagResource : CP14WorkbenchCraftRequirement
entManager.DeleteEntity(placedEntity);
}
}
public override double GetPrice(EntityManager entManager,
IPrototypeManager protoManager)
{
//Idk how to price tags, so just return 0 for now.
return 0;
}
public override string GetRequirementTitle(IPrototypeManager protoManager)
{
@@ -81,11 +71,6 @@ public sealed partial class TagResource : CP14WorkbenchCraftRequirement
return $"{Loc.GetString(Title)} x{Count}";
}
public override EntityPrototype? GetRequirementEntityView(IPrototypeManager protoManager)
{
return null;
}
public override SpriteSpecifier? GetRequirementTexture(IPrototypeManager protoManager)
{
return Texture;

View File

@@ -3,7 +3,6 @@
* https://github.com/space-wizards/space-station-14/blob/master/LICENSE.TXT
*/
using Content.Shared._CP14.Workbench.Prototypes;
using JetBrains.Annotations;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
@@ -14,43 +13,59 @@ namespace Content.Shared._CP14.Workbench;
[MeansImplicitUse]
public abstract partial class CP14WorkbenchCraftRequirement
{
/// <summary>
/// If true, failure to fulfill this condition will hide recipes from the possible craft workbench menu
/// </summary>
public abstract bool HideRecipe { get; set; }
/// <summary>
/// Here a check is made that the recipe as a whole can be fulfilled at the current moment. Do not add anything that affects gameplay here, and only perform checks here.
/// </summary>
/// <returns></returns>
public abstract bool CheckRequirement(EntityManager entManager,
IPrototypeManager protoManager,
HashSet<EntityUid> placedEntities,
EntityUid? user);
HashSet<EntityUid> placedEntities);
/// <summary>
/// An event that is triggered after crafting. This is the place to put important things like removing items, spending stacks or other things.
/// </summary>
public abstract void PostCraft(EntityManager entManager,
public virtual void PostCraft(EntityManager entManager,
IPrototypeManager protoManager,
HashSet<EntityUid> placedEntities,
EntityUid? user);
HashSet<EntityUid> placedEntities)
{
public abstract double GetPrice(EntityManager entManager,
IPrototypeManager protoManager);
}
public virtual double GetPrice(EntityManager entManager,
IPrototypeManager protoManager)
{
return 0;
}
/// <summary>
/// This text will be displayed in the description of the craft recipe. Write something like Wooden planks: х10 here
/// </summary>
public abstract string GetRequirementTitle(IPrototypeManager protoManager);
public virtual string GetRequirementTitle(IPrototypeManager protoManager)
{
return string.Empty;
}
/// <summary>
/// You can specify an icon generated from an entity. It will support layering, colour changes and other layer options. Return null to disable.
/// </summary>
public abstract EntityPrototype? GetRequirementEntityView(IPrototypeManager protoManager);
public virtual EntityPrototype? GetRequirementEntityView(IPrototypeManager protoManager)
{
return null;
}
/// <summary>
/// You can specify the texture directly. Return null to disable.
/// </summary>
public abstract SpriteSpecifier? GetRequirementTexture(IPrototypeManager protoManager);
public virtual SpriteSpecifier? GetRequirementTexture(IPrototypeManager protoManager)
{
return null;
}
/// <summary>
/// Optional, allows you to repaint the icon.
/// </summary>
public virtual Color GetRequirementColor(IPrototypeManager protoManager)
{
return Color.White;
}
}

View File

@@ -3,4 +3,6 @@ cp14-workbench-ui-title = Item creation
cp14-workbench-craft = Craft
cp14-workbench-recipe-list = Recipe:
cp14-workbench-cant-craft = Craft failed!
cp14-workbench-cant-craft = Craft failed!
cp14-workbench-reagent-req = {$count}u {$reagent} with {$purity}% purity

View File

@@ -3,4 +3,6 @@ cp14-workbench-ui-title = Создание предметов
cp14-workbench-craft = Создать
cp14-workbench-recipe-list = Рецепт:
cp14-workbench-cant-craft = Крафт не удался!
cp14-workbench-cant-craft = Крафт не удался!
cp14-workbench-reagent-req = {$count}u {$reagent} с {$purity}% чистоты

View File

@@ -113,3 +113,11 @@
tags:
- HideContextMenu
- type: entity
id: CP14LiquidDropDummy
categories: [ HideSpawnMenu ]
components:
- type: Sprite
sprite: _CP14/Objects/Misc/liquid_drop.rsi
layers:
- state: liq-1

View File

@@ -49,40 +49,6 @@
- type: Stack
count: 3
- type: entity
parent: BaseItem
id: CP14CrystalShardQuartz
name: quartz shard
description: Natural quartz crystals that can absorb the magical energy of the world around them.
categories: [ ForkFiltered ]
components:
- type: Tag
tags:
- CP14FitInMortar
- type: Item
size: Tiny
- type: Sprite
sprite: _CP14/Structures/Flora/Crystal/crystal_shard.rsi
layers:
- state: shard0
map: ["random"]
- type: RandomSprite
available:
- random:
shard0: ""
shard1: ""
shard2: ""
shard3: ""
- type: Extractable
juiceSolution:
reagents:
- ReagentId: CP14GroundQuartz
Quantity: 7
- type: PhysicalComposition
materialComposition:
CP14Glass: 10
- type: entity
parent: BaseItem
id: CP14DimensitCrystal

View File

@@ -0,0 +1,148 @@
- type: entity
parent: BaseItem
id: CP14CrystalShardQuartz
name: quartz shard
description: Natural quartz crystals that can absorb the magical energy of the world around them.
categories: [ ForkFiltered ]
components:
- type: Tag
tags:
- CP14FitInMortar
- type: Item
size: Tiny
- type: Sprite
sprite: _CP14/Structures/Flora/Crystal/crystal_shard.rsi
layers:
- state: shard0
map: ["random"]
- type: RandomSprite
available:
- random:
shard0: ""
shard1: ""
shard2: ""
shard3: ""
- type: Extractable
juiceSolution:
reagents:
- ReagentId: CP14GroundQuartz
Quantity: 5
- type: PhysicalComposition
materialComposition:
CP14Glass: 10
# Basic 6
- type: entity
parent: CP14CrystalShardQuartz
id: CP14CrystalShardQuartzEarth
name: terra shard
suffix: Earth
components:
- type: Sprite
color: "#1cea42"
- type: Extractable
juiceSolution:
reagents:
- ReagentId: CP14GroundQuartz
Quantity: 5
- ReagentId: CP14EssenceEarth
Quantity: 5
- type: entity
parent: CP14CrystalShardQuartz
id: CP14CrystalShardQuartzFire
name: ignis shard
suffix: Fire
components:
- type: Sprite
color: "#d9741c"
- type: Extractable
juiceSolution:
reagents:
- ReagentId: CP14GroundQuartz
Quantity: 5
- ReagentId: CP14EssenceFire
Quantity: 5
- type: entity
parent: CP14CrystalShardQuartz
id: CP14CrystalShardQuartzWater
name: aqua shard
suffix: Water
components:
- type: Sprite
color: "#1c94d9"
- type: Extractable
juiceSolution:
reagents:
- ReagentId: CP14GroundQuartz
Quantity: 5
- ReagentId: CP14EssenceWater
Quantity: 5
- type: entity
parent: CP14CrystalShardQuartz
id: CP14CrystalShardQuartzAir
name: aer shard
suffix: Air
components:
- type: Sprite
color: "#fdfe86"
- type: Extractable
juiceSolution:
reagents:
- ReagentId: CP14GroundQuartz
Quantity: 5
- ReagentId: CP14EssenceAir
Quantity: 5
- type: entity
parent: CP14CrystalShardQuartz
id: CP14CrystalShardQuartzOrder
name: ordo shard
suffix: Order
components:
- type: Sprite
color: "#d9d9d9"
- type: Extractable
juiceSolution:
reagents:
- ReagentId: CP14GroundQuartz
Quantity: 5
- ReagentId: CP14EssenceOrder
Quantity: 5
- type: entity
parent: CP14CrystalShardQuartz
id: CP14CrystalShardQuartzChaos
name: perditio shard
suffix: Chaos
components:
- type: Sprite
color: "#4d4d4d"
- type: Extractable
juiceSolution:
reagents:
- ReagentId: CP14GroundQuartz
Quantity: 5
- ReagentId: CP14EssenceChaos
Quantity: 5
# Complex tier 2
- type: entity
parent: CP14CrystalShardQuartz
id: CP14CrystalShardQuartzMagic
name: praecantatio shard
suffix: Magic
components:
- type: Sprite
color: "#5497d6"
- type: Extractable
juiceSolution:
reagents:
- ReagentId: CP14GroundQuartz
Quantity: 5
- ReagentId: CP14EssenceMagic
Quantity: 5

View File

@@ -95,3 +95,192 @@
- !type:DoActsBehavior
acts: [ "Destruction" ]
# Basic 6
- type: entity
id: CP14CrystalQuartzEarth
suffix: Earth
parent: CP14CrystalBase
components:
- type: Sprite
color: "#1cea42"
- type: PointLight
color: "#1cea42"
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 15
behaviors:
- !type:PlaySoundBehavior
sound:
collection: GlassBreak
- !type:SpawnEntitiesBehavior
spawn:
CP14CrystalShardQuartzEarth:
min: 1
max: 2
- !type:SpawnEntitiesBehavior
spawn:
CP14EssenceEarth:
min: 3
max: 5
- !type:DoActsBehavior
acts: [ "Destruction" ]
- type: entity
id: CP14CrystalQuartzFire
suffix: Fire
parent: CP14CrystalBase
components:
- type: Sprite
color: "#d9741c"
- type: PointLight
color: "#d9741c"
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 15
behaviors:
- !type:PlaySoundBehavior
sound:
collection: GlassBreak
- !type:SpawnEntitiesBehavior
spawn:
CP14CrystalShardQuartzFire:
min: 1
max: 2
- !type:SpawnEntitiesBehavior
spawn:
CP14EssenceFire:
min: 3
max: 5
- !type:DoActsBehavior
acts: [ "Destruction" ]
- type: entity
id: CP14CrystalQuartzWater
suffix: Water
parent: CP14CrystalBase
components:
- type: Sprite
color: "#1c94d9"
- type: PointLight
color: "#1c94d9"
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 15
behaviors:
- !type:PlaySoundBehavior
sound:
collection: GlassBreak
- !type:SpawnEntitiesBehavior
spawn:
CP14CrystalShardQuartzWater:
min: 1
max: 2
- !type:SpawnEntitiesBehavior
spawn:
CP14EssenceWater:
min: 3
max: 5
- !type:DoActsBehavior
acts: [ "Destruction" ]
- type: entity
id: CP14CrystalQuartzAir
suffix: Air
parent: CP14CrystalBase
components:
- type: Sprite
color: "#fdfe86"
- type: PointLight
color: "#fdfe86"
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 15
behaviors:
- !type:PlaySoundBehavior
sound:
collection: GlassBreak
- !type:SpawnEntitiesBehavior
spawn:
CP14CrystalShardQuartzAir:
min: 1
max: 2
- !type:SpawnEntitiesBehavior
spawn:
CP14EssenceAir:
min: 3
max: 5
- !type:DoActsBehavior
acts: [ "Destruction" ]
- type: entity
id: CP14CrystalQuartzOrder
suffix: Order
parent: CP14CrystalBase
components:
- type: Sprite
color: "#d9d9d9"
- type: PointLight
color: "#d9d9d9"
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 15
behaviors:
- !type:PlaySoundBehavior
sound:
collection: GlassBreak
- !type:SpawnEntitiesBehavior
spawn:
CP14CrystalShardQuartzOrder:
min: 1
max: 2
- !type:SpawnEntitiesBehavior
spawn:
CP14EssenceOrder:
min: 3
max: 5
- !type:DoActsBehavior
acts: [ "Destruction" ]
- type: entity
id: CP14CrystalQuartzChaos
suffix: Chaos
parent: CP14CrystalBase
components:
- type: Sprite
color: "#4d4d4d"
- type: PointLight
color: "#4d4d4d"
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 15
behaviors:
- !type:PlaySoundBehavior
sound:
collection: GlassBreak
- !type:SpawnEntitiesBehavior
spawn:
CP14CrystalShardQuartzChaos:
min: 1
max: 2
- !type:SpawnEntitiesBehavior
spawn:
CP14EssenceChaos:
min: 3
max: 5
- !type:DoActsBehavior
acts: [ "Destruction" ]
# Complex tier 1

View File

@@ -1,58 +0,0 @@
- type: entity
parent:
- BaseStructure
id: CP14ResearchTable
categories: [ ForkFiltered ]
name: research table
description: A place of research, experimentation and discovery that allows you to be smarter.
components:
- type: Sprite
snapCardinals: true
sprite: _CP14/Structures/Furniture/workbench.rsi
state: research_table
- type: Icon
sprite: _CP14/Structures/Furniture/workbench.rsi
state: research_table
- type: ActivatableUI
key: enum.CP14ResearchTableUiKey.Key
requiresComplex: true
singleUser: true
- type: Climbable
- type: Clickable
- type: CP14ResearchTable
- type: InteractionOutline
- type: PlaceableSurface
- type: UserInterface
interfaces:
enum.CP14ResearchTableUiKey.Key:
type: CP14ResearchTableBoundUserInterface
- type: Damageable
damageContainer: Inorganic
damageModifierSet: Wood
- type: Destructible
thresholds:
- trigger:
!type:DamageTypeTrigger
damageType: Heat
damage: 40
behaviors:
- !type:DoActsBehavior
acts: ["Destruction"]
- !type:PlaySoundBehavior
sound:
collection: WoodDestroy
- trigger:
!type:DamageTrigger
damage: 60
behaviors:
- !type:DoActsBehavior
acts: ["Destruction"]
- !type:PlaySoundBehavior
sound:
collection: WoodDestroy
- !type:SpawnEntitiesBehavior
spawn:
CP14WoodenPlanks1:
min: 1
max: 2

View File

@@ -21,7 +21,6 @@
- type: CP14Workbench
craftSpeed: 1
- type: InteractionOutline
- type: PlaceableSurface
- type: UserInterface
interfaces:
enum.CP14WorkbenchUiKey.Key:
@@ -55,6 +54,31 @@
CP14WoodenPlanks1:
min: 1
max: 2
- type: PlaceableSurface
- type: ItemPlacer
maxEntities: 0
- type: Fixtures
fixtures:
fix1:
shape:
!type:PhysShapeAabb
bounds: "-0.45,-0.45,0.45,0.45"
density: 55
mask: # tables should collide with other tables
- TableMask
layer:
- TableLayer
fix2:
shape:
!type:PhysShapeAabb
bounds: "-0.4,-0.4,0.4,0.4"
mask:
- TabletopMachineMask
layer:
- Impassable
- MidImpassable
- LowImpassable
hard: false
- type: entity
parent:

View File

@@ -2,7 +2,7 @@
id: Quartz
levels:
min: 1
max: 8
max: 10
categories:
Reward: 0.15
layers:
@@ -15,3 +15,118 @@
minGroupSize: 1
maxGroupSize: 5
- type: cp14DemiplaneModifier
id: CP14CrystalQuartzEarth
levels:
min: 1
max: 10
generationWeight: 0.1
requiredTags:
- CP14DemiplaneUnderground
categories:
Reward: 0.15
layers:
- !type:CP14OreDunGen
tileMask:
- CP14FloorBase
- CP14FloorIce
entity: CP14CrystalQuartzEarth
count: 15
minGroupSize: 1
maxGroupSize: 2
- type: cp14DemiplaneModifier
id: CP14CrystalQuartzFire
levels:
min: 1
max: 10
generationWeight: 0.1
requiredTags:
- CP14DemiplaneHot
categories:
Reward: 0.15
layers:
- !type:CP14OreDunGen
tileMask:
- CP14FloorBase
- CP14FloorIce
entity: CP14CrystalQuartzFire
count: 15
minGroupSize: 1
maxGroupSize: 2
- type: cp14DemiplaneModifier
id: CP14CrystalQuartzWater
levels:
min: 1
max: 10
generationWeight: 0.1
requiredTags:
- CP14DemiplaneWater
categories:
Reward: 0.15
layers:
- !type:CP14OreDunGen
tileMask:
- CP14FloorBase
- CP14FloorIce
entity: CP14CrystalQuartzWater
count: 15
minGroupSize: 1
maxGroupSize: 2
- type: cp14DemiplaneModifier
id: CP14CrystalQuartzAir
levels:
min: 1
max: 10
generationWeight: 0.1
requiredTags:
- CP14DemiplaneOpenSky
categories:
Reward: 0.15
layers:
- !type:CP14OreDunGen
tileMask:
- CP14FloorBase
- CP14FloorIce
entity: CP14CrystalQuartzAir
count: 15
minGroupSize: 1
maxGroupSize: 2
- type: cp14DemiplaneModifier
id: CP14CrystalQuartzOrder
levels:
min: 1
max: 10
generationWeight: 0.1
categories:
Reward: 0.15
layers:
- !type:CP14OreDunGen
tileMask:
- CP14FloorBase
- CP14FloorIce
entity: CP14CrystalQuartzOrder
count: 15
minGroupSize: 1
maxGroupSize: 2
- type: cp14DemiplaneModifier
id: CP14CrystalQuartzChaos
levels:
min: 1
max: 10
generationWeight: 0.1
categories:
Reward: 0.15
layers:
- !type:CP14OreDunGen
tileMask:
- CP14FloorBase
- CP14FloorIce
entity: CP14CrystalQuartzChaos
count: 15
minGroupSize: 1
maxGroupSize: 2

View File

@@ -3,10 +3,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14WoodenPlanks
count: 2
@@ -20,10 +19,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 4
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 2
@@ -33,10 +31,9 @@
id: CP14PlatePie
tag: CP14RecipeAnvil
craftTime: 4
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar # Physical Composition in item
count: 1
@@ -47,11 +44,10 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 4
requiredSkills:
- IronMelting
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- IronMelting
- !type:StackResource
stack: CP14CopperBar # Physical Composition in item
count: 2
@@ -65,10 +61,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 2
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -79,10 +74,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 4
@@ -93,10 +87,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 2
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -107,10 +100,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 1
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -122,10 +114,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 1
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -137,10 +128,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 1
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 1
@@ -152,10 +142,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 1
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 1
@@ -167,10 +156,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 1
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -182,10 +170,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 1
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -197,10 +184,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 1
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 1
@@ -212,10 +198,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 1
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 1
@@ -227,10 +212,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 4
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -241,10 +225,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 4
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 1
@@ -255,11 +238,10 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- CopperMelting
- IronMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- IronMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -276,10 +258,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 5
@@ -293,10 +274,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 2
@@ -307,10 +287,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 3
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -321,10 +300,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 3
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -335,10 +313,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 3
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 1
@@ -349,10 +326,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 3
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 1
@@ -363,10 +339,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 2
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -377,10 +352,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 2
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -391,10 +365,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 2
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -405,10 +378,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 2
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 1
@@ -419,10 +391,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 2
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 1
@@ -433,10 +404,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 2
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:ProtoIdResource
protoId: CP14CrystalShardQuartz
count: 1
@@ -449,10 +419,9 @@
id: CP14Fork
tag: CP14RecipeAnvil
craftTime: 2
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -463,10 +432,9 @@
id: CP14Spoon
tag: CP14RecipeAnvil
craftTime: 2
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -477,10 +445,9 @@
id: CP14SteelGobletCopper
tag: CP14RecipeAnvil
craftTime: 2
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -490,10 +457,9 @@
id: CP14SteelGobletIron
tag: CP14RecipeAnvil
craftTime: 2
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -503,10 +469,9 @@
id: CP14SteelGobletGold
tag: CP14RecipeAnvil
craftTime: 2
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 1

View File

@@ -6,10 +6,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -20,10 +19,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 1
@@ -34,10 +32,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -48,10 +45,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 1
@@ -64,10 +60,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 6
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -78,10 +73,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 6
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 1
@@ -92,10 +86,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 6
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -106,10 +99,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 6
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 1

View File

@@ -6,10 +6,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 2
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -20,10 +19,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 1
@@ -34,10 +32,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -48,10 +45,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 2
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 1
@@ -64,10 +60,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 2
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -78,10 +73,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 2
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -92,10 +86,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 2
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 1
@@ -106,10 +99,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 2
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 1
@@ -122,10 +114,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 2
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -136,10 +127,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 2
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 1
@@ -150,10 +140,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 2
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -164,10 +153,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 2
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 1
@@ -180,10 +168,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 2
@@ -194,10 +181,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 2
@@ -208,10 +194,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 2
@@ -222,10 +207,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 2
@@ -238,10 +222,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 2
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -252,10 +235,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 2
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -266,10 +248,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 2
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 1
@@ -280,10 +261,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 2
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 1
@@ -296,10 +276,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 2
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -310,10 +289,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 2
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 1
@@ -325,10 +303,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 2
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -339,10 +316,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 2
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 1
@@ -355,10 +331,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 2
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 2
@@ -369,10 +344,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 4
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 2
@@ -383,10 +357,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 4
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 2
@@ -397,10 +370,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 2
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 2
@@ -413,10 +385,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 2
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -427,10 +398,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 4
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -441,10 +411,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 4
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 1
@@ -455,10 +424,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 2
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 1
@@ -471,10 +439,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 4
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 2
@@ -485,10 +452,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 4
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 2
@@ -499,10 +465,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 4
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 2
@@ -513,10 +478,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 4
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 2
@@ -529,10 +493,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -543,10 +506,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 1
@@ -557,10 +519,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -571,10 +532,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 1
@@ -587,10 +547,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 2
@@ -601,10 +560,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 2
@@ -615,10 +573,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 2
@@ -629,10 +586,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 2
@@ -645,10 +601,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 4
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 2
@@ -659,10 +614,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 4
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 2
@@ -673,10 +627,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 4
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 2
@@ -687,10 +640,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 4
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 2
@@ -703,10 +655,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 2
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -717,10 +668,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 2
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -731,10 +681,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 2
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 1
@@ -745,10 +694,9 @@
tag: CP14RecipeAnvil
category: Tools
craftTime: 2
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 1
@@ -761,10 +709,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 2
@@ -775,10 +722,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 2
@@ -789,10 +735,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 2
@@ -803,10 +748,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 2

View File

@@ -6,10 +6,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 5
@@ -20,10 +19,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 5
@@ -34,10 +32,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 5
@@ -48,10 +45,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 5
@@ -64,10 +60,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 6
@@ -78,10 +73,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 6
@@ -92,10 +86,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 6
@@ -106,10 +99,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 6
@@ -122,10 +114,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 8
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 4
@@ -136,10 +127,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 8
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 4
@@ -150,10 +140,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 8
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 4
@@ -164,10 +153,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 8
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 4

View File

@@ -6,10 +6,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 2
@@ -20,10 +19,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 2
@@ -34,10 +32,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 2
@@ -48,10 +45,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 2
@@ -64,10 +60,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 6
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -78,10 +73,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 6
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 1
@@ -92,10 +86,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 6
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -106,10 +99,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 6
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 1

View File

@@ -5,10 +5,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -19,10 +18,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -33,10 +31,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 1
@@ -47,10 +44,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 1
@@ -63,10 +59,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -77,10 +72,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -91,10 +85,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 1
@@ -105,10 +98,9 @@
tag: CP14RecipeAnvil
category: Weapon
craftTime: 4
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 1

View File

@@ -6,10 +6,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 2
@@ -20,10 +19,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 2
@@ -34,10 +32,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 2
@@ -48,10 +45,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 2
@@ -64,10 +60,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 6
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -78,10 +73,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 6
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 1
@@ -92,10 +86,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 6
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -106,10 +99,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 6
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 1

View File

@@ -6,10 +6,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 2
@@ -20,10 +19,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 2
@@ -34,10 +32,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 2
@@ -48,10 +45,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 2
@@ -64,10 +60,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 2
@@ -78,10 +73,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 2
@@ -92,10 +86,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 2
@@ -106,10 +99,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 2

View File

@@ -6,10 +6,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -21,10 +20,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 2
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -36,10 +34,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 1
@@ -51,10 +48,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 2
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 1

View File

@@ -6,10 +6,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -20,10 +19,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 1
@@ -34,10 +32,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -48,10 +45,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 4
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 1
@@ -64,10 +60,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 6
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:StackResource
stack: CP14IronBar
count: 1
@@ -78,10 +73,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 6
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:StackResource
stack: CP14GoldBar
count: 1
@@ -92,10 +86,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 6
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -106,10 +99,9 @@
tag: CP14RecipeAnvil
category: Armor
craftTime: 6
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:StackResource
stack: CP14MithrilBar
count: 1

View File

@@ -2,10 +2,9 @@
id: CP14CopperBar1
tag: CP14RecipeMeltingFurnace
craftTime: 4
requiredSkills:
- CopperMelting
requirements:
- !type:SkillRequired
skills:
- CopperMelting
- !type:MaterialResource
material: CP14Copper
count: 10
@@ -15,10 +14,9 @@
id: CP14IronBar1
tag: CP14RecipeMeltingFurnace
craftTime: 4
requiredSkills:
- IronMelting
requirements:
- !type:SkillRequired
skills:
- IronMelting
- !type:MaterialResource
material: CP14Iron
count: 10
@@ -28,10 +26,9 @@
id: CP14GoldBar1
tag: CP14RecipeMeltingFurnace
craftTime: 4
requiredSkills:
- GoldMelting
requirements:
- !type:SkillRequired
skills:
- GoldMelting
- !type:MaterialResource
material: CP14Gold
count: 10
@@ -41,10 +38,9 @@
id: CP14MithrilBar1
tag: CP14RecipeMeltingFurnace
craftTime: 4
requiredSkills:
- MithrilMelting
requirements:
- !type:SkillRequired
skills:
- MithrilMelting
- !type:MaterialResource
material: CP14Mithril
count: 10
@@ -54,10 +50,9 @@
id: CP14GlassSheet1
tag: CP14RecipeMeltingFurnace
craftTime: 2
requiredSkills:
- GlassMelting
requirements:
- !type:SkillRequired
skills:
- GlassMelting
- !type:ProtoIdResource
protoId: CP14CrystalShardQuartz
count: 1
@@ -67,10 +62,9 @@
id: CP14GlassSheetShard1
tag: CP14RecipeMeltingFurnace
craftTime: 2
requiredSkills:
- GlassMelting
requirements:
- !type:SkillRequired
skills:
- GlassMelting
- !type:ProtoIdResource
protoId: CP14GlassShard
count: 2
@@ -80,10 +74,9 @@
id: CP14VialTiny
tag: CP14RecipeMeltingFurnace
craftTime: 3
requiredSkills:
- GlassMelting
requirements:
- !type:SkillRequired
skills:
- GlassMelting
- !type:StackResource
stack: CP14GlassSheet
count: 1
@@ -93,10 +86,9 @@
id: CP14VialTinyReinforced
tag: CP14RecipeMeltingFurnace
craftTime: 3
requiredSkills:
- GlassMelting
requirements:
- !type:SkillRequired
skills:
- GlassMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -109,10 +101,9 @@
id: CP14VialSmall
tag: CP14RecipeMeltingFurnace
craftTime: 3
requiredSkills:
- GlassMelting
requirements:
- !type:SkillRequired
skills:
- GlassMelting
- !type:StackResource
stack: CP14GlassSheet
count: 2
@@ -122,10 +113,9 @@
id: CP14VialSmallReinforced
tag: CP14RecipeMeltingFurnace
craftTime: 3
requiredSkills:
- GlassMelting
requirements:
- !type:SkillRequired
skills:
- GlassMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -138,10 +128,9 @@
id: CP14VialMedium
tag: CP14RecipeMeltingFurnace
craftTime: 3
requiredSkills:
- GlassMelting
requirements:
- !type:SkillRequired
skills:
- GlassMelting
- !type:StackResource
stack: CP14GlassSheet
count: 4
@@ -151,10 +140,9 @@
id: CP14VialMediumReinforced
tag: CP14RecipeMeltingFurnace
craftTime: 3
requiredSkills:
- GlassMelting
requirements:
- !type:SkillRequired
skills:
- GlassMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -167,10 +155,9 @@
id: CP14VialStar
tag: CP14RecipeMeltingFurnace
craftTime: 3
requiredSkills:
- GlassMelting
requirements:
- !type:SkillRequired
skills:
- GlassMelting
- !type:StackResource
stack: CP14GlassSheet
count: 2
@@ -180,10 +167,9 @@
id: CP14VialStarReinforced
tag: CP14RecipeMeltingFurnace
craftTime: 3
requiredSkills:
- GlassMelting
requirements:
- !type:SkillRequired
skills:
- GlassMelting
- !type:StackResource
stack: CP14CopperBar
count: 1
@@ -196,10 +182,9 @@
id: CP14BaseAlchemyBomb
tag: CP14RecipeMeltingFurnace
craftTime: 4
requiredSkills:
- GlassMelting
requirements:
- !type:SkillRequired
skills:
- GlassMelting
- !type:StackResource
stack: CP14GlassSheet
count: 9