PainkilleR

Фан-клуб

ОПРОС

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

menuleft3
menuleft4

Помощь с Lua-скриптами

В чём ошибка?

Как правильно?
[signature]
--------------------
{signature}
[/signature]
[fast]Цитировать[/fast] Жалоба
#0
ItramariN
Посетители +
  • публикаций
  • комментариев
Цитата (Evgeniy)
Все вы так говорите!

Потому что правда)))

Добавлено (13.02.2013, 22:47)
---------------------------------------------
И если говорить себе "о, какие крутые дяди там в луа скриптах копаются!" то конечно же ничему не научишься) Надо самому залазить и разбираться) Благо спросить есть у кого)
Цитировать Жалоба
Модераторы
  • публикаций
  • комментариев
Цитата (ItramariN)
Надо самому залазить и разбираться)

Не,мне в этом смысла точно никакого нету,надо с другим разбираться..

Цитата (ItramariN)
А как - тут уже надо знать как реализована коллизия

Задам после этого мастерски-нубский вопрос:что такое коллизия?
Цитировать Жалоба
ItramariN
Посетители +
  • публикаций
  • комментариев
Цитата (Evgeniy)
что такое коллизия?

Collision - столкновение. Когда два объекта соприкасаются, то происходит коллизия или столкновение и игра рассчитывает поведение каждого из столкнувшихся объектов. Например, если столкнулась бочка и игрок, то скорость движения игрока замедлиться, а бочке будет придан импульс в сторону, куда двигался игрок...
Цитировать Жалоба
dilettante
Мастера
  • публикаций
  • комментариев
Всем привет здесь!
Во время написания ответа на один из вопросов в ЛС, я понял, что из этого получится маленькое руководство по работе со скриптами. Те, кому интересно смотрим тут.
Цитировать Жалоба
ItramariN
Посетители +
  • публикаций
  • комментариев
dilettante, несколько моментов хотелось бы отметить: во-первых, это не руководство по работе со скриптами, а скорее по устранению ошибок. Во-вторых по-моему, нужно еще сказать, что вначале нужно исправить самую первую ошибку в сообщении и тогда остальные могут исчезнуть сами. В остальном отлично все расписал!
Цитировать Жалоба
dilettante
Мастера
  • публикаций
  • комментариев
Цитата (ItramariN)
во-первых, это не руководство по работе со скриптами, а скорее по устранению ошибок

Документ так и озаглавлен "Script Error: приёмы поиска ошибок", но в целом получилось своего рода пособие, дающее некоторые навыки, полезные именно при работе со скриптами.

Цитата (ItramariN)
Во-вторых по-моему, нужно еще сказать, что вначале нужно исправить самую первую ошибку в сообщении

ItramariN, ты предлагаешь просто выкинуть функцию Dist3D? Или организовать проверку валидности входящих данных в ней, вместо того, чтобы найти настоящий источник ошибки?
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
В большинстве случаев стоит обращать внимание на первую строку скриптового сообщения об ошибке, если она указывает на прямой источник проблемы. В данном примере всё оказалось намного сложнее. Несомненно статья ещё принесёт пользу в решении будущих проблем. :)
Цитировать Жалоба
ItramariN
Посетители +
  • публикаций
  • комментариев
Цитата (dilettante)
Документ так и озаглавлен "Script Error: приёмы поиска ошибок"

Это я увидел, я имел ввиду, что в твоем посте неплохо было бы сказать о чем собственно ссылка.
Цитата (dilettante)
ItramariN, ты предлагаешь просто выкинуть функцию Dist3D? Или организовать проверку валидности входящих данных в ней, вместо того, чтобы найти настоящий источник ошибки?

Я ничего не предлагаю для конкретного примера, я говорю, что вся куча ошибок в сообщении зачастую появляется по причине самой первой. Впрочем, Havcom это и так уже сказал.
Ладно, это все мелочи, главное что ты сделал хороший пример по поиску и устранению ошибок в скриптах)
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
Цитата (ItramariN)
неплохо было бы сказать о чем собственно ссылка

В недавно появившейся тебе я оставил следующий пост про одну из критических ошибок игры

Цитата (Сам себя в который раз)
у монстра под именем HellAngel (версия 3, шо с ракетницей ходит), есть критическая ошибка, когда он выполняет RocketJump

http://i54.fastpic.ru/big....fb6.jpg

Вот об этом он и расписал пример решения проблемы.
Цитировать Жалоба
ItramariN
Посетители +
  • публикаций
  • комментариев
Цитата (Havcom)
Вот об этом он и расписал пример решения проблемы.

Я прекрасно понял о чем он написал. Не нужно считать меня настолько тупым.
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
Никто и не говорит о тупости. Может ты не знал, вот я и уточнил. :)
Цитировать Жалоба
dilettante
Мастера
  • публикаций
  • комментариев
Цитата (ItramariN)
нужно еще сказать, что вначале нужно исправить самую первую ошибку в сообщении и тогда остальные могут исчезнуть сами


Цитата (ItramariN)
Я ничего не предлагаю для конкретного примера, я говорю, что вся куча ошибок в сообщении зачастую появляется по причине самой первой.


Думаю, я понял причину недоразумения. Поэтому считаю нужным ещё раз обратить внимание на структуру самого сообщения.

Во-первых, в ОДНОМ сообщении мы получаем сведения всего об ОДНОЙ ошибке, а не о куче, как может показаться. И все эти строки это последовательность корректных шагов выполнения программы, исключая саму ошибку.

Во-вторых, и об этом я упомянул в своём разборе, хронология событий приведших к критической ошибке представлена СНИЗУ ВВЕРХ, а не сверху вниз, как принято читать обычный текст.

В любом случае, ItramariN, спасибо, что дал оценку. Havcom не в счёт, ибо он лицо заинтересованное. :D
Цитировать Жалоба
ItramariN
Посетители +
  • публикаций
  • комментариев
Цитата (dilettante)
Во-вторых, и об этом я упомянул в своём разборе, хронология событий приведших к критической ошибке представлена СНИЗУ ВВЕРХ, а не сверху вниз, как принято читать обычный текст.

А вот этого я не знал и в статье как-то пропустил... извиняюсь за невнимательность)
Цитировать Жалоба
UnSlayeRLBarsik
Модераторы
  • публикаций
  • комментариев
dilettante, Хороший пост, даже как-то я лучше стал разбираться с ошибками скриптов.

Добавлено (21.03.2013, 09:52)
---------------------------------------------
Небольшой скрипт для поднятия аммо.паков в игре взятый из Necrovision, как все знают в Painkiller скриптах нужно прописывать все аммо.паки для оружия указывая их названия и т.д. (сами гляньте увидите).
Так вот Некровиженский скрипт упрощает все эту хрень, заменяя небольшой по размеру функцией:

function CPlayer:CheckMaxAmmo() -- По поиску ищите начало скрипта!
local ma = CPlayer.s_SubClass.MPMaxAmmo.Standard
if MPCfg.GameplayMode == MultiplayerGameplayMode.ArcadeGame then
ma = CPlayer.s_SubClass.MPMaxAmmo.Arcade
end
if Game.GMode == GModes.SingleGame then ma = CPlayer.s_SubClass.MaxAmmo end
for i,v in self.Ammo do
if ma[ i ] and v > ma[ i ] then self.Ammo[ i ] = ma[ i ] end
end

for i,o in self.Ammo do
self.Ammo [i]= math.floor(o)
end
end

Пропишите) ее в Cplayer.lua скрипте, заменив старый скрипт.

P.S. выкладываю так как у меня все работает нормально, пока не проверял на Painkiller оригинале, а только на своей версии скриптах.
Цитировать Жалоба
Doctor20
Модераторы
  • публикаций
  • комментариев
Цитата (UnSlayeR)
Небольшой скрипт для поднятия аммо.паков в игре взятый из Necrovision, как все знают в Painkiller скриптах нужно прописывать все аммо.паки для оружия указывая их названия и т.д. (сами гляньте увидите).Так вот Некровиженский скрипт упрощает все эту хрень, заменяя небольшой по размеру функцией:

function CPlayer:CheckMaxAmmo() -- По поиску ищите начало скрипта!
local ma = CPlayer.s_SubClass.MPMaxAmmo.Standard
if MPCfg.GameplayMode == MultiplayerGameplayMode.ArcadeGame then
ma = CPlayer.s_SubClass.MPMaxAmmo.Arcade
end
if Game.GMode == GModes.SingleGame then ma = CPlayer.s_SubClass.MaxAmmo end
for i,v in self.Ammo do
if ma[ i ] and v > ma[ i ] then self.Ammo[ i ] = ma[ i ] end
end

for i,o in self.Ammo do
self.Ammo [i]= math.floor(o)
end
end

Пропишите) ее в Cplayer.lua скрипте, заменив старый скрипт.

P.S. выкладываю так как у меня все работает нормально, пока не проверял на Painkiller оригинале, а только на своей версии скриптах.
А зачем поднимать паки? И как упроститься их поднятие? new_search
Цитировать Жалоба
UnSlayeRLBarsik
Модераторы
  • публикаций
  • комментариев
Цитата (Doctor20)
паки?
Doctor20
, Этот скрипт для мододелов, которые добавляют в мод новые виды оружия. А скрипт упрощает это. Чтобы к примеру подобрать аммо.пак к новому оружию, надо прописывать его туда и только затем он будет подбираться инче зависнет игра.
под аммо.паками я имел ввиду скрипт ammo.pack (все оружие) а не Мегапаки в игре! В скрипты пейна у себя глянь все поймешь сразу.
Цитировать Жалоба
Doctor20
Модераторы
  • публикаций
  • комментариев
Цитата (UnSlayeR)
Doctor20, Этот скрипт для мододелов, которые добавляют в мод новые виды оружия. А скрипт упрощает это. Чтобы к примеру подобрать аммо.пак к новому оружию, надо прописывать его туда и только затем он будет подбираться инче зависнет игра.под аммо.паками я имел ввиду скрипт ammo.pack (все оружие) а не Мегапаки в игре! В скрипты пейна у себя глянь все поймешь сразу.

Теперь понятно. Ну я тоже правда подумал что это что-то для редактора.
Цитировать Жалоба
UnSlayeRLBarsik
Модераторы
  • публикаций
  • комментариев
Doctor20, да у меня просто желание загорелось поиграть в уровни Painkiller на Necrovision. Вот и сидел изучал и смотрел скрипты.
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
Мне много раз задавали этот вопрос и вот я наконец решил немного расписать, что, да как. Тема пойдёт про то, как добавить музыку в меню.
------------------------------------------

Распишу по быстрому, что, куда добавлять, без подробностей.

[spoiler]uSpoilerQFwhzbl
QFwhzb'
QFwhzb'
QFwhzb'
QFwhzb')).val('[\–] Основное');$(
QFwhzb'
QFwhzb'
QFwhzb')).val('[+] Основное');$(
QFwhzb'[+] Основное
LScripts/Main/Game.lua

Game =
{
--
_menumusic = true,
--
}
--======================
function Game:LoadLevel(name)
--
PMENU.ActivateLoadingScreen( true, self.CurrLevel, Levels_GetSketchByDir(name), name )
PMENU.SetLoadingScreenOverall( Game:CountLevelElems(name), 10 )
------------------
StopMenuMusic()
------------------
-- look for level file
local files = FS.FindFiles(path.."*.CLevel",1,0)
if table.getn(files)>0 then
--
--
GObjects:AfterLoad()
Game:ApplySettings()
--
end
---------------------------------------------------------

LScripts/Main/Cfg.lua

Cfg =
{
--
MenuMusicVolume = 100,
MenuMusic = true,

--
}
---------------------------------------------------------
LScripts/HUD/PainMenu.lua
function PainMenu:Draw()
if self.showStartMovies then
if IsFinalBuild() then
PMENU.PlayMovie('../Data/Movies/logo-dreamcatcher.bik');
PMENU.PlayMovie('../Data/Movies/logo-pcf.bik');
PMENU.PlayMovie('../Data/Movies/logo-nvidia.bik');
end

self.showStartMovies = false
end

self._menumusic = name
StartMenuMusic()
SOUND.StreamSetVolume(3,Cfg.MenuMusicVolume)

if Cfg.MenuMusic == false then
Game._menumusic = false
SOUND.StreamPause(3)
end

end
--==============================
function PainMenu:SelectDifficulty(mode)
-----------------------
StopMenuMusic()
SOUND.StreamPause(3)

-----------------------
Game:Print( "SoundTrack: "..self.movSndTrack )
if not Game.AddOn then
PMENU.PlayMovie("../Data/Movies/intro.bik",self.movSndTrack)
else
PMENU.PlayMovie("../Data/Movies/booh_intro.bik",self.movSndTrack)
end
--
end
--============================
--
function PainMenu:ShowNoCDWarning()
--
end
--========================
MenuMusicTable =
{
["menustream"]={
"painkiller-mp-sacred",
"C2L3_Opera_Music",
}
}
--========================
function StartMenuMusic()
if Game and Game._menumusic then
local tab=MenuMusicTable[Game._menumusic]
if not tab then tab=MenuMusicTable["menustream"] end

if not tab then Game:Print("menuMusicTable is empty") return end

if table.getn(tab)<1 then return end
local music=tab[math.random(1,table.getn(tab))]
if not music then Game:Print("[2] menuMusicTable is empty") return end

SOUND.StreamLoad(3,music)
SOUND.StreamPlay(3,true)
SOUND.StreamSetVolume(3,Cfg.MusicVolume)
Game._menumusic=true
end
end
--=========================
function StopMenuMusic()
if Game._menumusic==true then
SOUND.StreamPause(3)
SOUND.StreamDelete(3)
Game._menumusic=false
end
end
--=========================
function PainMenu:MenuMusicOff()
if self.currScreen == nil then
return
end

Cfg['MenuMusic'] = musmenu
local musmenu = PMENU.IsItemChecked( 'MenuMusic' )
PainMenu.MenuMusic = musmenu
Cfg.MenuMusic = musmenu

Game._menumusic = false
SOUND.StreamPause(3)

if Cfg.MenuMusic == true then
SOUND.StreamResume(3)
end
end
--============================
function PainMenu:MenuMusicVolume()
if self.currScreen == nil then
return
end

local screen = self.currScreen
local musicvol = PMENU.GetSliderValue( 'MenuMusicVolume' ) / 1

Cfg['MenuMusicVolume'] = musicvol

SOUND.StreamSetVolume(3,Cfg.MenuMusicVolume)
Cfg:Save()
end


LScripts/HUD/Menu/Options/SoundOptions.lua
Добавляем в конец или куда угодно на ваше усмотрение новые таблицы. Слайдер для настройки громкости музыки и кнопка для включения/отключения музыки.

MenuMusicVolume =
{
type = MenuItemTypes.Slider,
text = "MM Volume",
desc = "Set the Menu Music Volume",
option = "MenuMusicVolume",
minValue = 0,
maxValue = 100,
x = 160,
y = 320,
action = "PainMenu:MenuMusicVolume();PainMenu:ApplyAudioSettings(false)",
warning = true,
},

MenuMusic =
{
type = MenuItemTypes.Checkbox,
text = "Menu Music",
desc = "Enable Menu Music",
option = "MenuMusic",
valueOn = true,
valueOff = false,
x = 650,
y = 555,
action = "PainMenu:MenuMusicOff()",
fontBigSize = 26,
warning = true,
},
[/spoiler]=Основное
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
Продолжаем обучение. Урок второй.
Как добавить кровь на экран?


[spoiler]uSpoilerfUZhl1l
fUZhl1'
fUZhl1'
fUZhl1'
fUZhl1')).val('[\–] Спойлер');$(
fUZhl1'
fUZhl1'
fUZhl1')).val('[+] Спойлер');$(
fUZhl1'[+] Спойлер
LScripts/Main/Game.lua


Game =
{
--
Splatdf=91,
_Splats={},
_Splattimeouts={},
_Splatn=16,
_Splatdist=5,

--
}
--==============
function Game:Clear(doNotReloadTemplates)
--
--
Hud:Loadsplats()
collectgarbage(0)
end

LScripts/HUD/HUD.lua

Hud =
{
--
--
_splat ={},
--
}
--====================
function Hud:Loadsplats()
for i = 1,6 do
self._splat[i]={}
self._splat[i][1] = MATERIAL.Create("HUD/splat/splat_red_0"..i, TextureFlags.NoLOD + TextureFlags.NoMipMaps)
for y = 1,3 do
self._splat[i][y+1]=MATERIAL.Create("HUD/splat/splat_red_0"..i.."_0"..y, TextureFlags.NoLOD + TextureFlags.NoMipMaps)
end
self._splat[i+6]={}
self._splat[i+6][1] = MATERIAL.Create("HUD/splat/splat_purple_0"..i, TextureFlags.NoLOD + TextureFlags.NoMipMaps)
for y = 1,3 do
self._splat[i+6][y+1]=MATERIAL.Create("HUD/splat/splat_purple_0"..i.."_0"..y, TextureFlags.NoLOD + TextureFlags.NoMipMaps)
end
self._splat[i+12]={}
self._splat[i+12][1] = MATERIAL.Create("HUD/splat/splat_green_0"..i, TextureFlags.NoLOD + TextureFlags.NoMipMaps)
for y = 1,3 do
self._splat[i+12][y+1]=MATERIAL.Create("HUD/splat/splat_green_0"..i.."_0"..y, TextureFlags.NoLOD + TextureFlags.NoMipMaps)
end
end

for r=1, Game._Splatn do
Game._Splattimeouts [r]= 0
end
end

--=====================
function Hud:LoadData()

self:Loadsplats()
--
self._matHealth = MATERIAL.Create("HUD/energia", TextureFlags.NoLOD + TextureFlags.NoMipMaps)
self._matArmorNormal = MATERIAL.Create("HUD/armor", TextureFlags.NoLOD + TextureFlags.NoMipMaps)
--
end
--===========================
function Hud:Render(delta)
--
--

self:Quad(self._matHealth,Cfg.HUDSize*17*w/1024,((768+Cfg.HUDSize*14)-Cfg.HUDSize*sizey)*h/768,Cfg.HUDSize,false)
-----------------------------------------------------
local y=Game._Splatn
for i=1, y do
if Game._Splattimeouts [i]> 0 and Game._Splats [i]then
Game._Splattimeouts [i]= Game._Splattimeouts [i]- 1
if Game._Splattimeouts [i]> 3*Game.Splatdf/4 then
self:QuadTrans(self._splat[Game._Splats[i].Z][1],Game._Splats[i].X,Game._Splats[i].Y,Cfg.HUDSize,false)
else
if Game._Splattimeouts [i]> Game.Splatdf/2 then
self:QuadTrans(self._splat[Game._Splats[i].Z][2],Game._Splats[i].X,Game._Splats[i].Y,Cfg.HUDSize,false)
else
if Game._Splattimeouts [i]> Game.Splatdf/4 then
self:QuadTrans(self._splat[Game._Splats[i].Z][3],Game._Splats[i].X,Game._Splats[i].Y,Cfg.HUDSize,false)
else
self:QuadTrans(self._splat[Game._Splats[i].Z][4],Game._Splats[i].X,Game._Splats[i].Y,Cfg.HUDSize,false)
end
end
end

else
Game._Splats [i]= Vector:New(math.random(w)-20,math.random(h)-20,1)
end
end

-----------------------------------------------------
if Player then
if not Player._died and not Hud.NoCrosshair then
self:QuadRGBA(self._matCrosshair,w/2,h/2,self.CrossScale,true,Cfg.CrosshairR,Cfg.CrosshairG,Cfg.CrosshairB,Cfg.CrosshairTrans/100.0*255)
end
--
end

LScripts/Classes/CActor.lua


function CActor:CreateGib(newModel)
--
local gib = MDL.MakeGib(self._Entity, ECollisionGroups.RagdollNonColliding, newModel)
if gib then
if Player and Dist3D(self.Pos.X,self.Pos.Y,self.Pos.Z,Player.Pos.X,Player.Pos.Y,Player.Pos.Z) < Game._Splatdist then
local uu = 0
local y=Game._Splatn
for l=1,y do
if Game._Splattimeouts [l]< 1 and uu < 5 then
local mod = 0
if self._GreenBlood then
mod = 12
end
if self._PurpleBlood then
mod = 6
end

uu=uu+1
Game._Splattimeouts [l]= Game.Splatdf
Game._Splats[l].Z = mod + math.random(6)
end
end
end


--Game:Print(">> enable gib <<")
self._CurAnimIndex = 0
self._gibbed = true
--
end
[/spoiler]
--------------------------
На всякий также готовые скрипты оставляю. Текстурки не забудьте копировать, куда нужно.
Цитировать Жалоба
BlooDFloweR
Администраторы
  • публикаций
  • комментариев
кстати, на счёт крови - как сделать чтобы кровь постепенно с экрана исчезала? а то у меня резко, а как исправить не знаю
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
Сохранить все 4 изображения для одного сплата крови с разным выделением или интенсивностью. Я сам никогда не брался за это, но думаю, что так. В любом случае только тест сможет точно сказать. Изучи оригинальные текстуры крови, как они сделаны.
Цитировать Жалоба
BlooDFloweR
Администраторы
  • публикаций
  • комментариев
Havcom, вроде на сколько я помню в оригинальных текстурах идёт изменение альфа канала, а я не пойму как так сделать
Цитировать Жалоба
Модераторы
  • публикаций
  • комментариев
Народ,помните жуков(или пауков,а вообще они на хэдкрабов похожи),которые появляются,когда умирает локи или палач разрубает труп...Так вот,можно создать нового монстра,живущего своей жизнью,на основе модели этого хедкраба?
Цитировать Жалоба
ItramariN
Посетители +
  • публикаций
  • комментариев
Цитата (Evgeniy)
Так вот,можно создать нового монстра,живущего своей жизнью,на основе модели этого хедкраба?

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

Добавлено (24.03.2013, 20:47)
---------------------------------------------
Ну и понятно, что нужно найти скрипт, где ресается "хэдкраб" и ресать вместо него твоего новенького моба.

Цитировать Жалоба
UnSlayeRLBarsik
Модераторы
  • публикаций
  • комментариев
Такой вопрос, можно ли как в Некро сделать движение персонажа? (думаю поняли?)!!!
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
UnSlayeR, я не понял. Более подробнее, какое движение?
Цитировать Жалоба
UnSlayeRLBarsik
Модераторы
  • публикаций
  • комментариев
Havcom, я тебе вконтакте написал. Ну как бы персонаж идет, такое в некро есть но там очень все сложно пока-что с Process'ом.

Update: Спасибо за ответ.
Цитировать Жалоба
ItramariN
Посетители +
  • публикаций
  • комментариев
Цитата (UnSlayeR)
Havcom, я тебе вконтакте написал.

А не мог бы ты здесь написать что бы все тебя поняли?
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
ItramariN, он имел ввиду анимацию камеры игрока
Цитировать Жалоба

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

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

Мы в ВК

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