Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
  • 0
woid177

Как запретить все функции при отсутствии батарейки в предмете

Я новичек, пытаюсь разобраться в следующей проблеме. Есть код он относится так скажем к "плееру музыки" есть функционал включения, выключения , переключения треков и прибавления громкости. Проблема в том, что когда переключаю трек в плеере с кассетой, но без батарейки он всё равно начинает воспроизводить музыку. Но когда один раз сначала вставить батарейку и кассету, после этого такая проблема пропадает. Подскажите пожалуйста как пофиксить проблему с воспроизведением музыки через функцию некст трека без батарейки. То есть чтобы плеер вообще не работал без вставленной батарейки в устройстве.

 

class Polifonia_Cassette_Base extends ItemBase{};

class PolifoniaRadio : ItemBase
{
	ref EffectSound mCassetteSound = new EffectSound;
	protected float m_MusicVolume = 1.0;
	protected float m_CurrentMusicVolume = 1.0;
	protected int m_CurrentTrack = 1;
	protected int m_Track = 1;
	
	protected ref Timer	m_CurrentTrackLengthTimer;
	
	void PolifoniaRadio()
	{
		RegisterNetSyncVariableFloat("m_CurrentMusicVolume");
		RegisterNetSyncVariableInt("m_CurrentTrack");
	};

	override void OnVariablesSynchronized()
	{
		super.OnVariablesSynchronized();

		if (m_MusicVolume != m_CurrentMusicVolume)
		{
			m_MusicVolume = m_CurrentMusicVolume;
			if (mCassetteSound)
			{
				if (mCassetteSound.GetAbstractWave().IsHeaderLoaded())
				{			
					float time = mCassetteSound.GetAbstractWave().GetLength() * mCassetteSound.GetAbstractWave().GetCurrPosition();
					mCassetteSound.SetMaxVolume(m_MusicVolume);
					mCassetteSound.SetSoundVolume(m_MusicVolume);
				}
			}
		}
		
		if (m_Track != m_CurrentTrack)
		{
			m_Track = m_CurrentTrack;
			if (mCassetteSound )
			{
				OnSwitchOff();
				OnSwitchOn();
			}
		}
	};
	
	override bool CanReceiveAttachment(EntityAI attachment, int slotId)
	{
		super.CanReceiveAttachment(attachment, slotId);
		ItemBase item = ItemBase.Cast(attachment);

		if (GetCompEM().IsWorking())
		{
			return false;
		}

		return true;
	}

	bool CassetteValidityCheck()
	{
		if(FindAttachmentBySlotName("BaseCassette"))
		{
			return true;
		}
		return false;
	}

	override void OnSwitchOn()
	{
		if(CassetteValidityCheck())
		{
			Entity mAttachedCassette = EntityAI.Cast(FindAttachmentBySlotName("BaseCassette"));
			PlaySong(mAttachedCassette);
		}
	}

	override void OnSwitchOff()
	{
		if(CassetteValidityCheck())
		{
			StopSong();
			delete mCassetteSound;
		}
	}

	override void EEDelete(EntityAI parent)
	{
		if (mCassetteSound)
		mCassetteSound.SoundStop();
		delete mCassetteSound;
	}

	void PlaySong( Polifonia_Cassette_Base item)
	{
		StopSong();
		string GetSongFromConfig = item.ConfigGetString("song");			
		string CassetteName;		
		CassetteName = "Polifonia_Cassette_"+GetSongFromConfig+"_"+m_CurrentTrack+"_SoundSet";
		
		mCassetteSound = SEffectManager.PlaySoundOnObject(CassetteName, this);	
		mCassetteSound.Event_OnSoundWaveEnded.Insert(AutoNextTrack);
		mCassetteSound.SetSoundAutodestroy(true);
		SetTapeVolume();
		SetSynchDirty();
	}
	
	void StopSong()
	{
		if (mCassetteSound)
		mCassetteSound.SoundStop();		
	}
	
	void NextTrack()
	{
		StopSong();
		if(CassetteValidityCheck())
		{
			Entity mAttachedCassette = EntityAI.Cast(FindAttachmentBySlotName("BaseCassette"));
			int GetTracksFromConfig = mAttachedCassette.ConfigGetInt("tracks");	
			
			m_CurrentTrack = m_CurrentTrack + 1 ;
		
			if (m_CurrentTrack > GetTracksFromConfig)
			{
				m_CurrentTrack = 1;
			}
			SetSynchDirty();
		}	
	}
	
	void AutoNextTrack()
	{	
	    StopSong();
		if(CassetteValidityCheck())
		{
			Entity mAttachedCassette = EntityAI.Cast(FindAttachmentBySlotName("BaseCassette"));
			int GetTracksFromConfig = mAttachedCassette.ConfigGetInt("tracks");	
			
			m_CurrentTrack = m_CurrentTrack + 1 ;
		
			if (m_CurrentTrack > GetTracksFromConfig)
			{
				m_CurrentTrack = 1;
			}
			m_Track = m_CurrentTrack;
			PlaySong(mAttachedCassette);
			SetSynchDirty();
		}
		
	}
	
	void PreviousTrack()
	{
		m_CurrentTrack = m_CurrentTrack - 1 ;
		if (m_CurrentTrack < 1)
		{
			m_CurrentTrack = 1;
		}
	
		SetSynchDirty();
	}

	void TurnVolumeUp()
	{
		m_CurrentMusicVolume = m_CurrentMusicVolume * 2;
		mCassetteSound.SetMaxVolume(1);
		SetSynchDirty();
	}

	void TurnVolumeDown()
	{
		m_CurrentMusicVolume = m_CurrentMusicVolume / 2;

		SetSynchDirty();
	}

	override bool CanReleaseAttachment(EntityAI attachment)
	{
		super.CanReleaseAttachment(attachment);
		if (GetCompEM().IsWorking())
		{
			return false;
		}
		return true;
	}

	void SetTapeVolume()
    {
        mCassetteSound.SetMaxVolume(0.5);
    }
	
	override void SetActions()
	{
		super.SetActions();	
		AddAction( ActionTurnOnWhileInHands );
		AddAction( ActionTurnOffWhileInHands );
		AddAction( ActionTurnOnWhileOnGround );
		AddAction( ActionTurnOffWhileOnGround );
		AddAction( ActionNextTrackInHand );
		AddAction( ActionNextTrack );
		AddAction( ActionPreviousTrack );
		AddAction( ActionPreviousTrackInHand );
		AddAction( ActionPolifoniaVolumeUp );
		AddAction( ActionPolifoniaVolumeDown );
		AddAction( ActionPolifoniaVolumeUpInHand );
		AddAction( ActionPolifoniaVolumeDownInHand );
	}
}

 

Share this post


Link to post
Share on other sites

14 answers to this question

Recommended Posts

  • 0

Вижу что во всех функциях проверяется кассета, но не вижу чтобы хоть где-нибудь проверялась батарейка. Действие по переключению трека можно совершить без батарейки? Если можно - всё логично, кассета есть, про батарейку скрипт не спрашивал. В таком случае либо в экшн следующего трека вписать условие "Если в плеере есть батарейка (и в ней осталась энергия)", либо в начало функции собственно некст трека добавить "Если батарейки нет - стопнуть всё к чертям и захлопнуться"

И ещё момент

NextTrack() выключает трек и прибавляет к m_CurrentTrack +1. Переходим в OnVariablesSynchronized() - там никто не менял переменную m_Track, но поменяли m_CurrentTrack. Одно != другое, условие верное - OnSwitchOff() + OnSwitchOn(). Идём туда - проверка батареи отсутствует, а значит при наличии только кассеты трек очень даже запустится

AutoNextTrack() вообще шикарный - сам запустит тебе песню. Вопрос только проверяется ли батарейка здесь, или всё держится на честном слове что EMComp сейчас включен

Edited by XenoZD (see edit history)

Share this post


Link to post
Share on other sites



  • 0
1 час назад, XenoZD сказал:

Вижу что во всех функциях проверяется кассета, но не вижу чтобы хоть где-нибудь проверялась батарейка. Действие по переключению трека можно совершить без батарейки? Если можно - всё логично, кассета есть, про батарейку скрипт не спрашивал. В таком случае либо в экшн следующего трека вписать условие "Если в плеере есть батарейка (и в ней осталась энергия)", либо в начало функции собственно некст трека добавить "Если батарейки нет - стопнуть всё к чертям и захлопнуться"

И ещё момент

NextTrack() выключает трек и прибавляет к m_CurrentTrack +1. Переходим в OnVariablesSynchronized() - там никто не менял переменную m_Track, но поменяли m_CurrentTrack. Одно != другое, условие верное - OnSwitchOff() + OnSwitchOn(). Идём туда - проверка батареи отсутствует, а значит при наличии только кассеты трек очень даже запустится

AutoNextTrack() вообще шикарный - сам запустит тебе песню. Вопрос только проверяется ли батарейка здесь, или всё держится на честном слове что EMComp сейчас включен

 

Действие переключение можно совершить, даже когда нет батарейки и функции без батареи все активные, кроме вкл, но запускает музыку только функция некст трека. Я пытался запихивать проверку атачмента батарейки, но у меня просто переставало работать воспроизведение при любых раскладах. Поэтому я хотел бы узнать, что и куда написать, чтобы работало всё правильно. Понятно, что проверка нужна, но как она должна выглядеть и в какую именно строку её запихать. Мне кажется удобно было бы сделать проверку в саму функцию некст трека.

Вот могу ещё для понимания полной картины скинуть экшен некст трека.

class ActionNextTrack : ActionInteractBase
{
	void ActionNextTrack()
	{

	}

	override string GetText()
	{
		return "#next_track";
	}
	
	override bool ActionCondition( PlayerBase player, ActionTarget target, ItemBase item )
	{
		return true;
	}
	
	
	override void OnExecuteServer( ActionData action_data )
	{
		Object targetObject = action_data.m_Target.GetObject();
		if (targetObject)
		{
			PolifoniaRadio mTargetCP = PolifoniaRadio.Cast( targetObject );
			mTargetCP.NextTrack();
		}
	}

};

 

Share this post


Link to post
Share on other sites
  • 0

Логичный вопрос - а куда ты уже пытался добавить проверку?

В теории вот тебе три варианта
Это запретит действие с выключенной/рацией без батарейки вообще

	override bool ActionCondition( PlayerBase player, ActionTarget target, ItemBase item )
	{
		// Вот это у тебя вообще должно здесь обязательно быть
		PolifoniaRadio radio = PolifoniaRadio.Cast(target.GetObject());
		if (!radio) return false; 
      
		/*
		return radio.GetCompEM().IsWorking(); // Включено ли радио?
		*/
        
		/*
		return radio.FindAttachmentBySlotName("НазваниеСлотаПодБатарейку")); // Есть ли батарейка?
		*/
      
		/*
		ItemBase battery = radio.FindAttachmentBySlotName("НазваниеСлотаПодБатарейку"));
		return battery && battery.GetQuantity() > 10; // Есть ли достаточно заряженная батарейка?
		*/
    }

Допустим, тебе это нужно оставить действие и убрать эффект. Класс радио, два варианта (те же три варианта третий лень уже писать):
 

void NextTrack()
{
  
  // if (GetCompEM().IsWorking())
  // if (FindAttachmentBySlotName("НазваниеСлотаПодБатарейку))
  {
	return;
  }
  
  StopSong(); 
  
  if(CassetteValidityCheck())
  {
    Entity mAttachedCassette = EntityAI.Cast(FindAttachmentBySlotName("BaseCassette"));
    int GetTracksFromConfig = mAttachedCassette.ConfigGetInt("tracks");	

    m_CurrentTrack = m_CurrentTrack + 1 ;

    if (m_CurrentTrack > GetTracksFromConfig)
    {
    	m_CurrentTrack = 1;
    }
    SetSynchDirty();
  }	
}

 

Edited by XenoZD (see edit history)

Share this post


Link to post
Share on other sites
  • 0
2 часа назад, XenoZD сказал:

Логичный вопрос - а куда ты уже пытался добавить проверку?

В теории вот тебе три варианта
Это запретит действие с выключенной/рацией без батарейки вообще

override bool ActionCondition( PlayerBase player, ActionTarget target, ItemBase item ) { // Вот это у тебя вообще должно здесь обязательно быть PolifoniaRadio radio = PolifoniaRadio.Cast(target.GetObject()); if (!radio) return false; /* return radio.GetCompEM().IsWorking(); // Включено ли радио? */ /* return radio.FindAttachmentBySlotName("НазваниеСлотаПодБатарейку")); // Есть ли батарейка? */ /* ItemBase battery = radio.FindAttachmentBySlotName("НазваниеСлотаПодБатарейку")); return battery && battery.GetQuantity() > 10; // Есть ли достаточно заряженная батарейка? */ }


	override bool ActionCondition( PlayerBase player, ActionTarget target, ItemBase item )
	{
		// Вот это у тебя вообще должно здесь обязательно быть
		PolifoniaRadio radio = PolifoniaRadio.Cast(target.GetObject());
		if (!radio) return false; 
      
		/*
		return radio.GetCompEM().IsWorking(); // Включено ли радио?
		*/
        
		/*
		return radio.FindAttachmentBySlotName("НазваниеСлотаПодБатарейку")); // Есть ли батарейка?
		*/
      
		/*
		ItemBase battery = radio.FindAttachmentBySlotName("НазваниеСлотаПодБатарейку"));
		return battery && battery.GetQuantity() > 10; // Есть ли достаточно заряженная батарейка?
		*/
    }

Допустим, тебе это нужно оставить действие и убрать эффект. Класс радио, два варианта (те же три варианта третий лень уже писать):
 

void NextTrack() { // if (GetCompEM().IsWorking()) // if (FindAttachmentBySlotName("НазваниеСлотаПодБатарейку)) { return; } StopSong(); if(CassetteValidityCheck()) { Entity mAttachedCassette = EntityAI.Cast(FindAttachmentBySlotName("BaseCassette")); int GetTracksFromConfig = mAttachedCassette.ConfigGetInt("tracks"); m_CurrentTrack = m_CurrentTrack + 1 ; if (m_CurrentTrack > GetTracksFromConfig) { m_CurrentTrack = 1; } SetSynchDirty(); } }


void NextTrack()
{
  
  // if (GetCompEM().IsWorking())
  // if (FindAttachmentBySlotName("НазваниеСлотаПодБатарейку))
  {
	return;
  }
  
  StopSong(); 
  
  if(CassetteValidityCheck())
  {
    Entity mAttachedCassette = EntityAI.Cast(FindAttachmentBySlotName("BaseCassette"));
    int GetTracksFromConfig = mAttachedCassette.ConfigGetInt("tracks");	

    m_CurrentTrack = m_CurrentTrack + 1 ;

    if (m_CurrentTrack > GetTracksFromConfig)
    {
    	m_CurrentTrack = 1;
    }
    SetSynchDirty();
  }	
}

 

Теперь это нужно будет вставить и в  Previous Track? 

Share this post


Link to post
Share on other sites
  • 0

Не совсем понял почему вопрос продолжает другой человек, но если это сработало нормально и как тебе надо - лепи налево и направо лол

Share this post


Link to post
Share on other sites
  • 0
12 часов назад, XenoZD сказал:

Логичный вопрос - а куда ты уже пытался добавить проверку?

В теории вот тебе три варианта
Это запретит действие с выключенной/рацией без батарейки вообще

override bool ActionCondition( PlayerBase player, ActionTarget target, ItemBase item ) { // Вот это у тебя вообще должно здесь обязательно быть PolifoniaRadio radio = PolifoniaRadio.Cast(target.GetObject()); if (!radio) return false; /* return radio.GetCompEM().IsWorking(); // Включено ли радио? */ /* return radio.FindAttachmentBySlotName("НазваниеСлотаПодБатарейку")); // Есть ли батарейка? */ /* ItemBase battery = radio.FindAttachmentBySlotName("НазваниеСлотаПодБатарейку")); return battery && battery.GetQuantity() > 10; // Есть ли достаточно заряженная батарейка? */ }


	override bool ActionCondition( PlayerBase player, ActionTarget target, ItemBase item )
	{
		// Вот это у тебя вообще должно здесь обязательно быть
		PolifoniaRadio radio = PolifoniaRadio.Cast(target.GetObject());
		if (!radio) return false; 
      
		/*
		return radio.GetCompEM().IsWorking(); // Включено ли радио?
		*/
        
		/*
		return radio.FindAttachmentBySlotName("НазваниеСлотаПодБатарейку")); // Есть ли батарейка?
		*/
      
		/*
		ItemBase battery = radio.FindAttachmentBySlotName("НазваниеСлотаПодБатарейку"));
		return battery && battery.GetQuantity() > 10; // Есть ли достаточно заряженная батарейка?
		*/
    }

Допустим, тебе это нужно оставить действие и убрать эффект. Класс радио, два варианта (те же три варианта третий лень уже писать):
 

void NextTrack() { // if (GetCompEM().IsWorking()) // if (FindAttachmentBySlotName("НазваниеСлотаПодБатарейку)) { return; } StopSong(); if(CassetteValidityCheck()) { Entity mAttachedCassette = EntityAI.Cast(FindAttachmentBySlotName("BaseCassette")); int GetTracksFromConfig = mAttachedCassette.ConfigGetInt("tracks"); m_CurrentTrack = m_CurrentTrack + 1 ; if (m_CurrentTrack > GetTracksFromConfig) { m_CurrentTrack = 1; } SetSynchDirty(); } }


void NextTrack()
{
  
  // if (GetCompEM().IsWorking())
  // if (FindAttachmentBySlotName("НазваниеСлотаПодБатарейку))
  {
	return;
  }
  
  StopSong(); 
  
  if(CassetteValidityCheck())
  {
    Entity mAttachedCassette = EntityAI.Cast(FindAttachmentBySlotName("BaseCassette"));
    int GetTracksFromConfig = mAttachedCassette.ConfigGetInt("tracks");	

    m_CurrentTrack = m_CurrentTrack + 1 ;

    if (m_CurrentTrack > GetTracksFromConfig)
    {
    	m_CurrentTrack = 1;
    }
    SetSynchDirty();
  }	
}

 

Спасибо за подсказку, сейчас буду тестить

Share this post


Link to post
Share on other sites
  • 0

А как можно поставить, чтобы ограничение на прибавления музыки было? То есть чтобы бесконечно нельзя было прибавить?

modded class EffectSound extends Effect
{
	AbstractWave GetAbstractWave()
	{
		return m_SoundWaveObject;
	}	
	
	void SetMaxVolume(float volume)
	{
		m_SoundWaveVolumeMax = volume;
	}

}

Здесь прописать getmaxvolume и в основной конфиг тоже установить ограничение?

Share this post


Link to post
Share on other sites
  • 0
void SetMaxVolume(float volume)
	{
		Math.Clamp(volume, 0, 100); // Если громкость меньше 0 - поставить в 0, если больше 100 - поставить в 100
		m_SoundWaveVolumeMax = volume;
	}

Название функции кстати меня смущает. Написано "выставить максимальную громкость", а по факту получается выставляется текущая громкость..

Edited by XenoZD (see edit history)

Share this post


Link to post
Share on other sites
  • 0
53 минуты назад, XenoZD сказал:

void SetMaxVolume(float volume) { Math.Clamp(volume, 0, 100); // Если громкость меньше 0 - поставить в 0, если больше 100 - поставить в 100 m_SoundWaveVolumeMax = volume; }


void SetMaxVolume(float volume)
	{
		Math.Clamp(volume, 0, 100); // Если громкость меньше 0 - поставить в 0, если больше 100 - поставить в 100
		m_SoundWaveVolumeMax = volume;
	}

Название функции кстати меня смущает. Написано "выставить максимальную громкость", а по факту получается выставляется текущая громкость..

А в самом конфиге радио надо что-то менять? Потому что если только, вот здесь поставить матч.кламп, то ничего не меняется

Share this post


Link to post
Share on other sites
  • 0

Первое - кламп ты между какими значениями поставил? Может 100 или твоё значение слишком большое и ты даже не повышал вручную на такое число, может вообще громкость там от 0 до 1
Второе - ты уверен что m_SoundWaveVoluneMax = volume само по себе правильно влияет на громкость?

Share this post


Link to post
Share on other sites
  • 0

кламп ставил от 0 до 50, но повышение всё равно идёт, а в конфиге самого плеера поставил вот так

void SetTapeVolume()
    {
        mCassetteSound.SetMaxVolume(50);
    }

вот эффект саунд фаил где настройки глобального звука вот так сделал

modded class EffectSound extends Effect
{
	AbstractWave GetAbstractWave()
	{
		return m_SoundWaveObject;
	}	
	
	void SetMaxVolume(float volume)
	{
		Math.Clamp(volume, 0, 100);
		m_SoundWaveVolumeMax = volume;
	}

}

а настройки плеера вот так выглядят

class Polifonia_Cassette_Base extends ItemBase{};

class PolifoniaRadio : ItemBase
{
	ref EffectSound mCassetteSound = new EffectSound;
	protected float m_MusicVolume = 1.0;
	protected float m_CurrentMusicVolume = 1.0;
	protected int m_CurrentTrack = 1;
	protected int m_Track = 1;
	
	protected ref Timer	m_CurrentTrackLengthTimer;
	
	void PolifoniaRadio()
	{
		RegisterNetSyncVariableFloat("m_CurrentMusicVolume");
		RegisterNetSyncVariableInt("m_CurrentTrack");
	};

	override void OnVariablesSynchronized()
	{
		super.OnVariablesSynchronized();

		if (m_MusicVolume != m_CurrentMusicVolume)
		{
			m_MusicVolume = m_CurrentMusicVolume;
			if (mCassetteSound)
			{
				if (mCassetteSound.GetAbstractWave().IsHeaderLoaded())
				{			
					float time = mCassetteSound.GetAbstractWave().GetLength() * mCassetteSound.GetAbstractWave().GetCurrPosition();
					mCassetteSound.SetMaxVolume(m_MusicVolume);
					mCassetteSound.SetSoundVolume(m_MusicVolume);
				}
			}
		}
		
		if (m_Track != m_CurrentTrack)
		{
			m_Track = m_CurrentTrack;
			if (mCassetteSound )
			{
				OnSwitchOff();
				OnSwitchOn();
			}
		}
	};
	
	override bool CanReceiveAttachment(EntityAI attachment, int slotId)
	{
		super.CanReceiveAttachment(attachment, slotId);
		ItemBase item = ItemBase.Cast(attachment);

		if (GetCompEM().IsWorking())
		{
			return false;
		}

		return true;
	}

	bool CassetteValidityCheck()
	{
		if(FindAttachmentBySlotName("BaseCassette"))
		{
			return true;
		}
		return false;
	}

	override void OnSwitchOn()
	{
		if(CassetteValidityCheck())
		{
			Entity mAttachedCassette = EntityAI.Cast(FindAttachmentBySlotName("BaseCassette"));
			PlaySong(mAttachedCassette);
		}
	}

	override void OnSwitchOff()
	{
		if(CassetteValidityCheck())
		{
			StopSong();
			delete mCassetteSound;
		}
	}

	override void EEDelete(EntityAI parent)
	{
		if (mCassetteSound)
		mCassetteSound.SoundStop();
		delete mCassetteSound;
	}

	void PlaySong( Polifonia_Cassette_Base item)
	{
		StopSong();
		string GetSongFromConfig = item.ConfigGetString("song");			
		string CassetteName;		
		CassetteName = "Polifonia_Cassette_"+GetSongFromConfig+"_"+m_CurrentTrack+"_SoundSet";
		
		mCassetteSound = SEffectManager.PlaySoundOnObject(CassetteName, this);	
		mCassetteSound.Event_OnSoundWaveEnded.Insert(AutoNextTrack);
		mCassetteSound.SetSoundAutodestroy(true);
		SetTapeVolume();
		SetSynchDirty();
	}
	
	void StopSong()
	{
		if (mCassetteSound)
		mCassetteSound.SoundStop();		
	}
	
	void NextTrack()
	{
		if(CassetteValidityCheck())
		{
			Entity mAttachedCassette = EntityAI.Cast(FindAttachmentBySlotName("BaseCassette"));
			int GetTracksFromConfig = mAttachedCassette.ConfigGetInt("tracks");	
			
			m_CurrentTrack = m_CurrentTrack + 1 ;
		
			if (m_CurrentTrack > GetTracksFromConfig)
			{
				m_CurrentTrack = 1;
			}
			SetSynchDirty();
		}	
	}
	
	void AutoNextTrack()
	{		
		if(CassetteValidityCheck())
		{
			Entity mAttachedCassette = EntityAI.Cast(FindAttachmentBySlotName("BaseCassette"));
			int GetTracksFromConfig = mAttachedCassette.ConfigGetInt("tracks");	
			
			m_CurrentTrack = m_CurrentTrack + 1 ;
		
			if (m_CurrentTrack > GetTracksFromConfig)
			{
				m_CurrentTrack = 1;
			}
			m_Track = m_CurrentTrack;
			PlaySong(mAttachedCassette);
			SetSynchDirty();
		}
		
	}
	
	void PreviousTrack()
	{
		m_CurrentTrack = m_CurrentTrack - 1 ;
		if (m_CurrentTrack < 1)
		{
			m_CurrentTrack = 1;
		}
	
		SetSynchDirty();
	}

	void TurnVolumeUp()
	{
		m_CurrentMusicVolume = m_CurrentMusicVolume * 2;        
		SetSynchDirty();
	}

	void TurnVolumeDown()
	{
		m_CurrentMusicVolume = m_CurrentMusicVolume / 2;

		SetSynchDirty();
	}

	override bool CanReleaseAttachment(EntityAI attachment)
	{
		super.CanReleaseAttachment(attachment);
		if (GetCompEM().IsWorking())
		{
			return false;
		}
		return true;
	}

	void SetTapeVolume()
    {
        mCassetteSound.SetMaxVolume(50);
    }
	
	override void SetActions()
	{
		super.SetActions();	
		AddAction( ActionTurnOnWhileInHands );
		AddAction( ActionTurnOffWhileInHands );
		AddAction( ActionTurnOnWhileOnGround );
		AddAction( ActionTurnOffWhileOnGround );
		AddAction( ActionNextTrackInHand );
		AddAction( ActionNextTrack );
		AddAction( ActionPreviousTrack );
		AddAction( ActionPreviousTrackInHand );
		AddAction( ActionPolifoniaVolumeUp );
		AddAction( ActionPolifoniaVolumeDown );
		AddAction( ActionPolifoniaVolumeUpInHand );
		AddAction( ActionPolifoniaVolumeDownInHand );
	}
}

 

Share this post


Link to post
Share on other sites
  • 0
	override void OnVariablesSynchronized()
	{
		super.OnVariablesSynchronized();

		if (m_MusicVolume != m_CurrentMusicVolume)
		{
			m_MusicVolume = m_CurrentMusicVolume;
			if (mCassetteSound)
			{
				if (mCassetteSound.GetAbstractWave().IsHeaderLoaded())
				{			
					float time = mCassetteSound.GetAbstractWave().GetLength() * mCassetteSound.GetAbstractWave().GetCurrPosition();
					mCassetteSound.SetMaxVolume(m_MusicVolume); // А для чего эта функция вообще, если есть видимо ванильная следующая строчка?
					// Давай тут попробуем тогда
					mCassetteSound.SetSoundVolume(Math.Clamp(m_MusicVolume, 0, 50));
				}
			}
		}
		
		if (m_Track != m_CurrentTrack)
		{
			m_Track = m_CurrentTrack;
			if (mCassetteSound )
			{
				OnSwitchOff();
				OnSwitchOn();
			}
		}
	};

Если тебе и это не поможет - дальше мои полномочия всё

Share this post


Link to post
Share on other sites
  • 0
15 минут назад, XenoZD сказал:

override void OnVariablesSynchronized() { super.OnVariablesSynchronized(); if (m_MusicVolume != m_CurrentMusicVolume) { m_MusicVolume = m_CurrentMusicVolume; if (mCassetteSound) { if (mCassetteSound.GetAbstractWave().IsHeaderLoaded()) { float time = mCassetteSound.GetAbstractWave().GetLength() * mCassetteSound.GetAbstractWave().GetCurrPosition(); mCassetteSound.SetMaxVolume(m_MusicVolume); // А для чего эта функция вообще, если есть видимо ванильная следующая строчка? // Давай тут попробуем тогда mCassetteSound.SetSoundVolume(Math.Clamp(m_MusicVolume, 0, 50)); } } } if (m_Track != m_CurrentTrack) { m_Track = m_CurrentTrack; if (mCassetteSound ) { OnSwitchOff(); OnSwitchOn(); } } };


	override void OnVariablesSynchronized()
	{
		super.OnVariablesSynchronized();

		if (m_MusicVolume != m_CurrentMusicVolume)
		{
			m_MusicVolume = m_CurrentMusicVolume;
			if (mCassetteSound)
			{
				if (mCassetteSound.GetAbstractWave().IsHeaderLoaded())
				{			
					float time = mCassetteSound.GetAbstractWave().GetLength() * mCassetteSound.GetAbstractWave().GetCurrPosition();
					mCassetteSound.SetMaxVolume(m_MusicVolume); // А для чего эта функция вообще, если есть видимо ванильная следующая строчка?
					// Давай тут попробуем тогда
					mCassetteSound.SetSoundVolume(Math.Clamp(m_MusicVolume, 0, 50));
				}
			}
		}
		
		if (m_Track != m_CurrentTrack)
		{
			m_Track = m_CurrentTrack;
			if (mCassetteSound )
			{
				OnSwitchOff();
				OnSwitchOn();
			}
		}
	};

Если тебе и это не поможет - дальше мои полномочия всё

Сейчас попробуем

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.