Всем привет!
Как в скрипте писать проверку на уровень игрока?
Или с помощью какой скриптовой команды можно отнимать здоровье у игрока в процентах?
Отредактировано OZOZ-13 (26.07.11 16:10:35)
Форум «Лабортории Mod-Tec» |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » Форум «Лабортории Mod-Tec» » G.E.C.K. Community » Помощь по скриптам Fallout 3 и Fallout: New Vegas
Всем привет!
Как в скрипте писать проверку на уровень игрока?
Или с помощью какой скриптовой команды можно отнимать здоровье у игрока в процентах?
Отредактировано OZOZ-13 (26.07.11 16:10:35)
MuxauJl, огромное спасибо! И прошу прощения, что не поблагодарил раньше - всему виной проблемка со связью
Да не за что
Всем привет!
Как в скрипте писать проверку на уровень игрока?
GetLevel ________________________________________ Синтаксис: [ActorID.]GetLevel Функция GetLevel возвращает текущий уровень вызывающего актера (ActorID).
Следовательно:
if (Player.GetLevel >= 20) - условие выполнится если уровень игрока больше или равен 20.
MuxauJl, а на счет здоровья отнимающегося в процентах ничего не знаешь?
Там оно не в процентах отнимается/пробавляется, а в спец. игровых единицах. Точно не помню как им манипулировать (из-за проблем с компом не могу в редакторе посмотреть), сейчас Сергея позову, может он подскажет.
OZOZ-13, MuxauJl, функция, позволяющая уменьшать/повышать здоровье НПЦ/игрока выглядит так:
ActorRef.ModAV Health -10
Где:
ActorRef - Ref-имя НПЦ или Player;
ModAV - функция изменения параметра актера (Actor Value);
Health - параметр "Здоровье" выбранного актера;
"-" (минус) - алгебраический знак вычитания;
10 - значение, которое вычитается из здоровья актера.
А вообще, OZOZ-13, что конкретно требуется? Опишите ситуацию.
А какая фуркция на проверку Enable ли объект ? Если проверка на Disable вот:
if Tup.GetDisabled == 1 то может ли быть проверка на Enable вот эта функция if GetIsReference Tup == 1 ?
А какая фуркция на проверку Enable ли объект ? Если проверка на Disable вот:
if Tup.GetDisabled == 1 то может ли быть проверка на Enable вот эта функция if GetIsReference Tup == 1 ?
Enable - противоположность Disable. Поэтому проверка такая:
if Tup.GetDisabled == 0
или
if Tup.GetDisabled != 1
MuxauJl, Ясно, спасибо за информацию, а то сам бы как всегда часов 6 эксперементировал бы с функциями как это обычно я делаю
Sergey_Ros, ситуация такая: игрок находится в тригерре и у него каждые пол секунды должно отниматься по 10% здоровья. Это как бы уда током который отнимает здоровье. Отнимать здоровье в процентах нужно по следующей причине: если у игрока 30 уровень и много здоровья, то он может находится в этом триггере дольше чем игрок с 1 уровнем. Нужно что бы не зависимо от уровня у всех игроков была одинаковая ситуация.
OZOZ-13, Лучше сдела проверку на уровень, если уровень меньше 5 тогда урон 5, если уровень больше 10 и меньше 15 тогда урон 20, если уровень больше 15 и выше тогда урон 50.
А я вот замарочился и написал скрипт:
scn ModTecReduceNPCHealth short sShockOn float fPCHealthPercent float fTimer float fTimeLimiter Begin onTriggerEnter set sShockOn to 1 End Begin onTriggerLeave set sShockOn to 0 set fTimer to 0 set fTimeLimiter to 0 End Begin GameMode if (sShockOn == 1) set fTimer to (fTimer + GetSecondsPassed) if (fTimer >= fTimeLimiter) && (fTimer <= (fTimeLimiter + .5)) if (fPCHealthPercent == 0) && (Player.GetDead != 1) set fPCHealthPercent to (Player.GetAV Health / 10) endif Player.ModAV Health -fPCHealthPercent set fTimeLimiter to (fTimeLimiter + .5) endif endif End
Работает так:
- ГГ заходит в триггер;
- скрипт считывает текущее кол-во ОЗ у ГГ;
- скрипт записывает в переменную fPCHealthPercent 10% ОЗ ГГ;
- и каждые пол секунды отнимает у ГГ ОЗ, если тот в триггере.
НО. Есть нюанс - если у ГГ 20 ОЗ, скрипт будет отнимать лишь 2 очка здоровья, тогда как при 500 ОЗ он будет отнимать 50 очков. Вроде бы и то, что требовалось, но чисто гипотетически скрипт не может убить ГГ. Хотя, зная, что все числовые операции в системе обычно округляются в меньшую сторону, ГГ все же умрет. В общем, нужно тестировать.
Sergey_Ros, редактор указывает на ошибку в этом месте:
Player.ModAV Health -fPCHealthPercent
Как это исправить?
Отредактировано OZOZ-13 (28.07.11 09:15:42)
Код:Player.ModAV Health -fPCHealthPercent Как это исправить?
Убери "-" следовательно строчка будет выглядеть так Player.ModAV Health fPCHealthPercent. И вобще проверяй скрипты на валидаторе, ЗДЕСЬ.
Отредактировано Серёга (28.07.11 10:21:20)
Как это исправить?
Дописать "-" (минус) перед десяткой в строке:
set fPCHealthPercent to (Player.GetAV Health / -10)
Так как если убрать минус в "Player.ModAV Health fPCHealthPercent", то получится, что ГГ наоборот будут начисляться ОЗ (значение-то будет положительным).
Привет всем, тут такая проблемма. Я установил на активатор скрипт:
SCN aaaStreetCarModGoScript
short button
short activatedbegin onactivate player
showmessage aaaStreetCarModMessage1
set activated to 1
endbegin gamemode
if (activated == 1)
set button to getbuttonpressed
if button == 0
player.additem aaaStreetCarMod1 1
player.EquipItem aaaStreetCarMod1
aaaStreetCarModGoRef.disable
set activated to 2
elseif button == 0
endif
endif
end
Но при одевании брони скрипт на ней не работает, а работает только если самостоятельно в игре одень броню, вот скрипт на броню:
SCN aaaStreetCarArmorScript
short Driving
float ModSpeed
float Timer
short HealOncebegin OnEquip
Set Driving to 1
Set ModSpeed to 100
DisablePlayerControls 0 0 1 0 0 1 1
endbegin OnUnEquip
Set Driving to 0
Player.Setav SpeedMult 100
EnablePlayerControls
endbegin GameMode
if(HealOnce == 1)
Player.Restoreav LeftMobilityCondition 1
Set HealOnce to 0
endifif Driving == 1
Player.CastImmediateOnSelf aaaStreetCarSitOnActorPlayerEffect
if ( Timer > 0 )
Set Timer to ( Timer - GetSecondsPassed )
else
Set ModSpeed to ModSpeed+(300-0.004*ModSpeed*ModSpeed)*0.5
Player.Setav SpeedMult ModSpeedPlayer.Damageav LeftMobilityCondition 1
Set HealOnce to 1
Set Timer to 1
PlayGroup Forward 2
endif
endifend
Как сделать чтобы при нажатии на активатор одевалась броня и использовала сама скрипт ? А то почему то скрипт не работает на броне если я одеваю броню другим скриптом.
И вот ещё вопрос, объясните значение кнопок на функции IsKeyPressed, ну типа как IsKeyPressed 25 это действие на кнопку P а например какая кнопка Е ?
Ну у меня после нажатия на кнопку P или Е или другой какой нибудь кнопкой будет удалятся броня из инвенторя.
И при том как выкинуть из инвенторя эту бронь тогда должен активироватся один раз такой скрипт:
scn aaaStreetCarQuest2Script
float tmp
Begin GameMode
set tmp to player.getpos x + 200
player.setpos x tmp
player.placeatme aaaStreetCarModGo == 1
player.removeitem aaaStreetCarMod1 1
return
endif
End
Но мне нужно чтобы при том как каждый раз я выкидую броню, каждый раз использовался этот скрипт один раз. Подскажите как реализовать ?
Отредактировано Серёга (29.07.11 01:23:59)
Серёга, по пунктам.
Скрипт первый
if button == 0 elseif button == 0 endif
Вот что думает программа: если нажата первая кнопка в сообщении, то выполнить скрипт, иначе, если нажата первая кнопка, то ничего не делать. Я так понимаю, нужно изменить "0" на "1" в условии elseif.
Броня может не одеваться из-за этой логической ошибки. Но есть и второй вариант: нужно сделать небольшую задержку между добавлением брони в инвентарь и ее одеванием.
А то почему то скрипт не работает на броне если я одеваю броню другим скриптом.
Что за "другой скрипт"? Можно код в студию?
И вот ещё вопрос, объясните значение кнопок на функции IsKeyPressed
Параметр у функции IsKeyPressed является числом-кодом. Вот список всех клавиш и соответствующих им кодов: FOSE Command Docs
Но мне нужно чтобы при том как каждый раз я выкидую броню, каждый раз использовался этот скрипт один раз.
Используйте блок onDrop в скрипте брони.
Вот что думает программа: если нажата первая кнопка в сообщении, то выполнить скрипт, иначе, если нажата первая кнопка, то ничего не делать. Я так понимаю, нужно изменить "0" на "1" в условии elseif.
Не помогло, второй вариант ещё не пробывал.
Параметр у функции IsKeyPressed является числом-кодом. Вот список всех клавиш и соответствующих им кодов: FOSE Command Docs
Выбрал себе нужную кнопку, спасибо за ссылку.
Используйте блок onDrop в скрипте брони.
Скрипт работает, но теперь в этом скрипте эта строчка безполезная (это скрипт на активатор):
SCN aaaStreetCarModGoScript
short button
short activatedbegin onactivate player
showmessage aaaStreetCarModMessage1
set activated to 1
endbegin gamemode
if (activated == 1)
set button to getbuttonpressed
if button == 0
player.additem aaaStreetCarMod1 1
player.EquipItem aaaStreetCarMod1
aaaStreetCarModGoRef.disable
set activated to 2
elseif button == 0
endif
endif
end
Можно ли как нибудь без постоянной реф ссылки сделать ищезновение объекта при активации (каждый раз) ? Просто у меня бронь выкинуть нельзя, а бронь щитается транспортом, можно только удалить из инвенторя зажав Tab ну и при удалении объекта, как вы поняли появляется этот объект aaaStreetCarModGo рядом с гг. Но теперь при появлении объекта если я его активирую он не ищезает так как нет постоянной реф ссылки, а будит ли работать player.placeatme aaaStreetCarModGoRef == 1 появление объекта с реф ссылкой ? И вот ещё проблема, после удаления брони из инвенторя скрипт с брони всё равно действует на гг, как это исправить ?
Отредактировано Серёга (30.07.11 02:27:12)
Можно ли как нибудь без постоянной реф ссылки сделать ищезновение объекта при активации (каждый раз) ?
Если нужно disable'нуть объект, на котором и висит скрипт, достаточно просто написать "Disable". То есть:
player.EquipItem aaaStreetCarMod1 disable set activated to 2
И вот ещё проблема, после удаления брони из инвенторя скрипт с брони всё равно действует на гг, как это исправить ?
В блоке OnDrop на броне нужно сбросить все переменные на начальные значения.
Здравствуйте. Понадобился вот такой вот скрипт...
Нужно что бы когда гг активировал кровать тух экран. после он просыпался в 16:00 следующего дня и проигрывалась анимация как он встаёт с этой кровати. на счёт последнего можно использовать player.MoveTo idref кровати но при этом гг тупо лежит и при нажимании любых клавиш он всёравно лежит. тем более камера от 1 становится ужасна, можно смотреть сквозь текстуры. ElRayQueenBedRightREF - id кроватки.
Большое спасибо что делали для меня скрипты, надеюсь сей час вы тоже мне поможете)
когда гг активировал кровать тух экран
Используйте функцию "imod FadeToBlackISFX" для плавного затухания экрана в черное.
после он просыпался в 16:00 следующего дня
Вставьте в тело скрипта такой код:
set GameHour to 16 set GameDayPassed to (GameDayPassed + 1)
анимация как он встаёт с этой кровати
Хм... Анимации вставания с постели у ГГ нет. Но точно знаю, что есть моды, добавляющие такую возможность.
set GameHour to 16 set GameDayPassed to (GameDayPassed + 1)
не пойму куда вставить, вставляю в скрипт. Скрипт перестаёт сохранять.
Musstafar, я ошибся во второй строке. Нужно писать "set GameDaysPassed to (GameDayPassed + 1)".
Musstafar, Можно взять с начала фола нв, там гг лежит (вид от первого лица) и через 5 секунд встает.
Если нужно disable'нуть объект, на котором и висит скрипт, достаточно просто написать "Disable". То есть:
В блоке OnDrop на броне нужно сбросить все переменные на начальные значения.
Я так сделал но теперь активатор перестал появлятся возле меня после удаления брони из инвенторя. А когда я сбросил переменные в блоке OnDrop нечего не изменялось.
Серёга, выложите, пожалуйста, на форуме все ваши текущие скрипты, со всеми изменениями, а также подробно опишите то, что должно происходить в идеале. Мне тяжело держать в голове всю информацию по вашему проекту, не имея всех данных.
Sergey_Ros, Ну это не проэкт а просто обычный мод "транспорт".
Вот скрипт на активатор (после того как убрал постоянную реф ссылку, после удаления из инвенторя брони теперь активатор не появляется, точно не знаю из-за чего):
short button
short activated
float timerbegin onactivate player
showmessage aaaStreetCarModMessage1
set activated to 1
endbegin gamemode
if (activated == 1)
set button to getbuttonpressed
if button == 0
player.additem aaaStreetCarMod1 1
player.EquipItem aaaStreetCarMod1
disable
endif
set activated to 2
elseif button == 1
endif
end
Вот скрипт на броню:
short Driving
float ModSpeed
float Timer
short HealOnce
float tmpbegin OnEquip
Set Driving to 1
Set ModSpeed to 100
DisablePlayerControls 0 0 1 0 0 1 1
endbegin OnUnEquip
Set Driving to 0
Player.Setav SpeedMult 100
EnablePlayerControls
endbegin GameMode
if ( HealOnce == 1 )
Player.Restoreav LeftMobilityCondition 1
Set HealOnce to 0
endifif Driving == 1
Player.CastImmediateOnSelf aaaStreetCarSitOnActorPlayerEffect
if ( Timer > 0 )
Set Timer to ( Timer - GetSecondsPassed )
else
Set ModSpeed to ModSpeed+(300-0.004*ModSpeed*ModSpeed)*0.5
Player.Setav SpeedMult ModSpeedPlayer.Damageav LeftMobilityCondition 1
Set HealOnce to 1
Set Timer to 1
PlayGroup Forward 2
endif
endifend
begin OnDrop
;Set Driving to 0
;Player.Setav SpeedMult 100
;EnablePlayerControls ;пробывал не писать эти строки всё тогда работало, написал работать перестало
set tmp to player.getpos x + 200
player.setpos x tmp
player.placeatme aaaStreetCarModGo
player.EquipItem aaaStreetCarMod1
player.removeitem aaaStreetCarMod1 1
endif
End
Скрипт с квеста:
short sToggle
BEGIN GameMode
If IsKeyPressed 15 != sToggle
Set sToggle To sToggle == 0
if sToggle
player.RemoveItem aaaStreetCarMod1 1
else
player.RemoveItem aaaStreetCarMod1 1
endif
endif
End
У меня 3 ошибки
1. Когда удаляю броню, в любом случае скрипт с брони на меня действует (как бы я не пытался поставить переменные назад).
2. При том как я нажимаю на активатор броня одевается но не использует скрипт (пробывал ставить таймер, не помогло).
3. При удалении из инвенторя брони (скрипт всё равно действует) и активатор почему то перестал рядом появлятся, это или из-за тоо что я убрал реф ссылку и оставил disable или из-за вот этих строк в блоке OnDrop
;Set Driving to 0
;Player.Setav SpeedMult 100
;EnablePlayerControls
Вроде всё.
Нужно писать "set GameDaysPassed to (GameDayPassed + 1)".
Да спасибо, можно мне было и самому догадаться, только нужно ещё и в скобках дописать S.
Можно взять с начала фола нв, там гг лежит (вид от первого лица) и через 5 секунд встает.
Можно попробовать, но вот только я даже не могу найти ни скрипта, ни анимации... К Кровати на которой в начале лежит гг вообще непривязано не какого скрипта. А квест который даётся в самом начале я не могу найти... Если перевести название квеста на английский (Ain't That a Kick in the Head) и в вести его в поиск гека то не чего не находит.
Отредактировано Musstafar (31.07.11 12:24:52)
Musstafar, Все начальные квесты начинаются на VCG и CG то что ты хочешь сделать вроде сделали через аи пакет и подключили на него анимацию.
Отредактировано Серёга (31.07.11 13:17:25)
Все начальные квесты начинаются на VCG и CG то что ты хочешь сделать вроде сделали через аи пакет и подключили на него анимацию.
а есть ли какой нибудь туториал на эту тему?
а то ясам думаю не смогу этого сделать. Или может быть вы сами объясните мне по шагам...
Но всё равно спасибо за желание помочь
Отредактировано Musstafar (31.07.11 15:35:06)
Серёга, попробуйте исправленные версии скриптов.
Скрипт активатора.
short button
short activatedBegin OnActivate player
ShowMessage aaaStreetCarModMessage1
set activated to 1
EndBegin GameMode
if (activated == 1)
set button to GetButtonPressed
if button == 0
player.AddItem aaaStreetCarMod1 1
player.EquipItem aaaStreetCarMod1
set activated to 2
Disable
elseif button == 1
endif
endif
End
Скрипт брони.
short Driving
float ModSpeed
float Timer
short HealOnce
float tmp
ref MyselfBegin OnEquip
set Driving to 1
set ModSpeed to 100
DisablePlayerControls 0 0 1 0 0 1 1
EndBegin OnUnequip
set Driving to 0
Player.SetAV SpeedMult 100
EnablePlayerControls
EndBegin GameMode
if (Myself == 0)
set Myself to GetSelf
if (Player.GetEquipped Myself == 1) && (Driving != 1)
set Driving to 1
set ModSpeed to 100
DisablePlayerControls 0 0 1 0 0 1 1
endif
endifif Driving == 1
Player.CastImmediateOnSelf aaaStreetCarSitOnActorPlayerEffect
if (Timer > 0)
set Timer to (Timer - GetSecondsPassed)
elseset ModSpeed to ModSpeed+(300-0.004*ModSpeed*ModSpeed)*0.5
Player.SetAV SpeedMult ModSpeed
Player.Damageav LeftMobilityCondition 1
set HealOnce to 1
set Timer to 1PlayGroup Forward 2
endif
endifif (HealOnce == 1)
Player.Restoreav LeftMobilityCondition 1
set HealOnce to 0
endif
EndBegin OnDrop
set tmp to player.GetPos x + 200
Player.PlayGroup Idle 1
player.SetPos x tmp
Player.SetAV SpeedMult 100
EnablePlayerControls
set Driving to 0
player.PlaceAtMe aaaStreetCarModGo
Disable
MarkForDelete
End
Вопросы:
1) В чем суть квестового скрипта?
2) В чем заключается эффект, который не убирается? Что именно происходит.
Sergey_Ros, Попробую как трафик обновится, после 12.
1. При зажатии TAB броня удаляется с инвенторя гг.
2. Убирается эффект actor effect и то только анимация которую я туда поставил, а я туда ставил эффект анимации и эффект скорости. Один эффект анимации ищезает но я как летал в броне, так и летаю (без неё) когда она удаляется из инвентаря.
Sergey_Ros, Теперь при нажатии на вервый button выбивает ошибку в игре.
Отредактировано Серёга (01.08.11 02:21:15)
Вы здесь » Форум «Лабортории Mod-Tec» » G.E.C.K. Community » Помощь по скриптам Fallout 3 и Fallout: New Vegas