Better item construction

This commit is contained in:
Clyybber
2020-06-06 10:40:53 +02:00
parent 5d2282231f
commit 2995981b5e
4 changed files with 84 additions and 7 deletions

View File

@@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Content.Client.GameObjects.Components.Construction; using Content.Client.GameObjects.Components.Construction;
using Content.Client.Interfaces.GameObjects;
using Content.Shared.Construction; using Content.Shared.Construction;
using Content.Shared.GameObjects.Components.Interactable; using Content.Shared.GameObjects.Components.Interactable;
using Robust.Client.Graphics; using Robust.Client.Graphics;
@@ -236,11 +237,10 @@ namespace Content.Client.Construction
return; return;
} }
if (prototype.Type != ConstructionType.Structure) if (prototype.Type == ConstructionType.Item)
{ {
// In-hand attackby doesn't exist so this is the best alternative. Owner.TryStartItemConstruction(prototype.ID);
var loc = Owner.Owner.GetComponent<ITransformComponent>().GridPosition; BuildButton.Pressed = false;
Owner.SpawnGhost(prototype, loc, Direction.North);
return; return;
} }

View File

@@ -114,6 +114,12 @@ namespace Content.Client.GameObjects.Components.Construction
SendNetworkMessage(msg); SendNetworkMessage(msg);
} }
public void TryStartItemConstruction(string prototypeName)
{
var msg = new TryStartItemConstructionMessage(prototypeName);
SendNetworkMessage(msg);
}
public void ClearGhost(int ghostId) public void ClearGhost(int ghostId)
{ {
if (Ghosts.TryGetValue(ghostId, out var ghost)) if (Ghosts.TryGetValue(ghostId, out var ghost))

View File

@@ -1,10 +1,8 @@
using System; using System;
using Content.Server.GameObjects.Components.Stack; using Content.Server.GameObjects.Components.Stack;
using Content.Server.GameObjects.EntitySystems;
using Content.Server.Utility; using Content.Server.Utility;
using Content.Shared.Construction; using Content.Shared.Construction;
using Content.Shared.GameObjects.Components.Construction; using Content.Shared.GameObjects.Components.Construction;
using Content.Shared.Interfaces;
using Robust.Server.GameObjects.EntitySystems; using Robust.Server.GameObjects.EntitySystems;
using Robust.Server.Interfaces.GameObjects; using Robust.Server.Interfaces.GameObjects;
using Robust.Shared.GameObjects; using Robust.Shared.GameObjects;
@@ -13,7 +11,6 @@ using Robust.Shared.Interfaces.GameObjects;
using Robust.Shared.Interfaces.Map; using Robust.Shared.Interfaces.Map;
using Robust.Shared.Interfaces.Network; using Robust.Shared.Interfaces.Network;
using Robust.Shared.IoC; using Robust.Shared.IoC;
using Robust.Shared.Localization;
using Robust.Shared.Map; using Robust.Shared.Map;
using Robust.Shared.Maths; using Robust.Shared.Maths;
using Robust.Shared.Players; using Robust.Shared.Players;
@@ -40,6 +37,9 @@ namespace Content.Server.GameObjects.Components.Construction
case TryStartStructureConstructionMessage tryStart: case TryStartStructureConstructionMessage tryStart:
TryStartStructureConstruction(tryStart.Location, tryStart.PrototypeName, tryStart.Angle, tryStart.Ack); TryStartStructureConstruction(tryStart.Location, tryStart.PrototypeName, tryStart.Angle, tryStart.Ack);
break; break;
case TryStartItemConstructionMessage tryStart:
TryStartItemConstruction(tryStart.PrototypeName);
break;
} }
} }
@@ -102,5 +102,56 @@ namespace Content.Server.GameObjects.Components.Construction
var msg = new AckStructureConstructionMessage(ack); var msg = new AckStructureConstructionMessage(ack);
SendNetworkMessage(msg); SendNetworkMessage(msg);
} }
void TryStartItemConstruction(string prototypeName)
{
var prototype = _prototypeManager.Index<ConstructionPrototype>(prototypeName);
if (prototype.Stages.Count < 2)
{
throw new InvalidOperationException($"Prototype '{prototypeName}' does not have enough stages.");
}
var stage0 = prototype.Stages[0];
if (!(stage0.Forward is ConstructionStepMaterial matStep))
{
throw new NotImplementedException();
}
// Try to find the stack with the material in the user's hand.
var hands = Owner.GetComponent<HandsComponent>();
var activeHand = hands.GetActiveHand?.Owner;
if (activeHand == null)
{
return;
}
if (!activeHand.TryGetComponent(out StackComponent stack) || !ConstructionComponent.MaterialStackValidFor(matStep, stack))
{
return;
}
if (!stack.Use(matStep.Amount))
{
return;
}
// OK WE'RE GOOD CONSTRUCTION STARTED.
EntitySystem.Get<AudioSystem>().Play("/Audio/items/deconstruct.ogg", Owner);
if (prototype.Stages.Count == 2)
{
// Exactly 2 stages, so don't make an intermediate frame.
var ent = _serverEntityManager.SpawnEntity(prototype.Result, Owner.Transform.GridPosition);
hands.PutInHandOrDrop(ent.GetComponent<ItemComponent>());
}
else
{
//TODO: Make these viable as an item and try putting them in the players hands
var frame = _serverEntityManager.SpawnEntity("structureconstructionframe", Owner.Transform.GridPosition);
var construction = frame.GetComponent<ConstructionComponent>();
construction.Init(prototype);
}
}
} }
} }

View File

@@ -48,6 +48,26 @@ namespace Content.Shared.GameObjects.Components.Construction
} }
} }
/// <summary>
/// Sent client -> server to to tell the server that we started building
/// an item-construction.
/// </summary>
[Serializable, NetSerializable]
protected class TryStartItemConstructionMessage : ComponentMessage
{
/// <summary>
/// The construction prototype to start building.
/// </summary>
public readonly string PrototypeName;
public TryStartItemConstructionMessage(string prototypeName)
{
Directed = true;
PrototypeName = prototypeName;
}
}
[Serializable, NetSerializable] [Serializable, NetSerializable]
protected class AckStructureConstructionMessage : ComponentMessage protected class AckStructureConstructionMessage : ComponentMessage
{ {