Теперь предметы можно передавать из рук в руки (#462)
* add: Теперь предеты можно передовать из рук в руки * Кудато не туда уехало
This commit is contained in:
@@ -81,6 +81,7 @@ namespace Content.Client.Input
|
||||
human.AddFunction(ContentKeyFunctions.Arcade2);
|
||||
human.AddFunction(ContentKeyFunctions.Arcade3);
|
||||
human.AddFunction(ContentKeyFunctions.LieDown); // WD EDIT
|
||||
human.AddFunction(ContentKeyFunctions.OfferItem); // WD EDIT
|
||||
|
||||
// actions should be common (for ghosts, mobs, etc)
|
||||
common.AddFunction(ContentKeyFunctions.OpenActionsMenu);
|
||||
|
||||
@@ -191,6 +191,7 @@ namespace Content.Client.Options.UI.Tabs
|
||||
AddButton(ContentKeyFunctions.MoveStoredItem);
|
||||
AddButton(ContentKeyFunctions.RotateStoredItem);
|
||||
AddButton(ContentKeyFunctions.SaveItemLocation);
|
||||
AddButton(ContentKeyFunctions.OfferItem); // WD EDIT
|
||||
AddButton(ContentKeyFunctions.LieDown); // WD EDIT
|
||||
AddCheckBox("ui-options-function-auto-get-up", _cfg.GetCVar(WhiteCVars.AutoGetUp), HandleToggleAutoGetUp); // WD EDIT
|
||||
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
StyleClasses="LabelKeyText"/>
|
||||
<CheckBox Name="ShowHeldItemCheckBox" Text="{Loc 'ui-options-show-held-item'}" />
|
||||
<CheckBox Name="ShowCombatModeIndicatorsCheckBox" Text="{Loc 'ui-options-show-combat-mode-indicators'}" />
|
||||
<CheckBox Name="ShowOfferModeIndicatorsCheckBox" Text="{Loc 'ui-options-show-offer-mode-indicators'}" />
|
||||
<Label Text="{Loc 'ui-options-general-storage'}"
|
||||
FontColorOverride="{xNamespace:Static s:StyleNano.NanoGold}"
|
||||
StyleClasses="LabelKeyText"/>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System.Linq;
|
||||
using Content.Client.UserInterface.Screens;
|
||||
using Content.Shared._White;
|
||||
using Content.Shared.CCVar;
|
||||
using Content.Shared.HUD;
|
||||
using Robust.Client.AutoGenerated;
|
||||
@@ -69,6 +70,7 @@ namespace Content.Client.Options.UI.Tabs
|
||||
ShowLoocAboveHeadCheckBox.OnToggled += OnCheckBoxToggled;
|
||||
ShowHeldItemCheckBox.OnToggled += OnCheckBoxToggled;
|
||||
ShowCombatModeIndicatorsCheckBox.OnToggled += OnCheckBoxToggled;
|
||||
ShowOfferModeIndicatorsCheckBox.OnToggled += OnCheckBoxToggled; // WD EDIT
|
||||
OpaqueStorageWindowCheckBox.OnToggled += OnCheckBoxToggled;
|
||||
FancySpeechBubblesCheckBox.OnToggled += OnCheckBoxToggled;
|
||||
FancyNameBackgroundsCheckBox.OnToggled += OnCheckBoxToggled;
|
||||
@@ -85,6 +87,7 @@ namespace Content.Client.Options.UI.Tabs
|
||||
ShowLoocAboveHeadCheckBox.Pressed = _cfg.GetCVar(CCVars.LoocAboveHeadShow);
|
||||
ShowHeldItemCheckBox.Pressed = _cfg.GetCVar(CCVars.HudHeldItemShow);
|
||||
ShowCombatModeIndicatorsCheckBox.Pressed = _cfg.GetCVar(CCVars.CombatModeIndicatorsPointShow);
|
||||
ShowOfferModeIndicatorsCheckBox.Pressed = _cfg.GetCVar(WhiteCVars.OfferModeIndicatorsPointShow); // WD EDIT
|
||||
OpaqueStorageWindowCheckBox.Pressed = _cfg.GetCVar(CCVars.OpaqueStorageWindow);
|
||||
FancySpeechBubblesCheckBox.Pressed = _cfg.GetCVar(CCVars.ChatEnableFancyBubbles);
|
||||
FancyNameBackgroundsCheckBox.Pressed = _cfg.GetCVar(CCVars.ChatFancyNameBackground);
|
||||
@@ -130,6 +133,7 @@ namespace Content.Client.Options.UI.Tabs
|
||||
_cfg.SetCVar(CVars.DiscordEnabled, DiscordRich.Pressed);
|
||||
_cfg.SetCVar(CCVars.HudHeldItemShow, ShowHeldItemCheckBox.Pressed);
|
||||
_cfg.SetCVar(CCVars.CombatModeIndicatorsPointShow, ShowCombatModeIndicatorsCheckBox.Pressed);
|
||||
_cfg.SetCVar(WhiteCVars.OfferModeIndicatorsPointShow, ShowOfferModeIndicatorsCheckBox.Pressed); // WD EDIT
|
||||
_cfg.SetCVar(CCVars.OpaqueStorageWindow, OpaqueStorageWindowCheckBox.Pressed);
|
||||
_cfg.SetCVar(CCVars.ShowOocPatronColor, ShowOocPatronColor.Pressed);
|
||||
_cfg.SetCVar(CCVars.LoocAboveHeadShow, ShowLoocAboveHeadCheckBox.Pressed);
|
||||
@@ -158,6 +162,7 @@ namespace Content.Client.Options.UI.Tabs
|
||||
var isDiscordSame = DiscordRich.Pressed == _cfg.GetCVar(CVars.DiscordEnabled);
|
||||
var isShowHeldItemSame = ShowHeldItemCheckBox.Pressed == _cfg.GetCVar(CCVars.HudHeldItemShow);
|
||||
var isCombatModeIndicatorsSame = ShowCombatModeIndicatorsCheckBox.Pressed == _cfg.GetCVar(CCVars.CombatModeIndicatorsPointShow);
|
||||
var isOfferModeIndicatorsSame = ShowOfferModeIndicatorsCheckBox.Pressed == _cfg.GetCVar(WhiteCVars.OfferModeIndicatorsPointShow); // WD EDIT
|
||||
var isOpaqueStorageWindow = OpaqueStorageWindowCheckBox.Pressed == _cfg.GetCVar(CCVars.OpaqueStorageWindow);
|
||||
var isOocPatronColorShowSame = ShowOocPatronColor.Pressed == _cfg.GetCVar(CCVars.ShowOocPatronColor);
|
||||
var isLoocShowSame = ShowLoocAboveHeadCheckBox.Pressed == _cfg.GetCVar(CCVars.LoocAboveHeadShow);
|
||||
@@ -175,6 +180,7 @@ namespace Content.Client.Options.UI.Tabs
|
||||
isDiscordSame &&
|
||||
isShowHeldItemSame &&
|
||||
isCombatModeIndicatorsSame &&
|
||||
isOfferModeIndicatorsSame && // WD EDIT
|
||||
isOpaqueStorageWindow &&
|
||||
isOocPatronColorShowSame &&
|
||||
isLoocShowSame &&
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
using System.Numerics;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.Graphics;
|
||||
using Robust.Client.Input;
|
||||
using Robust.Client.UserInterface;
|
||||
using Robust.Shared.Enums;
|
||||
using Robust.Shared.Utility;
|
||||
|
||||
namespace Content.Client._White.OfferItem;
|
||||
|
||||
public sealed class OfferItemIndicatorsOverlay : Overlay
|
||||
{
|
||||
private readonly IInputManager _inputManager;
|
||||
private readonly IEntityManager _entMan;
|
||||
private readonly IEyeManager _eye;
|
||||
private readonly OfferItemSystem _offer;
|
||||
|
||||
private readonly Texture _sight;
|
||||
|
||||
public override OverlaySpace Space => OverlaySpace.ScreenSpace;
|
||||
|
||||
private readonly Color _mainColor = Color.White.WithAlpha(0.3f);
|
||||
private readonly Color _strokeColor = Color.Black.WithAlpha(0.5f);
|
||||
private readonly float _scale = 0.6f; // 1 is a little big
|
||||
|
||||
public OfferItemIndicatorsOverlay(IInputManager input, IEntityManager entMan,
|
||||
IEyeManager eye, OfferItemSystem offerSys)
|
||||
{
|
||||
_inputManager = input;
|
||||
_entMan = entMan;
|
||||
_eye = eye;
|
||||
_offer = offerSys;
|
||||
|
||||
var spriteSys = _entMan.EntitySysManager.GetEntitySystem<SpriteSystem>();
|
||||
_sight = spriteSys.Frame0(new SpriteSpecifier.Rsi(new ResPath("/Textures/White/Interface/give_item.rsi"),
|
||||
"give_item"));
|
||||
}
|
||||
|
||||
protected override bool BeforeDraw(in OverlayDrawArgs args)
|
||||
{
|
||||
if (!_offer.IsInOfferMode())
|
||||
return false;
|
||||
|
||||
return base.BeforeDraw(in args);
|
||||
}
|
||||
|
||||
protected override void Draw(in OverlayDrawArgs args)
|
||||
{
|
||||
var mouseScreenPosition = _inputManager.MouseScreenPosition;
|
||||
var mousePosMap = _eye.PixelToMap(mouseScreenPosition);
|
||||
if (mousePosMap.MapId != args.MapId)
|
||||
return;
|
||||
|
||||
|
||||
var mousePos = mouseScreenPosition.Position;
|
||||
var uiScale = (args.ViewportControl as Control)?.UIScale ?? 1f;
|
||||
var limitedScale = uiScale > 1.25f ? 1.25f : uiScale;
|
||||
|
||||
DrawSight(_sight, args.ScreenHandle, mousePos, limitedScale * _scale);
|
||||
}
|
||||
|
||||
private void DrawSight(Texture sight, DrawingHandleScreen screen, Vector2 centerPos, float scale)
|
||||
{
|
||||
var sightSize = sight.Size * scale;
|
||||
var expandedSize = sightSize + new Vector2(7f, 7f);
|
||||
|
||||
screen.DrawTextureRect(sight,
|
||||
UIBox2.FromDimensions(centerPos - sightSize * 0.5f, sightSize), _strokeColor);
|
||||
screen.DrawTextureRect(sight,
|
||||
UIBox2.FromDimensions(centerPos - expandedSize * 0.5f, expandedSize), _mainColor);
|
||||
}
|
||||
}
|
||||
52
Content.Client/_White/OfferItem/OfferItemSystem.cs
Normal file
52
Content.Client/_White/OfferItem/OfferItemSystem.cs
Normal file
@@ -0,0 +1,52 @@
|
||||
using Content.Shared._White;
|
||||
using Content.Shared._White.OfferItem;
|
||||
using Content.Shared.CCVar;
|
||||
using Robust.Client.Graphics;
|
||||
using Robust.Client.Input;
|
||||
using Robust.Client.Player;
|
||||
using Robust.Shared.Configuration;
|
||||
|
||||
namespace Content.Client._White.OfferItem;
|
||||
|
||||
public sealed class OfferItemSystem : SharedOfferItemSystem
|
||||
{
|
||||
[Dependency] private readonly IOverlayManager _overlayManager = default!;
|
||||
[Dependency] private readonly IPlayerManager _playerManager = default!;
|
||||
[Dependency] private readonly IConfigurationManager _cfg = default!;
|
||||
[Dependency] private readonly IInputManager _inputManager = default!;
|
||||
[Dependency] private readonly IEyeManager _eye = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
Subs.CVar(_cfg, WhiteCVars.OfferModeIndicatorsPointShow, OnShowOfferIndicatorsChanged, true);
|
||||
}
|
||||
public override void Shutdown()
|
||||
{
|
||||
_overlayManager.RemoveOverlay<OfferItemIndicatorsOverlay>();
|
||||
|
||||
base.Shutdown();
|
||||
}
|
||||
|
||||
public bool IsInOfferMode()
|
||||
{
|
||||
var entity = _playerManager.LocalEntity;
|
||||
|
||||
if (entity == null)
|
||||
return false;
|
||||
|
||||
return IsInOfferMode(entity.Value);
|
||||
}
|
||||
private void OnShowOfferIndicatorsChanged(bool isShow)
|
||||
{
|
||||
if (isShow)
|
||||
{
|
||||
_overlayManager.AddOverlay(new OfferItemIndicatorsOverlay(
|
||||
_inputManager,
|
||||
EntityManager,
|
||||
_eye,
|
||||
this));
|
||||
}
|
||||
else
|
||||
_overlayManager.RemoveOverlay<OfferItemIndicatorsOverlay>();
|
||||
}
|
||||
}
|
||||
24
Content.Server/_White/Alert/Click/AcceptOffer.cs
Normal file
24
Content.Server/_White/Alert/Click/AcceptOffer.cs
Normal file
@@ -0,0 +1,24 @@
|
||||
using Content.Server._White.OfferItem;
|
||||
using Content.Shared._White.OfferItem;
|
||||
using Content.Shared.Alert;
|
||||
using JetBrains.Annotations;
|
||||
|
||||
namespace Content.Server._White.Alert.Click;
|
||||
|
||||
/// <summary>
|
||||
/// Accepting the offer and receive item
|
||||
/// </summary>
|
||||
[UsedImplicitly]
|
||||
[DataDefinition]
|
||||
public sealed partial class AcceptOffer : IAlertClick
|
||||
{
|
||||
public void AlertClicked(EntityUid player)
|
||||
{
|
||||
var entManager = IoCManager.Resolve<IEntityManager>();
|
||||
|
||||
if (entManager.TryGetComponent(player, out OfferItemComponent? offerItem))
|
||||
{
|
||||
entManager.System<OfferItemSystem>().Receive(player, offerItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
83
Content.Server/_White/OfferItem/OfferItemSystem.cs
Normal file
83
Content.Server/_White/OfferItem/OfferItemSystem.cs
Normal file
@@ -0,0 +1,83 @@
|
||||
using Content.Server.Popups;
|
||||
using Content.Shared.Hands.Components;
|
||||
using Content.Shared.Alert;
|
||||
using Content.Shared.Hands.EntitySystems;
|
||||
using Content.Shared._White.OfferItem;
|
||||
using Content.Shared.IdentityManagement;
|
||||
using Robust.Shared.Player;
|
||||
|
||||
namespace Content.Server._White.OfferItem;
|
||||
|
||||
public sealed class OfferItemSystem : SharedOfferItemSystem
|
||||
{
|
||||
[Dependency] private readonly AlertsSystem _alertsSystem = default!;
|
||||
[Dependency] private readonly SharedHandsSystem _hands = default!;
|
||||
[Dependency] private readonly PopupSystem _popup = default!;
|
||||
|
||||
public override void Update(float frameTime)
|
||||
{
|
||||
base.Update(frameTime);
|
||||
|
||||
var query = EntityQueryEnumerator<OfferItemComponent>();
|
||||
while (query.MoveNext(out var uid, out var offerItem))
|
||||
{
|
||||
if (!TryComp<HandsComponent>(uid, out var hands) || hands.ActiveHand == null)
|
||||
continue;
|
||||
|
||||
if (offerItem.Hand != null &&
|
||||
hands.Hands[offerItem.Hand].HeldEntity == null)
|
||||
{
|
||||
if (offerItem.Target != null)
|
||||
{
|
||||
UnReceive(offerItem.Target.Value, offerItem: offerItem);
|
||||
offerItem.IsInOfferMode = false;
|
||||
Dirty(uid, offerItem);
|
||||
}
|
||||
else
|
||||
UnOffer(uid, offerItem);
|
||||
}
|
||||
|
||||
if (!offerItem.IsInReceiveMode)
|
||||
{
|
||||
_alertsSystem.ClearAlert(uid, AlertType.Offer);
|
||||
continue;
|
||||
}
|
||||
|
||||
_alertsSystem.ShowAlert(uid, AlertType.Offer);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Accepting the offer and receive item
|
||||
/// </summary>
|
||||
public void Receive(EntityUid uid, OfferItemComponent? component = null)
|
||||
{
|
||||
if (!Resolve(uid, ref component) ||
|
||||
!TryComp<OfferItemComponent>(component.Target, out var offerItem) ||
|
||||
offerItem.Hand == null ||
|
||||
component.Target == null ||
|
||||
!TryComp<HandsComponent>(uid, out var hands))
|
||||
return;
|
||||
|
||||
if (offerItem.Item != null)
|
||||
{
|
||||
if (!_hands.TryPickup(uid, offerItem.Item.Value, handsComp: hands))
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("offer-item-full-hand"), uid, uid);
|
||||
return;
|
||||
}
|
||||
|
||||
_popup.PopupEntity(Loc.GetString("offer-item-give",
|
||||
("item", Identity.Entity(offerItem.Item.Value, EntityManager)),
|
||||
("target", Identity.Entity(uid, EntityManager))), component.Target.Value, component.Target.Value);
|
||||
_popup.PopupEntity(Loc.GetString("offer-item-give-other",
|
||||
("user", Identity.Entity(component.Target.Value, EntityManager)),
|
||||
("item", Identity.Entity(offerItem.Item.Value, EntityManager)),
|
||||
("target", Identity.Entity(uid, EntityManager)))
|
||||
, component.Target.Value, Filter.PvsExcept(component.Target.Value, entityManager: EntityManager), true);
|
||||
}
|
||||
|
||||
offerItem.Item = null;
|
||||
UnReceive(uid, component, offerItem);
|
||||
}
|
||||
}
|
||||
@@ -68,7 +68,8 @@ namespace Content.Shared.Alert
|
||||
SuitPower,
|
||||
BorgHealth,
|
||||
BorgCrit,
|
||||
BorgDead
|
||||
BorgDead,
|
||||
Offer // WD EDITS
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -58,6 +58,7 @@ namespace Content.Shared.Input
|
||||
public static readonly BoundKeyFunction ZoomIn = "ZoomIn";
|
||||
public static readonly BoundKeyFunction ResetZoom = "ResetZoom";
|
||||
public static readonly BoundKeyFunction LieDown = "LieDown"; // WD EDIT
|
||||
public static readonly BoundKeyFunction OfferItem = "OfferItem"; // WD EDIT
|
||||
|
||||
public static readonly BoundKeyFunction ArcadeUp = "ArcadeUp";
|
||||
public static readonly BoundKeyFunction ArcadeDown = "ArcadeDown";
|
||||
|
||||
26
Content.Shared/_White/OfferItem/OfferItemComponent.cs
Normal file
26
Content.Shared/_White/OfferItem/OfferItemComponent.cs
Normal file
@@ -0,0 +1,26 @@
|
||||
using Robust.Shared.GameStates;
|
||||
|
||||
namespace Content.Shared._White.OfferItem;
|
||||
|
||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)]
|
||||
[Access(typeof(SharedOfferItemSystem))]
|
||||
public sealed partial class OfferItemComponent : Component
|
||||
{
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField]
|
||||
public bool IsInOfferMode;
|
||||
|
||||
[DataField, AutoNetworkedField]
|
||||
public bool IsInReceiveMode;
|
||||
|
||||
[DataField, AutoNetworkedField]
|
||||
public string? Hand;
|
||||
|
||||
[DataField, AutoNetworkedField]
|
||||
public EntityUid? Item;
|
||||
|
||||
[DataField, AutoNetworkedField]
|
||||
public EntityUid? Target;
|
||||
|
||||
[DataField]
|
||||
public float MaxOfferDistance = 2f;
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.ActionBlocker;
|
||||
using Content.Shared.Input;
|
||||
using Content.Shared.Hands.Components;
|
||||
using Robust.Shared.Input.Binding;
|
||||
using Robust.Shared.Player;
|
||||
|
||||
namespace Content.Shared._White.OfferItem;
|
||||
|
||||
public abstract partial class SharedOfferItemSystem
|
||||
{
|
||||
[Dependency] private readonly ActionBlockerSystem _actionBlocker = default!;
|
||||
[Dependency] private readonly SharedPopupSystem _popup = default!;
|
||||
|
||||
private void InitializeInteractions()
|
||||
{
|
||||
CommandBinds.Builder
|
||||
.Bind(ContentKeyFunctions.OfferItem, InputCmdHandler.FromDelegate(SetInOfferMode, handle: false, outsidePrediction: false))
|
||||
.Register<SharedOfferItemSystem>();
|
||||
}
|
||||
|
||||
public override void Shutdown()
|
||||
{
|
||||
base.Shutdown();
|
||||
|
||||
CommandBinds.Unregister<SharedOfferItemSystem>();
|
||||
}
|
||||
|
||||
private void SetInOfferMode(ICommonSession? session)
|
||||
{
|
||||
if (session is not { } playerSession)
|
||||
return;
|
||||
|
||||
if ((playerSession.AttachedEntity is not { Valid: true } uid || !Exists(uid)) ||
|
||||
!_actionBlocker.CanInteract(uid, null))
|
||||
return;
|
||||
|
||||
if (!TryComp<OfferItemComponent>(uid, out var offerItem))
|
||||
return;
|
||||
|
||||
if (!TryComp<HandsComponent>(uid, out var hands) || hands.ActiveHand == null)
|
||||
return;
|
||||
|
||||
offerItem.Item = hands.ActiveHand.HeldEntity;
|
||||
|
||||
if (offerItem.IsInOfferMode == false)
|
||||
{
|
||||
if (offerItem.Item == null)
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("offer-item-empty-hand"), uid, uid);
|
||||
return;
|
||||
}
|
||||
|
||||
if (offerItem.Hand == null || offerItem.Target == null)
|
||||
{
|
||||
offerItem.IsInOfferMode = true;
|
||||
offerItem.Hand = hands.ActiveHand.Name;
|
||||
|
||||
Dirty(uid, offerItem);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (offerItem.Target != null)
|
||||
{
|
||||
UnReceive(offerItem.Target.Value, offerItem: offerItem);
|
||||
offerItem.IsInOfferMode = false;
|
||||
Dirty(uid, offerItem);
|
||||
return;
|
||||
}
|
||||
|
||||
UnOffer(uid, offerItem);
|
||||
}
|
||||
}
|
||||
158
Content.Shared/_White/OfferItem/SharedOfferItemSystem.cs
Normal file
158
Content.Shared/_White/OfferItem/SharedOfferItemSystem.cs
Normal file
@@ -0,0 +1,158 @@
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.IdentityManagement;
|
||||
using Content.Shared.Hands.Components;
|
||||
|
||||
namespace Content.Shared._White.OfferItem;
|
||||
|
||||
public abstract partial class SharedOfferItemSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly SharedTransformSystem _transform = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
SubscribeLocalEvent<OfferItemComponent, InteractUsingEvent>(SetInReceiveMode);
|
||||
SubscribeLocalEvent<OfferItemComponent, MoveEvent>(OnMove);
|
||||
|
||||
InitializeInteractions();
|
||||
}
|
||||
|
||||
|
||||
private void SetInReceiveMode(EntityUid uid, OfferItemComponent component, InteractUsingEvent args)
|
||||
{
|
||||
if (!TryComp<OfferItemComponent>(args.User, out var offerItem))
|
||||
return;
|
||||
|
||||
if (args.User == uid || component.IsInReceiveMode || !offerItem.IsInOfferMode ||
|
||||
(offerItem.IsInReceiveMode && offerItem.Target != uid))
|
||||
return;
|
||||
|
||||
component.IsInReceiveMode = true;
|
||||
component.Target = args.User;
|
||||
|
||||
Dirty(uid, component);
|
||||
|
||||
offerItem.Target = uid;
|
||||
offerItem.IsInOfferMode = false;
|
||||
|
||||
Dirty(args.User, offerItem);
|
||||
|
||||
if (offerItem.Item == null)
|
||||
return;
|
||||
|
||||
_popup.PopupEntity(Loc.GetString("offer-item-try-give",
|
||||
("item", Identity.Entity(offerItem.Item.Value, EntityManager)),
|
||||
("target", Identity.Entity(uid, EntityManager))), component.Target.Value, component.Target.Value);
|
||||
_popup.PopupEntity(Loc.GetString("offer-item-try-give-target",
|
||||
("user", Identity.Entity(component.Target.Value, EntityManager)),
|
||||
("item", Identity.Entity(offerItem.Item.Value, EntityManager))), component.Target.Value, uid);
|
||||
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
private void OnMove(EntityUid uid, OfferItemComponent component, MoveEvent args)
|
||||
{
|
||||
if (component.Target == null ||
|
||||
args.NewPosition.InRange(EntityManager, _transform,
|
||||
Transform(component.Target.Value).Coordinates, component.MaxOfferDistance))
|
||||
return;
|
||||
|
||||
UnOffer(uid, component);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Resets the <see cref="OfferItemComponent"/> of the user and the target
|
||||
/// </summary>
|
||||
protected void UnOffer(EntityUid uid, OfferItemComponent component)
|
||||
{
|
||||
if (!TryComp<HandsComponent>(uid, out var hands) || hands.ActiveHand == null)
|
||||
return;
|
||||
|
||||
|
||||
if (TryComp<OfferItemComponent>(component.Target, out var offerItem) && component.Target != null)
|
||||
{
|
||||
|
||||
if (component.Item != null)
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("offer-item-no-give",
|
||||
("item", Identity.Entity(component.Item.Value, EntityManager)),
|
||||
("target", Identity.Entity(component.Target.Value, EntityManager))), uid, uid);
|
||||
_popup.PopupEntity(Loc.GetString("offer-item-no-give-target",
|
||||
("user", Identity.Entity(uid, EntityManager)),
|
||||
("item", Identity.Entity(component.Item.Value, EntityManager))), uid, component.Target.Value);
|
||||
}
|
||||
|
||||
else if (offerItem.Item != null)
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("offer-item-no-give",
|
||||
("item", Identity.Entity(offerItem.Item.Value, EntityManager)),
|
||||
("target", Identity.Entity(uid, EntityManager))), component.Target.Value, component.Target.Value);
|
||||
_popup.PopupEntity(Loc.GetString("offer-item-no-give-target",
|
||||
("user", Identity.Entity(component.Target.Value, EntityManager)),
|
||||
("item", Identity.Entity(offerItem.Item.Value, EntityManager))), component.Target.Value, uid);
|
||||
}
|
||||
|
||||
offerItem.IsInOfferMode = false;
|
||||
offerItem.IsInReceiveMode = false;
|
||||
offerItem.Hand = null;
|
||||
offerItem.Target = null;
|
||||
offerItem.Item = null;
|
||||
|
||||
Dirty(component.Target.Value, offerItem);
|
||||
}
|
||||
|
||||
component.IsInOfferMode = false;
|
||||
component.IsInReceiveMode = false;
|
||||
component.Hand = null;
|
||||
component.Target = null;
|
||||
component.Item = null;
|
||||
|
||||
Dirty(uid, component);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Cancels the transfer of the item
|
||||
/// </summary>
|
||||
protected void UnReceive(EntityUid uid, OfferItemComponent? component = null, OfferItemComponent? offerItem = null)
|
||||
{
|
||||
if (component == null && !TryComp(uid, out component))
|
||||
return;
|
||||
|
||||
if (offerItem == null && !TryComp(component.Target, out offerItem))
|
||||
return;
|
||||
|
||||
if (!TryComp<HandsComponent>(uid, out var hands) || hands.ActiveHand == null ||
|
||||
component.Target == null)
|
||||
return;
|
||||
|
||||
if (offerItem.Item != null)
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("offer-item-no-give",
|
||||
("item", Identity.Entity(offerItem.Item.Value, EntityManager)),
|
||||
("target", Identity.Entity(uid, EntityManager))), component.Target.Value, component.Target.Value);
|
||||
_popup.PopupEntity(Loc.GetString("offer-item-no-give-target",
|
||||
("user", Identity.Entity(component.Target.Value, EntityManager)),
|
||||
("item", Identity.Entity(offerItem.Item.Value, EntityManager))), component.Target.Value, uid);
|
||||
}
|
||||
|
||||
if (!offerItem.IsInReceiveMode)
|
||||
{
|
||||
offerItem.Target = null;
|
||||
component.Target = null;
|
||||
}
|
||||
|
||||
offerItem.Item = null;
|
||||
offerItem.Hand = null;
|
||||
component.IsInReceiveMode = false;
|
||||
|
||||
Dirty(uid, component);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns true if <see cref="OfferItemComponent.IsInOfferMode"/> = true
|
||||
/// </summary>
|
||||
protected bool IsInOfferMode(EntityUid? entity, OfferItemComponent? component = null)
|
||||
{
|
||||
return entity != null && Resolve(entity.Value, ref component, false) && component.IsInOfferMode;
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,13 @@ public sealed class WhiteCVars
|
||||
public static readonly CVarDef<bool> ShowTrails =
|
||||
CVarDef.Create("white.show_trails", true, CVar.CLIENTONLY | CVar.ARCHIVE);
|
||||
|
||||
/*
|
||||
* Offer Indicator
|
||||
*/
|
||||
|
||||
public static readonly CVarDef<bool> OfferModeIndicatorsPointShow =
|
||||
CVarDef.Create("white.offer_mode_indicators_point_show", true, CVar.ARCHIVE | CVar.CLIENTONLY);
|
||||
|
||||
/*
|
||||
* Wiki rules
|
||||
*/
|
||||
|
||||
@@ -113,3 +113,6 @@ alerts-revenant-corporeal-desc = You have manifested physically. People around y
|
||||
|
||||
alerts-changeling-chemicals-name = Chemicals
|
||||
alerts-changeling-chemicals-desc = Our chemicals.
|
||||
|
||||
alerts-offer-name = Offer
|
||||
alerts-offer-desc = Someone offers you an item.
|
||||
|
||||
@@ -41,6 +41,7 @@ ui-options-volume-percent = { TOSTRING($volume, "P0") }
|
||||
|
||||
ui-options-show-held-item = Show held item next to cursor
|
||||
ui-options-show-combat-mode-indicators = Show combat mode indicators with cursor
|
||||
ui-options-show-offer-mode-indicators = Show offer mode indicators with cursor
|
||||
ui-options-opaque-storage-window = Opaque storage window
|
||||
ui-options-show-ooc-patron-color = Show OOC Patreon color
|
||||
ui-options-show-looc-on-head = Show LOOC chat above characters head
|
||||
@@ -136,6 +137,7 @@ ui-options-function-examine-entity = Examine
|
||||
ui-options-function-swap-hands = Swap hands
|
||||
ui-options-function-move-stored-item = Move stored item
|
||||
ui-options-function-rotate-stored-item = Rotate stored item
|
||||
ui-options-function-offer-item = Offer something
|
||||
ui-options-function-lie-down = Lie down/Get up
|
||||
ui-options-function-auto-get-up = Automatically get up when falling
|
||||
ui-options-function-save-item-location = Save item location
|
||||
|
||||
9
Resources/Locale/en-US/interaction/offer-item-system.ftl
Normal file
9
Resources/Locale/en-US/interaction/offer-item-system.ftl
Normal file
@@ -0,0 +1,9 @@
|
||||
offer-item-empty-hand = You don't have anything in your hand to give!
|
||||
offer-item-try-give = You offer {THE($item)} to {$target}
|
||||
offer-item-try-give-target = {$user} offers you {THE($item)}
|
||||
offer-item-try-give-target = {$user} offers you a {THE($item)}
|
||||
offer-item-give = You handed {THE($item)} to {$target}
|
||||
offer-item-give-other = {$user} handed {THE($item)} to {$target}
|
||||
offer-item-give-target = {$user} handed you {THE($item)}
|
||||
offer-item-no-give = You stop offering {THE($item)} to {$target}
|
||||
offer-item-no-give-target = {$user} is no longer offering {THE($item)} to you
|
||||
@@ -113,3 +113,6 @@ alerts-changeling-chemicals-desc = Наши химикаты.
|
||||
|
||||
alerts-cult-buff-name = Усиление
|
||||
alerts-cult-buff-desc = Подготовка заклинаний крови занимает гораздо меньше времени, и вы не теряете столько крови при этом. Также вы неуязвимы к низкому давлению.
|
||||
|
||||
alerts-offer-name = Предложение
|
||||
alerts-offer-desc = Кто-то предлагает вам предмет.
|
||||
|
||||
@@ -41,6 +41,7 @@ ui-options-volume-percent = { TOSTRING($volume, "P0") }
|
||||
|
||||
ui-options-show-held-item = Показать удерживаемый элемент рядом с курсором?
|
||||
ui-options-show-combat-mode-indicators = Показать индикатор боевого режима рядом с курсором
|
||||
ui-options-show-offer-mode-indicators = Показывать индикаторы передачи предмета рядом с курсором
|
||||
ui-options-opaque-storage-window = Непрозрачность окна хранилища
|
||||
ui-options-show-looc-on-head = Показывать LOOC-чат над головами персонажей
|
||||
ui-options-fancy-speech = Показывать имена в облачках с текстом
|
||||
@@ -142,6 +143,7 @@ ui-options-function-lie-down = Лечь/встать
|
||||
ui-options-function-auto-get-up = Автоматически вставать при падении
|
||||
ui-options-function-save-item-location = Сохранить позицию предмета
|
||||
ui-options-static-storage-ui = Закрепить интерфейс хранилища на хотбаре
|
||||
ui-options-function-offer-item = Передать что-то
|
||||
|
||||
ui-options-function-smart-equip-backpack = Умная экипировка в рюкзак
|
||||
ui-options-function-smart-equip-belt = Умная экипировка на пояс
|
||||
|
||||
9
Resources/Locale/ru-RU/interaction/offer-item-system.ftl
Normal file
9
Resources/Locale/ru-RU/interaction/offer-item-system.ftl
Normal file
@@ -0,0 +1,9 @@
|
||||
offer-item-empty-hand = У тебя в руках нет ничего, что ты мог бы отдать!
|
||||
offer-item-full-hand = Ваша рука занята
|
||||
offer-item-try-give = Вы предлагаете {$item} {$target}
|
||||
offer-item-try-give-target = {$user} предлагает вам {$item}
|
||||
offer-item-give = Вы передали {THE($item)} {$target}
|
||||
offer-item-give-other = {$user} передал {$item} {$target}
|
||||
offer-item-give-target = {$user} передал вам ($item)
|
||||
offer-item-no-give = Вы прекращаете предлагать {$item} {$target}
|
||||
offer-item-no-give-target = {$user} прекращает предлагать вам ($item)
|
||||
@@ -27,6 +27,7 @@
|
||||
- category: Thirst
|
||||
- alertType: Magboots
|
||||
- alertType: Pacified
|
||||
- alertType: Offer
|
||||
|
||||
- type: entity
|
||||
id: AlertSpriteView
|
||||
@@ -490,3 +491,13 @@
|
||||
icons: [ /Textures/Interface/Alerts/bleeding.png ]
|
||||
name: alerts-bleeding-name
|
||||
description: alerts-bleeding-desc
|
||||
|
||||
# WD-EDIT
|
||||
- type: alert
|
||||
id: Offer
|
||||
onClick: !type:AcceptOffer { }
|
||||
icons:
|
||||
- sprite: /Textures/White/Interface/Alerts/offer_item.rsi
|
||||
state: offer_item
|
||||
name: alerts-offer-name
|
||||
description: alerts-offer-desc
|
||||
|
||||
@@ -260,6 +260,7 @@
|
||||
- type: CharacterInformation
|
||||
- type: Penetrated
|
||||
- type: Mood
|
||||
- type: OfferItem # WD-EDIT
|
||||
|
||||
- type: entity
|
||||
save: false
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "https://github.com/ss220-space/Paradise/blob/master220/icons/mob/screen_alert.dmi",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "offer_item"
|
||||
}
|
||||
]
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 556 B |
BIN
Resources/Textures/White/Interface/give_item.rsi/give_item.png
Normal file
BIN
Resources/Textures/White/Interface/give_item.rsi/give_item.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.1 KiB |
14
Resources/Textures/White/Interface/give_item.rsi/meta.json
Normal file
14
Resources/Textures/White/Interface/give_item.rsi/meta.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "https://github.com/ss220-space/Paradise/blob/master220/icons/misc/mouse_icons/give_item.dmi",
|
||||
"size": {
|
||||
"x": 64,
|
||||
"y": 64
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "give_item"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -258,6 +258,9 @@ binds:
|
||||
type: State
|
||||
key: V
|
||||
mod1: Shift
|
||||
- function: OfferItem
|
||||
type: State
|
||||
key: F
|
||||
- function: ShowDebugConsole
|
||||
type: State
|
||||
key: Tilde
|
||||
|
||||
Reference in New Issue
Block a user