DayZ 1.27
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
DayZPlayerImplementAiming.c
См. документацию.
1/*
2DayZPlayerImplement
3
4this file is implemenation of dayzPlayer in script
5- logic of movement
6- camera switching logic
7
8*/
9
18
19class PlayerSwayConstants
20{
21 static const float SWAY_MULTIPLIER_DEFAULT = 1.0;
22 static const float SWAY_MULTIPLIER_STABLE = 0.05;
23 static const float SWAY_MULTIPLIER_EXHAUSTED = 0.6;
24 static const float SWAY_TIME_IN = 1.5;
25 static const float SWAY_TIME_STABLE = 3.0;
26 static const float SWAY_TIME_EXHAUSTED = 1.5;
27 static const float SWAY_TIME_OUT = 0.5;
28 static const float SWAY_ROLL = 3;
29}
30
32{
33
34 //-------------------------------------------------------------
38
39 protected const float SWAY_WEIGHT_SCALER = 1;//use this to scale the sway effect up/down
40 protected float m_HorizontalNoise;
41 protected float m_HorizontalTargetValue;
42 protected float m_HorizontalNoiseVelocity[1] = {0};
45 protected float m_TotalTime;
46 protected float m_ReferenceTime = 0;
47 protected float m_StaminaPercentage;
48 protected float m_SwayStateStartTime;
49 //protected float m_SwayStateStartTime[eSwayStates.MAX];
50 protected float m_LastSwayMultiplier = PlayerSwayConstants.SWAY_MULTIPLIER_DEFAULT;
53 protected float m_BreathingXAxisOffset;
54 protected float m_BreathingYAxisOffset;
55 protected bool m_HoldingBreathSet;
56 protected bool m_AimNoiseAllowed = true;
57 protected bool m_ProceduralRecoilEnabled = true;
59 protected int m_ShakeCount;
60 protected float m_SwayWeight;
61 protected float m_MaxVelocity;
62 protected ref KuruShake m_KuruShake;
63 protected float m_CamShakeX;
64 protected float m_CamShakeY;
65 protected vector m_SwayModifier = "1 1 1";//"max_speed_noise radius_noise overall_speed"
66 protected int m_SwayState = -1;
67
68 protected float m_StealthAimY_Last;
69 protected float m_FilterVelocityStealthAimY[1] = {0};
70
71 protected static float m_AimXClampRanges[] = { -180, -20, 90, 0, -50, 90, 180, -20, 90 };
72
74 {
75 m_PlayerDpi = player;
76 Class.CastTo(m_PlayerPb, player);
78 }
79
81 {
83 {
85 }
86 }
87
88 void RequestKuruShake(float amount)
89 {
90 if (!m_KuruShake)
91 m_KuruShake = new KuruShake(m_PlayerPb, amount);
92 }
93
95 {
96 Weapon_Base weapon = Weapon_Base.Cast(player.GetHumanInventory().GetEntityInHands());
97 if (weapon)
98 {
99 m_SwayModifier = weapon.GetPropertyModifierObject().m_SwayModifiers;
100 }
101 }
102
103 void OnFinisherBegin(float currentAimY)
104 {
105 m_StealthAimY_Last = currentAimY;
107 }
108
109 void OnSwayStateChange(int state)
110 {
111 switch (state)
112 {
113 case eSwayStates.HOLDBREATH_EXHAUSTED:
114 m_PlayerPb.OnHoldBreathExhausted();
115 break;
116
117 default:
118 break;
119 }
120 }
121
123 {
124 return m_SwayWeight;
125 }
126
127 void SetAimNoiseAllowed(bool state)
128 {
129 m_AimNoiseAllowed = state;
130 }
131
133 {
134 return m_AimNoiseAllowed;
135 }
136
138 {
140 }
141
146
147 void SetCamShakeValues(float x_axis, float y_axis)
148 {
149 m_CamShakeX = x_axis;
150 m_CamShakeY = y_axis;
151 }
152
154 {
157 return true;
158 }
159
160 bool ProcessAimFilters(float pDt, SDayZPlayerAimingModel pModel, int stance_index)
161 {
162 float breathing_offset_x;
163 float breathing_offset_y;
164
165 float noise_offset_x;
166 float noise_offset_y;
167
168 float shake_offset_x;
169 float shake_offset_y;
170
171 float recoil_offset_mouse_x;
172 float recoil_offset_mouse_y;
173
174 float recoil_offset_hands_x;
175 float recoil_offset_hands_y;
176
177 float kuru_offset_x;
178 float kuru_offset_y;
179
180 float player_stamina = m_PlayerPb.GetStaminaHandler().GetSyncedStaminaNormalized();
181
182 #ifdef DEVELOPER
183 DbgPrintAimingImplement("Player: " + m_PlayerPb + " | ProcessAimFilters | timestamp: " + m_PlayerPb.GetSimulationTimeStamp());
184 #endif
185
186 //negates stamina effect during hold breath
187 if (m_PlayerPb.IsHoldingBreath())
188 {
189 player_stamina = 1;
190 }
191 float speed = CalculateSpeedMultiplier(player_stamina);
192 m_TotalTime += pDt * speed;
193
194 if (m_PlayerPb.IsHoldingBreath() && !m_HoldingBreathSet)
195 {
197 m_StaminaPercentage = m_PlayerPb.GetStaminaHandler().GetStamina() / m_PlayerPb.GetStaminaHandler().GetStaminaMax();
198 }
199 else if (!m_PlayerPb.IsHoldingBreath() && m_HoldingBreathSet)
200 {
202 }
203
204 float adjusted_sway_multiplier = CalculateSwayMultiplier();
205 m_LastSwayMultiplier = adjusted_sway_multiplier;
206
207 m_SwayWeight = CalculateWeight( stance_index, player_stamina, 0.5/*m_PlayerPb.m_CameraSwayModifier*/, m_PlayerPb.IsHoldingBreath()) * adjusted_sway_multiplier;
208
210 ApplyBreathingPattern(breathing_offset_x, breathing_offset_y, 3.0, m_TotalTime, m_SwayWeight);
211 ApplyHorizontalNoise(noise_offset_x, noise_offset_y, 0.2, 0.5, 3.0 * m_SwayModifier[0], speed, 3 * m_SwayModifier[1], m_SwayWeight, pDt);
212
213 int shake_level = m_PlayerPb.GetShakeLevel();
214 if (shake_level != 0)
215 {
216 ApplyShakes(shake_offset_x, shake_offset_y, shake_level);
217 }
218
220 if (m_CurrentRecoil)
221 {
222 m_CurrentRecoil.Update(pModel, recoil_offset_mouse_x, recoil_offset_mouse_y, recoil_offset_hands_x, recoil_offset_hands_y, pDt);
223 }
224
225 if (m_KuruShake)
226 {
227 m_KuruShake.Update(pDt, kuru_offset_x, kuru_offset_y);
228 }
229
231 pModel.m_fAimXHandsOffset = breathing_offset_x + noise_offset_x + recoil_offset_hands_x + shake_offset_x + kuru_offset_x;
232 pModel.m_fAimYHandsOffset = breathing_offset_y + noise_offset_y + recoil_offset_hands_y + shake_offset_y + kuru_offset_y;
233
234 #ifdef DEVELOPER
235 DbgPrintAimingImplement("breathing_offset_y: " + breathing_offset_y);
236 DbgPrintAimingImplement("noise_offset_y: " + noise_offset_y);
237 DbgPrintAimingImplement("recoil_offset_hands_y: " + recoil_offset_hands_y);
238 DbgPrintAimingImplement("shake_offset_y: " + shake_offset_y);
239 DbgPrintAimingImplement("kuru_offset_y: " + kuru_offset_y);
240 DbgPrintAimingImplement("pModel.m_fAimYHandsOffset: " + pModel.m_fAimYHandsOffset);
241 #endif
243 pModel.m_fAimXCamOffset = -shake_offset_x - recoil_offset_hands_x - kuru_offset_x + m_CamShakeX;
244 pModel.m_fAimYCamOffset = -shake_offset_y - recoil_offset_hands_y - kuru_offset_y + m_CamShakeY;
245
246
247 #ifdef DEVELOPER
248 DbgPrintAimingImplement("m_CamShakeY: " + m_CamShakeY);
249 DbgPrintAimingImplement("pModel.m_fAimYCamOffset: " + pModel.m_fAimYCamOffset);
250 #endif
251
253 if (stance_index == DayZPlayerConstants.STANCEIDX_RAISEDPRONE)
254 {
255 float newVal = DayZPlayerUtils.LinearRangeClamp(pModel.m_fCurrentAimX, pModel.m_fCurrentAimY, m_AimXClampRanges);
256 pModel.m_fAimYHandsOffset += newVal - pModel.m_fCurrentAimY;
257 }
258 float absAimY = Math.AbsFloat(pModel.m_fCurrentAimY);
259 pModel.m_fAimYHandsOffset = Math.Clamp(pModel.m_fAimYHandsOffset,absAimY - 89.9,89.9 - absAimY); //'90' leads to rounding errors down the line
260
261 if (m_PlayerDpi.IsInOptics() && m_KuruShake)
262 {
263 //TODO - do not offset mouse
264 }
266 pModel.m_fAimXMouseShift = recoil_offset_mouse_x -kuru_offset_x / 10;
267 pModel.m_fAimYMouseShift = recoil_offset_mouse_y + kuru_offset_y / 10;
268
269 #ifdef DEVELOPER
270 DbgPrintAimingImplement("recoil_offset_mouse_y: " + recoil_offset_mouse_y);
271 DbgPrintAimingImplement("pModel.m_fAimYMouseShift: " + pModel.m_fAimYMouseShift);
272 #endif
273
274 if (m_PlayerPb.IsHoldingBreath() && !m_HoldingBreathSet)
275 {
276 m_HoldingBreathSet = true;
277 m_HorizontalNoiseXAxisOffset = noise_offset_x;
278 m_BreathingXAxisOffset = breathing_offset_x;
279 m_BreathingYAxisOffset = breathing_offset_y;
280 }
281 else if (!m_PlayerPb.IsHoldingBreath() && m_HoldingBreathSet)
282 {
283 m_HoldingBreathSet = false;
284 }
285
286 if (!m_PlayerPb.IsHoldingBreath() && m_LastSwayMultiplier == PlayerSwayConstants.SWAY_MULTIPLIER_DEFAULT && m_HorizontalNoiseXAxisOffset != 0)
287 {
291 }
292
293 if (m_PlayerPb.IsHoldingBreath())
294 {
295 m_PlayerPb.DepleteStamina(EStaminaModifiers.HOLD_BREATH,pDt*speed);
296 }
297 #ifdef DEVELOPER
298 DbgPrintAimingImplement("----------------------------");
299 #endif
300 return true;
301 }
302
303 protected float CalculateSwayMultiplier()
304 {
305 float max;
306 float time;
307 float time_clamped;
308 float ret;
309
310 if (m_PlayerPb.IsHoldingBreath())
311 {
313
314 if (time < (PlayerSwayConstants.SWAY_TIME_IN * m_StaminaPercentage))
315 {
316 UpdateSwayState(eSwayStates.HOLDBREATH_IN);
317 max = PlayerSwayConstants.SWAY_TIME_IN * m_StaminaPercentage;
318 time_clamped = Math.Clamp((m_TotalTime - m_SwayStateStartTime),0,max);
319 ret = Math.Lerp(m_LastSwayMultiplier,PlayerSwayConstants.SWAY_MULTIPLIER_STABLE,time_clamped/max);
320 }
321 else if (time >= (PlayerSwayConstants.SWAY_TIME_IN * m_StaminaPercentage) && time < (m_StaminaPercentage * (PlayerSwayConstants.SWAY_TIME_IN + PlayerSwayConstants.SWAY_TIME_STABLE)))
322 {
323 UpdateSwayState(eSwayStates.HOLDBREATH_STABLE);
324 ret = PlayerSwayConstants.SWAY_MULTIPLIER_STABLE;
325 }
326 else
327 {
328 UpdateSwayState(eSwayStates.HOLDBREATH_EXHAUSTED);
329 max = PlayerSwayConstants.SWAY_TIME_EXHAUSTED * m_StaminaPercentage;
330 time_clamped = Math.Clamp((m_TotalTime - m_SwayStateStartTime),0,max);
331 ret = Math.Lerp(PlayerSwayConstants.SWAY_MULTIPLIER_STABLE,PlayerSwayConstants.SWAY_MULTIPLIER_EXHAUSTED,(time_clamped/max));
332 }
333 }
334 else
335 {
337 max = PlayerSwayConstants.SWAY_TIME_OUT;
338 time_clamped = Math.Clamp((m_TotalTime - m_SwayStateStartTime),0,max);
339 ret = Math.Lerp(m_LastSwayMultiplier,1,time_clamped/max);
340 }
341 return ret;
342 }
343
344 float CalculateSpeedMultiplier(float stamina)
345 {
346 return (((1.0 - stamina) * 3.0) + 1.0) * m_SwayModifier[2]; // just 'm_SwayModifier[2]' for HoldBreath
347 }
348
349 protected bool UpdateSwayState(int state)
350 {
351 if (state != m_SwayState)
352 {
353 m_SwayState = state;
356 OnSwayStateChange(state);
357 return true;
358 }
359
360 return false;
361 }
362
364 {
365 return m_SwayState;
366 }
367
368 protected void ApplyBreathingPattern(out float x_axis, out float y_axis, float pAmplitude, float pTotalTime, float weight)
369 {
370
371 float multiplier = Math.Lerp(PlayerSwayConstants.SWAY_MULTIPLIER_DEFAULT,0,m_LastSwayMultiplier); //TODO revise
372 #ifdef DEVELOPER
373 DbgPrintAimingImplement("m_LastSwayMultiplier: " + m_LastSwayMultiplier);
374 DbgPrintAimingImplement("pAmplitude: " + pAmplitude);
375 DbgPrintAimingImplement("pTotalTime: " + pTotalTime);
376 DbgPrintAimingImplement("weight: " + weight);
377 DbgPrintAimingImplement("multiplier: " + multiplier);
378 #endif
379
380 x_axis = (Math.Sin(pTotalTime) * pAmplitude / 4) * weight;
381 y_axis = (Math.Sin((pTotalTime) * 0.8 + 0.6) * pAmplitude) * weight;
382 #ifdef DEVELOPER
383 DbgPrintAimingImplement("y_axis_midproduct: " + y_axis);
384 #endif
385 x_axis += m_BreathingXAxisOffset * multiplier;
386 y_axis += m_BreathingYAxisOffset * multiplier;
387 }
388
389 protected void ApplyHorizontalNoise(out float x_axis, out float y_axis, float smooth_time,float max_velocity_low, float max_velocity_high, float velocity_modifier, float max_distance, float weight, float pDt)
390 {
392 {
393 //acquire new target
394 m_MaxVelocity = m_PlayerPb.GetRandomGeneratorSyncManager().GetRandomInRange(RandomGeneratorSyncUsage.RGSAimingModel, max_velocity_low, max_velocity_high);
395
396 float r = m_PlayerPb.GetRandomGeneratorSyncManager().GetRandomInRange(RandomGeneratorSyncUsage.RGSAimingModel, 0, 1);
397 m_HorizontalTargetValue = (r - 0.5) * 2 * max_distance;
399 }
400
402 x_axis = m_HorizontalNoise * weight;
403 float multiplier = Math.Lerp(PlayerSwayConstants.SWAY_MULTIPLIER_DEFAULT,0,m_LastSwayMultiplier); //TODO revise
404 x_axis += m_HorizontalNoiseXAxisOffset * multiplier;
405 }
406
407 protected void ApplyShakes(out float x_axis, out float y_axis, int level)
408 {
409 float weight = level / PlayerBase.SHAKE_LEVEL_MAX;
410 m_ShakeCount++;
411 int shakes_threshold = Math.Round(m_PlayerPb.GetRandomGeneratorSyncManager().GetRandomInRange(RandomGeneratorSyncUsage.RGSAimingModel, 2, 4));
412 if (m_ShakeCount > shakes_threshold)
413 {
414 m_ShakeCount = 0;
415
416 float modifier = m_PlayerPb.GetRandomGeneratorSyncManager().GetRandomInRange(RandomGeneratorSyncUsage.RGSAimingModel, 0.45, 0.9);
417 x_axis = modifier * weight * m_PlayerPb.GetRandomGeneratorSyncManager().GetRandomInRange(RandomGeneratorSyncUsage.RGSAimingModel, 0, 1);
418 y_axis = modifier * weight * m_PlayerPb.GetRandomGeneratorSyncManager().GetRandomInRange(RandomGeneratorSyncUsage.RGSAimingModel, 0, 1);
419 }
420 }
421
422 protected float CalculateWeight(int stance_index, float current_stamina, float camera_sway_modifier, bool holding_breath)
423 {
424 if (m_PlayerDpi.GetCommand_Move() && m_PlayerDpi.GetCommand_Move().IsInRoll())//when the player is rolling, set a constant and disregard everything else
425 {
426 return PlayerSwayConstants.SWAY_ROLL;
427 }
428 float stance_modifier;
429 switch (stance_index)
430 {
431 case DayZPlayerConstants.STANCEIDX_RAISEDERECT:
432 stance_modifier = 0.5;
433 break;
434 case DayZPlayerConstants.STANCEIDX_RAISEDCROUCH:
435 stance_modifier = 0.75;
436 break;
437 case DayZPlayerConstants.STANCEIDX_RAISEDPRONE:
438 stance_modifier = 0.9;
439 break;
440 default:
441 stance_modifier = 0.75;
442 //Debug.LogError("stance mask out of definition");
443 break;
444 }
445
446 #ifdef DEVELOPER
447 DbgPrintAimingImplement("current_stamina: " + current_stamina);
448 DbgPrintAimingImplement("camera_sway_modifier: " + camera_sway_modifier);
449 DbgPrintAimingImplement("holding_breath: " + holding_breath);
450 #endif
451
452 return (1 - stance_modifier) * m_AimNoiseAllowed * camera_sway_modifier * SWAY_WEIGHT_SCALER;
453 }
454
455 void DbgPrintAimingImplement(string val)
456 {
457 #ifdef DEVELOPER
458 if (GetDayZGame().IsAimLogEnabled())
459 Print("DayZPlayerImplementAiming | " + val);
460 #endif
461 }
462}
463
DayZGame GetDayZGame()
Определения DayZGame.c:3870
static const float SWAY_TIME_OUT
Определения DayZPlayerImplementAiming.c:27
eSwayStates
Определения DayZPlayerImplementAiming.c:11
@ HOLDBREATH_STABLE
Определения DayZPlayerImplementAiming.c:14
@ HOLDBREATH_EXHAUSTED
Определения DayZPlayerImplementAiming.c:15
@ HOLDBREATH_IN
Определения DayZPlayerImplementAiming.c:13
enum eSwayStates SWAY_MULTIPLIER_DEFAULT
static const float SWAY_TIME_EXHAUSTED
Определения DayZPlayerImplementAiming.c:26
static const float SWAY_MULTIPLIER_STABLE
Определения DayZPlayerImplementAiming.c:22
static const float SWAY_ROLL
Определения DayZPlayerImplementAiming.c:28
static const float SWAY_TIME_IN
Определения DayZPlayerImplementAiming.c:24
static const float SWAY_MULTIPLIER_EXHAUSTED
Определения DayZPlayerImplementAiming.c:23
static const float SWAY_TIME_STABLE
Определения DayZPlayerImplementAiming.c:25
void DayZPlayerUtils()
cannot be instantiated
Определения DayZPlayerUtils.c:465
@ DEFAULT
Определения ECrewMemberState.c:3
EStaminaModifiers
Определения EStaminaModifiers.c:2
const int MAX
Определения EnConvert.c:27
RandomGeneratorSyncUsage
Определения RandomGeneratorSyncManager.c:2
Super root of all classes in Enforce script.
Определения EnScript.c:11
ref KuruShake m_KuruShake
Определения DayZPlayerImplementAiming.c:62
static float m_AimXClampRanges[]
Определения DayZPlayerImplementAiming.c:71
float CalculateWeight(int stance_index, float current_stamina, float camera_sway_modifier, bool holding_breath)
Определения DayZPlayerImplementAiming.c:422
float m_HorizontalNoiseXAxisOffset
Определения DayZPlayerImplementAiming.c:52
void DayZPlayerImplementAiming(DayZPlayerImplement player)
Определения DayZPlayerImplementAiming.c:73
void DbgPrintAimingImplement(string val)
Определения DayZPlayerImplementAiming.c:455
float CalculateSpeedMultiplier(float stamina)
Определения DayZPlayerImplementAiming.c:344
void SetProceduralRecoilEnabled(bool state)
Определения DayZPlayerImplementAiming.c:137
bool UpdateSwayState(int state)
Определения DayZPlayerImplementAiming.c:349
void SetCamShakeValues(float x_axis, float y_axis)
Определения DayZPlayerImplementAiming.c:147
void ApplyShakes(out float x_axis, out float y_axis, int level)
Определения DayZPlayerImplementAiming.c:407
void RequestKuruShake(float amount)
Определения DayZPlayerImplementAiming.c:88
const float SWAY_WEIGHT_SCALER
Определения DayZPlayerImplementAiming.c:39
void SetAimNoiseAllowed(bool state)
Определения DayZPlayerImplementAiming.c:127
ref RecoilBase m_CurrentRecoil
Определения DayZPlayerImplementAiming.c:58
void SetRecoil(Weapon_Base weapon)
Определения DayZPlayerImplementAiming.c:80
float m_HorizontalNoiseVelocity[1]
Определения DayZPlayerImplementAiming.c:42
void ApplyBreathingPattern(out float x_axis, out float y_axis, float pAmplitude, float pTotalTime, float weight)
Определения DayZPlayerImplementAiming.c:368
bool ProcessStealthFilters(float pDt, SDayZPlayerAimingModel pModel)
Определения DayZPlayerImplementAiming.c:153
void OnRaiseBegin(DayZPlayerImplement player)
Определения DayZPlayerImplementAiming.c:94
bool ProcessAimFilters(float pDt, SDayZPlayerAimingModel pModel, int stance_index)
Определения DayZPlayerImplementAiming.c:160
void OnFinisherBegin(float currentAimY)
Определения DayZPlayerImplementAiming.c:103
float m_FilterVelocityStealthAimY[1]
Определения DayZPlayerImplementAiming.c:69
DayZPlayerImplement m_PlayerDpi
Определения DayZPlayerImplementAiming.c:43
float CalculateSwayMultiplier()
Определения DayZPlayerImplementAiming.c:303
void ApplyHorizontalNoise(out float x_axis, out float y_axis, float smooth_time, float max_velocity_low, float max_velocity_high, float velocity_modifier, float max_distance, float weight, float pDt)
Определения DayZPlayerImplementAiming.c:389
void OnSwayStateChange(int state)
Определения DayZPlayerImplementAiming.c:109
Определения ManBase.c:2
Определения KuruShake.c:2
Определения EnMath.c:7
Определения PlayerBaseClient.c:2
Определения RecoilBase.c:2
float m_fAimXCamOffset
Определения dayzplayer.c:1104
float m_fAimYMouseShift
Определения dayzplayer.c:1109
float m_fAimXHandsOffset
Определения dayzplayer.c:1106
float m_fAimYCamOffset
Определения dayzplayer.c:1105
float m_fCurrentAimY
Определения dayzplayer.c:1102
float m_fAimYHandsOffset
Определения dayzplayer.c:1107
float m_fAimXMouseShift
Определения dayzplayer.c:1108
float m_fCurrentAimX
Определения dayzplayer.c:1101
override RecoilBase SpawnRecoilObject()
Определения Magnum.c:65
shorthand
Определения BoltActionRifle_Base.c:6
Определения EnConvert.c:106
DayZPlayerConstants
defined in C++
Определения dayzplayer.c:602
proto void Print(void var)
Prints content of variable to console/log.
static proto bool CastTo(out Class to, Class from)
Try to safely down-cast base class to child class.
static proto float Lerp(float a, float b, float time)
Linearly interpolates between 'a' and 'b' given 'time'.
static proto float Round(float f)
Returns mathematical round of value.
static proto float Clamp(float value, float min, float max)
Clamps 'value' to 'min' if it is lower than 'min', or to 'max' if it is higher than 'max'.
static proto float Sin(float angle)
Returns sinus of angle in radians.
static proto float AbsFloat(float f)
Returns absolute value.
static proto float SmoothCD(float val, float target, inout float velocity[], float smoothTime, float maxVelocity, float dt)
Does the CD smoothing function - easy in | easy out / S shaped smoothing.