Merge pull request #824 from space-wizards/prediction
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
using Content.Client.UserInterface;
|
using System;
|
||||||
|
using Content.Client.UserInterface;
|
||||||
using Content.Shared.GameObjects.Components.Mobs;
|
using Content.Shared.GameObjects.Components.Mobs;
|
||||||
using Robust.Client.GameObjects;
|
using Robust.Client.GameObjects;
|
||||||
using Robust.Client.Player;
|
using Robust.Client.Player;
|
||||||
@@ -6,38 +7,34 @@ using Robust.Shared.GameObjects;
|
|||||||
using Robust.Shared.Interfaces.GameObjects;
|
using Robust.Shared.Interfaces.GameObjects;
|
||||||
using Robust.Shared.Interfaces.Network;
|
using Robust.Shared.Interfaces.Network;
|
||||||
using Robust.Shared.IoC;
|
using Robust.Shared.IoC;
|
||||||
using Robust.Shared.ViewVariables;
|
|
||||||
|
|
||||||
namespace Content.Client.GameObjects.Components.Mobs
|
namespace Content.Client.GameObjects.Components.Mobs
|
||||||
{
|
{
|
||||||
[RegisterComponent]
|
[RegisterComponent]
|
||||||
|
[ComponentReference(typeof(SharedCombatModeComponent))]
|
||||||
public sealed class CombatModeComponent : SharedCombatModeComponent
|
public sealed class CombatModeComponent : SharedCombatModeComponent
|
||||||
{
|
{
|
||||||
#pragma warning disable 649
|
#pragma warning disable 649
|
||||||
[Dependency] private readonly IPlayerManager _playerManager;
|
[Dependency] private readonly IPlayerManager _playerManager;
|
||||||
#pragma warning restore 649
|
|
||||||
|
|
||||||
[ViewVariables(VVAccess.ReadWrite)]
|
|
||||||
public bool IsInCombatMode { get; private set; }
|
|
||||||
|
|
||||||
[ViewVariables(VVAccess.ReadWrite)]
|
|
||||||
public TargetingZone ActiveZone { get; private set; }
|
|
||||||
|
|
||||||
#pragma warning disable 649
|
|
||||||
[Dependency] private readonly IGameHud _gameHud;
|
[Dependency] private readonly IGameHud _gameHud;
|
||||||
#pragma warning restore 649
|
#pragma warning restore 649
|
||||||
|
|
||||||
public override void HandleComponentState(ComponentState curState, ComponentState nextState)
|
public override bool IsInCombatMode
|
||||||
{
|
{
|
||||||
base.HandleComponentState(curState, nextState);
|
get => base.IsInCombatMode;
|
||||||
|
set
|
||||||
if (!(curState is CombatModeComponentState state))
|
|
||||||
return;
|
|
||||||
|
|
||||||
IsInCombatMode = state.IsInCombatMode;
|
|
||||||
ActiveZone = state.TargetingZone;
|
|
||||||
if (Owner == _playerManager.LocalPlayer.ControlledEntity)
|
|
||||||
{
|
{
|
||||||
|
base.IsInCombatMode = value;
|
||||||
|
UpdateHud();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override TargetingZone ActiveZone
|
||||||
|
{
|
||||||
|
get => base.ActiveZone;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
base.ActiveZone = value;
|
||||||
UpdateHud();
|
UpdateHud();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -61,6 +58,11 @@ namespace Content.Client.GameObjects.Components.Mobs
|
|||||||
|
|
||||||
private void UpdateHud()
|
private void UpdateHud()
|
||||||
{
|
{
|
||||||
|
if (Owner != _playerManager.LocalPlayer.ControlledEntity)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
_gameHud.CombatModeActive = IsInCombatMode;
|
_gameHud.CombatModeActive = IsInCombatMode;
|
||||||
_gameHud.TargetingZone = ActiveZone;
|
_gameHud.TargetingZone = ActiveZone;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,15 +3,18 @@ using Content.Client.UserInterface;
|
|||||||
using Content.Client.Utility;
|
using Content.Client.Utility;
|
||||||
using Content.Shared.GameObjects.Components.Mobs;
|
using Content.Shared.GameObjects.Components.Mobs;
|
||||||
using Content.Shared.GameObjects.EntitySystemMessages;
|
using Content.Shared.GameObjects.EntitySystemMessages;
|
||||||
|
using Content.Shared.GameObjects.EntitySystems;
|
||||||
using Content.Shared.Input;
|
using Content.Shared.Input;
|
||||||
|
using JetBrains.Annotations;
|
||||||
|
using Robust.Client.GameObjects;
|
||||||
using Robust.Client.GameObjects.EntitySystems;
|
using Robust.Client.GameObjects.EntitySystems;
|
||||||
using Robust.Client.Graphics.Drawing;
|
using Robust.Client.Graphics.Drawing;
|
||||||
using Robust.Client.Graphics.Overlays;
|
using Robust.Client.Graphics.Overlays;
|
||||||
using Robust.Client.Interfaces.Graphics.Overlays;
|
using Robust.Client.Interfaces.Graphics.Overlays;
|
||||||
using Robust.Client.Interfaces.Input;
|
using Robust.Client.Interfaces.Input;
|
||||||
using Robust.Client.Player;
|
using Robust.Client.Player;
|
||||||
using Robust.Shared.GameObjects.Systems;
|
|
||||||
using Robust.Shared.Input;
|
using Robust.Shared.Input;
|
||||||
|
using Robust.Shared.Interfaces.Timing;
|
||||||
using Robust.Shared.IoC;
|
using Robust.Shared.IoC;
|
||||||
using Robust.Shared.Maths;
|
using Robust.Shared.Maths;
|
||||||
using Robust.Shared.Players;
|
using Robust.Shared.Players;
|
||||||
@@ -19,7 +22,8 @@ using static Content.Client.StaticIoC;
|
|||||||
|
|
||||||
namespace Content.Client.GameObjects.EntitySystems
|
namespace Content.Client.GameObjects.EntitySystems
|
||||||
{
|
{
|
||||||
public sealed class CombatModeSystem : EntitySystem
|
[UsedImplicitly]
|
||||||
|
public sealed class CombatModeSystem : SharedCombatModeSystem
|
||||||
{
|
{
|
||||||
private const float AttackTimeThreshold = 0.15f;
|
private const float AttackTimeThreshold = 0.15f;
|
||||||
|
|
||||||
@@ -28,6 +32,7 @@ namespace Content.Client.GameObjects.EntitySystems
|
|||||||
[Dependency] private readonly IPlayerManager _playerManager;
|
[Dependency] private readonly IPlayerManager _playerManager;
|
||||||
[Dependency] private readonly IInputManager _inputManager;
|
[Dependency] private readonly IInputManager _inputManager;
|
||||||
[Dependency] private readonly IOverlayManager _overlayManager;
|
[Dependency] private readonly IOverlayManager _overlayManager;
|
||||||
|
[Dependency] private readonly IGameTiming _gameTiming;
|
||||||
#pragma warning restore 649
|
#pragma warning restore 649
|
||||||
|
|
||||||
private InputSystem _inputSystem;
|
private InputSystem _inputSystem;
|
||||||
@@ -44,10 +49,23 @@ namespace Content.Client.GameObjects.EntitySystems
|
|||||||
|
|
||||||
_inputSystem = EntitySystemManager.GetEntitySystem<InputSystem>();
|
_inputSystem = EntitySystemManager.GetEntitySystem<InputSystem>();
|
||||||
_inputSystem.BindMap.BindFunction(ContentKeyFunctions.UseOrAttack, new InputHandler(this));
|
_inputSystem.BindMap.BindFunction(ContentKeyFunctions.UseOrAttack, new InputHandler(this));
|
||||||
|
_inputSystem.BindMap.BindFunction(ContentKeyFunctions.ToggleCombatMode,
|
||||||
|
InputCmdHandler.FromDelegate(CombatModeToggled));
|
||||||
_overlayManager.AddOverlay(new CombatModeOverlay(this));
|
_overlayManager.AddOverlay(new CombatModeOverlay(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void CombatModeToggled(ICommonSession session)
|
||||||
|
{
|
||||||
|
if (_gameTiming.IsFirstTimePredicted)
|
||||||
|
{
|
||||||
|
EntityManager.RaisePredictiveEvent(
|
||||||
|
new CombatModeSystemMessages.SetCombatModeActiveMessage(!IsInCombatMode()));
|
||||||
|
|
||||||
|
// Just in case.
|
||||||
|
UseOrAttackIsDown = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override void Shutdown()
|
public override void Shutdown()
|
||||||
{
|
{
|
||||||
base.Shutdown();
|
base.Shutdown();
|
||||||
@@ -68,12 +86,12 @@ namespace Content.Client.GameObjects.EntitySystems
|
|||||||
|
|
||||||
private void OnTargetingZoneChanged(TargetingZone obj)
|
private void OnTargetingZoneChanged(TargetingZone obj)
|
||||||
{
|
{
|
||||||
RaiseNetworkEvent(new CombatModeSystemMessages.SetTargetZoneMessage(obj));
|
EntityManager.RaisePredictiveEvent(new CombatModeSystemMessages.SetTargetZoneMessage(obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnCombatModeChanged(bool obj)
|
private void OnCombatModeChanged(bool obj)
|
||||||
{
|
{
|
||||||
RaiseNetworkEvent(new CombatModeSystemMessages.SetCombatModeActiveMessage(obj));
|
EntityManager.RaisePredictiveEvent(new CombatModeSystemMessages.SetCombatModeActiveMessage(obj));
|
||||||
|
|
||||||
// Just in case.
|
// Just in case.
|
||||||
UseOrAttackIsDown = false;
|
UseOrAttackIsDown = false;
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
using Content.Shared.GameObjects.Components.Mobs;
|
using Content.Shared.GameObjects.Components.Mobs;
|
||||||
using Robust.Shared.GameObjects;
|
using Robust.Shared.GameObjects;
|
||||||
using Robust.Shared.ViewVariables;
|
|
||||||
|
|
||||||
namespace Content.Server.GameObjects.Components.Mobs
|
namespace Content.Server.GameObjects.Components.Mobs
|
||||||
{
|
{
|
||||||
@@ -10,36 +9,8 @@ namespace Content.Server.GameObjects.Components.Mobs
|
|||||||
/// using *everything* as a weapon.
|
/// using *everything* as a weapon.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[RegisterComponent]
|
[RegisterComponent]
|
||||||
|
[ComponentReference(typeof(SharedCombatModeComponent))]
|
||||||
public sealed class CombatModeComponent : SharedCombatModeComponent
|
public sealed class CombatModeComponent : SharedCombatModeComponent
|
||||||
{
|
{
|
||||||
private bool _isInCombatMode;
|
|
||||||
private TargetingZone _activeZone;
|
|
||||||
|
|
||||||
[ViewVariables(VVAccess.ReadWrite)]
|
|
||||||
public bool IsInCombatMode
|
|
||||||
{
|
|
||||||
get => _isInCombatMode;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
_isInCombatMode = value;
|
|
||||||
Dirty();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[ViewVariables(VVAccess.ReadWrite)]
|
|
||||||
public TargetingZone ActiveZone
|
|
||||||
{
|
|
||||||
get => _activeZone;
|
|
||||||
set
|
|
||||||
{
|
|
||||||
_activeZone = value;
|
|
||||||
Dirty();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override ComponentState GetComponentState()
|
|
||||||
{
|
|
||||||
return new CombatModeComponentState(IsInCombatMode, ActiveZone);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using Content.Shared.GameObjects.EntitySystemMessages;
|
using Content.Shared.GameObjects.EntitySystemMessages;
|
||||||
using Content.Shared.GameObjects.EntitySystems;
|
using Content.Shared.GameObjects.EntitySystems;
|
||||||
using Robust.Server.Interfaces.Player;
|
using Robust.Server.Interfaces.Player;
|
||||||
|
using Robust.Shared.GameObjects;
|
||||||
using Robust.Shared.Interfaces.GameObjects;
|
using Robust.Shared.Interfaces.GameObjects;
|
||||||
using Robust.Shared.IoC;
|
using Robust.Shared.IoC;
|
||||||
using Robust.Shared.Maths;
|
using Robust.Shared.Maths;
|
||||||
@@ -20,7 +21,6 @@ namespace Content.Server.GameObjects.EntitySystems
|
|||||||
{
|
{
|
||||||
#pragma warning disable 649
|
#pragma warning disable 649
|
||||||
[Dependency] private IEntityManager _entityManager;
|
[Dependency] private IEntityManager _entityManager;
|
||||||
[Dependency] private IPlayerManager _playerManager;
|
|
||||||
#pragma warning restore 649
|
#pragma warning restore 649
|
||||||
|
|
||||||
private static readonly FormattedMessage _entityNotFoundMessage;
|
private static readonly FormattedMessage _entityNotFoundMessage;
|
||||||
@@ -75,14 +75,12 @@ namespace Content.Server.GameObjects.EntitySystems
|
|||||||
return message;
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ExamineInfoRequest(ExamineSystemMessages.RequestExamineInfoMessage request)
|
private void ExamineInfoRequest(ExamineSystemMessages.RequestExamineInfoMessage request, EntitySessionEventArgs eventArgs)
|
||||||
{
|
{
|
||||||
var channel = request.NetChannel;
|
var player = (IPlayerSession) eventArgs.SenderSession;
|
||||||
if(channel == null)
|
var session = eventArgs.SenderSession;
|
||||||
return;
|
|
||||||
|
|
||||||
var session = _playerManager.GetSessionByChannel(channel);
|
|
||||||
var playerEnt = session.AttachedEntity;
|
var playerEnt = session.AttachedEntity;
|
||||||
|
var channel = player.ConnectedClient;
|
||||||
|
|
||||||
if (playerEnt == null
|
if (playerEnt == null
|
||||||
|| !_entityManager.TryGetEntity(request.EntityUid, out var entity)
|
|| !_entityManager.TryGetEntity(request.EntityUid, out var entity)
|
||||||
|
|||||||
@@ -1,80 +1,20 @@
|
|||||||
using Content.Server.GameObjects.Components.Mobs;
|
using Content.Server.GameObjects.Components.Mobs;
|
||||||
|
using Content.Shared.GameObjects.EntitySystems;
|
||||||
using Content.Shared.Input;
|
using Content.Shared.Input;
|
||||||
using JetBrains.Annotations;
|
using JetBrains.Annotations;
|
||||||
using Robust.Server.GameObjects.EntitySystems;
|
using Robust.Server.GameObjects.EntitySystems;
|
||||||
using Robust.Server.Interfaces.Player;
|
using Robust.Server.Interfaces.Player;
|
||||||
using Robust.Shared.GameObjects;
|
|
||||||
using Robust.Shared.GameObjects.Systems;
|
|
||||||
using Robust.Shared.Input;
|
using Robust.Shared.Input;
|
||||||
|
using Robust.Shared.Interfaces.Random;
|
||||||
using Robust.Shared.IoC;
|
using Robust.Shared.IoC;
|
||||||
|
using Robust.Shared.Log;
|
||||||
using Robust.Shared.Players;
|
using Robust.Shared.Players;
|
||||||
using static Content.Shared.GameObjects.EntitySystemMessages.CombatModeSystemMessages;
|
using Robust.Shared.Random;
|
||||||
|
|
||||||
namespace Content.Server.GameObjects.EntitySystems
|
namespace Content.Server.GameObjects.EntitySystems
|
||||||
{
|
{
|
||||||
[UsedImplicitly]
|
[UsedImplicitly]
|
||||||
public sealed class CombatModeSystem : EntitySystem
|
public sealed class CombatModeSystem : SharedCombatModeSystem
|
||||||
{
|
{
|
||||||
#pragma warning disable 649
|
|
||||||
[Dependency] private readonly IPlayerManager _playerManager;
|
|
||||||
#pragma warning restore 649
|
|
||||||
|
|
||||||
public override void Initialize()
|
|
||||||
{
|
|
||||||
base.Initialize();
|
|
||||||
|
|
||||||
SubscribeNetworkEvent<SetTargetZoneMessage>(SetTargetZoneHandler);
|
|
||||||
SubscribeNetworkEvent<SetCombatModeActiveMessage>(SetCombatModeActiveHandler);
|
|
||||||
|
|
||||||
var inputSystem = EntitySystemManager.GetEntitySystem<InputSystem>();
|
|
||||||
inputSystem.BindMap.BindFunction(ContentKeyFunctions.ToggleCombatMode,
|
|
||||||
InputCmdHandler.FromDelegate(CombatModeToggled));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SetCombatModeActiveHandler(SetCombatModeActiveMessage ev)
|
|
||||||
{
|
|
||||||
if (!TryGetCombatComponent(ev, out var combatModeComponent))
|
|
||||||
return;
|
|
||||||
|
|
||||||
combatModeComponent.IsInCombatMode = ev.Active;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SetTargetZoneHandler(SetTargetZoneMessage ev)
|
|
||||||
{
|
|
||||||
if (!TryGetCombatComponent(ev, out var combatModeComponent))
|
|
||||||
return;
|
|
||||||
|
|
||||||
combatModeComponent.ActiveZone = ev.TargetZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool TryGetCombatComponent(EntitySystemMessage ev, out CombatModeComponent combatModeComponent)
|
|
||||||
{
|
|
||||||
if (ev.NetChannel == null)
|
|
||||||
{
|
|
||||||
combatModeComponent = default;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
var player = _playerManager.GetSessionByChannel(ev.NetChannel);
|
|
||||||
if (player.AttachedEntity != null && player.AttachedEntity.TryGetComponent(out combatModeComponent))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
combatModeComponent = default;
|
|
||||||
return false;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void CombatModeToggled(ICommonSession session)
|
|
||||||
{
|
|
||||||
var playerSession = (IPlayerSession) session;
|
|
||||||
|
|
||||||
if (playerSession.AttachedEntity == null ||
|
|
||||||
!playerSession.AttachedEntity.TryGetComponent(out CombatModeComponent combatModeComponent))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
combatModeComponent.IsInCombatMode = !combatModeComponent.IsInCombatMode;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using Content.Shared.GameObjects;
|
using Content.Shared.GameObjects;
|
||||||
using Robust.Server.Interfaces.Player;
|
using Robust.Server.Interfaces.Player;
|
||||||
|
using Robust.Shared.GameObjects;
|
||||||
using Robust.Shared.GameObjects.Systems;
|
using Robust.Shared.GameObjects.Systems;
|
||||||
using Robust.Shared.Interfaces.GameObjects;
|
using Robust.Shared.Interfaces.GameObjects;
|
||||||
using Robust.Shared.IoC;
|
using Robust.Shared.IoC;
|
||||||
@@ -13,7 +14,6 @@ namespace Content.Server.GameObjects.EntitySystems
|
|||||||
{
|
{
|
||||||
#pragma warning disable 649
|
#pragma warning disable 649
|
||||||
[Dependency] private readonly IEntityManager _entityManager;
|
[Dependency] private readonly IEntityManager _entityManager;
|
||||||
[Dependency] private readonly IPlayerManager _playerManager;
|
|
||||||
#pragma warning restore 649
|
#pragma warning restore 649
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
@@ -26,18 +26,14 @@ namespace Content.Server.GameObjects.EntitySystems
|
|||||||
IoCManager.InjectDependencies(this);
|
IoCManager.InjectDependencies(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UseVerb(UseVerbMessage use)
|
private void UseVerb(UseVerbMessage use, EntitySessionEventArgs eventArgs)
|
||||||
{
|
{
|
||||||
var channel = use.NetChannel;
|
|
||||||
if(channel == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!_entityManager.TryGetEntity(use.EntityUid, out var entity))
|
if (!_entityManager.TryGetEntity(use.EntityUid, out var entity))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var session = _playerManager.GetSessionByChannel(channel);
|
var session = eventArgs.SenderSession;
|
||||||
var userEntity = session.AttachedEntity;
|
var userEntity = session.AttachedEntity;
|
||||||
|
|
||||||
foreach (var (component, verb) in VerbUtility.GetVerbs(entity))
|
foreach (var (component, verb) in VerbUtility.GetVerbs(entity))
|
||||||
@@ -83,19 +79,16 @@ namespace Content.Server.GameObjects.EntitySystems
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RequestVerbs(RequestVerbsMessage req)
|
private void RequestVerbs(RequestVerbsMessage req, EntitySessionEventArgs eventArgs)
|
||||||
{
|
{
|
||||||
var channel = req.NetChannel;
|
var player = (IPlayerSession) eventArgs.SenderSession;
|
||||||
if (channel == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!_entityManager.TryGetEntity(req.EntityUid, out var entity))
|
if (!_entityManager.TryGetEntity(req.EntityUid, out var entity))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var session = _playerManager.GetSessionByChannel(channel);
|
var userEntity = player.AttachedEntity;
|
||||||
var userEntity = session.AttachedEntity;
|
|
||||||
|
|
||||||
var data = new List<VerbsResponseMessage.VerbData>();
|
var data = new List<VerbsResponseMessage.VerbData>();
|
||||||
//Get verbs, component dependent.
|
//Get verbs, component dependent.
|
||||||
@@ -125,7 +118,7 @@ namespace Content.Server.GameObjects.EntitySystems
|
|||||||
}
|
}
|
||||||
|
|
||||||
var response = new VerbsResponseMessage(data, req.EntityUid);
|
var response = new VerbsResponseMessage(data, req.EntityUid);
|
||||||
RaiseNetworkEvent(response, channel);
|
RaiseNetworkEvent(response, player.ConnectedClient);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
using System;
|
using System;
|
||||||
using Robust.Shared.GameObjects;
|
using Robust.Shared.GameObjects;
|
||||||
|
using Robust.Shared.Interfaces.Timing;
|
||||||
|
using Robust.Shared.IoC;
|
||||||
using Robust.Shared.Serialization;
|
using Robust.Shared.Serialization;
|
||||||
|
using Robust.Shared.ViewVariables;
|
||||||
|
|
||||||
namespace Content.Shared.GameObjects.Components.Mobs
|
namespace Content.Shared.GameObjects.Components.Mobs
|
||||||
{
|
{
|
||||||
@@ -9,6 +12,50 @@ namespace Content.Shared.GameObjects.Components.Mobs
|
|||||||
public sealed override uint? NetID => ContentNetIDs.COMBATMODE;
|
public sealed override uint? NetID => ContentNetIDs.COMBATMODE;
|
||||||
public override string Name => "CombatMode";
|
public override string Name => "CombatMode";
|
||||||
|
|
||||||
|
private bool _isInCombatMode;
|
||||||
|
private TargetingZone _activeZone;
|
||||||
|
|
||||||
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
|
public virtual bool IsInCombatMode
|
||||||
|
{
|
||||||
|
get => _isInCombatMode;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
var gt = IoCManager.Resolve<IGameTiming>();
|
||||||
|
|
||||||
|
_isInCombatMode = value;
|
||||||
|
Dirty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
|
public virtual TargetingZone ActiveZone
|
||||||
|
{
|
||||||
|
get => _activeZone;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_activeZone = value;
|
||||||
|
Dirty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void HandleComponentState(ComponentState curState, ComponentState nextState)
|
||||||
|
{
|
||||||
|
base.HandleComponentState(curState, nextState);
|
||||||
|
|
||||||
|
if (!(curState is CombatModeComponentState state))
|
||||||
|
return;
|
||||||
|
|
||||||
|
IsInCombatMode = state.IsInCombatMode;
|
||||||
|
ActiveZone = state.TargetingZone;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public override ComponentState GetComponentState()
|
||||||
|
{
|
||||||
|
return new CombatModeComponentState(IsInCombatMode, ActiveZone);
|
||||||
|
}
|
||||||
|
|
||||||
[Serializable, NetSerializable]
|
[Serializable, NetSerializable]
|
||||||
protected sealed class CombatModeComponentState : ComponentState
|
protected sealed class CombatModeComponentState : ComponentState
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
using Content.Shared.GameObjects.Components.Mobs;
|
||||||
|
using Content.Shared.GameObjects.EntitySystemMessages;
|
||||||
|
using Content.Shared.Interfaces;
|
||||||
|
using Robust.Shared.GameObjects;
|
||||||
|
using Robust.Shared.GameObjects.Systems;
|
||||||
|
using Robust.Shared.Interfaces.Random;
|
||||||
|
using Robust.Shared.IoC;
|
||||||
|
using Robust.Shared.Random;
|
||||||
|
using Logger = Robust.Shared.Log.Logger;
|
||||||
|
|
||||||
|
namespace Content.Shared.GameObjects.EntitySystems
|
||||||
|
{
|
||||||
|
public abstract class SharedCombatModeSystem : EntitySystem
|
||||||
|
{
|
||||||
|
public override void Initialize()
|
||||||
|
{
|
||||||
|
base.Initialize();
|
||||||
|
|
||||||
|
SubscribeNetworkEvent<CombatModeSystemMessages.SetCombatModeActiveMessage>(CombatModeActiveHandler);
|
||||||
|
SubscribeLocalEvent<CombatModeSystemMessages.SetCombatModeActiveMessage>(CombatModeActiveHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CombatModeActiveHandler(CombatModeSystemMessages.SetCombatModeActiveMessage ev, EntitySessionEventArgs eventArgs)
|
||||||
|
{
|
||||||
|
var entity = eventArgs.SenderSession.AttachedEntity;
|
||||||
|
|
||||||
|
if (!entity.TryGetComponent(out SharedCombatModeComponent combatModeComponent))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
combatModeComponent.IsInCombatMode = ev.Active;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Submodule RobustToolbox updated: 12fb54904a...0c8f869cb4
Reference in New Issue
Block a user