LexaR, тут, к сожалению, это не действует. Я так и делал, но это, похоже, зависит от процесса, который запускается при команде. Модификации: Painkiller: Supernatural и Portal: Supernatural
Привет, всем. На днях получил личное сообщение от одного из участников форума в котором был ряд вопросов. Решил ответить на форуме, главным образом, потому что я не могу дать исчерпывающих ответов, и возможно к обсуждению присоединится ещё кто-то.
Итак, по мере усложнения (для меня ) вопросов:
1. Как через Actions поменять музыку на уровне?
--Определяем функцию (CAction.lua): function CAction:Action_SetMusic(song) local pcs = GObjects:GetElementsWithFieldValue("BaseName","PMusicFade*") for i,p in pcs do GObjects:ToKill(p) end local vol = Cfg.AmbientVolume local fadeTime = 5 local prevVolume = SOUND.StreamGetVolume(Lev._freeMSlot) SOUND.StreamLoad(Lev._freeMSlot,song) SOUND.StreamPlay(Lev._freeMSlot) AddObject(Templates["PMusicFade.CProcess"]:New(Lev._freeMSlot,prevVolume,vol,fadeTime)) if Lev._freeMSlot == 1 then Lev._freeMSlot = 0 else Lev._freeMSlot = 1 end AddObject(Templates["PMusicFade.CProcess"]:New(Lev._freeMSlot,SOUND.StreamGetVolume(Lev._freeMSlot),0,fadeTime,"SOUND.StreamPause("..Lev._freeMSlot..");Lev._fade=false")) Lev._fade = true end --Используем (file_name.CBox) o.BaseObj = "AmbushForPlayer.CBox" o.Actions.OnTouch[1] = "SetMusic:\"music_file_name\""
2. "Короткий" выбор оружия (доступ к слотам с номером выше 7 с помощью клавиш).
Тут всё не так однозначно. В теории, или как я это себе представляю, нажатия клавиш формируют некие байт-коды, значения которых непрерывно оцениваются функцией CPlayer:InterpretAction(delta). Здесь берётся число, сопоставленное с определённым оружием (Main\Definitions.lua) и если это число совпадает с байт-кодом клавиши, то запускается функция CPlayer:TryToChangeWeapon() с указанием нужного слота. Однако, предопределённые клавиши 8, 9, 0, F1, F2, F3, и F4 формируют "не свои" коды. Вдобавок, после того, как клавиша была нажата и отпущена код, формируемый ею продолжает сыпаться до тех пор, пока не будет нажата какая-нибудь из "правильных" кнопок. Такое поведение, похоже, задано на уровне движка, и как от этого избавиться я не знаю. Тем не менее, назначить оружие с номером слота выше, чем 7 на определённую клавишу всё же можно.
Вариантов два. Покажу на примере слота номер 8. Общим для обоих вариантов будет необходимость отвязать оружие от предопределённых клавиш:
Вариант №1 "Мягкий". Добавляем функцию смены оружия в консольные команды и затем связываем с нужной кнопкой командой Bind.
Console.lua function Console:Cmd_WEAPONEIGHT() if Game.GMode ~= GModes.SingleGame then return end local slot = 8 if Player.EnabledWeapons[slot] and slot ~= Player._CurWeaponIndex then CPlayer.WeaponChangeConfirmation(Player.ClientID,Player._Entity,slot) end end Cfg.Bind_8 = "WEAPONEIGHT"
Вариант №2 "Жёсткий". Добавляем код, связывающий смену оружия с одной клавишей и только с ней.
Game.lua function Game:Tick(delta) ... if INP.Key(Keys.K8) == 1 then if Game.GMode == GModes.SingleGame then local slot = 8 if Player.EnabledWeapons[slot] and slot ~= Player._CurWeaponIndex then CPlayer.WeaponChangeConfirmation(Player.ClientID,Player._Entity,slot) end end end ... end
Оба варианта не лишены недостатков. В первом случае за гибкость приходится платить возможной потерей связи с клавишей и необходимостью заново переназначать её. Во втором - сама по себе жёсткая привязка уже недостаток и к тому же потребуется "залочить" смену кнопки в меню настроек.
Сама функция приведена в необходимом минимуме, но не является достаточной.
3. Как поменять цвет шрифта в консоли, в меню выбора уровней и в MagicBoard. И в каких скриптах находится описание этих меню?
Тут прямо, ХЗ, где задан глобальный цвет, вероятно, что тоже в самом движке. Потратил некоторое время, но не нашёл в скриптах ничего подходящего. Единственное, что полезного могу сказать (спасибо Паше aka MonochromeRainbow, без него я бы ни за что не догадался) так это то, что консольные отклики имеют скрытый параметр, задающий цвет текста. Использовать можно так:
local color = R3D.RGB(0,0,0) -- black CONSOLE.AddMessage(string,color)
Что же касается "Колеса" и "Доски", то это - так сказать, hard движка, который не вынесен в скрипты. Доступные настройки MagicBoard находятся в одноимённом скрипте. Основная часть определений меню лежит в HUD\PainMenu.lua.
Ну, вот вроде всё, надеюсь, не бесполезно напачкал тут на страничке.
PS. Sviatoslav
твоё сообщение я получил, напишу немного позднее. И я ведь так и не доделал карты ещё. Просто совсем не хватает времени особенно с учётом моей вдумчивости (читай тугодумия).
Сообщение отредактировал Str_Ghost - Четверг, 02.08.2012, 01:21
LexaR, да, что-то я туплю. Спасибо, заработало! Единственный косяк, что эта команда не поддерживает слишком длинный текст - игра вылетает. Придётся укорачивать длинные сообщения. Пробовал UnlockMsg из NVN - она поддерживает любую длину, но не понимает разделения на строчки.
dilettante, очень интересно! С музыкой уже поэкспериментировал - работает. Но Bullet Time, видимо, непобедим - после его активации музыка не восстанавливается, как и в MusicEnv. P.S. Ок, буду ждать ответа - может мои вопросы не такие замороченные. Модификации: Painkiller: Supernatural и Portal: Supernatural
Сообщение отредактировал Sviatoslav - Четверг, 02.08.2012, 01:24
dilettante, очень интересно! С музыкой уже поэкспериментировал - работает. Но Bullet Time, видимо, непобедим - после его активации музыка не восстанавливается, как и в MusicEnv.
Тоже опробовал этот Экшен. И всё бы нечего, но не это мне нужно. Собсно экшен меняет ту музыку, которая проигрывается в данный момент, т.е. если играл Ambient, то экшен заменит Ambient, а если попёрли прокажённые, то экшен меняет боевую музыку. Но только на один раз. А я хочу сделать так, чтобы происходила глобальная замена музыки. Если можно менять FOG, FarClip и всё остальное как хочется, то и музыку можно (я думаю). Весь этот гемор мне нужен, чтобы победить падение музыки при замедлении (Ну вот пришел такой мне в голову способ). А ещё я больше чем уверен что в некро этот косяк был исправлен (да там вообще много чего было исправлено). Но как же мне так сделать. Вот это вопрос!!
так если нужно изменить полностью музыку на уровне, ведь можно просто использовать CMusicEnv , именно она и меняет музыку на уровне когда заходишь в неё. а её можно так же зафризить и запустить когда надо ...
так если нужно изменить полностью музыку на уровне, ведь можно просто использовать CMusicEnv , именно она и меняет музыку на уровне когда заходишь в неё. а её можно так же зафризить и запустить когда надо
Именно когда игрок находится в зоне такого бокса, во время замедления времени или превращения в демона, которое также использует замедление, происходит отключение (падение) музыки. Можно восстановить Ambient, если зайти в опции звука и перетащить ползунок основной громкости на 0, а потом опять на 100, но это не выход из положения. В Recurring Evil "разрабы" попытались решить проблему (и решили), создав при этом новый баг с музыкой. Поэтому в последствии потом отключили.
Весь этот гемор мне нужен, чтобы победить падение музыки при замедлении
Ок, теперь понятно чего нужно было. Попробуй тогда так:
CAction.lua --============================================================================ function CAction:Action_SetMusic(battlemusic,ambientmusic) local pcs = GObjects:GetElementsWithFieldValue("BaseName","PMusicFade*") for i,p in pcs do GObjects:ToKill(p) end
local vol = Cfg.AmbientVolume local music = Lev._CurMusic.Ambient local fadeTime = 5 local newsong = ambientmusic
if not Lev._ambient then vol = Cfg.MusicVolume music = Lev._CurMusic.Battle fadeTime = 2 newsong = battlemusic Lev._ambient = true else Lev._ambient = false end
local prevVolume = SOUND.StreamGetVolume(Lev._freeMSlot) if Lev._songInSlot[Lev._freeMSlot] == newsong then SOUND.StreamResume(Lev._freeMSlot) else SOUND.StreamLoad(Lev._freeMSlot,newsong) SOUND.StreamPlay(Lev._freeMSlot) Lev._songInSlot[Lev._freeMSlot] = newsong end
AddObject(Templates["PMusicFade.CProcess"]:New(Lev._freeMSlot,prevVolume,vol,fadeTime)) if Lev._freeMSlot == 1 then Lev._freeMSlot = 0 else Lev._freeMSlot = 1 end AddObject(Templates["PMusicFade.CProcess"]:New(Lev._freeMSlot,SOUND.StreamGetVolume(Lev._freeMSlot),0,fadeTime,"SOUND.StreamPause("..Lev._freeMSlot..");Lev._fade=false")) Lev._fade = true Lev._CurMusic.Battle[1] = battlemusic Lev._CurMusic.Ambient[1] = ambientmusic end --============================================================================
Ну, то есть, если в начале не должно быть совсем никакой музыки, то нужны хотя бы пустые массивы. Или придётся добавить соответствующую проверку. А если нет необходимости менять музыку на ходу, а лишь требуется переопределить настройки уровня, то достаточно этого:
function CAction:Action_SetMusic(battlemusic,ambientmusic) Lev._CurMusic.Battle[1] = battlemusic Lev._CurMusic.Ambient[1] = ambientmusic end
Может, я опять чего недопонял. Поправляйте.
Сообщение отредактировал Str_Ghost - Пятница, 03.08.2012, 16:36
такой вопрос: сделал аи для нового моба на основе скрипта из некровижн и у меня выходит ошибка на эту функцию из CActor:
if ev[1] <= curAnimTime and ev[2] then self[ev[2]](self,ev[3], ev[4], ev[5], ev[6], ev[7], ev[8], ev[9]) end
как я понял она нужна для нанесения урона (потому что удалил её, ошибок нет но не этот ни другие монстры урона не наносят при атаке). что можно с этим сделать? Rise of Evil - моя группа вконтакте
Havcom, а у меня приблемы с атакой на бегу. я конечно могу убрать эту функцию, но тогда после атаки модель будет возвращаться как бы в исходное положение что ни разу не красиво неужели никак не исправить? Rise of Evil - моя группа вконтакте
Havcom, а у меня приблемы с атакой на бегу. я конечно могу убрать эту функцию, но тогда после атаки модель будет возвращаться как бы в исходное положение что ни разу не красиво неужели никак не исправить?
Немного поконкретнее, что за атака на бегу и для кого ты её делаешь?
Havcom, для хэлдемона (это такая тварь с рогами из некровижна) так вот когда он кидается в атаку эта шляпа и вылезает. Rise of Evil - моя группа вконтакте
А, это наверно тот типчик, который был на видео твоего превью. Ну тут опять же надо смотреть самому. Так не могу сказать. (А вообще можно исправить. Всё можно, если захотеть).