19class SCR_FiringRangeTarget : BaseBuilding
26 [
Attribute(
"3",
UIWidgets.Slider,
"Target in stays in folded position for... seconds",
"1 100 3")]
30 [
Attribute(
"1",
UIWidgets.Slider,
"How far is the target from shooting line.",
"1 9999 50")]
34 [
Attribute(
"3",
UIWidgets.Slider,
"Target stays in erected position for... seconds",
"0.5 10 0.5")]
38 [
Attribute( defvalue:
"0", uiwidget:
UIWidgets.CheckBox,
desc:
"Set if the target has to be used as hit indicator." )]
43 private bool m_bAutoResetTarget;
51 private int m_iTargetHitSignal;
58 private ProcAnimComponent m_ProcAnimComponent;
61 private RplComponent m_RplComponent;
70 private IEntity m_OwnerEntity = null;
73 private int m_iTargetOwner = -1;
76 private int m_iTargetMode = -1;
79 private int m_iHitValue;
82 private int m_iTargetState;
84 private IEntity m_FiringLineController;
89 const float SCORE_CENTER = 10;
90 const float SCORE_CIRCLE_1 = 5;
91 const float SCORE_CIRCLE_2 = 3;
92 const float SCORE_CIRCLE_3 = 1;
96 const float AREA_10_W_LEFT = 0.03;
97 const float AREA_10_W_RIGHT = -0.03;
98 const float AREA_10_H_UP = 1.15;
99 const float AREA_10_H_DOWN = 1.03;
102 const float AREA_5_W_LEFT = 0.08;
103 const float AREA_5_W_RIGHT = -0.08;
104 const float AREA_5_H_UP = 1.2;
105 const float AREA_5_H_DOWN = 0.98;
108 const float AREA_3_W_LEFT = 0.13;
109 const float AREA_3_W_RIGHT = -0.13;
110 const float AREA_3_H_UP = 1.32;
111 const float AREA_3_H_DOWN = 0.84;
114 const float AREA_1_W_LEFT = 0.28;
115 const float AREA_1_W_RIGHT = -0.28;
116 const float AREA_1_H_UP = 1.77;
117 const float AREA_1_H_DOWN = 0.5;
119 const float AREA_BOTTOM_VALID = 0.40;
122 override void OnDamage(
float damage,
136 if (!IsHitValid(CoordToLocal(outMat[0])))
139 super.OnDamage(damage,
type,pHitEntity,outMat,damageSource,instigator,colliderID,speed);
157 int playerID = instigator.GetInstigatorPlayerID();
160 if (m_iTargetOwner == playerID || m_iTargetMode ==
ETargetMode.TRAINING)
163 if (!m_FiringRangeManager)
166 if (GetValidityOfHit(CoordToLocal(outMat[0])))
167 m_FiringRangeManager.AddIndicator(CoordToLocal(outMat[0]),VectorToLocal(outMat[2] * -0.1), pHitEntity);
171 if (m_iTargetOwner == playerID && m_iTargetMode ==
ETargetMode.COMPETITION)
173 GetHitValue(CoordToLocal(outMat[0]),playerID);
179 void SetState(
int state)
181 Rpc(SetStateMP, state);
187 void SetStateMP(
int state)
190 Event_TargetChangeState.Invoke(state,
this);
199 m_SignalManager.SetSignalValue(m_iTargetHitSignal,
ETargetState.TARGET_DOWN);
201 SCR_SoundManagerModule.CreateAndPlayAudioSource(
this, SCR_SoundEvent.SOUND_TARGET_DOWN);
203 if (m_LineController)
204 m_LineController.CountPopUpTargets();
205 Replication.BumpMe();
214 m_SignalManager.SetSignalValue(m_iTargetHitSignal,
ETargetState.TARGET_UP);
216 SCR_SoundManagerModule.CreateAndPlayAudioSource(
this, SCR_SoundEvent.SOUND_TARGET_UP);
218 Replication.BumpMe();
226 return (m_RplComponent && m_RplComponent.IsProxy());
233 if (!m_SignalManager)
235 return m_SignalManager.GetSignalValue(m_SignalManager.FindSignal(
"target_hit"));
249 return m_iTargetOwner;
254 void SetTargetOwner(
int playerID)
256 m_iTargetOwner = playerID;
261 void SetTargetMode(
int targetMode)
263 m_iTargetMode = targetMode;
268 int GetErectedDuration()
276 bool GetValidityOfHit(vector coordOfHit)
278 float HitY = coordOfHit[1];
279 if (HitY > AREA_1_H_DOWN)
287 void SetAutoResetTarget(
bool state)
289 m_bAutoResetTarget = state;
294 bool IsHitValid(vector coordOfHit)
296 float HitX = coordOfHit[0];
297 float HitY = coordOfHit[1];
299 if (HitX < AREA_1_W_LEFT && HitX > AREA_1_W_RIGHT && HitY < AREA_1_H_UP && HitY > AREA_BOTTOM_VALID)
314 void GetHitValue(vector coordOfHit,
int playerID)
316 PlayerController playerController =
GetGame().GetPlayerManager().GetPlayerController(playerID);
317 if (!playerController)
320 float HitX = coordOfHit[0];
321 float HitY = coordOfHit[1];
323 if (HitX < AREA_10_W_LEFT && HitX > AREA_10_W_RIGHT && HitY < AREA_10_H_UP && HitY > AREA_10_H_DOWN)
324 m_iHitValue = SCORE_CENTER;
326 else if (HitX < AREA_5_W_LEFT && HitX > AREA_5_W_RIGHT && HitY < AREA_5_H_UP && HitY > AREA_5_H_DOWN)
327 m_iHitValue = SCORE_CIRCLE_1;
329 else if (HitX < AREA_3_W_LEFT && HitX > AREA_3_W_RIGHT && HitY < AREA_3_H_UP && HitY > AREA_3_H_DOWN)
330 m_iHitValue = SCORE_CIRCLE_2;
332 else if (HitX < AREA_1_W_LEFT && HitX > AREA_1_W_RIGHT && HitY < AREA_1_H_UP && HitY > AREA_1_H_DOWN)
333 m_iHitValue = SCORE_CIRCLE_3;
335 m_FiringRangeManager.CountPlayerScore(m_iTargetOwner, m_iHitValue);
339 override void EOnFrame(
IEntity owner,
float timeSlice)
359 override bool RplSave(ScriptBitWriter writer)
363 writer.Write(m_iTargetState, 1);
368 override bool RplLoad(ScriptBitReader reader)
371 if (!reader.Read(m_iTargetState, 1))
return false;
372 SetState(m_iTargetState);
377 override void EOnInit(
IEntity owner)
379 m_SignalManager = SignalsManagerComponent.Cast(FindComponent(SignalsManagerComponent));
380 m_ProcAnimComponent = ProcAnimComponent.Cast(FindComponent(ProcAnimComponent));
382 if (!m_SignalManager)
386 m_iTargetHitSignal = m_SignalManager.FindSignal(
"target_hit");
393 m_LineController = SCR_FiringRangeController.Cast(m_OwnerEntity);
394 if (!m_LineController)
398 m_LineController.SetIndicator(owner);
400 m_FiringRangeManager = SCR_FiringRangeManager.Cast(m_OwnerEntity.GetParent());
401 if (!m_FiringRangeManager)
404 m_RplComponent = RplComponent.Cast(m_FiringRangeManager.FindComponent(RplComponent));
408 void SCR_FiringRangeTarget(IEntitySource src,
IEntity parent)
411 m_FiringLineController = parent;
415 void ~SCR_FiringRangeTarget()
proto external EParticleEffectState GetState()