PainkilleR

Фан-клуб

ОПРОС

Оцените этот сайт

menuleft3
menuleft4
PainkillerClub.Ru » Старый форум » Модификации Painkiller » Мастерская » LUA - Вопросы/Ответы и всё в таком духе

LUA - Вопросы/Ответы и всё в таком духе

Вступление

Все темы в этом форуме доступны лишь некоторым доверенным лицам, и если вы смогли зайти сюда, значит вы из их числа! Постарайтесь также не шибко твердить о том, что тут есть такой форум, так как не все его видят. Спасибо за внимание :)

Задаём вопросы по LUA, что и как хочется сделать, моменты, которые вас интересуют и прочее.

И ещё, так как форум этот закрытый, то субординацию соблюдать не обязательно и модераторы за порядком здесь тоже могут не следить. ^_^
[signature]
--------------------
{signature}
[/signature]
[fast]Цитировать[/fast] Жалоба
#0
Sviatoslav
Мастера
  • публикаций
  • комментариев
Всем привет! Вопрос. :) Командой EnableDraw можно спрятать и предмет, и прикреплённый к нему партикл. Косяк в том, что  после загрузки сохранения партикл становится видимым. Как быть? :)
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
Sviatoslav, уверен? Вот я только что скрыл у себя артефакт, сохранился и после загрузки у меня не было видно эффектов.

[spoiler]uSpoiler54JEaQl
54JEaQ'
54JEaQ'
54JEaQ'
54JEaQ')).val('Закрыть спойлер');$(
54JEaQ'
54JEaQ'
54JEaQ')).val('Открыть спойлер
');$(
54JEaQ'Открыть спойлер
function CAction:Action_EnableDraw(entity,state,alsoChildren)
--
end

state - указываем состояние, скрыть или показать
alsoChildren - судя по всему оказывает воздействие на потомков или дочерние обьекты, скрывает эффекты.

Я проверил на двух вариантах привязки партиклей, через ParticlesDefinition и через непосредственно скрипт обьекта. В обоих случаях у меня после загрузки только свет от обьекта было видно, а эффектов небыло.

А проверял я огненный артефакт и лампу с передозного болота(deathmarch_lamp) и скрывал так:

EnableDraw:VampireArtifact_4_Fire_001,false,true[/spoiler]
Цитировать Жалоба
Sviatoslav
Мастера
  • публикаций
  • комментариев
Havcom, был уверен в обратном, пока после загрузки с чекпойнта не повылазило. :) Скрывал pentakl - звезду из Монастыря. Делал так:
 
EnableDraw:pentakl_001,false,true (спрятал)
EnableDraw:pentakl_001,true,true (показал)
 
Сейчас ещё перепроверю. Плохо, если оно вылазит даже иногда - это уже не годится. Загружался, правда, после того, как меня грохнули.

Перепроверил. Во всех случаях эффект виден после загрузки. :( И ещё обнаружил косяк: у меня есть Shadow Hand, покрытая шейдером заморозки. Вот так:
 
function o:OnCreateEntity()

local shader = "palskinned_freeze"

MDL.SetMaterial(self._Entity, shader)

end

 

После загрузки сохранения шейдер тоже слетел. Может, надо указать, что надо делать после загрузки? :)

Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
Sviatoslav, я проверил ещё раз с пентаклем и снова у меня после загрузки и чекпоинта и сохранки эффекты не появились. Проверил как на своей модификации, так и на чистом оригинале. В качестве полигона испытаний выступил атриум.

По шейдерам тут всё просто. Во-первых убери локальную переменную, ибо далее в коде этого оружия она скорее всего не используется, насколько я понял. Во-вторых добавь повторное применение шейдера для восстановления его после загрузки сохранения.

function o:OnCreateEntity()

MDL.SetMaterial(self._Entity, "palskinned_freeze")

end
--=======================================
function o:RestoreFromSave()
self._lastTime = nil
MDL.SetMaterial(self._Entity,"")
MDL.SetMaterial(self._Entity,"palskinned_freeze")
end
Цитировать Жалоба
Sviatoslav
Мастера
  • публикаций
  • комментариев
Havcom, спасибо за руку! Всё работает! :) Что удивительно, работет и команда EnableDraw. Может, глюк был, и надо было просто выйти из редактора. Так что, всё отлично! :)
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
Customfade


Чтобы создать настраиваемый Fade, достаточно отредачить стандартный, добавив возможность самому менять цвет покраски экрана.

Создаём скрипт формата CProcess, обзываем его например Customfade и вписываем это:

--===========================================
-- Customfade Task -- Тонкая настройка
--===========================================
o.BaseName = "Customfade.CProcess"
o.Time = 0.0001
--===========================================
function Customfade:New(in_out,R,G,B,tm,blend)
if in_out then R3D.ClearScreen() end
local p = Clone(self)
p.In = in_out
p.Time = tm
p._timeout = 0
p.Blend = blend -- настроить альфа наложение
p.Rcolor = R -- настроить Красный цвет
p.Gcolor = G -- настроить Зелёный цвет
p.Bcolor = B -- настроить Синий цвет

return p
end
--===========================================
function Customfade:PostRender(delta)
self._timeout = self._timeout + delta
if self._timeout >= self.Time then
self._timeout = self.Time
GObjects:ToKill(self)
end
local alpha = self._timeout / self.Time
if self.In then alpha = 1 - alpha end
local w,h = R3D.ScreenSize()
--Game:Print(alpha)
HUD.DrawQuadRGBA(0,0,0,w,h,self.Rcolor,self.Gcolor,self.Bcolor,alpha*self.Blend)
end
--===========================================

Жирным я выделил примерно то, что добавил к стандартному скрипту. Сам сравни и увидишь простую разницу. Новый скрипт нужно поместить в папку Processes.

Далее, мы создаём экшен, с помощью которого будет запускать процесс:
Открываем скрипт CAction.lua и добавляем экшен:

--===========================================
function CAction:Action_Customfade(R,G,B,time,blend)
AddObject(Templates["Customfade.CProcess"]:New(true,R,G,B,time,blend))
end


Теперь можно вписывать новый экшен в амбуши и красить экран игрока:

Customfade:0,0,0,3,150

Первые 3 нуля определяет красный, зелёный и синий цвета (макс 255)
Тройка - это продолжительность закраски экрана
А 150 - это альфа наложение (читай - интенсивность закраски) (макс 255)
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
###############################################
Ах да, простые скрипты. Чтобы добавить запуск экшена в скрипт, в наш вариант магазина, нужно сделать примерно так(саму команду я чутка переделал):

function Console:Cmd_TRAIDER()

if Game.GMode ~= GModes.SingleGame then return end
if Player then
if Player.Health >= Game.HealthCapacity then
CONSOLE.AddMessage("This is not necessary in") -- Нет нужды в покупке
return
end
end

if Game.PlayerMoney < 100 then
CONSOLE.AddMessage("The funds is not enough to make a deal") -- Недостаточно средств для сделки
PlaySound2D("misc/card-cannot_use")
return
end

PlaySound2D("menu/magicboard/money-end_transaction")
AddAction({{"Customfade:170,180,80,3,50"}})
if Player then Game.PlayerMoney = Game.PlayerMoney - 100 end

if Player then
Player.Health = Player.Health + 25
if Player.Health >= Game.HealthCapacity then Player.Health = Game.HealthCapacity end
end
if Game then CONSOLE.AddMessage("Your Cash is ---"..Game.PlayerMoney) end
end
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
================================================================
================================================================
================================================================
================================================================

По скорости:

CPlayer.lua

function CPlayer:Update()
--
if self._poisoned < 0 then
--if self._poison.SlowDown then
self._slowDown = nil
local speed, jump = GetPlayerSpeed()
SetPlayerSpeed( Player.PlayerSpeed * Game.SpeedFactor, jump / Game.SpeedFactor )

--end
self._poisoned = nil
self._poisonedTime = nil
self._poison = nil
end
--
end

---------------------------------
В артефакте все тоже самое:

function o:OnTake(player)
--
Game.SpeedFactor = 3
local speed, jump = GetPlayerSpeed()
SetPlayerSpeed( Player.PlayerSpeed * Game.SpeedFactor, jump / Game.SpeedFactor )

--
end
----------------------------
Учти, что установив скорость таким образом, она станет постоянной и чтобы вернуть её на место, придётся запустить принудительно экшены:

L:Game.SpeedFactor = 1
L:SetPlayerSpeed( Player.PlayerSpeed )


Но всё равно стоит учесть, что сбить скорость может функция Game:ResetGoldenCardsVars(), которая запускается при активации карт таро любого набора, и возможно даже простой загрузки с сохранения, хотя я не проверял.
--=======================
По поводу душ вместо патронов, так просто замени любое упоминание про патроны конкретного типа для нужного оружия на Player.SoulsCount.
Цитировать Жалоба
BlooDFloweR
Администраторы
  • публикаций
  • комментариев
Havcom, благодарствую =)
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
Definitions.lua

Создаём новую функцию следующего типа:

--====================================
function IsNoDmgToPlayerAttackType(typ)
if not typ then return end
local t = GetBaseAttackType(typ)
if t == AttackTypes.HeaterBomb then
return true
end
end


Далее в CPlayer.lua:

function CPlayer:OnDamage( damage, killer, attack_type, x, y, z, nx, ny, nz, he )
if IsNoDmgToPlayerAttackType(attack_type) then return end
--
end
Цитировать Жалоба
BlooDFloweR
Администраторы
  • публикаций
  • комментариев
Havcom, у меня игра ругается на эту строчку local t = GetBaseAttackType(typ)
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
CPlayer.lua
function CActor:OnDamage(damage, obj, type, x, y, z, nx, ny, nz, he,msg)
--
if not self.NotCountable and not self._died then
Game.BodyCountTotal = Game.BodyCountTotal + 1

if type == AttackTypes.Shotgun then self:SpawnHost() end
--
end

В самый низ скрипта дописываем:


--===================================
[b]function CActor:SpawnHost()
if not self.IsBoss and not self.NoReincarnation then
if self._AIBrain._onFloor then
ENTITY.PO_Enable(self._Entity, false)

local obj = GObjects:Add(TempObjName(),CloneTemplate("Ghost.CActor"))
obj.Pos.X = self.Pos.X
obj.Pos.Y = self.Pos.Y
obj.Pos.Z = self.Pos.Z
obj.angle = self.angle
obj._angleDest = self._angleDest
obj:Apply()

local size = 1 * 0.4 * 3

AddPFX("phantom_teleport", 1 ,Vector:New(self.Pos:Get()))

GObjects:ToKill(self)
end
end
end


При убийстве врага из дробовика будет вылупляться призрак.
Если прописать мобу o.NoReincarnation = true, тогда он будет умирать нормальной смертью от дробовика.
Цитировать Жалоба
Sviatoslav
Мастера
  • публикаций
  • комментариев
Парни, нужна помощь и мозговой штурм. А то я как лузер. DD

Первое: открытие меню "X-Files". Оно открывается как надо, но, после выхода из него опять становится закрытым. У меня сделано так:

В Cfg.lua

XFilesUnlocked = false

В PainMenu.lua

function PainMenu:AddItem( i, o )

-------------------------------------
local SupernaturalComplete = false

if Lev._Name == "C7L30_True_Story" then
SupernaturalComplete = true
end

if Game.Supernatural and SupernaturalComplete == true then
PMENU.EnableItem("Extras")
Cfg.XFilesUnlocked = true
Cfg:Save()
else
PMENU.SetItemDesc("Extras",TXT.Menu.ExtrasLocked)
Cfg.XFilesUnlocked = false
end
--------------------------------------
Что я делаю не так и как правильно?

Второе: не срабатывает нужный скрипт после загрузки/сохранения на уровне "Shadowland".
С этим столкнулся BlooDFloweR. Вкратце, ситуация такова: после убийства Аластора возвращаемся назад на уровень, проходя через бокс, в котором указано следующее:

-------------------------------------------------
o.Actions.OnKill[58] = "WaitForArtifacts:12"
o.Actions.OnKill[59] = "Wait:3"
o.Actions.OnKill[60] = "Kill:EndOfGame_001"
o.Actions.OnKill[61] = "Launch:EndOfLevel_001"
o.Actions.OnKill[62] = "Launch:EndOfLevel_002"
o.Actions.OnKill[63] = "Launch:EndOfLevel_003"
o.Actions.OnKill[64] = "Launch:EndOfLevel_004"
o.Actions.OnKill[65] = "Launch:EndOfLevel_005"
o.Actions.OnKill[66] = "Launch:EndOfLevel_006"
o.Actions.OnKill[67] = "Launch:EndOfLevel_007"
o.Actions.OnKill[68] = "Launch:EndOfLevel_008"
o.Actions.OnKill[69] = "Launch:EndOfLevel_009"
o.Actions.OnKill[70] = "Launch:EndOfLevel_010"
o.Actions.OnKill[71] = "Launch:EndOfLevel_011"
o.Actions.OnKill[72] = "Launch:EndOfLevel_012"
------------------------------------------------------

В процессе собирания звёзд лишние EndOfLevel'ы уничтожаются и запускается только один. И всё работает отлично, если в процессе прохождения не загрузить сохранение.
Цитировать Жалоба
BlooDFloweR
Администраторы
  • публикаций
  • комментариев
Sviatoslav, у меня вроде бы получилось исправить. сейчас я только всё протестирую и если нормально напишу выход
Цитировать Жалоба
BlooDFloweR
Администраторы
  • публикаций
  • комментариев
В общем всё прошло успешно. Вот что я сделал:
Для начала добавил в Cfg.lua строчку

SupernaturalComplete = false,

Далее Отредактировал твоё условие в PainMenu.lua

     local SupernaturalComplete = false
     
     if Lev._Name == "C7L30_True_Story" then
     Cfg.SupernaturalComplete = true
     Cfg:Save()  
     end

     if Cfg.SupernaturalComplete == true then
     PMENU.EnableItem("Extras")
     Cfg.XFilesUnlocked = true
     Cfg:Save()
     else
     --PMENU.SetItemDesc("Extras",TXT.Menu.ExtrasLocked)
     --Cfg.XFilesUnlocked = false
     end

На сколько я понял основная проблема была из за 
PMENU.SetItemDesc("Extras",TXT.Menu.ExtrasLocked) 
Cfg.XFilesUnlocked = false 
Игра на запоминала что компания супернатурал пройдена, потому возвращалась к этим строчкам и закрывала xfiles. Я сейчас затестил мой способ: для начала убедился что xfiles не доступно, затем прошёл заново Shadowland, собрал все звёзды (на всякий случай снова убедился что xfiles не доступно), затем вошёл в открывшейся новый портал и после загрузки true story меню xfiles стало доступно. После этого что я только не загружал, входил и выходил из игры, но меню так же оставалось доступно. Так что вот так =)
Цитировать Жалоба
Sviatoslav
Мастера
  • публикаций
  • комментариев
BlooDFloweR, спасибо! Сейчас забодяжу патч. :) А второй вопрос снимается - проблему с корректным сбором звёзд я решил.
Цитировать Жалоба
Sviatoslav
Мастера
  • публикаций
  • комментариев
Парни, возник такой вопрос. Возможно, я один, кто не обращал на это внимание и не знаю решения проблемы. :) Сейчас подготавливаю набор амбиентных треков для меню Soundtrack в Director's Cut. Скрипт для стандартного уровня выглядит примерно так:

if Cfg.Soundtrack == "extended" then
o.Music.Ambient[1] = "Music_01"
o.Music.Ambient[2] = "Music_02"
o.Music.Ambient[3] = "Music_03"
o.Music.Ambient[4] = "Music_04"
elseif Cfg.Soundtrack == "changed" then
o.Music.Ambient[1] = "Music_03"
o.Music.Ambient[2] = "Music_04"
else
o.Music.Ambient[1] = "Music_01"
o.Music.Ambient[1] = "Music_02"
end

Что делать на уровне Hell с его фазами музыки, которые, как я понял, ко всему прочему, не работают. По крайней мере, кроме музыки боя с Люцифером, я ничего не слышал. Столкнулся с этим только сейчас и ничего не придумывается. :)
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
Sviatoslav, а этот твой скрипт - это функция целая или только те строчки, что ты написал?
Цитировать Жалоба
Sviatoslav
Мастера
  • публикаций
  • комментариев
Havcom, ну, в скрипте уровня у меня только это. Кстати, можешь проверить это в Опере и в Городе на воде - там есть и скрипты и музыка. Правда, включение самой настройки надо разблокировать.
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
Как вариант, ты можешь просто не использовать смену музыки на этом уровне.
Цитировать Жалоба
Sviatoslav
Мастера
  • публикаций
  • комментариев
Havcom, просто я уже подобрал два, на мой взгляд, подходящих трека для него, а потом увидел, что там не играет и стандартный. :) Я вообще хочу постараться выпилить эти фазы и прикрутить музыку по-другому.
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
Для того, чтобы стандартный нормально заиграл, нужно добавить это в свойствах уровня:

function o:OnPlay(first)
if first then
--
SOUND.StreamLoad(0,self.Music1stPhase)
SOUND.StreamSetVolume(0,Cfg.AmbientVolume)
SOUND.StreamPlay(0)
AddObject(Templates["PMusicFade.CProcess"]:New(0,SOUND.StreamGetVolume(0),Cfg.MusicVolume,0.1))
SOUND.StreamLoad(1,self.Music2ndPhase)
--
end

Ну а сменить музыку твоим условием тогда не составляет особого труда.
Цитировать Жалоба
Sviatoslav
Мастера
  • публикаций
  • комментариев
Havcom, спасибо! :) Всё проверил, всё работает. Что интересно, мне совершенно не понравилась оригинальная музыка, гораздо лучше, когда её не было. Поэтому я решил поставить один из тех треков, что я подобрал, на первую фазу, а второй - на третью, и больше ничего не менять. Правда, не факт, что все будут в восторге от этого. :)
Цитировать Жалоба
Sviatoslav
Мастера
  • публикаций
  • комментариев
Несмотря на то, что товарищ quake_sergant несколько утомил меня своими причитаниями, есть ещё одна, описанная им, объективная проблема. :) Возможно, она встречалась не только у него, но жаловался только он. Возникает на уровне House of Pain в десяти случаях из десяти. Либо в круглом зале, либо в следующем. И там, и там есть ведьмы, а во втором ещё и монахи с топорами. Ошибки следующие:

1) самая частая:

./Data/LScripts/Classes/Ai/CAiBrain.lua:473:EvaluateGoals
./Data/LScripts/powermad.lua:1493:Update
./Data/LScripts/Main/GObjects.lua:100:?
:-1:foreachi
./Data/LScripts/Main/GObjects.lua:120:Update
./Data/LScripts/Main/Game.lua:501:Tick
./Data/LScripts/powermad.lua:190:Game_Tick

2) редко

./Data/LScripts/Main/Utils.lua:13:Clone
./Data/LScripts/HUD/HUD.lua:413:Render
./Data/LScripts/Main/Game.lua:733:PostRender
./Data/LScripts/powermad.lua:196:Game_PostRender

3) редко

not enough memory

Коллеги, поделитесь соображениями. :)
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
Sviatoslav, ошибка появляется при обычном прохождении или при загрузках с сохранок, чекпоинтов?
House of Pain - это что за уровень, а то я подзабыл?
Цитировать Жалоба
Sviatoslav
Мастера
  • публикаций
  • комментариев
Havcom, я так понял, первая ошибка, с потерей цели, появлялась в процессе игры. Вторая и третья - при загрузке с чекпойнта. Почему не хватает памяти?

Это собор из Resurrection - у меня он второй в пятой главе, в круглом зале летают ведьмы и стоят окаменевшие солдаты-зомби с моргенштернами.
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
А, это уровень, гда надо убивать врагов огнём вроде, чтобы карту получить. Ещё хотел на форум написать, чтобы ты выпилил оттуда огнемёт и оставил только лампу. Это добавило бы стимула собирать лампы и сделало это оружие центровым на этом уровне.
В общем надо смотреть, что к чему, ловить ошибку. К слову у меня небыло проблем с этим уровнем.
Цитировать Жалоба
Sviatoslav
Мастера
  • публикаций
  • комментариев
Havcom, да, это он. Кстати, идея. :) Тем более, там ещё из Hell King'ов выпадают души, дающие возможность поджигать монстров.

Да, у меня тоже никогда ничего не вылетало. А у него, как он говорит, всегда.
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
Потестил немного. Единственное, что мне пока удалось выяснить это то, что не ведьмы вызывают ошибку.
Стартуем на уровне, пролетаем чуть вперёд до следующей комнаты. Можно создать тут чекпоинт, взять его, а потом активировать амбуш в центре зала, где HellKing стоит. Сначала активация пройдёт нормально, а после загрузки с чекпоинта, повторное вхождение в амбуш вызовит ошибку. Первыми у тебя там размораживаются зомбари, в ActionEX запускается экшен Bloody, не знаю, что он делает. Ведьмы при этом пока не стартуют, как и HellKing и всё остальные, кто ещё есть. Так что вывод вполне простой. Видимо с самими зомбарями что-то не так, либо экшен Statue или Bloody оказывает негативное влияние. Методом взаимного исключения можно найти источник проблемы.
Цитировать Жалоба
Sviatoslav
Мастера
  • публикаций
  • комментариев
Havcom, интересно! Есть подозрение, что это происходит из-за высоких значений AiParams.ViewDistance у мелкой шушеры, либо из-за AiParams.alwaysSee у HellKing'a. Либо из-за всего сразу. Буду завтра рыть в этом направлении. :)
Цитировать Жалоба

Добавить комментарий

Автору будет очень приятно узнать обратную связь о своей новости.

Мы в ВК

***
Фан группа по игре
Большая группа по игре
Первая группа по игре
menuright2
menuright3
menuright4
Сайт работает под управлением DataLife Engine.
© PainkillerClub.ru 2011-2023 | © Design by Мария Андрюшечкина.