Client LuaCsForBarotrauma
BarotraumaShared/SharedSource/Items/Components/RemoteController.cs
1 using Microsoft.Xna.Framework;
2 
4 {
6  {
7  [Serialize("", IsPropertySaveable.No, description: "Tag or identifier of the item that should be controlled.")]
8  public Identifier Target
9  {
10  get;
11  private set;
12  }
13 
14  [Serialize(false, IsPropertySaveable.No)]
15  public bool OnlyInOwnSub
16  {
17  get;
18  private set;
19  }
20 
21  [Serialize(10000.0f, IsPropertySaveable.No)]
22  public float Range
23  {
24  get;
25  private set;
26  }
27 
28  public Item TargetItem { get => currentTarget; }
29 
30  private Item currentTarget;
31  private Character currentUser;
32  private Submarine currentSub;
33 
35  : base(item, element)
36  {
37  }
38 
39  public override bool Select(Character character)
40  {
41  if (base.Select(character))
42  {
43  FindTarget(character);
44  return true;
45  }
46  return false;
47  }
48 
49  public override void Equip(Character character)
50  {
51  FindTarget(character);
52  }
53 
54  public override void Update(float deltaTime, Camera cam)
55  {
56  base.Update(deltaTime, cam);
57  if (currentTarget.Removed ||
58  item.Submarine != currentSub ||
59  Vector2.DistanceSquared(currentTarget.WorldPosition, item.WorldPosition) > Range * Range)
60  {
61  FindTarget(currentUser);
62  }
63  }
64 
65  private void FindTarget(Character user)
66  {
67  currentTarget = null;
68  if (user == null || (item.Submarine == null && OnlyInOwnSub))
69  {
70  IsActive = false;
71  return;
72  }
73 
74  float closestDist = float.PositiveInfinity;
75  foreach (Item targetItem in Item.ItemList)
76  {
77  if (targetItem.NonInteractable || targetItem.NonPlayerTeamInteractable || targetItem.IsHidden) { continue; }
78  if (OnlyInOwnSub)
79  {
80  if (targetItem.Submarine != item.Submarine) { continue; }
81  if (targetItem.Submarine.TeamID != user.TeamID) { continue; }
82  }
83  if (!targetItem.HasTag(Target) && ((MapEntity)targetItem).Prefab.Identifier != Target) { continue; }
84 
85  float distSqr = Vector2.DistanceSquared(item.WorldPosition, targetItem.WorldPosition);
86  if (distSqr > Range * Range || distSqr > closestDist) { continue; }
87 
88  currentTarget = targetItem;
89  currentSub = item.Submarine;
90  closestDist = distSqr;
91  currentUser = user;
92  }
93  IsActive = currentTarget != null;
94  }
95  }
96 }
Submarine Submarine
Definition: Entity.cs:53
bool NonPlayerTeamInteractable
Use IsPlayerInteractable to also check NonInteractable
static readonly List< Item > ItemList
The base class for components holding the different functionalities of the item
bool IsHidden
Is the entity hidden due to HiddenInGame being enabled or the layer the entity is in being hidden?