123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- enum EPlayerSoundEventType
- {
- GENERAL = 0x00000001,
- MELEE = 0x00000002,
- STAMINA = 0x00000004,
- DAMAGE = 0x00000008,
- DUMMY = 0x00000010,
- INJURY = 0x00000020,
- DROWNING = 0x00000040,
- //HEAT_COMFORT = 0x00000080,
- }
- enum EPlayerSoundEventParam
- {
- SKIP_CONTROLLED_PLAYER = 0x00000001,
- HIGHEST_PRIORITY = 0x00000002,
- /*
- STAMINA = 0x00000004,
- DAMAGE = 0x00000008,
- DUMMY = 0x00000010,
- INJURY = 0x00000020,
- HEAT_COMFORT = 0x00000040,
- */
-
- // ONLY COUNT BELLOW
- ENUM_COUNT,
- }
- class PlayerSoundEventBase extends SoundEventBase
- {
- PlayerBase m_Player;
- float m_DummySoundLength;
- float m_DummyStartTime;
- bool m_IsDummyType;
- bool m_ProcessPlaybackEvent;
- float m_PlayTime;
- ref HumanMovementState m_Hms = new HumanMovementState();
- EPlayerSoundEventType m_HasPriorityOverTypes;
-
- bool IsDummy()
- {
- return m_IsDummyType;
- }
-
- EPlayerSoundEventType GetPriorityOverTypes()
- {
- return m_HasPriorityOverTypes;
- }
-
- // !can this event play during hold breath
- bool HasHoldBreathException()
- {
- return false;
- }
-
- void PlayerSoundEventBase()
- {
- m_Type = EPlayerSoundEventType.GENERAL;
- }
-
- void ~PlayerSoundEventBase()
- {
- if(!m_SoundSetCallback)
- OnEnd();
- }
-
- int GetSoundVoiceAnimEventClassID()
- {
- return m_SoundVoiceAnimEventClassID;
- }
-
- bool HasPriorityOverCurrent(PlayerBase player, EPlayerSoundEventID other_state_id, EPlayerSoundEventType type_other)
- {
- return true;
- }
-
- bool IsFinished()
- {
- if(IsDummy())
- {
- return IsDummyFinished();
- }
- else
- {
- return !IsSoundCallbackExist();
- }
- }
-
- bool IsDummyFinished()
- {
- return GetGame().GetTime() > (m_DummyStartTime + m_DummySoundLength);
- }
-
-
- void OnTick(float delta_time)
- {
- if ( m_SoundSetCallback )
- {
- m_SoundSetCallback.SetPosition(m_Player.GetPosition());
- //---------- Playback event -------------
- if( delta_time > 0 && m_ProcessPlaybackEvent )//delta_time 0 is for remotes
- {
-
- m_PlayTime += delta_time;
- //this is not 100% precise as the playback position is not obtained from the sound system
- float playback01 = Math.Clamp(m_PlayTime / m_SoundSetCallback.GetLength(),0,1);
- SendEvent(playback01);
- //---------- Playback event -------------
- }
- }
- }
- bool CanPlay(PlayerBase player)
- {
- player.GetMovementState(m_Hms);
-
- if (player.IsHoldingBreath() && !HasHoldBreathException())
- {
- return false;
- }
- if (player.m_IsDrowning || (player.IsSwimming() && m_Hms.m_iMovement != 0))
- {
- return false;
- }
- return true;
- }
-
- void Init(PlayerBase player)
- {
- InitEx(player,0);
- }
-
- void InitEx(PlayerBase player, int param)
- {
- m_Player = player;
- m_Param = param;
- if (param & EPlayerSoundEventParam.HIGHEST_PRIORITY)
- {
- m_HasPriorityOverTypes = -1;
- }
- }
-
- void OnEnd()
- {
- if(m_ProcessPlaybackEvent)
- SendEvent(1);
- }
-
- void SendEvent(float time)
- {
- if(m_PlayTime < 0 || !m_SoundSetCallback)//negative m_PlayTime value indicates the event has already been sent for playback01 = 1
- return;
-
- m_Player.OnVoiceEventPlayback(this, m_SoundSetCallback, time);
- if(time >= 1)
- m_PlayTime = -float.MAX;
- }
-
- void OnInterupt()
- {
- }
-
- override void OnPlay(PlayerBase player)
- {
- super.OnPlay(player);
- //Print("start playing -------------------->" + m_Type);
- player.OnVoiceEvent(this);
- //m_Player.OnVoiceEventDuration(m_SoundSetCallback, 0);
- }
- override bool Play()
- {
- if(!super.Play())
- return false;
-
- if( !IsDummy() )
- {
- m_SoundSetCallback = m_Player.ProcessVoiceEvent("","", m_SoundVoiceAnimEventClassID);
-
- if(m_SoundSetCallback)
- {
- AbstractWaveEvents events = AbstractWaveEvents.Cast(m_SoundSetCallback.GetUserData());
- events.Event_OnSoundWaveEnded.Insert( OnEnd );
- events.Event_OnSoundWaveStopped.Insert( OnInterupt );
- return true;
- }
- else
- return false;
- }
- else
- {
- m_DummyStartTime = GetGame().GetTime();
- return true;
- }
- return false;
-
- }
- }
|