Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
  • 0
RichardTwi

Помощь с синхронизацией звука.

Как правильно синхронизировать звуки в DayZ?
При включении радио звук играет у всех, но если с помощью действия я меняю m_CurrentTrackIndex, то это слышно только у клиента, который и сделал действие.
Есть ли какой-либо пример синхронизации звука? Или как это починить?
p.s. я пока что только обучаюсь
 

class radioitembasetest : ItemBase
{
	protected EffectSound m_ActiveSound;
	protected bool m_Playing;
	protected int m_CurrentTrackIndex = 0;
    protected float m_RandomInt;
    protected bool m_ItWillBeActivated;
	protected ref array<string> SoundSets = {};

    protected bool m_SyncStatus;

    void radioitembasetest()
    {
       	RegisterNetSyncVariableBool( "m_SyncStatus" );
		RegisterNetSyncVariableInt(	"m_CurrentTrackIndex" );
    }

    override void OnVariablesSynchronized()
	{
		super.OnVariablesSynchronized();
        
        if( m_SyncStatus && !IsPlaying() ) TurnOn();
        if( !m_SyncStatus && IsPlaying() ) TurnOff();
	}

    override bool CanPutInCargo( EntityAI parent )
    {
        return false;
    }
    override bool CanPutIntoHands (EntityAI parent)
	{
		return false;
	}

    void NextTrack()
    {
        if(SoundSets.Count())
        {
            if(m_CurrentTrackIndex >= SoundSets.Count())
            {
                m_CurrentTrackIndex = 0;
            } else {
                ++m_CurrentTrackIndex;
            }
            Play();
        }
    }
	
	void RefreshFrequency()
	{
		RadioRef();
		Play();
	}

    bool Play()
    {
        if(!CanPlaySound())
            return false;


		if (!GetGame().IsServer()  ||  !GetGame().IsMultiplayer())
        {
			m_ActiveSound.SoundStop();
        	m_ActiveSound = SEffectManager.CreateSound(SoundSets[m_CurrentTrackIndex], GetPosition(), 0, 0, false, true);
			m_ActiveSound.Event_OnSoundWaveEnded.Insert(NextTrack);
        	m_ActiveSound.SetParent(this);
       	 	m_ActiveSound.SetSoundAutodestroy(true);
			m_ActiveSound.SoundPlay();
			SetSynchDirty();
            SetTapeVolume();
        }
		m_Playing = true;
        m_SyncStatus = true;
		SetSynchDirty();

        return true;
    }

    void Stop()
    {
        m_Playing = false;
        m_SyncStatus = false;
        SetSynchDirty();

        if (m_ActiveSound)
        {
            m_ActiveSound.SoundStop();
        }
    }

    bool CanPlaySound()
    {
		return true;
    }

    void TurnOn()
    {
        if ( GetCompEM().CanWork() )
        {
            GetCompEM().SwitchOn();
        }
    } 
    
    void TurnOff()
    {
        GetCompEM().SwitchOff();
    }

    override void OnSwitchOn()
    {
        RadioFuncRandomization();
        if (!Play())
        {
            TurnOff();
        }
    }
	
	void RadioRef()
	{
			m_RandomInt = Math.RandomFloat(0,15); // 0.000....1 - 14
            m_RandomInt = Math.Floor(m_RandomInt);
            m_CurrentTrackIndex = m_RandomInt;
			SetSynchDirty();
			
	}
	
    void RadioFuncRandomization()
    {
        if(!isActivated())
        {
            m_RandomInt = Math.RandomFloat(0,15); // 0.000....1 - 14
            m_RandomInt = Math.Floor(m_RandomInt);
            m_CurrentTrackIndex = m_RandomInt;
            m_ItWillBeActivated = true;
            Print("[randomization] m_CurrentTrackIndex = " + m_CurrentTrackIndex + " --- " + "m_RandomInt = " + m_RandomInt);
        }
        else
        {
            return;
        }
        GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(RadioFuncDelay, 60000, false);
    }

    void RadioFuncDelay()
    {
        m_ItWillBeActivated = false;
    }

    override void OnSwitchOff()
	{
		if(IsPlaying())
		{
			Stop();
            delete m_ActiveSound;
		}
	}

    bool isActivated()
    {
        return m_ItWillBeActivated;
    }

    bool IsPlaying()
    {
        return m_Playing;
    }
	
	void SetTapeVolume()
    {
        m_ActiveSound.SetMaxVolume(3.0);
    }

    override void SetActions()
	{
        super.SetActions();
		AddAction(ActionTurnOnWhileOnGround);
		AddAction(ActionTurnOffWhileOnGround);
		AddAction(ReFrequencyRadio);
        RemoveAction(ActionTakeItem);
        RemoveAction(ActionTakeItemToHands);
	}
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендованные сообщения

Нет ответов на вопрос

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×
×
  • Создать...

Важная информация

Используя этот сайт, вы автоматически обязуетесь соблюдать наши Правила и Политика конфиденциальности.
Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.

Поддержка