Скрипты - неотъемлемая часть GECK. При написании возникает очень много казусов. Данная тема должна помочь не наступать на "грабли" новичкам и делиться опытом с другими более продвинутых мододелов.
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 положи в контейнер - его тоже создай рядом. Что бы сравнить, как работает. Пока.
KAIN48, именно этот скрипт мы и делали, просто переменные были названы по-другому. Объясняю примерную схему:
1. На верстаке создается выбранный предмет (не уникальный) 2. Выбранный предмет помещается в инвентарь 3. В инвентарь вместе с выбранным предметом помещается уникальный предмет "10 опыта", который никак больше нельзя получить. Если вешать скрипт на броню, например, то каждый раз, если ее выкинуть и взять обратно, игрок будет получать опыт. Поэтому нам нужен этот уникальный предмет "10 опыта", добавить и удалить.
Так проблема именно в том, что если я поднимаю предмет "10 опыта" с земли, то опыт добавляется. А если он попадает в инвентарь через верстак, но нет.
Exotic, вспомнил - мы с fillimor`ом нарвались на ту же хрень - на созданных через рецепт предметах не работают скрипты. Для того, чтобы заработали нужно выкинуть->поднять. Попробуй еще просто открыть/закрыть инвентарь. Похоже, придётся попробовать глобальный скрипт.
<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a> Да, мы бандиты и бродяги, как злословит молва, Мы попадаем в передряги, помня эти слова. Смотри вперед и не сдавайся ты на милость судьбе! Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
Что надо изменить в этом ужосе, что бы он стал работать? (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
Exotic, тот же самый скрипт, тот что я первый на странице указывал или KAIN48 его указал, только помечаешь вверху в выпадающем меню что он квестовый создаешь квест, приоритет 100, Start Game Enabled и указываешь скрипт
Изменение репутации для пользователя KAIN48
KAIN48Offline
Сообщение №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
ITUOffline
Сообщение №249
написано: 21 июня 2011, 11:39
| Отредактировано: ITU - 21 июня 2011, 11:42
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
Artem13Offline
Сообщение №250
написано: 21 июня 2011, 11:50
| Отредактировано: Artem13 - 21 июня 2011, 11:53
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, В этом весь смысл Два разных обьекта в одном триггере активируют разные стадии (поэтому нужен один скрипт. Ведь не десять в одно место делать, я же собираюсь в это место делать еще квесты) Думаю срузу будет вопрос - а че бы не повесить свой скрипт на каждый обьект? Ответ - на записи (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 - должен появится предмет)
Все работает без 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
SERGANT-AK47Offline
Сообщение №254
написано: 21 июня 2011, 16:43
| Отредактировано: SERGANT-AK47 - 21 июня 2011, 16:46
Добавлено (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
Вроде скрипт сохранился (прогресс!!! ) Как думаешь, работать будет?
Добавлено (21.06.2011, 20:43) --------------------------------------------- Первый скрипт не работает (где две задачи в одном) :( Разделил на две части (первая - start и вторая - end (если че, это просто название) ) - все работает. Почему так? Зато второй работает отлично, спасибо за помощь (без тебя бы не допер поставить после ИД объекта Ref)
Первый скрипт не работает (где две задачи в одном) :( Разделил на две части (первая - start и вторая - end (если че, это просто название) ) - все работает. Почему так?
А он на чём висит то? А то возможно у тебя в инвентаре уже нету объекта, к которому он прикреплён...
<a class="link" href="http://nick-name.ru/sertificates/278209/" rel="nofollow" target="_blank"> border="0" alt=""/</a> Да, мы бандиты и бродяги, как злословит молва, Мы попадаем в передряги, помня эти слова. Смотри вперед и не сдавайся ты на милость судьбе! Предай их всех, останься верен себе. (Канцлер Ги - Кантри Бреган Д'Эрт)
SERGANT-AK47, Поздравляю! Как я понимаю скрипт весит на пистолете. И когда его берешь в инвентарь добавляются патроны. А что будет если выбросить пистолет и снова забрать в инвентарь! И снова и снова - раз десять сделал такую комбинацию и 900 патронов несёшь на рынок. Быстро станешь богатым! Пока.
Мы вышли из дома, когда во всех... Поздно вышли!
Изменение репутации для пользователя Artem13
Artem13Offline
Сообщение №260
написано: 23 июня 2011, 13:58
| Отредактировано: Artem13 - 23 июня 2011, 14:00
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
SERGANT-AK47Offline
Сообщение №261
написано: 24 июня 2011, 05:17
| Отредактировано: SERGANT-AK47 - 24 июня 2011, 05:21
KAIN48, Скрипт весит не на пегале, а на модификации магазина. Думаю никто о скрипте и не подумает, а просто модификацию установит (она лежит там же где получишь пистолет). Ведь даже логично - новый магазин в большом (сравнительно магазина) ящике. Значит там должно быть что-то еще А во втором аналогичном скрипте 95 заменено на 10. (Скрипт весит не на пегале, а на его магазине (помнишь ты мне еще скрипт писал как переключить стадию квеста, если нужно взять несколько предметов). А магазин - квестовый предмет (Т.е. его нельзя выбросить, продать, отдать и т.д.)) Так что я все продумал
Первый блок заставляет того на ком скрипт вступить в бой с ГГ. (если не нужен можешь убрать) Во втором устанавливается стадия квеста на 25 тую. После смерти того на ком стоит скрипт. Если поставить номер первой стадии то эта функция запустит квест. Пока.
DrHax, Извини, я там немного опечатался - сейчас исправил endif убрал - первый раз сделал с проверкой на смерть, а потом убрал - ни к чему. А Endif не удалил. Скрипт не будет сохраняться. Извини бывает, и не торопился я вовсе, а просмотрел! Пока.
Но вот противниками сделать никак не получается...
Посмотри у себя вот эти моменты. Сделать врага членом изначально враждебной фракции - например "Черти" Добавить во вкладку Factions фракцию. Это в окне NPC вкладка Factions, в ней окно списка Factions and Ranks, в окне списка - правый клик New и выбирай нужную фракцию. Во вкладке AI Data Проверь агрессивность Agression Unaggressive - не нападает Aggressive - нападает на врагов когда увидит Very Aggressive - нападает на врагов и нетральных Frenzied - нападает на любого, кого увидит И там же проверь Confidence - твёрдость духа (уверенность) Выбери - Foolhardy -безумный, бесрассудный Установи радиус Агрессивного поведения (сам не знаю сколько! попробуй 512 для начала и посмотри, на каком расстоянии начинает атаковать). И дай врагу умение выше 50-60 оружия (какое там у него в инвентаре) Кстати это то же проверь есть оружие или нет. Поставь какой нибудь боевой класс. Или поступи проще - выбери готовый ActorBase. Готовую базовую модель и в Template Data отключи нужные для редактирования галки (они будут включены по умолчанию). Попробуй сделать, то что выделено жирным - важно. Пока. *** А скрипт по нападению я завтра сделаю посерьёзней, хотя и этот должен работать.
DrHax, Привет! Интересно! Члены одной фракции не могут нападать друг на друга, если в настройках фракции не включено Special Combat ( позволяет драться между собой без начисления штрафов) Ты наверное поставил им Frenzied - нападает на любого, кого увидит Поменяй на Aggressive - нападает на врагов когда увидит, или на Very Aggressive - нападает на врагов и нейтральных. Должно помочь.
такс, вопрос нужна функция определения враг ли непись ГГ или нет собственно вот такой вот скриптик (часть его)
Code
ScriptName 0ITUHEnterVaultWarring
REF refNPC
Begin OnTrigger
set refNPC to GetActionRef
If refNPC.GetActorFactionPlayerEnemy == 1 ;тут код создания сирены, изменения освещения, изменение глобальных переменных для пакетов неписей и т.д. endif
end
функция GetActorFactionPlayerEnemy постоянно возвращает 0, а точнее (null), кто бы не попадал на триггер, не понятно почему