Modular weapon crafting WIP (#611)

* data initalizing

* modular assembling

* grips and blades sprites

* first prototypes

* jewerly decoration

* disassemble modular weapon

* grip start stats

* blade modifiers

* inhand sprites generation

* resprites inhand, add sickle, add attempt modify size

* auto inhand sprite parsing

* icon default parsing

* spear blade

* mace ball

* sword blade

* sharedization + autonetwork hotswipe

* wielding sprite support!

* iron long grip

* wielded sickle, fix ERROR sprite if state not added

* Update grips.yml

* wielded spear + ruby rework

* wielding damage bonus modifier

* modular size fix

* fix storedOffset rotation

* parts offset

* fix inheriting modifiers

* some bugfix and balance tweaks

* DPS Meter

* fix dividing by zero

* rebalance

* replace baseknife to modular knife. Delete ice knife spell

* sickle and mace modular replace

* modular spear & sword replacement. add wielded icons

* Update CP14DPSMeterSystem.cs

* back to serverization

* grip disassemble drop again

* clothing sprite generation code

* back slot long grips and mace

* remove jewerly slot, add more clothing states

* finish clothing states

* shovel modular

* YEEEEE

* anvil modular craft

* bugfixes

* more integration check fixes
This commit is contained in:
Ed
2024-11-29 01:31:42 +03:00
committed by GitHub
parent 8057fad4d3
commit 109edeb4b5
188 changed files with 2137 additions and 630 deletions

View File

@@ -30,7 +30,7 @@ public sealed class ClientClothingSystem : ClothingSystem
/// For some context, im currently refactoring inventory. Part of that is slots not being indexed by a massive enum anymore, but by strings.
/// Problem here: Every rsi-state is using the old enum-names in their state. I already used the new inventoryslots ALOT. tldr: its this or another week of renaming files.
/// </summary>
private static readonly Dictionary<string, string> TemporarySlotMap = new()
public static readonly Dictionary<string, string> TemporarySlotMap = new() //CP14 Public
{
{"head", "HELMET"},
{"eyes", "EYES"},

View File

@@ -160,8 +160,9 @@ public sealed class ItemGridPiece : Control, IEntityControl
}
// typically you'd divide by two, but since the textures are half a tile, this is done implicitly
var iconPosition = new Vector2((boundingGrid.Width + 1) * size.X + itemComponent.StoredOffset.X * 2,
(boundingGrid.Height + 1) * size.Y + itemComponent.StoredOffset.Y * 2);
var iconPosition = new Vector2(
(boundingGrid.Width + 1) * size.X + Location.Rotation.RotateVec(itemComponent.StoredOffset).X * 2,
(boundingGrid.Height + 1) * size.Y + Location.Rotation.RotateVec(itemComponent.StoredOffset).Y * 2);
var iconRotation = Location.Rotation + Angle.FromDegrees(itemComponent.StoredRotation);
if (itemComponent.StoredSprite is { } storageSprite)

View File

@@ -0,0 +1,213 @@
using Content.Client.Clothing;
using Content.Shared._CP14.ModularCraft;
using Content.Shared._CP14.ModularCraft.Components;
using Content.Shared.Clothing;
using Content.Shared.Hands;
using Content.Shared.Inventory;
using Content.Shared.Item;
using Content.Shared.Wieldable.Components;
using Robust.Client.GameObjects;
using Robust.Client.ResourceManagement;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations;
namespace Content.Client._CP14.ModularCraft;
public sealed class CP14ClientModularCraftSystem : CP14SharedModularCraftSystem
{
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly IResourceCache _resCache = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<CP14ModularCraftStartPointComponent, AfterAutoHandleStateEvent>(OnAfterHandleState);
SubscribeLocalEvent<CP14ModularCraftStartPointComponent, GetInhandVisualsEvent>(OnGetInhandVisuals);
SubscribeLocalEvent<CP14ModularCraftStartPointComponent, GetEquipmentVisualsEvent>(OnGetEquipmentVisuals);
}
private void OnAfterHandleState(Entity<CP14ModularCraftStartPointComponent> start,
ref AfterAutoHandleStateEvent args)
{
if (!TryComp<SpriteComponent>(start, out var sprite))
return;
UpdateIcon(start, sprite);
}
private void UpdateIcon(Entity<CP14ModularCraftStartPointComponent> start, SpriteComponent? sprite = null)
{
if (!Resolve(start, ref sprite, false))
return;
//Remove old layers
foreach (var key in start.Comp.RevealedLayers)
{
sprite.RemoveLayer(key);
}
start.Comp.RevealedLayers.Clear();
//Add new layers
var counterPart = 0;
foreach (var part in start.Comp.InstalledParts)
{
var indexedPart = _proto.Index(part);
if (indexedPart.IconSprite is null)
{
//Try get default sprite
if (indexedPart.RsiPath is null)
continue;
var state = $"icon";
var rsi = _resCache
.GetResource<RSIResource>(SpriteSpecifierSerializer.TextureRoot / indexedPart.RsiPath)
.RSI;
if (!rsi.TryGetState(state, out _))
continue;
var defaultLayer = new PrototypeLayerData
{
RsiPath = indexedPart.RsiPath,
State = state,
};
var keyCode = $"cp14-modular-icon-layer-{counterPart}-default";
start.Comp.RevealedLayers.Add(keyCode);
var index = sprite.AddLayer(defaultLayer);
sprite.LayerMapSet(keyCode, index);
}
else
{
var counter = 0;
foreach (var layer in indexedPart.IconSprite)
{
var keyCode = $"cp14-modular-icon-layer-{counterPart}-{counter}";
start.Comp.RevealedLayers.Add(keyCode);
var index = sprite.AddLayer(layer);
sprite.LayerMapSet(keyCode, index);
counter++;
}
}
counterPart++;
}
}
private void OnGetInhandVisuals(Entity<CP14ModularCraftStartPointComponent> start, ref GetInhandVisualsEvent args)
{
var defaultKey = $"cp14-modular-inhand-layer-{args.Location.ToString().ToLowerInvariant()}";
if (!TryComp<ItemComponent>(start, out var item))
return;
var wielded = item.HeldPrefix == "wielded"; //SHITCOOOOOOODE
var counterPart = 0;
foreach (var part in start.Comp.InstalledParts)
{
var indexedPart = _proto.Index(part);
var targetLayers =
wielded ? indexedPart.WieldedInhandVisuals : indexedPart.InhandVisuals;
if (targetLayers is not null && targetLayers.TryGetValue(args.Location, out var layers))
{
var i = 0;
foreach (var layer in layers)
{
var key = $"{defaultKey}-{counterPart}-{i}";
args.Layers.Add((key, layer));
i++;
}
}
else
{
//Try get default visuals
if (indexedPart.RsiPath is null)
continue;
var rsi = _resCache
.GetResource<RSIResource>(SpriteSpecifierSerializer.TextureRoot / indexedPart.RsiPath)
.RSI;
var state = $"inhand-{args.Location.ToString().ToLowerInvariant()}";
if (wielded)
state = $"wielded-{state}";
if (!rsi.TryGetState(state, out _))
continue;
var defaultLayer = new PrototypeLayerData
{
RsiPath = indexedPart.RsiPath,
State = state,
};
var key = $"{defaultKey}-{counterPart}-default";
args.Layers.Add((key, defaultLayer));
}
counterPart++;
}
}
private void OnGetEquipmentVisuals(Entity<CP14ModularCraftStartPointComponent> start,
ref GetEquipmentVisualsEvent args)
{
if (!TryComp(args.Equipee, out InventoryComponent? inventory))
return;
var defaultKey = $"cp14-modular-clothing-layer-{args.Slot}";
var counterPart = 0;
foreach (var part in start.Comp.InstalledParts)
{
var indexedPart = _proto.Index(part);
if (indexedPart.ClothingVisuals is not null && indexedPart.ClothingVisuals.TryGetValue(args.Slot, out var layers))
{
var i = 0;
foreach (var layer in layers)
{
var key = $"{defaultKey}-{counterPart}-{i}";
args.Layers.Add((key, layer));
i++;
}
}
else
{
//Try get default sprites
if (indexedPart.RsiPath is null)
continue;
var rsi = _resCache
.GetResource<RSIResource>(SpriteSpecifierSerializer.TextureRoot / indexedPart.RsiPath)
.RSI;
if (!ClientClothingSystem.TemporarySlotMap.TryGetValue(args.Slot, out var correctedSlot))
continue;
var state = $"equipped-{correctedSlot}";
if (!rsi.TryGetState(state, out _))
continue;
var defaultLayer = new PrototypeLayerData
{
RsiPath = indexedPart.RsiPath,
State = state,
};
var key = $"{defaultKey}-{counterPart}-default";
args.Layers.Add((key, defaultLayer));
}
}
}
}

View File

@@ -0,0 +1,22 @@
using Content.Shared.Damage;
namespace Content.Server._CP14.DPSMeter;
[RegisterComponent]
public sealed partial class CP14DPSMeterComponent : Component
{
[DataField]
public DamageSpecifier TotalDamage = new DamageSpecifier();
[DataField]
public TimeSpan LastHitTime = TimeSpan.Zero;
[DataField]
public TimeSpan StartTrackTime = TimeSpan.Zero;
[DataField]
public TimeSpan EndTrackTime = TimeSpan.Zero;
[DataField]
public TimeSpan TrackTimeAfterHit = TimeSpan.FromSeconds(5f);
}

View File

@@ -0,0 +1,62 @@
using Content.Shared.Damage;
using Content.Shared.FixedPoint;
using Content.Shared.Popups;
using Robust.Shared.Timing;
namespace Content.Server._CP14.DPSMeter;
public sealed class CP14DPSMeterSystem : EntitySystem
{
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<CP14DPSMeterComponent, DamageChangedEvent>(OnDamageChanged);
}
public override void Update(float frameTime)
{
base.Update(frameTime);
var query = EntityQueryEnumerator<CP14DPSMeterComponent>();
while (query.MoveNext(out var uid, out var meter))
{
if (_timing.CurTime < meter.EndTrackTime || meter.EndTrackTime == TimeSpan.Zero)
continue;
//Clear tracking
_popup.PopupEntity($"TOTAL DPS: {GetDPS((uid, meter))}", uid, PopupType.Large);
meter.TotalDamage = new DamageSpecifier();
meter.EndTrackTime = TimeSpan.Zero;
meter.StartTrackTime = TimeSpan.Zero;
}
}
private void OnDamageChanged(Entity<CP14DPSMeterComponent> ent, ref DamageChangedEvent args)
{
if (args.DamageDelta is null)
return;
ent.Comp.TotalDamage += args.DamageDelta;
if (ent.Comp.StartTrackTime == TimeSpan.Zero)
ent.Comp.StartTrackTime = _timing.CurTime;
ent.Comp.LastHitTime = _timing.CurTime;
ent.Comp.EndTrackTime = _timing.CurTime + ent.Comp.TrackTimeAfterHit;
_popup.PopupEntity($"DPS: {GetDPS(ent)}", ent);
}
private FixedPoint2 GetDPS(Entity<CP14DPSMeterComponent> ent)
{
var totalDamage = ent.Comp.TotalDamage.GetTotal();
var totalSeconds = (ent.Comp.LastHitTime - ent.Comp.StartTrackTime).TotalSeconds;
var DPS = totalDamage / Math.Max(totalSeconds, 1f);
return DPS;
}
}

View File

@@ -0,0 +1,169 @@
using Content.Server.Item;
using Content.Shared._CP14.ModularCraft;
using Content.Shared._CP14.ModularCraft.Components;
using Content.Shared._CP14.ModularCraft.Prototypes;
using Content.Shared.Throwing;
using Robust.Server.GameObjects;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
namespace Content.Server._CP14.ModularCraft;
public sealed class CP14ModularCraftSystem : CP14SharedModularCraftSystem
{
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly TransformSystem _transform = default!;
[Dependency] private readonly ThrowingSystem _throwing = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly ItemSystem _item = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<CP14ModularCraftStartPointComponent, MapInitEvent>(OnStartPointMapInit);
SubscribeLocalEvent<CP14ModularCraftStartPointComponent, CP14ModularCraftAddPartDoAfter>(OnAddedPart);
}
private void OnAddedPart(Entity<CP14ModularCraftStartPointComponent> ent, ref CP14ModularCraftAddPartDoAfter args)
{
if (args.Cancelled || args.Handled)
return;
if (!TryComp<CP14ModularCraftPartComponent>(args.Used, out var partComp))
return;
if (!TryAddPartToFirstSlot(ent, (args.Used.Value, partComp)))
return;
//TODO: Sound
args.Handled = true;
}
private void OnStartPointMapInit(Entity<CP14ModularCraftStartPointComponent> ent, ref MapInitEvent args)
{
foreach (var startSlot in ent.Comp.StartSlots)
{
ent.Comp.FreeSlots.Add(startSlot);
}
if (TryComp<CP14ModularCraftAutoAssembleComponent>(ent, out var autoAssemble))
{
foreach (var detail in autoAssemble.Details)
{
TryAddPartToFirstSlot(ent, detail);
}
}
}
private bool TryAddPartToFirstSlot(Entity<CP14ModularCraftStartPointComponent> start,
Entity<CP14ModularCraftPartComponent> part)
{
foreach (var partProto in part.Comp.PossibleParts)
{
if (!_proto.TryIndex(partProto, out var partIndexed))
continue;
if (partIndexed.TargetSlot is null)
continue;
if (!start.Comp.FreeSlots.Contains(partIndexed.TargetSlot.Value))
continue;
if (TryAddPartToSlot(start, part, partProto, partIndexed.TargetSlot.Value))
{
QueueDel(part);
return true;
}
}
return false;
}
private bool TryAddPartToFirstSlot(Entity<CP14ModularCraftStartPointComponent> start,
ProtoId<CP14ModularCraftPartPrototype> partProto)
{
if (!_proto.TryIndex(partProto, out var partIndexed))
return false;
if (partIndexed.TargetSlot is null)
return false;
if (!start.Comp.FreeSlots.Contains(partIndexed.TargetSlot.Value))
return false;
return TryAddPartToSlot(start, null, partProto, partIndexed.TargetSlot.Value);
}
private bool TryAddPartToSlot(Entity<CP14ModularCraftStartPointComponent> start,
Entity<CP14ModularCraftPartComponent>? part,
ProtoId<CP14ModularCraftPartPrototype> partProto,
ProtoId<CP14ModularCraftSlotPrototype> slot)
{
if (!start.Comp.FreeSlots.Contains(slot))
return false;
var xform = Transform(start);
if (xform.GridUid != xform.ParentUid)
return false;
AddPartToSlot(start, part, partProto, slot);
return true;
}
private void AddPartToSlot(Entity<CP14ModularCraftStartPointComponent> start,
Entity<CP14ModularCraftPartComponent>? part,
ProtoId<CP14ModularCraftPartPrototype> partProto,
ProtoId<CP14ModularCraftSlotPrototype> slot)
{
start.Comp.FreeSlots.Remove(slot);
start.Comp.InstalledParts.Add(partProto);
var indexedPart = _proto.Index(partProto);
start.Comp.FreeSlots.AddRange(indexedPart.AddSlots);
foreach (var modifier in indexedPart.Modifiers)
{
modifier.Effect(EntityManager, start, part);
}
_item.VisualsChanged(start);
Dirty(start);
}
public void DisassembleModular(EntityUid target)
{
if (!TryComp<CP14ModularCraftStartPointComponent>(target, out var modular))
return;
var sourceCoord = _transform.GetMapCoordinates(target);
//Spawn start part
if (modular.StartProtoPart is not null)
{
if (_random.Prob(0.5f)) //TODO: Dehardcode
{
var spawned = Spawn(modular.StartProtoPart, sourceCoord);
_throwing.TryThrow(spawned, _random.NextAngle().ToWorldVec(), 1f);
}
}
//Spawn parts
foreach (var part in modular.InstalledParts)
{
if (!_proto.TryIndex(part, out var indexedPart))
continue;
if (_random.Prob(indexedPart.DestroyProb))
continue;
if (indexedPart.SourcePart is null)
continue;
var spawned = Spawn(indexedPart.SourcePart, sourceCoord);
_throwing.TryThrow(spawned, _random.NextAngle().ToWorldVec(), 1f);
}
//Delete
QueueDel(target);
}
}

View File

@@ -0,0 +1,15 @@
using Content.Server.Destructible;
using Content.Server.Destructible.Thresholds.Behaviors;
namespace Content.Server._CP14.ModularCraft;
[Serializable]
[DataDefinition]
public sealed partial class CP14ModularDisassembleBehavior : IThresholdBehavior
{
public void Execute(EntityUid owner, DestructibleSystem system, EntityUid? cause = null)
{
var modular = system.EntityManager.System<CP14ModularCraftSystem>();
modular.DisassembleModular(owner);
}
}

View File

@@ -0,0 +1,20 @@
using Content.Shared._CP14.ModularCraft;
using Content.Shared._CP14.ModularCraft.Components;
using Robust.Shared.Prototypes;
namespace Content.Server._CP14.ModularCraft.Modifiers;
public sealed partial class AddComponents : CP14ModularCraftModifier
{
[DataField]
public ComponentRegistry? Components;
[DataField]
public bool Override = false;
public override void Effect(EntityManager entManager, Entity<CP14ModularCraftStartPointComponent> start, Entity<CP14ModularCraftPartComponent>? part)
{
if (Components is not null)
entManager.AddComponents(start, Components, Override);
}
}

View File

@@ -0,0 +1,20 @@
using Content.Shared._CP14.Damageable;
using Content.Shared._CP14.ModularCraft;
using Content.Shared._CP14.ModularCraft.Components;
namespace Content.Server._CP14.ModularCraft.Modifiers;
public sealed partial class EditDamageableModifier : CP14ModularCraftModifier
{
[DataField(required: true)]
public float Multiplier = 1f;
public override void Effect(EntityManager entManager, Entity<CP14ModularCraftStartPointComponent> start, Entity<CP14ModularCraftPartComponent>? part)
{
if (!entManager.TryGetComponent<CP14DamageableModifierComponent>(start, out var damageable))
return;
damageable.Modifier *= Multiplier;
entManager.Dirty(start);
}
}

View File

@@ -0,0 +1,28 @@
using Content.Shared._CP14.ModularCraft;
using Content.Shared._CP14.ModularCraft.Components;
using Content.Shared.Damage;
using Content.Shared.Wieldable.Components;
namespace Content.Server._CP14.ModularCraft.Modifiers;
public sealed partial class EditIncreaseDamageOnWield : CP14ModularCraftModifier
{
[DataField]
public DamageSpecifier? BonusDamage;
[DataField]
public float? DamageMultiplier;
public override void Effect(EntityManager entManager, Entity<CP14ModularCraftStartPointComponent> start, Entity<CP14ModularCraftPartComponent>? part)
{
if (!entManager.TryGetComponent<IncreaseDamageOnWieldComponent>(start, out var wield))
return;
if (BonusDamage is not null)
wield.BonusDamage += BonusDamage;
if (DamageMultiplier is not null)
wield.BonusDamage *= DamageMultiplier.Value;
}
}

View File

@@ -0,0 +1,48 @@
using System.Linq;
using Content.Shared._CP14.ModularCraft;
using Content.Shared._CP14.ModularCraft.Components;
using Content.Shared.Item;
using Robust.Shared.Prototypes;
namespace Content.Server._CP14.ModularCraft.Modifiers;
public sealed partial class EditItem : CP14ModularCraftModifier
{
[DataField]
public ProtoId<ItemSizePrototype>? NewSize;
/// <summary>
/// Only works if the item has 1 shape. Increases or decreases it size.
/// </summary>
[DataField]
public Vector2i? AdjustShape;
[DataField]
public Vector2i? StoredOffsetBonus;
public override void Effect(EntityManager entManager, Entity<CP14ModularCraftStartPointComponent> start, Entity<CP14ModularCraftPartComponent>? part)
{
if (!entManager.TryGetComponent<ItemComponent>(start, out var itemComp) || itemComp.Shape is null)
return;
var itemSystem = entManager.System<SharedItemSystem>();
if (NewSize is not null)
itemSystem.SetSize(start, NewSize.Value);
var itemShape = itemSystem.GetItemShape((start, itemComp));
if (AdjustShape is not null && itemShape.Count == 1)
{
var box = itemComp.Shape.First();
box.Right += AdjustShape.Value.X;
box.Top += AdjustShape.Value.Y;
itemSystem.SetShape(start, new List<Box2i>{box});
}
if (StoredOffsetBonus is not null)
{
var newOffset = itemComp.StoredOffset + StoredOffsetBonus.Value;
itemSystem.SetStoredOffset(start, newOffset, itemComp);
}
}
}

View File

@@ -0,0 +1,64 @@
using Content.Shared._CP14.ModularCraft;
using Content.Shared._CP14.ModularCraft.Components;
using Content.Shared.Damage;
using Content.Shared.Weapons.Melee;
using Robust.Shared.Prototypes;
namespace Content.Server._CP14.ModularCraft.Modifiers;
public sealed partial class EditMeleeWeapon : CP14ModularCraftModifier
{
[DataField]
public EntProtoId? NewAnimation;
[DataField]
public EntProtoId? NewWideAnimation;
[DataField]
public float? AngleMultiplier;
[DataField]
public DamageSpecifier? BonusDamage;
[DataField]
public float? DamageMultiplier;
[DataField]
public float? AttackRateMultiplier;
[DataField]
public float? BonusRange;
[DataField]
public bool? ResetOnHandSelected;
public override void Effect(EntityManager entManager, Entity<CP14ModularCraftStartPointComponent> start, Entity<CP14ModularCraftPartComponent>? part)
{
if (!entManager.TryGetComponent<MeleeWeaponComponent>(start, out var melee))
return;
if (NewAnimation is not null)
melee.Animation = NewAnimation.Value;
if (NewWideAnimation is not null)
melee.WideAnimation = NewWideAnimation.Value;
if (AngleMultiplier is not null)
melee.Angle = Angle.FromDegrees(melee.Angle.Degrees * AngleMultiplier.Value);
if (BonusDamage is not null)
melee.Damage += BonusDamage;
if (DamageMultiplier is not null)
melee.Damage *= DamageMultiplier.Value;
if (AttackRateMultiplier is not null)
melee.AttackRate *= AttackRateMultiplier.Value;
if (BonusRange is not null)
melee.Range += BonusRange.Value;
if (ResetOnHandSelected is not null)
melee.ResetOnHandSelected = ResetOnHandSelected.Value;
}
}

View File

@@ -0,0 +1,25 @@
using Content.Shared._CP14.ModularCraft;
using Content.Shared._CP14.ModularCraft.Components;
using Content.Shared._CP14.ModularCraft.Prototypes;
using Robust.Shared.Prototypes;
namespace Content.Server._CP14.ModularCraft.Modifiers;
public sealed partial class Inherit : CP14ModularCraftModifier
{
[DataField(required: true)]
public List<ProtoId<CP14ModularCraftPartPrototype>> CopyFrom = new();
public override void Effect(EntityManager entManager, Entity<CP14ModularCraftStartPointComponent> start, Entity<CP14ModularCraftPartComponent>? part)
{
var prototypeManager = IoCManager.Resolve<IPrototypeManager>();
foreach (var copy in CopyFrom)
{
foreach (var modifier in prototypeManager.Index(copy).Modifiers)
{
modifier.Effect(entManager, start, part);
}
}
}
}

View File

@@ -55,6 +55,15 @@ public abstract class SharedItemSystem : EntitySystem
Dirty(uid, component);
}
public void SetStoredOffset(EntityUid uid, Vector2i newOffset, ItemComponent? component = null)
{
if (!Resolve(uid, ref component, false))
return;
component.StoredOffset = newOffset;
Dirty(uid, component);
}
public void SetHeldPrefix(EntityUid uid, string? heldPrefix, bool force = false, ItemComponent? component = null)
{
if (!Resolve(uid, ref component, false))

View File

@@ -76,9 +76,12 @@ namespace Content.Shared.Verbs
public static readonly VerbCategory InstrumentStyle =
new("verb-categories-instrument-style", null);
public static readonly VerbCategory Lockpick =
public static readonly VerbCategory CP14LockPick =
new("verb-categories-lock-pick", "/Textures/Interface/VerbIcons/lock.svg.192dpi.png");
public static readonly VerbCategory CP14ModularCraft =
new("verb-categories-modular-craft", "/Textures/Interface/AdminActions/unbolt.png");
public static readonly VerbCategory ChannelSelect = new("verb-categories-channel-select", null);
public static readonly VerbCategory SetSensor = new("verb-categories-set-sensor", null);

View File

@@ -39,7 +39,7 @@ public sealed partial class MeleeWeaponComponent : Component
/// <summary>
/// Starts attack cooldown when equipped if true.
/// </summary>
[ViewVariables(VVAccess.ReadWrite), DataField]
[ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] //CP14 AutoNetworked
public bool ResetOnHandSelected = true;
/*

View File

@@ -2,7 +2,7 @@ using Content.Shared.Damage;
namespace Content.Shared.Wieldable.Components;
[RegisterComponent, Access(typeof(WieldableSystem))]
[RegisterComponent/*, Access(typeof(WieldableSystem))*/] //CP14 Public access
public sealed partial class IncreaseDamageOnWieldComponent : Component
{
[DataField("damage", required: true)]

View File

@@ -0,0 +1,14 @@
using Robust.Shared.GameStates;
namespace Content.Shared._CP14.Damageable;
/// <summary>
/// Increases or decreases incoming damage, regardless of the damage type.
/// Unlike standard Damageable modifiers, this value can be changed during the game.
/// </summary>
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class CP14DamageableModifierComponent : Component
{
[DataField, AutoNetworkedField]
public float Modifier = 1f;
}

View File

@@ -0,0 +1,18 @@
using Content.Shared.Damage;
namespace Content.Shared._CP14.Damageable;
public sealed class CP14DamageableModifierSystem : EntitySystem
{
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<CP14DamageableModifierComponent, DamageModifyEvent>(OnDamageModify);
}
private void OnDamageModify(Entity<CP14DamageableModifierComponent> ent, ref DamageModifyEvent args)
{
args.Damage *= ent.Comp.Modifier;
}
}

View File

@@ -16,7 +16,7 @@ public sealed partial class CP14DoorInteractionPopupComponent : Component
public string InteractString = "cp14-closed-door-interact-popup";
[DataField("interactSound")]
public SoundSpecifier InteractSound;
public SoundSpecifier? InteractSound;
[ViewVariables(VVAccess.ReadWrite)]
public TimeSpan LastInteractTime = TimeSpan.Zero;

View File

@@ -129,7 +129,7 @@ public sealed class SharedCP14LockKeySystem : EntitySystem
},
Text = Loc.GetString("cp14-lock-verb-lock-pick-use-text") + $" {height}",
Message = Loc.GetString("cp14-lock-verb-lock-pick-use-message"),
Category = VerbCategory.Lockpick,
Category = VerbCategory.CP14LockPick,
Priority = height,
CloseMenu = false,
};

View File

@@ -1,16 +1,17 @@
using Content.Shared._CP14.MeleeWeapon.EntitySystems;
using Robust.Shared.GameStates;
namespace Content.Shared._CP14.MeleeWeapon.Components;
/// <summary>
/// allows the object to become blunt with use
/// </summary>
[RegisterComponent, Access(typeof(CP14SharpeningSystem))]
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, Access(typeof(CP14SharpeningSystem))]
public sealed partial class CP14SharpenedComponent : Component
{
[DataField]
[DataField, AutoNetworkedField]
public float Sharpness = 1f;
[DataField]
public float SharpnessDamageBy1Damage = 0.002f; //500 damage
public float SharpnessDamageBy1Damage = 0.001f; //1000 damage
}

View File

@@ -2,7 +2,6 @@ using Content.Shared._CP14.MeleeWeapon.Components;
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 Robust.Shared.Audio.Systems;
using Robust.Shared.Random;

View File

@@ -0,0 +1,11 @@
using Content.Shared._CP14.ModularCraft.Components;
using JetBrains.Annotations;
namespace Content.Shared._CP14.ModularCraft;
[ImplicitDataDefinitionForInheritors]
[MeansImplicitUse]
public abstract partial class CP14ModularCraftModifier
{
public abstract void Effect(EntityManager entManager, Entity<CP14ModularCraftStartPointComponent> start, Entity<CP14ModularCraftPartComponent>? part);
}

View File

@@ -0,0 +1,51 @@
using Content.Shared._CP14.ModularCraft.Components;
using Content.Shared.DoAfter;
using Content.Shared.Interaction;
using Robust.Shared.Serialization;
namespace Content.Shared._CP14.ModularCraft;
public abstract class CP14SharedModularCraftSystem : EntitySystem
{
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<CP14ModularCraftPartComponent, AfterInteractEvent>(OnAfterInteractPart);
}
private void OnAfterInteractPart(Entity<CP14ModularCraftPartComponent> start, ref AfterInteractEvent args)
{
if (args.Handled || args.Target is null)
return;
if (!HasComp<CP14ModularCraftStartPointComponent>(args.Target))
return;
var xform = Transform(args.Target.Value);
if (xform.GridUid != xform.ParentUid)
return;
_doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager,
args.User,
start.Comp.DoAfter,
new CP14ModularCraftAddPartDoAfter(),
args.Target,
args.Target,
start)
{
BreakOnDamage = true,
BreakOnMove = true,
BreakOnDropItem = true,
});
args.Handled = true;
}
}
[Serializable, NetSerializable]
public sealed partial class CP14ModularCraftAddPartDoAfter : SimpleDoAfterEvent
{
}

View File

@@ -0,0 +1,14 @@
using Content.Shared._CP14.ModularCraft.Prototypes;
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.ModularCraft.Components;
/// <summary>
/// Adds all details to the item when initializing. This is useful for spawning modular items directly when mapping or as loot in demiplanes.
/// </summary>
[RegisterComponent, Access(typeof(CP14SharedModularCraftSystem))]
public sealed partial class CP14ModularCraftAutoAssembleComponent : Component
{
[DataField]
public List<ProtoId<CP14ModularCraftPartPrototype>> Details = new();
}

View File

@@ -0,0 +1,16 @@
using Content.Shared._CP14.ModularCraft.Prototypes;
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.ModularCraft.Components;
[RegisterComponent, Access(typeof(CP14SharedModularCraftSystem))]
public sealed partial class CP14ModularCraftPartComponent : Component
{
[DataField(required: true)]
public HashSet<ProtoId<CP14ModularCraftPartPrototype>> PossibleParts = new();
[DataField]
public float DoAfter = 1f;
//TODO: Sound
}

View File

@@ -0,0 +1,38 @@
using Content.Shared._CP14.ModularCraft.Prototypes;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.ModularCraft.Components;
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true), Access(typeof(CP14SharedModularCraftSystem))]
public sealed partial class CP14ModularCraftStartPointComponent : Component
{
/// <summary>
/// Starting free slots
/// </summary>
[DataField]
public List<ProtoId<CP14ModularCraftSlotPrototype>> StartSlots = new();
/// <summary>
/// Current free slots. May vary depending on the modules delivered
/// </summary>
[DataField]
public List<ProtoId<CP14ModularCraftSlotPrototype>> FreeSlots = new();
/// <summary>
/// A list of all installed parts.
/// </summary>
[DataField, AutoNetworkedField]
public List<ProtoId<CP14ModularCraftPartPrototype>> InstalledParts = new();
/// <summary>
/// Spawned on disassembling
/// </summary>
[DataField]
public EntProtoId? StartProtoPart;
/// <summary>
/// Clentside visual layers from installedParts
/// </summary>
public HashSet<string> RevealedLayers = new();
}

View File

@@ -0,0 +1,45 @@
using Content.Shared.Hands.Components;
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.ModularCraft.Prototypes;
[Prototype("modularPart")]
public sealed partial class CP14ModularCraftPartPrototype : IPrototype
{
[IdDataField]
public string ID { get; private set; } = default!;
[DataField]
public ProtoId<CP14ModularCraftSlotPrototype>? TargetSlot;
/// <summary>
/// An entity that can drop out of the final modular item when destroyed.
/// By design, the original item with this prototype from which the weapon was assembled.
/// </summary>
[DataField]
public EntProtoId? SourcePart;
[DataField]
public float DestroyProb = 0.25f;
[DataField(serverOnly: true)]
public List<CP14ModularCraftModifier> Modifiers = new();
[DataField]
public HashSet<ProtoId<CP14ModularCraftSlotPrototype>> AddSlots = new();
[DataField]
public string? RsiPath;
[DataField]
public List<PrototypeLayerData>? IconSprite;
[DataField]
public Dictionary<HandLocation, List<PrototypeLayerData>>? InhandVisuals;
[DataField]
public Dictionary<HandLocation, List<PrototypeLayerData>>? WieldedInhandVisuals;
[DataField]
public Dictionary<string, List<PrototypeLayerData>>? ClothingVisuals;
}

View File

@@ -0,0 +1,13 @@
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.ModularCraft.Prototypes;
[Prototype("modularSlot")]
public sealed partial class CP14ModularCraftSlotPrototype : IPrototype
{
[IdDataField]
public string ID { get; private set; } = default!;
[DataField(required: true)]
public LocId Name = string.Empty;
}

View File

@@ -68,7 +68,7 @@ public abstract partial class CP14SharedFireSpreadSystem : EntitySystem
new CP14IgnitionDoAfter(),
args.Target,
args.Target,
args.Used)
ent)
{
BreakOnDamage = true,
BreakOnMove = true,

View File

@@ -0,0 +1,3 @@
verb-categories-modular-craft = Ковка
cp14-modular-craft-add-part-verb-text = Прикрепить как {$slot}

View File

@@ -0,0 +1,2 @@
cp14-modular-slot-blade = лезвие
cp14-modular-slot-jewerly1 = украшение (1)

View File

@@ -52,10 +52,10 @@
- id: CP14Torch
- id: CP14Lighter
- id: CP14ManaOperationGlove
- id: CP14BaseShovel
- id: CP14ModularIronShovel
- id: CP14BaseMop
- id: CP14BaseBroom
- id: CP14BasePickaxe
- id: CP14ModularIronPickaxe
- !type:GroupSelector
children:
- id: CP14CrystalLampBlueEmpty

View File

@@ -1,107 +0,0 @@
- type: entity
id: CP14ActionSpellIceDagger
name: Ice dagger
description: Materialization of a temporary sharp ice throwing dagger
components:
- type: Sprite
sprite: _CP14/Effects/Magic/spells_icons.rsi
state: ice_dagger
- type: CP14MagicEffect
magicType: Water
manaCost: 15
effects:
- !type:CP14SpellSpawnEntityOnTarget
spawns:
- CP14ImpactEffectIceDagger
- !type:CP14SpellSpawnInHandEntity
spawns:
- CP14DaggerIce
- type: CP14MagicEffectSomaticAspect
- type: CP14MagicEffectCastingVisual
proto: CP14RuneIceDagger
- type: InstantAction
itemIconStyle: BigAction
sound: !type:SoundPathSpecifier
path: /Audio/Magic/rumble.ogg
icon:
sprite: _CP14/Effects/Magic/spells_icons.rsi
state: ice_dagger
event: !type:CP14DelayedInstantActionEvent
cooldown: 10
castDelay: 0.5
breakOnMove: false
- type: entity
id: CP14RuneIceDagger
parent: CP14BaseMagicRune
categories: [ HideSpawnMenu ]
components:
- type: PointLight
color: "#5eabeb"
- type: Sprite
layers:
- state: medium_line
color: "#5eabeb"
shader: unshaded
- type: entity
id: CP14ImpactEffectIceDagger
parent: CP14BaseMagicImpact
categories: [ HideSpawnMenu ]
components:
- type: Sprite
layers:
- state: particles_up
color: "#5eabeb"
shader: unshaded
- type: entity
id: CP14DaggerIce
parent:
- CP14BaseDagger
name: ice dagger
description: A piece of sharp magical ice. In a little while, the spell will wear off, and he will disappear.
components:
- type: TimedDespawn
lifetime: 60 # 1 min
- type: Clothing
sprite: _CP14/Objects/Weapons/Melee/Dagger/ice_dagger.rsi
- type: Sprite
sprite: _CP14/Objects/Weapons/Melee/Dagger/ice_dagger.rsi
- type: CP14Currency
currency: 0
- type: MeleeWeapon
damage:
types:
Slash: 5
Piercing: 2
Cold: 3
- type: DamageOtherOnHit
damage:
types:
Piercing: 5
Cold: 5
- type: CP14MeleeSelfDamage
damageToSelf:
types:
Blunt: 2 # 5 hits
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 10
behaviors:
- !type:PlaySoundBehavior
sound:
collection: GlassBreak
- !type:DoActsBehavior
acts: ["Destruction"]
- type: entity
parent: CP14BaseSpellScrollWater
id: CP14SpellScrollIceDagger
name: ice dagger spell scroll
components:
- type: CP14SpellStorage
spells:
- CP14ActionSpellIceDagger

View File

@@ -35,7 +35,6 @@
- !type:GroupSelector
children:
- id: CP14SpellScrollIceShards
- id: CP14SpellScrollIceDagger
- id: CP14SpellScrollShadowGrab
- id: CP14SpellScrollSphereOfLight
- id: CP14SpellScrollCureWounds

View File

@@ -19,7 +19,7 @@
- type: entity
id: SpawnPointGhostDemiplaneSkeleton
name: ghost role spawn point
suffix: rat king
suffix: skeleton
categories: [ ForkFiltered ]
parent: MarkerBase
components:

View File

@@ -0,0 +1,147 @@
- type: entity
parent: BaseItem
id: CP14ModularBladeIronDagger
categories: [ ForkFiltered ]
name: iron dagger blade
description: A dagger blade without a hilt. A blacksmith can use it as a spare part to create a weapon.
components:
- type: Item
storedRotation: 45
shape:
- 0,0,0,0
storedOffset: 0, 5
- type: Sprite
sprite: _CP14/Objects/ModularTools/iron_dagger.rsi
state: icon
- type: CP14ModularCraftPart
possibleParts:
- BladeIronDagger
- type: entity
parent: BaseItem
id: CP14ModularBladeIronSpear
categories: [ ForkFiltered ]
name: iron spearhead
description: Hiltless spearhead. A blacksmith can use it as a spare part to create a weapon.
components:
- type: Item
storedRotation: 45
shape:
- 0,0,0,0
storedOffset: 0, 5
- type: Sprite
sprite: _CP14/Objects/ModularTools/iron_spear.rsi
state: icon
- type: CP14ModularCraftPart
possibleParts:
- BladeIronSpear
- type: entity
parent: BaseItem
id: CP14ModularBladeIronMace
categories: [ ForkFiltered ]
name: iron mace ball
description: A mace ball without a hilt. A blacksmith can use it as a spare part to create a weapon.
components:
- type: Item
storedRotation: 45
shape:
- 0,0,0,0
storedOffset: 0, 5
- type: Sprite
sprite: _CP14/Objects/ModularTools/iron_mace.rsi
state: icon
- type: CP14ModularCraftPart
possibleParts:
- BladeIronMace
- type: entity
parent: BaseItem
id: CP14ModularBladeIronSword
categories: [ ForkFiltered ]
name: iron sword blade
description: A sword blade without a hilt. A blacksmith can use it as a spare part to create a weapon.
components:
- type: Item
storedRotation: 45
shape:
- 0,0,0,1
storedOffset: 0, 10
- type: Sprite
sprite: _CP14/Objects/ModularTools/iron_sword.rsi
state: icon
- type: CP14ModularCraftPart
possibleParts:
- BladeIronSword
- type: entity
parent: BaseItem
id: CP14ModularBladeIronSickle
categories: [ ForkFiltered ]
name: iron sickle blade
description: A sickle blade without a hilt. A blacksmith can use it as a spare part to create a weapon.
components:
- type: Item
storedRotation: 45
shape:
- 0,0,0,0
storedOffset: 0, 5
- type: Sprite
sprite: _CP14/Objects/ModularTools/iron_sickle.rsi
state: icon
- type: CP14ModularCraftPart
possibleParts:
- BladeIronSickle
- type: entity
parent: BaseItem
id: CP14ModularBladeIronShovel
categories: [ ForkFiltered ]
name: iron shovel blade
description: A shovel blade without a hilt. A blacksmith can use it as a spare part to create a tool.
components:
- type: Item
storedRotation: 45
shape:
- 0,0,0,0
storedOffset: 0, 5
- type: Sprite
sprite: _CP14/Objects/ModularTools/iron_shovel.rsi
state: icon
- type: CP14ModularCraftPart
possibleParts:
- BladeIronShovel
- type: entity
parent: BaseItem
id: CP14ModularBladeIronPickaxe
categories: [ ForkFiltered ]
name: iron pickaxe head
description: A pickaxe head without a hilt. A blacksmith can use it as a spare part to create a tool.
components:
- type: Item
storedRotation: 45
shape:
- 0,0,1,0
storedOffset: 0, 5
- type: Sprite
sprite: _CP14/Objects/ModularTools/iron_pickaxe.rsi
state: icon
- type: CP14ModularCraftPart
possibleParts:
- BladeIronPickaxe
#- type: entity
# parent: BaseItem
# id: CP14ModularBladeIronSwordTwoHanded
# categories: [ ForkFiltered ]
# name: iron two-handed sword blade
# description: A two-handed sword blade without a hilt. A blacksmith can use it as a spare part to create a weapon.
# components:
# - type: Sprite
# sprite: _CP14/Objects/ModularTools/blade48.rsi
# layers:
# - state: iron_sword_twohanded
# - type: CP14ModularCraftPart
# possibleParts:
# - BladeIronSwordTwoHanded

View File

@@ -0,0 +1,160 @@
- type: entity
parent: BaseItem
id: CP14ModularGripBase
abstract: true
categories: [ ForkFiltered ]
components:
- type: Item
storedRotation: 45
- type: ExaminableDamage
messages: CP14WeaponMessages
- type: Damageable
damageContainer: Inorganic
- type: CP14MeleeSelfDamage
damageToSelf:
types:
Blunt: 0.5 # 100 hits
- type: MeleeWeapon
angle: 45
attackRate: 1
wideAnimationRotation: 135
wideAnimation: CP14WeaponArcSlash
damage:
types:
Blunt: 0
soundHit:
collection: MetalThud
cPAnimationLength: 0.25
- type: Clothing
equipDelay: 0.25
unequipDelay: 0.25
quickEquip: false
breakOnMove: false
- type: CP14MeleeParriable
- type: entity
parent: CP14ModularGripBase
id: CP14ModularGripWooden
name: wooden grip
description: A short wooden handle for a weapon or tool. The cheapest and most unstable material.
components:
- type: Item
shape:
- 0,0,0,0
storedOffset: 0, -5
- type: Sprite
sprite: _CP14/Objects/ModularTools/wooden_grip.rsi
state: icon
- type: CP14ModularCraftStartPoint
startProtoPart: CP14ModularGripWooden
startSlots:
- Blade
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 50
behaviors:
- !type:PlaySoundBehavior
sound:
collection: MetalBreak
- !type:CP14ModularDisassembleBehavior
- !type:DoActsBehavior
acts: ["Destruction"]
- type: MeleeWeapon
resetOnHandSelected: false #Fast swap
range: 1.0 # 1.5 standart
cPAnimationOffset: -0.75 #-1 standart
attackRate: 1 # 1 standart
- type: Clothing
slots:
- belt
- type: entity
parent: CP14ModularGripBase
id: CP14ModularGripWoodenLong
name: long wooden grip
description: long, two-handed wooden handle for heavy weapons or large tools.
components:
- type: Item
shape:
- 0,0,0,1
storedOffset: 0, -15
- type: Sprite
sprite: _CP14/Objects/ModularTools/wooden_grip_long.rsi
state: icon
- type: CP14ModularCraftStartPoint
startProtoPart: CP14ModularGripWoodenLong
startSlots:
- Blade
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 50
behaviors:
- !type:PlaySoundBehavior
sound:
collection: MetalBreak
- !type:CP14ModularDisassembleBehavior
- !type:DoActsBehavior
acts: ["Destruction"]
- type: MeleeWeapon
resetOnHandSelected: true
range: 1.5 # 1.5 standart
attackRate: 0.7 # 1 standart
cPAnimationOffset: -1
- type: Wieldable
- type: IncreaseDamageOnWield
damage:
types:
Blunt: 0
- type: Clothing
slots:
- neck
- type: entity
parent: CP14ModularGripWooden
id: CP14ModularGripIron
name: iron grip
description: A short iron handle for a weapon or tool.
components:
- type: Sprite
sprite: _CP14/Objects/ModularTools/iron_grip.rsi
- type: CP14ModularCraftStartPoint
startProtoPart: CP14ModularGripIron
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 100 #x2 durability
behaviors:
- !type:PlaySoundBehavior
sound:
collection: MetalBreak
- !type:CP14ModularDisassembleBehavior
- !type:DoActsBehavior
acts: ["Destruction"]
- type: entity
parent: CP14ModularGripWoodenLong
id: CP14ModularGripIronLong
name: long iron grip
description: long, two-handed iron handle for heavy weapons or large tools.
components:
- type: Sprite
sprite: _CP14/Objects/ModularTools/iron_grip_long.rsi
- type: CP14ModularCraftStartPoint
startProtoPart: CP14ModularGripIronLong
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 100 #x2 durability
behaviors:
- !type:PlaySoundBehavior
sound:
collection: MetalBreak
- !type:CP14ModularDisassembleBehavior
- !type:DoActsBehavior
acts: ["Destruction"]

View File

@@ -1,44 +0,0 @@
- type: entity
id: CP14BasePickaxe
parent:
- BaseItem
- CP14BaseWeaponDestructible
- CP14BaseWeaponSelfDamage
- CP14BaseWeaponChemical
name: pickaxe
description: Notched to perfection, for jamming it into rocks
components:
- type: Item
size: Normal
storedRotation: 45
shape:
- 0,0,2,0
- 1,1,1,1
sprite: _CP14/Objects/Weapons/Melee/Pickaxe/pickaxe.rsi
- type: Sprite
sprite: _CP14/Objects/Weapons/Melee/Pickaxe/pickaxe.rsi
state: icon
- type: MeleeWeapon
wideAnimationRotation: 135
damage:
types:
Piercing: 8
soundHit:
collection: MetalThud
- type: IncreaseDamageOnWield
damage:
groups:
Brute: 8
types:
Structural: 10
- type: Wieldable
- type: ToolTileCompatible
- type: Tool
qualities:
- CP14Digging
useSound:
collection: CP14Digging
params:
variation: 0.03
volume: 2
- type: UseDelay

View File

@@ -1,35 +0,0 @@
- type: entity
id: CP14BaseShovel
parent:
- BaseItem
- CP14BaseWeaponDestructible
- CP14BaseWeaponSelfDamage
name: shovel
description: An implement for digging up earth, digging beds or graves.
components:
- type: Item
size: Normal
storedRotation: 45
shape:
- 0,0,0,2
sprite: _CP14/Objects/Weapons/Melee/Shovel/shovel.rsi
- type: Sprite
sprite: _CP14/Objects/Weapons/Melee/Shovel/shovel.rsi
state: icon
- type: MeleeWeapon
wideAnimationRotation: 65
damage:
types:
Blunt: 6
Slash: 2
soundHit:
collection: MetalThud
- type: ToolTileCompatible
- type: Tool
qualities:
- CP14Digging
useSound:
collection: CP14Digging
params:
variation: 0.03
volume: 2

View File

@@ -1,7 +1,7 @@
- type: entity
id: CP14BaseWeaponChemical
abstract: true
categories: [ ForkFiltered ]
id: CP14BaseWeaponChemical
categories: [ HideSpawnMenu, ForkFiltered ]
components:
- type: SolutionContainerManager
solutions:
@@ -20,9 +20,9 @@
maxTransferAmount: 2
- type: entity
id: CP14BaseWeaponThrowable
abstract: true
categories: [ ForkFiltered ]
id: CP14BaseWeaponThrowable
categories: [ HideSpawnMenu, ForkFiltered ]
components:
- type: LandAtCursor
- type: DamageOtherOnHit
@@ -49,26 +49,26 @@
friction: 0.2
- type: entity
id: CP14BaseWeaponLight
abstract: true
categories: [ ForkFiltered ]
id: CP14BaseWeaponLight
categories: [ HideSpawnMenu, ForkFiltered ]
components:
- type: MeleeWeapon
resetOnHandSelected: false
- type: entity
id: CP14BaseWeaponShort
abstract: true
categories: [ ForkFiltered ]
id: CP14BaseWeaponShort
categories: [ HideSpawnMenu, ForkFiltered ]
components:
- type: MeleeWeapon
range: 1.0 # 1.5 standart
cPAnimationOffset: -0.75
- type: entity
id: CP14BaseWeaponSharp
abstract: true
categories: [ ForkFiltered ]
id: CP14BaseWeaponSharp
categories: [ HideSpawnMenu, ForkFiltered ]
components:
- type: Sharp
- type: CP14Sharpened
@@ -85,9 +85,9 @@
- type: CP14WallpaperRemover
- type: entity
id: CP14BaseWeaponDestructible
abstract: true
categories: [ ForkFiltered ]
id: CP14BaseWeaponDestructible
categories: [ HideSpawnMenu, ForkFiltered ]
components:
- type: ExaminableDamage
messages: CP14WeaponMessages
@@ -107,9 +107,9 @@
- type: CP14MeleeParriable
- type: entity
id: CP14BaseWeaponSelfDamage
abstract: true
categories: [ ForkFiltered ]
id: CP14BaseWeaponSelfDamage
categories: [ HideSpawnMenu, ForkFiltered ]
components:
- type: CP14MeleeSelfDamage
damageToSelf:

View File

@@ -1,47 +0,0 @@
- type: entity
id: CP14BaseDagger
parent:
- BaseItem
- CP14BaseWeaponDestructible
- CP14BaseWeaponSharp
- CP14BaseWeaponChemical
- CP14BaseWeaponThrowable
- CP14BaseWeaponLight
- CP14BaseWeaponShort
name: dagger
description: A small, multi-purpose, sharp blade. You can cut meat or throw it at a goblin.
components:
- type: Item
size: Normal
shape:
- 0,0,0,1
storedRotation: 45
- type: Clothing
equipDelay: 0.25
unequipDelay: 0.25
sprite: _CP14/Objects/Weapons/Melee/Dagger/dagger.rsi
quickEquip: false
breakOnMove: false
slots:
- belt
- type: Sprite
sprite: _CP14/Objects/Weapons/Melee/Dagger/dagger.rsi
layers:
- state: icon
- type: MeleeWeapon
angle: 60
attackRate: 1.8
wideAnimationRotation: 135
wideAnimation: CP14WeaponArcSlash
damage:
types:
Slash: 5
Piercing: 5
soundHit:
collection: MetalThud
cPAnimationLength: 0.15
- type: EmbeddableProjectile
offset: 0.15,0.15
removalTime: 1
- type: ThrowingAngle
angle: 135

View File

@@ -1,40 +0,0 @@
- type: entity
id: CP14BaseMace
parent:
- BaseItem
- CP14BaseWeaponDestructible
- CP14BaseWeaponThrowable
- CP14BaseWeaponSelfDamage
name: mace
description: A heavy piece of metal on a long stick. What could be simpler than that?
components:
- type: Item
size: Normal
- type: Clothing
equipDelay: 0.35
unequipDelay: 0.35
sprite: _CP14/Objects/Weapons/Melee/Mace/mace.rsi
quickEquip: false
breakOnMove: false
slots:
- belt
- type: Sprite
sprite: _CP14/Objects/Weapons/Melee/Mace/mace.rsi
layers:
- state: icon
- type: Sharp
- type: MeleeWeapon
angle: 100
attackRate: 0.9
range: 1.5
wideAnimationRotation: 135
wideAnimation: CP14WeaponArcSlash
damage:
types:
Blunt: 15
Piercing: 4
soundHit:
collection: MetalThud
cPAnimationLength: 0.25
- type: StaminaDamageOnHit
damage: 6

View File

@@ -1,42 +0,0 @@
- type: entity
id: CP14BaseSickle
parent:
- BaseItem
- CP14BaseWeaponDestructible
- CP14BaseWeaponSharp
- CP14BaseWeaponChemical
- CP14BaseWeaponLight
- CP14BaseWeaponShort
name: sickle
description: Originally developed as a weapon against grass, the sickle suddenly proved itself good at the bloodier harvest as well.
components:
- type: Item
size: Normal
- type: Clothing
equipDelay: 0.45
unequipDelay: 0.45
sprite: _CP14/Objects/Weapons/Melee/Sickle/sickle.rsi
quickEquip: false
breakOnMove: false
slots:
- belt
- type: Sprite
sprite: _CP14/Objects/Weapons/Melee/Sickle/sickle.rsi
layers:
- state: icon
- type: MeleeWeapon
angle: 80
range: 1.1
attackRate: 1.5
wideAnimationRotation: 135
wideAnimation: CP14WeaponArcSlash
cPAnimationLength: 0.18
damage:
types:
Slash: 7
Piercing: 3
soundHit:
collection: MetalThud
- type: Tag
tags:
- CP14HerbalGathering

View File

@@ -1,46 +0,0 @@
- type: entity
id: CP14BaseThrowableSpear
parent:
- BaseItem
- CP14BaseWeaponDestructible
- CP14BaseWeaponSharp
- CP14BaseWeaponChemical
- CP14BaseWeaponThrowable
name: throwing javelin
description: A weapon that has done its duty since the age of the giants.
components:
- type: Item
size: Normal
storedRotation: 45
shape:
- 0,0,0,3
- type: Sprite
sprite: _CP14/Objects/Weapons/Melee/ThrowableSpear/throwableSpear.rsi
layers:
- state: icon
- type: MeleeWeapon
angle: 0
attackRate: 1.2
range: 1.2
wideAnimationRotation: 135
wideAnimation: CP14WeaponArcThrust
damage:
types:
Piercing: 15
soundHit:
collection: MetalThud
cPAnimationLength: 0.25
cPAnimationOffset: -1.3
- type: EmbeddableProjectile
offset: 0.15,0.15
removalTime: 1
- type: ThrowingAngle
angle: 135
- type: DamageOtherOnHit
damage:
types:
Piercing: 18
#- type: DamageOnLand
# damage:
# types:
# Piercing: 18

View File

@@ -1,39 +0,0 @@
- type: entity
id: CP14BaseSword
parent:
- BaseItem
- CP14BaseWeaponDestructible
- CP14BaseWeaponSharp
- CP14BaseWeaponChemical
name: sword
description: the gold standard of edged weapons. Medium length, comfortable grip. No frills.
components:
- type: Item
size: Ginormous
- type: Clothing
equipDelay: 0.45
unequipDelay: 0.45
sprite: _CP14/Objects/Weapons/Melee/Sword/sword.rsi
quickEquip: false
breakOnMove: false
slots:
- neck
- type: Sprite
sprite: _CP14/Objects/Weapons/Melee/Sword/sword.rsi
layers:
- state: icon
- type: MeleeWeapon
angle: 100
attackRate: 1.4
wideAnimationRotation: 135
wideAnimation: CP14WeaponArcSlash
cPAnimationLength: 0.18
damage:
types:
Slash: 17
soundHit:
collection: MetalThud
- type: CP14SkillRequirement
fuckupChance: 0.5
requiredSkills:
- Warcraft

View File

@@ -0,0 +1,14 @@
- type: entity
id: CP14ModularIronDagger
parent: CP14ModularGripWooden
name: iron dagger
description: A small, multi-purpose, sharp blade. You can cut meat or throw it at a goblin.
components:
- type: Sprite
layers:
- state: icon
- sprite: _CP14/Objects/ModularTools/iron_dagger.rsi
state: icon
- type: CP14ModularCraftAutoAssemble
details:
- BladeIronDagger

View File

@@ -0,0 +1,14 @@
- type: entity
id: CP14ModularIronMace
parent: CP14ModularGripWooden
name: iron mace
description: A heavy piece of metal on a long stick. What could be simpler than that?
components:
- type: Sprite
layers:
- state: icon
- sprite: _CP14/Objects/ModularTools/iron_mace.rsi
state: icon
- type: CP14ModularCraftAutoAssemble
details:
- BladeIronMace

View File

@@ -0,0 +1,14 @@
- type: entity
id: CP14ModularIronPickaxe
parent: CP14ModularGripWoodenLong
name: iron pickaxe
description: Notched to perfection, for jamming it into rocks
components:
- type: Sprite
layers:
- state: icon
- sprite: _CP14/Objects/ModularTools/iron_pickaxe.rsi
state: icon
- type: CP14ModularCraftAutoAssemble
details:
- BladeIronPickaxe

View File

@@ -0,0 +1,14 @@
- type: entity
id: CP14ModularIronShovel
parent: CP14ModularGripWoodenLong
name: iron shovel
description: An implement for digging up earth, digging beds or graves.
components:
- type: Sprite
layers:
- state: icon
- sprite: _CP14/Objects/ModularTools/iron_shovel.rsi
state: icon
- type: CP14ModularCraftAutoAssemble
details:
- BladeIronShovel

View File

@@ -0,0 +1,14 @@
- type: entity
id: CP14ModularIronSickle
parent: CP14ModularGripWooden
name: iron sickle
description: Originally developed as a weapon against grass, the sickle suddenly proved itself good at the bloodier harvest as well.
components:
- type: Sprite
layers:
- state: icon
- sprite: _CP14/Objects/ModularTools/iron_sickle.rsi
state: icon
- type: CP14ModularCraftAutoAssemble
details:
- BladeIronSickle

View File

@@ -0,0 +1,29 @@
- type: entity
id: CP14ModularIronSpear
parent: CP14ModularGripWoodenLong
name: iron spear
description: A weapon that has done its duty since the age of the giants.
components:
- type: Sprite
layers:
- state: icon
- sprite: _CP14/Objects/ModularTools/iron_spear.rsi
state: icon
- type: CP14ModularCraftAutoAssemble
details:
- BladeIronSpear
- type: entity
id: CP14ModularIronKunai
parent: CP14ModularGripWooden
name: iron kunai
description: An effective throwing weapon. Throw it at a wall, or no, better yet, at a goblin!
components:
- type: Sprite
layers:
- state: icon
- sprite: _CP14/Objects/ModularTools/iron_spear.rsi
state: icon
- type: CP14ModularCraftAutoAssemble
details:
- BladeIronSpear

View File

@@ -0,0 +1,14 @@
- type: entity
id: CP14ModularIronSword
parent: CP14ModularGripWooden
name: iron sword
description: the gold standard of edged weapons. Medium length, comfortable grip. No frills.
components:
- type: Sprite
layers:
- state: icon
- sprite: _CP14/Objects/ModularTools/iron_sword.rsi
state: icon
- type: CP14ModularCraftAutoAssemble
details:
- BladeIronSword

View File

@@ -21,3 +21,30 @@
interfaces:
enum.CP14StoreUiKey.Key:
type: CP14StoreBoundUserInterface
- type: entity
id: CP14DPSMeter
parent: BaseStructureDynamic
categories: [ ForkFiltered ]
name: DPS Meter
suffix: Debug, DO NOT MAP
components:
- type: Sprite
sprite: Objects/Specific/Security/target.rsi
state: target_stake
noRot: true
- type: Fixtures
fixtures:
fix1:
shape:
!type:PhysShapeCircle
radius: 0.35
density: 200
mask:
- FullTileMask
layer:
- WallLayer
- type: InteractionOutline
- type: Physics
- type: Damageable
- type: CP14DPSMeter

View File

@@ -289,9 +289,9 @@
- CP14PenFeather
- CP14PaperFolderBlue
- CP14SilverCoin5
- CP14BaseDagger
- CP14BaseSickle
- CP14BasePickaxe
- CP14ModularIronDagger
- CP14ModularIronSickle
- CP14ModularIronPickaxe
- CP14Lighter
- CP14Torch
@@ -361,22 +361,22 @@
- CP14SilverCoin5
- type: loadout
id: CP14BaseDagger
id: CP14ModularIronDagger
storage:
back:
- CP14BaseDagger
- CP14ModularIronDagger
- type: loadout
id: CP14BaseSickle
id: CP14ModularIronSickle
storage:
back:
- CP14BaseSickle
- CP14ModularIronSickle
- type: loadout
id: CP14BasePickaxe
id: CP14ModularIronPickaxe
storage:
back:
- CP14BasePickaxe
- CP14ModularIronPickaxe
- type: loadout
id: CP14Lighter
@@ -406,7 +406,6 @@
- CP14ActionSpellManaConsume
- CP14ActionSpellManaGift
- CP14ActionSpellShadowGrab
- CP14ActionSpellIceDagger
- CP14ActionSpellWaterCreation
- CP14ActionSpellBeerCreation
@@ -458,12 +457,6 @@
actions:
- CP14ActionSpellShadowGrab
- type: loadout
id: CP14ActionSpellIceDagger
dummyEntity: CP14ActionSpellIceDagger
actions:
- CP14ActionSpellIceDagger
- type: loadout
id: CP14ActionSpellWaterCreation
dummyEntity: CP14ActionSpellWaterCreation

View File

@@ -56,7 +56,7 @@
id: CP14MobSkeleton
equipment:
pants: CP14ClothingPantsLoincloth
neck: CP14BaseSword
belt1: CP14BaseDagger
neck: CP14ModularIronSword
belt1: CP14ModularIronDagger
inhand:
- CP14TorchIgnited

View File

@@ -0,0 +1,217 @@
#Concept:
# + Fast attackRate
# fast swing
# - Low damage
- type: modularPart
id: BladeIronDagger
targetSlot: Blade
sourcePart: CP14ModularBladeIronDagger
rsiPath: _CP14/Objects/ModularTools/iron_dagger.rsi
modifiers:
- !type:Inherit
copyFrom:
- BaseWeaponThrowable
- BaseWeaponChemical
- BaseWeaponSharp
- !type:AddComponents
components:
- type: ThrowingAngle
angle: 135
- type: EmbeddableProjectile
offset: -0.15,-0.15
removalTime: 0.5
- !type:EditMeleeWeapon
attackRateMultiplier: 1.4
bonusDamage:
types:
Slash: 3
Piercing: 3
- !type:EditItem
newSize: Normal
adjustShape: 0, 1
storedOffsetBonus: 0, 5
#Concept:
# Copy of dagger with lesser damage
# But can gather grass from world
- type: modularPart
id: BladeIronSickle
targetSlot: Blade
sourcePart: CP14ModularBladeIronSickle
rsiPath: _CP14/Objects/ModularTools/iron_sickle.rsi
modifiers:
- !type:Inherit
copyFrom:
- BaseWeaponChemical
- BaseWeaponSharp
#components: TODO Add gathering tag
- !type:EditMeleeWeapon
attackRateMultiplier: 1.4
bonusDamage:
types:
Slash: 4
Piercing: 1
- !type:EditItem
newSize: Normal
adjustShape: 0, 1
storedOffsetBonus: 0, 5
#Concept:
# + High Throwable damage
# Piercing animation
# - Low Melee Damage
- type: modularPart
id: BladeIronSpear
targetSlot: Blade
sourcePart: CP14ModularBladeIronSpear
rsiPath: _CP14/Objects/ModularTools/iron_spear.rsi
modifiers:
- !type:Inherit
copyFrom:
- BaseWeaponThrowable
- BaseWeaponChemical
- BaseWeaponSharp
- !type:AddComponents
override: true
components:
- type: DamageOtherOnHit
damage:
types:
Piercing: 15
- type: ThrowingAngle
angle: 135
- type: EmbeddableProjectile
offset: -0.15,-0.15
removalTime: 1.5
- !type:EditMeleeWeapon
newWideAnimation: CP14WeaponArcThrust
angleMultiplier: 0
bonusDamage:
types:
Piercing: 7
- !type:EditItem
newSize: Normal
adjustShape: 0, 1
storedOffsetBonus: 0, 5
#Concept:
# + High Wielded damage
# - Low AttackRate
- type: modularPart
id: BladeIronMace
targetSlot: Blade
sourcePart: CP14ModularBladeIronMace
rsiPath: _CP14/Objects/ModularTools/iron_mace.rsi
modifiers:
- !type:Inherit
copyFrom:
- BaseWeaponChemical
- !type:EditMeleeWeapon
resetOnHandSelected: true # Disable fast swap
attackRateMultiplier: 0.85
bonusDamage:
types:
Blunt: 4
Piercing: 1
- !type:EditIncreaseDamageOnWield
bonusDamage:
types:
Blunt: 8
Piercing: 4
- !type:EditItem
newSize: Large
adjustShape: 0, 1
storedOffsetBonus: 0, 5
#Concept:
# + Additional range
# + High Damage! + Wielded buff
# - Required Warcraft skill
- type: modularPart
id: BladeIronSword
targetSlot: Blade
sourcePart: CP14ModularBladeIronSword
rsiPath: _CP14/Objects/ModularTools/iron_sword.rsi
modifiers:
- !type:Inherit
copyFrom:
- BaseWeaponChemical
- BaseWeaponSharp
- !type:AddComponents
components:
- type: CP14SkillRequirement
fuckupChance: 0.5
requiredSkills:
- Warcraft
- !type:EditMeleeWeapon
resetOnHandSelected: true # Disable fast swap
bonusRange: 0.2
angleMultiplier: 1.2
bonusDamage:
types:
Slash: 8
Piercing: 5
- !type:EditIncreaseDamageOnWield
bonusDamage:
types:
Slash: 5
Piercing: 2
- !type:EditItem
newSize: Large
adjustShape: 0, 2
storedOffsetBonus: 0, 10
- type: modularPart
id: BladeIronShovel
targetSlot: Blade
sourcePart: CP14ModularBladeIronShovel
rsiPath: _CP14/Objects/ModularTools/iron_shovel.rsi
modifiers:
- !type:AddComponents
components:
- type: ToolTileCompatible
- type: Tool
qualities:
- CP14Digging
useSound:
collection: CP14Digging
params:
variation: 0.03
volume: 2
- !type:EditMeleeWeapon
angleMultiplier: 1.2
bonusDamage:
types:
Slash: 3
Blunt: 3
- !type:EditIncreaseDamageOnWield
bonusDamage:
types:
Slash: 3
Blunt: 3
- !type:EditItem
newSize: Normal
adjustShape: 0, 1
storedOffsetBonus: 0, 5
- type: modularPart
id: BladeIronPickaxe
targetSlot: Blade
sourcePart: CP14ModularBladeIronPickaxe
rsiPath: _CP14/Objects/ModularTools/iron_pickaxe.rsi
modifiers:
- !type:EditMeleeWeapon
attackRateMultiplier: 0.75
angleMultiplier: 1.2
bonusDamage:
types:
Piercing: 9
- !type:EditIncreaseDamageOnWield
bonusDamage:
types:
Piercing: 4
Structural: 10
- !type:EditItem
newSize: Normal
adjustShape: 1, 1
storedOffsetBonus: 0, 5

View File

@@ -0,0 +1,68 @@
- type: modularPart
id: BaseWeaponChemical
modifiers:
- !type:AddComponents
components:
- type: SolutionContainerManager
solutions:
melee:
maxVol: 4
- type: MeleeChemicalInjector
solution: melee
- type: RefillableSolution
solution: melee
- type: InjectableSolution
solution: melee
- type: SolutionInjectOnEmbed
transferAmount: 2
solution: melee
- type: SolutionTransfer
maxTransferAmount: 2
- type: modularPart
id: BaseWeaponThrowable
modifiers:
- !type:AddComponents
components:
- type: LandAtCursor
- type: DamageOtherOnHit
damage:
types:
Piercing: 10
- type: DamageOnLand
damage:
types:
Piercing: 3
- type: Fixtures
fixtures:
fix1:
shape: !type:PolygonShape
vertices:
- -0.40,-0.30
- -0.30,-0.40
- 0.40,0.30
- 0.30,0.40
density: 10
mask:
- ItemMask
restitution: 0.3
friction: 0.2
- type: modularPart
id: BaseWeaponSharp
modifiers:
- !type:AddComponents
components:
- type: Sharp
- type: CP14Sharpened
- type: CP14SharpeningStone
- type: UseDelay
- type: Tool
qualities:
- Slicing
useSound:
path: /Audio/Items/Culinary/chop.ogg
- type: Utensil
types:
- Knife
- type: CP14WallpaperRemover

View File

@@ -0,0 +1,3 @@
- type: modularSlot
id: Blade
name: cp14-modular-slot-blade

View File

@@ -1,9 +0,0 @@
- type: salvageLoot
id: CP14DungeonLoot
loots:
- !type:RandomSpawnsLoot
entries:
- proto: CP14BaseThrowableSpear
prob: 0.5
- proto: CP14BaseDagger
prob: 0.5

View File

@@ -1,48 +1,3 @@
- type: CP14Recipe
id: CP14BaseBattleHammer
tag: CP14RecipeAnvil
craftTime: 4
stacks:
CP14WoodenPlanks: 1
CP14IronBar: 3
result: CP14BaseBattleHammer
- type: CP14Recipe
id: CP14BaseDagger
tag: CP14RecipeAnvil
craftTime: 4
stacks:
CP14WoodenPlanks: 1
CP14IronBar: 1
result: CP14BaseDagger
- type: CP14Recipe
id: CP14BaseHandheldAxe
tag: CP14RecipeAnvil
craftTime: 4
stacks:
CP14WoodenPlanks: 1
CP14IronBar: 1
result: CP14BaseHandheldAxe
- type: CP14Recipe
id: CP14BaseLightHammer
tag: CP14RecipeAnvil
craftTime: 4
stacks:
CP14WoodenPlanks: 1
CP14IronBar: 1
result: CP14BaseLightHammer
- type: CP14Recipe
id: CP14BaseMace
tag: CP14RecipeAnvil
craftTime: 4
stacks:
CP14WoodenPlanks: 1
CP14IronBar: 2
result: CP14BaseMace
- type: CP14Recipe
id: CP14BaseShield
tag: CP14RecipeAnvil
@@ -52,33 +7,6 @@
CP14IronBar: 2
result: CP14BaseShield
- type: CP14Recipe
id: CP14BaseSickle
tag: CP14RecipeAnvil
craftTime: 4
stacks:
CP14WoodenPlanks: 1
CP14IronBar: 2
result: CP14BaseSickle
- type: CP14Recipe
id: CP14BaseThrowableSpear
tag: CP14RecipeAnvil
craftTime: 4
stacks:
CP14WoodenPlanks: 2
CP14IronBar: 1
result: CP14BaseThrowableSpear
- type: CP14Recipe
id: CP14BaseSword
tag: CP14RecipeAnvil
craftTime: 4
stacks:
CP14WoodenPlanks: 1
CP14IronBar: 3
result: CP14BaseSword
- type: CP14Recipe
id: CP14BaseCrowbar
tag: CP14RecipeAnvil
@@ -95,42 +23,6 @@
CP14IronBar: 2
result: CP14BaseWrench
- type: CP14Recipe
id: CP14BaseTwoHandedSword
tag: CP14RecipeAnvil
craftTime: 4
stacks:
CP14WoodenPlanks: 1
CP14IronBar: 4
result: CP14BaseTwoHandedSword
- type: CP14Recipe
id: CP14BaseHoe
tag: CP14RecipeAnvil
craftTime: 4
stacks:
CP14WoodenPlanks: 1
CP14IronBar: 2
result: CP14BaseHoe
- type: CP14Recipe
id: CP14BasePickaxe
tag: CP14RecipeAnvil
craftTime: 4
stacks:
CP14WoodenPlanks: 1
CP14IronBar: 2
result: CP14BasePickaxe
- type: CP14Recipe
id: CP14BaseShovel
tag: CP14RecipeAnvil
craftTime: 4
stacks:
CP14WoodenPlanks: 1
CP14IronBar: 2
result: CP14BaseShovel
- type: CP14Recipe
id: CP14ClothingCloakCuirass
tag: CP14RecipeAnvil
@@ -211,4 +103,76 @@
craftTime: 1
stacks:
CP14CopperBar: 1
result: CP14Crossbolt
result: CP14Crossbolt
- type: CP14Recipe
id: CP14ModularBladeIronDagger
tag: CP14RecipeAnvil
craftTime: 2
stacks:
CP14IronBar: 1
result: CP14ModularBladeIronDagger
- type: CP14Recipe
id: CP14ModularBladeIronSpear
tag: CP14RecipeAnvil
craftTime: 2
stacks:
CP14IronBar: 1
result: CP14ModularBladeIronSpear
- type: CP14Recipe
id: CP14ModularBladeIronMace
tag: CP14RecipeAnvil
craftTime: 2
stacks:
CP14IronBar: 1
result: CP14ModularBladeIronMace
- type: CP14Recipe
id: CP14ModularBladeIronSword
tag: CP14RecipeAnvil
craftTime: 4
stacks:
CP14IronBar: 2
result: CP14ModularBladeIronSword
- type: CP14Recipe
id: CP14ModularBladeIronSickle
tag: CP14RecipeAnvil
craftTime: 2
stacks:
CP14IronBar: 1
result: CP14ModularBladeIronSickle
- type: CP14Recipe
id: CP14ModularBladeIronShovel
tag: CP14RecipeAnvil
craftTime: 2
stacks:
CP14IronBar: 1
result: CP14ModularBladeIronShovel
- type: CP14Recipe
id: CP14ModularBladeIronPickaxe
tag: CP14RecipeAnvil
craftTime: 2
stacks:
CP14IronBar: 1
result: CP14ModularBladeIronPickaxe
- type: CP14Recipe
id: CP14ModularGripIron
tag: CP14RecipeAnvil
craftTime: 2
stacks:
CP14IronBar: 1
result: CP14ModularGripIron
- type: CP14Recipe
id: CP14ModularGripIronLong
tag: CP14RecipeAnvil
craftTime: 4
stacks:
CP14IronBar: 2
result: CP14ModularGripIronLong

View File

@@ -69,3 +69,19 @@
CP14Stone: 1
CP14IronBar: 1
result: CP14Lighter
- type: CP14Recipe
id: CP14ModularGripWooden
tag: CP14RecipeWorkbench
craftTime: 2
stacks:
CP14WoodenPlanks: 1
result: CP14ModularGripWooden
- type: CP14Recipe
id: CP14ModularGripWoodenLong
tag: CP14RecipeWorkbench
craftTime: 2
stacks:
CP14WoodenPlanks: 2
result: CP14ModularGripWoodenLong

View File

@@ -6,5 +6,5 @@
pants: CP14ClothingPantsLoincloth
shoes: CP14ClothingShoesSandals
inhand:
- CP14BaseDagger
- CP14BaseDagger
- CP14ModularIronDagger
- CP14ModularIronDagger

View File

@@ -2,8 +2,8 @@
id: CP14Digging
name: cp14-tool-quality-digging-name
toolName: cp14-tool-quality-digging-tool-name
spawn: CP14BaseShovel
icon: { sprite: _CP14/Objects/Weapons/Melee/Shovel/shovel.rsi, state: icon}
spawn: CP14ModularIronShovel
icon: { sprite: _CP14/Objects/ModularTools/iron_shovel.rsi, state: icon}
- type: tool
id: CP14Hammering

View File

@@ -31,8 +31,8 @@ When you decide to leave the demiplane after finding the portal, you must touch
<Box>
<GuideEntityEmbed Entity="CP14BaseShield"/>
<GuideEntityEmbed Entity="CP14BaseSword"/>
<GuideEntityEmbed Entity="CP14BasePickaxe"/>
<GuideEntityEmbed Entity="CP14ModularIronSword"/>
<GuideEntityEmbed Entity="CP14ModularIronPickaxe"/>
<GuideEntityEmbed Entity="CP14CrystalLampBlueEmpty"/>
<GuideEntityEmbed Entity="CP14BaseSharpeningStone"/>
</Box>

View File

@@ -31,8 +31,8 @@
<Box>
<GuideEntityEmbed Entity="CP14BaseShield"/>
<GuideEntityEmbed Entity="CP14BaseSword"/>
<GuideEntityEmbed Entity="CP14BasePickaxe"/>
<GuideEntityEmbed Entity="CP14ModularIronSword"/>
<GuideEntityEmbed Entity="CP14ModularIronPickaxe"/>
<GuideEntityEmbed Entity="CP14CrystalLampBlueEmpty"/>
<GuideEntityEmbed Entity="CP14BaseSharpeningStone"/>
</Box>

Binary file not shown.

After

Width:  |  Height:  |  Size: 518 B

View File

@@ -0,0 +1,14 @@
{
"version": 1,
"size": {
"x": 48,
"y": 48
},
"license": "CLA",
"copyright": "Created by Jaraten (Github) ",
"states": [
{
"name": "icon"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 322 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 433 B

View File

@@ -0,0 +1,42 @@
{
"version": 1,
"size": {
"x": 32,
"y": 32
},
"license": "CLA",
"copyright": "Created by TheShuEd (Github) ",
"states": [
{
"name": "equipped-BELT1",
"directions": 4
},
{
"name": "equipped-BELT2",
"directions": 4
},
{
"name": "equipped-NECK",
"directions": 4
},
{
"name": "icon"
},
{
"name": "inhand-left",
"directions": 4
},
{
"name": "inhand-right",
"directions": 4
},
{
"name": "wielded-inhand-left",
"directions": 4
},
{
"name": "wielded-inhand-right",
"directions": 4
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 390 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 395 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 358 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 354 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 442 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 B

View File

@@ -1,12 +1,16 @@
{
"version": 1,
"license": "CLA",
"copyright": "Created by TheShuEd (Github)",
"size": {
"x": 32,
"y": 32
"x": 48,
"y": 48
},
"license": "CLA",
"copyright": "Created by TheShuEd (Github) ",
"states": [
{
"name": "equipped-NECK",
"directions": 4
},
{
"name": "icon"
},
@@ -27,4 +31,4 @@
"directions": 4
}
]
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 403 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 521 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 492 B

View File

@@ -0,0 +1,42 @@
{
"version": 1,
"size": {
"x": 32,
"y": 32
},
"license": "CLA",
"copyright": "Created by TheShuEd (Github) ",
"states": [
{
"name": "equipped-BELT1",
"directions": 4
},
{
"name": "equipped-BELT2",
"directions": 4
},
{
"name": "equipped-NECK",
"directions": 4
},
{
"name": "icon"
},
{
"name": "inhand-left",
"directions": 4
},
{
"name": "inhand-right",
"directions": 4
},
{
"name": "wielded-inhand-left",
"directions": 4
},
{
"name": "wielded-inhand-right",
"directions": 4
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 518 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 523 B

Some files were not shown because too many files have changed in this diff Show More