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

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

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

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

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

Перенос фукций детектора с намальска на другой предмет

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

class Metro_Watch extends Clothing
{

	const string DISPLAY_TEXTURE_PATH_FORMAT 	= "Metro_Watch/data/numbers/mwatch_%1_co.paa";
	const string ANIM_PHASE_DISPLAY_HIDE 		= "DisplayState";
	
	ItemBase	m_Battery9V; // Attached 9V
	
	static const string 		SPARKPLUG_ATTACH_SOUND = "sparkplug_attach_SoundSet";
	static const string 		SPARKPLUG_DETACH_SOUND = "sparkplug_detach_SoundSet";	
	
	override void SetActions()
	{
		super.SetActions();
		
		AddAction(ActionTurnOnWhileInHands);
		AddAction(ActionTurnOffWhileInHands);
	}

	override void OnWorkStart()
	{
		UpdateDisplayState(true);
		
		int index7 = GetHiddenSelectionIndex("lights");
		
		SetObjectMaterial(index7, "Metro_Watch\\data\\mwatch_corpus_emmisive.rvmat");
		SetObjectTexture(index7, "Metro_Watch\\data\\watch_on_co.paa");	
	}

	override void OnWorkStop()
	{
		super.OnWorkStop();
		UpdateDisplayState(false);
		
		int index1 = GetHiddenSelectionIndex("hour1");
		int index2 = GetHiddenSelectionIndex("hour2");
		int index3 = GetHiddenSelectionIndex("minute1");
		int index4 = GetHiddenSelectionIndex("minute2");
		int index5 = GetHiddenSelectionIndex("lights");
		
		SetObjectTexture(index1, "Metro_Watch\\data\\numbers\\mwatch_off_co.paa");
		SetObjectTexture(index2, "Metro_Watch\\data\\numbers\\mwatch_off_co.paa");
		SetObjectTexture(index3, "Metro_Watch\\data\\numbers\\mwatch_off_co.paa");
		SetObjectTexture(index4, "Metro_Watch\\data\\numbers\\mwatch_off_co.paa");		
		SetObjectMaterial(index5, "Metro_Watch\\data\\watch.rvmat");
		SetObjectTexture(index5, "Metro_Watch\\data\\watch_off_co.paa");	
		
	}
	
	override void OnWork(float consumed_energy)
	{
		super.OnWork(consumed_energy);

		UpdateDisplay();

	}

	protected void UpdateDisplayState(bool pIsTurnedOn)
	{
		SetAnimationPhaseNow(ANIM_PHASE_DISPLAY_HIDE, !pIsTurnedOn);
	}

	string GetTexturePath( int digit ) {
		return string.Format( DISPLAY_TEXTURE_PATH_FORMAT, digit );
	}

	void SetTime( int hour, int minute ) {
		int hourFirstDigit = hour / 10;
		int hourSecondDigit = hour % 10;

		int minuteFirstDigit = minute / 10;
		int minuteSecondDigit = minute % 10;

		SetObjectTexture( MetroWatchHiddenSelections.HOUR_0, GetTexturePath( hourFirstDigit ) );
		SetObjectTexture( MetroWatchHiddenSelections.HOUR_1, GetTexturePath( hourSecondDigit ) );
		SetObjectTexture( MetroWatchHiddenSelections.MINUTE_0, GetTexturePath( minuteFirstDigit ) );
		SetObjectTexture( MetroWatchHiddenSelections.MINUTE_1, GetTexturePath( minuteSecondDigit ) );
	}

	void UpdateDisplay() {
		int year, month, day, hour, minute;
		GetGame().GetWorld().GetDate( year, month, day, hour, minute );

		SetTime( hour, minute );

	}
	
	override void EEItemAttached( EntityAI item, string slot_name )
	{
		super.EEItemAttached( item, slot_name );
		
		ItemBase item_IB = ItemBase.Cast( item );
		
		if ( item_IB.IsKindOf("Battery9V") )
		{
			m_Battery9V = item_IB;
			//GetCompEM().SwitchOn();
			
			if ( !GetGame().IsServer()  ||  !GetGame().IsMultiplayer() )
			{
				EffectSound sound = SEffectManager.PlaySound(SPARKPLUG_ATTACH_SOUND, GetPosition() );
				sound.SetSoundAutodestroy( true );
			}
		}
	}

	override void EEItemDetached( EntityAI item, string slot_name )
	{
		super.EEItemDetached( item, slot_name );
		
		ItemBase item_IB = ItemBase.Cast( item );
		
		if ( item_IB.IsKindOf("Battery9V") )
		{
			m_Battery9V = NULL;
			GetCompEM().SwitchOff();
			
			if ( !GetGame().IsServer()  ||  !GetGame().IsMultiplayer() )
			{
				EffectSound sound = SEffectManager.PlaySound(SPARKPLUG_DETACH_SOUND, GetPosition() );
				sound.SetSoundAutodestroy( true );
			}
		}
	}	
	
	override void OnDebugSpawn()
	{
		Battery9V.Cast(GetInventory().CreateInInventory("Battery9V"));
	}
}

вот скрипт детектора с Намальска 

class dzn_detector: ItemBase
{
	protected ref Timer m_UpdateTimer = new Timer(CALL_CATEGORY_SYSTEM);
	
	static const float LOOP_SPEED_MIN = 0.5;
	static const float LOOP_SPEED_MAX = 5.0;
	
	void ~dzn_detector()
	{
		delete m_UpdateTimer;
	}
	
	override void OnWorkStart()
	{
		if (GetGame().IsClient() || !GetGame().IsMultiplayer()) {
			if (m_UpdateTimer) {
				m_UpdateTimer.Run(LOOP_SPEED_MIN, this, "OnUpdateFrame");
			}
		}
	}
	
	override void OnWorkStop()
	{
		if (GetGame().IsClient() || !GetGame().IsMultiplayer()) {
			if (m_UpdateTimer) {
				m_UpdateTimer.Stop();
			}
		}
	}
	
	void OnUpdateFrame()
	{
		float loop_value;
		// Check if stuff is even running
		NamEventManager event_manager = NamEventManager.GetInstance();
		if (event_manager) { 
			// Check if EVR is active
			EVRStorm active_event = EVRStorm.Cast(event_manager.GetEvent(EVRStorm));
			if (!active_event)
				active_event = EVRStorm.Cast(event_manager.GetEvent(EVRStormDeadly));
			if (active_event) { 
				// Check 2km distance
				float distance = vector.Distance(active_event.GetOrb().GetPosition(), GetGame().GetPlayer().GetPosition());		
				float volume = Math.Cos(distance / 3000);		
				volume = Math.Clamp(volume, 0, 1);
				BlowoutSound sound = BlowoutSound.APSI_DetectorBeep;
				if (distance < 500) {
					sound = BlowoutSound.APSI_DetectorBeep2;
				}
						
				PlayEnvironmentSound(sound, GetWorldPosition(), volume, false, this);
				
				switch (active_event.GetActivePhaseID()) {
					// slowly speed up
					case NamEventPhase.INIT: {
						loop_value = active_event.GetCurrentPhaseTimeRemainingNormalized();
						break;
					}
					
					// brrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
					case NamEventPhase.MID: {
						loop_value = 0;
						break;
					}
					
					// Makes it slow down as the event ends
					case NamEventPhase.END: {
						loop_value = Math.AbsFloat(active_event.GetCurrentPhaseTimeRemainingNormalized() - 1);
						break;
					}
				}
			}
		}
				
		m_UpdateTimer.Run(Math.Lerp(LOOP_SPEED_MIN, LOOP_SPEED_MAX, loop_value), this, "OnUpdateFrame");
	}
		
	override void SetActions()
	{
		super.SetActions();
		
		AddAction(ActionTurnOnWhileInHands);
		AddAction(ActionTurnOffWhileInHands);
	}
}

ну и что получилось у меня (человека, не разбирающегося в скриптах)

modded class Metro_Watch
{
	protected ref Timer m_UpdateTimer = new Timer(CALL_CATEGORY_SYSTEM);
	
	static const float LOOP_SPEED_MIN = 0.5;
	static const float LOOP_SPEED_MAX = 5.0;
	
	void ~Metro_Watch()
	{
		delete m_UpdateTimer;
	}
	
	override void OnWorkStart()
	{
		if (GetGame().IsClient() || !GetGame().IsMultiplayer()) {
			if (m_UpdateTimer) {
				m_UpdateTimer.Run(LOOP_SPEED_MIN, this, "OnUpdateFrame");
			}
		}
		UpdateDisplayState(true);
		
		int index7 = GetHiddenSelectionIndex("lights");
		
		SetObjectMaterial(index7, "Metro_Watch\\data\\mwatch_corpus_emmisive.rvmat");
		SetObjectTexture(index7, "Metro_Watch\\data\\watch_on_co.paa");
		
	}
	
	override void OnWorkStop()
	{
		if (GetGame().IsClient() || !GetGame().IsMultiplayer()) {
			if (m_UpdateTimer) {
				m_UpdateTimer.Stop();
			}
		}
		
		super.OnWorkStop();
		UpdateDisplayState(false);
		
		int index1 = GetHiddenSelectionIndex("hour1");
		int index2 = GetHiddenSelectionIndex("hour2");
		int index3 = GetHiddenSelectionIndex("minute1");
		int index4 = GetHiddenSelectionIndex("minute2");
		int index5 = GetHiddenSelectionIndex("lights");
		
		SetObjectTexture(index1, "Metro_Watch\\data\\numbers\\mwatch_off_co.paa");
		SetObjectTexture(index2, "Metro_Watch\\data\\numbers\\mwatch_off_co.paa");
		SetObjectTexture(index3, "Metro_Watch\\data\\numbers\\mwatch_off_co.paa");
		SetObjectTexture(index4, "Metro_Watch\\data\\numbers\\mwatch_off_co.paa");		
		SetObjectMaterial(index5, "Metro_Watch\\data\\watch.rvmat");
		SetObjectTexture(index5, "Metro_Watch\\data\\watch_off_co.paa");	
		
	}
	
	void OnUpdateFrame()
	{
		float loop_value;
		// Check if stuff is even running
		NamEventManager event_manager = NamEventManager.GetInstance();
		if (event_manager) { 
			// Check if EVR is active
			EVRStorm active_event = EVRStorm.Cast(event_manager.GetEvent(EVRStorm));
			if (!active_event)
				active_event = EVRStorm.Cast(event_manager.GetEvent(EVRStormDeadly));
			if (active_event) { 
				// Check 2km distance
				float distance = vector.Distance(active_event.GetOrb().GetPosition(), GetGame().GetPlayer().GetPosition());		
				float volume = Math.Cos(distance / 3000);		
				volume = Math.Clamp(volume, 0, 1);
				BlowoutSound sound = BlowoutSound.APSI_DetectorBeep;
				if (distance < 500) {
					sound = BlowoutSound.APSI_DetectorBeep2;
				}
						
				PlayEnvironmentSound(sound, GetWorldPosition(), volume, false, this);
				
				switch (active_event.GetActivePhaseID()) {
					// slowly speed up
					case NamEventPhase.INIT: {
						loop_value = active_event.GetCurrentPhaseTimeRemainingNormalized();
						break;
					}
					
					// brrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
					case NamEventPhase.MID: {
						loop_value = 0;
						break;
					}
					
					// Makes it slow down as the event ends
					case NamEventPhase.END: {
						loop_value = Math.AbsFloat(active_event.GetCurrentPhaseTimeRemainingNormalized() - 1);
						break;
					}
				}
			}
		}
				
		m_UpdateTimer.Run(Math.Lerp(LOOP_SPEED_MIN, LOOP_SPEED_MAX, loop_value), this, "OnUpdateFrame");
	}
}

 

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


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

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

  • 1

@SnowBarsamazing Metro_Watch у тебя наследует Clothing, попробуй изменить наследование на ItemBase как у dzn_detector

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


Ссылка на сообщение
Поделиться на других сайтах
MagicByte MagicByte MagicByte
  • 0
24.10.2024 в 12:12, alex_good_kaban сказал:

@SnowBarsamazing Metro_Watch у тебя наследует Clothing, попробуй изменить наследование на ItemBase как у dzn_detector

Всё заработало и так, просто я, бестолочь, лишний символ в пути до скрипта прописал. Но за предположение спасибо всё равно

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

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

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

Поддержка