Пятница, 29.03.2024, 04:56


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]

Форум » Модификации Painkiller » Разработка модификаций и контента к ним » Помощь с Lua-скриптами (Задаем вопросы, отвечаем.)
Помощь с Lua-скриптами
EvgeniyВторник, 22.05.2012, 00:17 | Сообщение # 46





У меня тут назрело несколько вопросов относительно экспорта из Некровижн:
1.Как безошибочно сделать оружие с моделью из Necrovision,чтобы у него проигрывалась анимация(стрельбы,альт.стрельбы)?

2.Как затекстурить монстров и дать им хорошую анимацию?

3.Можно ли сделать полную копию оружия из Necrovision,т.е.чтобы были те же патроны,чтобы была та же стрельба и анимация.

Пара других вопросов:
1.Как сделать так,чтобы при заморозке противника он не становился синего цвета?

2.Как подвесить предмет в воздухе(наподобие святых предметов и объектов их Supernatural'а)?

Буду очень рад помощи!!! DD DD
 
Str_GhostВторник, 22.05.2012, 07:31 | Сообщение # 47





Quote (Evgeniy)
Как безошибочно сделать оружие с моделью из Necrovision,чтобы у него проигрывалась анимация(стрельбы,альт.стрельбы)?

Если оттуда копировать модели оружия вместе с анимациями, то всё будет как надо, вроде.
Quote (Evgeniy)
2

Нигде про это не написано, поэтому придётся тебе самому как-нибудь попробовать. Теоретически, при помощи скрипта блендера можно сделать новые анимации т.к. там присутствует импорт в .ani формат, но неизвестно, работает ли это или нет. Насчёт текстур, если ты имеешь ввиду сделать свою развёртку, то тут я тоже хз, не пробовал. А сами текстуры разумеется можно редактировать, Photoshop или Paint тебе в помощь
Quote (Evgeniy)
3

Lua скрипты тебе в помощь
Quote (Evgeniy)
1

См. предыдущее. Хотя это, скорее всего, будет легче
Quote (Evgeniy)
2

Если тебе это нужно на время в редакторе, то скопируй и вставь объект, он будет висеть в воздухе, пока не будет запущена игра. А так, скорее всего, нужна какая-нибудь команда в настройках объекта
 
SviatoslavВторник, 22.05.2012, 17:09 | Сообщение # 48
Люцифер
Сообщений: 537
Награды: 22
Репутация: 130
Статус: Offline
Evgeniy, чтобы объект висел в воздухе, нужно прописать в нём "o.Pinned = true" (без кавычек). Работает и на предметах и на монстрах.
По оружию. Я далеко не всё знаю, но кое-что реализовал в новой версии мода, в частности, заморозку без шейдера. Нужно делать много разных изменений, так замаешься объяснять. А по добавлению моделей оружия Str_Ghost прав - модель, анимации и текстуры будут работать, а вот со стрельбой, положением на экране и прочим надо много играться со скриптами.


Модификации: Painkiller: Supernatural и Portal: Supernatural
 
EvgeniyВторник, 22.05.2012, 17:11 | Сообщение # 49





Sviatoslav,я вот переделал пушку как у тебя в ролике была,но там почему то на рукоятке присутствовала серая РУКА!
Как её убрать?
 
SviatoslavВторник, 22.05.2012, 18:56 | Сообщение # 50
Люцифер
Сообщений: 537
Награды: 22
Репутация: 130
Статус: Offline
Evgeniy, ну, серая - потому что без текстуры. А чтобы убрать, надо в скрипте lua прописать:
function o:OnCreateEntity()
MDL.SetMeshVisibility(self._Entity, "Mesh1Shape", false)
self:ReloadTextures()
end


Модификации: Painkiller: Supernatural и Portal: Supernatural
 
EvgeniyПятница, 01.06.2012, 09:25 | Сообщение # 51





Вот чтобы у оружия была анимация,как я понял,должны присутствовать модели idle,attack и др?
Или что-то другое?

Добавлено (01.06.2012, 09:25)
---------------------------------------------
Можно ли сделать такой скрипт,чтобы при использовании прыжков карта таро не выдавалась?

 
BlooDFloweRВторник, 12.06.2012, 22:55 | Сообщение # 52
Бакалавр
Сообщений: 1716
Награды: 76
Репутация: 313
Статус: Offline
У меня вопрос: как можно сделать (или как изменить IceBulet) чтобы была возможность вместо ледяной пули стрелять ледяным фаерболом который замораживает на определённом радиусе?

Rise of Evil - моя группа вконтакте
 
dilettanteСуббота, 16.06.2012, 04:04 | Сообщение # 53
PK_GOD_and_KING
Сообщений: 170
Награды: 34
Репутация: 145
Статус: Offline
Quote (scorcher)
Эх... и что я только не пытался сделать..., но не видит игра больше 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
 
scorcherВоскресенье, 17.06.2012, 13:03 | Сообщение # 54
Страж
Сообщений: 179
Награды: 3
Репутация: 17
Статус: Offline
dilettante
Огромное спасибо! respect Сам лично имею опыт программирования, но с lua-скриптами практически не знаком
Quote
в массивах CardsAvailable & CardsSelected "резервируются" места для карт Таро. Массивы расширяются добавлением значения false для каждой вновь создаваемой карты.

Меня тоже заинтересовали эти массивы, но я что-то совсем не подумал о том, что куча false в них - это на самом деле просто инициализация (даже лень посчитать было - а то бы может и догадался :) ).

По остальному я, в принципе, и сам уже разобрался, но все равно спасибо, да и другим участниками форума может пригодиться.

По поводу размещения карт, жаль конечно, что их можно размещать только в один определенный ряд, но я померил в фотошопе текстуру доски по пикселям - можно втиснуть еще по три карты в каждый ряд (итого 6) - только чтобы это не смотрелось коряво естественно над дизайном доски надо еще поработать.

Есть еще вопрос. В овердосовском Game.lua особые способности таких карт, как например, Громовая поступь или Assault, задаются вот этими переменными:
BelialAssault = false,
Thundersteps = false,
Но движок ПК 1.64 их не понимает - я так понял что непосредственно работу этих карт через скрипты определить не получится?


Сообщение отредактировал scorcher - Воскресенье, 17.06.2012, 13:16
 
dilettanteВоскресенье, 17.06.2012, 23:07 | Сообщение # 55
PK_GOD_and_KING
Сообщений: 170
Награды: 34
Репутация: 145
Статус: Offline
Quote (scorcher)
Есть еще вопрос. В овердосовском 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 и применимо в сценариях оригинальной игры.
 
scorcherПонедельник, 18.06.2012, 05:28 | Сообщение # 56
Страж
Сообщений: 179
Награды: 3
Репутация: 17
Статус: Offline
Еще раз спасибо... Ну теперь мне остается только над дизайном доски поработать.
И последний наверное вопрос.
В начале чтоб было понятней вкратце обрисую то, что я хочу сделать. В курсе наврено мы сделали аддон к супернатуралу back to the hell. Там теперь 24+10 уровней. Так вот сейчас смотрю активно конвертируются карты и вообще на форуме началась очень здравая движуха. Хотелось бы, конечно с разрешения картоделов, включить еще 6 карт (если наберется) в back to the hell.

Но чтобы не морочится с режимом аддона, включить их в режим ориг.игры, там как раз остаются свободными 6 вакансий под них. Так вот мне получается еще надо будет сделать чтобы эти новые карты Таро, так же как в оригинальном пейне перебрасывались в режим аддона. Как я понял это прописано в MagicBoard.lua - здесь в этих двух функциях:


мне кажется такой вариант будет правильным (если индексы новых карт будут 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
 
dilettanteПонедельник, 18.06.2012, 14:08 | Сообщение # 57
PK_GOD_and_KING
Сообщений: 170
Награды: 34
Репутация: 145
Статус: Offline
Массивы 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
 
SviatoslavПонедельник, 18.06.2012, 14:33 | Сообщение # 58
Люцифер
Сообщений: 537
Награды: 22
Репутация: 130
Статус: Offline
dilettante, ты так всё интересно рассказываешь, что не могу не влезть с парой вопросов. :)
Первый: в оригинальной игре, когда мы находимся в меню выбора уровней (колесо с мигающим в ценре кристаллом), в табличке внизу мы видим следующее. Например:
Chapter 1
Level 1
Cemetery
Вопрос в том, возможно ли сделать так, чтобы первые четыре круга назывались, соответственно, Chapter 1, ...2, ...3, ...4, а пятый - по-другому (есть просто задумка сюжетно отделить пятую главу).
И второй вопрос: В NecroVisioN есть бокс с названием Ladder, в котором игрок может перемещаться по вертикальной стене. Очень удобная штука, если нужна лестница там, где она не предусмотрена в карте. Лично у меня не хватило масла её адаптировать для Painkiller. :D Возможно ли это?


Модификации: Painkiller: Supernatural и Portal: Supernatural
 
scorcherВторник, 19.06.2012, 03:01 | Сообщение # 59
Страж
Сообщений: 179
Награды: 3
Репутация: 17
Статус: Offline
dilettante
Quote
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

facepalm
Конечно же
if (o.index < 25 or o.index > 34) and o.index ~= 23 then

Что мне конкретно надо было так это расширить карту ориг.режима с добавлением этих новых 6 карт. То есть режим аддона мы отставляем как бы не тронутым.
Я сделал это вот так:


Остается только прописать работу карт в Game.lua и в CActor.lua и перерисовать доску в фотошопе. Таким образом, я делаю доступным в режиме оригинала 30 карт и могу добавить туда еще 6 уровней, как раз 5 кругов с 6 слотами - мне позволят это сделать. А в режиме аддона будут доступны 40 карт, причем 29 (минус бож.вмешат.) карт из оригинала будут доступны сразу - если захочется поиграть сразу с аддона - как это и было в классике.
П.С. Еще раз огромное спасибо :D , прям не знаю, чтобы делал без твоих советов
 
dilettanteВторник, 19.06.2012, 05:24 | Сообщение # 60
PK_GOD_and_KING
Сообщений: 170
Награды: 34
Репутация: 145
Статус: Offline
Quote (Sviatoslav)
возможно ли сделать так, чтобы первые четыре круга назывались, соответственно, Chapter 1, ...2, ...3, ...4, а пятый - по-другому

Sviatoslav, я могу ошибаться, но окно с "колесом", похоже, единственное в меню, в котором ничего особо не изменить. В остальных диалогах пункты меню можно обновлять динамически, но только не на "колесе", тут даже ссылка на фоновую текстуру находится непосредственно в движке.

Quote (Sviatoslav)
В NecroVisioN есть бокс с названием Ladder ... Возможно ли это адаптировать для Painkiller?

А я и не знал, что там есть такие радости как Ladder.CBox :) . Впрочем, я кроме демки больше ничего и не видел. Действие этого бокса основано на функциях WORLD.CreateLadder() и WORLD.EnableLadder(), также реализованных на уровне движка, NecroVision движка. В ПК работать не будет. Не знаю, что тут можно придумать, по-моему, проще все же добавить ladderzone в саму карту.

Добавлено (19.06.2012, 05:24)
---------------------------------------------

Quote (scorcher)
x_pk = { 53, 107, 161, 216, 271, 324, 379, 434, 487, 542, 597, 650, nil, nil, nil, nil, nil, 977, 977, 977 },

scorcher, а может, имеет смысл переиндексировать карты и не делать разрыв посередине набора, сдвинув Addon-карты в конец списка?

Quote (scorcher)
П.С. Еще раз огромное спасибо , прям не знаю, чтобы делал без твоих советов

Пожалуйста, рад помочь :) .
 
Форум » Модификации Painkiller » Разработка модификаций и контента к ним » Помощь с Lua-скриптами (Задаем вопросы, отвечаем.)
Поиск: