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 serversDon'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

Перенос фукций детектора с намальска на другой предмет
Asked by
SnowBarsamazing
-
Our picks
Доброго времени суток. Увидел в воркшопе бесплатный мод на часы из метро и сразу появилась идея. Сделать часы не просто аксессуаром с микрофункцией показа времени, а полезным инструментом предупреждающим о выбросе ( конечно же выбросом Намальска). Открыл скрипт пищащего детектора с Намальска и скрипт часов, всего два одинаковых раздела - он ворк старт и он ворк стап. Как будто конфликта никакого нет. Ну я и приписал целиком скрипт детектора к часам. В итоге часы продолжили работать, но пищать не стали. Потыкал туда-сюда, но я балбес великий и мои личные догадки имеют слишком ограниченное количество. Поэтому решил спросить кого-то из более смышлёных людей, может кто знает, как сделать, чтобы заработало? И можно ли это сделать в принципе?
Для удобства вот скрипт часов
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