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
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");
	}
}

 

Share this post


Link to post
Share on other sites

2 answers to this question

Recommended Posts




  • 0
24.10.2024 в 12:12, alex_good_kaban сказал:

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

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

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.