Помощь с Lua-скриптами Баян Баян 21-02-2012, 20:56 0 В чём ошибка? Показать / Скрыть текст |-- Как правильно? [signature]--------------------{signature}[/signature] [fast]Цитировать[/fast] Жалоба #0 ItramariN Посетители + публикаций комментариев ItramariN 13 февраля 2013 22:47 0 Цитата (Evgeniy)Все вы так говорите! Потому что правда))) Добавлено (13.02.2013, 22:47) --------------------------------------------- И если говорить себе "о, какие крутые дяди там в луа скриптах копаются!" то конечно же ничему не научишься) Надо самому залазить и разбираться) Благо спросить есть у кого) Цитировать Жалоба #91 Evgeniy Модераторы публикаций комментариев Evgeniy Офлайн 13 февраля 2013 23:01 0 Цитата (ItramariN)Надо самому залазить и разбираться) Не,мне в этом смысла точно никакого нету,надо с другим разбираться.. Цитата (ItramariN)А как - тут уже надо знать как реализована коллизия Задам после этого мастерски-нубский вопрос:что такое коллизия? Цитировать Жалоба #92 ItramariN Посетители + публикаций комментариев ItramariN 13 февраля 2013 23:17 0 Цитата (Evgeniy)что такое коллизия? Collision - столкновение. Когда два объекта соприкасаются, то происходит коллизия или столкновение и игра рассчитывает поведение каждого из столкнувшихся объектов. Например, если столкнулась бочка и игрок, то скорость движения игрока замедлиться, а бочке будет придан импульс в сторону, куда двигался игрок... Цитировать Жалоба #93 dilettante Мастера публикаций комментариев dilettante 14 марта 2013 22:46 0 Всем привет здесь! Во время написания ответа на один из вопросов в ЛС, я понял, что из этого получится маленькое руководство по работе со скриптами. Те, кому интересно смотрим тут. Цитировать Жалоба #94 ItramariN Посетители + публикаций комментариев ItramariN 15 марта 2013 19:20 0 dilettante, несколько моментов хотелось бы отметить: во-первых, это не руководство по работе со скриптами, а скорее по устранению ошибок. Во-вторых по-моему, нужно еще сказать, что вначале нужно исправить самую первую ошибку в сообщении и тогда остальные могут исчезнуть сами. В остальном отлично все расписал! Цитировать Жалоба #95 dilettante Мастера публикаций комментариев dilettante 15 марта 2013 22:00 0 Цитата (ItramariN)во-первых, это не руководство по работе со скриптами, а скорее по устранению ошибок Документ так и озаглавлен "Script Error: приёмы поиска ошибок", но в целом получилось своего рода пособие, дающее некоторые навыки, полезные именно при работе со скриптами. Цитата (ItramariN)Во-вторых по-моему, нужно еще сказать, что вначале нужно исправить самую первую ошибку в сообщении ItramariN, ты предлагаешь просто выкинуть функцию Dist3D? Или организовать проверку валидности входящих данных в ней, вместо того, чтобы найти настоящий источник ошибки? Цитировать Жалоба #96 Havcom Мастера публикаций комментариев Havcom 15 марта 2013 23:34 0 В большинстве случаев стоит обращать внимание на первую строку скриптового сообщения об ошибке, если она указывает на прямой источник проблемы. В данном примере всё оказалось намного сложнее. Несомненно статья ещё принесёт пользу в решении будущих проблем. Цитировать Жалоба #97 ItramariN Посетители + публикаций комментариев ItramariN 16 марта 2013 06:52 0 Цитата (dilettante)Документ так и озаглавлен "Script Error: приёмы поиска ошибок" Это я увидел, я имел ввиду, что в твоем посте неплохо было бы сказать о чем собственно ссылка. Цитата (dilettante)ItramariN, ты предлагаешь просто выкинуть функцию Dist3D? Или организовать проверку валидности входящих данных в ней, вместо того, чтобы найти настоящий источник ошибки? Я ничего не предлагаю для конкретного примера, я говорю, что вся куча ошибок в сообщении зачастую появляется по причине самой первой. Впрочем, Havcom это и так уже сказал. Ладно, это все мелочи, главное что ты сделал хороший пример по поиску и устранению ошибок в скриптах) Цитировать Жалоба #98 Havcom Мастера публикаций комментариев Havcom 16 марта 2013 07:26 0 Цитата (ItramariN)неплохо было бы сказать о чем собственно ссылка В недавно появившейся тебе я оставил следующий пост про одну из критических ошибок игры Цитата (Сам себя в который раз)у монстра под именем HellAngel (версия 3, шо с ракетницей ходит), есть критическая ошибка, когда он выполняет RocketJump http://i54.fastpic.ru/big....fb6.jpg Вот об этом он и расписал пример решения проблемы. Цитировать Жалоба #99 ItramariN Посетители + публикаций комментариев ItramariN 16 марта 2013 11:44 0 Цитата (Havcom)Вот об этом он и расписал пример решения проблемы. Я прекрасно понял о чем он написал. Не нужно считать меня настолько тупым. Цитировать Жалоба #100 Havcom Мастера публикаций комментариев Havcom 16 марта 2013 11:51 0 Никто и не говорит о тупости. Может ты не знал, вот я и уточнил. Цитировать Жалоба #101 dilettante Мастера публикаций комментариев dilettante 16 марта 2013 23:09 0 Цитата (ItramariN)нужно еще сказать, что вначале нужно исправить самую первую ошибку в сообщении и тогда остальные могут исчезнуть сами Цитата (ItramariN)Я ничего не предлагаю для конкретного примера, я говорю, что вся куча ошибок в сообщении зачастую появляется по причине самой первой. Думаю, я понял причину недоразумения. Поэтому считаю нужным ещё раз обратить внимание на структуру самого сообщения. Во-первых, в ОДНОМ сообщении мы получаем сведения всего об ОДНОЙ ошибке, а не о куче, как может показаться. И все эти строки это последовательность корректных шагов выполнения программы, исключая саму ошибку. Во-вторых, и об этом я упомянул в своём разборе, хронология событий приведших к критической ошибке представлена СНИЗУ ВВЕРХ, а не сверху вниз, как принято читать обычный текст. В любом случае, ItramariN, спасибо, что дал оценку. Havcom не в счёт, ибо он лицо заинтересованное. Цитировать Жалоба #102 ItramariN Посетители + публикаций комментариев ItramariN 18 марта 2013 08:41 0 Цитата (dilettante)Во-вторых, и об этом я упомянул в своём разборе, хронология событий приведших к критической ошибке представлена СНИЗУ ВВЕРХ, а не сверху вниз, как принято читать обычный текст. А вот этого я не знал и в статье как-то пропустил... извиняюсь за невнимательность) Цитировать Жалоба #103 UnSlayeRLBarsik Модераторы публикаций комментариев UnSlayeRLBarsik 21 марта 2013 09:52 0 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 оригинале, а только на своей версии скриптах. Цитировать Жалоба #104 Doctor20 Модераторы публикаций комментариев Doctor20 21 марта 2013 15:54 0 Цитата (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 оригинале, а только на своей версии скриптах. А зачем поднимать паки? И как упроститься их поднятие? Цитировать Жалоба #105 UnSlayeRLBarsik Модераторы публикаций комментариев UnSlayeRLBarsik 21 марта 2013 16:01 0 Цитата (Doctor20)паки?Doctor20, Этот скрипт для мододелов, которые добавляют в мод новые виды оружия. А скрипт упрощает это. Чтобы к примеру подобрать аммо.пак к новому оружию, надо прописывать его туда и только затем он будет подбираться инче зависнет игра. под аммо.паками я имел ввиду скрипт ammo.pack (все оружие) а не Мегапаки в игре! В скрипты пейна у себя глянь все поймешь сразу. Цитировать Жалоба #106 Doctor20 Модераторы публикаций комментариев Doctor20 21 марта 2013 16:06 0 Цитата (UnSlayeR)Doctor20, Этот скрипт для мододелов, которые добавляют в мод новые виды оружия. А скрипт упрощает это. Чтобы к примеру подобрать аммо.пак к новому оружию, надо прописывать его туда и только затем он будет подбираться инче зависнет игра.под аммо.паками я имел ввиду скрипт ammo.pack (все оружие) а не Мегапаки в игре! В скрипты пейна у себя глянь все поймешь сразу. Теперь понятно. Ну я тоже правда подумал что это что-то для редактора. Цитировать Жалоба #107 UnSlayeRLBarsik Модераторы публикаций комментариев UnSlayeRLBarsik 21 марта 2013 16:11 0 Doctor20, да у меня просто желание загорелось поиграть в уровни Painkiller на Necrovision. Вот и сидел изучал и смотрел скрипты. Цитировать Жалоба #108 Havcom Мастера публикаций комментариев Havcom 22 марта 2013 21:27 0 Мне много раз задавали этот вопрос и вот я наконец решил немного расписать, что, да как. Тема пойдёт про то, как добавить музыку в меню. ------------------------------------------ Распишу по быстрому, что, куда добавлять, без подробностей. [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]=Основное Цитировать Жалоба #109 Havcom Мастера публикаций комментариев Havcom 23 марта 2013 19:55 0 Продолжаем обучение. Урок второй. Как добавить кровь на экран? [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] -------------------------- На всякий также готовые скрипты оставляю. Текстурки не забудьте копировать, куда нужно. Цитировать Жалоба #110 BlooDFloweR Администраторы публикаций комментариев BlooDFloweR 23 марта 2013 21:35 0 кстати, на счёт крови - как сделать чтобы кровь постепенно с экрана исчезала? а то у меня резко, а как исправить не знаю Цитировать Жалоба #111 Havcom Мастера публикаций комментариев Havcom 23 марта 2013 21:41 0 Сохранить все 4 изображения для одного сплата крови с разным выделением или интенсивностью. Я сам никогда не брался за это, но думаю, что так. В любом случае только тест сможет точно сказать. Изучи оригинальные текстуры крови, как они сделаны. Цитировать Жалоба #112 BlooDFloweR Администраторы публикаций комментариев BlooDFloweR 23 марта 2013 21:46 0 Havcom, вроде на сколько я помню в оригинальных текстурах идёт изменение альфа канала, а я не пойму как так сделать Цитировать Жалоба #113 Evgeniy Модераторы публикаций комментариев Evgeniy Офлайн 24 марта 2013 17:54 0 Народ,помните жуков(или пауков,а вообще они на хэдкрабов похожи),которые появляются,когда умирает локи или палач разрубает труп...Так вот,можно создать нового монстра,живущего своей жизнью,на основе модели этого хедкраба? Цитировать Жалоба #114 ItramariN Посетители + публикаций комментариев ItramariN 24 марта 2013 20:47 0 Цитата (Evgeniy)Так вот,можно создать нового монстра,живущего своей жизнью,на основе модели этого хедкраба? Ну вообще-то для моба основным является скорее его интеллект, а не моделька, так что берем скрипт какого-нибудь моба и меняем ему модельку на нужную. Как-то так. Конечно могут возникнуть ошибки с анимацией или еще чем-нибудь, но проверить это я сейчас не могу.Добавлено (24.03.2013, 20:47)---------------------------------------------Ну и понятно, что нужно найти скрипт, где ресается "хэдкраб" и ресать вместо него твоего новенького моба. Цитировать Жалоба #115 UnSlayeRLBarsik Модераторы публикаций комментариев UnSlayeRLBarsik 1 апреля 2013 11:42 0 Такой вопрос, можно ли как в Некро сделать движение персонажа? (думаю поняли?)!!! Цитировать Жалоба #116 Havcom Мастера публикаций комментариев Havcom 1 апреля 2013 17:15 0 UnSlayeR, я не понял. Более подробнее, какое движение? Цитировать Жалоба #117 UnSlayeRLBarsik Модераторы публикаций комментариев UnSlayeRLBarsik 1 апреля 2013 17:16 0 Havcom, я тебе вконтакте написал. Ну как бы персонаж идет, такое в некро есть но там очень все сложно пока-что с Process'ом. Update: Спасибо за ответ. Цитировать Жалоба #118 ItramariN Посетители + публикаций комментариев ItramariN 1 апреля 2013 22:01 0 Цитата (UnSlayeR)Havcom, я тебе вконтакте написал. А не мог бы ты здесь написать что бы все тебя поняли? Цитировать Жалоба #119 Havcom Мастера публикаций комментариев Havcom 1 апреля 2013 22:05 0 ItramariN, он имел ввиду анимацию камеры игрока Цитировать Жалоба #120