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

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



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




KAIN48  Offline  Сообщение №241 написано: 21 июня 2011, 08:51


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


Exotic Привет!
Я почитал и предлагаю сделать так. Может и не правильно, но согласись - трудно понять "сверхзадачу" по такой установке.
Цитата Exotic

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


И ещё признаюсь я в FalloutNV почти не играл и как работает система крафтинга понятия не имею!
Но из обсуждения понял так.
После крафта каких то деталей получаеться готовый объект, который ты назвал "банка".
И нужно сделать так, что бы за одну банку давалось 10 очков опыта, а за 20 банок - 200.
Как только банки попали в инвентарь.
Правильно?
Только я не понял а зачем их удалять, банка это же условное название нужной детали. А если это бесполезный довесок необходимый для подсчёта - то зачем? Можно ведь считать и сами нужные детали.
Одним словом - ты попробуй вот такой вариант, а там скажи сам - чего в этом супе не хватает!
Code
scn AAAKainAddXPScript
Short oXP
Short COU

begin OnAdd player

if player.GetItemCount AAAKainObject > 0        ;при появлении в инвентаре банок хоть одной хоть 100
Set COU To player.GetItemCount AAAKainObject   ;в переменной COU "считаем"  сколько банок в инвентаре
Set oXp to player.RewardXP COU * 10                    ;в перменной oXP "вычисляем" кол-во опыта
player.RewardXP oXp                    ;добавляем опыт
EndIf
End

Я сам проверил, но я даже не знаю, где посмотреть кол-во опыта в Пип Бое! Чисто визуально по полоске на экране смотрел разницу.
Для проверки скрипт повесь на банку. Только банка твоя ID твой. Поставь на земле штук с 5. А штук 30 положи в контейнер - его тоже создай рядом. Что бы сравнить, как работает.
Пока.

Мы вышли из дома, когда во всех... Поздно вышли!
Exotic  Offline  Сообщение №242 написано: 21 июня 2011, 08:56



KAIN48, именно этот скрипт мы и делали, просто переменные были названы по-другому. Объясняю примерную схему:

1. На верстаке создается выбранный предмет (не уникальный)
2. Выбранный предмет помещается в инвентарь
3. В инвентарь вместе с выбранным предметом помещается уникальный предмет "10 опыта", который никак больше нельзя получить. Если вешать скрипт на броню, например, то каждый раз, если ее выкинуть и взять обратно, игрок будет получать опыт. Поэтому нам нужен этот уникальный предмет "10 опыта", добавить и удалить.

Так проблема именно в том, что если я поднимаю предмет "10 опыта" с земли, то опыт добавляется. А если он попадает в инвентарь через верстак, но нет.

Artem13  Offline  Сообщение №243 написано: 21 июня 2011, 10:19


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


Exotic, вспомнил - мы с fillimor`ом нарвались на ту же хрень - на созданных через рецепт предметах не работают скрипты. Для того, чтобы заработали нужно выкинуть->поднять. Попробуй еще просто открыть/закрыть инвентарь. Похоже, придётся попробовать глобальный скрипт.

<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
ITU  Offline  Сообщение №244 написано: 21 июня 2011, 10:27



995
ну да, остается только добавить квест со скриптом

Exotic  Offline  Сообщение №245 написано: 21 июня 2011, 10:45



Artem13, ITU, :D поподробнее можно? Я же говорю, в скриптах я разбираюсь плохо.
Как это будет выглядеть? Все так же через верстак, или как-то по-другому?

SERGANT-AK47  Offline  Сообщение №246 написано: 21 июня 2011, 10:50 | Отредактировано: SERGANT-AK47 - 21 июня 2011, 10:51


boo


594
Что надо изменить в этом ужосе, что бы он стал работать? (PS: не надо писать ответы типа "этот скрипт - ерись" и "ты не***на не понимаешь в скриптах" - наслушался уже <_< )
Code
scn HZPistolStartAndEndScript   
short Once   
Begin GameMode   
      if (Once == 0)   
        if (Player.GetItemCount HZPistolStart >= 1)   
          SetStage HZPistol 10   
set Once to 1   
        endif
End
      if (DoOnce == 0)   
        if (Player.GetItemCount HZPistolEnd >= 1)   
          SetStage HZPistol 30
         CompleteAllObjectives HZPistol
Player.RemoveItem HZPistolBody 1
Player.RemoveItem HZPistolClip 1
Player.RemoveItem HZPistolLaths 1
Player.RemoveItem HZPistolShutter 1
Player.AddItem aaaWeapHZPistol 1
set DoOnce to 1   
        endif
endif
End

ITU  Offline  Сообщение №247 написано: 21 июня 2011, 11:25



995
Exotic, тот же самый скрипт, тот что я первый на странице указывал или KAIN48 его указал, только помечаешь вверху в выпадающем меню что он квестовый
создаешь квест, приоритет 100, Start Game Enabled и указываешь скрипт

KAIN48  Offline  Сообщение №248 написано: 21 июня 2011, 11:37 | Отредактировано: KAIN48 - 21 июня 2011, 12:51


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


Exotic, Привет! И всем кто участвует в обсуждении Привет! И железяке Привет!
Не мы лёгких путей не ищем! Зачем нам квест, когда есть стол (активатор) Банка и нужная для крафта деталь.
Давайте сделаем так.
На стол скрипт, который при активации добавляет банку. К стандартному добавим две строчки.
Добавление банки и проверку на наличие детали для крафта
Плюс блок GameMode для удаления банки, хоть её на Пустоши и не найти (уникум)
Code
Ref  User
Begin OnActivate

        Set User to GetActionRef
        If GetActionRef != Player
        User.Activate
        Elseif GetActionRef == Player
             player.showrecipemenu WorkbenchRecipes
if player.GetItemCount DrainedFlamerFuelTank > 0
player.AddItem AAAKainObject 1
endif
EndIf
end
Begin GameMode
player.removeitem AAAKainObject 1
end

А на банку повесим тот скрип, который мы параллельно сделали!
Code
Short oXP
Short COU
begin OnAdd player
if player.GetItemCount AAAKainObject > 0        ;при появлении в банки
Set COU To player.GetItemCount AmmoFlamerFuel   ;определям  сколько  в инвентаре
Set oXp to player.RewardXP COU * 10                    ;вычисляем кл-во опыта
player.RewardXP oXp                    ;добавляем опыт

EndIf
End

Теперь должно работать правильно.
При активации сделана проверка на деталь и банка добавлена, наверное можно для качества сделать проверку на несколько деталей.
Банка добавлена - опыт подсчитан.
Выходим из меню верстака и удаляем банку.
Пока.

Мы вышли из дома, когда во всех... Поздно вышли!
ITU  Offline  Сообщение №249 написано: 21 июня 2011, 11:39 | Отредактировано: ITU - 21 июня 2011, 11:42



995
SERGANT-AK47, ересь))
ты чего хочешь сделать?

1. у тебя end в середине
2. у тебя два одинаковых условий
3. выбирай какую стадию квеста тебе надо (я так понимаю HZPistol это квест)
SetStage HZPistol 10 или SetStage HZPistol 30

Code
scn HZPistolStartAndEndScript     
   short Once     
   Begin GameMode     
        if (Once == 0)     
          if (Player.GetItemCount HZPistolStart >= 1)     
            SetStage HZPistol 30   
           CompleteAllObjectives HZPistol   
   Player.RemoveItem HZPistolBody 1   
   Player.RemoveItem HZPistolClip 1   
   Player.RemoveItem HZPistolLaths 1   
   Player.RemoveItem HZPistolShutter 1   
   Player.AddItem aaaWeapHZPistol 1   
   set DoOnce to 1     
          endif   
   endif   
   End

Artem13  Offline  Сообщение №250 написано: 21 июня 2011, 11:50 | Отредактировано: Artem13 - 21 июня 2011, 11:53


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


ITU, ты неправ, там у сержанта разные условия. Только он забыл переменную определить и вместо енда там ендиф должен быть:
Code

scn HZPistolStartAndEndScript     
short Once
short DoOnce

Begin GameMode     

    if (Once == 0)     
      if (Player.GetItemCount HZPistolStart >= 1)     
          SetStage HZPistol 10     
          set Once to 1     
       endif   
    endif

    if (DoOnce == 0)     
       if (Player.GetItemCount HZPistolEnd >= 1)     
          SetStage HZPistol 30   
          CompleteAllObjectives HZPistol   
          Player.RemoveItem HZPistolBody 1   
          Player.RemoveItem HZPistolClip 1   
          Player.RemoveItem HZPistolLaths 1   
          Player.RemoveItem HZPistolShutter 1   
          Player.AddItem aaaWeapHZPistol 1   
          set DoOnce to 1     
       endif   
    endif   
End

<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
ITU  Offline  Сообщение №251 написано: 21 июня 2011, 12:05



995
Artem13, точно, не заметил :(

SERGANT-AK47  Offline  Сообщение №252 написано: 21 июня 2011, 13:14 | Отредактировано: SERGANT-AK47 - 21 июня 2011, 12:49


boo


594
ITU,
В этом весь смысл <_<
Два разных обьекта в одном триггере активируют разные стадии (поэтому нужен один скрипт. Ведь не десять в одно место делать, я же собираюсь в это место делать еще квесты)
Думаю срузу будет вопрос - а че бы не повесить свой скрипт на каждый обьект?
Ответ - на записи (note) скрипты не вешаются.
Т.е. мне надо чтобы сначала переключилась одна стадия, а потом через какое-то время другая.

Добавлено (21.06.2011, 17:14)
---------------------------------------------
Новая порция лажи:

Code
scn HZPistolMiddleScript  

short DoOnce  
Begin GameMode  
if (DoOnce == 0)  
if (Player.GetItemCount HZPistolBody >= 1) && (Player.GetItemCount HZPistolClip >= 1) && (Player.GetItemCount HZPistolLaths >= 1) (Player.GetItemCount HZPistolShutter >= 1)  
SetStage HZPistol 20
HZPistolEnd.Enable
set DoOnce to 1  
endif  
endif  
End

Все работает без 8 строчки.
Как сделать с ней? (8 - должен появится предмет)

Artem13  Offline  Сообщение №253 написано: 21 июня 2011, 14:10


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


Цитата SERGANT-AK47

Все работает без 8 строчки. Как сделать с ней? (8 - должен появится предмет)


2 варианта - либо помещать в мир скриптом через PlaceAtMe, либо вместо ИД использовать ссылку (Reference). Тут я пытался пояснить работу со ссылками.

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


boo


594
Artem13, Спс, ща посмотрю :)

Добавлено (21.06.2011, 18:32)
---------------------------------------------
Artem13,
Прописал вот это:
Code
scn HZPistolMiddleScript

short DoOnce   
Begin GameMode   
if (DoOnce == 0)   
if (Player.GetItemCount HZPistolClip >= 1) && (Player.GetItemCount HZPistolBody >= 1) && (Player.GetItemCount HZPistolLaths >= 1) && (Player.GetItemCount HZPistolShutter >= 1)   
SetStage HZPistol 20
HZPistolEndRef.Enable
set DoOnce to 1   
endif   
endif   
End

Вроде скрипт сохранился (прогресс!!! lol )
Как думаешь, работать будет?

Добавлено (21.06.2011, 20:43)
---------------------------------------------
Первый скрипт не работает (где две задачи в одном) :(
Разделил на две части (первая - start и вторая - end (если че, это просто название) ) - все работает.
Почему так?
Зато второй работает отлично, спасибо за помощь (без тебя бы не допер поставить после ИД объекта Ref) good

Exotic  Offline  Сообщение №255 написано: 22 июня 2011, 12:27



Кстати, спасибо всем, кто помогал) Сделал через квест - все работает, как часы.

SERGANT-AK47  Offline  Сообщение №256 написано: 23 июня 2011, 09:30 | Отредактировано: SERGANT-AK47 - 24 июня 2011, 05:21


boo


594
Мой первый скрипт написанный лично от начала до конца yahoo :
Code
scn HZPistolClipModScript

BEGIN OnAdd Player
   Player.AddItem Ammo10mmJHPHandLoad 95
End

Artem13  Offline  Сообщение №257 написано: 23 июня 2011, 10:25


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


Цитата SERGANT-AK47

Первый скрипт не работает (где две задачи в одном) :( Разделил на две части (первая - start и вторая - end (если че, это просто название) ) - все работает. Почему так?


А он на чём висит то? А то возможно у тебя в инвентаре уже нету объекта, к которому он прикреплён...

<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a>
Да, мы бандиты и бродяги, как злословит молва,
Мы попадаем в передряги, помня эти слова.
Смотри вперед и не сдавайся ты на милость судьбе!
Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
SERGANT-AK47  Offline  Сообщение №258 написано: 23 июня 2011, 10:34


boo


594
Artem13,
Триггер, не находясь в котором взять предмета (запись, если точнее) нельзя

KAIN48  Offline  Сообщение №259 написано: 23 июня 2011, 13:09


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


SERGANT-AK47, Поздравляю!
Как я понимаю скрипт весит на пистолете. И когда его берешь в инвентарь добавляются патроны.
А что будет если выбросить пистолет и снова забрать в инвентарь! И снова и снова - раз десять сделал такую комбинацию и 900 патронов несёшь на рынок.
Быстро станешь богатым!
Пока.

Мы вышли из дома, когда во всех... Поздно вышли!
Artem13  Offline  Сообщение №260 написано: 23 июня 2011, 13:58 | Отредактировано: Artem13 - 23 июня 2011, 14:00


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


SERGANT-AK47, попробуй использовать не GameMode, а OnTrigger player

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


boo


594
KAIN48,
Скрипт весит не на пегале, а на модификации магазина. Думаю никто о скрипте и не подумает, а просто модификацию установит (она лежит там же где получишь пистолет). Ведь даже логично - новый магазин в большом (сравнительно магазина) ящике. Значит там должно быть что-то еще :)
А во втором аналогичном скрипте 95 заменено на 10. (Скрипт весит не на пегале, а на его магазине (помнишь ты мне еще скрипт писал как переключить стадию квеста, если нужно взять несколько предметов). А магазин - квестовый предмет (Т.е. его нельзя выбросить, продать, отдать и т.д.))
Так что я все продумал :)

DrHax  Offline  Сообщение №262 написано: 24 июня 2011, 13:47



149
Как написать скрипт,который при убийстве определённых персонажей завершит стадию квеста? unsure

Amat victoria curam
KAIN48  Offline  Сообщение №263 написано: 24 июня 2011, 14:30 | Отредактировано: KAIN48 - 24 июня 2011, 15:11


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


DrHax, Привет!
Вот так сделай.
Code
scn AAADrHaxDeathScript

begin OnStartCombat player
end

begin OnDeath
SetStage AAADrHaxQuest 25
end


Первый блок заставляет того на ком скрипт вступить в бой с ГГ. (если не нужен можешь убрать)
Во втором устанавливается стадия квеста на 25 тую. После смерти того на ком стоит скрипт. Если поставить номер первой стадии то эта функция запустит квест.
Пока.

Мы вышли из дома, когда во всех... Поздно вышли!
DrHax  Offline  Сообщение №264 написано: 24 июня 2011, 14:43



149
KAIN48, большое спасибо.

Amat victoria curam
KAIN48  Offline  Сообщение №265 написано: 24 июня 2011, 15:14


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


DrHax, Извини, я там немного опечатался - сейчас исправил endif убрал - первый раз сделал с проверкой на смерть, а потом убрал - ни
к чему. А Endif не удалил.
Скрипт не будет сохраняться.
Извини бывает, и не торопился я вовсе, а просмотрел!
Пока.

Мы вышли из дома, когда во всех... Поздно вышли!
DrHax  Offline  Сообщение №266 написано: 24 июня 2011, 17:05



149
KAIN48, спасибо,почти всё работает.Но вот противниками сделать никак не получается...

Amat victoria curam
KAIN48  Offline  Сообщение №267 написано: 24 июня 2011, 18:04 | Отредактировано: KAIN48 - 24 июня 2011, 18:06


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


DrHax,
Цитата DrHax

Но вот противниками сделать никак не получается...


Посмотри у себя вот эти моменты.
Сделать врага членом изначально враждебной фракции - например "Черти" Добавить во вкладку Factions фракцию. Это в окне NPC вкладка Factions, в ней окно списка Factions and Ranks, в окне списка - правый клик New и выбирай нужную фракцию.
Во вкладке AI Data Проверь агрессивность Agression
Unaggressive - не нападает
Aggressive - нападает на врагов когда увидит
Very Aggressive - нападает на врагов и нетральных
Frenzied - нападает на любого, кого увидит
И там же проверь Confidence - твёрдость духа (уверенность)
Выбери - Foolhardy -безумный, бесрассудный
Установи радиус Агрессивного поведения (сам не знаю сколько! попробуй 512 для начала и посмотри, на каком расстоянии начинает атаковать).
И дай врагу умение выше 50-60 оружия (какое там у него в инвентаре) Кстати это то же проверь есть оружие или нет.
Поставь какой нибудь боевой класс.
Или поступи проще - выбери готовый ActorBase. Готовую базовую модель и в Template Data отключи нужные для редактирования галки (они будут включены по умолчанию).
Попробуй сделать, то что выделено жирным - важно.
Пока.
***
А скрипт по нападению я завтра сделаю посерьёзней, хотя и этот должен работать.

Мы вышли из дома, когда во всех... Поздно вышли!
DrHax  Offline  Сообщение №268 написано: 25 июня 2011, 13:43



149
KAIN48, спасибо.

Добавлено (25.06.2011, 17:43)
---------------------------------------------
Противниками сделал,однако теперь они атакую друг -друга.


Amat victoria curam
KAIN48  Offline  Сообщение №269 написано: 25 июня 2011, 15:05


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


DrHax, Привет!
Интересно! Члены одной фракции не могут нападать друг на друга, если в настройках фракции не включено Special Combat ( позволяет драться между собой без начисления штрафов)
Ты наверное поставил им Frenzied - нападает на любого, кого увидит
Поменяй на Aggressive - нападает на врагов когда увидит, или на
Very Aggressive - нападает на врагов и нейтральных.
Должно помочь.

Мы вышли из дома, когда во всех... Поздно вышли!
ITU  Offline  Сообщение №270 написано: 25 июня 2011, 20:09



995
такс, вопрос
нужна функция определения враг ли непись ГГ или нет
собственно вот такой вот скриптик (часть его)
Code
ScriptName 0ITUHEnterVaultWarring

REF refNPC

Begin OnTrigger

set refNPC to GetActionRef

If refNPC.GetActorFactionPlayerEnemy == 1
;тут код создания сирены, изменения освещения, изменение глобальных переменных для пакетов неписей и т.д.
endif

end


функция GetActorFactionPlayerEnemy постоянно возвращает 0, а точнее (null), кто бы не попадал на триггер, не понятно почему

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





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