спасибо. короче теперь вообще незнаю че я с диалогами натворил но когда в 1 диалоге сидору говориш хорошо я попробую или давай как с новичком... то идет вылет а если говориш давай как с опытным и доходия до фразы хорошо я попробую нажимаеш "Esc" то можно выйти к волку
Привет всем. Кто подскажет, как заставить один гулаг напасть на другой?
________
Я знаю способ назначения работы валкера до точки смарта-врага, но это мне не подходит.
________
Ну, например, есть нападения на гулаги в ЧН. Как там это сделано?
Сообщение было успешно отредактировано SkyLoader (02-03-2011 17:26 GMT3 часа, назад)
killer2203
Ссылку тебе дали рабочую.(проверил).
--------------------------------------------------------- SkyLoader
Если не подходит логика - пиши АИ -схему
------------------------------------------------------------------------------------------------
Кто-нибудь в курсе какой эвалюатор (или что то другое) может запрещать NPC(который изначально находится под дефолтной логикой) перемещаться на новую позицию?
Написал небольшую (больше для теста, чем для игры) АИ схему, и никак не могу заставить NPC подбегать к ГГ, если расстояние дальше, чем нужно.
Собственно вот скрипт добавляющий мои эвалюатор и оператор в планировщик.
Код:
--// получаем объект нашего оператора
local action = action_bar_facer (object,"bar_facer", storage)
--// добавляем в нее предусловия работы
action:add_precondition(world_property(stalker_ids.property_alive, true)) --// npc живой
action:add_precondition(world_property(stalker_ids.property_enemy, false)) --// врагов рядом нет
action:add_precondition(world_property(xr_evaluators_id.sidor_wounded_base, false)) --// npc не ранен
xr_motivator.addCommonPrecondition(action)
--// что делает эта строчка? без нее операторы схемы не выполняются, когда эвалюатор в true
action:remove_precondition(properties["bar_facer"])
--// наш эвалюатор должен быть истинным
action:add_precondition (world_property(properties["bar_facer"], true))
--// если эвалюатор стал ложным - прекратить выполнение действий
action:add_effect (world_property(properties["bar_facer"], false))
--// добавляем нашу схему в планировщик
manager:add_action (operators["bar_facer"], action)
--// получим некоторые стандартные эвалюаторы и добавим к их предусловиям,
--//что наш эвалюатор должен быть ложным, тем самым запрещая им работать, когда наш эвалюатор истинен
action = manager:action (world_property(xr_evaluators_id.stohe_meet_base + 1)) -- эвалюатор "ГГ хочет со мной поговорить"
action:add_precondition (world_property(properties["bar_facer"], false))
end
Собственно все прочее в схеме работает - NPC показывает гг фак, бъет в морду, бросает в него предметы, но подбегать не подбегает.
--------------------------------------------------------- SkyLoader
Насчет ЧН я не в курсе, но думаю логично предположить, что для массы народа удобнее организовать подобный экшен - нападение гулагов друг на друга - через АИ-схему.
ЗЫ: Сделал таки, чтобы NPC бегали за ГГ (просчет был в одной строчке) - теперь носятся за ним по всему бару, пока в морду не дадут
Сообщение было успешно отредактировано erlik (03-03-2011 03:33 GMT3 часа, назад) Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
Всем привет!!! у меня пара-тройка вопросов,кто может помочь буду рад!!!
1.Сделал новые боеприпасы 7,62х39,везде все нормально с ними работает,НО при закладки их в ящик начинается ерунда,Они есть их видно, только ГГ не может их взять.Почему?
2.На Ростоке и на Агропроме есть места где камера "летает" показывая что ожидает ГГ впереди.Вопрос как сделать так на других локациях?
3.И как добавить локацию? кто знает киньте ссылку!!
Всем заранее спасибо!!
добавлено спустя 5 минут
killer2203 привет!! открой файл outfit.ltx и внимательно поизучай его! там все подробно написано про все комбезы!!!
Сообщение было успешно отредактировано Vich2010 (03-03-2011 13:10 GMT3 часа, назад) Большая Земля - это часть Зоны Отчуждения и наоборот.
Если я вывожу содержательный текст, то он выходит за пределы скриптового окошка. Как сделать перенос строки? \n - это не работает. Знаю, что можно разделить текст и потом несколько раз повторить вышепоказанный код, меняя текст на следующую его часть. Но может есть вариант 'посимпатичней'?
Stalk15
У класса CUIStatic() есть такая досадная недоработка, то что он не умеет переносить текст - то есть в его конструкторе нет нужного метода. Есть только атрибут complex_mode="1", который читается из xml настроек. Он как раз и включает режим переноса строк у статика. Но применить его можно только в xml.
Хотя у статиков есть еще метод SetPPMode() - который непонятно что делает, я его ни разу не применял - попробуй, вдруг это и есть метод переноса .
Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
1. Вы сейчас в интернете
2. Вы на сайте stalker-portal
3. Вы читаете
5. Вы не заметили, что отсутствует пункт 4
6. Вы это проверили
7. Вы улыбаетесь
8. Поставь себе в подпись и нас будет больше
Есть ли возможность использовать предмет через скрипт?
Под "использованием" подразумевается, когда игрок подходит, например, к выключателю и нажимает клавишу F (или другую, в зависимости от настроек), и выключатель переключается. При этом в логике выключателя можно прописать on_use и какое-то действие, и оно сработает. А вот можно ли написать функцию, которая бы имитировала вот это нажатие F (не само нажатие, а именно то действие, которое происходит, когда ГГ нажимает на F, наведя прицел на объект)? Причём, необязательно выключатель, любой физический объект, будь то дверь, машина, ящик, тайник и тп. То есть что-то наподобие этого:
...
local obj = level_object_by_sid(numInt)
db.actor:use(obj)
...
Максим Р.
Что-то ты или заумно или наоборот куце поставил задачу ....
Если тебя интересует именно иммитатор некоего действия типа 'нажатие/использование', то без определения критериев 'а что же считается нажатием' - никакого иммитатора не получишь.
Пример (из практики): Для машин есть возможность задействовать 'нажатие' и сажать актора в автомобиль. Для вертолетов такого нет. Мне потребовалось условно говоря симмитировать процесс посадки (использовать объект через скрипт). Критерием послужило: актор находится около объекта не далее чем Х метров.
Строго говоря, это не иммитатор, т.к. и находясь около машины игрок не обязательно нажимает <F>, что и является 'нажатием'.
Поясни несколько подробнее, что же ты подразумеваешь под 'использовать объект через скрипт', т.к. в любом случае использование идет через скрипт, и что за критерии для 'пора использовать'.
Все знают что НПС могут в репу съезить. А как сделать такойже удар после которого нпс нестановился врагом а просто падал как раненый на секунды и потом вставал и разумеется чтоб жизи тратились (у НПС конечно) ну может после третьего удара он бы и делался врагом. Лучше конечно вместа ножа или типа смены вида потронов (нож/кулак)
Здравствуйте. Возникла проблема, делаю схему поведения "шмон", суть в том что живые НПС будут обыскивать мертвых. Но столкнулся с проблемой - при включении схемы НПС тупо стоят на своих местах и не обыскивают трупы, но расходяться на прежние места, то естьВолк идет на свое место где он обычно стоит но не разворачиваеться, другие НПС идут к костру, но не садяться, а стоя рассказывают истории, а партульные тупо остановились по среди своего пути ... Вэтой схеме они должны просто подходить к трупу и стоять возле него но увы ... Что не так не могу сообразить, вот как подулючил:
"xr_shmon.script"
class "evaluator_object_for_shmon" (property_evaluator)
function evaluator_object_for_shmon:__init(name, storage) super (nil, name)
self.st = storage
end
function evaluator_object_for_shmon:evaluate()
--fdb.how_table_in_table(tab_id_shmon)
self.position = self.object:position()
if timer == nil then
timer = time_global() + time_run
else last = timer - time_global()
end
if last == nil then
last = timer - time_global()
end
if last <= 0 then
timer = nil last = nil
local npc
for k=1, 65534 do
npc = level.object_by_id(k)
if npc and not npc:alive() and is_is_tab_id_shmon(k) and is_bad_id(k) and self.position:distance_to(npc:position()) < dist then
tab_id_shmon[self.object:name()] = {}
table.insert(tab_id_shmon[self.object:name()],k)
fdb.logS(">>npc:id() = "..k)
end
end
end
--fdb.logS("flush")
return is_chtonit(self.object)
end
class "action_go_to_shmon" (action_base)
function action_go_to_shmon:__init(obj, storage) super (nil, obj)
self.st = storage
end
function action_go_to_shmon:initialize()
action_base.initialize(self)
fdb.how_table_in_table(tab_id_shmon)
fdb.logS("flush")
self.obj.lv = self.object:level_vertex_id()
self.obj_item = level.object_by_id(tab_id_shmon[self.object:name()])
self.obj_item.lv = self.obj_item:level_vertex_id()
self.obj:set_dest_level_vertex_id(self.obj_item.lv)
end
function action_go_to_shmon:execute()
action_base.execute(self)
fdb.logS("function action_go_to_shmon:execute()")
if self.obj_item.lv ~= self.obj:level_vertex_id() then
self.obj_item.lv = self.obj_item:level_vertex_id()
self.obj:set_dest_level_vertex_id(self.obj_item.lv)
end
end
function action_go_to_shmon:finalize()
action_base.finalize (self)
end
function add_to_binder(npc,ini,scheme,section,st)
local manager = npc:motivation_action_manager()
manager:add_evaluator(property_object_for_shmon, evaluator_object_for_shmon("evaluator_object_for_shmon",st))
fdb.logS("flush")
local action = action_go_to_shmon(npc, st)
action:add_precondition (world_property(stalker_ids.property_alive, true))
action:add_precondition (world_property(stalker_ids.property_danger,false))
action:add_precondition (world_property(stalker_ids.property_enemy, false))
action:add_precondition (world_property(stalker_ids.property_anomaly,false))
action:add_precondition (world_property(property_object_for_shmon), true)
xr_motivator.addCommonPrecondition(action)
action:add_effect (property_object_for_shmon, false)
manager:add_action (property_obj_item, action)
end
---------------
function set_scheme(npc,ini,scheme,section)
local st = xr_logic.assign_storage_and_bind(npc, ini, scheme, section)
st.enabled=true
end
function disable_scheme(npc,scheme)
local st = db.storage[npc:id()][scheme]
if st then
st.enabled = false
end
end
---------------
function is_is_tab_id_shmon(id)
local count = 0
local bool = true
for k,v in pairs(tab_id_shmon) do
for q=1,#v do
if v[q] == id then
count = count + 1
end
end
end
if count == 0 then
bool = true
else bool = false
end
return bool
end
function is_bad_id(id)
local bool = true
for k=1, #bad_id do
if bad_id[k] == id then
bool = false
break
end
end
return bool
end
function is_chtonit(npc)
local name = npc:name()
local bool = false
if tab_id_shmon[name] and #tab_id_shmon[name] > 0 and tab_id_shmon[name][1] ~= nil then
bool = true
end
return bool
end
function motivator_binder:net_spawn(sobject)
printf("motivator_binder:net_spawn(): self.object:name()='%s'", self.object:name())
--memusage.collect_info(self.object, "netspawn_start")
if not object_binder.net_spawn(self, sobject) then
return false
end
-- if self.object:spawn_ini():section_exist("dont_spawn_online") then
-- printf("!!!OFFLINE")
-- alife():object(self.object:id()).dont_spawn_online = true
-- end
db.add_obj(self.object)
-- Все CALLBACK-и ставить здесь:
local manager = self.object:motivation_action_manager()
manager:add_evaluator(xr_shmon.property_object_for_shmon, property_evaluator_const(false))
...
function addCommonPrecondition(action)
action:add_precondition (world_property(xr_shmon.property_object_for_shmon,false))
--action:add_precondition (world_property(xr_evaluators_id.reaction,false))
action:add_precondition (world_property(xr_evaluators_id.stohe_meet_base + 1,false))
action:add_precondition (world_property(xr_evaluators_id.sidor_wounded_base + 0, false))
action:add_precondition (world_property(xr_evaluators_id.chugai_heli_hunter_base, false))
action:add_precondition (world_property(xr_evaluators_id.abuse_base, false))
end
"xr_logic.script"
Код:
function disable_generic_schemes(npc, stype)
if stype == modules.stype_stalker then
xr_combat.disable_scheme(npc, "combat")
xr_use.disable_scheme(npc, "use")
xr_hit.disable_scheme(npc, "hit")
xr_meet.disable_scheme(npc, "actor_dialogs")
xr_heli_hunter.disable_scheme(npc, "heli_hunter")
xr_combat_ignore.disable_scheme(npc, "combat_ignore")
xr_shmon.disable_scheme(npc,"shmon")
elseif stype == modules.stype_mobile then
mob_combat.disable_scheme(npc, "mob_combat")
mob_trade.disable_scheme(npc, "mob_trade")
elseif stype == modules.stype_item then
ph_on_hit.disable_scheme(npc, "ph_on_hit")
elseif stype == modules.stype_heli then
xr_hit.disable_scheme(npc, "hit")
end
end
...
function enable_generic_schemes(ini, npc, stype, section)
if stype == modules.stype_stalker then
...
local heli_hunter_section = utils.cfg_get_string(ini, section, "heli_hunter", npc, false, "")
xr_heli_hunter.set_scheme(npc, ini, "heli_hunter", heli_hunter_section)
for k, v in pairs(t) do
if v==string then
alife():release(alife():object(obj:id()), true)
get_console():execute(k)
end
end
Как мне сделать проверку, если string не соответствует ни одно значение v. Например, если писать так: if v~=string then, то это будет проверка только для текущего значения v.
Я вытаскиваю из таблицы tQuestions рандомный элемент, которые не записан в таблицу tUsedQuestions и записываю его в таблицу tUsedQuestions:
local SelectQuestion = math.random(#tQuestions)
Код:
if #tUsedQuestions > 0 then
for k, v in pairs(tUsedQuestions) do
while v == SelectQuestion do
SelectQuestion = math.random(#tQuestions)
end
end
end
Но вытащить я хочу только тот елемент, которого нет в таблице tUsedQuestions. Но моя проверка v == SelectQuestion не срабатывает и получается, что вытащенный один раз предмет можно повторно вытащить еще раз.
for k, v in pairs(t) do
if is_is(string) then
alife():release(alife():object(obj:id()), true)
get_console():execute(k)
end
end
--// если хоть одно занчение из таблицы будет равно string функция вернет false и условие не выполниться
function is_is(num)
local bool = true
for k,v in paits(t) do
if num == v then
bool = false
break
end
end
return bool
end
Цитата1. Для чего создавать новые секции предметов, писать доп.логику и пр. извраты (тем более не без ошибок), когда все можно сделать 'подручными' средствами уже имеющимися в игре и не более сложными (точнее простыми), чем предлагаемые?
Все твои потуги от того, что тебе 'захотелось почесать нечто' и ты, НЕ раздумывая, изобретаешь свой способ почесать ...
А если просто подумать и составить прежде чем 'чесать' простенький алгоритм
?
мое
Подходим к предмету который лежит в Баре около некоторого перса у предмета
соответствующая логика
при попытке взять сьесть
отсутствие инфо поршня = удар в рожу
присутствие инфо поршня = сьел выпил взял
отсутствие непися на данной работе = сьел выпил взял
ваще
и при условии совпадения секции + нахождения ГГ именно в Баре (рестриктор) + отсутствия факта покупки (нет окна торговли) + наличие рядом непися => обрабатываем событие, вызываю нужный набор функций.
вы считаете проще ?
Цитатаа) обрабатывается объект/предмет, который лежит в Баре около некоторого перса.
СтОит ли залезать в алл.спавн и вводить секции/логики/...?
Достаточно использовать коллбэк на взятие актором предмета, обработать секцию/имя(!) взятого предмета и при условии совпадения секции + нахождения ГГ именно в Баре (рестриктор) + отсутствия факта покупки (нет окна торговли) + наличие рядом непися => обрабатываем событие, вызываю нужный набор функций.
б) Не хочется чтобы любая буханка была запретной? Чтобы можно было выбросить и подбрать 'свою' без шанса получить в лоб и лишиться денег? Нет проблем. Уникальные имена уже данные предметам в алл.спавне (типа bar_conserva/bar_bread_0000) или присвоение story_id (что явно излишне, но проще создания новых секций и логик) - решают эту пожелалку. Остается только проверять взятое ГГ на соответствие этим именам/стори_идам.
Цитата2. Прописав в логике: on_use = %=act_punch%, стОит помнить про аргументы, с которыми логика вызывает прописанную функцию. И если 'новые' знания не затуманили старые, то строка if db.actor:position():distance_to_sqr(npc:position()) > 4 then никогда не вернет true, т.к. 'npc' и 'db.actor' - одно и то же, и никак не будет далее 2-х метров от самого себя.
Так что тут без сканирования локации и проверки дистанции именно до неписей не обойтись. Тем более это и пригодится для более логичной обработки события - ГГ получает удар и теряет деньги, а вот кто врезал и кому ушли деньги - не ясно! Вот и пригодится ближайший перс и для анимации нанесения удара и для трансфера денег ...
Цитатаб) Не хочется чтобы любая буханка была запретной? Чтобы можно было выбросить и подбрать 'свою' без шанса получить в лоб и лишиться денег?
а ОНА и так не запретна толька та у которой соответствующая логика
Так что тут без сканирования локации и проверки дистанции именно до неписей не обойтись. Тем более это и пригодится для более логичной обработки события - ГГ получает удар и теряет деньги, а вот кто врезал и кому ушли деньги - не ясно! Вот и пригодится ближайший перс и для анимации нанесения удара и для трансфера денег
мое
Подходим к предмету который лежит в Баре около некоторого перса у предмета
соответствующая логика
при попытке взять сьесть
отсутствие инфо поршня = удар в рожу потерял деньги нпс находящийся на данной работе получил
присутствие инфо поршня = сьел выпил взял
отсутствие непися на данной работе = сьел выпил взял
С уважением .
Да и совсем забыл вам веть еще рестрикторы потребуються.
ЗЫ. Я Не пытаюсь оспорить ваш авторитет и знания
просто привык отстаивать свою точку зрения
если я не прав всегда это признаю
ну и приведите если не сложно пример для чистой игры 1.0004
хотя не настаиваю можно просто описание функций.
Сообщение было успешно отредактировано AAAAKKK (04-03-2011 15:49 GMT3 часа, назад) Зацикленный лагерь в журнале.
SkyLoader я уже и амк посмотрел, и статью на вики всю уже раз на 7 прочитал, и схемы ПЫСов разбираю (камп, комбат), и вот вроде бы все так как надо, так как другие схемы активированы, но вот этот косяк не дает мне покоя ...
Эта тема закрыта, публикация новых сообщений недоступна.
Продолжая пользоваться сайтом, вы соглашаетесь с использованием файлов cookie. Страницы сайта могут содержать информацию, запрещенную для просмотра посетителям младше 18 лет. Авторское право на серию игр «S.T.A.L.K.E.R» и используемые в ней материалы принадлежит GSC Game World.