Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_AIGetEmptyCompartment.c
Go to the documentation of this file.
2{
3 static const string PORT_POSITION = "Position";
4 static const string PORT_COMPARTMENT = "CompartmentSlot";
5 static const string PORT_AGENT = "Agent";
6 static const string PORT_VEHICLE = "Vehicle";
7 static const string PORT_BOARDING_PARAMS = "BoardingParams";
8
9 [Attribute("0", UIWidgets.CheckBox, "Occupy driver compartment with Group Leader Agent?" )]
10 protected bool m_bAllowLeaderAsDriver;
11
12 private IEntity m_VehicleEntity;
13
14 //------------------------------------------------------------------------------------------------
15 override void OnEnter(AIAgent owner)
16 {
17 GetVariableIn(PORT_VEHICLE, m_VehicleEntity);
18 }
19
20 //------------------------------------------------------------------------------------------------
21 override ENodeResult EOnTaskSimulate(AIAgent owner, float dt)
22 {
23 if (!m_VehicleEntity)
24 {
25 ClearVariable(PORT_POSITION);
26 return ENodeResult.FAIL;
27 }
28
29 SCR_AIBoardingParameters params;
30 if (!GetVariableIn(PORT_BOARDING_PARAMS, params) || !params)
31 params = new SCR_AIBoardingParameters;
32
33 BaseCompartmentManagerComponent compartmentMan = BaseCompartmentManagerComponent.Cast(m_VehicleEntity.FindComponent(BaseCompartmentManagerComponent));
34 if (!compartmentMan)
35 {
36 return NodeError(this, owner, "Missing compartment manager on IEntity" + m_VehicleEntity.ToString());
37 }
38
39 ref array<BaseCompartmentSlot> compartments = {}, pilotComp = {}, turretComp = {}, cargoComp = {};
40 int numOfComp = compartmentMan.GetCompartments(compartments);
41 SCR_AIGroup group = SCR_AIGroup.Cast(owner);
42 if (!group)
43 {
44 group = SCR_AIGroup.Cast(owner.GetParentGroup());
45 if (!group)
46 return NodeError(this, owner, "Missing parent SCR_AIGroup class");
47 }
48 SCR_AIGroupVehicle groupVehicle = group.GetGroupUtilityComponent().m_VehicleMgr.FindVehicle(m_VehicleEntity);
49 if (!groupVehicle)
50 return NodeError(this, owner, "vehicle provided is not registered as used inside group!");
51
52 bool canBePiloted = groupVehicle.GetVehicleUsageComponent().CanBePiloted();
53
54 AIAgent groupMember;
55 BaseCompartmentSlot compartmentToAlocate;
56 bool foundEmptyCompartment;
57
58 GetVariableIn(PORT_AGENT, groupMember);
59 if (group.GetAgentsCount() == 1)
61
62 foreach (BaseCompartmentSlot comp : compartments)
63 {
64 if (!comp.AttachedOccupant() && comp.IsCompartmentAccessible() && !comp.IsReserved())
65 {
66 if (PilotCompartmentSlot.Cast(comp) && params.m_bIsDriverAllowed && canBePiloted) //exclude helicopter pilot slots for now
67 pilotComp.Insert(comp);
68 else if (TurretCompartmentSlot.Cast(comp) && params.m_bIsGunnerAllowed)
69 turretComp.Insert(comp);
70 else if (CargoCompartmentSlot.Cast(comp) && params.m_bIsCargoAllowed)
71 cargoComp.Insert(comp);
72 else
73 continue;
74 foundEmptyCompartment = true;
75 }
76 }
77
78 if (!foundEmptyCompartment)
79 {
80 ClearVariable(PORT_POSITION);
81 return ENodeResult.FAIL;
82 }
83
84 if (groupMember != group.GetLeaderAgent()) // this is not leader -> he has priority driver > turret > cargo
85 {
86 if (!pilotComp.IsEmpty())
87 compartmentToAlocate = pilotComp[0];
88 else if (!turretComp.IsEmpty())
89 compartmentToAlocate = turretComp[0];
90 else if (!cargoComp.IsEmpty())
91 compartmentToAlocate = cargoComp[0];
92 }
93 else // this is leader -> he has priority driver if m_bAllowLeaderAsDriver is true > turret > cargo
94 {
95 if (m_bAllowLeaderAsDriver && !pilotComp.IsEmpty())
96 compartmentToAlocate = pilotComp[0];
97 else if (!turretComp.IsEmpty())
98 compartmentToAlocate = turretComp[0];
99 else if (!cargoComp.IsEmpty())
100 compartmentToAlocate = cargoComp[0];
101 }
102
103 if (compartmentToAlocate)
104 {
105 group.AllocateCompartment(compartmentToAlocate);
106 SetVariableOut(PORT_POSITION, SCR_AICompartmentHandling.CompartmentClassToType(compartmentToAlocate.Type()));
107 SetVariableOut(PORT_COMPARTMENT, compartmentToAlocate);
108 return ENodeResult.SUCCESS;
109 }
110
111 ClearVariable(PORT_POSITION);
112 return ENodeResult.FAIL;
113 }
114
115 //------------------------------------------------------------------------------------------------
116 protected static ref TStringArray s_aVarsIn = {
117 PORT_VEHICLE,
118 PORT_AGENT,
119 PORT_BOARDING_PARAMS
120 };
122 {
123 return s_aVarsIn;
124 }
125
126 //------------------------------------------------------------------------------------------------
127 protected static ref TStringArray s_aVarsOut = {
128 PORT_POSITION,
129 PORT_COMPARTMENT
130 };
132 {
133 return s_aVarsOut;
134 }
135
136 //------------------------------------------------------------------------------------------------
137 static override bool VisibleInPalette()
138 {
139 return true;
140 }
141
142 //------------------------------------------------------------------------------------------------
143 static override string GetOnHoverDescription()
144 {
145 return "Returns type of next usable compartment. Compartments are allocated in GetIn activity. The compartments are selected with priority pilot>turret>cargo unless AIAgent is leader";
146 }
147};
ENodeResult NodeError(Node node, AIAgent owner, string msg)
Error call to be used in scripted BT nodes.
Definition NodeError.c:3
override ENodeResult EOnTaskSimulate(AIAgent owner, float dt)
void SCR_AIGroup(IEntitySource src, IEntity parent)
proto void SetVariableOut(string name, void val)
proto bool GetVariableIn(string name, out void val)
proto void ClearVariable(string name)
static override bool VisibleInPalette()
override TStringArray GetVariablesOut()
override TStringArray GetVariablesIn()
static override string GetOnHoverDescription()
void AllocateCompartment(BaseCompartmentSlot compartment)
SCR_AIGroupUtilityComponent GetGroupUtilityComponent()
ref SCR_AIGroupVehicleManager m_VehicleMgr
SCR_AIVehicleUsageComponent GetVehicleUsageComponent()
SCR_AIGroupVehicle FindVehicle(IEntity vehicleEntity)
bool CanBePiloted()
AI can use the pilot compartments on this vehicle.
ENodeResult
Definition ENodeResult.c:13
SCR_FieldOfViewSettings Attribute
array< string > TStringArray
Definition Types.c:385