PainkilleR

Фан-клуб

ОПРОС

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

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

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

Вступление

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

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

И ещё, так как форум этот закрытый, то субординацию соблюдать не обязательно и модераторы за порядком здесь тоже могут не следить. ^_^
[signature]
--------------------
{signature}
[/signature]
[fast]Цитировать[/fast] Жалоба
#0
BlooDFloweR
Администраторы
  • публикаций
  • комментариев
ну первый вопрос касается смены режима огня (основного или альтернативного) средней кнопкой мыши =) у меня с условиями так ничего и не вышло
Цитировать Жалоба
#1
Havcom
Мастера
  • публикаций
  • комментариев
Ладно, вот пока значит такой тестовый пример. Делал на основе огнемёта, но для вампирского дробовика несложно, думаю, будет подогнать.

Меняем нажатием на кнопку мыши режим альтернативного огня на заморозку.

RifleFlameThrower.lua
[spoiler]uSpoilerTTTvZfl
TTTvZf'
TTTvZf'
TTTvZf'
TTTvZf')).val('[\–] Спойлер');$(
TTTvZf'
TTTvZf'
TTTvZf')).val('[+] Спойлер');$(
TTTvZf'[+] Спойлер--=======================
function RifleFlameThrower:EnableFX(mode)
if self._oldmode == mode then return end

--ENTITY.Release(self._light)
ENTITY.Release(self._fxStart)
PARTICLE.Die(self._fxEnd)
PARTICLE.Die(self._fxEnd2)
self._fxStart = nil
self._fxEnd = nil
self._fxEnd2 = nil
-- self._light = nil

local fxendmode
local fxend2mode
if Game.FrozenThrower then
fxendmode = "Ectoplasmer_flamefreeze"
fxend2mode = "G_flameWarp"
else
fxendmode = "RFT_flame"
fxend2mode = "RFT_flameWarp"
end


if mode == 1 then -- normal
self._fxStart = BindFX(self._Entity,"RFT_smallflame",0.08,"joint17",0,0,0)
ENTITY.EnableGunPass(self._fxStart,true)
end

if mode == 2 then -- attack
-- self._light = CreateLight(0,0,0,255,255,255,2,5,1)
local scale = 1
if self.ObjOwner.HasWeaponModifier then scale = 1.25 end
self._fxStart = BindFX(self._Entity,"RFT_smallflame",0.08*scale,"joint17",0,0,0)
self._fxEnd = BindFX(self._Entity,fxendmode,0.25*scale,"joint17",0,0,0,nil,nil,nil,0,1.57,0)
self._fxEnd2 = BindFX(self._Entity,fxend2mode,0.25*scale,"joint17",0,0,0,nil,nil,nil,0,1.57,0)
end

self._oldmode = mode
self._fxMode = mode
end
--======================
Добавляем условие, при котором эффекты огня будут меняться после смены режима.

"Ectoplasmer_flamefreeze"
"G_flameWarp"

Это мои эффекты. Ты можешь запросто создать или подставить свои.

--=============================
function RifleFlameThrower:OnTick(delta)
if self.ObjOwner ~= Player then return end

----------------------------- -- Change FlameThrower mode
if INP.Key(Keys.MouseButtonMiddle) == 1 then
PlaySound2D("Atmosphere/Misc/Adrenaline/adrenaline_rush_check"..math.random(1,3))
AddAction({{"Customfade:FRand(1,255),FRand(1,255),FRand(1,255),2,50"},{"L:CActor:Colorize(0,0)"}})
self:OnFinishAltFire()
if Game.FrozenThrower then
Game.FrozenThrower = false
else
Game.FrozenThrower = true
end
end
-----------------------------

end
--=============================
Это условие поможет нам нажатием на среднюю кнопку мыши менять режимы.
Для себя я подставил проигрывание звука и дополнительные экшены, ты можешь подставить свои или удалить их. Как таковой, они не обязательны, просто дополнительная косметика.

--=============================
function RifleFlameThrower:FlameThrowerTest()
local s = Templates["RifleFlameThrower.CWeapon"]:GetSubClass()
-- havok's trace from player

local fv = self.ObjOwner.ForwardVector
local cx,cy,cz = ENTITY.PO_GetPawnHeadPos(self.ObjOwner._Entity)
local rot = Quaternion:New_FromNormalZ(fv.X,fv.Y,fv.Z)
local b,d,tx,ty,tz,nx,ny,nz,he,e
local scale = 1
if self.ObjOwner.HasWeaponModifier then scale = 1.25 end
for i,o in s.FlameRangePoints do
local sx,sy,sz = rot:TransformVector(o[1]*scale,o[2]*scale,o[3]*scale)
b,d,tx,ty,tz,nx,ny,nz,he,e = self.ObjOwner:TraceToPoint(cx+sx,cy+sy,cz+sz)
if b then break end
end
if b and e then
local damage = s.FlameDamage

local obj = EntityToObject [e]-- LUA gameobject
if obj then
if not Game.FrozenThrower then if obj.OnDamage then obj:OnDamage(damage,self.ObjOwner,AttackTypes.FlameThrower,x,y,z,nx,ny,nz,he) end end
----------------------------
if Game.FrozenThrower then
if obj._Class == "CActor" and not obj.IsBoss then
obj:Freeze(obj,Freeze)
end
else
BurnObject(obj)
end
----------------------------

else
if not Game.FrozenThrower then
for i=1, 1 do
local ob = GObjects:Add(TempObjName(),CloneTemplate("FlameThrowerGas.CItem"))
ob.Pos.X = tx - fv.X
ob.Pos.Y = ty - fv.Y
ob.Pos.Z = tz - fv.Z
ob.sound = "impacts/barrel-wood-fire-loop"
ob.TimeToLive = FRand(ob.TimeToLive * 0.8, ob.TimeToLive * 1.2)
ob:Apply()
ob:Synchronize()
ENTITY.SetVelocity(ob._Entity, fv.X*10, fv.Y*10, fv.Z*10)
end
end
end
end
end
--=============================
Добавляем основную смену действия альтернативной атаки, т.е. жжение огнём с возможностью менять его. А меняем на простую заморозку.

А эта строка:
if not Game.FrozenThrower then if obj.OnDamage then obj:OnDamage(damage,self.ObjOwner,AttackTypes.FlameThrower,x,y,z,nx,ny,nz,he) end end

убирает нанесение урона. Я вынес её отдельно, потому что даже при нулевом значении урон наносится и противник разбивается сразу же.

Кажется всё. Тестируй и отписывайся
.[/spoiler]
Цитировать Жалоба
#2
BlooDFloweR
Администраторы
  • публикаций
  • комментариев
Затестил. В всё нормально работает, только не знаю как устранить два глюка.
Первый - если поливать огнём и не отпуская его нажать на основной огонь, произойдёт выстрел с дробовика, но звук огнемёта так и останется проигрываться
Второй (не очень важный) - если при использовании огнемёта не отпуская кнопку атаки нажать переключение на заморозку меняется только подсветка.
А так всё отлично, багов с мобами не вызывает
_______________________________________________________________________________
Ещё есть такой вопрос: иногда бывают глюки со звуком, точно не знаю при каком условии, но обычно это происходит, когда звуков очень много. Глюк заключается в том, что звуки как бы накладываясь прерывают друг друга
Цитировать Жалоба
#3
Havcom
Мастера
  • публикаций
  • комментариев
Баг со звуком наверно вызван из-за двигла. Обычно в таких случаях помагает перезапуск игры. Были у меня редкие случаи, когда звук вообще пропадал, будто я в опциях его совсем отключил. Из-за чего? Хер знает.. <_<

По оружию мне нужны скрипты твоего дробаша, так как мои отличаются.
Цитировать Жалоба
#4
BlooDFloweR
Администраторы
  • публикаций
  • комментариев
Вот скрипт
Цитировать Жалоба
#5
Havcom
Мастера
  • публикаций
  • комментариев
Готово.

Цитата (BlooDFloweR)
Первый - если поливать огнём и не отпуская его нажать на основной огонь, произойдёт выстрел с дробовика, но звук огнемёта так и останется проигрываться

Единственное, что я тут увидел, это дубль звука при старте атаки.
Цитировать Жалоба
#6
BlooDFloweR
Администраторы
  • публикаций
  • комментариев
Havcom, ну когда я нажимаю выстрел с дробовика при включённом огнемёте, звук огнемёта остаётся пока не выстрелишь огнемётом снова.
Цитировать Жалоба
#7
Havcom
Мастера
  • публикаций
  • комментариев
т.е. Когда ты стреляешь огнём и не отпуская кнопки, производишь выстрел с дробовика, так я понял? У меня во время стрельбы огнём нельзя стрелять с дробовика.
Цитировать Жалоба
#8
BlooDFloweR
Администраторы
  • публикаций
  • комментариев
Havcom, да именно так. я держу правую кнопку, затем нажимаю на левую, выстреливает дробовик и дальше остаётся звук стреляющего огнемёта
Цитировать Жалоба
#9
Havcom
Мастера
  • публикаций
  • комментариев
Странно, я юзаю твой скрипт, но не могу стрелять с дробовика при включённом огнемёте. Это уже комбо тогда получается, но у тебя оно не прописано.

--=================================================
function VampShotGun:OnFinishAltFire()
self.FinishAltFireFX(self.ObjOwner.ClientID, self.ObjOwner._Entity,self.ObjOwner.Ammo.FlameThrower)
SOUND2D.Stop(self._sndLoop)
end

Попробуй так, хотя не знаю, поможет ли.

Ну или так: тоже не знаю, сработает ли.

--==============================================
function VampShotGun:Fire() -- VampShotGun
local s = self:GetSubClass()
if self.ObjOwner.Ammo.Shotgun > 0 then
PlayLogicSound("FIRE",self.ObjOwner.Pos.X,self.ObjOwner.Pos.Y,self.ObjOwner.Pos.Z,15,35,self.ObjOwner)
SOUND2D.Stop(self._sndLoop)
local cx,cy,cz = ENTITY.PO_GetPawnHeadPos(self.ObjOwner._Entity)
local fv = self.ObjOwner.ForwardVector
local rot = Quaternion:New_FromNormalZ(fv.X,fv.Y,fv.Z)
local hobj = {}
--
end
Цитировать Жалоба
BlooDFloweR
Администраторы
  • публикаций
  • комментариев
Havcom, вписал оба варианта - помогло =) спасибо!
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
Замечательно, хотя и станно, как это у тебя стреляет, а у меня не стреляет?? confused Выстреливает....

Добавлено (30.05.2013, 23:44)
---------------------------------------------
Как я понял, модераторам сюда тоже вход закрыт?
Цитировать Жалоба
BlooDFloweR
Администраторы
  • публикаций
  • комментариев
Havcom, вообще да, смахивает на то, что как будто там комбо, но его там нет. ну вообще это не мешает процессу, так что пусть будет, тем более что сейчас это адекватно работает)
________________________________________________________________________________

Теперь бы разобраться со скриптом Phantom. Узнать бы что значит luaProfiler_LUA3()
________________________________________________________________________________
Цитата (Havcom)
Как я понял, модераторам сюда тоже вход закрыт?

да, только мастера и администрация имеет доступ в этот раздел, собственно так и договаривались)
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
Цитата (BlooDFloweR)
только мастера и администрация

Ну и правильно! Нехер им тут делать DD

Цитата (BlooDFloweR)
luaProfiler_LUA3()

Тут нам только Максим наверно сможет обьяснить, что это и как оно работает, только надо подождать, когда он сюда зайдёт.
Цитировать Жалоба
dilettante
Мастера
  • публикаций
  • комментариев
Цитата (BlooDFloweR)
Узнать бы что значит luaProfiler_LUA3()

Я вообще с такими вещами не сталкивался. Но вот, что можно узнать из интернета на эту тему. Profiler - подпрограмма протоколирования, позволяющая оценить время выполнения отдельных функций, применяется для решения проблем производительности в коде.
 
В ПК, вероятно, информация, генерируемая профайлерами, сводится в консоль, вызываемую клавишей "H" (En). А функции luaProfiler_LUA3() в оригинальном ПК нет и вызывать её соответственно не надо.
Цитировать Жалоба
Sviatoslav
Мастера
  • публикаций
  • комментариев
Недавно был вопрос о том, как сделать, чтобы гранаты не взрывались при столкновении с предметами. А возможно ли решить другой косяк предметов: за них не держится наконечник пэйнкиллера, а сразу отскакивает назад? <_<
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
Sviatoslav, попробуй так:

Templates/Weapons/PainHead.lua

--==========================
function PainHead:Tick(delta)
--
--
if not ENTITY.IsFixedMesh(e) and not obj.PinnedPainHead then
self._back = true
end
else
if e and not (obj and (obj._Class == "CActor" or obj.DestroyPack)) then
-- WORLD.HitPhysicObject(he,tx,ty,tz,dx*250,dy*250,dz*250)
ENTITY.PO_Remove(self._Entity)
self._back = true
MDL.SetAnim(self._Entity,"close",false,1,0.2)
end
end
end
end
--=====================
Добавляем обьекту новый параметр o.PinnedPainHead = true и наконечник зацепится за него.
Это самый упрощенный вариант, за мобов не цепляется, скорее всего за разрушенные обьекты тоже.
Цитировать Жалоба
Sviatoslav
Мастера
  • публикаций
  • комментариев
Havcom, отлично, именно то, что нужно. Просто была идея сделать из разных некро-предметов что-то типа комнаты испытаний, часть которой нужно было бы проходить с помощью крюка, цепляясь за стены и потолки. Не знаю, сделаю или нет, но, в любом случае, пригодится. :)
Цитировать Жалоба
BlooDFloweR
Администраторы
  • публикаций
  • комментариев
Sviatoslav, да я гляжу у нас тут у всех идеи совпадают))
Кстати, Havcom, ты пока не пробовал реализовать шок пушку?)
Цитировать Жалоба
Sviatoslav
Мастера
  • публикаций
  • комментариев
BlooDFloweR, я не раз это уже замечал, просто лень писать было. :D В любом случае, реализация у каждого будет своя, так что, это даже интересно.
Цитировать Жалоба
BlooDFloweR
Администраторы
  • публикаций
  • комментариев
а всё же иногда такое наталкивает на мысль, что можно было бы сделать общий проект))
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
Цитата (BlooDFloweR)
Кстати, Havcom, ты пока не пробовал реализовать шок пушку?)

Пока нет. Работа всё время отнимает. последние пару дней прихожу домой в 10 вечера. Как появятся выходные, попробую что-нибудь.

Sviatoslav, этот способ не подходит. Если выстрелить наконечником в тело монстра, когда оно будет исчезать, то выскочет критическая ошибка. Решить проблему не смог.
Цитировать Жалоба
Sviatoslav
Мастера
  • публикаций
  • комментариев
Havcom, ага... Это я не проверял. Ну, ничего - если вдруг я всё же надумаю делать комнаты испытаний, то, возможно, там не будет монстров.
Цитировать Жалоба
BlooDFloweR
Администраторы
  • публикаций
  • комментариев
Sviatoslav, я так понимаю тебе главное, чтобы крюк там работал и подтягивал игрока, собственно это и будет даже не смотря на то, что от предметов он сразу будет отскакивать.
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
Свят, так ты тоже хочешь сделать крюк?
Цитировать Жалоба
Sviatoslav
Мастера
  • публикаций
  • комментариев
Havcom, да это так, идея для неопределённого будущего. Ещё давно скачал мод, позволяющий цепляться пэйнкиллером за стены и потолки, и подумал, что можно сделать специальный уровень, где игроку будет выдан этот девайс, с помощью которого нужно будет преодолевать препятствия. Для дефолтного оружия использовать это не буду.
Цитировать Жалоба
Havcom
Мастера
  • публикаций
  • комментариев
У меня тоже были такие мысли, выдавать игроку эту возможность в определённых местах, для преодоления пропастей или других непроходимых мест, но в конце я просто прикрутил эту фитчу к оригинальному оружию с возможностью включения/выключения. А идею как раз подкинул BlooDFloweR.
Цитировать Жалоба
Sviatoslav
Мастера
  • публикаций
  • комментариев
А вот ещё такие мысли есть. Ну, так, для размышления. :) Можно ли сделать скрипт, меняющий текстуру неба? Есть у меня желание всё же собраться с духом и замутить Shadow of Inferno на картах, сделаных LexaR'ом, а динамическая смена погоды была бы там очень кстати. :)
И второй вопрос - по заданиям на карты Таро. Возможно ли отследить, сколько монстриков было расчленено, заморожено, сожжено, поджарено электричеством и т.п.? Это дало бы возможность ставить новые условия для уровней.
Цитировать Жалоба
BlooDFloweR
Администраторы
  • публикаций
  • комментариев
Тоже хотелось бы знать на счёт текстурок неба, а так же возможно ли менять интенсивность и цвет блума в определённых местах?
Цитировать Жалоба
LexaR
Мастера
  • публикаций
  • комментариев
С небом,  думаю может помочь Город с Аддона,  с его молниями,  или Руины со стражником, там принцип тот же. 
Там по скрипту  быстро меняется набор текстур с молниями.   Текстуры там меняются как и везде в ПК,  по name_fps**_**. или типо того, точно не помню.   по определенному Луа скрипту,  смена этих текстур запусткается, и молния сверкает.  Если приспособить подобный скрипт к плавной смене неба,   будет  немного Резкий переход, но возможно кое что может с этого получиться.
 Второй вариант  попроще.  Это на очень низкой скорости, прицепить лайтмапу неба  с тоном и яркостью по градиенту,  и пустить плавно затемнять и высветлять и придавать цвет всему небу,  рисунок меняться не будет, а тон и цвет, да.
Цитировать Жалоба

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

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

Мы в ВК

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