Knowledge system (#770)
* remove all requirements * clean up and renaming to knowledge * update code * add admin knowledge verbs * move shoes under pants * knowledge based recipes * clean up * sewing knowledges * knowledge dependencies * knowledge learning objects * more knowledge * metallforging skill * knowledge books * start knowledges, T1 and T2 books in demiplanes * remove coins from demiplanes * roundstart knowledge
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
using Content.Shared._CP14.Knowledge;
|
||||
|
||||
namespace Content.Client._CP14.Knowledge;
|
||||
|
||||
public sealed partial class ClientCP14KnowledgeSystem : SharedCP14KnowledgeSystem
|
||||
{
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
using Content.Server.Body.Components;
|
||||
using Content.Server.Body.Systems;
|
||||
using Content.Shared._CP14.Farming;
|
||||
using Content.Shared._CP14.Skills;
|
||||
using Content.Shared._CP14.Knowledge;
|
||||
using Content.Shared.Chemistry;
|
||||
using Content.Shared.Chemistry.Components;
|
||||
using Content.Shared.Chemistry.Components.SolutionManager;
|
||||
@@ -35,8 +35,6 @@ public sealed class InjectorSystem : SharedInjectorSystem
|
||||
|
||||
private bool TryUseInjector(Entity<InjectorComponent> injector, EntityUid target, EntityUid user)
|
||||
{
|
||||
RaiseLocalEvent(injector, new CP14TrySkillIssueEvent(user)); //CP14 Skill issue event
|
||||
|
||||
var isOpenOrIgnored = injector.Comp.IgnoreClosed || !_openable.IsClosed(target);
|
||||
// Handle injecting/drawing for solutions
|
||||
if (injector.Comp.ToggleState == InjectorToggleMode.Inject)
|
||||
|
||||
27
Content.Server/_CP14/Knowledge/CP14AddKnowledgeSpecial.cs
Normal file
27
Content.Server/_CP14/Knowledge/CP14AddKnowledgeSpecial.cs
Normal file
@@ -0,0 +1,27 @@
|
||||
using Content.Shared._CP14.Knowledge;
|
||||
using Content.Shared._CP14.Knowledge.Prototypes;
|
||||
using Content.Shared.Roles;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Server._CP14.Knowledge;
|
||||
|
||||
/// <summary>
|
||||
/// a component that can be hung on an entity to immediately teach it some skills
|
||||
/// </summary>
|
||||
[UsedImplicitly]
|
||||
public sealed partial class CP14AddKnowledgeSpecial : JobSpecial
|
||||
{
|
||||
[DataField(required: true), ViewVariables(VVAccess.ReadOnly)]
|
||||
public List<ProtoId<CP14KnowledgePrototype>> Knowledge = new();
|
||||
|
||||
public override void AfterEquip(EntityUid mob)
|
||||
{
|
||||
var entMan = IoCManager.Resolve<IEntityManager>();
|
||||
var knowledgeSystem = entMan.System<CP14KnowledgeSystem>();
|
||||
foreach (var knowledge in Knowledge)
|
||||
{
|
||||
knowledgeSystem.TryLearnKnowledge(mob, knowledge, true, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
254
Content.Server/_CP14/Knowledge/CP14KnowledgeSystem.cs
Normal file
254
Content.Server/_CP14/Knowledge/CP14KnowledgeSystem.cs
Normal file
@@ -0,0 +1,254 @@
|
||||
using System.Text;
|
||||
using Content.Server.Chat.Managers;
|
||||
using Content.Server.Mind;
|
||||
using Content.Server.Popups;
|
||||
using Content.Shared._CP14.Knowledge;
|
||||
using Content.Shared._CP14.Knowledge.Components;
|
||||
using Content.Shared._CP14.Knowledge.Prototypes;
|
||||
using Content.Shared.Administration;
|
||||
using Content.Shared.Administration.Logs;
|
||||
using Content.Shared.Administration.Managers;
|
||||
using Content.Shared.Chat;
|
||||
using Content.Shared.Damage;
|
||||
using Content.Shared.Database;
|
||||
using Content.Shared.DoAfter;
|
||||
using Content.Shared.Verbs;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Random;
|
||||
|
||||
namespace Content.Server._CP14.Knowledge;
|
||||
|
||||
public sealed partial class CP14KnowledgeSystem : SharedCP14KnowledgeSystem
|
||||
{
|
||||
[Dependency] private readonly ISharedAdminManager _admin = default!;
|
||||
[Dependency] private readonly IRobustRandom _random = default!;
|
||||
[Dependency] private readonly PopupSystem _popup = default!;
|
||||
[Dependency] private readonly DamageableSystem _damageable = default!;
|
||||
[Dependency] private readonly IPrototypeManager _proto = default!;
|
||||
[Dependency] private readonly IChatManager _chat = default!;
|
||||
[Dependency] private readonly MindSystem _mind = default!;
|
||||
[Dependency] private readonly ISharedAdminLogManager _adminLogger = default!;
|
||||
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<CP14AutoAddKnowledgeComponent, MapInitEvent>(AutoAddSkill);
|
||||
SubscribeLocalEvent<CP14KnowledgeStorageComponent, GetVerbsEvent<Verb>>(AddKnowledgeAdminVerb);
|
||||
SubscribeLocalEvent<CP14KnowledgeLearningSourceComponent, GetVerbsEvent<Verb>>(AddKnowledgeLearningVerb);
|
||||
SubscribeLocalEvent<CP14KnowledgeStorageComponent, CP14KnowledgeLearnDoAfterEvent>(KnowledgeLearnedEvent);
|
||||
}
|
||||
|
||||
private void KnowledgeLearnedEvent(Entity<CP14KnowledgeStorageComponent> ent, ref CP14KnowledgeLearnDoAfterEvent args)
|
||||
{
|
||||
if (args.Cancelled || args.Handled)
|
||||
return;
|
||||
|
||||
args.Handled = true;
|
||||
|
||||
TryLearnKnowledge(ent, args.Knowledge);
|
||||
}
|
||||
|
||||
private void AddKnowledgeLearningVerb(Entity<CP14KnowledgeLearningSourceComponent> ent, ref GetVerbsEvent<Verb> args)
|
||||
{
|
||||
var user = args.User;
|
||||
foreach (var knowledge in ent.Comp.Knowledges)
|
||||
{
|
||||
if (!_proto.TryIndex(knowledge, out var indexedKnowledge))
|
||||
continue;
|
||||
|
||||
args.Verbs.Add(new Verb()
|
||||
{
|
||||
Text = $"{Loc.GetString(indexedKnowledge.Name)}",
|
||||
Message = Loc.GetString(indexedKnowledge.Desc),
|
||||
Category = VerbCategory.CP14KnowledgeLearn,
|
||||
Act = () =>
|
||||
{
|
||||
_doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager,
|
||||
user,
|
||||
ent.Comp.DoAfter,
|
||||
new CP14KnowledgeLearnDoAfterEvent() {Knowledge = knowledge},
|
||||
user,
|
||||
ent,
|
||||
ent)
|
||||
{
|
||||
BreakOnDamage = true,
|
||||
BreakOnMove = true,
|
||||
});
|
||||
},
|
||||
Disabled = HasKnowledge(user, knowledge),
|
||||
Impact = LogImpact.Medium,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void AddKnowledgeAdminVerb(Entity<CP14KnowledgeStorageComponent> ent, ref GetVerbsEvent<Verb> args)
|
||||
{
|
||||
if (!_admin.HasAdminFlag(args.User, AdminFlags.Admin))
|
||||
return;
|
||||
|
||||
//Remove knowledge
|
||||
foreach (var knowledge in ent.Comp.Knowledges)
|
||||
{
|
||||
if (!_proto.TryIndex(knowledge, out var indexedKnowledge))
|
||||
continue;
|
||||
|
||||
args.Verbs.Add(new Verb()
|
||||
{
|
||||
Text = $"{Loc.GetString(indexedKnowledge.Name)}",
|
||||
Message = Loc.GetString(indexedKnowledge.Desc),
|
||||
Category = VerbCategory.CP14KnowledgeRemove,
|
||||
Act = () =>
|
||||
{
|
||||
TryForgotKnowledge(ent, knowledge);
|
||||
},
|
||||
Impact = LogImpact.High,
|
||||
});
|
||||
}
|
||||
|
||||
//Add knowledge
|
||||
foreach (var knowledge in _proto.EnumeratePrototypes<CP14KnowledgePrototype>())
|
||||
{
|
||||
if (ent.Comp.Knowledges.Contains(knowledge))
|
||||
continue;
|
||||
|
||||
args.Verbs.Add(new Verb()
|
||||
{
|
||||
Text = $"{Loc.GetString(knowledge.Name)}",
|
||||
Message = Loc.GetString(knowledge.Desc),
|
||||
Category = VerbCategory.CP14KnowledgeAdd,
|
||||
Act = () =>
|
||||
{
|
||||
TryLearnKnowledge(ent, knowledge, false);
|
||||
},
|
||||
Impact = LogImpact.High,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void AutoAddSkill(Entity<CP14AutoAddKnowledgeComponent> ent, ref MapInitEvent args)
|
||||
{
|
||||
foreach (var knowledge in ent.Comp.Knowledge)
|
||||
{
|
||||
TryLearnKnowledge(ent, knowledge);
|
||||
}
|
||||
|
||||
RemComp(ent, ent.Comp);
|
||||
}
|
||||
|
||||
public bool TryLearnKnowledge(EntityUid uid, ProtoId<CP14KnowledgePrototype> proto, bool force = false, bool silent = false)
|
||||
{
|
||||
if (!TryComp<CP14KnowledgeStorageComponent>(uid, out var knowledgeStorage))
|
||||
return false;
|
||||
|
||||
if (!_proto.TryIndex(proto, out var indexedKnowledge))
|
||||
return false;
|
||||
|
||||
if (knowledgeStorage.Knowledges.Contains(proto))
|
||||
return false;
|
||||
|
||||
foreach (var dependency in indexedKnowledge.Dependencies)
|
||||
{
|
||||
if (!_proto.TryIndex(dependency, out var indexedDependency))
|
||||
return false;
|
||||
|
||||
if (force)
|
||||
{
|
||||
//If we teach by force - we automatically teach all the basics that are necessary for that skill.
|
||||
if (!TryLearnKnowledge(uid, dependency, true))
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
var passed = true;
|
||||
var sb = new StringBuilder();
|
||||
|
||||
sb.Append(Loc.GetString("cp14-cant-learn-knowledge-dependencies",
|
||||
("target", Loc.GetString(indexedKnowledge.Desc))));
|
||||
|
||||
//We cant learnt
|
||||
if (!HasKnowledge(uid, dependency))
|
||||
{
|
||||
passed = false;
|
||||
sb.Append("\n- " + Loc.GetString(indexedDependency.Desc));
|
||||
}
|
||||
|
||||
if (!passed)
|
||||
{
|
||||
if (!silent && _mind.TryGetMind(uid, out var mind, out var mindComp) && mindComp.Session is not null)
|
||||
{
|
||||
var wrappedMessage = Loc.GetString("chat-manager-server-wrap-message", ("message", sb.ToString()));
|
||||
_chat.ChatMessageToOne(
|
||||
ChatChannel.Server,
|
||||
sb.ToString(),
|
||||
wrappedMessage,
|
||||
default,
|
||||
false,
|
||||
mindComp.Session.Channel);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: coding on a sleepy head is a bad idea. Remove duplicate variables. >:(
|
||||
if (!silent && _mind.TryGetMind(uid, out var mind2, out var mindComp2) && mindComp2.Session is not null)
|
||||
{
|
||||
var message = Loc.GetString("cp14-learned-new-knowledge", ("name", Loc.GetString(indexedKnowledge.Name)));
|
||||
var wrappedMessage2 = Loc.GetString("chat-manager-server-wrap-message", ("message", message));
|
||||
|
||||
_chat.ChatMessageToOne(
|
||||
ChatChannel.Server,
|
||||
message,
|
||||
wrappedMessage2,
|
||||
default,
|
||||
false,
|
||||
mindComp2.Session.Channel);
|
||||
}
|
||||
|
||||
_adminLogger.Add(
|
||||
LogType.Mind,
|
||||
LogImpact.Medium,
|
||||
$"{EntityManager.ToPrettyString(uid):player} learned new knowledge: {Loc.GetString(indexedKnowledge.Name)}");
|
||||
return knowledgeStorage.Knowledges.Add(proto);
|
||||
}
|
||||
|
||||
public bool TryForgotKnowledge(EntityUid uid, ProtoId<CP14KnowledgePrototype> proto, bool silent = false)
|
||||
{
|
||||
if (!TryComp<CP14KnowledgeStorageComponent>(uid, out var knowledgeStorage))
|
||||
return false;
|
||||
|
||||
if (!knowledgeStorage.Knowledges.Contains(proto))
|
||||
return false;
|
||||
|
||||
if (!_proto.TryIndex(proto, out var indexedKnowledge))
|
||||
return false;
|
||||
|
||||
knowledgeStorage.Knowledges.Remove(proto);
|
||||
|
||||
if (_mind.TryGetMind(uid, out var mind, out var mindComp) && mindComp.Session is not null)
|
||||
{
|
||||
if (!silent)
|
||||
{
|
||||
var message = Loc.GetString("cp14-forgot-knowledge", ("name", Loc.GetString(indexedKnowledge.Name)));
|
||||
var wrappedMessage = Loc.GetString("chat-manager-server-wrap-message", ("message", message));
|
||||
|
||||
_chat.ChatMessageToOne(
|
||||
ChatChannel.Server,
|
||||
message,
|
||||
wrappedMessage,
|
||||
default,
|
||||
false,
|
||||
mindComp.Session.Channel);
|
||||
}
|
||||
}
|
||||
|
||||
_adminLogger.Add(
|
||||
LogType.Mind,
|
||||
LogImpact.Medium,
|
||||
$"{EntityManager.ToPrettyString(uid):player} forgot knowledge: {Loc.GetString(indexedKnowledge.Name)}");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1,166 +0,0 @@
|
||||
using Content.Server._CP14.Alchemy;
|
||||
using Content.Server.Popups;
|
||||
using Content.Shared._CP14.MeleeWeapon.EntitySystems;
|
||||
using Content.Shared._CP14.Skills;
|
||||
using Content.Shared._CP14.Skills.Components;
|
||||
using Content.Shared.Damage;
|
||||
using Content.Shared.Examine;
|
||||
using Content.Shared.Hands.EntitySystems;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Throwing;
|
||||
using Content.Shared.Weapons.Melee;
|
||||
using Content.Shared.Weapons.Melee.Events;
|
||||
using Content.Shared.Weapons.Ranged.Systems;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Random;
|
||||
|
||||
namespace Content.Server._CP14.Skills;
|
||||
|
||||
public sealed partial class CP14SkillSystem : SharedCP14SkillSystem
|
||||
{
|
||||
[Dependency] private readonly IRobustRandom _random = default!;
|
||||
[Dependency] private readonly PopupSystem _popup = default!;
|
||||
[Dependency] private readonly DamageableSystem _damageable = default!;
|
||||
[Dependency] private readonly IPrototypeManager _proto = default!;
|
||||
[Dependency] private readonly ThrowingSystem _throwing = default!;
|
||||
[Dependency] private readonly SharedHandsSystem _hands = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
SubscribeLocalEvent<CP14SkillRequirementComponent, ExaminedEvent>(OnExamined);
|
||||
|
||||
SubscribeLocalEvent<CP14SkillRequirementComponent, GunShotEvent>(OnGunShot);
|
||||
SubscribeLocalEvent<CP14SkillRequirementComponent, MeleeHitEvent>(OnMeleeHit);
|
||||
SubscribeLocalEvent<CP14SkillRequirementComponent, CP14TrySkillIssueEvent>(OnSimpleSkillIssue);
|
||||
SubscribeLocalEvent<CP14SkillRequirementComponent, SharpingEvent>(OnSharpning);
|
||||
SubscribeLocalEvent<CP14SkillRequirementComponent, PestleGrindingEvent>(OnPestleGrinding);
|
||||
}
|
||||
|
||||
private void OnExamined(Entity<CP14SkillRequirementComponent> requirement, ref ExaminedEvent args)
|
||||
{
|
||||
var text = string.Empty;
|
||||
text += "\n" + Loc.GetString("cp14-skill-label") + "\n";
|
||||
var canUse = HasEnoughSkillToUse(args.Examiner, requirement, out var missingSkills);
|
||||
|
||||
text += Loc.GetString(requirement.Comp.NeedAll ? "cp14-skill-examined-need-all" : "cp14-skill-examined", ("item", MetaData(requirement).EntityName)) + "\n";
|
||||
foreach (var skill in requirement.Comp.RequiredSkills)
|
||||
{
|
||||
var name = _proto.Index(skill).Name;
|
||||
if (name == null)
|
||||
continue;
|
||||
|
||||
var color = missingSkills.Contains(skill) ? "#c23030" : "#3fc488";
|
||||
text += Loc.GetString("cp14-skill-examined-skill", ("color", color), ("skill", Loc.GetString(name))) + "\n";
|
||||
|
||||
}
|
||||
args.PushMarkup(text);
|
||||
}
|
||||
|
||||
private void OnPestleGrinding(Entity<CP14SkillRequirementComponent> requirement, ref PestleGrindingEvent args)
|
||||
{
|
||||
if (!_random.Prob(requirement.Comp.FuckupChance))
|
||||
return;
|
||||
|
||||
if (HasEnoughSkillToUse(args.User, requirement, out _))
|
||||
return;
|
||||
|
||||
_popup.PopupEntity(Loc.GetString("cp14-skill-issue-push", ("item", MetaData(args.Target).EntityName)),
|
||||
args.User,
|
||||
args.User,
|
||||
PopupType.Large);
|
||||
_hands.TryDrop(args.User, args.Target);
|
||||
_throwing.TryThrow(args.Target, _random.NextAngle().ToWorldVec(), 1, args.User);
|
||||
}
|
||||
|
||||
private void OnSharpning(Entity<CP14SkillRequirementComponent> requirement, ref SharpingEvent args)
|
||||
{
|
||||
if (!_random.Prob(requirement.Comp.FuckupChance))
|
||||
return;
|
||||
|
||||
if (HasEnoughSkillToUse(args.User, requirement, out _))
|
||||
return;
|
||||
|
||||
switch (_random.Next(2))
|
||||
{
|
||||
case 0:
|
||||
_popup.PopupEntity(Loc.GetString("cp14-skill-issue-sharp-weapon-harm", ("item", MetaData(args.Target).EntityName)), args.User, args.User, PopupType.Large);
|
||||
var weaponDamage = new DamageSpecifier();
|
||||
weaponDamage.DamageDict.Add("Blunt", _random.NextFloat(5));
|
||||
_damageable.TryChangeDamage(args.Target, weaponDamage);
|
||||
break;
|
||||
case 1:
|
||||
_popup.PopupEntity(Loc.GetString("cp14-skill-issue-sharp-self-harm"), args.User, args.User, PopupType.Large);
|
||||
|
||||
var damage = new DamageSpecifier();
|
||||
if (TryComp<MeleeWeaponComponent>(requirement, out var melee))
|
||||
damage = melee.Damage;
|
||||
else
|
||||
damage.DamageDict.Add("Slash", _random.NextFloat(10));
|
||||
|
||||
_damageable.TryChangeDamage(args.User, damage);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnSimpleSkillIssue(Entity<CP14SkillRequirementComponent> requirement, ref CP14TrySkillIssueEvent args)
|
||||
{
|
||||
if (!_random.Prob(requirement.Comp.FuckupChance))
|
||||
return;
|
||||
|
||||
if (HasEnoughSkillToUse(args.User, requirement, out _))
|
||||
return;
|
||||
|
||||
BasicSkillIssue(args.User, requirement);
|
||||
}
|
||||
|
||||
private void OnMeleeHit(Entity<CP14SkillRequirementComponent> requirement, ref MeleeHitEvent args)
|
||||
{
|
||||
if (!_random.Prob(requirement.Comp.FuckupChance))
|
||||
return;
|
||||
|
||||
if (HasEnoughSkillToUse(args.User, requirement, out _))
|
||||
return;
|
||||
|
||||
switch (_random.Next(2))
|
||||
{
|
||||
case 0:
|
||||
BasicSkillIssue(args.User, requirement);
|
||||
break;
|
||||
case 1:
|
||||
_popup.PopupEntity(Loc.GetString("cp14-skill-issue-self-harm"), args.User, args.User, PopupType.Large);
|
||||
|
||||
var damage = new DamageSpecifier();
|
||||
if (TryComp<MeleeWeaponComponent>(requirement, out var melee))
|
||||
damage = melee.Damage;
|
||||
else
|
||||
damage.DamageDict.Add("Blunt", _random.NextFloat(10));
|
||||
|
||||
_damageable.TryChangeDamage(args.User, damage);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnGunShot(Entity<CP14SkillRequirementComponent> requirement, ref GunShotEvent args)
|
||||
{
|
||||
if (!_random.Prob(requirement.Comp.FuckupChance))
|
||||
return;
|
||||
|
||||
if (HasEnoughSkillToUse(args.User, requirement, out _))
|
||||
return;
|
||||
|
||||
_popup.PopupEntity(Loc.GetString("cp14-skill-issue-recoil"), args.User, args.User, PopupType.Large);
|
||||
_hands.TryDrop(args.User, requirement);
|
||||
_throwing.TryThrow(requirement, _random.NextAngle().ToWorldVec(), _random.NextFloat(5), args.User);
|
||||
|
||||
var damage = new DamageSpecifier();
|
||||
damage.DamageDict.Add("Blunt", _random.NextFloat(10));
|
||||
_damageable.TryChangeDamage(args.User, damage);
|
||||
}
|
||||
|
||||
private void BasicSkillIssue(EntityUid user, EntityUid item, float throwPower = 1)
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("cp14-skill-issue-drops", ("item", MetaData(item).EntityName)), user, user, PopupType.Large);
|
||||
_hands.TryDrop(user, item);
|
||||
_throwing.TryThrow(item, _random.NextAngle().ToWorldVec(), throwPower, user);
|
||||
}
|
||||
}
|
||||
@@ -20,7 +20,7 @@ public sealed partial class CP14WorkbenchSystem
|
||||
StartCraft(entity, args.Actor, prototype);
|
||||
}
|
||||
|
||||
private void UpdateUIRecipes(Entity<CP14WorkbenchComponent> entity)
|
||||
private void UpdateUIRecipes(Entity<CP14WorkbenchComponent> entity, EntityUid user)
|
||||
{
|
||||
var placedEntities = _lookup.GetEntitiesInRange(Transform(entity).Coordinates, entity.Comp.WorkbenchRadius);
|
||||
|
||||
@@ -30,7 +30,13 @@ public sealed partial class CP14WorkbenchSystem
|
||||
if (!_proto.TryIndex(recipeId, out var indexedRecipe))
|
||||
continue;
|
||||
|
||||
var entry = new CP14WorkbenchUiRecipesEntry(recipeId, CanCraftRecipe(indexedRecipe, placedEntities));
|
||||
if (indexedRecipe.KnowledgeRequired is not null)
|
||||
{
|
||||
if (!_knowledge.HasKnowledge(user, indexedRecipe.KnowledgeRequired.Value))
|
||||
continue;
|
||||
}
|
||||
|
||||
var entry = new CP14WorkbenchUiRecipesEntry(recipeId, CanCraftRecipe(indexedRecipe, placedEntities, user));
|
||||
|
||||
recipes.Add(entry);
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
using Content.Server.DoAfter;
|
||||
using Content.Server.Popups;
|
||||
using Content.Server.Stack;
|
||||
using Content.Shared._CP14.Knowledge;
|
||||
using Content.Shared._CP14.Workbench;
|
||||
using Content.Shared._CP14.Workbench.Prototypes;
|
||||
using Content.Shared.Chemistry.EntitySystems;
|
||||
@@ -29,6 +30,7 @@ public sealed partial class CP14WorkbenchSystem : SharedCP14WorkbenchSystem
|
||||
[Dependency] private readonly UserInterfaceSystem _userInterface = default!;
|
||||
[Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!;
|
||||
[Dependency] private readonly SharedTransformSystem _transform = default!;
|
||||
[Dependency] private readonly SharedCP14KnowledgeSystem _knowledge = default!;
|
||||
|
||||
private EntityQuery<MetaDataComponent> _metaQuery;
|
||||
private EntityQuery<StackComponent> _stackQuery;
|
||||
@@ -64,10 +66,9 @@ public sealed partial class CP14WorkbenchSystem : SharedCP14WorkbenchSystem
|
||||
|
||||
private void OnBeforeUIOpen(Entity<CP14WorkbenchComponent> ent, ref BeforeActivatableUIOpenEvent args)
|
||||
{
|
||||
UpdateUIRecipes(ent);
|
||||
UpdateUIRecipes(ent, args.User);
|
||||
}
|
||||
|
||||
// TODO: Replace Del to QueueDel when it's will be works with events
|
||||
private void OnCraftFinished(Entity<CP14WorkbenchComponent> ent, ref CP14CraftDoAfterEvent args)
|
||||
{
|
||||
if (args.Cancelled || args.Handled)
|
||||
@@ -78,23 +79,26 @@ public sealed partial class CP14WorkbenchSystem : SharedCP14WorkbenchSystem
|
||||
|
||||
var placedEntities = _lookup.GetEntitiesInRange(Transform(ent).Coordinates, ent.Comp.WorkbenchRadius, LookupFlags.Uncontained);
|
||||
|
||||
if (!CanCraftRecipe(recipe, placedEntities))
|
||||
if (!CanCraftRecipe(recipe, placedEntities, args.User))
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("cp14-workbench-no-resource"), ent, args.User);
|
||||
_popup.PopupEntity(Loc.GetString("cp14-workbench-cant-craft"), ent, args.User);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_proto.TryIndex(args.Recipe, out var indexedRecipe))
|
||||
return;
|
||||
|
||||
if (recipe.KnowledgeRequired is not null)
|
||||
_knowledge.UseKnowledge(args.User, recipe.KnowledgeRequired.Value);
|
||||
|
||||
var resultEntity = Spawn(indexedRecipe.Result);
|
||||
_stack.TryMergeToContacts(resultEntity);
|
||||
|
||||
_solutionContainer.TryGetSolution(resultEntity, recipe.Solution, out var resultSoln, out var resultSolution);
|
||||
if (recipe.TryMergeSolutions && resultSoln is not null)
|
||||
_solutionContainer.TryGetSolution(resultEntity, recipe.Solution, out var resultSolution, out _);
|
||||
if (recipe.TryMergeSolutions && resultSolution is not null)
|
||||
{
|
||||
resultSoln.Value.Comp.Solution.MaxVolume = 0;
|
||||
_solutionContainer.RemoveAllSolution(resultSoln.Value); //If we combine ingredient solutions, we do not use the default solution prescribed in the entity.
|
||||
resultSolution.Value.Comp.Solution.MaxVolume = 0;
|
||||
_solutionContainer.RemoveAllSolution(resultSolution.Value); //If we combine ingredient solutions, we do not use the default solution prescribed in the entity.
|
||||
}
|
||||
|
||||
foreach (var requiredIngredient in recipe.Entities)
|
||||
@@ -102,7 +106,8 @@ public sealed partial class CP14WorkbenchSystem : SharedCP14WorkbenchSystem
|
||||
var requiredCount = requiredIngredient.Value;
|
||||
foreach (var placedEntity in placedEntities)
|
||||
{
|
||||
if (!TryComp<MetaDataComponent>(placedEntity, out var metaData) || metaData.EntityPrototype is null)
|
||||
var metaData = MetaData(placedEntity);
|
||||
if (metaData.EntityPrototype is null)
|
||||
continue;
|
||||
|
||||
var placedProto = metaData.EntityPrototype.ID;
|
||||
@@ -110,11 +115,11 @@ public sealed partial class CP14WorkbenchSystem : SharedCP14WorkbenchSystem
|
||||
{
|
||||
// Trying merge solutions
|
||||
if (recipe.TryMergeSolutions
|
||||
&& resultSoln is not null
|
||||
&& resultSolution is not null
|
||||
&& _solutionContainer.TryGetSolution(placedEntity, recipe.Solution, out var ingredientSoln, out var ingredientSolution))
|
||||
{
|
||||
resultSoln.Value.Comp.Solution.MaxVolume += ingredientSoln.Value.Comp.Solution.MaxVolume;
|
||||
_solutionContainer.TryAddSolution(resultSoln.Value, ingredientSolution);
|
||||
resultSolution.Value.Comp.Solution.MaxVolume += ingredientSoln.Value.Comp.Solution.MaxVolume;
|
||||
_solutionContainer.TryAddSolution(resultSolution.Value, ingredientSolution);
|
||||
}
|
||||
|
||||
requiredCount--;
|
||||
@@ -145,7 +150,7 @@ public sealed partial class CP14WorkbenchSystem : SharedCP14WorkbenchSystem
|
||||
}
|
||||
}
|
||||
_transform.SetCoordinates(resultEntity, Transform(ent).Coordinates);
|
||||
UpdateUIRecipes(ent);
|
||||
UpdateUIRecipes(ent, args.User);
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
@@ -172,8 +177,13 @@ public sealed partial class CP14WorkbenchSystem : SharedCP14WorkbenchSystem
|
||||
_audio.PlayPvs(recipe.OverrideCraftSound ?? workbench.Comp.CraftSound, workbench);
|
||||
}
|
||||
|
||||
private bool CanCraftRecipe(CP14WorkbenchRecipePrototype recipe, HashSet<EntityUid> entities)
|
||||
private bool CanCraftRecipe(CP14WorkbenchRecipePrototype recipe, HashSet<EntityUid> entities, EntityUid user)
|
||||
{
|
||||
//Knowledge check
|
||||
if (recipe.KnowledgeRequired is not null && !_knowledge.HasKnowledge(user, recipe.KnowledgeRequired.Value))
|
||||
return false;
|
||||
|
||||
//Ingredients check
|
||||
var indexedIngredients = IndexIngredients(entities);
|
||||
foreach (var requiredIngredient in recipe.Entities)
|
||||
{
|
||||
@@ -202,25 +212,6 @@ public sealed partial class CP14WorkbenchSystem : SharedCP14WorkbenchSystem
|
||||
return true;
|
||||
}
|
||||
|
||||
private string GetCraftRecipeMessage(string desc, CP14WorkbenchRecipePrototype recipe)
|
||||
{
|
||||
var result = desc + "\n \n" + Loc.GetString("cp14-workbench-recipe-list")+ "\n";
|
||||
|
||||
foreach (var pair in recipe.Entities)
|
||||
{
|
||||
var proto = _proto.Index(pair.Key);
|
||||
result += $"{proto.Name} x{pair.Value}\n";
|
||||
}
|
||||
|
||||
foreach (var pair in recipe.Stacks)
|
||||
{
|
||||
var proto = _proto.Index(pair.Key);
|
||||
result += $"{proto.Name} x{pair.Value}\n";
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private Dictionary<EntProtoId, int> IndexIngredients(HashSet<EntityUid> ingredients)
|
||||
{
|
||||
var indexedIngredients = new Dictionary<EntProtoId, int>();
|
||||
|
||||
@@ -95,5 +95,11 @@ namespace Content.Shared.Verbs
|
||||
public static readonly VerbCategory CP14RitualBook = new("cp14-verb-categories-ritual-book", null); //CP14
|
||||
|
||||
public static readonly VerbCategory CP14CurrencyConvert = new("cp14-verb-categories-currency-converter", null); //CP14
|
||||
|
||||
public static readonly VerbCategory CP14KnowledgeAdd = new("cp14-verb-categories-knowledge-add", null); //CP14
|
||||
|
||||
public static readonly VerbCategory CP14KnowledgeRemove = new("cp14-verb-categories-knowledge-remove", null); //CP14
|
||||
|
||||
public static readonly VerbCategory CP14KnowledgeLearn = new("cp14-verb-categories-knowledge-learn", null); //CP14
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
using Content.Shared._CP14.Knowledge.Prototypes;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._CP14.Knowledge.Components;
|
||||
|
||||
/// <summary>
|
||||
/// The ability to add a skill to an entity and quickly teach it some skills
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(SharedCP14KnowledgeSystem))]
|
||||
public sealed partial class CP14AutoAddKnowledgeComponent : Component
|
||||
{
|
||||
[DataField]
|
||||
public List<ProtoId<CP14KnowledgePrototype>> Knowledge = new();
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
using Content.Shared._CP14.Knowledge.Prototypes;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._CP14.Knowledge.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Allows new knowledge to be learnt through interactions with an object.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(SharedCP14KnowledgeSystem))]
|
||||
public sealed partial class CP14KnowledgeLearningSourceComponent : Component
|
||||
{
|
||||
[DataField, ViewVariables(VVAccess.ReadOnly)]
|
||||
public HashSet<ProtoId<CP14KnowledgePrototype>> Knowledges { get; private set; } = new();
|
||||
|
||||
[DataField]
|
||||
public TimeSpan DoAfter = TimeSpan.FromSeconds(5f);
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
|
||||
namespace Content.Shared._CP14.Knowledge.Components;
|
||||
|
||||
/// <summary>
|
||||
/// automatically generates content for PaperComponent, based on the knowledge that can be learnt from this object
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(SharedCP14KnowledgeSystem))]
|
||||
public sealed partial class CP14KnowledgePaperTextComponent : Component
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
using Content.Shared._CP14.Knowledge.Prototypes;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._CP14.Knowledge.Components;
|
||||
|
||||
/// <summary>
|
||||
/// a list of skills learned by this entity
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(SharedCP14KnowledgeSystem))]
|
||||
public sealed partial class CP14KnowledgeStorageComponent : Component
|
||||
{
|
||||
[DataField, ViewVariables(VVAccess.ReadOnly)]
|
||||
public HashSet<ProtoId<CP14KnowledgePrototype>> Knowledges { get; private set; } = new();
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._CP14.Knowledge.Prototypes;
|
||||
|
||||
/// <summary>
|
||||
/// Abstract knowledge that may be required to use items or crafts.
|
||||
/// </summary>
|
||||
[Prototype("CP14Knowledge")]
|
||||
public sealed partial class CP14KnowledgePrototype : IPrototype
|
||||
{
|
||||
[ViewVariables]
|
||||
[IdDataField]
|
||||
public string ID { get; private set; } = default!;
|
||||
|
||||
[DataField(required: true)]
|
||||
public LocId Name { get; private set; } = default!;
|
||||
|
||||
[DataField]
|
||||
public LocId Desc{ get; private set; } = default!;
|
||||
|
||||
/// <summary>
|
||||
/// to study this knowledge, other knowledge on which it is based may be necessary.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public HashSet<ProtoId<CP14KnowledgePrototype>> Dependencies = new();
|
||||
}
|
||||
94
Content.Shared/_CP14/Knowledge/SharedCP14KnowledgeSystem.cs
Normal file
94
Content.Shared/_CP14/Knowledge/SharedCP14KnowledgeSystem.cs
Normal file
@@ -0,0 +1,94 @@
|
||||
using System.Text;
|
||||
using Content.Shared._CP14.Knowledge.Components;
|
||||
using Content.Shared._CP14.Knowledge.Prototypes;
|
||||
using Content.Shared.DoAfter;
|
||||
using Content.Shared.MagicMirror;
|
||||
using Content.Shared.Paper;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared._CP14.Knowledge;
|
||||
|
||||
public abstract partial class SharedCP14KnowledgeSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly IPrototypeManager _proto = default!;
|
||||
[Dependency] private readonly PaperSystem _paper = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
SubscribeLocalEvent<CP14KnowledgePaperTextComponent, MapInitEvent>(OnPaperMapInit);
|
||||
}
|
||||
|
||||
private void OnPaperMapInit(Entity<CP14KnowledgePaperTextComponent> ent, ref MapInitEvent args)
|
||||
{
|
||||
if (!TryComp<PaperComponent>(ent, out var paper))
|
||||
return;
|
||||
if (!TryComp<CP14KnowledgeLearningSourceComponent>(ent, out var knowledge))
|
||||
return;
|
||||
if (knowledge.Knowledges.Count <= 0)
|
||||
return;
|
||||
|
||||
var sb = new StringBuilder();
|
||||
|
||||
sb.Append(Loc.GetString("cp14-knowledge-book-pre-text"));
|
||||
foreach (var k in knowledge.Knowledges)
|
||||
{
|
||||
if (!_proto.TryIndex(k, out var indexedKnowledge))
|
||||
continue;
|
||||
|
||||
sb.Append($"\n{Loc.GetString(indexedKnowledge.Desc)}");
|
||||
}
|
||||
|
||||
sb.Append($"\n\n{Loc.GetString("cp14-knowledge-book-post-text")}");
|
||||
|
||||
_paper.SetContent((ent, paper), sb.ToString());
|
||||
paper.EditingDisabled = true;
|
||||
}
|
||||
|
||||
public bool UseKnowledge(EntityUid uid,
|
||||
ProtoId<CP14KnowledgePrototype> knowledge,
|
||||
float factor = 1f,
|
||||
CP14KnowledgeStorageComponent? knowledgeStorage = null)
|
||||
{
|
||||
if (!Resolve(uid, ref knowledgeStorage, false))
|
||||
return false;
|
||||
|
||||
if (!knowledgeStorage.Knowledges.Contains(knowledge))
|
||||
return false;
|
||||
|
||||
var ev = new CP14KnowledgeUsedEvent(uid, knowledge, factor);
|
||||
RaiseLocalEvent(uid, ev);
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool HasKnowledge(EntityUid uid,
|
||||
ProtoId<CP14KnowledgePrototype> knowledge,
|
||||
CP14KnowledgeStorageComponent? knowledgeStorage = null)
|
||||
{
|
||||
if (!Resolve(uid, ref knowledgeStorage, false))
|
||||
return false;
|
||||
|
||||
return knowledgeStorage.Knowledges.Contains(knowledge);
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class CP14KnowledgeUsedEvent : EntityEventArgs
|
||||
{
|
||||
public readonly EntityUid User;
|
||||
public readonly ProtoId<CP14KnowledgePrototype> Knowledge;
|
||||
public readonly float Factor;
|
||||
|
||||
public CP14KnowledgeUsedEvent(EntityUid uid, ProtoId<CP14KnowledgePrototype> knowledge, float factor)
|
||||
{
|
||||
User = uid;
|
||||
Knowledge = knowledge;
|
||||
Factor = factor;
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed partial class CP14KnowledgeLearnDoAfterEvent : DoAfterEvent
|
||||
{
|
||||
public ProtoId<CP14KnowledgePrototype> Knowledge;
|
||||
public override DoAfterEvent Clone() => this;
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
using Content.Shared._CP14.Skills.Prototypes;
|
||||
using Content.Shared.Roles;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._CP14.Skills.Components;
|
||||
|
||||
/// <summary>
|
||||
/// a component that can be hung on an entity to immediately teach it some skills
|
||||
/// </summary>
|
||||
[UsedImplicitly]
|
||||
public sealed partial class CP14AddSkillSpecial : JobSpecial
|
||||
{
|
||||
[DataField, ViewVariables(VVAccess.ReadOnly)]
|
||||
public List<ProtoId<CP14SkillPrototype>> Skills = new();
|
||||
|
||||
public override void AfterEquip(EntityUid mob)
|
||||
{
|
||||
var entMan = IoCManager.Resolve<IEntityManager>();
|
||||
var skillSystem = entMan.System<SharedCP14SkillSystem>();
|
||||
foreach (var skill in Skills)
|
||||
{
|
||||
skillSystem.TryLearnSkill(mob, skill);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
using Content.Shared._CP14.Skills.Prototypes;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._CP14.Skills.Components;
|
||||
|
||||
/// <summary>
|
||||
/// The ability to add a skill to an entity and quickly teach it some skills
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(SharedCP14SkillSystem))]
|
||||
public sealed partial class CP14AutoAddSkillComponent : Component
|
||||
{
|
||||
[DataField]
|
||||
public List<ProtoId<CP14SkillPrototype>> Skills = new();
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
using Content.Shared._CP14.Skills.Prototypes;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._CP14.Skills.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Limits the use of this entity behind certain skills
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(SharedCP14SkillSystem))]
|
||||
public sealed partial class CP14SkillRequirementComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// Is it necessary to have ALL the skills on the list to be able to use this entity?
|
||||
/// If not, one of any skill will suffice
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public bool NeedAll = false;
|
||||
|
||||
/// <summary>
|
||||
/// the chances of something going wrong when using wihout skill
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public float FuckupChance = 0.5f;
|
||||
|
||||
[DataField(required: true)]
|
||||
public List<ProtoId<CP14SkillPrototype>> RequiredSkills = new();
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
using Content.Shared._CP14.Skills.Prototypes;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._CP14.Skills.Components;
|
||||
|
||||
/// <summary>
|
||||
/// a list of skills learned by this entity
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(SharedCP14SkillSystem))]
|
||||
public sealed partial class CP14SkillsStorageComponent : Component
|
||||
{
|
||||
[DataField, ViewVariables(VVAccess.ReadOnly)]
|
||||
public List<ProtoId<CP14SkillPrototype>> Skills { get; private set; }= new();
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._CP14.Skills.Prototypes;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
[Prototype("CP14Skill")]
|
||||
public sealed partial class CP14SkillPrototype : IPrototype
|
||||
{
|
||||
[ViewVariables]
|
||||
[IdDataField]
|
||||
public string ID { get; private set; } = default!;
|
||||
|
||||
[DataField(required: true)]
|
||||
public LocId? Name{ get; private set; }
|
||||
|
||||
[DataField]
|
||||
public LocId? Desc{ get; private set; }
|
||||
|
||||
[DataField]
|
||||
public ComponentRegistry Components = new();
|
||||
}
|
||||
@@ -1,114 +0,0 @@
|
||||
using Content.Shared._CP14.Skills.Components;
|
||||
using Content.Shared._CP14.Skills.Prototypes;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Random;
|
||||
|
||||
namespace Content.Shared._CP14.Skills;
|
||||
|
||||
public partial class SharedCP14SkillSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly IPrototypeManager _proto = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
SubscribeLocalEvent<CP14SkillsStorageComponent, MapInitEvent>(OnMapInit);
|
||||
SubscribeLocalEvent<CP14AutoAddSkillComponent, MapInitEvent>(AutoAddSkill);
|
||||
}
|
||||
|
||||
private void AutoAddSkill(Entity<CP14AutoAddSkillComponent> ent, ref MapInitEvent args)
|
||||
{
|
||||
foreach (var skill in ent.Comp.Skills)
|
||||
{
|
||||
TryLearnSkill(ent, skill);
|
||||
}
|
||||
|
||||
RemComp(ent, ent.Comp);
|
||||
}
|
||||
|
||||
private void OnMapInit(Entity<CP14SkillsStorageComponent> ent, ref MapInitEvent args)
|
||||
{
|
||||
foreach (var skill in ent.Comp.Skills)
|
||||
{
|
||||
TryLearnSkill(ent, skill, force: true);
|
||||
}
|
||||
}
|
||||
|
||||
public bool HasEnoughSkillToUse(EntityUid user, EntityUid target, out List<ProtoId<CP14SkillPrototype>> missingSkills)
|
||||
{
|
||||
missingSkills = new();
|
||||
if (!TryComp<CP14SkillRequirementComponent>(target, out var requirement) || requirement.RequiredSkills.Count == 0)
|
||||
return true;
|
||||
|
||||
if (!TryComp<CP14SkillsStorageComponent>(user, out var skillStorage))
|
||||
{
|
||||
missingSkills = requirement.RequiredSkills;
|
||||
return false;
|
||||
}
|
||||
|
||||
var success = requirement.NeedAll;
|
||||
foreach (var skill in requirement.RequiredSkills)
|
||||
{
|
||||
var hasSkill = skillStorage.Skills.Contains(skill);
|
||||
|
||||
if (requirement.NeedAll && !hasSkill)
|
||||
{
|
||||
missingSkills.Add(skill);
|
||||
success = false;
|
||||
}
|
||||
else if (!requirement.NeedAll && hasSkill)
|
||||
{
|
||||
success = true;
|
||||
}
|
||||
else if (!requirement.NeedAll && !hasSkill)
|
||||
{
|
||||
missingSkills.Add(skill);
|
||||
}
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
public bool TryLearnSkill(EntityUid uid, ProtoId<CP14SkillPrototype> skill, bool force = false)
|
||||
{
|
||||
if (!TryComp<CP14SkillsStorageComponent>(uid, out var skillStorage))
|
||||
return false;
|
||||
|
||||
if (!skillStorage.Skills.Contains(skill))
|
||||
{
|
||||
skillStorage.Skills.Add(skill);
|
||||
if (!force)
|
||||
return false;
|
||||
}
|
||||
|
||||
var proto = _proto.Index(skill);
|
||||
EntityManager.AddComponents(uid, proto.Components);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool TryForgotSkill(EntityUid uid, ProtoId<CP14SkillPrototype> skill)
|
||||
{
|
||||
if (!TryComp<CP14SkillsStorageComponent>(uid, out var skillStorage))
|
||||
return false;
|
||||
|
||||
if (!skillStorage.Skills.Contains(skill))
|
||||
return false;
|
||||
|
||||
skillStorage.Skills.Remove(skill);
|
||||
|
||||
var proto = _proto.Index(skill);
|
||||
EntityManager.RemoveComponents(uid, proto.Components);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public sealed partial class CP14TrySkillIssueEvent : EntityEventArgs
|
||||
{
|
||||
public readonly EntityUid User;
|
||||
|
||||
public CP14TrySkillIssueEvent(EntityUid uid)
|
||||
{
|
||||
User = uid;
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@
|
||||
* https://github.com/space-wizards/space-station-14/blob/master/LICENSE.TXT
|
||||
*/
|
||||
|
||||
using Content.Shared._CP14.Knowledge.Prototypes;
|
||||
using Content.Shared.Stacks;
|
||||
using Content.Shared.Tag;
|
||||
using Robust.Shared.Audio;
|
||||
@@ -39,4 +40,10 @@ public sealed class CP14WorkbenchRecipePrototype : IPrototype
|
||||
|
||||
[DataField]
|
||||
public string Solution = "food";
|
||||
|
||||
/// <summary>
|
||||
/// If the player does not have this knowledge, the recipe will not be displayed in the workbench.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public ProtoId<CP14KnowledgePrototype>? KnowledgeRequired;
|
||||
}
|
||||
|
||||
18
Resources/Locale/en-US/_CP14/knowledge/skill-examined.ftl
Normal file
18
Resources/Locale/en-US/_CP14/knowledge/skill-examined.ftl
Normal file
@@ -0,0 +1,18 @@
|
||||
cp14-skill-label = [bold]Skill requirements[/bold]
|
||||
cp14-skill-examined = You need to have one of the following skills to use {$item}:
|
||||
cp14-skill-examined-need-all = You need to have all of the following skills in order to use {$item}:
|
||||
|
||||
cp14-skill-examined-skill = [color={$color}] - {$skill} [/color]
|
||||
|
||||
cp14-verb-categories-knowledge-add = Add knowledge:
|
||||
cp14-verb-categories-knowledge-remove = Delete knowledge:
|
||||
cp14-verb-categories-knowledge-learn = Learn knowledge:
|
||||
cp14-learned-new-knowledge = You have learned the knowledge of [bold]"{$name}[/bold]"!
|
||||
cp14-forgot-knowledge = You've lost your knowledge of [bold]"{$name}[/bold]"!
|
||||
|
||||
cp14-cant-learn-knowledge-dependencies =
|
||||
You were unable to understand {$target}...
|
||||
You lack the following knowledge:
|
||||
|
||||
cp14-knowledge-book-pre-text = Here you will find detailed instructions that explain
|
||||
cp14-knowledge-book-post-text = (To explore this knowledge, right-click on the book, and select ‘Learn Knowledge‘)
|
||||
24
Resources/Locale/en-US/_CP14/knowledge/skill-meta.ftl
Normal file
24
Resources/Locale/en-US/_CP14/knowledge/skill-meta.ftl
Normal file
@@ -0,0 +1,24 @@
|
||||
# T1
|
||||
|
||||
cp14-knowledge-sewing-name = Clothing sewing
|
||||
cp14-knowledge-sewing-desc = how to make simple clothes on sewing table
|
||||
|
||||
cp14-knowledge-wallpaper-name = Wallpaper production
|
||||
cp14-knowledge-wallpaper-desc = how to create wallpaper on sewing table
|
||||
|
||||
cp14-knowledge-woodwork-name = Woodwork
|
||||
cp14-knowledge-woodwork-desc = how to make simple objects out of wood
|
||||
|
||||
cp14-knowledge-metall-melting-name = Metall melting
|
||||
cp14-knowledge-metall-melting-desc = how to smelt ore into valuable metals
|
||||
|
||||
cp14-knowledge-metall-forging-name = Metall forging
|
||||
cp14-knowledge-metall-forging-desc = how to forge metal into different shapes
|
||||
|
||||
cp14-knowledge-metall-glasswork-name = Glasswork
|
||||
cp14-knowledge-metall-glasswork-desc = how to work with glass.
|
||||
|
||||
# T2
|
||||
|
||||
cp14-knowledge-sewing2-name = Advanced clothing sewing
|
||||
cp14-knowledge-sewing2-desc = how to create quality clothes on sewing table
|
||||
@@ -1,5 +0,0 @@
|
||||
cp14-skill-label = [bold]Skill requirements[/bold]
|
||||
cp14-skill-examined = You need to have one of the following skills to use {$item}:
|
||||
cp14-skill-examined-need-all = You need to have all of the following skills in order to use {$item}:
|
||||
|
||||
cp14-skill-examined-skill = [color={$color}] - {$skill} [/color]
|
||||
@@ -1,11 +0,0 @@
|
||||
cp14-skill-name-alchemy = Alchemy
|
||||
cp14-skill-desc-alchemy = You are experienced enough to use complex alchemical equipment with confidence.
|
||||
|
||||
cp14-skill-name-blacksmith = Blacksmithing
|
||||
cp14-skill-desc-blacksmith = You know the intricacies of working with metal
|
||||
|
||||
cp14-skill-name-warcraft = Mastery of martial weapons
|
||||
cp14-skill-desc-warcraft = You're good with a serious, martial weapon.
|
||||
|
||||
cp14-skill-name-firearms = Firearms shooting
|
||||
cp14-skill-desc-firearms = You are experienced enough to use firearms.
|
||||
@@ -3,4 +3,4 @@ cp14-workbench-ui-title = Item creation
|
||||
cp14-workbench-craft = Craft
|
||||
cp14-workbench-recipe-list = Recipe:
|
||||
|
||||
cp14-workbench-no-resource = There aren't enough ingredients!
|
||||
cp14-workbench-cant-craft = Craft failed!
|
||||
18
Resources/Locale/ru-RU/_CP14/knowledge/skill-examined.ftl
Normal file
18
Resources/Locale/ru-RU/_CP14/knowledge/skill-examined.ftl
Normal file
@@ -0,0 +1,18 @@
|
||||
cp14-skill-label = [bold]Требования к навыкам[/bold]
|
||||
cp14-skill-examined = Вам нужно владеть одним из следующих навыков, чтобы использовать {$item}:
|
||||
cp14-skill-examined-need-all = Вам нужно владеть всеми следующими навыками, чтобы использовать {$item}:
|
||||
|
||||
cp14-skill-examined-skill = [color={$color}] - {$skill} [/color]
|
||||
|
||||
cp14-verb-categories-knowledge-add = Научить знаниям:
|
||||
cp14-verb-categories-knowledge-remove = Удалить знания:
|
||||
cp14-verb-categories-knowledge-learn = Изучить знания:
|
||||
cp14-learned-new-knowledge = Вы изучили знания о [bold]"{$name}[/bold]"!
|
||||
cp14-forgot-knowledge = Вы потеряли свои знания о [bold]"{$name}[/bold]"!
|
||||
|
||||
cp14-cant-learn-knowledge-dependencies =
|
||||
Вы не смогли понять {$target}...
|
||||
Вам не хватает понимания:
|
||||
|
||||
cp14-knowledge-book-pre-text = Здесь подробно описаны инструкции, объясняющие
|
||||
cp14-knowledge-book-post-text = (Чтобы изучить эти знания, нажмите ПКМ по книге, и выберите "Изучить знания")
|
||||
24
Resources/Locale/ru-RU/_CP14/knowledge/skill-meta.ftl
Normal file
24
Resources/Locale/ru-RU/_CP14/knowledge/skill-meta.ftl
Normal file
@@ -0,0 +1,24 @@
|
||||
# T1
|
||||
|
||||
cp14-knowledge-sewing-name = Шитье одежды
|
||||
cp14-knowledge-sewing-desc = как создавать простую одежду на ткацком станке
|
||||
|
||||
cp14-knowledge-wallpaper-name = Изготовление обоев
|
||||
cp14-knowledge-wallpaper-desc = как создавать обои на ткацком станке
|
||||
|
||||
cp14-knowledge-woodwork-name = Работа по дереву
|
||||
cp14-knowledge-woodwork-desc = как создавать простые предметы из дерева
|
||||
|
||||
cp14-knowledge-metall-melting-name = Переплавка металлов
|
||||
cp14-knowledge-metall-melting-desc = как переплавлять руду в ценные металлы
|
||||
|
||||
cp14-knowledge-metall-forging-name = Ковка металлов
|
||||
cp14-knowledge-metall-forging-desc = как перековывать металл в различные формы
|
||||
|
||||
cp14-knowledge-glasswork-name = Работа с стеклом
|
||||
cp14-knowledge-glasswork-desc = как работать со стеклом
|
||||
|
||||
# T2
|
||||
|
||||
cp14-knowledge-sewing2-name = Продвинутое шитье одежды
|
||||
cp14-knowledge-sewing2-desc = как создавать качественную одежду на ткацком станке
|
||||
@@ -1,5 +0,0 @@
|
||||
cp14-skill-label = [bold]Требования к навыкам[/bold]
|
||||
cp14-skill-examined = Вам нужно владеть одним из следующих навыков, чтобы использовать {$item}:
|
||||
cp14-skill-examined-need-all = Вам нужно владеть всеми следующими навыками, чтобы использовать {$item}:
|
||||
|
||||
cp14-skill-examined-skill = [color={$color}] - {$skill} [/color]
|
||||
@@ -1,11 +0,0 @@
|
||||
cp14-skill-name-alchemy = Алхимия
|
||||
cp14-skill-desc-alchemy = Вы достаточно опытны, чтобы уверенно пользоваться сложным алхимическим оборудованием.
|
||||
|
||||
cp14-skill-name-blacksmith = Кузнечное дело
|
||||
cp14-skill-desc-blacksmith = Вы знаете все тонкости работы с металлом.
|
||||
|
||||
cp14-skill-name-warcraft = Владение воинским оружием
|
||||
cp14-skill-desc-warcraft = Вы хорошо управляетесь с серьезным, воинским оружием.
|
||||
|
||||
cp14-skill-name-firearms = Стрельба из огнестрела
|
||||
cp14-skill-desc-firearms = Вы достаточно опытны, чтобы пользоваться огнестрельным оружием.
|
||||
@@ -3,4 +3,4 @@ cp14-workbench-ui-title = Создание предметов
|
||||
cp14-workbench-craft = Создать
|
||||
cp14-workbench-recipe-list = Рецепт:
|
||||
|
||||
cp14-workbench-no-resource = Не хватает ингредиентов!
|
||||
cp14-workbench-cant-craft = Крафт не удался!
|
||||
@@ -24,16 +24,6 @@
|
||||
- !type:GroupSelector
|
||||
weight: 75
|
||||
children:
|
||||
- !type:GroupSelector
|
||||
children:
|
||||
- id: CP14SilverCoin1
|
||||
weight: 0.1
|
||||
- id: CP14CopperCoin
|
||||
weight: 0.1
|
||||
- id: CP14CopperCoin5
|
||||
weight: 0.5
|
||||
- id: CP14CopperCoin1
|
||||
weight: 1
|
||||
- !type:GroupSelector
|
||||
children:
|
||||
- id: CP14SpellScrollIceShards
|
||||
@@ -69,6 +59,10 @@
|
||||
- id: CP14VialSmallBlueAmanita
|
||||
- id: CP14VialTinyChromiumSlime
|
||||
- id: CP14VialTinyLumiMushroom
|
||||
- !type:GroupSelector
|
||||
children:
|
||||
- id: CP14BookKnowledgeClothingSewing
|
||||
- id: CP14BookKnowledgeWallpaperCraft
|
||||
- id: CP14SilverCoin5
|
||||
- id: CP14BaseLockpick
|
||||
- id: CP14EnergyCrystalMediumEmpty
|
||||
@@ -109,21 +103,15 @@
|
||||
- !type:NestedSelector
|
||||
tableId: CP14TableDemiplaneLootT1
|
||||
weight: 0.25
|
||||
# Coins
|
||||
- !type:GroupSelector
|
||||
children:
|
||||
- id: CP14SilverCoin5
|
||||
weight: 0.1
|
||||
- id: CP14SilverCoin1
|
||||
weight: 0.3
|
||||
- id: CP14CopperCoin5
|
||||
weight: 0.5
|
||||
- !type:GroupSelector
|
||||
children:
|
||||
- id: CP14SpellScrollShadowStep
|
||||
- id: CP14SpellScrollFireball
|
||||
- id: CP14SpellScrollBeerCreation
|
||||
weight: 0.2
|
||||
- !type:GroupSelector
|
||||
children:
|
||||
- id: CP14BookKnowledgeAdvancedClothingSewing
|
||||
- id: CP14EnergyCrystalMediumEmpty
|
||||
# Rare
|
||||
- !type:GroupSelector
|
||||
|
||||
@@ -11,10 +11,6 @@
|
||||
- type: Loadout
|
||||
prototypes:
|
||||
- CP14MobSkeleton
|
||||
- type: CP14SkillsStorage
|
||||
- type: CP14AutoAddSkill
|
||||
skills:
|
||||
- Warcraft
|
||||
|
||||
- type: entity
|
||||
id: CP14MobUndeadSkeletonCloset
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
sprite: Mobs/Customization/masking_helpers.rsi
|
||||
state: unisex_full
|
||||
visible: false
|
||||
- map: [ "shoes" ]
|
||||
- map: [ "shirt" ]
|
||||
- map: [ "pants" ]
|
||||
- map: [ "enum.HumanoidVisualLayers.LFoot" ]
|
||||
@@ -33,7 +34,6 @@
|
||||
- map: [ "enum.HumanoidVisualLayers.LHand" ]
|
||||
- map: [ "enum.HumanoidVisualLayers.RHand" ]
|
||||
- map: [ "gloves" ]
|
||||
- map: [ "shoes" ]
|
||||
- map: [ "ears" ]
|
||||
- map: [ "cloak" ]
|
||||
- map: [ "eyes" ]
|
||||
@@ -311,7 +311,7 @@
|
||||
Asphyxiation: -1.0
|
||||
- type: FireVisuals
|
||||
alternateState: Standing #TODO - custom visuals
|
||||
- type: CP14SkillsStorage
|
||||
- type: CP14KnowledgeStorage
|
||||
|
||||
- type: entity
|
||||
save: false
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
sprite: Mobs/Customization/masking_helpers.rsi
|
||||
state: unisex_full
|
||||
visible: false
|
||||
- map: [ "shoes" ]
|
||||
- map: [ "shirt" ]
|
||||
- map: [ "pants" ]
|
||||
- map: [ "enum.HumanoidVisualLayers.LFoot" ]
|
||||
@@ -33,7 +34,6 @@
|
||||
- map: [ "enum.HumanoidVisualLayers.HeadSide" ] # Bark Before clothing
|
||||
- map: [ "enum.HumanoidVisualLayers.HeadTop" ] # Bark Before clothing
|
||||
- map: [ "gloves" ]
|
||||
- map: [ "shoes" ]
|
||||
- map: [ "ears" ]
|
||||
- map: [ "cloak" ]
|
||||
- map: [ "eyes" ]
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
- map: [ "enum.HumanoidVisualLayers.LArm" ]
|
||||
- map: [ "enum.HumanoidVisualLayers.RLeg" ]
|
||||
- map: [ "enum.HumanoidVisualLayers.LLeg" ]
|
||||
- map: [ "shoes" ]
|
||||
- map: [ "shirt" ]
|
||||
- map: [ "pants" ]
|
||||
- map: [ "enum.HumanoidVisualLayers.LFoot" ]
|
||||
@@ -25,7 +26,6 @@
|
||||
- map: [ "enum.HumanoidVisualLayers.LHand" ]
|
||||
- map: [ "enum.HumanoidVisualLayers.RHand" ]
|
||||
- map: [ "gloves" ]
|
||||
- map: [ "shoes" ]
|
||||
- map: [ "ears" ]
|
||||
- map: [ "cloak" ]
|
||||
- map: [ "eyes" ]
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
- map: [ "enum.HumanoidVisualLayers.LArm" ]
|
||||
- map: [ "enum.HumanoidVisualLayers.RLeg" ]
|
||||
- map: [ "enum.HumanoidVisualLayers.LLeg" ]
|
||||
- map: [ "shoes" ]
|
||||
- map: [ "shirt" ]
|
||||
- map: [ "pants" ]
|
||||
- map: [ "enum.HumanoidVisualLayers.LFoot" ]
|
||||
@@ -26,7 +27,6 @@
|
||||
- map: [ "enum.HumanoidVisualLayers.LHand" ]
|
||||
- map: [ "enum.HumanoidVisualLayers.RHand" ]
|
||||
- map: [ "gloves" ]
|
||||
- map: [ "shoes" ]
|
||||
- map: [ "ears" ]
|
||||
- map: [ "cloak" ]
|
||||
- map: [ "eyes" ]
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
- type: entity
|
||||
parent: BookRandom
|
||||
id: CP14BookKnowledgeBase
|
||||
abstract: true
|
||||
categories: [ ForkFiltered ]
|
||||
name: knowledge book
|
||||
description: This book holds valuable knowledge that you can learn... if you're ready for it.
|
||||
components:
|
||||
- type: CP14KnowledgePaperText
|
||||
|
||||
#TODO: Уникальный визуал каждой книжке
|
||||
|
||||
# T0
|
||||
|
||||
- type: entity
|
||||
parent: CP14BookKnowledgeBase
|
||||
id: CP14BookKnowledgeWoodWork
|
||||
suffix: Wood Work
|
||||
components:
|
||||
- type: CP14KnowledgeLearningSource
|
||||
knowledges:
|
||||
- WoodWork
|
||||
|
||||
- type: entity
|
||||
parent: CP14BookKnowledgeBase
|
||||
id: CP14BookKnowledgeMetallMelting
|
||||
suffix: Metall Melting
|
||||
components:
|
||||
- type: CP14KnowledgeLearningSource
|
||||
knowledges:
|
||||
- MetallMelting
|
||||
|
||||
- type: entity
|
||||
parent: CP14BookKnowledgeBase
|
||||
id: CP14BookKnowledgeMetallForging
|
||||
suffix: Metall Forging
|
||||
components:
|
||||
- type: CP14KnowledgeLearningSource
|
||||
knowledges:
|
||||
- MetallForging
|
||||
|
||||
- type: entity
|
||||
parent: CP14BookKnowledgeBase
|
||||
id: CP14BookKnowledgeGlasswork
|
||||
suffix: Glasswork
|
||||
components:
|
||||
- type: CP14KnowledgeLearningSource
|
||||
knowledges:
|
||||
- Glasswork
|
||||
|
||||
# T1
|
||||
|
||||
- type: entity
|
||||
parent: CP14BookKnowledgeBase
|
||||
id: CP14BookKnowledgeClothingSewing
|
||||
suffix: Clothing Sewing
|
||||
components:
|
||||
- type: CP14KnowledgeLearningSource
|
||||
knowledges:
|
||||
- ClothingSewing
|
||||
|
||||
- type: entity
|
||||
parent: CP14BookKnowledgeBase
|
||||
id: CP14BookKnowledgeWallpaperCraft
|
||||
suffix: Wallpaper Craft
|
||||
components:
|
||||
- type: CP14KnowledgeLearningSource
|
||||
knowledges:
|
||||
- WallpaperCraft
|
||||
|
||||
# T2
|
||||
|
||||
- type: entity
|
||||
parent: CP14BookKnowledgeBase
|
||||
id: CP14BookKnowledgeAdvancedClothingSewing
|
||||
suffix: Advanced Clothing Sewing
|
||||
components:
|
||||
- type: CP14KnowledgeLearningSource
|
||||
knowledges:
|
||||
- AdvancedClothingSewing
|
||||
|
||||
@@ -87,10 +87,6 @@
|
||||
sprite: _CP14/Objects/Specific/Alchemy/mortar_pestle.rsi
|
||||
state: pestle
|
||||
- type: CP14Pestle
|
||||
- type: CP14SkillRequirement
|
||||
fuckupChance: 0.05
|
||||
requiredSkills:
|
||||
- Alchemy
|
||||
- type: GuideHelp
|
||||
guides:
|
||||
- CP14_RU_Alchemy
|
||||
|
||||
@@ -25,9 +25,4 @@
|
||||
- !type:DoActsBehavior
|
||||
acts: ["Destruction"]
|
||||
- type: CP14SharpeningStone
|
||||
sharpnessHeal: 0.1
|
||||
- type: CP14SkillRequirement
|
||||
fuckupChance: 0.6
|
||||
requiredSkills:
|
||||
- Warcraft
|
||||
- Blacksmith
|
||||
sharpnessHeal: 0.1
|
||||
@@ -49,10 +49,6 @@
|
||||
- type: MeleeThrowOnHit
|
||||
lifetime: 0.05
|
||||
speed: 5
|
||||
- type: CP14SkillRequirement
|
||||
fuckupChance: 0.5
|
||||
requiredSkills:
|
||||
- Warcraft
|
||||
- type: Tool
|
||||
qualities:
|
||||
- CP14Hammering
|
||||
|
||||
@@ -43,9 +43,4 @@
|
||||
sharpnessHeal: 0.1
|
||||
targetDamage:
|
||||
types:
|
||||
blunt: 0.5
|
||||
- type: CP14SkillRequirement
|
||||
fuckupChance: 0.5
|
||||
requiredSkills:
|
||||
- Warcraft
|
||||
- Blacksmith
|
||||
blunt: 0.5
|
||||
42
Resources/Prototypes/_CP14/Knowledge/knowledges.yml
Normal file
42
Resources/Prototypes/_CP14/Knowledge/knowledges.yml
Normal file
@@ -0,0 +1,42 @@
|
||||
# T0
|
||||
|
||||
- type: CP14Knowledge
|
||||
id: WoodWork
|
||||
name: cp14-knowledge-woodwork-name
|
||||
desc: cp14-knowledge-woodwork-desc
|
||||
|
||||
- type: CP14Knowledge
|
||||
id: MetallMelting
|
||||
name: cp14-knowledge-metall-melting-name
|
||||
desc: cp14-knowledge-metall-melting-desc
|
||||
|
||||
- type: CP14Knowledge
|
||||
id: MetallForging
|
||||
name: cp14-knowledge-metall-forging-name
|
||||
desc: cp14-knowledge-metall-forging-desc
|
||||
|
||||
- type: CP14Knowledge
|
||||
id: Glasswork
|
||||
name: cp14-knowledge-glasswork-name
|
||||
desc: cp14-knowledge-glasswork-desc
|
||||
|
||||
# T1
|
||||
|
||||
- type: CP14Knowledge
|
||||
id: ClothingSewing
|
||||
name: cp14-knowledge-sewing-name
|
||||
desc: cp14-knowledge-sewing-desc
|
||||
|
||||
- type: CP14Knowledge
|
||||
id: WallpaperCraft
|
||||
name: cp14-knowledge-wallpaper-name
|
||||
desc: cp14-knowledge-wallpaper-desc
|
||||
|
||||
# T2
|
||||
|
||||
- type: CP14Knowledge
|
||||
id: AdvancedClothingSewing
|
||||
name: cp14-knowledge-sewing2-name
|
||||
desc: cp14-knowledge-sewing2-desc
|
||||
dependencies:
|
||||
- ClothingSewing
|
||||
@@ -12,10 +12,6 @@
|
||||
- BaseWeaponSharp
|
||||
- !type:AddComponents
|
||||
components:
|
||||
- type: CP14SkillRequirement
|
||||
fuckupChance: 0.5
|
||||
requiredSkills:
|
||||
- Warcraft
|
||||
- !type:EditMeleeWeapon
|
||||
newWideAnimation: CP14WeaponArcThrust
|
||||
resetOnHandSelected: true # Disable fast swap
|
||||
|
||||
@@ -12,10 +12,6 @@
|
||||
- BaseWeaponSharp
|
||||
- !type:AddComponents
|
||||
components:
|
||||
- type: CP14SkillRequirement
|
||||
fuckupChance: 0.3
|
||||
requiredSkills:
|
||||
- Warcraft
|
||||
- !type:EditMeleeWeapon
|
||||
resetOnHandSelected: true # Disable fast swap
|
||||
bonusRange: 0.2
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
CP14WoodenPlanks: 2
|
||||
CP14IronBar: 2
|
||||
result: CP14BaseShield
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14BaseCrowbar
|
||||
@@ -14,6 +15,7 @@
|
||||
stacks:
|
||||
CP14IronBar: 2
|
||||
result: CP14BaseCrowbar
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14BaseWrench
|
||||
@@ -22,6 +24,7 @@
|
||||
stacks:
|
||||
CP14IronBar: 2
|
||||
result: CP14BaseWrench
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingCloakCuirass
|
||||
@@ -30,6 +33,7 @@
|
||||
stacks:
|
||||
CP14IronBar: 5
|
||||
result: CP14ClothingCloakCuirass
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingCloakInfantryCuirass
|
||||
@@ -38,6 +42,7 @@
|
||||
stacks:
|
||||
CP14IronBar: 6
|
||||
result: CP14ClothingCloakInfantryCuirass
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingCloakCuirassLoincloth
|
||||
@@ -46,6 +51,7 @@
|
||||
stacks:
|
||||
CP14IronBar: 6
|
||||
result: CP14ClothingCloakCuirassLoincloth
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingCloakCuirassLeg
|
||||
@@ -54,6 +60,7 @@
|
||||
stacks:
|
||||
CP14IronBar: 7
|
||||
result: CP14ClothingCloakCuirassLeg
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14Nail10
|
||||
@@ -62,6 +69,7 @@
|
||||
stacks:
|
||||
CP14IronBar: 2
|
||||
result: CP14Nail10
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14CrystalLampBlueEmpty
|
||||
@@ -71,6 +79,7 @@
|
||||
CP14CopperBar: 2
|
||||
CP14IronBar: 1
|
||||
result: CP14CrystalLampBlueEmpty
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14CrystalLampOrangeEmpty
|
||||
@@ -80,6 +89,7 @@
|
||||
CP14CopperBar: 2
|
||||
CP14IronBar: 1
|
||||
result: CP14CrystalLampOrangeEmpty
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14Scissors
|
||||
@@ -88,6 +98,7 @@
|
||||
stacks:
|
||||
CP14IronBar: 1
|
||||
result: CP14Scissors
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingCloakBrassArmor
|
||||
@@ -96,6 +107,7 @@
|
||||
stacks:
|
||||
CP14CopperBar: 6
|
||||
result: CP14ClothingCloakBrassArmor
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14Crossbolt
|
||||
@@ -104,6 +116,7 @@
|
||||
stacks:
|
||||
CP14CopperBar: 1
|
||||
result: CP14Crossbolt
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14BaseLockpick
|
||||
@@ -112,6 +125,7 @@
|
||||
stacks:
|
||||
CP14IronBar: 1
|
||||
result: CP14BaseLockpick
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
# Dagger
|
||||
|
||||
@@ -122,6 +136,7 @@
|
||||
stacks:
|
||||
CP14IronBar: 1
|
||||
result: CP14ModularBladeIronDagger
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeGoldDagger
|
||||
@@ -130,6 +145,7 @@
|
||||
stacks:
|
||||
CP14GoldBar: 1
|
||||
result: CP14ModularBladeGoldDagger
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeCopperDagger
|
||||
@@ -138,6 +154,7 @@
|
||||
stacks:
|
||||
CP14CopperBar: 1
|
||||
result: CP14ModularBladeCopperDagger
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeMithrilDagger
|
||||
@@ -146,6 +163,7 @@
|
||||
stacks:
|
||||
CP14MithrilBar: 1
|
||||
result: CP14ModularBladeMithrilDagger
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
# Spear
|
||||
|
||||
@@ -156,6 +174,7 @@
|
||||
stacks:
|
||||
CP14IronBar: 1
|
||||
result: CP14ModularBladeIronSpear
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeCopperSpear
|
||||
@@ -164,6 +183,7 @@
|
||||
stacks:
|
||||
CP14CopperBar: 1
|
||||
result: CP14ModularBladeCopperSpear
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeGoldSpear
|
||||
@@ -172,6 +192,7 @@
|
||||
stacks:
|
||||
CP14GoldBar: 1
|
||||
result: CP14ModularBladeGoldSpear
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeMithrilSpear
|
||||
@@ -180,6 +201,7 @@
|
||||
stacks:
|
||||
CP14MithrilBar: 1
|
||||
result: CP14ModularBladeMithrilSpear
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
# Mace
|
||||
|
||||
@@ -190,6 +212,7 @@
|
||||
stacks:
|
||||
CP14IronBar: 1
|
||||
result: CP14ModularBladeIronMace
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeGoldMace
|
||||
@@ -198,6 +221,7 @@
|
||||
stacks:
|
||||
CP14GoldBar: 1
|
||||
result: CP14ModularBladeGoldMace
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeCopperMace
|
||||
@@ -206,6 +230,7 @@
|
||||
stacks:
|
||||
CP14CopperBar: 1
|
||||
result: CP14ModularBladeCopperMace
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeMithrilMace
|
||||
@@ -214,6 +239,7 @@
|
||||
stacks:
|
||||
CP14MithrilBar: 1
|
||||
result: CP14ModularBladeMithrilMace
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
# Sword
|
||||
|
||||
@@ -224,6 +250,7 @@
|
||||
stacks:
|
||||
CP14IronBar: 2
|
||||
result: CP14ModularBladeIronSword
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeGoldSword
|
||||
@@ -232,6 +259,7 @@
|
||||
stacks:
|
||||
CP14GoldBar: 2
|
||||
result: CP14ModularBladeGoldSword
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeCopperSword
|
||||
@@ -240,6 +268,7 @@
|
||||
stacks:
|
||||
CP14CopperBar: 2
|
||||
result: CP14ModularBladeCopperSword
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeMithrilSword
|
||||
@@ -248,6 +277,7 @@
|
||||
stacks:
|
||||
CP14MithrilBar: 2
|
||||
result: CP14ModularBladeMithrilSword
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
# Sickle
|
||||
|
||||
@@ -258,6 +288,7 @@
|
||||
stacks:
|
||||
CP14IronBar: 1
|
||||
result: CP14ModularBladeIronSickle
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeCopperSickle
|
||||
@@ -266,6 +297,7 @@
|
||||
stacks:
|
||||
CP14CopperBar: 1
|
||||
result: CP14ModularBladeCopperSickle
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeGoldSickle
|
||||
@@ -274,6 +306,7 @@
|
||||
stacks:
|
||||
CP14GoldBar: 1
|
||||
result: CP14ModularBladeGoldSickle
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeMithrilSickle
|
||||
@@ -282,6 +315,7 @@
|
||||
stacks:
|
||||
CP14MithrilBar: 1
|
||||
result: CP14ModularBladeMithrilSickle
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
# Shovel
|
||||
|
||||
@@ -292,6 +326,7 @@
|
||||
stacks:
|
||||
CP14IronBar: 1
|
||||
result: CP14ModularBladeIronShovel
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeGoldShovel
|
||||
@@ -300,6 +335,7 @@
|
||||
stacks:
|
||||
CP14GoldBar: 1
|
||||
result: CP14ModularBladeGoldShovel
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
|
||||
- type: CP14Recipe
|
||||
@@ -309,6 +345,7 @@
|
||||
stacks:
|
||||
CP14CopperBar: 1
|
||||
result: CP14ModularBladeCopperShovel
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeMithrilShovel
|
||||
@@ -317,6 +354,7 @@
|
||||
stacks:
|
||||
CP14MithrilBar: 1
|
||||
result: CP14ModularBladeMithrilShovel
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
# Pickaxe
|
||||
|
||||
@@ -327,6 +365,7 @@
|
||||
stacks:
|
||||
CP14IronBar: 1
|
||||
result: CP14ModularBladeIronPickaxe
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeGoldPickaxe
|
||||
@@ -335,6 +374,7 @@
|
||||
stacks:
|
||||
CP14GoldBar: 2
|
||||
result: CP14ModularBladeGoldPickaxe
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeCopperPickaxe
|
||||
@@ -343,6 +383,7 @@
|
||||
stacks:
|
||||
CP14CopperBar: 2
|
||||
result: CP14ModularBladeCopperPickaxe
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeMithrilPickaxe
|
||||
@@ -351,6 +392,7 @@
|
||||
stacks:
|
||||
CP14MithrilBar: 1
|
||||
result: CP14ModularBladeMithrilPickaxe
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
# Grip
|
||||
|
||||
@@ -361,6 +403,7 @@
|
||||
stacks:
|
||||
CP14IronBar: 1
|
||||
result: CP14ModularGripIron
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularGripCopper
|
||||
@@ -369,6 +412,7 @@
|
||||
stacks:
|
||||
CP14CopperBar: 1
|
||||
result: CP14ModularGripCopper
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularGripGolden
|
||||
@@ -377,6 +421,7 @@
|
||||
stacks:
|
||||
CP14GoldBar: 1
|
||||
result: CP14ModularGripGolden
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularGripMithril
|
||||
@@ -385,6 +430,7 @@
|
||||
stacks:
|
||||
CP14MithrilBar: 1
|
||||
result: CP14ModularGripMithril
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
# Grip long
|
||||
|
||||
@@ -395,6 +441,7 @@
|
||||
stacks:
|
||||
CP14IronBar: 2
|
||||
result: CP14ModularGripIronLong
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularGripCopperLong
|
||||
@@ -403,6 +450,7 @@
|
||||
stacks:
|
||||
CP14CopperBar: 2
|
||||
result: CP14ModularGripCopperLong
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularGripGoldLong
|
||||
@@ -411,6 +459,7 @@
|
||||
stacks:
|
||||
CP14GoldBar: 2
|
||||
result: CP14ModularGripGoldLong
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularGripMithrilLong
|
||||
@@ -419,6 +468,7 @@
|
||||
stacks:
|
||||
CP14MithrilBar: 2
|
||||
result: CP14ModularGripMithrilLong
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
# Rapier
|
||||
|
||||
@@ -429,6 +479,7 @@
|
||||
stacks:
|
||||
CP14IronBar: 1
|
||||
result: CP14ModularBladeIronRapier
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeGoldRapier
|
||||
@@ -437,6 +488,7 @@
|
||||
stacks:
|
||||
CP14GoldBar: 1
|
||||
result: CP14ModularBladeGoldRapier
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeCopperRapier
|
||||
@@ -445,6 +497,7 @@
|
||||
stacks:
|
||||
CP14CopperBar: 1
|
||||
result: CP14ModularBladeCopperRapier
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeMithrilRapier
|
||||
@@ -453,6 +506,7 @@
|
||||
stacks:
|
||||
CP14MithrilBar: 1
|
||||
result: CP14ModularBladeMithrilRapier
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
# Axe
|
||||
|
||||
@@ -463,6 +517,7 @@
|
||||
stacks:
|
||||
CP14IronBar: 2
|
||||
result: CP14ModularBladeIronAxe
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeCopperAxe
|
||||
@@ -471,6 +526,7 @@
|
||||
stacks:
|
||||
CP14CopperBar: 2
|
||||
result: CP14ModularBladeCopperAxe
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeGoldAxe
|
||||
@@ -479,6 +535,7 @@
|
||||
stacks:
|
||||
CP14GoldBar: 2
|
||||
result: CP14ModularBladeGoldAxe
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularBladeMithrilAxe
|
||||
@@ -487,6 +544,7 @@
|
||||
stacks:
|
||||
CP14MithrilBar: 2
|
||||
result: CP14ModularBladeMithrilAxe
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
# Sharp garde
|
||||
|
||||
@@ -497,6 +555,7 @@
|
||||
stacks:
|
||||
CP14CopperBar: 1
|
||||
result: CP14ModularGardeSharpCopper
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularGardeSharpIron
|
||||
@@ -505,6 +564,7 @@
|
||||
stacks:
|
||||
CP14IronBar: 1
|
||||
result: CP14ModularGardeSharpIron
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularGardeSharpGold
|
||||
@@ -513,6 +573,7 @@
|
||||
stacks:
|
||||
CP14GoldBar: 1
|
||||
result: CP14ModularGardeSharpGold
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularGardeSharpMithril
|
||||
@@ -521,6 +582,7 @@
|
||||
stacks:
|
||||
CP14MithrilBar: 1
|
||||
result: CP14ModularGardeSharpMithril
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
# Sturdy garde
|
||||
|
||||
@@ -531,6 +593,7 @@
|
||||
stacks:
|
||||
CP14CopperBar: 1
|
||||
result: CP14ModularGardeSturdyCopper
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularGardeSturdyIron
|
||||
@@ -539,6 +602,7 @@
|
||||
stacks:
|
||||
CP14IronBar: 1
|
||||
result: CP14ModularGardeSturdyIron
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularGardeSturdyGold
|
||||
@@ -547,6 +611,7 @@
|
||||
stacks:
|
||||
CP14GoldBar: 1
|
||||
result: CP14ModularGardeSturdyGold
|
||||
knowledgeRequired: MetallForging
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularGardeSturdyMithril
|
||||
@@ -554,4 +619,5 @@
|
||||
craftTime: 4
|
||||
stacks:
|
||||
CP14MithrilBar: 1
|
||||
result: CP14ModularGardeSturdyMithril
|
||||
result: CP14ModularGardeSturdyMithril
|
||||
knowledgeRequired: MetallForging
|
||||
@@ -5,6 +5,7 @@
|
||||
entities:
|
||||
CP14OreCopper: 4
|
||||
result: CP14CopperBar1
|
||||
knowledgeRequired: MetallMelting
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14IronBar1
|
||||
@@ -13,6 +14,7 @@
|
||||
entities:
|
||||
CP14OreIron: 4
|
||||
result: CP14IronBar1
|
||||
knowledgeRequired: MetallMelting
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14GoldBar1
|
||||
@@ -21,6 +23,7 @@
|
||||
entities:
|
||||
CP14OreGold: 4
|
||||
result: CP14GoldBar1
|
||||
knowledgeRequired: MetallMelting
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14MithrilBar1
|
||||
@@ -29,6 +32,7 @@
|
||||
entities:
|
||||
CP14OreMithril: 4
|
||||
result: CP14MithrilBar1
|
||||
knowledgeRequired: MetallMelting
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14GlassSheet1
|
||||
@@ -37,6 +41,7 @@
|
||||
entities:
|
||||
CP14QuartzShard: 1
|
||||
result: CP14GlassSheet1
|
||||
knowledgeRequired: Glasswork
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14GlassSheetShard1
|
||||
@@ -45,6 +50,7 @@
|
||||
entities:
|
||||
CP14GlassShard: 3
|
||||
result: CP14GlassSheet1
|
||||
knowledgeRequired: Glasswork
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14VialTiny
|
||||
@@ -53,6 +59,7 @@
|
||||
stacks:
|
||||
CP14GlassSheet: 1
|
||||
result: CP14VialTiny
|
||||
knowledgeRequired: Glasswork
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14VialTinyReinforced
|
||||
@@ -62,6 +69,7 @@
|
||||
CP14CopperBar: 1
|
||||
CP14GlassSheet: 1
|
||||
result: CP14VialTinyReinforced
|
||||
knowledgeRequired: Glasswork
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14VialSmall
|
||||
@@ -70,6 +78,7 @@
|
||||
stacks:
|
||||
CP14GlassSheet: 2
|
||||
result: CP14VialSmall
|
||||
knowledgeRequired: Glasswork
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14VialSmallReinforced
|
||||
@@ -79,4 +88,5 @@
|
||||
CP14CopperBar: 1
|
||||
CP14GlassSheet: 2
|
||||
result: CP14VialSmallReinforced
|
||||
knowledgeRequired: Glasswork
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
stacks:
|
||||
CP14Cloth: 2
|
||||
result: CP14ClothingShirtCottonBlue
|
||||
knowledgeRequired: ClothingSewing
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingShirtCottonBlack
|
||||
@@ -19,6 +20,7 @@
|
||||
stacks:
|
||||
CP14Cloth: 3
|
||||
result: CP14ClothingShirtCottonBlack
|
||||
knowledgeRequired: ClothingSewing
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingShirtCottonPurple
|
||||
@@ -30,6 +32,7 @@
|
||||
stacks:
|
||||
CP14Cloth: 3
|
||||
result: CP14ClothingShirtCottonPurple
|
||||
knowledgeRequired: ClothingSewing
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingShirtCottonRed
|
||||
@@ -41,6 +44,7 @@
|
||||
stacks:
|
||||
CP14Cloth: 3
|
||||
result: CP14ClothingShirtCottonRed
|
||||
knowledgeRequired: ClothingSewing
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingShirtCottonWhite
|
||||
@@ -51,6 +55,7 @@
|
||||
stacks:
|
||||
CP14Cloth: 3
|
||||
result: CP14ClothingShirtCottonWhite
|
||||
knowledgeRequired: ClothingSewing
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingShirtCottonYellow
|
||||
@@ -62,6 +67,147 @@
|
||||
stacks:
|
||||
CP14Cloth: 3
|
||||
result: CP14ClothingShirtCottonYellow
|
||||
knowledgeRequired: ClothingSewing
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingPantsTrouserWhite
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14String: 1
|
||||
stacks:
|
||||
CP14Cloth: 2
|
||||
result: CP14ClothingPantsTrouserWhite
|
||||
knowledgeRequired: ClothingSewing
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingPantsTrouserDarkBlue
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14String: 1
|
||||
CP14DyeBlue: 1
|
||||
stacks:
|
||||
CP14Cloth: 2
|
||||
result: CP14ClothingPantsTrouserDarkBlue
|
||||
knowledgeRequired: ClothingSewing
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingPantsDressBlack
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14String: 1
|
||||
CP14DyeBlack: 1
|
||||
stacks:
|
||||
CP14Cloth: 2
|
||||
result: CP14ClothingPantsDressBlack
|
||||
knowledgeRequired: ClothingSewing
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingPantsSouthernMagician
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14String: 1
|
||||
CP14DyeYellow: 1
|
||||
stacks:
|
||||
CP14Cloth: 2
|
||||
result: CP14ClothingPantsSouthernMagician
|
||||
knowledgeRequired: ClothingSewing
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingHeadBeretRed
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14String: 1
|
||||
CP14DyeRed: 1
|
||||
stacks:
|
||||
CP14Cloth: 1
|
||||
result: CP14ClothingHeadBeretRed
|
||||
knowledgeRequired: ClothingSewing
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingHeadBeretPurple
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14String: 1
|
||||
CP14DyePurple: 1
|
||||
stacks:
|
||||
CP14Cloth: 1
|
||||
result: CP14ClothingHeadBeretPurple
|
||||
knowledgeRequired: ClothingSewing
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingHeadBeretYellow
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14String: 1
|
||||
CP14DyeYellow: 1
|
||||
stacks:
|
||||
CP14Cloth: 1
|
||||
result: CP14ClothingHeadBeretYellow
|
||||
knowledgeRequired: ClothingSewing
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingHeadBeretBlue
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14String: 1
|
||||
CP14DyeBlue: 1
|
||||
stacks:
|
||||
CP14Cloth: 1
|
||||
result: CP14ClothingHeadBeretBlue
|
||||
knowledgeRequired: ClothingSewing
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingHeadBeretBlack
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14String: 1
|
||||
CP14DyeBlack: 1
|
||||
stacks:
|
||||
CP14Cloth: 1
|
||||
result: CP14ClothingHeadBeretBlack
|
||||
knowledgeRequired: ClothingSewing
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingHeadBandanaWhite
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14String: 1
|
||||
stacks:
|
||||
CP14Cloth: 2
|
||||
result: CP14ClothingHeadBandanaWhite
|
||||
knowledgeRequired: ClothingSewing
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingHeadBandanaYellow
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14String: 1
|
||||
CP14DyeYellow: 1
|
||||
stacks:
|
||||
CP14Cloth: 2
|
||||
result: CP14ClothingHeadBandanaYellow
|
||||
knowledgeRequired: ClothingSewing
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingHeadWreath
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14BloodFlower: 2
|
||||
CP14Dayflin: 2
|
||||
result: CP14ClothingHeadWreath
|
||||
knowledgeRequired: ClothingSewing
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingShirtMercenary
|
||||
@@ -74,6 +220,7 @@
|
||||
stacks:
|
||||
CP14Cloth: 3
|
||||
result: CP14ClothingShirtMercenary
|
||||
knowledgeRequired: AdvancedClothingSewing
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingShirtYellowWizard
|
||||
@@ -87,137 +234,7 @@
|
||||
stacks:
|
||||
CP14Cloth: 3
|
||||
result: CP14ClothingShirtYellowWizard
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingPantsTrouserWhite
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14String: 1
|
||||
stacks:
|
||||
CP14Cloth: 2
|
||||
result: CP14ClothingPantsTrouserWhite
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingPantsTrouserDarkBlue
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14String: 1
|
||||
CP14DyeBlue: 1
|
||||
stacks:
|
||||
CP14Cloth: 2
|
||||
result: CP14ClothingPantsTrouserDarkBlue
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingPantsDressBlack
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14String: 1
|
||||
CP14DyeBlack: 1
|
||||
stacks:
|
||||
CP14Cloth: 2
|
||||
result: CP14ClothingPantsDressBlack
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingPantsSouthernMagician
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14String: 1
|
||||
CP14DyeYellow: 1
|
||||
stacks:
|
||||
CP14Cloth: 2
|
||||
result: CP14ClothingPantsSouthernMagician
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingPantsMercenaryTrousers
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14String: 1
|
||||
CP14DyeBlue: 1
|
||||
CP14DyeRed: 1
|
||||
stacks:
|
||||
CP14Cloth: 2
|
||||
result: CP14ClothingPantsMercenaryTrousers
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingHeadBeretRed
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14String: 1
|
||||
CP14DyeRed: 1
|
||||
stacks:
|
||||
CP14Cloth: 1
|
||||
result: CP14ClothingHeadBeretRed
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingHeadBeretPurple
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14String: 1
|
||||
CP14DyePurple: 1
|
||||
stacks:
|
||||
CP14Cloth: 1
|
||||
result: CP14ClothingHeadBeretPurple
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingHeadBeretYellow
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14String: 1
|
||||
CP14DyeYellow: 1
|
||||
stacks:
|
||||
CP14Cloth: 1
|
||||
result: CP14ClothingHeadBeretYellow
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingHeadBeretBlue
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14String: 1
|
||||
CP14DyeBlue: 1
|
||||
stacks:
|
||||
CP14Cloth: 1
|
||||
result: CP14ClothingHeadBeretBlue
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingHeadBeretBlack
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14String: 1
|
||||
CP14DyeBlack: 1
|
||||
stacks:
|
||||
CP14Cloth: 1
|
||||
result: CP14ClothingHeadBeretBlack
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingHeadBandanaWhite
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14String: 1
|
||||
stacks:
|
||||
CP14Cloth: 2
|
||||
result: CP14ClothingHeadBandanaWhite
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingHeadBandanaYellow
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14String: 1
|
||||
CP14DyeYellow: 1
|
||||
stacks:
|
||||
CP14Cloth: 2
|
||||
result: CP14ClothingHeadBandanaYellow
|
||||
knowledgeRequired: AdvancedClothingSewing
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingHeadBeretMercenary
|
||||
@@ -230,15 +247,20 @@
|
||||
stacks:
|
||||
CP14Cloth: 2
|
||||
result: CP14ClothingHeadBeretMercenary
|
||||
knowledgeRequired: AdvancedClothingSewing
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ClothingHeadWreath
|
||||
id: CP14ClothingPantsMercenaryTrousers
|
||||
tag: CP14RecipeSewing
|
||||
craftTime: 2
|
||||
entities:
|
||||
CP14BloodFlower: 2
|
||||
CP14Dayflin: 2
|
||||
result: CP14ClothingHeadWreath
|
||||
CP14String: 1
|
||||
CP14DyeBlue: 1
|
||||
CP14DyeRed: 1
|
||||
stacks:
|
||||
CP14Cloth: 2
|
||||
result: CP14ClothingPantsMercenaryTrousers
|
||||
knowledgeRequired: AdvancedClothingSewing
|
||||
|
||||
# Wallpaper (TODO: Move to separate workbench?)
|
||||
|
||||
@@ -251,6 +273,7 @@
|
||||
entities:
|
||||
CP14DyeBlack: 1
|
||||
result: CP14WallpaperBlack
|
||||
knowledgeRequired: WallpaperCraft
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14WallpaperGreen
|
||||
@@ -261,6 +284,7 @@
|
||||
entities:
|
||||
CP14DyeGreen: 1
|
||||
result: CP14WallpaperGreen
|
||||
knowledgeRequired: WallpaperCraft
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14WallpaperPurple
|
||||
@@ -271,6 +295,7 @@
|
||||
entities:
|
||||
CP14DyePurple: 1
|
||||
result: CP14WallpaperPurple
|
||||
knowledgeRequired: WallpaperCraft
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14WallpaperRed
|
||||
@@ -281,6 +306,7 @@
|
||||
entities:
|
||||
CP14DyeRed: 1
|
||||
result: CP14WallpaperRed
|
||||
knowledgeRequired: WallpaperCraft
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14WallpaperWhite
|
||||
@@ -289,6 +315,7 @@
|
||||
stacks:
|
||||
CP14Cloth: 10
|
||||
result: CP14WallpaperWhite
|
||||
knowledgeRequired: WallpaperCraft
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14WallpaperWhite2
|
||||
@@ -297,6 +324,7 @@
|
||||
stacks:
|
||||
CP14Cloth: 10
|
||||
result: CP14WallpaperWhite2
|
||||
knowledgeRequired: WallpaperCraft
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14WallpaperYellow
|
||||
@@ -307,6 +335,7 @@
|
||||
entities:
|
||||
CP14DyeYellow: 1
|
||||
result: CP14WallpaperYellow
|
||||
knowledgeRequired: WallpaperCraft
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14CrayonBlack
|
||||
@@ -360,4 +389,4 @@
|
||||
entities:
|
||||
CP14CrayonWhite: 1
|
||||
CP14DyePurple: 1
|
||||
result: CP14CrayonPurple
|
||||
result: CP14CrayonPurple
|
||||
@@ -7,6 +7,7 @@
|
||||
stacks:
|
||||
CP14WoodenPlanks: 3
|
||||
result: CP14Bucket
|
||||
knowledgeRequired: WoodWork
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14WoodenBeerMug
|
||||
@@ -16,6 +17,7 @@
|
||||
CP14WoodenPlanks: 2
|
||||
CP14Nail: 1
|
||||
result: CP14WoodenBeerMug
|
||||
knowledgeRequired: WoodWork
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14PlateWooden
|
||||
@@ -24,6 +26,7 @@
|
||||
stacks:
|
||||
CP14WoodenPlanks: 2
|
||||
result: CP14PlateWooden
|
||||
knowledgeRequired: WoodWork
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14BaseMop
|
||||
@@ -33,6 +36,7 @@
|
||||
CP14WoodenPlanks: 2
|
||||
CP14Cloth: 1
|
||||
result: CP14BaseMop
|
||||
knowledgeRequired: WoodWork
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14Torch
|
||||
@@ -59,6 +63,7 @@
|
||||
stacks:
|
||||
CP14WoodenPlanks: 1
|
||||
result: CP14ModularGripWooden
|
||||
knowledgeRequired: WoodWork
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularGripWoodenLong
|
||||
@@ -67,6 +72,7 @@
|
||||
stacks:
|
||||
CP14WoodenPlanks: 2
|
||||
result: CP14ModularGripWoodenLong
|
||||
knowledgeRequired: WoodWork
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularGripLucens
|
||||
@@ -75,6 +81,7 @@
|
||||
stacks:
|
||||
CP14LucensWoodenPlanks: 1
|
||||
result: CP14ModularGripLucens
|
||||
knowledgeRequired: WoodWork
|
||||
|
||||
- type: CP14Recipe
|
||||
id: CP14ModularGripLucensLong
|
||||
@@ -83,3 +90,4 @@
|
||||
stacks:
|
||||
CP14LucensWoodenPlanks: 2
|
||||
result: CP14ModularGripLucensLong
|
||||
knowledgeRequired: WoodWork
|
||||
|
||||
@@ -6,10 +6,6 @@
|
||||
startingGear: CP14GuardGear
|
||||
icon: "CP14JobIconGuard"
|
||||
supervisors: cp14-job-supervisors-guard-commander
|
||||
special:
|
||||
- !type:CP14AddSkillSpecial
|
||||
skills:
|
||||
- Warcraft
|
||||
|
||||
- type: startingGear
|
||||
id: CP14GuardGear
|
||||
|
||||
@@ -11,10 +11,6 @@
|
||||
supervisors: cp14-job-supervisors-command
|
||||
weight: 2
|
||||
setPreference: true
|
||||
special:
|
||||
- !type:CP14AddSkillSpecial
|
||||
skills:
|
||||
- Warcraft
|
||||
|
||||
- type: startingGear
|
||||
id: CP14GuardCommanderGear
|
||||
|
||||
@@ -7,9 +7,9 @@
|
||||
icon: "CP14JobIconAdventurer"
|
||||
supervisors: cp14-job-supervisors-command
|
||||
special:
|
||||
- !type:CP14AddSkillSpecial
|
||||
skills:
|
||||
- Warcraft
|
||||
- !type:CP14AddKnowledgeSpecial
|
||||
knowledge:
|
||||
- WoodWork
|
||||
|
||||
- type: startingGear
|
||||
id: CP14AdventurerGear
|
||||
|
||||
@@ -7,9 +7,9 @@
|
||||
icon: "CP14JobIconAlchemist"
|
||||
supervisors: cp14-job-supervisors-command
|
||||
special:
|
||||
- !type:CP14AddSkillSpecial
|
||||
skills:
|
||||
- Alchemy
|
||||
- !type:CP14AddKnowledgeSpecial
|
||||
knowledge:
|
||||
- WoodWork
|
||||
|
||||
- type: startingGear
|
||||
id: CP14AlchemistGear
|
||||
|
||||
@@ -6,6 +6,10 @@
|
||||
startingGear: CP14ApprenticeGear
|
||||
icon: "CP14JobIconApprentice"
|
||||
supervisors: cp14-job-supervisors-command
|
||||
special:
|
||||
- !type:CP14AddKnowledgeSpecial
|
||||
knowledge:
|
||||
- WoodWork
|
||||
|
||||
- type: startingGear
|
||||
id: CP14ApprenticeGear
|
||||
|
||||
@@ -7,9 +7,12 @@
|
||||
icon: "CP14JobIconBlacksmith"
|
||||
supervisors: cp14-job-supervisors-command
|
||||
special:
|
||||
- !type:CP14AddSkillSpecial
|
||||
skills:
|
||||
- Blacksmith
|
||||
- !type:CP14AddKnowledgeSpecial
|
||||
knowledge:
|
||||
- WoodWork
|
||||
- MetallMelting
|
||||
- MetallForging
|
||||
- Glasswork
|
||||
|
||||
- type: startingGear
|
||||
id: CP14BlacksmithGear
|
||||
|
||||
@@ -6,6 +6,10 @@
|
||||
startingGear: CP14InnkeeperGear
|
||||
icon: "CP14JobIconInnkeeper"
|
||||
supervisors: cp14-job-supervisors-command
|
||||
special:
|
||||
- !type:CP14AddKnowledgeSpecial
|
||||
knowledge:
|
||||
- WoodWork
|
||||
|
||||
- type: startingGear
|
||||
id: CP14InnkeeperGear
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
- type: CP14Skill
|
||||
id: Alchemy
|
||||
name: cp14-skill-name-alchemy
|
||||
desc: cp14-skill-desc-alchemy
|
||||
|
||||
- type: CP14Skill
|
||||
id: Blacksmith
|
||||
name: cp14-skill-name-blacksmith
|
||||
desc: cp14-skill-desc-blacksmith
|
||||
|
||||
- type: CP14Skill
|
||||
id: Warcraft
|
||||
name: cp14-skill-name-warcraft
|
||||
desc: cp14-skill-desc-warcraft
|
||||
|
||||
- type: CP14Skill
|
||||
id: Firearms
|
||||
name: cp14-skill-name-firearms
|
||||
desc: cp14-skill-desc-firearms
|
||||
Reference in New Issue
Block a user