30class SCR_AISoundHandling
33 static const int SIGNAL_VALUE_SOLDIER_ALL = 1000;
34 static const int DISTANCE_TYPE_MID = 50;
35 static const int DISTANCE_TYPE_LONG = 2500;
40 ref array<float> signals = {};
41 SCR_CallsignCharacterComponent callsignComponent;
42 int SN_Seed = signalsMgr.FindSignal(
"Seed");
44 SetSignal(SN_Seed,
Math.RandomFloat(0, 1), signals);
47 callsignComponent = SCR_CallsignCharacterComponent.Cast(request.m_Entity.FindComponent(SCR_CallsignCharacterComponent));
54 if (!request.m_Entity)
56 ErrorMissingEntity(commType);
59 SetSignal_TargetValues(request.m_Entity, signalsMgr, signals);
60 SetSignal_SoldierCalledValues(signalsMgr, SIGNAL_VALUE_SOLDIER_ALL, signals);
66 if (request.m_vPosition ==
vector.Zero)
68 ErrorMissingPosition(commType);
71 SetSignal_SoldierCalledValues(signalsMgr, SIGNAL_VALUE_SOLDIER_ALL, signals);
73 float distanceType = SetSignal_PositionValues(request.m_Entity, signalsMgr, request.m_vPosition, speakerEntity.
GetOrigin(), signals);
74 if (distanceType < DISTANCE_TYPE_MID)
76 else if (distanceType < DISTANCE_TYPE_LONG)
85 if (!request.m_Entity || request.m_vPosition ==
vector.Zero)
87 ErrorMissingEntityOrPosition(commType);
90 SetSignal_ObjectType(request.m_Entity, signalsMgr, signals);
91 SetSignal_TargetFactionValues(request.m_Entity, signalsMgr, signals);
92 float distanceType = SetSignal_PositionValues(request.m_Entity, signalsMgr, request.m_vPosition, speakerEntity.
GetOrigin(), signals);
93 SetSignal_FactionValues(signalsMgr, 1, signals);
94 if (distanceType < DISTANCE_TYPE_MID)
96 else if (distanceType < DISTANCE_TYPE_LONG)
104 SetSignal_SoldierCalledValues(signalsMgr, SIGNAL_VALUE_SOLDIER_ALL, signals);
110 if (!request.m_Entity)
112 ErrorMissingEntity(commType);
115 SetSignal_TargetValues(request.m_Entity, signalsMgr, signals);
116 SetSignal_SoldierCalledValues(signalsMgr, SIGNAL_VALUE_SOLDIER_ALL, signals);
122 if (!callsignComponent)
124 ErrorMissingCallsign(commType);
127 SetSignal_MountAsValues(signalsMgr, callsignComponent.GetCharacterCallsignIndex(), RoleInVehicleToSoundRoleEnum(request.m_EnumSignal), signals);
133 SetSignal_SoldierCalledValues(signalsMgr, SIGNAL_VALUE_SOLDIER_ALL, signals);
139 SetSignal_SoldierCalledValues(signalsMgr, SIGNAL_VALUE_SOLDIER_ALL, signals);
145 if (callsignComponent)
146 SetSignal_SoldierCalledValues(signalsMgr, callsignComponent.GetCharacterCallsignIndex(), signals);
152 if (!callsignComponent)
154 ErrorMissingCallsign(commType);
157 SetSignal_SoldierCalledValues(signalsMgr, callsignComponent.GetCharacterCallsignIndex(), signals);
158 SetSignal_FlankValues(signalsMgr, request.m_EnumSignal, signals);
164 SetSignal_SoldierCalledValues(signalsMgr, SIGNAL_VALUE_SOLDIER_ALL, signals);
205 SetSignal_SoldierCalledValues(signalsMgr, SIGNAL_VALUE_SOLDIER_ALL, signals);
221 if (callsignComponent)
222 SetSignal_SoldierCalledValues(signalsMgr, callsignComponent.GetCharacterCallsignIndex(), signals);
228 if (callsignComponent)
229 SetSignal_SoldierCalledValues(signalsMgr, callsignComponent.GetCharacterCallsignIndex(), signals);
240 Print(
string.Format(
"SCR_AISoundHandling: SetSignalsAndTransmit: Missing callsign for: %1",
typename.EnumToString(
ECommunicationType, commType)),
LogLevel.ERROR);
246 Print(
string.Format(
"SCR_AISoundHandling: SetSignalsAndTransmit: Missing entity for: %1",
typename.EnumToString(
ECommunicationType, commType)),
LogLevel.ERROR);
252 Print(
string.Format(
"SCR_AISoundHandling: SetSignalsAndTransmit: Missing position for: %1",
typename.EnumToString(
ECommunicationType, commType)),
LogLevel.ERROR);
258 Print(
string.Format(
"SCR_AISoundHandling: SetSignalsAndTransmit: Missing entity or position for: %1",
typename.EnumToString(
ECommunicationType, commType)),
LogLevel.ERROR);
262 static SCR_AIInfoComponent GetInfoComponent(
IEntity entity)
266 SCR_ChimeraAIAgent agent = SCR_ChimeraAIAgent.Cast(entity);
267 if (entity && !agent)
269 AIControlComponent cc = AIControlComponent.Cast(entity.
FindComponent(AIControlComponent));
272 agent = SCR_ChimeraAIAgent.Cast(cc.GetAIAgent());
276 return agent.m_InfoComponent;
280 static int InfoUnitRoleToSoundCharacterEnum(SCR_AIInfoComponent info)
283 return ECP_Characters.MAN;
284 else if (info.
HasRole(EUnitRole.MACHINEGUNNER))
285 return ECP_Characters.MACHINE_GUNNER;
286 else if (info.
HasRole(EUnitRole.AT_SPECIALIST))
287 return ECP_Characters.AT_SOLDIER;
288 else if (info.
HasRole(EUnitRole.SNIPER))
289 return ECP_Characters.SNIPER;
290 else if (info.
HasRole(EUnitRole.RIFLEMAN))
291 return ECP_Characters.SOLDIER;
292 return ECP_Characters.MAN;
296 static int RoleInVehicleToSoundRoleEnum(
int role)
302 return ECP_VehicleRoles.DRIVER;
306 return ECP_VehicleRoles.GUNNER;
310 return ECP_VehicleRoles.PASSANGER;
317 static int VehicleTypeToSoundVehicleFactionEnum(
int role)
323 return ECP_VehicleTypes.VEHICLE;
327 return ECP_VehicleTypes.CAR;
331 return ECP_VehicleTypes.TRUCK;
335 return ECP_VehicleTypes.APC;
339 return ECP_VehicleTypes.COMM_TRUCK;
343 return ECP_VehicleTypes.FUEL_TRUCK;
347 return ECP_VehicleTypes.SUPPLY_TRUCK;
351 return ECP_VehicleTypes.MORTAR;
355 return ECP_VehicleTypes.HELICOPTER;
362 static void SetSignal_ObjectType(
IEntity target, SignalsManagerComponent signalsManagerComponent, array<float> signals)
364 int SN_ObjectType = signalsManagerComponent.FindSignal(
"ObjectType");
366 if (target.IsInherited(ChimeraCharacter))
368 else if (target.IsInherited(
Vehicle))
372 SetSignal(SN_ObjectType, value, signals);
376 static void SetSignal_TargetValues(
IEntity target, SignalsManagerComponent signalsManagerComponent, array<float> signals)
378 if (target.IsInherited(
Vehicle))
380 int SN_Vehicle = signalsManagerComponent.FindSignal(
"Vehicle");
382 SetSignal(SN_Vehicle, VehicleTypeToSoundVehicleFactionEnum(
Vehicle.Cast(target).m_eVehicleType), signals);
385 else if (target.IsInherited(ChimeraCharacter))
387 int SN_Character = signalsManagerComponent.FindSignal(
"Character");
388 SCR_AIInfoComponent targetInfoComponent = GetInfoComponent(target);
389 int unitRole = InfoUnitRoleToSoundCharacterEnum(targetInfoComponent);
391 SetSignal(SN_Character, unitRole, signals);
397 static void SetSignal_TargetFactionValues(
IEntity target, SignalsManagerComponent signalsManagerComponent, array<float> signals)
399 if (target.IsInherited(
Vehicle))
401 int SN_VehicleFaction = signalsManagerComponent.FindSignal(
"VehicleFaction");
403 SetSignal(SN_VehicleFaction, 100 + VehicleTypeToSoundVehicleFactionEnum(
Vehicle.Cast(target).m_eVehicleType), signals);
406 else if (target.IsInherited(ChimeraCharacter))
408 int SN_CharacterFaction = signalsManagerComponent.FindSignal(
"CharacterFaction");
409 SCR_AIInfoComponent targetInfoComponent = GetInfoComponent(target);
410 int unitRole = InfoUnitRoleToSoundCharacterEnum(targetInfoComponent) + 100;
412 SetSignal(SN_CharacterFaction, unitRole, signals);
418 static float SetSignal_PositionValues(
IEntity target, SignalsManagerComponent signalsManagerComponent, vector locationTarget, vector locationSelf, array<float> signals)
423 float distance = vector.Distance(locationTarget,locationSelf);
426 vector dirVec = locationTarget - locationSelf;
427 float directionAngle = dirVec.ToYaw();
428 int SN_DirectionClose = signalsManagerComponent.FindSignal(
"DirectionClose");
429 SetSignal(SN_DirectionClose, directionAngle, signals);
431 else if (
distance < DISTANCE_TYPE_LONG)
433 vector dirVec = locationTarget - locationSelf;
434 float directionAngle = dirVec.ToYaw();
436 int SN_TargetDistance = signalsManagerComponent.FindSignal(
"TargetDistance");
437 int SN_DirectionAngle = signalsManagerComponent.FindSignal(
"DirectionAngle");
439 SetSignal(SN_TargetDistance,
distance, signals);
440 SetSignal(SN_DirectionAngle, directionAngle, signals);
442 else if (
distance >= DISTANCE_TYPE_LONG)
444 SetSignal_GridValues(locationTarget, signalsManagerComponent, signals);
450 static void SetSignal_GridValues(vector locationTarget, SignalsManagerComponent signalsManagerComponent, array<float> signals)
452 array<int> gridXcoords = {};
453 array<int> gridZcoords = {};
455 SCR_MapEntity.GetGridPos(locationTarget, gridX: gridX, gridZ: gridZ);
457 int SN_Grid = signalsManagerComponent.FindSignal(
"Grid");
458 for (
int i = 2; i >= 0; i--)
460 int mod = Math.Pow(10, i);
461 gridXcoords.Insert(gridX / mod);
462 gridZcoords.Insert(gridZ / mod);
466 for (
int i = 0; i < 3; i++)
467 SetSignal(SN_Grid, gridXcoords[i], signals);
468 for (
int i = 0; i < 3; i++)
469 SetSignal(SN_Grid, gridZcoords[i], signals);
473 static void SetSignal_SoldierCalledValues(SignalsManagerComponent signalsManagerComponent,
int soldierCalled, array<float> signals)
475 int SN_SoldierCalled = signalsManagerComponent.FindSignal(
"SoldierCalled");
477 SetSignal(SN_SoldierCalled, soldierCalled, signals);
481 static void SetSignal_MountAsValues(SignalsManagerComponent signalsManagerComponent,
int soldierCalledId,
int soldierRole, array<float> signals)
483 int SN_SoldierCalled = signalsManagerComponent.FindSignal(
"SoldierCalled");
484 int SN_Role = signalsManagerComponent.FindSignal(
"Role");
486 SetSignal(SN_SoldierCalled, soldierCalledId, signals);
487 SetSignal(SN_Role, soldierRole, signals);
491 static void SetSignal_FlankValues(SignalsManagerComponent signalsManagerComponent,
int flank, array<float> signals)
493 int SN_Flank = signalsManagerComponent.FindSignal(
"Flank");
495 SetSignal(SN_Flank, flank, signals);
499 static void SetSignal_FactionValues(SignalsManagerComponent signalsManagerComponent,
int faction, array<float> signals)
501 int SN_Faction = signalsManagerComponent.FindSignal(
"Faction");
503 SetSignal(SN_Faction, faction, signals);
507 static void SetSignal(
int index,
float value, notnull array<float> signals)
509 signals.Insert(
index);
510 signals.Insert(value);
514 static SCR_AICommsHandler FindCommsHandler(AIAgent agent)
516 SCR_ChimeraAIAgent chimeraAgent = SCR_ChimeraAIAgent.Cast(agent);
519 return chimeraAgent.m_UtilityComponent.m_CommsHandler;
enum ECommunicationType NORMAL_PRIORITY
@ REPORT_SEARCH_AND_DESTROY
void SCR_AITalkRequest(ECommunicationType type, IEntity entity, vector pos, int enumSignal, bool transmitIfNoReceivers, bool transmitIfPassenger, SCR_EAITalkRequestPreset preset)
SCR_DestructionSynchronizationComponentClass ScriptComponentClass int index
enum EVehicleType IEntity
proto external Managed FindComponent(typename typeName)
proto external vector GetOrigin()
bool HasRole(EUnitRole role)
enum EPhysicsLayerPresets Vehicle
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
LogLevel
Enum with severity of the logging message.
@ NONE
When Shape is created and not initialized yet.