Скрипты - неотъемлемая часть GECK. При написании возникает очень много казусов. Данная тема должна помочь не наступать на "грабли" новичкам и делиться опытом с другими более продвинутых мододелов.
Всем привет. Кто подскажет скрипт для триггера, который при вхождении ГГ в триггер делал видимые (изначально отмеченные как invisible) Ref-объекты (напримерRef001, Ref002)?
И подобный скрипт, но при использовании пункта меню в активаторе, и при условии, что у ГГ есть определенный объект (например BatareykaID).
Тут значит типа мессаг на активаторе, и активатор доступен только если у гг есть определённый объект? Я правильно понял?
Хм, за активатором закреплено меню. В меню две опции. Одна - ничего не делать (после чего меню исчезает). Вторая заменить батарею. Так вот, для второго пункта, необходим скрипт, который проверял наличие батарейки (BatareykaID) в инветаре ГГ и если она отсутствует выводил сообщение " у вас нет батарейки", а если присутствует то делал видимыми объекты помеченные как initiale disable. .
Изменение репутации для пользователя Graf
GrafOffline
Сообщение №485
написано: 5 октября 2011, 14:22
| Отредактировано: Graf - 5 октября 2011, 14:27
vasy40, На шмоте не проверял но и скриптом сделать не сложно. На щет тупотит, я уже сказал, я просто забыл кинуть в архив анимацию, так то анимация прописана, тебе нужно поставить в тот путь свою анимацию и все будит работать.
Добавлено (05.10.2011, 09:51) --------------------------------------------- Mercutio, Ну скрипт для триггера, действие противоположное disable:
Хм, за активатором закреплено меню. В меню две опции. Одна - ничего не делать (после чего меню исчезает). Вторая заменить батарею. Так вот, для второго пункта, необходим скрипт, который проверял наличие батарейки (BatareykaID) в инветаре ГГ и если она отсутствует выводил сообщение " у вас нет батарейки", а если присутствует то делал видимыми объекты помеченные как initiale disable.
Вот:
Code
short button
begin OnActivate
if ( IsActionRef player == 1 )
ShowMessage IdmessageBBB
endif
end
Begin gameMode
set button to getbuttonpressed
if button == 0 if ( player.getitemcount BatareykaID >= 1 ) object1Ref.enable object2Ref.enable else if ( player.getitemcount BatareykaID < 1 ) showmessage idmessageXXX
elseif button == 1 endif endif endif End
...-Вот такой вот парадокс. Мы делаем моды для игр, в которые уже давно не играем...
if ( IsActionRef player == 1 ) ; если активировал гг
ShowMessage IdmessageBBB ; появляется мессаг с выбором
endif
end
Begin gameMode
set button to getbuttonpressed
if button == 0 ; 1 выбор if ( player.getitemcount BatareykaID >= 1 ) ; если у гг 1 батарейка то два объекта появляются object1Ref.enable object2Ref.enable else ; в другом случае if ( player.getitemcount BatareykaID < 1 ) ; если батарейки меньше одной showmessage idmessageXXX ; выбивает сообщение
elseif button == 1 ; второй выбор "Отмена" endif endif endif End
...-Вот такой вот парадокс. Мы делаем моды для игр, в которые уже давно не играем...
Просил помочь более продвинутых товарищей и вот что вышло- Граф в упор не вижу где тут в скрипте проигрывается анимация,может ты хотел но забыл написать? этот скрипт мало чем отличается от того,что выложил Каин,а то что выложил Каин,сделал Вовочка...
этот скрипт отличается от того,что выложил Каин, тем что нет этих строчек
float X float Y float Z float DX float DY float DZ float oldX float oldY float oldZ float oldDX float oldDY float oldDZ float maxDXY float t1 float t2 float t5 float t6 float sina float turbo
begin ScriptEffectStart
set oldX to getPos x set oldY to getPos y set oldZ to getPos z end
begin ScriptEffectUpdate
set X to getPos x set Y to getPos y set Z to getPos z set DZ to Z - oldZ
set DX to x - oldX set DY to y - oldY
if (DX*DX)>(DY*DY) set maxDXY to DX else set maxDXY to DY endif
if maxDXY < 0 set maxDXY to -maxDXY endif
set Z to oldZ
if isSneaking == 0 set turbo to 10 else set turbo to 2 endif
if (DX*DX+DY*DY>8) set X to oldX + turbo*DX/maxDXY set Y to oldY + turbo*DY/maxDXY setPos x , X setPos y , Y
set angleZ to GetAngle x
if angleZ < -180 set angleZ to angleZ + 360 elseif angleZ > 180 set angleZ to angleZ - 360 endif
set t1 to angleZ / 57.29577951 set t2 to t1*t1 set t5 to t2*t2*t1 set t6 to t5*t1 set sina to t1 - t1*t2/6 + t5/120 - t5*t2/5040 + t6*t2*t1/362880
set Z to Z - turbo*(sina) endif setPos z , Z
set oldX to X set oldY to Y set oldZ to Z set oldDZ to DZ resetFallDamageTimer
PlayIdle p100 -вот должна быть проигранная анимация,вроде так и если делать скрипт на вещи,то нужны команды наверное типа Begin On add Equip Player.item id message id;Крылья одеты и активированы end Begin On add Unequip Player.item id message id;Крылья сняты и отключены end Все понятно в том есп.файле,да,понятно как делать таблетки или шприцы с зельем"Левитация"но мне нифига не понятно как это все + одежда крылья и анимация сделать одним скриптом. Может подскажешь что?
vasy40, У меня там стоит два эффекта, один скрипт эффект на левитацию а второй скрипт на анимацию.
Цитата vasy40
типа Begin On add Equip Player.item id message id;Крылья одеты и активированы end Begin On add Unequip Player.item id message id;Крылья сняты и отключены end
Нет, блок Begin Onadd действует при получении вещи в инвентарь, и ты его неправильно написал... Нужно писать примерно так:
Code
begin OnEquip player
ShowMessage aaaArmorInventorySMessage
end
begin OnUnEquip player
ShowMessage aaaArmorInventorySMessage2
end
...-Вот такой вот парадокс. Мы делаем моды для игр, в которые уже давно не играем...
Скрипт повесить на сам триггер. Правда не уверен что заработает (Скриптингом недавно начал заниматься)
Добавлено (14.10.2011, 17:55) --------------------------------------------- Ах да забыл, в скрипте также сделана авто-включения ФастТревела когда ГГ выходит из триггера. Если это не нужно, убери последние три строчки.
Изменение репутации для пользователя Graf
GrafOffline
Сообщение №493
написано: 14 октября 2011, 14:00
| Отредактировано: Graf - 14 октября 2011, 14:01
[ObjectID.]ResetFallDamageTimer - Функция ResetFallDamageTimer сбрасывает таймер падения. При сбросе таймера вызывающий объект (ObjectID) получает повреждения при падении так, как будто он начал падать только что. Относится к типу: Miscellaneous Functions
[ActorID.]PickIdle - Функция PickIdle заставляет вызывающего актера (ActorID) выбрать новое анимационное движение (idle). Относится к типу: Animation Functions | Actor Functions
PlayGroup Walk PlayGroup Walk, 1 - Функция PlayGroup проигрывает анимационную группу, определенную в GroupName. Необязательный флаг [flags] может использоваться, чтобы начать прогрывание анимационной группы различными способами. Флаги: 0 Обычный (Normal) текущая анимация проиграется до конца полного цикла, затем начнется проигрывание новой анимации с самого начала, со своего первого стартового фрейма. 1 Немедленный старт (Immediate Start) Установка флага в единицу приведет к немедленной остановке в текущем фрейме проигрываемой в данный момент анимационной группы, после чего начнется проигрывание новой анимации со своего стартового фрейма. 2 Немедленный запуск цикла (петли) (Immediate Loop) Установка флага в 2 приводит к немедленному прекращению проигрывания в текущем фрейме анимационной группы, после чего стартует новая анимация со своего стартового фрейма и будет воспроизводиться в цикле много раз (по петле). Примечание: Проигрывание этой функцией некоторых анимационных групп на персонаже игрока может его "заморозить" и он перестанет реагировать на ваши действия. Вернуть его в нормальное состояние поможет вызов функции PickIdle или вызов PlayGroup со следующими параметрами: Код: [Выделить] PlayGroup Idle, 1 Относится к типу: Animation Functions ВНИМАНИЕ!ВОПРОС - Куда и как вставить в скрипт левитации - безопасное приземление - [ObjectID.]ResetFallDamageTimer и проигрывание анимации полета - PlayIdle p100 или хотя бы сообщение на дисплее о том что через 10 секунд эффект левитации закончиться? Вот в этот скрипт:
scn aaaforcelevitationscript
float angleZ
float X float Y float Z float DX float DY float DZ float oldX float oldY float oldZ float oldDX float oldDY float oldDZ float maxDXY float t1 float t2 float t5 float t6 float sina float turbo
begin ScriptEffectStart
set oldX to getPos x set oldY to getPos y set oldZ to getPos z end
begin ScriptEffectUpdate
set X to getPos x set Y to getPos y set Z to getPos z set DZ to Z - oldZ ; Levitation
set DX to x - oldX set DY to y - oldY
if (DX*DX)>(DY*DY) set maxDXY to DX else set maxDXY to DY endif
if maxDXY < 0 set maxDXY to -maxDXY endif
set Z to oldZ
if isSneaking == 0 set turbo to 10 else set turbo to 2 endif
if (DX*DX+DY*DY>8) set X to oldX + turbo*DX/maxDXY set Y to oldY + turbo*DY/maxDXY ; endif setPos x , X setPos y , Y
set angleZ to GetAngle x ;Message angleZ+1 ;set Z to Z - (angleZ/180)
if angleZ < -180 set angleZ to angleZ + 360 elseif angleZ > 180 set angleZ to angleZ - 360 endif
set t1 to angleZ / 57.29577951 ; precalculate powers of "angle" set t2 to t1*t1 set t5 to t2*t2*t1 set t6 to t5*t1 set sina to t1 - t1*t2/6 + t5/120 - t5*t2/5040 + t6*t2*t1/362880
set Z to Z - turbo*(sina) endif setPos z , Z
set oldX to X set oldY to Y set oldZ to Z set oldDZ to DZ resetFallDamageTimer end
Скрипт рабочий - Граф в курсе,но вот проблемка - при полете проигрывается анимация ходьбы,бега,плаванья и при приземлении ГГ погибает в 70%,потому что прогграмма считает что он упал с большой высоты.
Или вот эти команды нужно повесить скриптом на одежду?
[ObjectID.]ResetFallDamageTimer - эта команда в скрипте "Левитация" есть,но почему то не срабатывает,может оттого что не вставлен Ай Ди ГГ?
PlayIdle p100 - анимация тоже не проигрывается,потому что нет пока такой анимации.
Подскажите пожалуйста,и как это будет выглядеть в скрипте на одежду?
scn aaalexLevitationBaseEffectScript
begin ScriptEffectUpdate
player.PlayIdle p100
end ------------------------------------------------------------------------------------------------------- И еще - у кого есть анимация полета,чтобы махали крыльями?
Зелье"Левитация" работает 3 минуты = 180 секунд,каким образом скриптом устроить проверку на время -чтобы на 170 секунде,на дисплей выводилась надпись-"До окончания "Левитации" 10 секунд."Это для того чтобы удачно приземлятся хотя бы в 50%
Begin ScriptEffectStart if (Stage == 0) set Stage to 1 endif End
Begin ScriptEffectUpdate if (Stage == 1) Set Timer to Timer + ScriptEffectElapsedSeconds if (Timer >= 170) ShowMessage ААА02;До окончания "Левитации" 10 секунд. set Stage to 2 endif endif End --------------------------------------------------------------------------- Сработает ли такой скрипт прикрученный к зелью"Левитация" с выводом предупреждения на дисплей?И можно ли добавить по окончанию эффекта замедление времени(Slowing down time) и безопасную посадку Player.resetFallDamageTimer? P.S.Скрипт правильный-то есть записался в г.е.к.к.,но вот не выводит сообщение в игре,на монитор в чем ошибка? ShowMessage -сообщение создал,повесил скрипт на зелье"Левитация"
Ты сказал,что в том есп.файле что для Ф3 скрипт на одежду - вот он. Как это будет выглядеть на Актор эффектах?И посмотри пожалуйста что с скриптом-таймером не так,он приведен выше.
Сработает ли такой скрипт прикрученный к зелью"Левитация" с выводом предупреждения на дисплей?И можно ли добавить по окончанию эффекта замедление времени(Slowing down time) и безопасную посадку Player.resetFallDamageTimer? P.S.Скрипт правильный-то есть записался в г.е.к.к.,но вот не выводит сообщение в игре,на монитор в чем ошибка? ShowMessage -сообщение создал,повесил скрипт на зелье"Левитация"
Ну и каким образом он дожен работать?
...-Вот такой вот парадокс. Мы делаем моды для игр, в которые уже давно не играем...
Изменение репутации для пользователя vasy40
vasy40Offline
Сообщение №503
написано: 17 октября 2011, 14:03
| Отредактировано: vasy40 - 17 октября 2011, 14:06
Зелье"Левитация" работает 3 минуты = 180 секунд,каким образом скриптом устроить проверку на время -чтобы на 170 секунде,на дисплей выводилась надпись-"До окончания "Левитации" 10 секунд."Это для того чтобы удачно приземлятся хотя бы в 50%
Вот таким,наверное,у тебя же спрашивают...или самому на свои вопросы всегда отвечать???
scn AAAlarmTime
float timer ;переменная таймера short startTimer short sof short kof
begin ScriptEffectStart set timer to 180 ;поставить таймер на 180 end
begin ScriptEffectUpdate
if timer < 170 && kof==0 ;когда пройдет 170 секунд,вывести на монитор сообщение set kof to 1 showMessage ААА01;До окончания "Левитации" 10 секунд. endif
if timer < 180 && sof==0;когда пройдет 180 секунд, удачно приземлиться resetFallDamageTimer set sof to 1
endif
set timer to timer - getSecondsPassed ;отнять от таймера 1 секунду
end
Ты вопросов и загадок подбрасываешь больше - чем помогаешь.
Scn AAAlexItemScript begin OnEquip player;одел крылья ShowMessage aaa01;вывелось сообщение Player.CastImmediateOnSelf aaaforcelevitationscript;запустился эффект"Левитация" end begin OnUnEquip player;снял крылья ShowMessage aaa02;вывелось сообщение .........Эффект "Левитация" закончен. end
Всем привет. Пытаюсь сделать так, чтобы спустя несколько игровых часов с игрока снималось определенное "заклинание":
Code
scn WKTimerAntoxScr
float AntoxTimer
Begin GameMode if IntoxON == 1 set AntoxTimer to AntoxTimer + GetSecondsPassed if (AntoxTimer >= 600) ; 10 мин ShowMessage WKFAwe Player.RemoveSpell WKFBadSpell Set IntoxON to 0 ;ShowMessage WKFTEST ;for test StopQuest WKTimerAntoxQuest Return endif elseif IntoxON > 1 set AntoxTimer to AntoxTimer + GetSecondsPassed if (AntoxTimer >= 300) ; 5 ShowMessage WKFAwe Player.RemoveSpell WKFVeryBadSpell Set IntoxON to 0 StopQuest WKTimerAntoxQuest Return endif else StopQuest WKTimerAntoxQuest endif End
Все работает, НО - таймер отсчитывается только в реальном времени, если в режиме ожидания или сна попытаться пропустить это время - ничего не происходит, после ожидания счетчик так и продолжает отчитывать заданное время. Так как сделать, чтобы этот счетчик учитывал ожидание или отдых персонажа?
после ожидания счетчик так и продолжает отчитывать заданное время.
Совершенно верно, во время ожидания или сна getsecondspassed тоже спит или ожидает. Поэтому в таких случаях нужно использновать другие возможности, например глобальную переменную gamedayspassed
if getstage aaSVBooQuest == 25 && doOnce == 0 set doOnce to 1 set timer to gamedayspassed endif
if doOnce == 1 if gamedayspassed - timer >= 0.5 setstage aaSVBooQuest 30 set doOnce to 0 endif endif
В этом фрагменте следующая стадия квеста наступает с задержкой в 12 часов.
====================== Мод "Нью-Йорк" на русском: https://modgames.net/load/fallout3/addon/new-york-bolshoe-yabloko/34-1-0-1294 Мод "Нью-Йорк" на английском: https://modgames.net/load/fallout3/kvesty/the-big-apple/23-1-0-19771
Делаю небольшой ребаланс-мод, ломаю голову над следующим кондишеном для эффекта: 1. Чтобы при уроне оружия < х, засчитывались лишь критические повреждения (то есть урон наносят лишь критические повреждения) Подскажите, как его оформить
Begin GameMode set Timer to GameDaysPassed if IntoxON >= 1 if GameDaysPassed - Timer >= 0.5 ShowMessage WKFAwe Player.RemoveSpell WKFBadSpell Set IntoxON to 0 StopQuest WKTimerAntQuest endif endif else StopQuest WKTimerAntQuest endif End