Перейти к контенту

[SoC] Ковыряемся в файлах


Рекомендуемые сообщения

ColR_iT, либо я чего-то напортачил, либо self не работает, вылетаю с таким логом:

 

Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
Line          : 73
Description   : <no expression>
Arguments     : LUA error: ...shing\s.t.a.l.k.e.r\gamedata\scripts\xr_logic.script:371: attempt to call field 'set_scheme' (a nil value)

 

[logic]

active = walker

 

[walker]

path_walk = esc_gopnik_1_walk

path_look = esc_gopnik_1_look

on_actor_dist_le = 20| remark@infogop

 

[remark@infogop]

anim = claim

on_info = {-esc_gopnik_talk} %=run_gopnik_dlg% meet

 

[meet]

meet_state = 10| {+esc_gopnik_info} threat_fire %=killactor%, claim@ {+esc_gopnik_info} talk_abuse, wait | 5 | claim %+esc_gopnik_info%; wait | 2 | claim;state

meet_state_wpn = 10| {+esc_gopnik_info} threat_fire %=killactor%, claim@ {+esc_gopnik_info} talk_abuse, wait

victim = 10| actor

victim_wpn = 10| actor

use = {+esc_gopnik_talk} self, true

use_wpn = false

 

 

 

function run_gopnik_dlg()

if not has_alife_info("esc_gopnik_talk") then

db.actor:give_info_portion("esc_gopnik_talk")

end

end

 

 

Ссылка на комментарий

Artos, привёл двумя постами выше, вместе с оговоркой.

И обрати внимание на вот эту проверку в указанном тобою файле:

elseif t == "self" then
    if not is_talking then
        db.actor:run_talk_dialog(self.npc)
    end
end

А с твоей стороны я не ожидал увидеть в качестве "парирования" по сути колбек на юзание именно игроком НПС, а не сам метод process_use, который определяет параметры use и use_wpn.

Я в замешательстве dntknw.gif.

Изменено пользователем ColR_iT
Ссылка на комментарий

P.S. Теперь вижу. Пока писал и тправлял ответ - этого не было.

Однако(!) извини, но в оригинальной схеме ТЧ (SHoC) в патчах 1.0004...1.0006 указанные в твоей оговорке стороки про 'self' ОТСУТСТВУЮТ.

Вот полная функция о которой идет речь:

-- Функция проверяет не мешает ли персонажу говорить с нами оружие
function cannot_talk_by_weapon(npc)
    local st = db.storage[npc:id()].meet
    if st then
        if not isWeapon(db.actor:active_item())    then            
            return false
        end        
        if st.use then
            local t = xr_logic.pick_section_from_condlist(db.actor, npc, st.use)
            if t == "false" then
                return false
            end
        end
        if st.use_wpn then
            local t = xr_logic.pick_section_from_condlist(db.actor, npc, st.use_wpn)
            if t == "false" then
                return true
            end
        end
    end
    return false
end

Ну и само собою разумеется, что добавив в коды нечто свое - можно добиться самых неожиданных результатов, но НЕ нужно их ожидать от исходных кодов!

 

P.P.S. Убедительная просьба, давая кусок кода - уточнять место, откуда код взят и где на него можно взглянуть в контексте.

После уточнению тобою поста нашел о чем речь ... и сейчас проанализирую.

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Artos, а при чём здесь функция cannot_talk_by_weapon? :blink: Загляни в метод process_use, самого класса Cmeet_manager.

 

P.S. Так, а ты точно тот кусочек нашёл? Потому как строчка:

elseif t == "self" then

в файле встречается единожды...

Изменено пользователем ColR_iT
Ссылка на комментарий

ColR_iT, заглянул. С самого начала и нужно было дать конкретное место ...

Да, я не прав, и это ('self') еще одно возможное строковое значение для параметра 'use' и действительно именно это значение открывает диалог с НПС.

К сожалению, в исходной схеме, разработчики применили двойное именование стораджа (st.use и a.use), что при проверке на вскидку и привело к пропуску этой возможности.

 

Мда-а-а, и тут разрабы дали возможность для потенциальной дырки, т.к. хотя дефолтно дистанция ограничена 2-мя метрами до актора,

но как в случае Struck - он дал victim = 10| actor и попал в ловушку движка ...

 

Собственно инфопоршень то и не обязателен, более важен именно victim = 3| actor который и дает общее разрешение для разговора с актором не дальше чем в 3 метра.

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Struck, схема meet используется, чтобы задать реакцию ГГ на НПС, по "русски" она так и называется "схема приветствия". И задать её в качестве активной схемы нельзя! По сути - это движковая схема, используемая НПС автоматически, но разработчики предоставили нам возможность задавать её параметры по нашему усмотрению, что есть очень удобно.

Например, можно сделать, что НПС в одной схеме будет с нами разговаривать, в другой нет, просто изменив параметр use с true на false.

Вот здесь достаточно подробно описано как пользоваться данной схемой: Meet_manager.

Изменено пользователем ColR_iT
Ссылка на комментарий

ColR_iT, хех ... взглянул в указанную статью "Meet_manager" и вижу рекомендованное:

[meet]

...

victim = 30| nil| 20| actor

use = self

...

Вопрос - к чему приведет это сочетание? :shok:

 

(вопрос риторический и скорее опять возвращает к "читаем мануалы с головою!") :crazy:

 

P.S. По-хорошему, для использующих 'self' в данную схему стОит внести правку:

  elseif t == "self" then
    if not is_talking then
--      printf("MM3 %s start talk", self.npc:name())
      --/#+# ограничение на принуждение к диалогу:
      if self.npc:name() == "mon_stalker" then --/ с О-Сознанием разговор 'особый'
        db.actor:run_talk_dialog(self.npc)
      elseif self.npc:position():distance_to_sqr(db.actor:position()) < 6 then --/ для остальных не далее ~2.4-x метра.
        db.actor:run_talk_dialog(self.npc)
      end
      --/
    end
  end

- это даст и с О-Сознанием побеседовать как ранее, и для остальных окна принудительного диалога будут открываться НЕ далее чем за 2.4 метра до собеседника, исключив подвисания управления актором.

И, кстати, Struck как раз и приводил цитату именно из этой статьи (не указав источника), и которая ввела им написанную логику в ступор ...

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Artos, в твоем варианте диалог всегда будет начинаться если НПС находится на расстоянии ~3 метров, а не единожды, я вот такую поправку внес, на мой взгляд оптимально, потому что 'эскейпом' такой диалог завершить нельзя.

 

   --/#+# ограничение на принуждение к диалогу:
      if self.npc:name() == "mon_stalker" then --/ с О-Сознанием разговор 'особый'
        db.actor:run_talk_dialog(self.npc)
      elseif self.npc:position():distance_to_sqr(db.actor:position()) < 6 then --/ для остальных не далее ~2.4-x метра.
      if not has_alife_info("run_talk_info") then
      db.actor:give_info_portion("run_talk_info")
        db.actor:run_talk_dialog(self.npc)
        end
        elseif self.npc:position():distance_to_sqr(db.actor:position()) >6 then
        db.actor:disable_info_portion("run_talk_info")
      end
      --/

 

Ссылка на комментарий

Зaмeнил нa AТП бaндюков нa нeймов. При стaртовом диaлогe, срaбaтываeт квeст нa зaчистку- выполнeн. Подскaжитe что я пропустил? Дa eщe, иногдa уходят к мосту < Кузю вaлят >. -- Спaсибо зa отвeт.

Ссылка на комментарий

Struck, у себя ты можешь городить что угодно, мною же дана правка "для всех", вполне достаточна, и не требует никаких сторонних инфопоршней.

И, к твоему сведению, проверка if not is_talking then, имеющаяся в оригинальном коде как раз и занимается "однократностью", т.е. пока диалог не начат - будет проводиться проверка на дальность расстояния, как только диалог начнется - is_talking как раз и исключит излишние проверки. Так что ты у себя "масло масляное" нагородил.

Вот еще для закрытия уже открытого окна диалога для случая 'self' и, если НПС уходит от актора по какой-то причине, можно добавить аналогично остальным диалогам:

  -- проверка по дистанции
--  printf("MM2 %s %s", self.npc:name(), tostring(t))
  if (is_talking and self.npc:position():distance_to_sqr(db.actor:position()) > 9) and
    (t ~= "self" or self.npc:name() ~= "mon_stalker") --/#+# добавим проверку для всех 'обычных' НПС
  then
--    printf("MM3 %s stop talk", self.npc:name())
    self.npc:stop_talk()
  end

И не мешай разную логику в одну кучу. Если сам даешь для НПС возможность принудительно к актору открыть диалог, то с какого такого условия актор может эскейпом его закрыть? Или вводи в свой диалог такое условие или дай договорить начавшему диалог НПС.

 

Добавлено через 17 мин.:

Priboj37, если по условиям квеста игрок должен освободить АТП от бандитов, а ты взял и заменил их на наемников (не используй жаргонарий, плз) - то неотключенным квестом и считается - "нет бандитов - квест выполнен". Или меняй все условия квеста под свои изменения или отключай его.

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Прошу помочь обьяснить назначение in и out рестрикторов у нпс.С out вроде бы понятно.При назначении base_out нпс за него не выходит.Нужно для того,что бы нпс удержать в определенной зоне.При назначении dinamic_out при определенных условиях держать\отпустить нпс.А назначение in рестрикторов немного не понимаю.Это наверно в такие типы рестрикторов нпс бегут, как бы цель, и что бы им нельзя было зайти в этот рестриктор или как?Просто немного запуталься.Прошу помочь разобраться в вопросе.

Ссылка на комментарий

panzyuza

Во-первых, стОит несколько различать рестриктор (restrictor) от ограничения (restriction).

Во-вторых, чем отличается включатель от выключателя? Зачастую, это одно и то же, но для первого основной функцией является включение чего-либо, для второго - выключение, хотя конечно же бывают и только вкл или выкл или без разницы ...

Собственно название 'restrictor' => ограничитель - достаточно размытое. В купе с уточнением space_restrictor в игре обозначает некую область/пространство, ограниченное некоторой границей/объемом/площадью.

Имеется также понятие/термин restriction - ограничение, и если ограничитель - это некая сущность, то ограничение - это уже действие/свойство.

Ну и если принять, например, за space_restrictor комнату в доме, то к этому ограниченному пространству можно применять два типа дополнительных (помимо границ коматы) ограничения - например в нее НЕльзя входить (in) или наоборот - из нее НЕльзя выходить (out).

Так что, взяв какой-то рестриктор, тем самым ограничив в пространстве некую зону, и применив к нему некое ограничение - получаем IN- или OUT- зоны, куда или нельзя попадать или нельзя покидать.

 

В итоге (упрощенно):

in_restriction - ограничение на вхождение во что-то ... ;

in_restrictor - ограниченная в пространстве область с ограничением на вход в эту область;

 

out_restriction - ограничение на выход из чего-то ... ;

out_restrictor - ограниченная в пространстве область с ограничением на вЫход из этой области.

 

В игре, in_restrictor'ами являются, например, аномалии и в исходной игре мостры и сталкеры не заходят в них (без причин). Так же можно считать те же костры, куда им заходить не следовало бы, но косяки в кодах не выставляют это ограничение и порою кто-то жариться на угольках ...

Ну а ярким примером out_restrictor'а в игре является та же территория арены, за пределы которой ни одна зверушка или поединщик (кроме ГГ) не выходят.

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Доброго времени суток.

У меня такой вопрос - при убийстве одного сталкера ГГ получает инфопоршень. К инфопоршню привязан скрипт по вызову сообщения на экран. А можно ли сделать, чтобы оно приходило с задержкой, например, в минуту времени, а то очень некрасиво выглядит.

Такие дела. - Курт Воннегут.

Ссылка на комментарий

Принцип поймешь именно там, а чтобы не изобретать велосипед, лучше прямо под него писать используя наработки и учась у авторов - там много инструментария.

Ссылка на комментарий

Не помню, может спрашивал уже, как вывести отметки сталкеров(желтые, зеленые и красные точки) с миникарты, в ПДА..? Хотя бы подскажите это через скрипт или нет..?

 

Не момню, может и отвечали уже ... Почитай топик и ФАКи, в частности про map_spots_relations.xml. --/Artos

Изменено пользователем ColR_iT

FANAT.gif

Мой канал на ютабчике... / Недельки из жизни фаната STALKER'a / Клуб 'Фанат Отчуждения'

Я нет-нет, а думаю, может я неправильно жил, надо ж брать деньги у богатых и давать их бедным, а таким как ты давать по морде, шоб у мире была красота и гармония.(с)Ликвидация

Всё в порядке, всё нормально, я беру тебя с собой, я беру тебя с собой. В тёмный омут головой.(с)Смысловые Галлюцинации

Ссылка на комментарий

Artos, этот файл не отвечает за отображение отметок НПС на карте в ПДА, лишь за видимость на миникарте. Возможно ты не до понял....

 

FANAT, за отображение меток на миникарте отвечает движок. Но! Можно повесить метки на всех НПС разом и метки эти будут видны на карте в ПДА.

Есть такая-себе мод-утилита EyeOfChernobyl, за авторством XiaNi. Там отображаются всё население, аномалии, зоны, респавнеры. А сделано всё очень просто: в файле se_stalker.script, в методе on_register, в конце есть вот такие строки:

local community, rank = sim_statistic.getNpcType(self)
level.map_add_object_spot_ser(self.id, "alife_presentation_"..community, self:name().." "..community)

Функция getNpcType из файла sim_statistic, возвращает группировку и ранг НПС, в общем ничего сложного.

Загляни, думаю, тебе станет всё понятно.

Изменено пользователем ColR_iT
Ссылка на комментарий

ColR_iT, мною где-то сказано про "... файл отвечает за отображение отметок НПС на карте в ПДА"? ...

Основа моей реплики (а не ответа) - отсылка к чтению топика и обращение внимания на файл, который и выводит на миникарту разноцветные точки.

И в любом случае за вывод/отображение любых отметок отвечает движек, xml-ки в данном случае только средство, обечпечивающее эту возможность.

Перенести в КПК отметки друг/враг/нейтрал/труп невозможно без написания собственноо скрипта. Упомянутое тобою - это статичное отображение неписей с учетом их группировок, а не данамическое (видим/невидим/изменил отношение) и т.п. ... Т.о. взяв за основу коды для разноцветных точек и используя самописный скпипт - что-то можно получить и для КПК.

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   1 пользователь

×
×
  • Создать...