Модератор форума: КсюXa, ApeX  
Форум » Fallout: New Vegas » Мастерская » Скрипты (Вопросы и ответы)

Скрипты
a3apbi4  Offline  Сообщение №1 написано: 7 декабря 2010, 18:01



11
Скрипты - неотъемлемая часть GECK. При написании возникает очень много казусов. Данная тема должна помочь не наступать на "грабли" новичкам и делиться опытом с другими более продвинутых мододелов.




rizys-mod  Offline  Сообщение №811 написано: 24 августа 2012, 23:31


Команда "Rizys-Mod"


250
Цитата Frostik

И еще не понравилось возникновение рейдеров на пустом месте )))


А ты хотел чтобы они туда на космическом корабле прилетали? lol

Команда "Rizys-mod" - разработка плагинов на Fallout.
Римайер  Offline  Сообщение №812 написано: 29 августа 2012, 15:18 | Отредактировано: Римайер - 29 августа 2012, 16:35


хоМяк


957
А у меня вот такой вопрос- команда "SwapTexture player" как именно она работает? Судя по тому что выяснил- меняет текстуру в указанном блоке модели.
Пример:
Swaptexture player "##LaserSightBeam:1" "effects\0alpha" где "##LaserSightBeam:1"- это узел НиТриСтрипс в модели, а "effects\0alpha"- сама текстура в этом узле.
Но. В выдранном куске из плагина-донора команда работает. А вот мои текстуры менять не хочет.

Добавлено.
А.... всё, заработало. Выдрал узел НиНоде целиком с модели-донора, изменил названия узлов НиТриСтрипс. Немного. И пошла подмена текстур.
Магия какая то. Чёрная или белая- х.з.

bruner  Offline  Сообщение №813 написано: 6 сентября 2012, 11:41



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

все суета, сует...
GR1n  Offline  Сообщение №814 написано: 6 сентября 2012, 14:15



45
Знатоки -модмейкеры, у меня такой вопрос:
Какой функцией возможно вернуть значение урона, который был нанесен игроку в данный момент? Просто мне нужно сделать скрипт, который не позволял бы игроку умереть, если ему был нанесен урон больше, чем его собственное текущее здоровье

Воина к свету ведёт древний Путь Пустоты...
tundruck73  Offline  Сообщение №815 написано: 6 сентября 2012, 15:07



bruner, как вариант, можно дать этому твоему неписю пакет Trevel, привязанный к нужному предмету (к стулу), а в условиях указать стадию квеста, по достижении которой этот пакет должен начать действовать. Можно дать сразу, можно добавить скриптом в процессе игры.

Мосье, же не манж па сис жур...
Умер 23.04.2019
JupiterJour  Offline  Сообщение №816 написано: 6 сентября 2012, 15:09 | Отредактировано: Joopeeter - 6 сентября 2012, 15:10


_


Цитата GR1n

Какой функцией возможно вернуть значение урона, который был нанесен игроку в данный момент? Просто мне нужно сделать скрипт, который не позволял бы игроку умереть, если ему был нанесен урон больше, чем его собственное текущее здоровье


Насколько мне известно, стандартными средствами такой фокус не провернёшь. Однажды я решал аналогичную задачу и там пришлось на время "бессмертия" тупо скриптово задирать здоровье и скриптово же снижать его до нужного процента (чтобы полоска оставалась той же длины). В пип-бое, правда, всё равно было видно реальное положение дел, но в принципе, несложно в режиме меню временно вернуть как было.

GR1n  Offline  Сообщение №817 написано: 6 сентября 2012, 15:56



45
Joopeeter, окей, придется хитрить, как я и думал :)

Воина к свету ведёт древний Путь Пустоты...
KAIN48  Offline  Сообщение №818 написано: 7 сентября 2012, 04:37 | Отредактировано: KAIN48 - 7 сентября 2012, 09:47


Шаманистый шаман


Привет всем!
Помогите пожалуйста, написать скрипт для кнопки открывания автопарника (дверь).

По замыслу, в этом парнике раз в сутки вырастает гриб и его можно сорвать (еда)
На грибе такой скрипт

scn AAATestFundusScript

float TimeStart
float TimeStop
short State

Begin onActivate
if (State == 0)
AAATestFungusARef.Disable
player.additem AAATestFungusA 1
set TimeStart to GameDaysPassed
set State to 1
endif
End

Begin GameMode
if (State == 1)
set TimeStop to GameDaysPassed
if TimeStop - TimeStart >= 1
AAATestFungusARef.Enable
set State to 0
endif
endif
End

Не знаю правильно или не правильно написано, я изменил готовый скрипт Graf - скрипт работает.

А на кнопке такой

scn AAATestSwitchScript

short Open

Begin OnActivate
if Open==0
AAATestDoorRef.SetOpenState 1
set Open to 1
else
AAATestDoorRef.SetOpenState 0
set Open to 0
endif
Activate
End


Ещё на двери автопарника есть стандартный скрипт не дающий открывать дверь активацией напрямую.

scn GenericDoorOpenedElsewhereSCRIPT

; Don't pass a '1' parameter in your terminal's activate script
; This script will not allow NPCs to use the door.
; It's intended for sneaky/hacky players to be able to use the door for gameplay purposes

;**********************

Begin onLoad

lock 255 ;in case someone forgets to lock the door in the editor

End

;**********************

Begin onActivate

if (IsActionRef player == 1)
ShowMessage GenericDoorActivatedElsewhereMsg
else
Activate
endif

End


Мне нужно, сделать так, что бы пока гриба нет в автопарнике, дверь не открывалась и выводилось одно соообщение:
-Гриб ещё не вырос!
А когда гриб есть выводилось второе сообщение:
-Гриб готов!
Не знаю как связать два события (из разных скриптов)
Пока.

Мы вышли из дома, когда во всех... Поздно вышли!
JupiterJour  Offline  Сообщение №819 написано: 7 сентября 2012, 05:48 | Отредактировано: Joopeeter - 7 сентября 2012, 06:30


_


Наличие/отсутствие гриба - это переменная State на том грибе. Тогда на кнопке будет так:

Кстати, этот скрипт, насколько я помню, для двери с выключателем в другой локации. Если выключатель этой двери - вон тот слева, то можно просто связать их через Activate Parent:

И ещё кстати. Не ясно зачем вообще там дверь, гриб, как видно из его скрипта, прекрасно растёт и при открытой. Чтоб не рос:

Всё написано без проверки.

KAIN48  Offline  Сообщение №820 написано: 7 сентября 2012, 10:23


Шаманистый шаман


Joopeeter, Привет!
Спасибо за помощь! Всё работает отлично.
А скрипт открывания двери с выключателя из другой локации действительно твой! Неужто не узнал!? Богатым будет!
Шутка!
Цитата Joopeeter

Не ясно зачем вообще там дверь, гриб, как видно из его скрипта, прекрасно растёт и при открытой


Я просто добавил в твой скрипт на грибе строчку закрывания двери после "срывания" гриба.
Теперь не видно, растёт там гриб или нет, а пока гриб не "вырос" дверь кнопкой не открыть.
Ещё раз спасибо!
Пока.

Мы вышли из дома, когда во всех... Поздно вышли!
bruner  Offline  Сообщение №821 написано: 7 сентября 2012, 12:06



67
Цитата tundruck73

bruner, как вариант, можно дать этому твоему неписю пакет Trevel, привязанный к нужному предмету (к стулу), а в условиях указать стадию квеста, по достижении которой этот пакет должен начать действовать. Можно дать сразу, можно добавить скриптом в процессе игры.



Честно не пойму, как это можно реализовать в реальном времени, мне нужно в диалоге дать команду и чтобы непись сразу пошел ее выполнять.
По моему скрипт с реф ссылкой на объект было бы оптимально.

все суета, сует...
tundruck73  Offline  Сообщение №822 написано: 7 сентября 2012, 13:14



bruner, есть непись, у него есть пакет НеписьSandBox, где в условиях указана стадия квеста, к примеру, 10. Еще у него есть пакет Trevel, у которого в качестве цели указан нужный объект, а в условиях - стадия квеста 20. В результирующем скрипте диалога (после которого ты хочешь отправить непися к объекту) написано: SetStage IDQuest 20. Ну, или можно переменную в качестве условия для пакетов использовать.

Мосье, же не манж па сис жур...
Умер 23.04.2019
bruner  Offline  Сообщение №823 написано: 8 сентября 2012, 11:54



67
Цитата tundruck73

bruner, есть непись, у него есть пакет НеписьSandBox, где в условиях указана стадия квеста, к примеру, 10. Еще у него есть пакет Trevel, у которого в качестве цели указан нужный объект, а в условиях - стадия квеста 20. В результирующем скрипте диалога (после которого ты хочешь отправить непися к объекту) написано: SetStage IDQuest 20. Ну, или можно переменную в качестве условия для пакетов использовать.



Это понятно, но не всегда удобно и оптимально. Меня другое интересовало, именно скрипт, вернее команды скрипта.
Если реализовывать команды к неписю пакетами их два десятка наберется, скриптом проще, как мне кажется?
Ну к примеру: пойди туда, сядь там, выполни анимацию тут, открой холодильник, сорви банан, умри наконец)))
Это сложно скриптом?

все суета, сует...
JupiterJour  Offline  Сообщение №824 написано: 8 сентября 2012, 12:11 | Отредактировано: Joopeeter - 8 сентября 2012, 12:14


_


Всё кроме "умри" - пакеты.
Чтобы пакет начался сразу, надо либо добавить его скриптово AddScriptPackage, либо в нужном месте дать команду на переоценку пакетов EvaluatePackage.

bruner  Offline  Сообщение №825 написано: 8 сентября 2012, 13:15



67
океу, спасибо, убедили))

тогда еще вопросик, вот есть команды бартера:
ShowBarterMenu - диалог торговли
OpenTeammateContainer - бартер

но все они завязаны через контейнер, а как к неписю в инвентарь залезть? чтобы тоже типа бартера, положить что нить или взять, как с напарниками, какая команда используется?

все суета, сует...
JupiterJour  Offline  Сообщение №826 написано: 8 сентября 2012, 15:38


_


Дык OpenTeammateContainer это и есть залаз в инвентарь. Просто надо читать что там про синтаксис пишут..
OpenTeammateContainer 1 открывает инвентарь как если бы непись был напарником.

bruner  Offline  Сообщение №827 написано: 8 сентября 2012, 18:59 | Отредактировано: bruner - 9 сентября 2012, 05:23



67
ага, спасибо, попробую единичку добавить, без нее не работало)

Спустя сутки....

Всем спасибо! Все получилось, копаюсь в чужом инвентаре, как в своем)))

все суета, сует...
ITU  Offline  Сообщение №828 написано: 24 сентября 2012, 18:36



995
коммандой AddFormToFormList можно добавить лист в лист? или только по одному предмету?

Artem13  Offline  Сообщение №829 написано: 25 сентября 2012, 04:13


Mercenaries. Со смертью на ты.


ITU, подозреваю, что можно, но не с тем эффектом, что ты хочешь - он добавит именно ИД списка, а не его содержимое. Соответственно, при переборе листа сравнение будет с ИД добавленного, а не его компонентами :( Буду рад, если ошибся. Только эксперимент покажет...

<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
rizys-mod  Offline  Сообщение №830 написано: 7 октября 2012, 19:51 | Отредактировано: rizys-mod - 7 октября 2012, 19:57


Команда "Rizys-Mod"


250
Привет всем!
Вот такая проблема, запутался в скрипте... Вот скрипт на еффект:

Ну и вот где запутался:


Почему-то мессаг не появляется. И вопрос:
Будут ли работать варианты при выборе способностей? Хотел вот таким способом отчитывать батареи, от которых будут работать способности:


Слишком запутался, вот и прошу помощи. А то уже голова не варит.

Команда "Rizys-mod" - разработка плагинов на Fallout.
Spalny_Vagon  Offline  Сообщение №831 написано: 8 октября 2012, 06:41 | Отредактировано: Spalny_Vagon - 8 октября 2012, 06:42


Мастер


Цитата rizys-mod

Слишком запутался, вот и прошу помощи. А то уже голова не варит


Вот так попробуйте:
Code
begin gamemode
if CurrentBatteryLife <= 0 && BatteryCount > 0   
   set CurrentBatteryLife to 3600   
   zzUnderWorldPowerArmorAdvancedNoBackpackContainerBatteriesRef.RemoveItem FissionBattery 1   
   set BatteryCount to BatteryCount - 1   
endif   

if BatteryCount == 0   
   set LastBattery to 1   
else   
   set LastBattery to 0   
endif   

if LastBattery == 1   
   set BatteryPercent to CurrentBatteryLife / 36   
     ShowMessage zzUnderWorldPowerArmorAdvancedNoBackpackContainerBatteriesMSGleft BatteryPercent   
   set LastBattery to 2   
elseif LastBattery == 2   
   if CurrentBatteryLife / 360 > 1   
    if CurrentBatteryLife / 360 < BatteryPercent / 10   
     set LastBattery to 1   
    endif   
   elseif CurrentBatteryLife / 36 < BatteryPercent   
    set LastBattery to 1   
   endif   
endif
end

А что касается первого скрипта, я где-то читал, что если в блоке проверяются нажатые кнопки, то ничего другого проверять в этом же блоке уже нельзя, т.к. движок все равно может это воспринять как проверку нажатия, возвращая при этом -1 (ничего не нажато). Т.е., если Вы проверяете, какие кнопки Option нажаты (set Option to GetButtonPressed), то проверка числа батарей (if BatteryCount == 0 ) должна быть ВНЕ этого блока, уже после того, как проверка всех вариантов кнопки Option закончена.

======================
Мод "Нью-Йорк" на русском: 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
rizys-mod  Offline  Сообщение №832 написано: 8 октября 2012, 20:05


Команда "Rizys-Mod"


250
Spalny_Vagon, понятно. Проглядев скрипт на мессаг я понял что он и не мог работать. Но правда он и не работает даже вроде в правильном варианте:

Первый мессаг появляется, а вот при любом выборе на мессаге нечего не происходит. Не могу найти причину.

Команда "Rizys-mod" - разработка плагинов на Fallout.
Spalny_Vagon  Offline  Сообщение №833 написано: 9 октября 2012, 12:58 | Отредактировано: Spalny_Vagon - 9 октября 2012, 13:02


Мастер


Цитата rizys-mod

Первый мессаг появляется, а вот при любом выборе на мессаге нечего не происходит. Не могу найти причину.


Трудно сказать, что там не так, особенно есели учесть, что я не в курсе, что именно должно происходить. Я могу предложить отделить все блоки друг от друга жестко с помощью двух дополнительных переменных, примерно так:
Code
scn GdeOnoTormozit
Short Option    
Short Button    
;Short Choice
       
short doChoise
short doOptions

short Maintenance    
short Maintenance2    
;short Maintenance3    
begin gamemode

if Maintenance == 1 && doChoise == 0
    ShowMessage zzUnderWorldPowerArmorAdvancedNoBackpackContainerBatteriesMSGChoice    
    set doChoise to 1
endif
if doChoise == 1
    set Button to GetButtonPressed    
    set doChoise to 2
endif
if doChoise == 2
    if (Button == 0)    
     Set Maintenance2 to 1    
     Set Maintenance to 0    
    elseif (Button == 1)    
      ; Set Maintenance3 to 1    
     Set Maintenance to 0    
    elseif (Button == 2)    
     Set Maintenance to 0    
    endif
set doChoise to 0
endif    

if Maintenance2 == 1  && doOptions == 0
    ShowMessage zzUnderWorldPowerArmorAdvancedNoBackpackContainerBatteriesMSGBatteriesInstalled BatteryCount, PlayerBatteries    
    set doOptions to 1
endif
if doOptions == 1
    set Option to GetButtonPressed    
    set doOptions to 2
endif
if doOptions == 2
    if (Option == 0)    
     Player.RemoveItem FissionBattery 1    
     zzUnderWorldPowerArmorAdvancedNoBackpackContainerBatteriesRef.AddItem FissionBattery 1    
     set PlayerBatteries to PlayerBatteries - 1    
     set BatteryCount to BatteryCount + 1    
     set LastBattery to 0    
    elseif (Option == 1)    
     zzUnderWorldPowerArmorAdvancedNoBackpackContainerBatteriesRef.RemoveItem FissionBattery 1    
     Player.AddItem FissionBattery 1    
     set PlayerBatteries to PlayerBatteries + 1    
     set BatteryCount to BatteryCount - 1    
       ; if BatteryCount == 0    
       ; set LastBattery to 1    
       ; else    
       ; set LastBattery to 0    
       ; endif    
       ; ShowMessage zzUnderWorldPowerArmorAdvancedNoBackpackContainerBatteriesMSGBatteriesInstalled, BatteryCount, PlayerBatteries    
    elseif Option == 2    
     set Maintenance2 to 0    
    endif
set doOptions to 0    
endif
end

А еще в процессе отладки можно отследить, где именно получается затор, вставляя дополнительный вспомогательный message - если он в игре появляется, значит скрипт, по крайней мере до той строчки, где он стоит, выполняется.

======================
Мод "Нью-Йорк" на русском: 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
rizys-mod  Offline  Сообщение №834 написано: 15 октября 2012, 12:38


Команда "Rizys-Mod"


250
Spalny_Vagon, сейчас попробую по разным вариантам. Может что и получится.

Цитата Spalny_Vagon

Short AbilityNumber1
Short AbilityNumber2
Short AbilityNumber3
Short AbilityNumber4
Short AbilityNumber5

Short Choice

short Maintenance
short Maintenance2

begin scripteffectstart
player.additem zzUnderWorldPowerArmorAdvancedNoBackpackFoodAbility 1
set Maintenance to 1
End

Begin GameMode
if (Maintenance == 1)
ShowMessage zzUnderWorldPowerArmorAdvancedMESGAbility
Set Maintenance2 to 1
endif

if (Maintenance2 == 1) && zzunderworldquest.lastbattery >= 2
Set Maintenance to 0
Set Choice to GetButtonPressed
if (Choice < 0)
Return
elseif Choice == 0 && AbilityNumber1 == 0 ;стелс
player.addspell StealthBoyInvisibilitySpell
set AbilityNumber1 to 1
Set Maintenance2 to 0

elseif Choice == 0 && AbilityNumber1 == 1
player.removespell StealthBoyInvisibilitySpell
set AbilityNumber1 to 0
Set Maintenance2 to 0
endif

elseif Choice == 1 && AbilityNumber2 == 0 ;ускорение
Player.Setav SpeedMult 250
set AbilityNumber2 to 1
Set Maintenance2 to 0

elseif Choice == 1 && AbilityNumber2 == 1
Player.Setav SpeedMult 100
set AbilityNumber2 to 0
Set Maintenance2 to 0

elseif Choice == 2 && AbilityNumber3 == 0;замедление
sgtm 0.25
set AbilityNumber3 to 1
Set Maintenance2 to 0

elseif Choice == 2 && AbilityNumber3 == 1
sgtm 1
set AbilityNumber3 to 0
Set Maintenance2 to 0

elseif Choice == 3 && AbilityNumber4 == 0;кулак ярости
; player.AddItem zzUnderWorldPowerArmorAdvancedNoBackpackWeap4 1
; player.EquipItem zzUnderWorldPowerArmorAdvancedNoBackpackWeap4
set AbilityNumber4 to 1
Set Maintenance2 to 0

elseif Choice == 3 && AbilityNumber4 == 1
; player.removeItem zzUnderWorldPowerArmorAdvancedNoBackpackWeap4 1
set AbilityNumber4 to 0
Set Maintenance2 to 0

elseif Choice == 4 && AbilityNumber5 == 0 ;защитный режим
; player.AddItem zzUnderWorldPowerArmorAdvancedNoBackpackWeap4 1
; player.EquipItem zzUnderWorldPowerArmorAdvancedNoBackpackWeap4
set AbilityNumber5 to 1
Set Maintenance2 to 0

elseif Choice == 4 && AbilityNumber5 == 1
; player.removeItem zzUnderWorldPowerArmorAdvancedNoBackpackWeap4 100
set AbilityNumber5 to 0
Set Maintenance2 to 0
elseif Choice == 5
Set Maintenance2 to 0
endif
endif
End



Но почему то работает каждая кнопка без второй проверки на отключение функций (полагаю, надо было делать в мессаге 2 выбора с разными проверками?). И вернее работает только первая кнопка, с чем это может быть связано?
Команда "Rizys-mod" - разработка плагинов на Fallout.
JupiterJour  Offline  Сообщение №835 написано: 15 октября 2012, 19:02 | Отредактировано: Joopeeter - 15 октября 2012, 19:11


_


Это может быть связано с endif между elseif'ами, которые проверяют Choice насчёт Choice ==0 и Choice ==1.
Хм, ScriptEffectStart и GameMode в одном скрипте? O_o

rizys-mod  Offline  Сообщение №836 написано: 15 октября 2012, 21:38


Команда "Rizys-Mod"


250
Цитата Joopeeter

Хм, ScriptEffectStart и GameMode в одном скрипте? O_o


Удивлен? Вот такой вариант работает стабильно:


А тот что в сообщении 846 (последний), почему-то не работает не в какую, ну как, всмысле работает, но вот включаю например стелс, а выключить уже не выключишь. И остальные варианты не работают. Хотя это наверно из-за ендифа.

Команда "Rizys-mod" - разработка плагинов на Fallout.
Demolir  Offline  Сообщение №837 написано: 19 октября 2012, 08:50



420
Решил задать этот вопрос сюда, т.к. данная тема специализирована на скриптописании.

Ранее в скриптовом языке Oblivion существовала такая функция как GetActiveMenuSelection, она представляла собой условие для объекта на который наведен курсор мыши в меню инвентаря (или для любого другого меню кстати). Существует ли аналогичная функция для Fallout, и если да, то как она работает?

Не судите, да не судимы будите...
Cleric  Offline  Сообщение №838 написано: 20 октября 2012, 20:31



155
Вопрос... наверное тоже по скриптам, хотя возможно есть и способ попроще. Как сделать терминал одноразовым? То есть - активировал терминал, прошёлся по нескольким суб-меню, долез до нужной по квесту кнопки в терминале (допустим - "включить самоунитожение"), вышел из терминала, активировал его снова, а там вместо предыдущего меню что-нибудь типа "терминал заблокирован". Как это сделать?

rizys-mod  Offline  Сообщение №839 написано: 20 октября 2012, 21:00


Команда "Rizys-Mod"


250
Cleric, можно скриптом действие на 1 раз сделать. А можно просто кондифцию сделать на дисабл объекта (disable), и в сообщении его енаблить и тоже уже не будет повторяться.

Команда "Rizys-mod" - разработка плагинов на Fallout.
Demolir  Offline  Сообщение №840 написано: 20 октября 2012, 21:44 | Отредактировано: Demolir - 20 октября 2012, 22:19



420
Цитата Demolir

Существует ли аналогичная функция для Fallout, и если да, то как она работает?



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

Не судите, да не судимы будите...
Форум » Fallout: New Vegas » Мастерская » Скрипты (Вопросы и ответы)
Поиск:





Ответ на жалобу смотрите в разделе жалоб