dayzplayerimplement.c 103 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998
  1. /*
  2. DayZPlayerImplement
  3. this file is implemenation of dayzPlayer in script
  4. - logic of movement
  5. - camera switching logic
  6. */
  7. class DayZPlayerCommandDeathCallback : HumanCommandDeathCallback
  8. {
  9. //----------------------------------
  10. // callbacks
  11. override void OnSimulationEnd()
  12. {
  13. if (LogManager.IsSyncLogEnable()) syncDebugPrint("DZPI::OnSimulationEnd - trying to drop item");
  14. if (GetGame().IsServer())
  15. {
  16. EntityAI itemInHands = m_pPlayer.GetHumanInventory().GetEntityInHands();
  17. if (itemInHands)
  18. {
  19. int boneIndex = m_pPlayer.GetBoneIndexByName("RightHand_Dummy");
  20. vector m4[4];
  21. m_pPlayer.GetBoneTransformWS(boneIndex, m4);
  22. m_pPlayer.GetInventory().DropEntityWithTransform(InventoryMode.SERVER, m_pPlayer, itemInHands, m4);
  23. if (GetCEApi())
  24. {
  25. int deadBodyLifetime = GetCEApi().GetCEGlobalInt("CleanupLifetimeDeadPlayer");
  26. if (deadBodyLifetime <= 0)
  27. {
  28. deadBodyLifetime = 3600;
  29. }
  30. itemInHands.SetLifetime(deadBodyLifetime);
  31. }
  32. }
  33. }
  34. }
  35. override bool ShouldSimulationBeDisabled()
  36. {
  37. return m_pPlayer.m_WasInVehicle == false;
  38. }
  39. PlayerBase m_pPlayer;
  40. }
  41. class DayZPlayerVehicleCommandDeathCallback : HumanCommandDeathCallback
  42. {
  43. override void OnSimulationEnd()
  44. {
  45. m_pPlayer.PhysicsEnableGravity(true);
  46. }
  47. PlayerBase m_pPlayer;
  48. }
  49. class DeathEffectTimer extends Timer
  50. {
  51. override void Stop()
  52. {
  53. super.Stop();
  54. PPERequesterBank.GetRequester(PPERequester_DeathDarkening).Stop();
  55. }
  56. };
  57. #ifdef FEATURE_NETWORK_RECONCILIATION
  58. class DayZPlayerImplementOwnerState : DayZPlayerOwnerState
  59. {
  60. float m_fLastHeadingDiff;
  61. protected override event void Write(PawnStateWriter ctx)
  62. {
  63. super.Write(ctx);
  64. ctx.Write(m_fLastHeadingDiff);
  65. }
  66. protected override event void Read(PawnStateReader ctx)
  67. {
  68. super.Read(ctx);
  69. ctx.Read(m_fLastHeadingDiff);
  70. }
  71. };
  72. class DayZPlayerImplementMove : DayZPlayerMove
  73. {
  74. protected override event void Write(PawnMoveWriter ctx, PawnMove prev)
  75. {
  76. super.Write(ctx, prev);
  77. }
  78. protected override event void Read(PawnMoveReader ctx, PawnMove prev)
  79. {
  80. super.Read(ctx, prev);
  81. }
  82. };
  83. #endif
  84. class DayZPlayerImplement extends DayZPlayer
  85. {
  86. static const float DEFAULT_DYING_TIME = 2.5; //! how long does it take to full death screen [s]
  87. static const float DYING_PROGRESSION_TIME = 0.05; //! time step for gradual update of dead screen visibilibty up to full visbility [s]
  88. ref HumanMovementState m_MovementState = new HumanMovementState(); //!< cached ptr for movement state
  89. protected ref DayZPlayerImplementAiming m_AimingModel;
  90. protected ref DayZPlayerImplementMeleeCombat m_MeleeCombat;
  91. protected ref DayZPlayerMeleeFightLogic_LightHeavy m_MeleeFightLogic;
  92. protected ref DayZPlayerImplementSwimming m_Swimming;
  93. protected ref DayZPlayerImplementThrowing m_Throwing;
  94. protected ref DayZPlayerImplementJumpClimb m_JumpClimb;
  95. protected ref DayZPlayerImplementFallDamage m_FallDamage;
  96. protected ref PlayerSoundEventHandler m_PlayerSoundEventHandler;
  97. protected ref ReplaceSoundEventHandler m_ReplaceSoundEventHandler;
  98. protected SHumanCommandMoveSettings m_MoveSettings;
  99. protected float m_FallYDiff;
  100. protected float m_SprintedTime;
  101. protected float m_SprintedTimePerStanceMin;
  102. protected bool m_SprintFull;
  103. protected bool m_IsRaised;
  104. protected bool m_ShouldReload;
  105. protected bool m_Camera3rdPerson;
  106. protected bool m_CameraZoomToggle;
  107. protected bool m_bADS;
  108. private float m_WeaponRaiseTime; //! measures time from the weapon raise start to complete raise (once per)
  109. protected bool m_WeaponRaiseCompleted;
  110. protected ECameraZoomType m_CameraEyeZoomLevel;
  111. protected bool m_CameraIronsight; // Ironsight NOW!
  112. protected bool m_CameraOptics; // Optics NOW!
  113. protected bool m_CameraOpticsAimOverride; // for tracking if aim limit is currently overriden by optics
  114. protected float m_DeathDarkeningCurrentTime;
  115. protected bool m_IsTryingHoldBreath;
  116. protected bool m_IsShootingFromCamera;
  117. protected bool m_PlayerSelected;
  118. protected bool m_Suicide;
  119. protected bool m_IsUnconscious;
  120. protected bool m_ShouldBeUnconscious;
  121. protected bool m_IsUnconsciousFalling;
  122. bool m_UnconsciousDebug;
  123. protected int m_LastCommandBeforeUnconscious;
  124. ref WeaponDebug m_WeaponDebug;
  125. ref DeathEffectTimer m_DeathEffectTimer;
  126. ref Timer m_FightEndBlendTimer;
  127. protected bool m_ProcessFirearmMeleeHit;
  128. protected bool m_ContinueFirearmMelee;
  129. protected bool m_LiftWeapon_player;
  130. protected float m_ObstructWeapon_player;
  131. protected bool m_ProcessLiftWeapon;
  132. protected bool m_ProcessLiftWeaponState;
  133. protected float m_ProcessObstructWeapon;
  134. protected int m_LastSurfaceUnderHash;
  135. protected Transport m_TransportCache;
  136. protected string m_ClimbingLadderType;
  137. bool m_isFBsymptomPlaying;
  138. protected bool m_HandheldOpticsInUse;
  139. protected bool m_ResetADS;
  140. protected bool m_ProcessResetADS;
  141. protected int m_StepCounter;
  142. protected int m_NextVoNNoiseTime;
  143. protected ref array<ref SyncHitInfo> m_SyncedHitDataArray;
  144. protected ref array<AbstractWave> m_PerformedActionSounds;
  145. // aiming model helpers
  146. protected bool m_RaiseStarted = false;
  147. protected bool m_AimingFinisherStarted = false;
  148. protected bool m_IsWeapon;
  149. private float m_CurrentWaterLevel;
  150. bool m_WasInVehicle;
  151. protected bool m_TriggerPullPlayerOutOfVehicleSynch;
  152. protected bool m_PullPlayerOutOfVehicleKeepsInLocalSpace = false;
  153. protected int m_PullPlayerOutOfVehicleState = -1;
  154. int m_ActionSoundCategoryHash;
  155. protected float m_dT;
  156. protected float m_fObstructionSmooth;
  157. protected float m_fObstructionSmoothVelocity[1];
  158. //! constructor
  159. void DayZPlayerImplement()
  160. {
  161. SetEventMask(EntityEvent.CONTACT);
  162. m_SprintFull = false;
  163. m_SprintedTime = 0;
  164. m_SprintedTimePerStanceMin = PlayerConstants.FULL_SPRINT_DELAY_DEFAULT;
  165. m_AimingModel = new DayZPlayerImplementAiming(this);
  166. m_MeleeCombat = new DayZPlayerImplementMeleeCombat(this);
  167. m_MeleeFightLogic = new DayZPlayerMeleeFightLogic_LightHeavy(this);
  168. m_Swimming = new DayZPlayerImplementSwimming(this);
  169. m_Throwing = new DayZPlayerImplementThrowing(this);
  170. m_JumpClimb = new DayZPlayerImplementJumpClimb(this);
  171. m_FallDamage = new DayZPlayerImplementFallDamage(this);
  172. m_ADSAutomationTimer = new Timer();
  173. m_bADS = false;
  174. m_WeaponRaiseCompleted = false;
  175. SetOptics(false);
  176. m_IsShootingFromCamera = true;
  177. m_ProcessFirearmMeleeHit = false;
  178. m_ContinueFirearmMelee = false;
  179. #ifdef PLATFORM_CONSOLE
  180. m_Camera3rdPerson = !GetGame().GetWorld().Is3rdPersonDisabled();
  181. #endif
  182. m_LastSurfaceUnderHash = ("cp_gravel").Hash();
  183. m_NextVoNNoiseTime = 0;
  184. m_SyncedHitDataArray = new array<ref SyncHitInfo>;
  185. m_PerformedActionSounds = new array<AbstractWave>();
  186. m_CurrentWaterLevel = 0;
  187. m_WeaponRaiseTime = 0;
  188. RegisterNetSyncVariableBoolSignal("m_TriggerPullPlayerOutOfVehicleSynch");
  189. }
  190. #ifdef FEATURE_NETWORK_RECONCILIATION
  191. protected override event typename GetOwnerStateType()
  192. {
  193. return DayZPlayerImplementOwnerState;
  194. }
  195. protected override event typename GetMoveType()
  196. {
  197. return DayZPlayerImplementMove;
  198. }
  199. protected override event void ObtainState(/*inout*/ PawnOwnerState pState)
  200. {
  201. super.ObtainState(pState);
  202. DayZPlayerImplementOwnerState state = DayZPlayerImplementOwnerState.Cast(pState);
  203. state.m_fLastHeadingDiff = m_fLastHeadingDiff;
  204. }
  205. protected override event void RewindState(PawnOwnerState pState, /*inout*/ PawnMove pMove, inout NetworkRewindType pRewindType)
  206. {
  207. super.RewindState(pState, pMove, pRewindType);
  208. DayZPlayerImplementOwnerState state = DayZPlayerImplementOwnerState.Cast(pState);
  209. if (pRewindType != NetworkRewindType.ADDITIVE)
  210. {
  211. m_fLastHeadingDiff = state.m_fLastHeadingDiff;
  212. }
  213. }
  214. #endif
  215. DayZPlayerImplementAiming GetAimingModel()
  216. {
  217. return m_AimingModel;
  218. }
  219. DayZPlayerImplementMeleeCombat GetMeleeCombat()
  220. {
  221. return m_MeleeCombat;
  222. }
  223. DayZPlayerMeleeFightLogic_LightHeavy GetMeleeFightLogic()
  224. {
  225. return m_MeleeFightLogic;
  226. }
  227. DayZPlayerImplementThrowing GetThrowing()
  228. {
  229. return m_Throwing;
  230. }
  231. DayZPlayerImplementFallDamage GetFallDamage()
  232. {
  233. return m_FallDamage;
  234. }
  235. void ~DayZPlayerImplement()
  236. {
  237. }
  238. //! Legacy
  239. override bool IsEyeZoom()
  240. {
  241. return GetEyeZoomLevel() > 0;
  242. }
  243. override int GetEyeZoomLevel()
  244. {
  245. return m_CameraEyeZoomLevel;
  246. }
  247. override bool IsShootingFromCamera()
  248. {
  249. return m_IsShootingFromCamera;
  250. }
  251. void OverrideShootFromCamera(bool pState)
  252. {
  253. m_IsShootingFromCamera = pState;
  254. }
  255. bool IsInIronsights()
  256. {
  257. return m_CameraIronsight;
  258. }
  259. bool IsInOptics()
  260. {
  261. return m_CameraOptics;
  262. }
  263. override bool IsInThirdPerson()
  264. {
  265. return m_Camera3rdPerson;
  266. }
  267. void SetIsInThirdPerson(bool state)
  268. {
  269. m_Camera3rdPerson = state;
  270. }
  271. bool IsFireWeaponRaised()
  272. {
  273. GetMovementState(m_MovementState);
  274. if (m_MovementState)
  275. return m_MovementState.IsRaised();
  276. return false;
  277. }
  278. bool IsTryingHoldBreath()
  279. {
  280. return m_IsTryingHoldBreath;
  281. }
  282. bool IsSprintFull()
  283. {
  284. return m_SprintFull;
  285. }
  286. void ShowWeaponDebug(bool show)
  287. {
  288. if (show)
  289. {
  290. m_WeaponDebug = new WeaponDebug;
  291. }
  292. else
  293. {
  294. m_WeaponDebug = null;
  295. }
  296. }
  297. bool IsWeaponDebugEnabled()
  298. {
  299. return m_WeaponDebug != null;
  300. }
  301. void SetFallYDiff(float value)
  302. {
  303. m_FallYDiff = value;
  304. }
  305. override float GetCurrentWaterLevel()
  306. {
  307. return m_CurrentWaterLevel;
  308. }
  309. override void SetCurrentWaterLevel(float pWaterLevel)
  310. {
  311. m_CurrentWaterLevel = pWaterLevel;
  312. }
  313. void SetIronsights(bool value)
  314. {
  315. Weapon_Base weapon = Weapon_Base.Cast(GetHumanInventory().GetEntityInHands());
  316. if (weapon)
  317. weapon.SetWasIronSight(m_CameraIronsight);
  318. m_CameraIronsight = value;
  319. if (value)
  320. {
  321. HumanCommandWeapons hcw = GetCommandModifier_Weapons();
  322. if (hcw)
  323. hcw.SetADS(true);
  324. HumanInputController hic = GetInputController();
  325. if (hic)
  326. hic.ResetFreeLookToggle();
  327. }
  328. }
  329. void SetOptics(bool value)
  330. {
  331. m_CameraOptics = value;
  332. if (value)
  333. {
  334. HumanCommandWeapons hcw = GetCommandModifier_Weapons();
  335. if (hcw)
  336. hcw.SetADS(!IsHandheldOpticsInUse());
  337. HumanInputController hic = GetInputController();
  338. if (hic)
  339. hic.ResetFreeLookToggle();
  340. }
  341. }
  342. void ExitSights()
  343. {
  344. ItemOptics optics = null;
  345. EntityAI entityInHands = GetHumanInventory().GetEntityInHands();
  346. Weapon weapon = Weapon.Cast(entityInHands);
  347. if (weapon)
  348. {
  349. optics = weapon.GetAttachedOptics();
  350. }
  351. else
  352. {
  353. optics = ItemOptics.Cast(entityInHands);
  354. }
  355. SetIronsights(false);
  356. SetOptics(false);
  357. if (optics)
  358. {
  359. SwitchOptics(optics,false);
  360. }
  361. HumanCommandWeapons hcw = GetCommandModifier_Weapons();
  362. if (hcw)
  363. {
  364. hcw.SetADS(false);
  365. }
  366. }
  367. void SwitchOptics(ItemOptics optic, bool state)
  368. {
  369. if (optic && !optic.IsSightOnly())
  370. {
  371. if (state)
  372. {
  373. if (optic.HasEnergyManager())
  374. optic.GetCompEM().SwitchOn();
  375. optic.EnterOptics();
  376. optic.OnOpticEnter();
  377. }
  378. else
  379. {
  380. optic.ExitOptics();
  381. optic.OnOpticExit();
  382. if (optic.HasEnergyManager())
  383. optic.GetCompEM().SwitchOff();
  384. }
  385. }
  386. if (m_CameraOptics != state)
  387. {
  388. SetOptics(state);
  389. }
  390. }
  391. void SetClimbingLadderType(string value)
  392. {
  393. m_ClimbingLadderType = value;
  394. }
  395. //! Implementations only! - used on PlayerBase
  396. bool CanConsumeStamina(EStaminaConsumers consumer) {};
  397. bool CanStartConsumingStamina(EStaminaConsumers consumer) {};
  398. void DepleteStaminaEx(EStaminaModifiers modifier, float dT = -1, float coef = 1.0) {};
  399. bool IsInVehicle()
  400. {
  401. return m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_VEHICLE || (GetParent() != null && GetParent().IsInherited(Transport));
  402. }
  403. bool IsSwimming()
  404. {
  405. return m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_SWIM;
  406. }
  407. bool IsClimbingLadder()
  408. {
  409. return m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_LADDER;
  410. }
  411. //! Handle sound event by respective sound handler based on its type
  412. bool PlaySoundEventType(ESoundEventType soundType, int soundEventID, int param = 0) {};
  413. bool PlaySoundEvent(EPlayerSoundEventID id, bool from_anim_system = false, bool is_from_server = false) {};
  414. bool PlaySoundEventEx(EPlayerSoundEventID id, bool from_anim_system = false, bool is_from_server = false, int param = 0) {};
  415. bool IsFBSymptomPlaying()
  416. {
  417. return m_isFBsymptomPlaying;
  418. }
  419. float GetDeltaT()
  420. {
  421. return m_dT;
  422. }
  423. //-------------------------------------------------------------
  424. //!
  425. //! HandleDeath
  426. //!
  427. int m_DeathAnimType = -2;
  428. float m_DeathHitDir = 0;
  429. bool m_DeathJuctureSent = false;
  430. //! Get the transport that was cached when entering unconsciousness
  431. Transport GetTransportCache()
  432. {
  433. return m_TransportCache;
  434. }
  435. override string GetDebugText()
  436. {
  437. string text = super.GetDebugText();
  438. text += "Parent: " + Object.GetDebugName(Object.Cast(GetParent())) + "\n";//keep
  439. text += "IsSimulationDisabled: " + GetIsSimulationDisabled() + "\n";//keep
  440. /*
  441. text += "DamageDestroyed: " + IsDamageDestroyed() + "\n";
  442. text += "DeathProcessed: " + IsDeathProcessed() + "\n";
  443. text += "DeathConditionMet: " + IsDeathConditionMet() + "\n";
  444. text += "PullOutOfVehicleState: " + m_PullPlayerOutOfVehicleState + "\n";
  445. text += "PullOutOfVehicleSynch: " + m_TriggerPullPlayerOutOfVehicleSynch + "\n";
  446. text += "Position: " + GetPosition() + "\n";*/
  447. return text;
  448. }
  449. void TriggerPullPlayerOutOfVehicle()
  450. {
  451. if (!GetGame().IsServer())
  452. {
  453. return;
  454. }
  455. Transport transport;
  456. if (!Class.CastTo(transport, GetParent()))
  457. {
  458. return;
  459. }
  460. int crewIdx = -1;
  461. for (int i = 0; i < transport.CrewSize(); ++i)
  462. {
  463. if (transport.CrewMember(i) == this)
  464. {
  465. crewIdx = i;
  466. break;
  467. }
  468. }
  469. if (crewIdx == -1)
  470. {
  471. return;
  472. }
  473. transport.CrewGetOut(crewIdx);
  474. TriggerPullPlayerOutOfVehicleImpl();
  475. if (crewIdx == DayZPlayerConstants.VEHICLESEAT_DRIVER)
  476. {
  477. //! we don't want the vehicle to be haunted, re-possess the dead player so other players can use the vehicle
  478. #ifdef FEATURE_NETWORK_RECONCILIATION
  479. PlayerIdentity identity = GetIdentity();
  480. if (identity)
  481. {
  482. //! And now we want to resume control of the player
  483. identity.Possess(this);
  484. }
  485. #endif
  486. }
  487. SetSynchDirty();
  488. }
  489. void TriggerPullPlayerOutOfVehicleImpl()
  490. {
  491. //! Reset the cooldown so simulation doesn't automatically get re-disabled
  492. ResetDeathCooldown();
  493. //! Synced to re-enable simulation on client as the death processing sets disable simulation to local only
  494. DisableSimulation(false);
  495. switch (GetInstanceType())
  496. {
  497. case DayZPlayerInstanceType.INSTANCETYPE_SERVER:
  498. case DayZPlayerInstanceType.INSTANCETYPE_CLIENT: //! Handle own client animation freeze
  499. case DayZPlayerInstanceType.INSTANCETYPE_AI_SERVER:
  500. case DayZPlayerInstanceType.INSTANCETYPE_AI_SINGLEPLAYER:
  501. m_PullPlayerOutOfVehicleState = 0;
  502. m_TriggerPullPlayerOutOfVehicleSynch = true;
  503. break;
  504. }
  505. }
  506. override void OnVariablesSynchronized()
  507. {
  508. if (m_TriggerPullPlayerOutOfVehicleSynch && !GetGame().IsDedicatedServer())
  509. {
  510. TriggerPullPlayerOutOfVehicleImpl();
  511. }
  512. super.OnVariablesSynchronized();
  513. }
  514. bool HandleDeath(int pCurrentCommandID)
  515. {
  516. if (pCurrentCommandID == DayZPlayerConstants.COMMANDID_DEATH)
  517. {
  518. switch (m_PullPlayerOutOfVehicleState)
  519. {
  520. case -1:
  521. break;
  522. case 0:
  523. m_PullPlayerOutOfVehicleState = -1;
  524. PhysicsSetSolid(true);
  525. //! Can't pull a body out of a car that is in water, don't need to handle that
  526. DayZPlayerVehicleCommandDeathCallback callbackVeh;
  527. Class.CastTo(callbackVeh, StartCommand_Death(DayZPlayerConstants.DEATH_PULL_OUT_TRANSPORT, 0, DayZPlayerVehicleCommandDeathCallback, m_PullPlayerOutOfVehicleKeepsInLocalSpace));
  528. Class.CastTo(callbackVeh.m_pPlayer, this);
  529. break;
  530. }
  531. return true;
  532. }
  533. if (m_DeathAnimType != -2 && g_Game.GetMissionState() == g_Game.MISSION_STATE_GAME)
  534. {
  535. if (!CommitedSuicide())
  536. {
  537. int type = m_DeathAnimType;
  538. if (type == DayZPlayerConstants.DEATH_DEFAULT)
  539. type = GetTypeOfDeath(pCurrentCommandID);
  540. m_WasInVehicle = false;
  541. HumanCommandVehicle hcv = GetCommand_Vehicle();
  542. if (hcv)
  543. {
  544. m_TransportCache = hcv.GetTransport();
  545. m_WasInVehicle = !hcv.IsGettingIn() && !hcv.IsGettingOut();
  546. }
  547. int seatIndex = -1;
  548. if (m_TransportCache)
  549. {
  550. seatIndex = m_TransportCache.CrewMemberIndex(this);
  551. }
  552. //! player looks to be dead now, not unconscious
  553. m_ShouldBeUnconscious = false;
  554. bool keepInLocalSpace = m_PullPlayerOutOfVehicleKeepsInLocalSpace;
  555. if (m_TransportCache)
  556. {
  557. if (IsUnconscious() || m_WasInVehicle)
  558. {
  559. keepInLocalSpace = true;
  560. m_TransportCache.CrewDeath(seatIndex);
  561. }
  562. else
  563. {
  564. m_TransportCache.CrewGetOut(seatIndex);
  565. }
  566. m_TransportCache.MarkCrewMemberDead(seatIndex);
  567. if (seatIndex == DayZPlayerConstants.VEHICLESEAT_DRIVER)
  568. {
  569. //! we don't want the vehicle to be haunted, re-possess the dead player so other players can use the vehicle
  570. #ifdef FEATURE_NETWORK_RECONCILIATION
  571. PlayerIdentity identity = GetIdentity();
  572. if (identity)
  573. {
  574. //! And now we want to resume control of the player
  575. identity.Possess(this);
  576. }
  577. #endif
  578. }
  579. }
  580. DisableSimulation(false);
  581. GetItemAccessor().HideItemInHands(false);
  582. m_TransportCache = null;
  583. DayZPlayerCommandDeathCallback callback;
  584. Class.CastTo(callback, StartCommand_Death(type, m_DeathHitDir, DayZPlayerCommandDeathCallback, keepInLocalSpace));
  585. Class.CastTo(callback.m_pPlayer, this);
  586. }
  587. else
  588. {
  589. PhysicsSetRagdoll(true);
  590. }
  591. // disable voice communication
  592. GetGame().GetWorld().SetVoiceOn(false, false);
  593. return true;
  594. }
  595. return false;
  596. }
  597. void ResetDeathStartTime()
  598. {
  599. ResetDeathCooldown();
  600. }
  601. int GetTypeOfDeath(int pCurrentCommandID)
  602. {
  603. switch (pCurrentCommandID)
  604. {
  605. case DayZPlayerConstants.COMMANDID_SWIM:
  606. return DayZPlayerConstants.DEATH_WATER;
  607. case DayZPlayerConstants.COMMANDID_FALL:
  608. return DayZPlayerConstants.DEATH_FALL;
  609. case DayZPlayerConstants.COMMANDID_UNCONSCIOUS:
  610. HumanCommandUnconscious hcu = GetCommand_Unconscious();
  611. if (hcu)
  612. {
  613. if (hcu.IsOnLand())
  614. return DayZPlayerConstants.DEATH_UNCON_ON_LAND;
  615. if (hcu.IsInWater())
  616. return DayZPlayerConstants.DEATH_UNCON_IN_WATER;
  617. }
  618. break;
  619. }
  620. return DayZPlayerConstants.DEATH_BODY;
  621. }
  622. void SendDeathJuncture(int pAnimTypeDeath, float pAnimHitDirDeath)
  623. {
  624. if (m_DeathJuctureSent)
  625. return;
  626. DayZPlayerSyncJunctures.SendDeath(this, pAnimTypeDeath, pAnimHitDirDeath);
  627. m_DeathJuctureSent = true;
  628. }
  629. override void EEKilled(Object killer)
  630. {
  631. SendDeathJuncture(-1, 0);
  632. super.EEKilled(killer);
  633. }
  634. void ShowDeadScreen(bool show, float duration)
  635. {
  636. #ifndef NO_GUI
  637. if (show && IsPlayerSelected())
  638. {
  639. #ifdef PLATFORM_PS4
  640. OnlineServices.SetMultiplayState(false);
  641. #endif
  642. string message = "";
  643. if (!GetGame().GetMission().IsPlayerRespawning())
  644. {
  645. message = "#dayz_implement_dead";
  646. }
  647. #ifdef PLATFORM_CONSOLE
  648. GetGame().GetUIManager().ScreenFadeIn(duration, message, FadeColors.DARK_RED, FadeColors.WHITE);
  649. #else
  650. GetGame().GetUIManager().ScreenFadeIn(duration, message, FadeColors.BLACK, FadeColors.WHITE);
  651. #endif
  652. }
  653. else
  654. {
  655. GetGame().GetUIManager().ScreenFadeOut(duration);
  656. if (duration > 0)
  657. GetGame().GetCallQueue(CALL_CATEGORY_GUI).CallLater(StopDeathDarkeningEffect, duration*1000, false);
  658. else
  659. GetGame().GetCallQueue(CALL_CATEGORY_GUI).Call(StopDeathDarkeningEffect);
  660. }
  661. #endif
  662. }
  663. override void StopDeathDarkeningEffect()
  664. {
  665. if (m_DeathEffectTimer && m_DeathEffectTimer.IsRunning())
  666. {
  667. m_DeathEffectTimer.Stop();
  668. m_DeathEffectTimer = null;
  669. }
  670. }
  671. void SimulateDeath(bool state)
  672. {
  673. if (g_Game.GetMissionState() != DayZGame.MISSION_STATE_GAME)
  674. return;
  675. LockControls(state);
  676. if (state)
  677. {
  678. float duration = DEFAULT_DYING_TIME;
  679. if (m_KilledByHeadshot)
  680. {
  681. duration = 0;
  682. }
  683. if (duration > DYING_PROGRESSION_TIME && !m_IsUnconscious)
  684. {
  685. if (!m_DeathEffectTimer)
  686. m_DeathEffectTimer = new DeathEffectTimer();
  687. Param2<float,float> par = new Param2<float,float>(duration, DYING_PROGRESSION_TIME);
  688. m_DeathEffectTimer.Run(DYING_PROGRESSION_TIME, this, "SetDeathDarknessLevel", par, true);
  689. }
  690. ShowDeadScreen(state, duration);
  691. GetGame().GetSoundScene().SetSoundVolume(0,0);
  692. GetGame().GetSoundScene().SetSpeechExVolume(0,0);
  693. GetGame().GetSoundScene().SetMusicVolume(0,0);
  694. GetGame().GetSoundScene().SetVOIPVolume(0,0);
  695. GetGame().GetSoundScene().SetRadioVolume(0,0);
  696. }
  697. else
  698. {
  699. StopDeathDarkeningEffect();
  700. ShowDeadScreen(state, 0);
  701. }
  702. }
  703. void LockControls(bool state)
  704. {
  705. if (state == true)
  706. {
  707. GetGame().GetInput().ChangeGameFocus(1, INPUT_DEVICE_MOUSE);
  708. GetGame().GetInput().ChangeGameFocus(1, INPUT_DEVICE_KEYBOARD);
  709. GetGame().GetInput().ChangeGameFocus(1, INPUT_DEVICE_GAMEPAD);
  710. if (GetGame().GetUIManager())
  711. {
  712. GetGame().GetUIManager().ShowUICursor(true);
  713. if (GetGame().GetUIManager().IsDialogVisible())
  714. GetGame().GetUIManager().CloseDialog();
  715. }
  716. }
  717. else
  718. {
  719. GetGame().GetInput().ChangeGameFocus(-1, INPUT_DEVICE_MOUSE);
  720. GetGame().GetInput().ChangeGameFocus(-1, INPUT_DEVICE_KEYBOARD);
  721. GetGame().GetInput().ChangeGameFocus(-1, INPUT_DEVICE_GAMEPAD);
  722. if (GetGame().GetUIManager())
  723. {
  724. if (GetGame().GetUIManager().GetMenu())
  725. {
  726. GetGame().GetUIManager().ShowUICursor(true);
  727. }
  728. else
  729. {
  730. GetGame().GetUIManager().ShowUICursor(false);
  731. }
  732. }
  733. }
  734. }
  735. void SetDeathDarknessLevel(float duration, float tick_time);
  736. void CompleteWeaponRaise()
  737. {
  738. m_WeaponRaiseTime = 0;
  739. m_WeaponRaiseCompleted = true;
  740. HumanInputController hic = GetInputController();
  741. if (hic)
  742. hic.ResetFreeLookToggle();
  743. }
  744. void ResetWeaponRaiseProgress()
  745. {
  746. m_WeaponRaiseTime = 0;
  747. m_WeaponRaiseCompleted = false;
  748. }
  749. bool IsWeaponRaiseCompleted()
  750. {
  751. return m_WeaponRaiseCompleted;
  752. }
  753. DayZPlayerInventory GetDayZPlayerInventory()
  754. {
  755. DayZPlayerInventory inv = DayZPlayerInventory.Cast(GetInventory());
  756. return inv;
  757. }
  758. override void OnInputForRemote(ParamsReadContext ctx)
  759. {
  760. int userDataType = 0;
  761. if (!ctx.Read(userDataType))
  762. {
  763. Error("DayZPlayer: OnInputForRemote - cannot read input type");
  764. return;
  765. }
  766. switch (userDataType)
  767. {
  768. case INPUT_UDT_WEAPON_REMOTE_EVENT:
  769. GetDayZPlayerInventory().OnEventForRemoteWeapon(ctx);
  770. break;
  771. case INPUT_UDT_HAND_REMOTE_EVENT:
  772. GetDayZPlayerInventory().OnHandEventForRemote(ctx);
  773. break;
  774. case INPUT_UDT_INVENTORY:
  775. GetDayZPlayerInventory().OnInputUserDataForRemote(ctx);
  776. break;
  777. default:
  778. Error("OnInputForRemote - unknown userDataType=" + userDataType);
  779. break;
  780. }
  781. }
  782. override void OnInputFromServer (ParamsReadContext ctx)
  783. {
  784. int userDataType = 0;
  785. if (!ctx.Read(userDataType))
  786. {
  787. Error("DayZPlayer: OnInputFromServer - cannot read input type");
  788. return;
  789. }
  790. switch (userDataType)
  791. {
  792. case INPUT_UDT_INVENTORY:
  793. GetDayZPlayerInventory().OnServerInventoryCommand(ctx);
  794. break;
  795. default:
  796. Error("OnInputFromServer - unknown userDataType=" + userDataType);
  797. break;
  798. }
  799. }
  800. void RequestSoundEvent(EPlayerSoundEventID id, bool from_server_and_client = false);
  801. void RequestSoundEventEx(EPlayerSoundEventID id, bool from_server_and_client = false, int param = 0);
  802. protected void SendSoundEvent(EPlayerSoundEventID id);
  803. protected void SendSoundEventEx(EPlayerSoundEventID id, int param = 0);
  804. override void OnItemInHandsChanged()
  805. {
  806. //Print("inv: DayZPlayerImplement::OnItemInHandsChanged: "/* + GetHumanInventory().GetEntityInHands()*/);
  807. StopWeaponEvent();
  808. GetItemAccessor().OnItemInHandsChanged();
  809. if (!IsAlive())
  810. {
  811. //Print("inv: DayZPlayerImplement::OnItemInHandsChanged - human not alive! calling ResetWeaponInHands");
  812. GetItemAccessor().ResetWeaponInHands();
  813. }
  814. HumanInventoryWithFSM.Cast(GetHumanInventory()).CheckFSMState();
  815. }
  816. WeaponManager GetWeaponManager() { return null; }
  817. //-------------------------------------------------------------
  818. //!
  819. //! HandleWeapons
  820. //!
  821. void HandleWeapons(float pDt, Entity pInHands, HumanInputController pInputs, out bool pExitIronSights)
  822. {
  823. HumanCommandWeapons hcw = GetCommandModifier_Weapons();
  824. GetDayZPlayerInventory().HandleWeaponEvents(pDt, pExitIronSights);
  825. Weapon_Base weapon;
  826. Class.CastTo(weapon, pInHands);
  827. ItemOptics optic = weapon.GetAttachedOptics();
  828. CheckLiftWeapon();
  829. ProcessLiftWeapon();
  830. GetMovementState(m_MovementState);
  831. // obstruction
  832. bool wantedLift = m_LiftWeapon_player;
  833. bool currentLift = hcw.IsWeaponLifted();
  834. if (wantedLift != currentLift)
  835. {
  836. hcw.LiftWeapon(wantedLift);
  837. // Reset the velocity, cause at this point we might need to start moving in the opposite direction rather rapidly,
  838. // to prevent the obstruction from smashing the player's head while lifting
  839. m_fObstructionSmoothVelocity[0] = 0;
  840. }
  841. float wantedObstruction = m_ObstructWeapon_player;
  842. float currentObstruction = hcw.GetWeaponObstruction();
  843. if (wantedObstruction != currentObstruction)
  844. {
  845. // The following times are times chosen by observation; the following values produced
  846. // consistent and relatively nicely looking results and were OK'd by the animators.
  847. const float outTime = 0.150; // duration when smoothing hi -> lo
  848. const float inTime = 0.010; // duration when smoothing lo -> hi
  849. const float inTimeLift = 0.100; // duration when smoothing in during lift
  850. float smoothTime;
  851. if (wantedLift) // When lifting always transition rather quickly
  852. {
  853. wantedObstruction = 0.0;
  854. smoothTime = inTimeLift;
  855. }
  856. else // Otherwise we can take our time based on the delta
  857. {
  858. float t = Math.Clamp(Math.AbsFloat(wantedObstruction-currentObstruction), 0, 1);
  859. smoothTime = Math.Lerp(outTime, inTime, t);
  860. }
  861. // Do the interpolation and clamp to wanted value if the change is below certain threshold, to prevent uneccessary interpolation
  862. m_fObstructionSmooth = Math.SmoothCD(m_fObstructionSmooth, wantedObstruction, m_fObstructionSmoothVelocity, smoothTime, 6.0, pDt);
  863. if (Math.AbsFloat(m_fObstructionSmooth-wantedObstruction) < 0.0001)
  864. {
  865. m_fObstructionSmooth = wantedObstruction;
  866. }
  867. #ifdef DIAG_DEVELOPER
  868. if (DiagMenu.GetValue(DiagMenuIDs.WEAPON_DISABLE_OBSTRUCTION_INTERPOLATION))
  869. m_fObstructionSmooth = wantedObstruction;
  870. #endif
  871. hcw.ObstructWeapon(m_fObstructionSmooth);
  872. #ifndef SERVER
  873. #ifdef DIAG_DEVELOPER
  874. PluginDiagMenuClient.GetWeaponLiftDiag().Data().SetInterpolation( inTime, inTimeLift, outTime, smoothTime, m_fObstructionSmooth, currentObstruction, wantedObstruction );
  875. #endif
  876. #endif
  877. }
  878. // !obstruction
  879. // hold breath
  880. if (pInputs.IsHoldBreath() && m_MovementState.IsRaised() && (IsInIronsights() || IsInOptics()))
  881. {
  882. m_IsTryingHoldBreath = true;
  883. }
  884. else
  885. {
  886. m_IsTryingHoldBreath = false;
  887. }
  888. if (pInputs.IsFireModeChange())
  889. {
  890. GetWeaponManager().SetNextMuzzleMode();
  891. }
  892. if (pInputs.IsZeroingUp())
  893. {
  894. if (optic && (optic.IsInOptics() || optic.IsUsingWeaponIronsightsOverride()))
  895. {
  896. optic.StepZeroingUp();
  897. }
  898. else
  899. {
  900. weapon.StepZeroingUpAllMuzzles();
  901. }
  902. }
  903. if (pInputs.IsZeroingDown())
  904. {
  905. if (optic && (optic.IsInOptics() || optic.IsUsingWeaponIronsightsOverride()))
  906. {
  907. optic.StepZeroingDown();
  908. }
  909. else
  910. {
  911. weapon.StepZeroingDownAllMuzzles();
  912. }
  913. }
  914. if (!m_LiftWeapon_player && (m_CameraIronsight || !weapon.CanEnterIronsights() || m_CameraOptics/*m_ForceHandleOptics*/)) // HACK straight to optics, if ironsights not allowed
  915. {
  916. if (optic)
  917. HandleOptic(optic, false, pInputs, pExitIronSights);
  918. }
  919. if (!m_MovementState.IsRaised())
  920. {
  921. m_IsFireWeaponRaised = false; //legacy reasons
  922. if (weapon && weapon.IsInOptics())
  923. {
  924. weapon.ExitOptics();
  925. }
  926. ResetWeaponRaiseProgress();
  927. return; // if not raised => return
  928. }
  929. else
  930. {
  931. m_IsFireWeaponRaised = true; //legacy reasons
  932. if (!IsWeaponRaiseCompleted())
  933. {
  934. m_WeaponRaiseTime += pDt;
  935. }
  936. if (m_WeaponRaiseTime >= PlayerConstants.WEAPON_RAISE_BLEND_DELAY)
  937. {
  938. CompleteWeaponRaise();
  939. }
  940. }
  941. //! fire
  942. if (GetWeaponManager().CanFire(weapon))
  943. {
  944. bool autofire = weapon.GetCurrentModeAutoFire(weapon.GetCurrentMuzzle()) && weapon.IsChamberEjectable(weapon.GetCurrentMuzzle());
  945. int burst = weapon.GetCurrentModeBurstSize(weapon.GetCurrentMuzzle());
  946. int burst_count = weapon.GetBurstCount();
  947. if (!autofire && (burst < 2 || burst_count < 1))
  948. {
  949. if (pInputs.IsAttackButtonDown() && GetInputInterface().SyncedValue("UAWeaponMeleeAttack") == 0 && GetInputInterface().SyncedValue("UAHeavyMeleeAttack") == 0)
  950. {
  951. GetWeaponManager().Fire(weapon);
  952. }
  953. }
  954. else if (autofire || burst > 1)
  955. {
  956. #ifdef DIAG_DEVELOPER
  957. int burst_option = GetWeaponManager().GetBurstOption();
  958. if (burst_option == 0)
  959. {
  960. #endif
  961. if (pInputs.IsAttackButton() && GetInputInterface().SyncedValue("UAWeaponMeleeAttack") == 0 && GetInputInterface().SyncedValue("UAHeavyMeleeAttack") == 0)
  962. {
  963. if (autofire || burst_count < burst)
  964. {
  965. GetWeaponManager().Fire(weapon);
  966. }
  967. }
  968. else
  969. {
  970. weapon.ResetBurstCount();
  971. }
  972. #ifdef DIAG_DEVELOPER
  973. }
  974. else if (burst_option == 1)
  975. {
  976. if (burst > 1 && burst_count == burst)
  977. {
  978. weapon.ResetBurstCount();
  979. }
  980. else if (burst > 1 && burst_count < burst)
  981. {
  982. GetWeaponManager().Fire(weapon);
  983. }
  984. else
  985. {
  986. //Autofire
  987. if (pInputs.IsAttackButton())
  988. {
  989. GetWeaponManager().Fire(weapon);
  990. }
  991. }
  992. }
  993. #endif
  994. }
  995. }
  996. #ifdef PLATFORM_CONSOLE
  997. if (GetGame().GetInput().LocalRelease("UAFire", false) || m_ShouldReload)
  998. {
  999. if (!weapon.IsWaitingForActionFinish() && !IsFighting())
  1000. {
  1001. int muzzle_index = weapon.GetCurrentMuzzle();
  1002. if (weapon.IsChamberFiredOut(muzzle_index))
  1003. {
  1004. if (weapon.CanProcessWeaponEvents())
  1005. {
  1006. if (GetWeaponManager().CanEjectBullet(weapon))
  1007. {
  1008. GetWeaponManager().EjectBullet();
  1009. pExitIronSights = true;
  1010. m_ShouldReload = false;
  1011. }
  1012. }
  1013. }
  1014. }
  1015. else
  1016. {
  1017. m_ShouldReload = true;
  1018. }
  1019. }
  1020. #endif
  1021. }
  1022. void HandleOptic(notnull ItemOptics optic, bool inHands, HumanInputController pInputs, out bool pExitOptics)
  1023. {
  1024. UAInterface input = GetInputInterface();
  1025. if (!input)
  1026. {
  1027. return;
  1028. }
  1029. Weapon_Base weapon;
  1030. int FOVcount;
  1031. bool controllerPressIn;
  1032. bool controllerPressOut;
  1033. if (input.SyncedPress_ID(UAZoomInOptics))
  1034. {
  1035. weapon = Weapon_Base.Cast(optic.GetHierarchyParent());
  1036. FOVcount = optic.GetStepFOVCount();
  1037. controllerPressIn = input.SyncedPress_ID(UAZoomInOpticsControllerHelper);
  1038. if (weapon && m_CameraIronsight && !m_CameraOptics)
  1039. {
  1040. SetIronsights(false);
  1041. SwitchOptics(optic,true);
  1042. optic.SetStepFOVIndex(0);
  1043. }
  1044. else if (m_CameraOptics)
  1045. {
  1046. if (controllerPressIn) //controller
  1047. {
  1048. if (!optic.StepFOVUp())
  1049. {
  1050. if (FOVcount > 0)
  1051. {
  1052. optic.SetStepFOVIndex(0); //loop to minimum magnification
  1053. }
  1054. if (weapon && weapon.CanEnterIronsights()) //loop into ironsights
  1055. {
  1056. SwitchOptics(optic,false);
  1057. SetIronsights(true);
  1058. }
  1059. }
  1060. }
  1061. else //m&k
  1062. {
  1063. optic.StepFOVUp();
  1064. }
  1065. }
  1066. }
  1067. if (input.SyncedPress_ID(UAZoomOutOptics))
  1068. {
  1069. weapon = Weapon_Base.Cast(optic.GetHierarchyParent());
  1070. FOVcount = optic.GetStepFOVCount();
  1071. controllerPressOut = input.SyncedPress_ID(UAZoomOutOpticsControllerHelper);
  1072. if (m_CameraOptics)
  1073. {
  1074. if (!optic.StepFOVDown())
  1075. {
  1076. if (controllerPressOut)
  1077. {
  1078. if (FOVcount > 0 && (!weapon || !weapon.CanEnterIronsights()))
  1079. {
  1080. optic.SetStepFOVIndex(FOVcount - 1); //loop to maximum magnification
  1081. }
  1082. }
  1083. if (weapon && weapon.CanEnterIronsights())
  1084. {
  1085. SwitchOptics(optic,false);
  1086. SetIronsights(true);
  1087. }
  1088. }
  1089. }
  1090. else if (controllerPressOut && weapon && m_CameraIronsight)
  1091. {
  1092. SwitchOptics(optic,true);
  1093. if (FOVcount > 0)
  1094. {
  1095. optic.SetStepFOVIndex(FOVcount - 1); //loop to maximum magnification
  1096. }
  1097. }
  1098. }
  1099. }
  1100. //-------------------------------------------------------------
  1101. //!
  1102. //! HandleDamageHit
  1103. //!
  1104. bool m_DamageHitFullbody = false;
  1105. int m_DamageHitAnimType = -1.0;
  1106. float m_DamageHitDir = 0.0;
  1107. float m_DamageHealth = 0.0;
  1108. const float HIT_INTERVAL_MIN = 0.3; // Minimum time in seconds before a COMMANDID_HIT to COMMANDID_HIT transition is allowed
  1109. float m_HitElapsedTime = HIT_INTERVAL_MIN;
  1110. bool IsInFullbodyDamageAnimation()
  1111. {
  1112. return (m_DamageHitFullbody && m_DamageHitAnimType != -1) || GetCommand_Damage() != null;
  1113. }
  1114. //! Must be ran at the start of CommandHandler before Jump is triggered
  1115. void EvaluateDamageHit(int pCurrentCommandID)
  1116. {
  1117. //! Reset damage hit to prevent animation from playing unnecessarily when it is already cancelled out
  1118. m_DamageHitAnimType = -1;
  1119. if (!m_SyncedHitDataArray || m_SyncedHitDataArray.Count() == 0)
  1120. {
  1121. return;
  1122. }
  1123. //evaluate all hit data
  1124. SyncHitInfo data;
  1125. SyncHitInfo greatest_hit;
  1126. for (int i = 0; i < m_SyncedHitDataArray.Count(); i++)
  1127. {
  1128. data = m_SyncedHitDataArray[i];
  1129. m_DamageHitDir = data.m_HitDir;
  1130. //client-side effects
  1131. #ifndef SERVER
  1132. if (IsAlive() && !IsUnconscious() && data.m_HasSource && GetGame().GetMission().GetHud() && GetGame().GetPlayer() == this) //only for controlled players
  1133. {
  1134. m_DamageHealth = data.m_HealthDamage;
  1135. if (m_DamageHealth > 0.0)
  1136. {
  1137. float rel = m_DamageHealth / (GetMaxHealth("","Health") * PlayerConstants.HEAVY_HIT_THRESHOLD);
  1138. GetGame().GetMission().GetHud().SpawnHitDirEffect(this,m_DamageHitDir,rel);
  1139. }
  1140. }
  1141. #endif
  1142. if (!greatest_hit)
  1143. {
  1144. greatest_hit = data;
  1145. }
  1146. //else if (data.m_HealthDamage > greatest_hit.m_HealthDamage || (data.m_Fullbody && !greatest_hit.m_Fullbody)) //TODO - revisit cumulative calculation for animation evaluation purposes (stagger on shotgun to the chest)
  1147. else if (data.m_Fullbody) //temporary solution; last fullbody hit is used for animation purposes, some light hit otherwise
  1148. {
  1149. greatest_hit = data;
  1150. }
  1151. }
  1152. m_SyncedHitDataArray.Clear();
  1153. m_DamageHealth = 0.0;
  1154. //! ignore hit impacts in prone (for now)
  1155. if (m_MovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_PRONE || m_MovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDPRONE || IsUnconscious())
  1156. {
  1157. return;
  1158. }
  1159. //general effects
  1160. m_DamageHitFullbody = greatest_hit.m_Fullbody;
  1161. m_DamageHitAnimType = greatest_hit.m_AnimType;
  1162. m_DamageHitDir = greatest_hit.m_HitDir;
  1163. }
  1164. bool HandleDamageHit(int pCurrentCommandID)
  1165. {
  1166. // Update elapsed time since hit first
  1167. if ( pCurrentCommandID == DayZPlayerConstants.COMMANDID_DAMAGE )
  1168. {
  1169. // Throttle heavy hit command up to a fixed rate
  1170. if ( m_HitElapsedTime < HIT_INTERVAL_MIN )
  1171. {
  1172. m_HitElapsedTime += m_dT;
  1173. ResetDamageHitState(false);
  1174. return false;
  1175. }
  1176. }
  1177. // If transportcache is not null, player is unconscious inside of a car and should not head into a damage command
  1178. if (m_DamageHitAnimType != -1 && m_TransportCache == null && !CommitedSuicide())
  1179. {
  1180. HumanCommandVehicle vehCommand = GetCommand_Vehicle();
  1181. if (m_DamageHitFullbody && (!vehCommand || vehCommand.IsGettingIn() || vehCommand.IsGettingOut()))
  1182. {
  1183. StartCommand_Damage(m_DamageHitAnimType, m_DamageHitDir);
  1184. ResetDamageHitState(true);
  1185. return true;
  1186. }
  1187. else
  1188. {
  1189. AddCommandModifier_Damage(m_DamageHitAnimType, m_DamageHitDir);
  1190. ResetDamageHitState(false);
  1191. return false;
  1192. }
  1193. }
  1194. return pCurrentCommandID == DayZPlayerConstants.COMMANDID_DAMAGE;
  1195. }
  1196. void ResetDamageHitState(bool resetTimer)
  1197. {
  1198. m_DamageHitAnimType = -1;
  1199. m_DamageHitFullbody = false;
  1200. if (resetTimer)
  1201. {
  1202. m_HitElapsedTime = 0;
  1203. }
  1204. }
  1205. //! selects animation type and direction based on damage system data
  1206. bool EvaluateDeathAnimation(int pDamageType, EntityAI pSource, string pAmmoType, out int pAnimType, out float pAnimHitDir)
  1207. {
  1208. bool doPhxImpulse = GetGame().ConfigGetInt("cfgAmmo " + pAmmoType + " doPhxImpulse") > 0;
  1209. pAnimType = DayZPlayerConstants.DEATH_DEFAULT;
  1210. if (doPhxImpulse)
  1211. pAnimType = DayZPlayerConstants.DEATH_FAST;
  1212. //! direction
  1213. vector targetDirection = GetDirection();
  1214. vector toSourceDirection = (pSource.GetPosition() - GetPosition());
  1215. targetDirection[1] = 0;
  1216. toSourceDirection[1] = 0;
  1217. targetDirection.Normalize();
  1218. toSourceDirection.Normalize();
  1219. float cosFi = vector.Dot(targetDirection, toSourceDirection);
  1220. vector cross = targetDirection * toSourceDirection;
  1221. pAnimHitDir = Math.Acos(cosFi) * Math.RAD2DEG;
  1222. if (cross[1] < 0)
  1223. pAnimHitDir = -pAnimHitDir;
  1224. return true;
  1225. }
  1226. //! selects animation type and direction based on damage system data
  1227. bool EvaluateDamageHitAnimation(TotalDamageResult pDamageResult, int pDamageType, EntityAI pSource, string pComponent, string pAmmoType, vector pModelPos, out int pAnimType, out float pAnimHitDir, out bool pAnimHitFullbody)
  1228. {
  1229. int invertHitDir = 0; //Used to flip the heavy hit animation direction
  1230. pAnimType = 0;
  1231. pAnimHitFullbody = false; // additive anm
  1232. GetMovementState(m_MovementState);
  1233. switch (pDamageType)
  1234. {
  1235. case DamageType.CLOSE_COMBAT:
  1236. //! impact from infected attack will be light only
  1237. if (pSource.IsInherited(DayZInfected))
  1238. break;
  1239. pAnimType = GetGame().ConfigGetInt("cfgAmmo " + pAmmoType + " hitAnimation");
  1240. invertHitDir = GetGame().ConfigGetInt("cfgAmmo " + pAmmoType + " invertHitDir");
  1241. if (!IsUnconscious() && pAnimType == 1 && !m_MeleeFightLogic.IsInBlock())
  1242. pAnimHitFullbody = true;
  1243. break;
  1244. case DamageType.FIRE_ARM:
  1245. int impactBehaviour = 0;
  1246. if (!IsUnconscious() && GetHealth("", "Shock") > 25)
  1247. {
  1248. //! play full body when these coponents were hit
  1249. if (pComponent == "Torso" || pComponent == "Head")
  1250. {
  1251. impactBehaviour = GetGame().ConfigGetInt("cfgAmmo " + pAmmoType + " impactBehaviour");
  1252. float fireDamage = pDamageResult.GetHighestDamage("Health");
  1253. float shockDamage = pDamageResult.GetHighestDamage("Shock");
  1254. if ((fireDamage > 80.0 || shockDamage > 40.0) && impactBehaviour == 1)
  1255. pAnimHitFullbody = true;
  1256. }
  1257. }
  1258. break;
  1259. case DamageType.EXPLOSION:
  1260. break;
  1261. case DamageType.CUSTOM:
  1262. pAnimType = GetGame().ConfigGetInt("cfgAmmo " + pAmmoType + " hitAnimation");
  1263. if (pAnimType == 1)
  1264. pAnimHitFullbody = true;
  1265. else if (pAmmoType != "HeatDamage" || IsSwimming() || IsInVehicle())
  1266. return false; //! skip evaluation of dmg hit animation
  1267. break;
  1268. }
  1269. //! direction
  1270. vector targetDirection = GetDirection();
  1271. vector toSourceDirection = (pSource.GetPosition() - GetPosition());
  1272. targetDirection[1] = 0;
  1273. toSourceDirection[1] = 0;
  1274. targetDirection.Normalize();
  1275. toSourceDirection.Normalize();
  1276. float cosFi = vector.Dot(targetDirection, toSourceDirection);
  1277. vector cross = targetDirection * toSourceDirection;
  1278. pAnimHitDir = Math.Acos(cosFi) * Math.RAD2DEG;
  1279. // We will invert direction of the hit
  1280. if (invertHitDir > 0)
  1281. pAnimHitDir -= 180;
  1282. if (cross[1] < 0)
  1283. pAnimHitDir = -pAnimHitDir;
  1284. return true;
  1285. }
  1286. //! event from damage system
  1287. override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
  1288. {
  1289. super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
  1290. m_TransportHitRegistered = false;
  1291. if (!IsAlive())
  1292. {
  1293. int animTypeDeath;
  1294. float animHitDirDeath;
  1295. if (EvaluateDeathAnimation(damageType, source, ammo, animTypeDeath, animHitDirDeath))
  1296. {
  1297. SendDeathJuncture(animTypeDeath, animHitDirDeath);
  1298. }
  1299. if (!m_DeathSyncSent) //checked until the death is evaluated by 'OnCommandHandlerTick' higher up the road
  1300. {
  1301. Man killer = source.GetHierarchyRootPlayer();
  1302. if (!m_KillerData) //only one player is considered killer in the event of crossfire
  1303. {
  1304. m_KillerData = new KillerData();
  1305. m_KillerData.m_Killer = killer;
  1306. m_KillerData.m_MurderWeapon = source;
  1307. }
  1308. if (killer && killer.IsPlayer())
  1309. {
  1310. // was player killed by headshot?
  1311. if (dmgZone == "Brain")
  1312. {
  1313. m_KilledByHeadshot = true;
  1314. if (m_KillerData.m_Killer == killer)
  1315. m_KillerData.m_KillerHiTheBrain = true;
  1316. }
  1317. }
  1318. }
  1319. }
  1320. else
  1321. {
  1322. int animType;
  1323. float animHitDir;
  1324. bool animHitFullbody;
  1325. if (EvaluateDamageHitAnimation(damageResult, damageType, source, dmgZone, ammo, modelPos, animType, animHitDir, animHitFullbody))
  1326. DayZPlayerSyncJunctures.SendDamageHitEx(this, animType, animHitDir, animHitFullbody, damageResult, damageType, source, dmgZone, ammo, modelPos);
  1327. else
  1328. {
  1329. bool skipSoundRequest = false;
  1330. if (damageType == DamageType.CUSTOM && GetCommand_Fall())
  1331. skipSoundRequest = GetFallDamage().GetLandType() < HumanCommandFall.LANDTYPE_MEDIUM;
  1332. if (!skipSoundRequest)
  1333. RequestSoundEvent(EPlayerSoundEventID.TAKING_DMG_LIGHT);
  1334. }
  1335. }
  1336. // interupt melee for non-blocked hit or heavy hit
  1337. if (animHitFullbody)
  1338. {
  1339. HumanCommandMelee2 hcm = GetCommand_Melee2();
  1340. if (hcm)
  1341. hcm.Cancel();
  1342. }
  1343. }
  1344. //-------------------------------------------------------------
  1345. //!
  1346. //! This HeadingModel
  1347. //!
  1348. float m_fLastHeadingDiff = 0;
  1349. //! is replayed after correction when 'NetworkRewindType.REPLAY' is used
  1350. override bool HeadingModel(float pDt, SDayZPlayerHeadingModel pModel)
  1351. {
  1352. if (!IsAlive())
  1353. {
  1354. return false;
  1355. }
  1356. GetMovementState(m_MovementState);
  1357. //! on ladder - do nothing
  1358. if (m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_LADDER)
  1359. {
  1360. m_fLastHeadingDiff = 0;
  1361. return false;
  1362. }
  1363. if (m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_VEHICLE)
  1364. {
  1365. HumanCommandVehicle hmv = GetCommand_Vehicle();
  1366. if (hmv.IsGettingOut() || hmv.IsGettingIn())
  1367. {
  1368. return DayZPlayerImplementHeading.NoHeading(pDt, pModel, m_fLastHeadingDiff);
  1369. }
  1370. m_fLastHeadingDiff = 0;
  1371. return false;
  1372. }
  1373. if (m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_UNCONSCIOUS)
  1374. {
  1375. HumanCommandUnconscious hcu = GetCommand_Unconscious();
  1376. if (!hcu.IsWakingUp())
  1377. {
  1378. m_fLastHeadingDiff = 0;
  1379. //pModel.m_iCamMode = DayZPlayerConstants.CAMERAMODE_HEAD;
  1380. return false;
  1381. }
  1382. }
  1383. if (m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_CLIMB)
  1384. {
  1385. m_fLastHeadingDiff = 0;
  1386. return false;
  1387. }
  1388. #ifdef DEVELOPER
  1389. int actMenuValue = DiagMenu.GetEngineValue(DayZPlayerConstants.DEBUG_TURNSLIDE);
  1390. if (actMenuValue != 0)
  1391. {
  1392. //! this clamps heading
  1393. return DayZPlayerImplementHeading.ClampHeading(pDt, pModel, m_fLastHeadingDiff);
  1394. }
  1395. #endif
  1396. if (m_MovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDPRONE)
  1397. {
  1398. m_fLastHeadingDiff = 0;
  1399. return false;
  1400. }
  1401. //! if it's standing from prone on back
  1402. if (m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_MOVE)
  1403. {
  1404. HumanCommandMove hcm = GetCommand_Move();
  1405. if (hcm.IsStandingFromBack())
  1406. {
  1407. m_fLastHeadingDiff = 0;
  1408. return false;
  1409. }
  1410. }
  1411. HumanItemAccessor hia = GetItemAccessor();
  1412. HumanItemBehaviorCfg hibcfg = hia.GetItemInHandsBehaviourCfg();
  1413. if (hibcfg && hibcfg.m_StanceRotation[m_MovementState.m_iStanceIdx] == DayZPlayerConstants.ROTATION_DISABLE)
  1414. {
  1415. return DayZPlayerImplementHeading.NoHeading(pDt, pModel, m_fLastHeadingDiff);
  1416. }
  1417. if (IsUnconscious() || (GetCommand_Move() && GetCommand_Move().IsLeavingUncon()))
  1418. {
  1419. return DayZPlayerImplementHeading.NoHeading(pDt, pModel, m_fLastHeadingDiff);
  1420. }
  1421. return DayZPlayerImplementHeading.RotateOrient(pDt, pModel, m_fLastHeadingDiff);
  1422. }
  1423. //-------------------------------------------------------------
  1424. //!
  1425. //! This Aiming Model
  1426. //!
  1427. override bool AimingModel(float pDt, SDayZPlayerAimingModel pModel)
  1428. {
  1429. GetMovementState(m_MovementState);
  1430. if (m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_MELEE2)
  1431. {
  1432. HumanCommandMelee2 hcm = GetCommand_Melee2();
  1433. if (hcm.IsFinisher())
  1434. {
  1435. if (!m_AimingFinisherStarted)
  1436. {
  1437. m_AimingModel.OnFinisherBegin(pModel.m_fCurrentAimY);
  1438. m_AimingFinisherStarted = true;
  1439. }
  1440. m_AimingModel.ProcessStealthFilters(pDt, pModel);
  1441. }
  1442. return true;
  1443. }
  1444. if (m_MovementState.IsRaised())
  1445. {
  1446. if (!m_RaiseStarted)
  1447. {
  1448. m_AimingModel.OnRaiseBegin(this);
  1449. m_RaiseStarted = true;
  1450. }
  1451. m_AimingModel.ProcessAimFilters(pDt, pModel, m_MovementState.m_iStanceIdx);
  1452. return true;
  1453. }
  1454. m_RaiseStarted = false;
  1455. m_AimingFinisherStarted = false;
  1456. return true;
  1457. }
  1458. //-------------------------------------------------------------
  1459. //!
  1460. //! Jump / Climb
  1461. //!
  1462. //!
  1463. bool ProcessJumpOrClimb(float pDt, int pCurrentCommandID)
  1464. {
  1465. HumanInputController hic = GetInputController();
  1466. if (!hic || !hic.IsJumpClimb())
  1467. {
  1468. return false;
  1469. }
  1470. m_JumpClimb.JumpOrClimb();
  1471. if (!m_JumpClimb.WasSuccessful())
  1472. {
  1473. return false;
  1474. }
  1475. return true;
  1476. }
  1477. //!
  1478. bool CanJump()
  1479. {
  1480. if (IsFBSymptomPlaying() || IsRestrained() || IsUnconscious() || IsInFBEmoteState())
  1481. return false;
  1482. if (m_MovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_PRONE || m_MovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDPRONE)
  1483. return false;
  1484. if (IsRaised() && GetInputInterface().SyncedPress("UAGetOverControllerHelper")) //no raised jump on cotroller
  1485. {
  1486. return false;
  1487. }
  1488. HumanItemBehaviorCfg hibcfg = GetItemAccessor().GetItemInHandsBehaviourCfg();
  1489. if (!hibcfg.m_bJumpAllowed)
  1490. return false;
  1491. if (!DayZPlayerUtils.PlayerCanChangeStance(this, DayZPlayerConstants.STANCEIDX_ERECT) || !DayZPlayerUtils.PlayerCanChangeStance(this, DayZPlayerConstants.STANCEIDX_RAISEDERECT))
  1492. return false;
  1493. HumanCommandMove hcm = GetCommand_Move();
  1494. if (hcm)
  1495. {
  1496. if (hcm.IsChangingStance())
  1497. return false;
  1498. }
  1499. HumanCommandSwim hcs = GetCommand_Swim();
  1500. if (hcs)
  1501. {
  1502. return false;
  1503. }
  1504. return true;
  1505. }
  1506. bool CanClimb(int climbType, SHumanCommandClimbResult climbRes)
  1507. {
  1508. if (IsFBSymptomPlaying() || IsRestrained() || IsUnconscious() || IsInFBEmoteState())
  1509. return false;
  1510. if (m_MovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_PRONE || m_MovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDPRONE)
  1511. return false;
  1512. if (IsRaised() && GetInputInterface().SyncedPress("UAGetOverControllerHelper")) //no raised climb on cotroller
  1513. {
  1514. return false;
  1515. }
  1516. HumanItemBehaviorCfg hibcfg = GetItemAccessor().GetItemInHandsBehaviourCfg();
  1517. if (!hibcfg.m_bJumpAllowed)
  1518. return false;
  1519. if (climbRes)
  1520. {
  1521. EntityAI entity;
  1522. if (Class.CastTo(entity,climbRes.m_GrabPointParent) && entity.IsHologram())
  1523. return false;
  1524. if (Class.CastTo(entity,climbRes.m_ClimbStandPointParent) && entity.IsHologram())
  1525. return false;
  1526. if (Class.CastTo(entity,climbRes.m_ClimbOverStandPointParent) && entity.IsHologram())
  1527. return false;
  1528. }
  1529. return true;
  1530. }
  1531. void OnJumpStart()
  1532. {
  1533. }
  1534. void OnJumpEnd(int pLandType = 0)
  1535. {
  1536. }
  1537. void StopHandEvent()
  1538. {
  1539. GetDayZPlayerInventory().CancelHandEvent();
  1540. }
  1541. void StopWeaponEvent()
  1542. {
  1543. GetDayZPlayerInventory().CancelWeaponEvent();
  1544. }
  1545. void AbortWeaponEvent()
  1546. {
  1547. GetDayZPlayerInventory().AbortWeaponEvent();
  1548. }
  1549. //-------------------------------------------------------------
  1550. //!
  1551. //! This is main command logic
  1552. //!
  1553. void HandleADS()
  1554. {
  1555. if (!IsAlive())
  1556. {
  1557. if (m_CameraIronsight || m_CameraOptics)
  1558. {
  1559. ExitSights();
  1560. }
  1561. return;
  1562. }
  1563. bool bADSToggle = false;
  1564. bool exitSights = false;
  1565. HumanInputController hic = GetInputController();
  1566. HumanItemAccessor hia = GetItemAccessor();
  1567. HumanCommandWeapons hcw = GetCommandModifier_Weapons();
  1568. PlayerBase playerPB = PlayerBase.Cast(this);
  1569. GetMovementState(m_MovementState);
  1570. if (playerPB.IsRolling())
  1571. {
  1572. exitSights = true;
  1573. }
  1574. if (m_ResetADS || (!hia.IsItemInHandsWeapon() && hic.WeaponADS()))
  1575. {
  1576. hic.ResetADS();
  1577. m_ResetADS = false;
  1578. }
  1579. if (!m_MovementState.IsRaised() || m_LiftWeapon_player)
  1580. {
  1581. ResetWeaponRaiseProgress();
  1582. exitSights = true;
  1583. }
  1584. else
  1585. {
  1586. if (m_bADS != hic.WeaponADS())
  1587. {
  1588. m_bADS = hic.WeaponADS();
  1589. bADSToggle = true;
  1590. }
  1591. if (m_bADS && !m_CameraIronsight && !m_CameraOptics)
  1592. {
  1593. //!artificial Auto-ADS delay
  1594. if (!IsWeaponRaiseCompleted())
  1595. {
  1596. bADSToggle = false;
  1597. exitSights = true;
  1598. }
  1599. else
  1600. {
  1601. bADSToggle = true;
  1602. }
  1603. }
  1604. }
  1605. if (bADSToggle && !GetCommand_Melee2() && !GetThrowing().IsThrowingModeEnabled())
  1606. {
  1607. if (hia.IsItemInHandsWeapon() && playerPB.GetItemInHands() && playerPB.GetItemInHands().IsWeapon() && playerPB.GetWeaponManager() && !playerPB.GetWeaponManager().IsRunning())
  1608. {
  1609. Weapon_Base weapon = Weapon_Base.Cast(GetHumanInventory().GetEntityInHands());
  1610. ItemOptics optic = weapon.GetAttachedOptics();
  1611. bool switchToADS = false;
  1612. bool canUseIronsights = weapon.CanEnterIronsights();
  1613. bool canUseOptics = optic != NULL;
  1614. if (canUseIronsights || canUseOptics)
  1615. switchToADS = m_bADS;
  1616. // go to ironsights - disable ironsights when
  1617. //! if !raised
  1618. //! if sprinting
  1619. if (!m_MovementState.IsRaised() || m_MovementState.m_iMovement == DayZPlayerConstants.MOVEMENTIDX_SPRINT)
  1620. {
  1621. switchToADS = false;
  1622. }
  1623. // fixes camera switching during item transitions
  1624. if (IsLiftWeapon() || IsWeaponObstructionBlockingADS() || !IsRaised() || GetDayZPlayerInventory().IsProcessing() || !IsWeaponRaiseCompleted() || IsFighting())
  1625. {
  1626. exitSights = true;
  1627. }
  1628. else if (switchToADS) // enter ironsights or optics
  1629. {
  1630. // filter by usability
  1631. if (weapon.GetWasIronSight() && !canUseIronsights)
  1632. {
  1633. weapon.SetWasIronSight(false);
  1634. }
  1635. else if (!weapon.GetWasIronSight() && !canUseOptics)
  1636. {
  1637. weapon.SetWasIronSight(true);
  1638. }
  1639. if (weapon.GetWasIronSight())
  1640. {
  1641. SwitchOptics(optic,false);
  1642. SetIronsights(true);
  1643. }
  1644. else if (!weapon.GetWasIronSight() || (!canUseIronsights && canUseOptics))
  1645. {
  1646. SetIronsights(false);
  1647. SwitchOptics(optic,true);
  1648. }
  1649. else
  1650. {
  1651. exitSights = true;
  1652. }
  1653. if (hcw && (m_CameraOptics/* || m_CameraIronsight*/))
  1654. {
  1655. hcw.SetADS(true);
  1656. }
  1657. }
  1658. else
  1659. {
  1660. exitSights = true;
  1661. }
  1662. }
  1663. }
  1664. // leave ironsight and/ or optics
  1665. if (exitSights && !IsHandheldOpticsInUse() && (m_CameraIronsight || m_CameraOptics) || GetCommand_Melee2())
  1666. {
  1667. ExitSights();
  1668. }
  1669. }
  1670. void HandleView()
  1671. {
  1672. if (!IsAlive())
  1673. {
  1674. if (m_CameraIronsight || m_CameraOptics)
  1675. {
  1676. ExitSights();
  1677. }
  1678. return;
  1679. }
  1680. HumanInputController hic = GetInputController();
  1681. bool camChange = hic.CameraViewChanged();
  1682. if (IsRaised())
  1683. {
  1684. if (m_IsWeapon)
  1685. {
  1686. camChange = false;
  1687. }
  1688. }
  1689. //! 3rd person camera
  1690. if (GetGame().GetWorld().Is3rdPersonDisabled())
  1691. {
  1692. m_Camera3rdPerson = false;
  1693. }
  1694. else if (camChange)
  1695. {
  1696. m_Camera3rdPerson = !m_Camera3rdPerson;
  1697. }
  1698. // exits optics completely, comment to return to ADS
  1699. if ((m_LiftWeapon_player || IsWeaponObstructionBlockingADS()) && (m_CameraOptics || m_CameraIronsight))
  1700. ExitSights();
  1701. if (IsPlayerInStance(DayZPlayerConstants.STANCEMASK_RAISEDPRONE) && (m_CameraOptics || m_CameraIronsight))
  1702. {
  1703. SetVerticalMinimumAimLimit(DayZPlayerCameraIronsights.CONST_UD_MIN_BACK);
  1704. m_CameraOpticsAimOverride = true;
  1705. }
  1706. else if (m_CameraOpticsAimOverride)
  1707. {
  1708. SetVerticalMinimumAimLimit(DayZPlayerCameraIronsights.CONST_UD_MIN);
  1709. m_CameraOpticsAimOverride = false;
  1710. }
  1711. if (hic.IsZoomToggle() && !m_MovementState.IsRaised())
  1712. {
  1713. m_CameraEyeZoomLevel = ECameraZoomType.NORMAL;
  1714. if ((IsClimbingLadder() && Math.AbsInt(m_MovementState.m_iMovement) == 2) || (IsSwimming() && m_MovementState.m_iMovement == 3))
  1715. {
  1716. m_CameraEyeZoomLevel = ECameraZoomType.SHALLOW;
  1717. }
  1718. else if (!IsClimbingLadder() && !IsSwimming() && !IsInVehicle())
  1719. {
  1720. float pSpeed;
  1721. vector pLocalDirection;
  1722. hic.GetMovement(pSpeed ,pLocalDirection);
  1723. if (m_MovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_ERECT && pSpeed == 3)
  1724. {
  1725. m_CameraEyeZoomLevel = ECameraZoomType.SHALLOW;
  1726. }
  1727. }
  1728. }
  1729. else
  1730. {
  1731. m_CameraEyeZoomLevel = ECameraZoomType.NONE;
  1732. }
  1733. if (m_MovementState.IsRaisedInProne())
  1734. {
  1735. float headingAngle = MiscGameplayFunctions.GetHeadingAngle(this);
  1736. float headingAngleDiffBlock = Math.AbsFloat(m_LastHeadingAngleBlock - headingAngle);
  1737. float headingAngleDiffBlock2 = Math.AbsFloat(m_LastHeadingAngleBlock2 - headingAngle);
  1738. float headingAngleDiff = 0.0;
  1739. if (m_LastHeadingAngle * headingAngle < 0.0)
  1740. {
  1741. headingAngleDiff = Math.AbsFloat(m_LastHeadingAngle + headingAngle);
  1742. }
  1743. else
  1744. {
  1745. headingAngleDiff = Math.AbsFloat(m_LastHeadingAngle - headingAngle);
  1746. }
  1747. if (headingAngleDiff > 0.2)
  1748. {
  1749. int time = GetGame().GetTime();
  1750. float timefilterconstant = 400 - (headingAngleDiff * 100);
  1751. if (headingAngleDiffBlock > 0.8 && time - m_LastBackSoundTime > timefilterconstant)
  1752. {
  1753. float volume = headingAngleDiff / 0.5;
  1754. if (volume > 1)
  1755. {
  1756. volume = 1;
  1757. }
  1758. if (volume < 0.25)
  1759. {
  1760. volume = 0.25;
  1761. }
  1762. m_SoundOffset = headingAngleDiff / 2;
  1763. if (m_SoundOffset > 0.25)
  1764. {
  1765. m_SoundOffset = 0.25;
  1766. }
  1767. string soundSetName = "Cloth_Body_longmove_TShirt_Soundset";
  1768. string bodyClothName = "";
  1769. EntityAI attachment = GetInventory().FindAttachment(InventorySlots.BODY);
  1770. if (attachment)
  1771. {
  1772. bodyClothName = attachment.GetAttachmentSoundType();
  1773. }
  1774. if (bodyClothName != "")
  1775. {
  1776. string path = "CfgSoundTables CfgAttachmentSoundTables Cloth_Body_Longmove_LookupTable";
  1777. int soundCount = GetGame().ConfigGetChildrenCount(path);
  1778. for (int i = 0; i < soundCount; i++)
  1779. {
  1780. string name = "";
  1781. GetGame().ConfigGetChildName(path, i, name);
  1782. if (name == bodyClothName)
  1783. {
  1784. TStringArray stringArray = new TStringArray();
  1785. GetGame().ConfigGetTextArray(path + " " + name + " soundSets", stringArray);
  1786. soundSetName = stringArray.Get(0);
  1787. delete stringArray;
  1788. }
  1789. }
  1790. }
  1791. SoundParams soundParams = new SoundParams(soundSetName);
  1792. SoundObjectBuilder soundObjectBuilder = new SoundObjectBuilder(soundParams);
  1793. if (soundObjectBuilder != NULL)
  1794. {
  1795. SoundObject soundObject = soundObjectBuilder.BuildSoundObject();
  1796. if (soundObject != NULL)
  1797. {
  1798. soundObject.SetPosition(GetPosition());
  1799. AbstractWave wave = GetGame().GetSoundScene().Play3D(soundObject, soundObjectBuilder);
  1800. wave.SetStartOffset(m_SoundOffset);
  1801. wave.SetVolumeRelative(volume);
  1802. m_LastBackSoundTime = GetGame().GetTime();
  1803. m_LastHeadingAngleBlock = headingAngle;
  1804. }
  1805. }
  1806. }
  1807. if (headingAngleDiffBlock2 > 1.5 && time - m_LastBackSoundTime2 > (timefilterconstant * 2))
  1808. {
  1809. float volume2 = headingAngleDiff * 2;
  1810. if (volume2 > 1)
  1811. {
  1812. volume2 = 1;
  1813. }
  1814. m_SoundOffset = headingAngleDiff / 1.8;
  1815. if (m_SoundOffset < 0.1)
  1816. {
  1817. m_SoundOffset = 0.1;
  1818. }
  1819. if (m_SoundOffset > 0.3)
  1820. {
  1821. m_SoundOffset = 0.3;
  1822. }
  1823. string soundSetName2 = "walkProne_noHS_asphalt_ext_Char_SoundSet";
  1824. string surfaceType = GetSurfaceType();
  1825. if (surfaceType != "")
  1826. {
  1827. string movementSurfaceType = "walkProne_" + surfaceType;
  1828. string path2 = "CfgSoundTables CfgStepSoundTables walkProne_noHS_Char_LookupTable";
  1829. int soundCount2 = GetGame().ConfigGetChildrenCount(path2);
  1830. for (int i2 = 0; i2 < soundCount2; i2++)
  1831. {
  1832. string name2 = "";
  1833. GetGame().ConfigGetChildName(path2, i2, name2);
  1834. if (name2 == movementSurfaceType)
  1835. {
  1836. TStringArray stringArray2 = new TStringArray();
  1837. GetGame().ConfigGetTextArray(path2 + " " + name2 + " soundSets", stringArray2);
  1838. soundSetName2 = stringArray2.Get(0);
  1839. delete stringArray2;
  1840. }
  1841. }
  1842. }
  1843. SoundParams soundParams2 = new SoundParams(soundSetName2);
  1844. SoundObjectBuilder soundObjectBuilder2 = new SoundObjectBuilder(soundParams2);
  1845. if (soundObjectBuilder2 != NULL)
  1846. {
  1847. SoundObject soundObject2 = soundObjectBuilder2.BuildSoundObject();
  1848. if (soundObject2 != NULL)
  1849. {
  1850. soundObject2.SetPosition(GetPosition());
  1851. AbstractWave wave2 = GetGame().GetSoundScene().Play3D(soundObject2, soundObjectBuilder2);
  1852. wave2.SetStartOffset(m_SoundOffset);
  1853. wave2.SetVolumeRelative(volume2);
  1854. m_LastBackSoundTime2 = GetGame().GetTime();
  1855. m_LastHeadingAngleBlock2 = headingAngle;
  1856. }
  1857. }
  1858. }
  1859. m_LastHeadingAngle = headingAngle;
  1860. }
  1861. }
  1862. }
  1863. float m_LastHeadingAngleBlock;
  1864. float m_LastHeadingAngleBlock2;
  1865. float m_LastHeadingAngle;
  1866. int m_LastBackSoundTime;
  1867. int m_LastBackSoundTime2;
  1868. float m_SoundOffset;
  1869. //-------------------------------------------------------------
  1870. //!
  1871. //! ModOverrides
  1872. //!
  1873. // these functions are for modded overide in script command mods
  1874. bool ModCommandHandlerBefore(float pDt, int pCurrentCommandID, bool pCurrentCommandFinished)
  1875. {
  1876. return false;
  1877. }
  1878. bool ModCommandHandlerInside(float pDt, int pCurrentCommandID, bool pCurrentCommandFinished)
  1879. {
  1880. return false;
  1881. }
  1882. bool ModCommandHandlerAfter(float pDt, int pCurrentCommandID, bool pCurrentCommandFinished)
  1883. {
  1884. return false;
  1885. }
  1886. //-------------------------------------------------------------
  1887. //!
  1888. //! This is main command logic
  1889. //!
  1890. //!
  1891. override void CommandHandler(float pDt, int pCurrentCommandID, bool pCurrentCommandFinished)
  1892. {
  1893. m_dT = pDt;
  1894. vector playerPosition = PhysicsGetPositionWS();
  1895. GetDayZPlayerInventory().HandleInventory(pDt);
  1896. GetHumanInventory().Update(pDt);
  1897. if (ModCommandHandlerBefore(pDt, pCurrentCommandID, pCurrentCommandFinished))
  1898. {
  1899. return;
  1900. }
  1901. HumanInputController hic = GetInputController();
  1902. EntityAI entityInHands = GetHumanInventory().GetEntityInHands();
  1903. GetMovementState(m_MovementState);
  1904. bool isRaisedNow = m_MovementState.IsRaised();
  1905. bool isWeapon = entityInHands && entityInHands.IsInherited(Weapon);
  1906. bool updateAimingMdfr = false;
  1907. if (isWeapon != m_IsWeapon)
  1908. {
  1909. m_IsWeapon = isWeapon;
  1910. updateAimingMdfr = true;
  1911. }
  1912. if (isRaisedNow != m_IsRaised)
  1913. {
  1914. updateAimingMdfr = true;
  1915. m_IsRaised = m_MovementState.IsRaised();
  1916. }
  1917. if (updateAimingMdfr)
  1918. {
  1919. if (isRaisedNow && isWeapon)
  1920. GetUApi().ActivateModificator("aiming");
  1921. else
  1922. GetUApi().DeactivateModificator("aiming");
  1923. }
  1924. // handle ADS ironsights/optics transition logic
  1925. HandleADS();
  1926. // handle weapons
  1927. if (hic)
  1928. {
  1929. ItemOptics opticInHands = ItemOptics.Cast(entityInHands);
  1930. if (isWeapon && (!m_ProcessFirearmMeleeHit || !m_ContinueFirearmMelee))
  1931. {
  1932. m_ProcessFirearmMeleeHit = false;
  1933. bool exitIronSights = false;
  1934. HandleWeapons(pDt, entityInHands, hic, exitIronSights);
  1935. }
  1936. else if (IsHandheldOpticsInUse() && m_CameraOptics && opticInHands)
  1937. {
  1938. bool exitOptic = false;
  1939. HandleOptic(opticInHands, true, hic, exitOptic);
  1940. }
  1941. }
  1942. //! handle all Camera changes, switch + zoom
  1943. HandleView();
  1944. if (m_MovementState.m_iMovement != m_MovementState.m_LocalMovement)
  1945. {
  1946. OnMovementChanged();
  1947. m_MovementState.m_LocalMovement = m_MovementState.m_iMovement;
  1948. }
  1949. //! handle death with high priority
  1950. if (HandleDeath(pCurrentCommandID))
  1951. {
  1952. return;
  1953. }
  1954. //! check for water depth while getting out and start swimming if necessary
  1955. //! this also handles the last frame of the vehicle command hence it doens't need separate check on pCurrentCommandFinished
  1956. if ( pCurrentCommandID == DayZPlayerConstants.COMMANDID_VEHICLE )
  1957. {
  1958. HumanCommandVehicle cmdVehicle = GetCommand_Vehicle();
  1959. if ( cmdVehicle && cmdVehicle.IsGettingOut() )
  1960. {
  1961. vector waterLevel;
  1962. if ( m_Swimming.CheckSwimmingStart( waterLevel ) )
  1963. {
  1964. // not all the events may have been called as getting out could have occurred while under water
  1965. cmdVehicle.ProcessLeaveEvents();
  1966. StartCommand_Swim();
  1967. return;
  1968. }
  1969. }
  1970. }
  1971. //! handle finished commands
  1972. if (pCurrentCommandFinished)
  1973. {
  1974. if (pCurrentCommandID == DayZPlayerConstants.COMMANDID_UNCONSCIOUS)
  1975. {
  1976. if ((m_LastCommandBeforeUnconscious == DayZPlayerConstants.COMMANDID_VEHICLE) && (m_TransportCache != null))
  1977. {
  1978. int crew_index = m_TransportCache.CrewMemberIndex(this);
  1979. int seat = m_TransportCache.GetSeatAnimationType(crew_index);
  1980. StartCommand_Vehicle(m_TransportCache, crew_index, seat, true);
  1981. m_TransportCache = null;
  1982. return;
  1983. }
  1984. }
  1985. // start moving
  1986. // start falling ? (could happen after climbing)
  1987. if (PhysicsIsFalling(true))
  1988. {
  1989. StartCommand_Fall(0);
  1990. SetFallYDiff(playerPosition[1]);
  1991. return;
  1992. }
  1993. //! default behaviour after finish is to start move
  1994. if (m_Swimming.m_bWasSwimming)
  1995. {
  1996. StartCommand_Swim();
  1997. return;
  1998. }
  1999. StartCommand_Move();
  2000. if (GetHumanInventory().GetEntityInHands())
  2001. ForceStandUpForHeavyItems(GetHumanInventory().GetEntityInHands());
  2002. return;
  2003. }
  2004. //--------------------------------------------
  2005. //! debug test script command !PSOVIS
  2006. if (ModCommandHandlerInside(pDt, pCurrentCommandID, pCurrentCommandFinished))
  2007. {
  2008. return;
  2009. }
  2010. //--------------------------------------------
  2011. // vehicle handling
  2012. if (pCurrentCommandID == DayZPlayerConstants.COMMANDID_VEHICLE)
  2013. {
  2014. HumanCommandVehicle hcv = GetCommand_Vehicle();
  2015. if (hcv.WasGearChange())
  2016. {
  2017. GearChangeActionCallback cb = GearChangeActionCallback.Cast(AddCommandModifier_Action(DayZPlayerConstants.CMD_ACTIONMOD_SHIFTGEAR, GearChangeActionCallback));
  2018. cb.SetVehicleCommand(hcv);
  2019. }
  2020. return;
  2021. }
  2022. //! Sprint attack limiting - player has to be in full sprint for at least 0.5s
  2023. //--------------------------------------------
  2024. HumanCommandMove hcm = GetCommand_Move();
  2025. if (hcm && hcm.GetCurrentMovementSpeed() > 2.99 && m_MovementState.m_iMovement == DayZPlayerConstants.MOVEMENTIDX_SPRINT)
  2026. {
  2027. m_SprintedTime += pDt;
  2028. if (m_SprintedTime > m_SprintedTimePerStanceMin)
  2029. {
  2030. m_SprintFull = true;
  2031. m_SprintedTimePerStanceMin = PlayerConstants.FULL_SPRINT_DELAY_DEFAULT;
  2032. }
  2033. else
  2034. m_SprintFull = false;
  2035. }
  2036. else
  2037. {
  2038. m_SprintedTime = 0.0;
  2039. m_SprintFull = false;
  2040. }
  2041. //--------------------------------------------
  2042. // swimming handling
  2043. if (m_Swimming.HandleSwimming(pCurrentCommandID, hcm, m_MovementState))
  2044. {
  2045. if (ProcessJumpOrClimb(pDt, pCurrentCommandID))
  2046. {
  2047. return;
  2048. }
  2049. m_JumpClimb.CheckAndFinishJump();
  2050. return;
  2051. }
  2052. //--------------------------------------------
  2053. // ladder handling
  2054. if (pCurrentCommandID == DayZPlayerConstants.COMMANDID_LADDER)
  2055. {
  2056. OnLadder(pDt, m_MovementState);
  2057. return;
  2058. }
  2059. //--------------------------------------------
  2060. // climb handling
  2061. if (pCurrentCommandID == DayZPlayerConstants.COMMANDID_CLIMB)
  2062. {
  2063. return;
  2064. }
  2065. //--------------------------------------------
  2066. // fall handling
  2067. if (IsAlreadyInFallingCommand(pCurrentCommandID))
  2068. {
  2069. if (IsLanded(pCurrentCommandID))
  2070. {
  2071. DayZPlayerType type = GetDayZPlayerType();
  2072. NoiseParams npar;
  2073. FallDamageData fallDamageData = new FallDamageData();
  2074. fallDamageData.m_Height = m_FallYDiff - playerPosition[1];
  2075. // land
  2076. if (fallDamageData.m_Height < 0.5)
  2077. {
  2078. fallDamageData.m_LandType = HumanCommandFall.LANDTYPE_NONE;
  2079. OnLand(pCurrentCommandID, fallDamageData);
  2080. npar = type.GetNoiseParamsLandLight();
  2081. AddNoise(npar, NoiseAIEvaluate.GetNoiseReduction(GetGame().GetWeather()));
  2082. }
  2083. else if (fallDamageData.m_Height < 3.0)
  2084. {
  2085. if (m_MovementState.IsInProne() || m_MovementState.IsInRaisedProne())
  2086. fallDamageData.m_LandType = HumanCommandFall.LANDTYPE_NONE;
  2087. else
  2088. fallDamageData.m_LandType = HumanCommandFall.LANDTYPE_LIGHT;
  2089. OnLand(pCurrentCommandID, fallDamageData);
  2090. npar = type.GetNoiseParamsLandLight();
  2091. AddNoise(npar, NoiseAIEvaluate.GetNoiseReduction(GetGame().GetWeather()));
  2092. }
  2093. else if (fallDamageData.m_Height < 5.0)
  2094. {
  2095. fallDamageData.m_LandType = HumanCommandFall.LANDTYPE_MEDIUM;
  2096. OnLand(pCurrentCommandID, fallDamageData);
  2097. npar = type.GetNoiseParamsLandHeavy();
  2098. AddNoise(npar, NoiseAIEvaluate.GetNoiseReduction(GetGame().GetWeather()));
  2099. }
  2100. else
  2101. {
  2102. fallDamageData.m_LandType = HumanCommandFall.LANDTYPE_HEAVY;
  2103. OnLand(pCurrentCommandID, fallDamageData);
  2104. npar = type.GetNoiseParamsLandHeavy();
  2105. AddNoise(npar, NoiseAIEvaluate.GetNoiseReduction(GetGame().GetWeather()));
  2106. }
  2107. if (fallDamageData.m_Height >= DayZPlayerImplementFallDamage.HEALTH_HEIGHT_LOW && GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
  2108. {
  2109. OnPlayerRecievedHit();
  2110. }
  2111. m_FallDamage.HandleFallDamage(fallDamageData);
  2112. m_JumpClimb.CheckAndFinishJump(fallDamageData.m_LandType);
  2113. }
  2114. //! If we are not in fall command then something else is currently running and we can safely continue here, otherwise terminate here
  2115. if (pCurrentCommandID == DayZPlayerConstants.COMMANDID_FALL)
  2116. {
  2117. return;
  2118. }
  2119. }
  2120. else if (PhysicsIsFalling(false))
  2121. {
  2122. // Not in a falling command but the controller is falling, start default fall
  2123. StartCommand_Fall(0);
  2124. SetFallYDiff(playerPosition[1]);
  2125. return;
  2126. }
  2127. //--------------------------------------------
  2128. // handle jumping
  2129. #ifndef NO_GUI
  2130. #ifdef DEVELOPER
  2131. //! enable this later for everything
  2132. if (DiagMenu.GetEngineValue(DayZPlayerConstants.DEBUG_ENABLEJUMP))
  2133. {
  2134. SHumanCommandClimbSettings hcls = GetDayZPlayerType().CommandClimbSettingsW();
  2135. if (m_MovementState.m_iMovement != DayZPlayerConstants.MOVEMENTIDX_IDLE)
  2136. hcls.m_fFwMaxDistance = 3;
  2137. else
  2138. hcls.m_fFwMaxDistance = 1.2;
  2139. SHumanCommandClimbResult ret;
  2140. //! debug draw climb heuristics
  2141. HumanCommandClimb.DoClimbTest(this, ret, 0x3);
  2142. }
  2143. #endif
  2144. #endif
  2145. // start jump
  2146. if (ProcessJumpOrClimb(pDt, pCurrentCommandID))
  2147. {
  2148. return;
  2149. }
  2150. HumanCommandAdditives ad = GetCommandModifier_Additives();
  2151. bool force = false;
  2152. #ifndef NO_GUI
  2153. #ifdef DEVELOPER
  2154. //! force speaking for debug
  2155. force = DiagMenu.GetEngineValue(DayZPlayerConstants.DEBUG_ENABLETALKING);
  2156. #endif
  2157. #endif
  2158. float amplitude = IsPlayerSpeaking();
  2159. if (amplitude > 0.1 || force)
  2160. {
  2161. if (ad)
  2162. ad.SetTalking(true);
  2163. // add noises on server
  2164. if (GetGame().IsServer())
  2165. {
  2166. int now = GetGame().GetTime();
  2167. if (now >= m_NextVoNNoiseTime)
  2168. {
  2169. m_NextVoNNoiseTime = now + 1000;
  2170. int voiceLevel = GetGame().GetVoiceLevel(this);
  2171. DayZPlayerType pt = GetDayZPlayerType();
  2172. // add noise every second while talking
  2173. NoiseParams vonpar;
  2174. switch (voiceLevel)
  2175. {
  2176. case VoiceLevelWhisper:
  2177. vonpar = pt.GetNoiseParamsWhisper();
  2178. break;
  2179. case VoiceLevelTalk:
  2180. vonpar = pt.GetNoiseParamsTalk();
  2181. break;
  2182. case VoiceLevelShout:
  2183. vonpar = pt.GetNoiseParamsShout();
  2184. break;
  2185. }
  2186. AddNoise(vonpar, NoiseAIEvaluate.GetNoiseReduction(GetGame().GetWeather()));
  2187. }
  2188. }
  2189. }
  2190. else
  2191. {
  2192. if (ad)
  2193. ad.SetTalking(false);
  2194. }
  2195. //--------------------------------------------
  2196. // anything whats handled by InputController
  2197. //!
  2198. if (hic)
  2199. {
  2200. //! throwing handling
  2201. HumanCommandWeapons hcw = GetCommandModifier_Weapons();
  2202. m_Throwing.HandleThrowing(hic, hcw, entityInHands, pDt);
  2203. //! melee
  2204. if (m_MeleeFightLogic.CanFight())
  2205. {
  2206. if (m_MeleeFightLogic.HandleFightLogic(pCurrentCommandID, hic, entityInHands, m_MovementState, m_ContinueFirearmMelee))
  2207. {
  2208. m_ProcessFirearmMeleeHit = isWeapon && (hic.IsMeleeWeaponAttack() || m_ProcessFirearmMeleeHit) || m_ContinueFirearmMelee;
  2209. return;
  2210. }
  2211. }
  2212. }
  2213. //!
  2214. if (ModCommandHandlerAfter(pDt, pCurrentCommandID, pCurrentCommandFinished))
  2215. {
  2216. return;
  2217. }
  2218. }
  2219. void HideClothing(ItemOptics optic, bool state) {}
  2220. //-------------------------------------------------------------
  2221. //!
  2222. //! This is Debug functionality
  2223. //!
  2224. float m_TestDamageCounter = -1; //! VKOSTIK - tady dat 0 misto -1
  2225. float m_DebugDirectionVal = -180;
  2226. bool m_DebugTypeVal = false;
  2227. int m_DebugWeaponChangeStage = 0;
  2228. string m_DebugWeaponChangeItem;
  2229. int m_DebugWeaponChangeShowSlot;
  2230. //!
  2231. void CommandHandlerDebug(float pDt, int pCurrentCommandID, bool pCurrentCommandFinished)
  2232. {
  2233. if (GetPluginManager())
  2234. {
  2235. PluginDayzPlayerDebug playerDebug = PluginDayzPlayerDebug.Cast(GetPluginManager().GetPluginByType(PluginDayzPlayerDebug));
  2236. if (playerDebug)
  2237. {
  2238. playerDebug.CommandHandler();
  2239. //! debug handling of adding commands
  2240. if (m_DebugWeaponChangeStage == 0)
  2241. {
  2242. // debug weapon change
  2243. int hideSlot;
  2244. if (playerDebug.IsWeaponChange(m_DebugWeaponChangeItem, hideSlot, m_DebugWeaponChangeShowSlot))
  2245. {
  2246. //Print("Change Weapon started: " + m_DebugWeaponChangeItem + "," + hideSlot.ToString() + "," + m_DebugWeaponChangeShowSlot.ToString());
  2247. HumanCommandWeapons w = GetCommandModifier_Weapons();
  2248. w.StartAction(WeaponActions.HIDE, hideSlot);
  2249. m_DebugWeaponChangeStage = 1;
  2250. }
  2251. }
  2252. else if (m_DebugWeaponChangeStage == 1)
  2253. {
  2254. // wait for weapon hide to meet event
  2255. HumanCommandWeapons w2 = GetCommandModifier_Weapons();
  2256. if (w2 && w2.GetRunningAction() == WeaponActions.HIDE)
  2257. {
  2258. if (w2.IsEvent() == WeaponEvents.CHANGE_HIDE)
  2259. {
  2260. //! set item in hands
  2261. //Print("Change Weapon - hidden: ");
  2262. //! fuj
  2263. PlayerBase player = PlayerBase.Cast(this);
  2264. EntityAI item_in_hands = player.GetHumanInventory().GetEntityInHands();
  2265. if (item_in_hands != NULL && player.CanDropEntity(item_in_hands) && GetGame().GetPlayer().GetHumanInventory().CanRemoveEntityInHands())
  2266. {
  2267. player.PredictiveDropEntity(item_in_hands);
  2268. }
  2269. if (m_DebugWeaponChangeItem != "")
  2270. {
  2271. InventoryLocation dst = new InventoryLocation;
  2272. dst.SetHands(this, NULL);
  2273. EntityAI item = SpawnEntity(m_DebugWeaponChangeItem, dst,ECE_IN_INVENTORY,RF_DEFAULT);
  2274. }
  2275. //! start show
  2276. w2.StartAction(WeaponActions.SHOW, 3);
  2277. m_DebugWeaponChangeStage = 2;
  2278. }
  2279. }
  2280. }
  2281. else if (m_DebugWeaponChangeStage == 2)
  2282. {
  2283. HumanCommandWeapons w3 = GetCommandModifier_Weapons();
  2284. if (w3 && w3.IsActionFinished())
  2285. {
  2286. m_DebugWeaponChangeStage = 0;
  2287. }
  2288. }
  2289. }
  2290. }
  2291. //! damage test
  2292. if (m_TestDamageCounter >= 0)
  2293. {
  2294. if (m_TestDamageCounter > 3)
  2295. {
  2296. m_DebugDirectionVal = m_DebugDirectionVal + 90;
  2297. m_TestDamageCounter = 0;
  2298. if (m_DebugDirectionVal > 90)
  2299. {
  2300. m_DebugDirectionVal = -180;
  2301. m_DebugTypeVal = !m_DebugTypeVal;
  2302. }
  2303. if (m_DebugTypeVal)
  2304. {
  2305. AddCommandModifier_Damage(0, m_DebugDirectionVal); // starts light
  2306. }
  2307. else
  2308. {
  2309. StartCommand_Damage(0, m_DebugDirectionVal); // starts heavy (full body)
  2310. }
  2311. // 0.. types
  2312. // from: -180 back, -90 left, 0 front, 90 right, 180 back
  2313. //AddCommandModifier_Damage(0, directionVal); // starts light
  2314. //StartCommand_Damage(0, 0); // starts heavy (full body)
  2315. }
  2316. m_TestDamageCounter += pDt;
  2317. }
  2318. #ifndef NO_GUI
  2319. #ifdef DEVELOPER
  2320. // injury / exhaustion
  2321. {
  2322. HumanCommandAdditives ad = GetCommandModifier_Additives();
  2323. //! diag menu - injured
  2324. float v = DiagMenu.GetEngineRangeValue(DayZPlayerConstants.DEBUG_SHOWINJURY);
  2325. if (v > 0)
  2326. {
  2327. ad.SetInjured(v, true);
  2328. }
  2329. //! diag menu - injured
  2330. v = DiagMenu.GetEngineRangeValue(DayZPlayerConstants.DEBUG_SHOWEXHAUSTION);
  2331. if (v > 0)
  2332. {
  2333. ad.SetExhaustion(v, true);
  2334. }
  2335. }
  2336. #endif
  2337. #endif
  2338. }
  2339. //-------------------------------------------------------------
  2340. //!
  2341. //! This is main camera selection logic
  2342. //!
  2343. override int CameraHandler(int pCameraMode)
  2344. {
  2345. //! ironsights
  2346. if (!m_LiftWeapon_player && !IsWeaponObstructionBlockingADS())
  2347. {
  2348. ItemOptics optics = null;
  2349. EntityAI entityInHands = GetHumanInventory().GetEntityInHands();
  2350. Weapon weapon = Weapon.Cast(entityInHands);
  2351. if (weapon)
  2352. optics = weapon.GetAttachedOptics();
  2353. else if (entityInHands)
  2354. Class.CastTo(optics,entityInHands);
  2355. if (m_CameraOptics && optics)
  2356. {
  2357. return DayZPlayerCameras.DAYZCAMERA_OPTICS;
  2358. }
  2359. else if (m_CameraIronsight && weapon)
  2360. {
  2361. return DayZPlayerCameras.DAYZCAMERA_IRONSIGHTS;
  2362. }
  2363. }
  2364. // If the logic above doesn't reach optics nor ironsights camera,
  2365. // yet weapon is still raised and ads is wanted, enforce 1pv camera
  2366. // as this will reduce erratic behaviour of camera switching in 3pv
  2367. HumanInputController hic = GetInputController();
  2368. if (m_Camera3rdPerson && m_IsWeapon && m_IsRaised && hic && hic.WeaponADS())
  2369. {
  2370. return DayZPlayerCameras.DAYZCAMERA_1ST;
  2371. }
  2372. //uncon
  2373. if ( GetCurrentCommandID() == DayZPlayerConstants.COMMANDID_UNCONSCIOUS )
  2374. {
  2375. return DayZPlayerCameras.DAYZCAMERA_1ST_UNCONSCIOUS;
  2376. }
  2377. HumanCommandVehicle vehicleCommand = GetCommand_Vehicle();
  2378. if (!m_Camera3rdPerson)
  2379. {
  2380. if (vehicleCommand)
  2381. {
  2382. return DayZPlayerCameras.DAYZCAMERA_1ST_VEHICLE;
  2383. }
  2384. return DayZPlayerCameras.DAYZCAMERA_1ST;
  2385. }
  2386. else
  2387. {
  2388. if (vehicleCommand)
  2389. {
  2390. Transport transport = vehicleCommand.GetTransport();
  2391. if (transport && GetParent())
  2392. {
  2393. return transport.Get3rdPersonCameraType();
  2394. }
  2395. }
  2396. //! get movement state
  2397. GetMovementState(m_MovementState);
  2398. //! VKOSTIK: v ostatnich commandech mimo COMMANDID_MOVE je
  2399. //! m_MovementState.m_iStanceIdx - DayZPlayerConstants.STANCEIDX_ERECT
  2400. //! m_MovementState.m_iMovement = 0 (idle)
  2401. //! COMMANDID_ACTION returns stance right - ERECT/CROUCH
  2402. //! melee camera - not melee - stays in stance camera
  2403. if (m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_CLIMB)
  2404. {
  2405. return DayZPlayerCameras.DAYZCAMERA_3RD_CLIMB;
  2406. }
  2407. if (m_JumpClimb.m_bIsJumpInProgress)
  2408. {
  2409. return DayZPlayerCameras.DAYZCAMERA_3RD_JUMP;
  2410. }
  2411. int targetStanceIndex = m_MovementState.m_iStanceIdx;
  2412. //! special handling to allow the camera to fully blend before transitioning to the raised one
  2413. HumanCommandMove commandMove = GetCommand_Move();
  2414. if (commandMove && commandMove.IsChangingStance() && m_MovementState.IsRaised())
  2415. {
  2416. targetStanceIndex = m_MovementState.m_iStanceIdx - DayZPlayerConstants.STANCEIDX_RAISED;
  2417. }
  2418. //
  2419. // normal movement cameras
  2420. if (targetStanceIndex == DayZPlayerConstants.STANCEIDX_CROUCH)
  2421. {
  2422. return DayZPlayerCameras.DAYZCAMERA_3RD_CRO;
  2423. }
  2424. else if (targetStanceIndex == DayZPlayerConstants.STANCEIDX_RAISEDCROUCH)
  2425. {
  2426. return DayZPlayerCameras.DAYZCAMERA_3RD_CRO_RAISED;
  2427. }
  2428. else if (targetStanceIndex == DayZPlayerConstants.STANCEIDX_PRONE)
  2429. {
  2430. return DayZPlayerCameras.DAYZCAMERA_3RD_PRO;
  2431. }
  2432. else if (targetStanceIndex == DayZPlayerConstants.STANCEIDX_RAISEDPRONE)
  2433. {
  2434. return DayZPlayerCameras.DAYZCAMERA_3RD_PRO_RAISED;
  2435. }
  2436. if (targetStanceIndex == DayZPlayerConstants.STANCEIDX_RAISEDERECT)
  2437. {
  2438. if (m_IsWeapon)
  2439. {
  2440. return DayZPlayerCameras.DAYZCAMERA_3RD_ERC_RAISED;
  2441. }
  2442. else
  2443. {
  2444. return DayZPlayerCameras.DAYZCAMERA_3RD_ERC_RAISED_MELEE;
  2445. }
  2446. }
  2447. else if (targetStanceIndex == DayZPlayerConstants.MOVEMENTIDX_SPRINT)
  2448. {
  2449. return DayZPlayerCameras.DAYZCAMERA_3RD_ERC_SPR;
  2450. }
  2451. // DayZPlayerConstants.STANCEIDX_ERECT
  2452. return DayZPlayerCameras.DAYZCAMERA_3RD_ERC;
  2453. }
  2454. return DayZPlayerCameras.DAYZCAMERA_1ST;
  2455. }
  2456. //! Event, called when HumanMovementState.m_iMovement changes...walk, run, sprint, etc..
  2457. void OnMovementChanged()//(int state_old, int state_new)
  2458. {
  2459. switch (m_MovementState.m_LocalMovement)
  2460. {
  2461. case DayZPlayerConstants.MOVEMENTIDX_CROUCH_RUN:
  2462. {
  2463. //OnCrouchRunEnd();
  2464. break;
  2465. }
  2466. case DayZPlayerConstants.MOVEMENTIDX_SPRINT:
  2467. {
  2468. OnSprintEnd();
  2469. break;
  2470. }
  2471. case DayZPlayerConstants.MOVEMENTIDX_RUN:
  2472. {
  2473. //OnRunEnd();
  2474. break;
  2475. }
  2476. case DayZPlayerConstants.MOVEMENTIDX_WALK:
  2477. {
  2478. //OnWalkEnd();
  2479. break;
  2480. }
  2481. case DayZPlayerConstants.MOVEMENTIDX_IDLE:
  2482. {
  2483. //OnIdleEnd();
  2484. break;
  2485. }
  2486. case DayZPlayerConstants.MOVEMENTIDX_SLIDE:
  2487. {
  2488. //OnSlideEnd();
  2489. break;
  2490. }
  2491. }
  2492. switch (m_MovementState.m_iMovement)
  2493. {
  2494. case DayZPlayerConstants.MOVEMENTIDX_CROUCH_RUN:
  2495. {
  2496. //OnCrouchRunStart();
  2497. break;
  2498. }
  2499. case DayZPlayerConstants.MOVEMENTIDX_SPRINT:
  2500. {
  2501. OnSprintStart();
  2502. break;
  2503. }
  2504. case DayZPlayerConstants.MOVEMENTIDX_RUN:
  2505. {
  2506. //OnRunStart();
  2507. break;
  2508. }
  2509. case DayZPlayerConstants.MOVEMENTIDX_WALK:
  2510. {
  2511. //OnWalkStart();
  2512. break;
  2513. }
  2514. case DayZPlayerConstants.MOVEMENTIDX_IDLE:
  2515. {
  2516. //OnIdleStart();
  2517. break;
  2518. }
  2519. case DayZPlayerConstants.MOVEMENTIDX_SLIDE:
  2520. {
  2521. //OnSlideStart();
  2522. break;
  2523. }
  2524. }
  2525. }
  2526. void OnSprintStart()
  2527. {
  2528. if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
  2529. {
  2530. GetUApi().GetInputByID(UALeanLeft).Lock();
  2531. GetUApi().GetInputByID(UALeanRight).Lock();
  2532. }
  2533. }
  2534. void OnSprintEnd()
  2535. {
  2536. if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
  2537. {
  2538. #ifdef PLATFORM_CONSOLE
  2539. if (GetUApi().GetInputByID(UAVoiceModifierHelper).LocalValue() == 0)
  2540. #endif
  2541. {
  2542. GetUApi().GetInputByID(UALeanLeft).Unlock();
  2543. GetUApi().GetInputByID(UALeanRight).Unlock();
  2544. }
  2545. }
  2546. }
  2547. //-------------------------------------------------------------
  2548. //!
  2549. //! Input userdata
  2550. //!
  2551. void OnInputUserDataReceived(ParamsReadContext ctx)
  2552. {
  2553. int userDataTypeParam = 0;
  2554. if (!ctx.Read(userDataTypeParam))
  2555. {
  2556. Error("DayZPlayerImplement: cannot read input type");
  2557. return;
  2558. }
  2559. OnInputUserDataProcess(userDataTypeParam, ctx);
  2560. }
  2561. bool OnInputUserDataProcess(int userDataType, ParamsReadContext ctx)
  2562. {
  2563. m_MeleeCombat.SetTargetObject(null);
  2564. m_MeleeCombat.SetHitPos(vector.Zero);
  2565. m_MeleeCombat.SetHitZoneIdx(-1);
  2566. m_MeleeCombat.SetFinisherType(-1);
  2567. if (userDataType == INPUT_UDT_MELEE_TARGET)
  2568. {
  2569. EntityAI target = null;
  2570. if (ctx.Read(target))
  2571. {
  2572. m_MeleeCombat.SetTargetObject(target);
  2573. }
  2574. vector hitPos = vector.Zero;
  2575. if (ctx.Read(hitPos))
  2576. {
  2577. m_MeleeCombat.SetHitPos(hitPos);
  2578. }
  2579. int hitZoneIdx = -1;
  2580. if (ctx.Read(hitZoneIdx))
  2581. {
  2582. m_MeleeCombat.SetHitZoneIdx(hitZoneIdx);
  2583. }
  2584. int finisherType = -1;
  2585. if (ctx.Read(finisherType))
  2586. {
  2587. m_MeleeCombat.SetFinisherType(finisherType);
  2588. }
  2589. return true;
  2590. }
  2591. return false;
  2592. }
  2593. //-------------------------------------------------------------
  2594. //!
  2595. //! SyncJunctures
  2596. //!
  2597. void OnSyncJuncture(int pJunctureID, ParamsReadContext pCtx)
  2598. {
  2599. switch (pJunctureID)
  2600. {
  2601. case DayZPlayerSyncJunctures.SJ_DEATH:
  2602. if (m_DeathAnimType == -2)
  2603. DayZPlayerSyncJunctures.ReadDeathParams(pCtx, m_DeathAnimType, m_DeathHitDir);
  2604. break;
  2605. case DayZPlayerSyncJunctures.SJ_DAMAGE_HIT:
  2606. SyncHitInfo data = new SyncHitInfo;
  2607. if (DayZPlayerSyncJunctures.ReadDamageHitParamsEx(pCtx, data) && data != null)
  2608. {
  2609. m_SyncedHitDataArray.Insert(data);
  2610. }
  2611. break;
  2612. }
  2613. }
  2614. AnimBootsType GetBootsType()
  2615. {
  2616. EntityAI boots = GetInventory().FindAttachment(InventorySlots.FEET);
  2617. if (boots)
  2618. {
  2619. switch (boots.GetAttachmentSoundType())
  2620. {
  2621. case "Sneakers":
  2622. return AnimBootsType.Sneakers;
  2623. case "Boots":
  2624. return AnimBootsType.Boots;
  2625. }
  2626. }
  2627. return AnimBootsType.None;
  2628. }
  2629. //Get top body clothes
  2630. AnimUpperBodyType GetBodyAttachmentType()
  2631. {
  2632. EntityAI attachment = GetInventory().FindAttachment(InventorySlots.BODY);
  2633. if (attachment)
  2634. {
  2635. switch (attachment.GetAttachmentSoundType())
  2636. {
  2637. case "NylonJacket":
  2638. return AnimUpperBodyType.NylonJacket;
  2639. case "TShirt":
  2640. return AnimUpperBodyType.TShirt;
  2641. case "WoolShirt":
  2642. return AnimUpperBodyType.WoolShirt;
  2643. case "HeavyJacket":
  2644. return AnimUpperBodyType.HeavyJacket;
  2645. case "LeatherJacket":
  2646. return AnimUpperBodyType.LeatherJacket;
  2647. case "Coat":
  2648. return AnimUpperBodyType.Coat;
  2649. case "ChemlonDress":
  2650. return AnimUpperBodyType.ChemlonDress;
  2651. case "Ghillie":
  2652. return AnimUpperBodyType.Ghillie;
  2653. case "Chainmail":
  2654. return AnimUpperBodyType.Chainmail;
  2655. }
  2656. }
  2657. return AnimUpperBodyType.None;
  2658. }
  2659. AnimBackType GetBackAttachmentType()
  2660. {
  2661. EntityAI back = GetInventory().FindAttachment(InventorySlots.BACK);
  2662. if (back)
  2663. {
  2664. switch (back.GetAttachmentSoundType())
  2665. {
  2666. case "Small":
  2667. return AnimBackType.Small;
  2668. case "Military":
  2669. return AnimBackType.Military;
  2670. case "Outdoor":
  2671. return AnimBackType.Outdoor;
  2672. case "Ghillie":
  2673. return AnimBackType.Ghillie;
  2674. }
  2675. }
  2676. return AnimBackType.None;
  2677. }
  2678. //Get weapon on back
  2679. AnimRangedWeaponType GetShoulderAttachmentType()
  2680. {
  2681. EntityAI shoulderAttachment = GetInventory().FindAttachment(InventorySlots.SHOULDER);
  2682. EntityAI meleeAttachment = GetInventory().FindAttachment(InventorySlots.MELEE);
  2683. AnimRangedWeaponType shoulderAttType = AnimRangedWeaponType.None;
  2684. AnimRangedWeaponType meleeAttType = AnimRangedWeaponType.None;
  2685. if (shoulderAttachment)
  2686. {
  2687. switch (shoulderAttachment.GetAttachmentSoundType())
  2688. {
  2689. case "Shotgun":
  2690. {
  2691. shoulderAttType = AnimRangedWeaponType.Shotgun;
  2692. break;
  2693. }
  2694. case "Rifle":
  2695. {
  2696. shoulderAttType = AnimRangedWeaponType.Rifle;
  2697. break;
  2698. }
  2699. }
  2700. }
  2701. if (meleeAttachment)
  2702. {
  2703. switch (meleeAttachment.GetAttachmentSoundType())
  2704. {
  2705. case "Shotgun":
  2706. {
  2707. meleeAttType = AnimRangedWeaponType.Shotgun;
  2708. break;
  2709. }
  2710. case "Rifle":
  2711. {
  2712. meleeAttType = AnimRangedWeaponType.Rifle;
  2713. break;
  2714. }
  2715. }
  2716. }
  2717. if (shoulderAttType == AnimRangedWeaponType.Shotgun || meleeAttType == AnimRangedWeaponType.Shotgun)
  2718. return AnimRangedWeaponType.Shotgun;
  2719. if (shoulderAttType == AnimRangedWeaponType.Rifle || meleeAttType == AnimRangedWeaponType.Rifle)
  2720. return AnimRangedWeaponType.Rifle;
  2721. return AnimRangedWeaponType.None;
  2722. }
  2723. string GetSurfaceType(SurfaceAnimationBone limbType)
  2724. {
  2725. string surfaceType;
  2726. int liquidType;
  2727. g_Game.SurfaceUnderObjectByBoneCorrectedLiquid(this, limbType, surfaceType, liquidType);
  2728. return surfaceType;
  2729. }
  2730. //-------------------------------------------------------------
  2731. //!
  2732. //! Sounds
  2733. //!
  2734. AbstractWave PlaySound(SoundObject so, SoundObjectBuilder sob)
  2735. {
  2736. if (so == null)
  2737. return null;
  2738. so.SetPosition(GetPosition());
  2739. AbstractWave wave = GetGame().GetSoundScene().Play3D(so, sob);
  2740. return wave;
  2741. }
  2742. void AddNoise(NoiseParams noisePar, float noiseMultiplier = 1.0)
  2743. {
  2744. if (noisePar != null)
  2745. GetGame().GetNoiseSystem().AddNoise(this, noisePar, noiseMultiplier);
  2746. }
  2747. //-------------------------------------------------------------
  2748. //!
  2749. //! Event Processing
  2750. //!
  2751. void OnStepEvent(string pEventType, string pUserString, int pUserInt)
  2752. {
  2753. vector orientation;
  2754. DayZPlayerType type = GetDayZPlayerType();
  2755. HumanMovementState state = new HumanMovementState();
  2756. GetMovementState(state);
  2757. #ifndef SERVER
  2758. DayZPlayerTypeStepSoundLookupTable table = type.GetStepSoundLookupTable();
  2759. SoundObjectBuilder soundBuilder = NULL;
  2760. if (pUserInt < 100)
  2761. {
  2762. string surface;
  2763. if (pUserInt % 2 == 1)
  2764. {
  2765. surface = GetSurfaceType(SurfaceAnimationBone.LeftBackLimb);
  2766. if (surface.Length() == 0)//if no surface found, try other leg
  2767. surface = GetSurfaceType(SurfaceAnimationBone.RightBackLimb);
  2768. }
  2769. else
  2770. {
  2771. surface = GetSurfaceType(SurfaceAnimationBone.RightBackLimb);
  2772. if (surface.Length() == 0)//if no surface found, try other leg
  2773. surface = GetSurfaceType(SurfaceAnimationBone.LeftBackLimb);
  2774. }
  2775. if (surface.Length() != 0)
  2776. m_LastSurfaceUnderHash = surface.Hash();
  2777. if (state.m_iMovement == DayZPlayerConstants.MOVEMENTIDX_SPRINT)
  2778. {
  2779. orientation = GetOrientation() * (-1);
  2780. int stepParticleID = Surface.GetStepsParticleID(surface);
  2781. if (stepParticleID > 0)
  2782. {
  2783. ParticleManager.GetInstance().PlayInWorldEx(stepParticleID, null, GetPosition(), orientation);
  2784. }
  2785. }
  2786. soundBuilder = table.GetSoundBuilder(pUserInt, state.m_iMovement, m_LastSurfaceUnderHash, GetBootsType());
  2787. }
  2788. else
  2789. {
  2790. string surface2 = GetSurfaceType();
  2791. if (surface2.Length() != 0)
  2792. m_LastSurfaceUnderHash = surface2.Hash();
  2793. soundBuilder = table.GetSoundBuilder(pUserInt, state.m_iMovement, m_LastSurfaceUnderHash, GetBootsType());
  2794. }
  2795. if (soundBuilder != NULL && GetGame().GetPlayer())
  2796. {
  2797. orientation = Vector(0, 0, 0);
  2798. vector edgeLength = Vector(1.5, 3.0, 1.5);
  2799. array<Object> excludedObjects = new array<Object>;
  2800. excludedObjects.Insert(this);
  2801. array<Object> collidedObjects = new array<Object>;
  2802. if (GetGame().IsBoxCollidingGeometry(GetPosition(), orientation, edgeLength, ObjIntersectView, ObjIntersectNone, excludedObjects, collidedObjects))
  2803. {
  2804. for (int i = 0; i < collidedObjects.Count(); ++i)
  2805. {
  2806. WoodBase colObject = WoodBase.Cast(collidedObjects.Get(i));
  2807. if (colObject && colObject.HasPlayerCollisionParticle() && state.m_iMovement > DayZPlayerConstants.MOVEMENTIDX_WALK)
  2808. MiscEffects.PlayVegetationCollideParticles(colObject, this);
  2809. if (colObject && colObject.HasPlayerCollisionSound())
  2810. {
  2811. for (int j = 0; j < type.GetVegetationSounds().Count(); ++j)
  2812. {
  2813. VegetationSound vegetationSound = type.GetVegetationSounds().Get(j);
  2814. if (vegetationSound.GetAnimEventIds().Find(pUserInt) >= 0)
  2815. {
  2816. SoundObjectBuilder vegSoundObjectBuilder = vegetationSound.GetSoundObjectBuilder();
  2817. SoundObject vegSoundObject = vegetationSound.GetSoundObjectBuilder().BuildSoundObject();
  2818. if (vegSoundObject != NULL)
  2819. {
  2820. AttenuateSoundIfNecessary(vegSoundObject);
  2821. PlaySound(vegSoundObject, vegSoundObjectBuilder);
  2822. }
  2823. break;
  2824. }
  2825. }
  2826. break;
  2827. }
  2828. }
  2829. }
  2830. SoundObject soundObject = soundBuilder.BuildSoundObject();
  2831. if (soundObject != NULL)
  2832. {
  2833. AttenuateSoundIfNecessary(soundObject);
  2834. PlaySound(soundObject, soundBuilder);
  2835. }
  2836. }
  2837. #endif
  2838. if (GetGame().IsServer())
  2839. {
  2840. m_StepCounter++;//move outside of server condition if needed on client as well
  2841. float noiseMultiplier = 0;
  2842. NoiseParams noiseParams;
  2843. if (state.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_ERECT || state.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDERECT)
  2844. noiseParams = type.GetNoiseParamsStand();
  2845. else if (state.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_CROUCH || state.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDCROUCH)
  2846. noiseParams = type.GetNoiseParamsCrouch();
  2847. else if (state.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_PRONE || state.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDPRONE)
  2848. noiseParams = type.GetNoiseParamsProne();
  2849. else
  2850. {
  2851. Debug.Log(string.Format("Wrong stance, id: %1 using backup with stand stance (id: 0)", state.m_iStanceIdx));
  2852. noiseParams = type.GetNoiseParamsStand();
  2853. }
  2854. noiseMultiplier = NoiseAIEvaluate.GetNoiseMultiplier(this) * NoiseAIEvaluate.GetNoiseReduction(GetGame().GetWeather());
  2855. AddNoise(noiseParams, noiseMultiplier);
  2856. if ((m_StepCounter % PlayerConstants.CHECK_EVERY_N_STEP) == 0)
  2857. {
  2858. ProcessFeetDamageServer(pUserInt);
  2859. }
  2860. }
  2861. }
  2862. void OnSoundEvent(string pEventType, string pUserString, int pUserInt)
  2863. {
  2864. int eventReplaceID;
  2865. if (pEventType == "Sound")
  2866. {
  2867. if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT || GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_REMOTE)
  2868. {
  2869. eventReplaceID = m_ReplaceSoundEventHandler.GetSoundEventID(pUserInt, ESoundEventType.SOUND_COMMON);
  2870. if (eventReplaceID > 0)
  2871. {
  2872. PlaySoundEventType(ESoundEventType.SOUND_COMMON, eventReplaceID);
  2873. return;
  2874. }
  2875. }
  2876. ProcessSoundEvent(pEventType, pUserString, pUserInt);
  2877. }
  2878. else if (pEventType == "SoundWeapon")
  2879. {
  2880. if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT || GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_REMOTE)
  2881. {
  2882. eventReplaceID = m_ReplaceSoundEventHandler.GetSoundEventID(pUserInt, ESoundEventType.SOUND_WEAPON);
  2883. if (eventReplaceID > 0)
  2884. {
  2885. PlaySoundEventType(ESoundEventType.SOUND_WEAPON, eventReplaceID);
  2886. return;
  2887. }
  2888. }
  2889. ProcessWeaponEvent(pEventType, pUserString, pUserInt);
  2890. }
  2891. else if (pEventType == "SoundAttachment")
  2892. {
  2893. ProcessAttachmentEvent(pEventType, pUserString, pUserInt);
  2894. }
  2895. else if (pEventType == "SoundVoice")
  2896. {
  2897. if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT || GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_REMOTE)
  2898. {
  2899. int event_id = m_PlayerSoundEventHandler.ConvertAnimIDtoEventID(pUserInt);
  2900. if (event_id > 0)
  2901. {
  2902. PlaySoundEvent(event_id);
  2903. return;
  2904. }
  2905. }
  2906. ProcessVoiceEvent(pEventType, pUserString, pUserInt);
  2907. }
  2908. else
  2909. {
  2910. Debug.Log("OnSoundEvent: Unknown sound event \"" + pEventType + "\"");
  2911. }
  2912. }
  2913. void OnParticleEvent(string pEventType, string pUserString, int pUserInt)
  2914. {
  2915. }
  2916. void ProcessWeaponEvent(string pEventType, string pUserString, int pUserInt)
  2917. {
  2918. DayZPlayerType type = GetDayZPlayerType();
  2919. AnimSoundEvent soundEvent = null;
  2920. float quantity = 0;
  2921. EntityAI entityInHands = GetHumanInventory().GetEntityInHands();
  2922. if (entityInHands && entityInHands.IsInherited(ItemBase))
  2923. {
  2924. ItemBase item;
  2925. Class.CastTo(item, entityInHands);
  2926. if (item.HasQuantity())
  2927. quantity = (float)item.GetQuantity() / (item.GetQuantityMax() - item.GetQuantityMin());
  2928. InventoryItemType invItemType = item.GetInventoryItemType();
  2929. soundEvent = invItemType.GetSoundEvent(pUserInt);
  2930. }
  2931. if (soundEvent == null)
  2932. {
  2933. quantity = 0;
  2934. soundEvent = type.GetSoundWeaponEvent(pUserInt);
  2935. }
  2936. if (soundEvent != null)
  2937. {
  2938. if (!GetGame().IsDedicatedServer())
  2939. {
  2940. SoundObjectBuilder builder = soundEvent.GetSoundBuilderEx(m_ActionSoundCategoryHash);
  2941. if (builder)
  2942. {
  2943. builder.AddVariable("quantity", quantity);
  2944. builder.AddVariable("interior", IsSoundInsideBuilding());
  2945. SoundObject soundObject = builder.BuildSoundObject();
  2946. if (soundObject != NULL)
  2947. {
  2948. AttenuateSoundIfNecessary(soundObject);
  2949. AbstractWave sound = PlaySound(soundObject, builder);
  2950. if (pUserString == "StopOnAnimEnd")
  2951. m_PerformedActionSounds.Insert(sound);
  2952. }
  2953. }
  2954. else
  2955. {
  2956. //TODO:Userful error message
  2957. }
  2958. }
  2959. if (GetGame().IsServer())
  2960. {
  2961. AddNoise(soundEvent.m_NoiseParams, NoiseAIEvaluate.GetNoiseReduction(GetGame().GetWeather()));
  2962. }
  2963. }
  2964. }
  2965. void ProcessAttachmentEvent(string pEventType, string pUserString, int pUserInt)
  2966. {
  2967. DayZPlayerType type = GetDayZPlayerType();
  2968. DayZPlayerTypeAttachmentSoundLookupTable table = type.GetAttachmentSoundLookupTable();
  2969. array<string> attachments = new array<string>();
  2970. pUserString.Split(",", attachments);
  2971. for (int i = 0; i < attachments.Count(); i++)
  2972. {
  2973. int attachmentHash = -1;
  2974. if (attachments[i] == "shoulder")
  2975. attachmentHash = GetShoulderAttachmentType();
  2976. else if (attachments[i] == "body")
  2977. attachmentHash = GetBodyAttachmentType();
  2978. else if (attachments[i] == "back")
  2979. attachmentHash = GetBackAttachmentType();
  2980. SoundObjectBuilder soundBuilder = table.GetSoundBuilder(pUserInt, attachments[i], attachmentHash);
  2981. if (soundBuilder != NULL)
  2982. {
  2983. SoundObject soundObject = soundBuilder.BuildSoundObject();
  2984. if (soundObject != NULL)
  2985. {
  2986. AttenuateSoundIfNecessary(soundObject);
  2987. PlaySound(soundObject, soundBuilder);
  2988. }
  2989. }
  2990. }
  2991. }
  2992. void SetVariablesLadderSoundObjectBuilder(SoundObjectBuilder soundObjectBuilder)
  2993. {
  2994. if (m_ClimbingLadderType == "wood")
  2995. {
  2996. soundObjectBuilder.AddVariable("laddertype", 1);
  2997. }
  2998. else
  2999. {
  3000. soundObjectBuilder.AddVariable("laddertype", 0);
  3001. }
  3002. AnimBootsType pBoots = GetBootsType();
  3003. if (pBoots == AnimBootsType.None)
  3004. {
  3005. soundObjectBuilder.AddVariable("bare", 1);
  3006. soundObjectBuilder.AddVariable("sneakers", 0);
  3007. soundObjectBuilder.AddVariable("boots", 0);
  3008. }
  3009. else if (pBoots == AnimBootsType.Sneakers)
  3010. {
  3011. soundObjectBuilder.AddVariable("bare", 0);
  3012. soundObjectBuilder.AddVariable("sneakers", 1);
  3013. soundObjectBuilder.AddVariable("boots", 0);
  3014. }
  3015. else if (pBoots == AnimBootsType.Boots)
  3016. {
  3017. soundObjectBuilder.AddVariable("bare", 0);
  3018. soundObjectBuilder.AddVariable("sneakers", 0);
  3019. soundObjectBuilder.AddVariable("boots", 1);
  3020. }
  3021. }
  3022. void ProcessSoundEvent(string pEventType, string pUserString, int pUserInt)
  3023. {
  3024. DayZPlayerType type = GetDayZPlayerType();
  3025. DayZPlayerTypeAnimTable table = type.GetSoundTable();
  3026. AnimSoundEvent soundEvent;
  3027. if (table)
  3028. {
  3029. soundEvent = table.GetSoundEvent(pUserInt);
  3030. }
  3031. if (soundEvent != NULL)
  3032. {
  3033. if (!GetGame().IsDedicatedServer())
  3034. {
  3035. SoundObjectBuilder objectBuilder = soundEvent.GetSoundBuilder();
  3036. if (GetCommand_Ladder())
  3037. {
  3038. SetVariablesLadderSoundObjectBuilder(objectBuilder);
  3039. }
  3040. objectBuilder.AddEnvSoundVariables(GetPosition());
  3041. SoundObject soundObject = objectBuilder.BuildSoundObject();
  3042. if (soundObject != NULL)
  3043. {
  3044. AttenuateSoundIfNecessary(soundObject);
  3045. AbstractWave sound = PlaySound(soundObject, objectBuilder);
  3046. if (pUserString == "StopOnAnimEnd")
  3047. m_PerformedActionSounds.Insert(sound);
  3048. }
  3049. }
  3050. if (GetGame().IsServer())
  3051. {
  3052. if (soundEvent.m_NoiseParams != NULL)
  3053. GetGame().GetNoiseSystem().AddNoise(this, soundEvent.m_NoiseParams, NoiseAIEvaluate.GetNoiseReduction(GetGame().GetWeather()));
  3054. }
  3055. }
  3056. }
  3057. AbstractWave ProcessVoiceEvent(string pEventType, string pUserString, int pUserInt)
  3058. {
  3059. #ifdef SERVER//none of this code needs to run on server, ifdef put here rather than before the method call to maintain mod compatibility
  3060. return null;
  3061. #endif
  3062. DayZPlayerType type = GetDayZPlayerType();
  3063. DayZPlayerTypeVoiceSoundLookupTable table = type.GetVoiceSoundLookupTable();
  3064. if (!table)
  3065. return null;
  3066. AbstractWave wave;
  3067. EntityAI mask = GetInventory().FindAttachment(InventorySlots.MASK);
  3068. EntityAI head_gear = GetInventory().FindAttachment(InventorySlots.HEADGEAR);
  3069. string category;
  3070. if (mask || head_gear)
  3071. {
  3072. string category_mask;
  3073. string category_headgear;
  3074. int priority_mask;
  3075. int priority_headgear;
  3076. if (mask)
  3077. {
  3078. category_mask = mask.ConfigGetString("soundVoiceType");
  3079. priority_mask = mask.ConfigGetInt("soundVoicePriority");
  3080. }
  3081. if (head_gear)
  3082. {
  3083. category_headgear = head_gear.ConfigGetString("soundVoiceType");
  3084. priority_headgear = head_gear.ConfigGetInt("soundVoicePriority");
  3085. }
  3086. if (priority_headgear >= priority_mask && category_headgear != "")
  3087. {
  3088. category = category_headgear;
  3089. }
  3090. else
  3091. {
  3092. category = category_mask;
  3093. }
  3094. }
  3095. if (category == "")
  3096. {
  3097. category = "none";
  3098. }
  3099. SoundObjectBuilder soundBuilder = table.GetSoundBuilder(pUserInt, category.Hash());
  3100. if (soundBuilder)
  3101. {
  3102. PlayerBase player = PlayerBase.Cast(this);
  3103. //this code block looks super shady, but it's the only way the sounds play correctly, god knows what's going on on c++ side
  3104. int maleVoiceType = 0;
  3105. int femaleVoiceType = 0;
  3106. if (player.IsMale())
  3107. {
  3108. maleVoiceType = player.GetVoiceType();
  3109. }
  3110. else
  3111. {
  3112. femaleVoiceType = player.GetVoiceType();
  3113. }
  3114. soundBuilder.AddVariable("male", maleVoiceType);
  3115. soundBuilder.AddVariable("female", femaleVoiceType);
  3116. // end of weirdness
  3117. SoundObject soundObject = soundBuilder.BuildSoundObject();
  3118. if (soundObject != NULL)
  3119. {
  3120. AttenuateSoundIfNecessary(soundObject);
  3121. wave = PlaySound(soundObject, soundBuilder);
  3122. }
  3123. }
  3124. return wave;
  3125. }
  3126. void ProcessFeetDamageServer(int pUserInt);
  3127. //-------------------------------------------------------------
  3128. //!
  3129. //! anti-cheat condition
  3130. //!
  3131. bool CheckForTakeItem(EntityAI item)
  3132. {
  3133. bool restrained = IsRestrained(); // IsRestrained()
  3134. bool unconscious = IsUnconscious(); // IsRestrained()
  3135. ItemBase ib = ItemBase.Cast(item);
  3136. if (ib && (PlayerBase.DEBUG_INVENTORY_ACCESS || !IsAlive() || restrained || unconscious || ib.CanBeMovedOverride()))
  3137. return true;
  3138. return false;
  3139. }
  3140. bool CheckForDropItem(EntityAI item)
  3141. {
  3142. /*
  3143. bool restrained = IsRestrained(); // IsRestrained()
  3144. bool unconscious = IsUnconscious(); // IsRestrained()
  3145. ItemBase ib = ItemBase.Cast(item);
  3146. if (!IsAlive() || restrained || unconscious || ib.CanBeMovedOverride())
  3147. return true;
  3148. return false;
  3149. */
  3150. return CheckForTakeItem(item); //the two functions are currently identical
  3151. }
  3152. //-------------------------------------------------------------
  3153. //!
  3154. //! Player respawn
  3155. //!
  3156. bool CheckForRespawn(EntityAI item)
  3157. {
  3158. PlayerBase player = PlayerBase.Cast(this);
  3159. if (!player)
  3160. return true;
  3161. if (!IsAlive() || player.IsUnconscious())
  3162. return true;
  3163. return false;
  3164. }
  3165. #ifdef DEVELOPER
  3166. // -------------------------------------------------------------------------
  3167. override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
  3168. {
  3169. super.OnRPC(sender, rpc_type, ctx);
  3170. if (rpc_type == ERPCs.RPC_DAYZPLAYER_DEBUGSERVERWALK)
  3171. {
  3172. Print("ERPCs.RPC_DAYZPLAYER_DEBUGSERVERWALK");
  3173. Param1<bool> rp = new Param1<bool>(false);
  3174. ctx.Read(rp);
  3175. GetInputController().OverrideMovementSpeed(rp.param1, 1);
  3176. GetInputController().OverrideAimChangeX(rp.param1, 0.01);
  3177. }
  3178. }
  3179. #endif
  3180. bool IsLanded(int pCurrentCommandID)
  3181. {
  3182. if (pCurrentCommandID == DayZPlayerConstants.COMMANDID_FALL)
  3183. {
  3184. HumanCommandFall fall = GetCommand_Fall();
  3185. if (fall)
  3186. {
  3187. return fall.PhysicsLanded();
  3188. }
  3189. }
  3190. return false;
  3191. }
  3192. bool OnLand(int pCurrentCommandID, FallDamageData fallDamageData)
  3193. {
  3194. if (pCurrentCommandID == DayZPlayerConstants.COMMANDID_FALL)
  3195. {
  3196. HumanCommandFall fall = GetCommand_Fall();
  3197. if (fall)
  3198. {
  3199. fall.Land(fallDamageData.m_LandType);
  3200. return true;
  3201. }
  3202. }
  3203. return false;
  3204. }
  3205. bool IsAlreadyInFallingCommand(int pCurrentCommandID)
  3206. {
  3207. return pCurrentCommandID == DayZPlayerConstants.COMMANDID_FALL;
  3208. }
  3209. //! movement sliding override, originally for FB gestures
  3210. void OverrideSlidePoseAngle(float value)
  3211. {
  3212. if (!m_MoveSettings)
  3213. m_MoveSettings = GetDayZPlayerType().CommandMoveSettingsW();
  3214. if (m_MoveSettings.m_fSlidingPoseAngle != value)
  3215. {
  3216. m_MoveSettings.m_fSlidingPoseAngle = value;
  3217. StartCommand_Move(); //nescessary, re-initializes with adjusted values
  3218. }
  3219. }
  3220. float GetSlidePoseAngle()
  3221. {
  3222. return GetDayZPlayerType().CommandMoveSettingsW().m_fSlidingPoseAngle;
  3223. }
  3224. void CheckAnimationOverrides()
  3225. {
  3226. }
  3227. bool IsPlayerSelected()
  3228. {
  3229. return m_PlayerSelected;
  3230. }
  3231. bool IsRestrained();
  3232. //! Checks if fullbody animation or specific locked state is active in emote manager
  3233. bool IsInFBEmoteState();
  3234. void SetSuicide(bool state)
  3235. {
  3236. m_Suicide = state;
  3237. }
  3238. bool CommitedSuicide()
  3239. {
  3240. return m_Suicide;
  3241. }
  3242. //!called every command handler tick when player is on ladder
  3243. void OnLadder(float delta_time, HumanMovementState pState);
  3244. //-------------------------------------------------------------
  3245. //!
  3246. //! Phx contact event
  3247. //!
  3248. override protected void EOnContact(IEntity other, Contact extra)
  3249. {
  3250. if (!IsAlive())
  3251. return;
  3252. if (GetParent() == other)
  3253. return;
  3254. Transport transport = Transport.Cast(other);
  3255. if (transport)
  3256. {
  3257. if (GetGame().IsServer())
  3258. {
  3259. RegisterTransportHit(transport);
  3260. }
  3261. }
  3262. }
  3263. protected void AttenuateSoundIfNecessary(SoundObject soundObject)
  3264. {
  3265. if (GetGame().GetPlayer() != NULL && (IsSoundInsideBuilding() != GetGame().GetPlayer().IsSoundInsideBuilding() || IsCameraInsideVehicle() != GetGame().GetPlayer().IsCameraInsideVehicle()))
  3266. {
  3267. soundObject.SetKind(WaveKind.WAVEATTALWAYS);
  3268. }
  3269. else
  3270. {
  3271. soundObject.SetKind(WaveKind.WAVEEFFECTEX);
  3272. }
  3273. }
  3274. void CheckLiftWeapon();
  3275. void ProcessLiftWeapon();
  3276. void SetHandheldOpticsInUse(bool state)
  3277. {
  3278. m_HandheldOpticsInUse = state;
  3279. }
  3280. bool IsHandheldOpticsInUse()
  3281. {
  3282. return m_HandheldOpticsInUse;
  3283. }
  3284. bool IsLiftWeapon();
  3285. float GetWeaponObstruction();
  3286. bool IsWeaponObstructionBlockingADS();
  3287. bool IsRaised()
  3288. {
  3289. return m_IsRaised;
  3290. }
  3291. bool IsFighting();
  3292. //! ---------------- Checks if player can pick up heavy item -------------------------
  3293. // Will return true when the item is not heavy as well
  3294. bool CanPickupHeavyItem(notnull EntityAI item)
  3295. {
  3296. return !item.IsHeavyBehaviour() || (item.IsHeavyBehaviour() && DayZPlayerUtils.PlayerCanChangeStance(this, DayZPlayerConstants.STANCEIDX_ERECT));
  3297. }
  3298. bool CanPickupHeavyItemSwap(notnull EntityAI item1, notnull EntityAI item2)
  3299. {
  3300. return CanPickupHeavyItem(item1) && CanPickupHeavyItem(item2);
  3301. }
  3302. /*!
  3303. Called when 2D optics are about to be drawn.
  3304. \return Collection of optics to be drawn.
  3305. Draws the provided optics when of `ItemOptics` type.
  3306. Draws optic of current muzzle when of `Weapon_Base` type.
  3307. */
  3308. protected override array<InventoryItem> OnDrawOptics2D()
  3309. {
  3310. array<InventoryItem> optics;
  3311. // Find preferred optics, i.e. active on in hands (if any are held) or the ones attached to weapon (if any is held)
  3312. ItemOptics preferredOptics;
  3313. {
  3314. HumanInventory inventory = GetHumanInventory();
  3315. EntityAI itemInHands = inventory.GetEntityInHands();
  3316. ItemOptics opticsInHands = ItemOptics.Cast(itemInHands);
  3317. if (opticsInHands)
  3318. {
  3319. preferredOptics = opticsInHands;
  3320. }
  3321. else
  3322. {
  3323. Weapon_Base weaponInHands = Weapon_Base.Cast(itemInHands);
  3324. if (weaponInHands)
  3325. {
  3326. preferredOptics = weaponInHands.GetAttachedOptics();
  3327. }
  3328. }
  3329. }
  3330. // Draw selected optics when the player is viewing through them
  3331. if (preferredOptics && preferredOptics.IsInOptics() && preferredOptics.IsUsingOptics2DModel())
  3332. {
  3333. optics = {}; // only allocate the array when necessary
  3334. optics.Insert(preferredOptics);
  3335. }
  3336. // Draw equipped NVGs; employ better finding!
  3337. EntityAI nvAttachment = GetNVEntityAttached();
  3338. if (nvAttachment)
  3339. {
  3340. bool blockedByOptics = preferredOptics && preferredOptics.IsInOptics() && !preferredOptics.IsUsingOptics2DModel();
  3341. if (!blockedByOptics && PlayerBase.Cast(this).IsNVGWorking())
  3342. {
  3343. NVGoggles nvg = NVGoggles.Cast(nvAttachment);
  3344. if (nvg)
  3345. {
  3346. if (!optics)
  3347. optics = {};
  3348. optics.Insert(nvg);
  3349. }
  3350. }
  3351. }
  3352. return optics;
  3353. }
  3354. //!
  3355. //! TODO: transitional change - will be cleaned in near future
  3356. //! Do NOT mod this method - will be removed
  3357. private EntityAI GetNVEntityAttached()
  3358. {
  3359. EntityAI entity;
  3360. if (FindAttachmentBySlotName("Eyewear") && FindAttachmentBySlotName("Eyewear").FindAttachmentBySlotName("NVG"))
  3361. {
  3362. entity = FindAttachmentBySlotName("Eyewear").FindAttachmentBySlotName("NVG");
  3363. }
  3364. else if (FindAttachmentBySlotName("Headgear") && FindAttachmentBySlotName("Headgear").FindAttachmentBySlotName("NVG"))
  3365. {
  3366. entity = FindAttachmentBySlotName("Headgear").FindAttachmentBySlotName("NVG");
  3367. }
  3368. return entity;
  3369. }
  3370. #ifdef DIAG_DEVELOPER
  3371. Weapon_Base SpawnWeaponInHands(string type)
  3372. {
  3373. return Weapon_Base.Cast(GetHumanInventory().CreateInHands(type));
  3374. }
  3375. #endif
  3376. ///////////////////////////////////
  3377. //Obsolete stuff below this point//
  3378. ///////////////////////////////////
  3379. static const int DEAD_SCREEN_DELAY = 1000; //! DEPRECATED
  3380. protected bool m_CameraEyeZoom; //DEPRECATED
  3381. ref Timer m_ADSAutomationTimer; //DEPRECATED
  3382. protected bool m_ADSTimerLaunched; //DEPRECATED
  3383. protected bool m_ProcessWeaponRaiseCompleted; //DEPRECATED
  3384. protected bool m_IsFireWeaponRaised; //DEPRECATED, value still set for legacy reasons
  3385. protected bool m_WasIronSight; // moved from player to weapon
  3386. void SetReturnToOptics(bool state); //DEPRECATED
  3387. void RunADSTimer(); //DEPRECATED
  3388. void StopADSTimer(); //DEPRECATED
  3389. void SendCompleteWeaponRaiseJuncture(); //DEPRECATED
  3390. void DepleteStamina(EStaminaModifiers modifier, float dT = -1) {};
  3391. }