У меня тут назрело несколько вопросов относительно экспорта из Некровижн: 1.Как безошибочно сделать оружие с моделью из Necrovision,чтобы у него проигрывалась анимация(стрельбы,альт.стрельбы)?
2.Как затекстурить монстров и дать им хорошую анимацию?
3.Можно ли сделать полную копию оружия из Necrovision,т.е.чтобы были те же патроны,чтобы была та же стрельба и анимация.
Пара других вопросов: 1.Как сделать так,чтобы при заморозке противника он не становился синего цвета?
2.Как подвесить предмет в воздухе(наподобие святых предметов и объектов их Supernatural'а)?
Как безошибочно сделать оружие с моделью из Necrovision,чтобы у него проигрывалась анимация(стрельбы,альт.стрельбы)?
Если оттуда копировать модели оружия вместе с анимациями, то всё будет как надо, вроде.
Quote (Evgeniy)
2
Нигде про это не написано, поэтому придётся тебе самому как-нибудь попробовать. Теоретически, при помощи скрипта блендера можно сделать новые анимации т.к. там присутствует импорт в .ani формат, но неизвестно, работает ли это или нет. Насчёт текстур, если ты имеешь ввиду сделать свою развёртку, то тут я тоже хз, не пробовал. А сами текстуры разумеется можно редактировать, Photoshop или Paint тебе в помощь
Quote (Evgeniy)
3
Lua скрипты тебе в помощь
Quote (Evgeniy)
1
См. предыдущее. Хотя это, скорее всего, будет легче
Quote (Evgeniy)
2
Если тебе это нужно на время в редакторе, то скопируй и вставь объект, он будет висеть в воздухе, пока не будет запущена игра. А так, скорее всего, нужна какая-нибудь команда в настройках объекта
Evgeniy, чтобы объект висел в воздухе, нужно прописать в нём "o.Pinned = true" (без кавычек). Работает и на предметах и на монстрах. По оружию. Я далеко не всё знаю, но кое-что реализовал в новой версии мода, в частности, заморозку без шейдера. Нужно делать много разных изменений, так замаешься объяснять. А по добавлению моделей оружия Str_Ghost прав - модель, анимации и текстуры будут работать, а вот со стрельбой, положением на экране и прочим надо много играться со скриптами. Модификации: Painkiller: Supernatural и Portal: Supernatural
Evgeniy, ну, серая - потому что без текстуры. А чтобы убрать, надо в скрипте lua прописать: function o:OnCreateEntity() MDL.SetMeshVisibility(self._Entity, "Mesh1Shape", false) self:ReloadTextures() end Модификации: Painkiller: Supernatural и Portal: Supernatural
Вот чтобы у оружия была анимация,как я понял,должны присутствовать модели idle,attack и др? Или что-то другое?
Добавлено (01.06.2012, 09:25) --------------------------------------------- Можно ли сделать такой скрипт,чтобы при использовании прыжков карта таро не выдавалась?
У меня вопрос: как можно сделать (или как изменить IceBulet) чтобы была возможность вместо ледяной пули стрелять ледяным фаерболом который замораживает на определённом радиусе? Rise of Evil - моя группа вконтакте
Эх... и что я только не пытался сделать..., но не видит игра больше 34 карт Таро и все
К счастью или, к сожалению , но то, что касается количества карт Таро, определено скриптами:
"Data\LScripts\Main\Game.lua" Таблица Game = { ... CardsAvailable = {} - доступные карт Таро CardsSelected = {} - выбранные карты Таро ... } в массивах CardsAvailable & CardsSelected "резервируются" места для карт Таро. Массивы расширяются добавлением значения false для каждой вновь создаваемой карты.
В этом же файле ниже в функциях Game:EnableSilverCards() & Game:EnableGoldenCards() строками вида: if Game.CardsSelected[cards[N].index] then some_function end проверяется выбрана карта или нет и задаётся её действие-эффект. N в квадратных скобках обозначает номер слота, в который помещается карта в MagicBoard.
Далее необходимо внести изменения в файл "Data\LScripts\HUD\MagicBoard.lua" Во-первых, нужно перераспределить пространство доски, таблица BoardSlots = {}. Во-вторых, добавить слоты для новых карт, таблица MagicCards = {}. Думаю, разобраться не сложно (хотя, я не представляю, как можно уместить в один ряд больше слотов, чем их там есть). Единственное, на что обращаю внимание, это поле index в описаниях слотов. Ему присваивается значение равное номеру места, зарезервированного в массивах CardsAvailable & CardsSelected. В этом же файле переписываем функцию MagicBoard_UpdateCardsStatus(). В случае независимого мода функция будет выглядеть вот так:
function MagicBoard_UpdateCardsStatus() for i, o in MagicCards.timeCards do if Game.CardsAvailable[o.index] then Game.CardsSelected[o.index] = not MBOARD.IsCardInSlot( BoardSlotsTypes.TimeAll, i - 1 ) end end
for i, o in MagicCards.permCards do if Game.CardsAvailable[o.index] then Game.CardsSelected[o.index] = not MBOARD.IsCardInSlot( BoardSlotsTypes.PermAll, i - 1 ) end end
MagicBoard_SaveStatus() end
Ну, и, наконец, не забываем про "Data\LScripts\HUD\Levels.lua" и "Data\Levels\ModLevelName\ModLevelName.lua". В первом файле, в поле "card index" указывается абсолютный номер карты (CardsAvailable & CardsSelected), во втором, в пременной _MagicCard - номер слота.
Сообщение отредактировал dilettante - Воскресенье, 17.06.2012, 05:27
dilettante Огромное спасибо! Сам лично имею опыт программирования, но с lua-скриптами практически не знаком
Quote
в массивах CardsAvailable & CardsSelected "резервируются" места для карт Таро. Массивы расширяются добавлением значения false для каждой вновь создаваемой карты.
Меня тоже заинтересовали эти массивы, но я что-то совсем не подумал о том, что куча false в них - это на самом деле просто инициализация (даже лень посчитать было - а то бы может и догадался ).
По остальному я, в принципе, и сам уже разобрался, но все равно спасибо, да и другим участниками форума может пригодиться.
По поводу размещения карт, жаль конечно, что их можно размещать только в один определенный ряд, но я померил в фотошопе текстуру доски по пикселям - можно втиснуть еще по три карты в каждый ряд (итого 6) - только чтобы это не смотрелось коряво естественно над дизайном доски надо еще поработать.
Есть еще вопрос. В овердосовском Game.lua особые способности таких карт, как например, Громовая поступь или Assault, задаются вот этими переменными: BelialAssault = false, Thundersteps = false, Но движок ПК 1.64 их не понимает - я так понял что непосредственно работу этих карт через скрипты определить не получится?
Сообщение отредактировал scorcher - Воскресенье, 17.06.2012, 13:16
Есть еще вопрос. В овердосовском Game.lua особые способности таких карт, как например, Громовая поступь или Assault, задаются вот этими переменными: BelialAssault = false, Thundersteps = false, Но движок ПК 1.64 их не понимает - я так понял что непосредственно работу этих карт через скрипты определить не получится?
Почему же не получится? Очень даже получится . ==================================================== Эффект карты "Штурм" (BelialAssault) прописан в CActor.lua (Data\LScripts\Classes)
function CActor:OnDamage ... if self.CustomOnDamage then local skip, dmg ... if skip then if type ~= AttackTypes.OutOfLevel and not (self.IsBoos and Game.BelialAssault) then return end end ... end
Функция CustomOnDamage определена не у всех монстров, кроме того, монстр должен иметь "непробиваемую" защиту и вдобавок быть Боссом.
==================================================== Карта "Шаги грома" (Thundersteps) определена в CPlayer.lua (Data\LScripts\Classes)
function CPlayer:Steps(delta) ... if self._Walking ... ... if Game.Thundersteps then for i,v in Actors do if v.Health > 0 and v._AIBrain and v.OnDamage then v:OnDamage(1,nil,AttackTypes.Demon) end end end ... end ==================================================== Разумеется, всё это находится в скриптах PK:Overdose и применимо в сценариях оригинальной игры.
Еще раз спасибо... Ну теперь мне остается только над дизайном доски поработать. И последний наверное вопрос. В начале чтоб было понятней вкратце обрисую то, что я хочу сделать. В курсе наврено мы сделали аддон к супернатуралу back to the hell. Там теперь 24+10 уровней. Так вот сейчас смотрю активно конвертируются карты и вообще на форуме началась очень здравая движуха. Хотелось бы, конечно с разрешения картоделов, включить еще 6 карт (если наберется) в back to the hell.
Но чтобы не морочится с режимом аддона, включить их в режим ориг.игры, там как раз остаются свободными 6 вакансий под них. Так вот мне получается еще надо будет сделать чтобы эти новые карты Таро, так же как в оригинальном пейне перебрасывались в режим аддона. Как я понял это прописано в MagicBoard.lua - здесь в этих двух функциях:
... function MagicBoard:Setup() MagicBoard_LoadStatus()
if Game.AddOn then for i, o in MagicCards.timeCards do if o.index < 25 then Game.CardsAvailable[o.index] = true end end for i, o in MagicCards.permCards do if o.index < 25 and o.index ~= 23 then Game.CardsAvailable[o.index] = true end end end
-- Slots local i, o = next( BoardSlots, nil ) while i do local y2 = -1 if o.y2 then y2 = o.y2 end local numSlots = o.numSlots if not Game.AddOn and o.numSlots > 4 then numSlots = 12 end
local x = o.x_pk local y = o.y_pk local size = o.size_pk if Game.AddOn then x = o.x_addon y = o.y_addon size = o.size_addon end
MBOARD.SetupSlots( o.type, numSlots, y, size[1], size[2], o.spaceWidth, y2 )
for n, m in x do MBOARD.SetSlotPosition( o.type, n - 1, x[n] ) end
i,o = next( BoardSlots, i ) end
-- Cards for i, o in MagicCards.timeCards do MBOARD.AddCard( MagicCardsTypes.Time, o.name, o.texture, o.desc, o.cost, Game.CardsAvailable[o.index], Game.CardsSelected[o.index], o.bigImage ) end
for i, o in MagicCards.permCards do MBOARD.AddCard( MagicCardsTypes.Perm, o.name, o.texture, o.desc, o.cost, Game.CardsAvailable[o.index], Game.CardsSelected[o.index], o.bigImage ) end end
function MagicBoard_UpdateCardsStatus() for i, o in MagicCards.timeCards do if Game.CardsAvailable[o.index] then if o.index < 25 or Game.AddOn then Game.CardsSelected[o.index] = not MBOARD.IsCardInSlot( BoardSlotsTypes.TimeAll, i - 1 ) end end end
for i, o in MagicCards.permCards do if Game.CardsAvailable[o.index] then if o.index < 25 or Game.AddOn then Game.CardsSelected[o.index] = not MBOARD.IsCardInSlot( BoardSlotsTypes.PermAll, i - 1 ) end end end
MagicBoard_SaveStatus() end
мне кажется такой вариант будет правильным (если индексы новых карт будут 35+):
if Game.AddOn then for i, o in MagicCards.timeCards do if o.index < 25 and o.index > 34 then Game.CardsAvailable[o.index] = true end end for i, o in MagicCards.permCards do if o.index < 25 and o.index > 34 and o.index ~= 23 then Game.CardsAvailable[o.index] = true end end end
Но я не совсем понял что выполняет вот это:
if o.index < 25 or Game.AddOn then Game.CardsSelected[o.index] = not MBOARD.IsCardInSlot( BoardSlotsTypes.TimeAll, i - 1 ) end
Массивы CardsAvailable & CardsSelected хранятся в сейвах игры. Строка: Game.CardsSelected[o.index] = not MBOARD.IsCardInSlot( BoardSlotsTypes.TimeAll, i - 1 ) фиксирует состояние массива CardsSelected. Происходит это в момент нажатия на кнопку выхода с доски. Именно в этот момент и вызывается функция MagicBoard_UpdateCardsStatus. А условие if o.index < 25 or Game.AddOn then отделяет мух от котлет. То есть, если индекс карты меньше 25, а так будет, если мы играем "Heaven's Got A Hitman", то состояние карты будет сохранено по выходу с доски. Так же будет, если мы играем "BOOH" (AddOn). Очевидно условие поставлено, чтобы мы не могли манипулировать картами AddOn'а, играя в первую часть, так как индекс карт "BOOH" больше 24. Хотя с другой стороны, как ими можно манипулировать, если они даже не видны на доске .
Та часть кода, которую ты переписал, выкладывает на доску все карты оригинала, когда мы начинаем AddOn с чистого листа. Во-первых, тебе этот код, по идее не нужен совсем, ведь ты же не собираешься отдать игроку сразу все карты еще до того, как он начал играть в твой мод. Во-вторых, переписал ты его не правильно, оператор AND объединяет проверяемые значения и в данном случае условие не выполнится НИКОГДА (а значит, оно не имеет смысла), потому что один и тот же индекс не может быть и меньше 25 и больше 34 одновременно. Ну, а, поскольку, нужен масштаб оригинала, но с бОльшим количеством уровней, чем "HGAH" и "BOOH" вместе взятые, то тебе просто нужно изменить строку: if not Game.AddOn and o.numSlots > 4 then numSlots = 12 end заменив число 12 тем количеством слотов, которое у тебя будет на самом деле. Ну, и переписать MagicBoard_UpdateCardsStatus, как я говорил уже раньше.
Сообщение отредактировал dilettante - Вторник, 19.06.2012, 05:08
dilettante, ты так всё интересно рассказываешь, что не могу не влезть с парой вопросов. Первый: в оригинальной игре, когда мы находимся в меню выбора уровней (колесо с мигающим в ценре кристаллом), в табличке внизу мы видим следующее. Например: Chapter 1 Level 1 Cemetery Вопрос в том, возможно ли сделать так, чтобы первые четыре круга назывались, соответственно, Chapter 1, ...2, ...3, ...4, а пятый - по-другому (есть просто задумка сюжетно отделить пятую главу). И второй вопрос: В NecroVisioN есть бокс с названием Ladder, в котором игрок может перемещаться по вертикальной стене. Очень удобная штука, если нужна лестница там, где она не предусмотрена в карте. Лично у меня не хватило масла её адаптировать для Painkiller. Возможно ли это? Модификации: Painkiller: Supernatural и Portal: Supernatural
if o.index < 25 or Game.AddOn then Game.CardsSelected[o.index] = not MBOARD.IsCardInSlot( BoardSlotsTypes.TimeAll, i - 1 ) end
Согласен, бессмысленное условие
Quote
Та часть кода, которую ты переписал, выкладывает на доску все карты оригинала, когда мы начинаем AddOn с чистого листа. Во-первых, тебе этот код, по идее не нужен совсем, ведь ты же не собираешься отдать игроку сразу все карты еще до того, как он начал играть в твой мод.
Да, я понимал, за что она отвечает. Но наш мод сам по себе состоит из "как бы оригинал" + "аддон" - и я хотел так же как в оригинальном PK+BOOH, когда начинаешь сразу играть в BOOH, если не хочется снова проходить оригинал - имелся бы доступ к его картам (ну кроме бож. вмешат.).
По поводу:
Quote
if o.index < 25 and o.index > 34 and o.index ~= 23 then
Конечно же if (o.index < 25 or o.index > 34) and o.index ~= 23 then
Что мне конкретно надо было так это расширить карту ориг.режима с добавлением этих новых 6 карт. То есть режим аддона мы отставляем как бы не тронутым. Я сделал это вот так:
Остается только прописать работу карт в Game.lua и в CActor.lua и перерисовать доску в фотошопе. Таким образом, я делаю доступным в режиме оригинала 30 карт и могу добавить туда еще 6 уровней, как раз 5 кругов с 6 слотами - мне позволят это сделать. А в режиме аддона будут доступны 40 карт, причем 29 (минус бож.вмешат.) карт из оригинала будут доступны сразу - если захочется поиграть сразу с аддона - как это и было в классике. П.С. Еще раз огромное спасибо , прям не знаю, чтобы делал без твоих советов
возможно ли сделать так, чтобы первые четыре круга назывались, соответственно, Chapter 1, ...2, ...3, ...4, а пятый - по-другому
Sviatoslav, я могу ошибаться, но окно с "колесом", похоже, единственное в меню, в котором ничего особо не изменить. В остальных диалогах пункты меню можно обновлять динамически, но только не на "колесе", тут даже ссылка на фоновую текстуру находится непосредственно в движке.
Quote (Sviatoslav)
В NecroVisioN есть бокс с названием Ladder ... Возможно ли это адаптировать для Painkiller?
А я и не знал, что там есть такие радости как Ladder.CBox . Впрочем, я кроме демки больше ничего и не видел. Действие этого бокса основано на функциях WORLD.CreateLadder() и WORLD.EnableLadder(), также реализованных на уровне движка, NecroVision движка. В ПК работать не будет. Не знаю, что тут можно придумать, по-моему, проще все же добавить ladderzone в саму карту.