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

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

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

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

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
  • 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 );
	}
}

 

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


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

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

  • 0

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

И ещё момент

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

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

Изменено пользователем XenoZD (история изменений)

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


Ссылка на сообщение
Поделиться на других сайтах
MagicByte MagicByte MagicByte
  • 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();
		}
	}

};

 

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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();
  }	
}

 

Изменено пользователем XenoZD (история изменений)

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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? 

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


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

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

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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();
  }	
}

 

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

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


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

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

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

}

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

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
void SetMaxVolume(float volume)
	{
		Math.Clamp(volume, 0, 100); // Если громкость меньше 0 - поставить в 0, если больше 100 - поставить в 100
		m_SoundWaveVolumeMax = volume;
	}

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

Изменено пользователем XenoZD (история изменений)

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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;
	}

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

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

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


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

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

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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 );
	}
}

 

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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();
			}
		}
	};

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

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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();
			}
		}
	};

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

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

 

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


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

К сожалению, не помогло(

 

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

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

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

Поддержка