Artos 99 Опубликовано 4 Марта 2012 Поделиться Опубликовано 4 Марта 2012 (изменено) _Призрак_, а стОит ли называть более элегантным, если это вообще решение ли(?) того, чего хочет получить AndreySol (но нам пока не известно)? Что дает в данном случае x-Ray Extensions? Всего лишь доступ к некоей цифирьке, которая говорит о некоем весе инфентаря, который каким-то только ему ведомым способом подсчитал движек. Попробуй сам проверить достоверность этой цифры ... Так что кроме простоты получения некоей близкой к истинной цифре - этот вариант более ничего не дает. И, если бы посмотрел коды, то видно, что именно на попытке подсчитать с точностью веса одного патрона(!) в неполной пачке и имеет проблемы AndreySol. Если еще сюда отнести вес патронов в стволах, вес надетых аддонов на оружие, вес подствольных зарядов в подствольниках и т.п. - то задачка то не решается твоим "элегантным" вариантом ... ;-) Добавлено через 6 мин.: *Shoker*, зачем задавать вопрос, на который опять только погадалки можно дать и общие рекомендации по поиску кривого кода? Уж если не в терпеж 'помусорить' - делай это в топике по CS. Изменено 4 Марта 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
AndreySol 215 Опубликовано 4 Марта 2012 Поделиться Опубликовано 4 Марта 2012 Ну забыл указать, что работаю с ТЧ v1.0005. в подобном чтении, которое применяешь именно ты ... это самое чтение я взял из примера "Перепаковщик патронов для SoC" с STALKER Inside Wiki. И в точно таком-же виде оно присутствует в скрипте vergas_lib.script в NLC 6. Ссылка на комментарий
Artos 99 Опубликовано 4 Марта 2012 Поделиться Опубликовано 4 Марта 2012 (изменено) AndreySol Опять повторю: а своя голова для чего? Перепаковщик патронов - срабатывает именно по тэйк, т.е. на взятие предмета или на открытие ящика ... и НЕ нагружает игру. По vergas_lib.script в NLC 6 - лучше бы не поминал, более "кривого и грязного" исполнения кодов (IMHO) редко в серьезных модах можно встретить, и также, никак не предназначен для работы в каждом апдейте актора! И, видно ты не читаешь тексты ответов, ведь ясно сказал, что на ТЧ твой код работает, ну а то, что у тебя рушится - ищи в своей реализации. Изменено 4 Марта 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Zander_driver 10 334 Опубликовано 5 Марта 2012 Поделиться Опубликовано 5 Марта 2012 AndreySol Перефразируя вышесказанное, я бы дал такой совет: СтОит почаще задумываться над тем, как вашему компьютеру приходится ПАХАТЬ порой, для выполнения вами написанного кода. И озадачиваться вопросом - а нужно ли так нагружать машину для достижения того, что вам надобно? И утверждения вида "вот там и вон там сделали вот так! значит это истина!" приводят в ужас. На заборе тоже всегда только истину пишут? Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Viнt@rь 50 Опубликовано 5 Марта 2012 Поделиться Опубликовано 5 Марта 2012 (изменено) Так как раньше тема называлась "скриптирование, спавн и логика" и более подходящей темы для моего вопроса нет, то я задам его сдесь. Мб кто знает почему на движке ЗП вертолет, после пролета по паре точек, начинает лететь криво, тоесть: вот он спавнится, летит нормально мордой вниз хвост вверх, но при пролете через пару точек он начинает менять свое положение противоположно - морда вверх и хвост вниз, и потом летит так постоянно? Что пробывал: 1) делал точки как в ТЧ 2) все скрипты/конфиги были взяты из ТЧ и переделаны/адаптированы под ЗП Результат: все тоже самое Изменено 5 Марта 2012 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий
*Shoker* 322 Опубликовано 5 Марта 2012 Поделиться Опубликовано 5 Марта 2012 (изменено) Возможно проблема с точкой point_look. Тоесть с точкой, куда смотрит вертолёт. Как вариант она у тебя где то в небесах заспавнена или типа того. Ну или ещё вариант, перемудрил со скоростью вертолёта. Не знаю где это регулируется в логике, но я когда управлял вертолётом напрямую через скрипт, при очень большой скорости он у меня чуть ли не вертикально летел (правда носом к низу, а не к верх) Изменено 5 Марта 2012 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Salohmir 0 Опубликовано 5 Марта 2012 Поделиться Опубликовано 5 Марта 2012 (изменено) Уважаемый модератор, следуя вашему совету (но не помня предыдущее сообщение), пытаюсь повторить свой номер с вопросом. Понимая всю свою тупость, но не имея времени на быстрое её преодоление, полагаюсь на вашу волю и терпение. Вопрос: возможно ли применить способ действия аптечки из мода Л.У.Р.К. (ТЧ) в моде Народная солянка (ТЧ). Изменения скриптов я делал на основе вот этого: Для начала создадим скрипт. Например health_effect.scripts: ---Система еды и постепенного лечения из Лурк мода--- objectinuse=0 objectused=0 --If/then statements for finding the item. function start(obj) snd = xr_sound.get_safe_sound_object([[$no_sound]]) if (db.actor~=nil) and (obj~=nil) then slotinuse=db.actor:active_slot() slot_div=1 if obj:section() == "medkit" or obj:section() == "medkit_army" or obj:section() == "medkit_scientic" then snd= xr_sound.get_safe_sound_object([[interface\inv_medkit]]) holster_time=time_global()+7000 if (objectinuse==1) then holster_time=holster_time+7000 end soundhub() elseif obj:section() == "antirad" then snd= xr_sound.get_safe_sound_object([[interface\inv_pills]]) holster_time=time_global()+6000 if (objectinuse==1) then holster_time=holster_time+6000 end soundhub() elseif obj:section() == "bandage" then snd= xr_sound.get_safe_sound_object([[interface\inv_bandage]]) holster_time=time_global()+6000 if (objectinuse==1) then holster_time=holster_time+6000 end soundhub() elseif obj:section() == "vodka" then snd= xr_sound.get_safe_sound_object([[interface\inv_vodka]]) holster_time=time_global()+4000 if (objectinuse==1) then holster_time=holster_time+4000 end soundhub() elseif obj:section() == "energy_drink" then snd= xr_sound.get_safe_sound_object([[interface\inv_softdrink]]) holster_time=time_global()+4000 if (objectinuse==1) then holster_time=holster_time+4000 end soundhub() elseif obj:section() == "bread" or obj:section() == "conserva" or obj:section() == "kolbasa" then snd= xr_sound.get_safe_sound_object([[interface\inv_food]]) holster_time=time_global()+7000 if (objectinuse==1) then holster_time=holster_time+7000 end soundhub() end end end --Other stuff executes from here. function soundhub() if db.actor:alive() then snd:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) snd = xr_sound.get_safe_sound_object([[$no_sound]]) if (objectinuse==0) then db.actor:hide_weapon() objectinuse=1 if slotinuse == 1 then slot_div = ((holster_time-time_global())/1.5) else slot_div = 0 end end objectused=objectused+1 weapontimer() end end --Holster time. Its set up as additive: A food and a drink taken together will apply instantly, but your gun is holstered for 9 seconds. function weapontimer() if (holster_time~=nil) and (time_global()>(holster_time-slot_div)) and level.present() then objectused=objectused-1 if (objectused==0) then db.actor:restore_weapon() objectinuse=0 holster_time=nil end end end --Message for time remaining and math.Round function. Not used. --[[ function message() news_manager.send_tip(db.actor, tostring(math.Round((holster_time - time_global())/1000)).."s", nil, nil, 1000) end --Math.round function math.Round(num) local floored = math.floor(num) if (num - floored) >= 0.5 then return math.ceil(num) else return floored end end ]]-- Стоит, кстати, учесть параметр snd = xr_sound.get_safe_sound_object([[interface\inv_food]]) Отвечает за воспроизводимый звук. Так что если его нет, поймаете вылет. Теперь создаёте скрипт abc_medkit.script: -- Shortened Creds: ABC Mod made this, LURK team just cleaned up the indentions. -- Should the use of the same medkit accumulate over the previous one? multiple_medkit = "yes" --Не пробовал ставить no. Но почти уверен что будет вылет -- How many minutes should take to complete the healing process. hp_fullhealth_time = 0.125 --Кол-во в течении которого будет юзаться аптечка --0.25 -- Health update time in MS. 1000 = 1 Second. hupd_time = 50 --Апдейт времени.Лучше не трогать -- Time modulation time_mod=0 -- HP Healed. No higher than 1. hp_med_kit = 0.65 --Параметр отвечающий за восстановление жизней одной аптечкой.Точнее за скорость восстановления hp_med_army = 0.75 hp_med_sci = 0.80 -- Is Army faster than Normal? army_fast = "yes" -- Is Science faster than Normal? sci_fast = "yes" -- Is Science faster than Army? sci_fast_than_army = "yes" -- Should medkit_scientic anti-radiation process be progressive? sci_antirad = "yes" -- EOF local med_kit, med_band, med_army, med_sci, medused, medid, medname local objdtc = 0 function chk_medlot_object(obj) if db.actor ~= nil then local objdt = time_global() if obj ~= nil and obj ~= "load" then medname = obj:section() if medname == "medkit" or medname == "medkit_army" or medname == "medkit_scientic" then if objdtc == 0 then objdtc = time_global() + 350 end med_used = "yes" med_id = obj:id() end end if med_used == "yes" and objdt > objdtc then objdtc = 0 med_used = "no" if level.object_by_id(med_id) == nil then if medname == "medkit" then med_kit = "yes" end if medname == "medkit_army" then med_army = "yes" end if medname == "medkit_scientic" then med_sci = "yes" end time_mod=0 end end new_medkit() end end local time_mkit, time_army, time_sci, count_mkit, count_army, count_sci function new_medkit() if db.actor ~= nil and level.present() then local cgametimemed = time_global() local hft = (hp_fullhealth_time * 60000) / hupd_time --normal if med_kit == "yes" then if time_mkit == nil then time_mkit = time_global() + hupd_time end if cgametimemed > time_mkit then time_mkit = time_global() + hupd_time local player_hp = db.actor.health if player_hp < 1 then if count_mkit == nil then count_mkit = 0 end if count_mkit < (hft + 1) then db.actor.health = (hp_med_kit/(hft + time_mod)) count_mkit = count_mkit + 1 --abort("TimeMod: "..time_mod) --abort("Health: "..hp_med_kit/(hft + time_mod)) time_mod = math.clamp(time_mod+0.23,0,35) else med_kit = nil time_mkit = nil count_mkit = nil end else med_kit = nil time_mkit = nil count_mkit = nil end end end --army if med_army == "yes" then if time_army == nil then time_army = time_global() + hupd_time end if cgametimemed > time_army then time_army = time_global() + hupd_time local player_hp = db.actor.health if player_hp < 1 then if count_army == nil then count_army = 0 end if count_army < (hft + 1) then local mamf = 0 if army_fast == "yes" then mamf = (hp_med_army/hft) / 4 end db.actor.health = (hp_med_army/hft) + mamf count_army = count_army + 1 time_mod = math.clamp(time_mod+0.23,0,35) else med_kit = nil time_mkit = nil count_mkit = nil end else med_kit = nil time_mkit = nil count_mkit = nil end end end --science if med_sci == "yes" then if time_sci == nil then time_sci = time_global() + hupd_time end if cgametimemed > time_sci then time_sci = time_global() + hupd_time local player_hp = db.actor.health if player_hp < 1 then if count_sci == nil then count_sci = 0 end if count_sci < (hft + 1) then local mamf = 0 local sfta = 4 if sci_fast_than_army == "yes" then sfta = 2 end if sci_fast == "yes" then mamf = (hp_med_army/hft) / sfta end db.actor.health = (hp_med_sci/hft) + mamf if sci_antirad == "yes" then db.actor.radiation = -(hp_med_sci/hft) end count_sci = count_sci + 1 time_mod = math.clamp(time_mod+0.23,0,35) else med_kit = nil time_mkit = nil count_mkit = nil end else med_kit = nil time_mkit = nil count_mkit = nil end end end end end function math.clamp (value,mini,maxi) local clamped = value if clamped < mini then clamped = mini end if clamped > maxi then clamped = maxi end return clamped end Теперь самое сложное. Лезем в bind_stalker.scripts. После self.object:set_callback(callback.on_item_drop, nil) Пишем self.object:set_callback(callback.use_object, nil) В итоге получается вот так: self.object:set_callback(callback.inventory_info, nil) self.object:set_callback(callback.article_info, nil) self.object:set_callback(callback.on_item_take, nil) self.object:set_callback(callback.on_item_drop, nil) self.object:set_callback(callback.use_object, nil) --self.object:set_callback(callback.actor_sleep, nil) self.object:set_callback(callback.task_state, nil) self.object:set_callback(callback.level_border_enter, nil) self.object:set_callback(callback.level_border_exit, nil) self.object:set_callback(callback.take_item_from_box, nil) После self.object:set_callback(callback.on_item_drop, self.on_item_drop, self) Пишем self.object:set_callback(callback.use_object, self.use_object, self) В итоге: self.object:set_callback(callback.inventory_info, self.info_callback, self) self.object:set_callback(callback.article_info, self.article_callback, self) self.object:set_callback(callback.on_item_take, self.on_item_take, self) self.object:set_callback(callback.on_item_drop, self.on_item_drop, self) self.object:set_callback(callback.use_object, self.use_object, self) self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats --self.object:set_callback(callback.actor_sleep, self.sleep_callback, self) self.object:set_callback(callback.task_state, self.task_callback, self) --self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self) self.object:set_callback(callback.level_border_enter, self.level_border_enter, self) self.object:set_callback(callback.level_border_exit, self.level_border_exit, self) self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self) Ищем функцию: function actor_binder:on_item_drop (obj) и после ее завершения пишем: ---------------------------------------------------------------------------------------------------------------------- function actor_binder:use_object(obj) heal_regen.start(obj) end ---------------------------------------------------------------------------------------------------------------------- В итоге: ---------------------------------------------------------------------------------------------------------------------- function actor_binder:on_item_drop (obj) level_tasks.proceed(self.object) --game_stats.update_drop_item (obj, self.object) abc_medkit.chk_medlot_object(obj) abc_sleep.uptabc(obj) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:use_object(obj) heal_regen.start(obj) end ---------------------------------------------------------------------------------------------------------------------- После --game_stats.update_drop_item (obj, self.object) Пишем abc_medkit.chk_medlot_object(obj ) После function actor_binder:update(delta) Пишем abc_medkit.chk_medlot_object() heal_regen.weapontimer() Затем надо найти звуки и прописать их в директории \sounds\interface\ Далее идем в файл config\misc\items.ltx, ищем секции аптечек ([medkit],[medkit_army],[medkit_scientic]) и меняем в них параметр eat_health на 0.0, иначе актер будет лечится дважды (сначала сразу, по стандартному, а потом уже постепенно) Автор статьи: Fireman3000, дополнил Darkscape, а так же спасибо Lurk моду и ABC. Получил вылет: Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\patch_1_0004\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:1485: attempt to index field 'actor' (a nil value) Я сделал где-то ошибку или такое исправление скрипта требует дополнительной адаптации? Заранее спасибо. 1. Для кодов ы своих сообщениях используем тэги [cоde], чтобы и отделять от текста и форматирование сохранять. 2. Вопрос или для топика "[soC] Ковыряемся в файлах" или для конкретно раздела по "Народной солянке". 3. Если в логе упомянута строка скрипта, вызвавшая ошибку - стОит и ее указывать, тем более коды не оригинальной игры. --/Artos Изменено 5 Марта 2012 пользователем Artos Ссылка на комментарий
Viнt@rь 50 Опубликовано 5 Марта 2012 Поделиться Опубликовано 5 Марта 2012 *Shoker*, т. point_look у вертолета используется только тогда, когда он стоит на месте. Ну или ещё вариант, перемудрил со скоростью вертолёта. проверил, не в скорости дело( GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий
Artos 99 Опубликовано 5 Марта 2012 Поделиться Опубликовано 5 Марта 2012 (изменено) Viнt@rь, твои слова о point_look противоречат ранее тобою сказанному: "делал точки как в ТЧ". Вертолет или летит по точкам подчиняясь схеме, а значит и point_look(!), т.к. это и есть "задание" положения в пространстве, или дергается скриптом - тогда можно хоть хвостом вперед заставить лететь ... Т.о. или твои точки перенесенные из ТЧ в ЗП некорректны (смотри вертексы) или у тебя летает не по точкам, а управление скриптом где-то сбоИт. И без конкретных кодов (скрипты, точки и вертексы на локациях) - бесполезно гадать почему у тебя в какие-то моменты вертушка нос задирает иль иное. Что мешает тебе в восстановленные скрипты вставить в нужные места вывод в лог и посмотреть когда и почему разворачивается твоя вертушка? Изменено 5 Марта 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
*Shoker* 322 Опубликовано 6 Марта 2012 Поделиться Опубликовано 6 Марта 2012 Viнt@rь point_look как раз таки и во время полёта используется, другое дело что будет с вертолётом, если его не указать. Скорее всего будет на точку пути смотреть, но сам не проверял. Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Vano_Santuri 33 Опубликовано 9 Марта 2012 Поделиться Опубликовано 9 Марта 2012 Маленький вопрос касательно метода :character_name() В каких случаях можно получить вылет вида attempt to concatenate local 'SndName' ? Имеется код, ищется нпс, который рядом и подходит по условиям: function GetStalkers(ThisObj,RadMin,RadMax,who) for k, v in pairs(db.storage) do local obj = level.object_by_id(k) if (obj) and (IsStalker(obj)) and (obj:alive()) and (obj:id() ~= who:id()) then local ComThisObj = ThisObj:character_community() local ComSender = obj:character_community() if CommunityChenalStatus(ComSender,1) then if (ComThisObj ~= ComSender) then --Данным методом ищем сталкера. if ValNpc(obj)~=true then --Отсекаем квестовых нпс local Pos = ThisObj:position() local Dist = Pos:distance_to(obj:position()) if (Dist < RadMax) and (Dist > RadMin) then table.insert(StkLevelTbl, obj) end end end end end end end function GiveStalker(ThisObj,RadMin,RadMax,who) GetStalkers(ThisObj,RadMin,RadMax,who) if next(StkLevelTbl) then local obj = StkLevelTbl[math.random(#StkLevelTbl)] return obj else return nil end end Затем идет проверка local Sender = GiveStalker(obj,SenderRadMin,SenderRadMax,obj) -- есть ли очевидец, кроме ГГ на этом расстоянии . Нужен нейтральный сталкер... if Sender then Приеняется метод local SndName = Sender:character_name() Но по непонятным причинам, иногда (отследить когда именно мне не удалось) появляется вылет вида: attempt to concatenate local 'SndName' (a nil value) Могу сказать что заглушка на nil -срабатывает, ноооо!!!! Почему проходит проверку local Sender = GiveStalker(obj,SenderRadMin,SenderRadMax,obj) -- есть ли очевидец, кроме ГГ на этом расстоянии . Нужен нейтральный сталкер... if Sender then И Sender==nil ???? --Для справки - потом все заносится в табличку ( в частности имя в виде Sender:character_name()) и через некоторое время выводится... Вопрос, в табличке значение в виде "Вася Жлоб" или в виде ссылки "Sender:character_name()" ???? Если второй вариант, то получается вылет может быть, потому что НПС каким то чудом исчез, ушел в оффлан или? Вобщем я запутался и не знаю что делать, кто поможет? Только без пафоса пожалуйста. Что-то кончается, что-то начинается... Ссылка на комментарий
_Призрак_ 11 Опубликовано 9 Марта 2012 Поделиться Опубликовано 9 Марта 2012 Видимо проблема в том что почему то Sender - не сталкер. Поэтому я бы тебе посоветовал вставить эту строку перед получением character_name: get_console():execute("news:name="..Sender:name()) И я готов поспорить что имя будет принадлежать не сталкеру Freedom Ссылка на комментарий
Vano_Santuri 33 Опубликовано 9 Марта 2012 Поделиться Опубликовано 9 Марта 2012 (изменено) _Призрак_, Ясно,спасибо. Тогда в чем подвох? if (obj) and (IsStalker(obj)) and (obj:alive()) and (obj:id() ~= who:id()) then Я же сделал проверку? Как она может игнорироваться? Наверное забыл указать самое важное, такое встречается ТОЛЬКО на SGM. В оригинальной игре такого не было... (никто не жаловался или все играли с SGM) Artos 1. Ну если в коде строка: table.insert(StkLevelTbl, obj) - то чего гадать "что в таблице"? Никакое там не имя и не ссылка на "Sender:character_name()", а собственно полученный при итерации клиентский объект. Спасибо!!! Это реально многое ставит на место, пошел переписывать код полностью. Изменено 10 Марта 2012 пользователем Vano_Santuri Что-то кончается, что-то начинается... Ссылка на комментарий
Artos 99 Опубликовано 9 Марта 2012 Поделиться Опубликовано 9 Марта 2012 (изменено) Vano_Santuri, не очень въехал в суть сумбурно заданного вопроса, но попробую дать пояснение: 1. Ну если в коде строка: table.insert(StkLevelTbl, obj) - то чего гадать "что в таблице"? Никакое там не имя и не ссылка на "Sender:character_name()", а собственно полученный при итерации клиентский объект. 2. Небезопасно пользоваться значениями из таблички не проверяя их серверные копии на валидность, т.е. на то, что объект в данный момент в игре! Как будто в игре сталкеры и не бессмерны и не исчезают в аномалиях и не уходят на др.локации и пр ... Строка local obj = StkLevelTbl[math.random(#StkLevelTbl)] - выбирает рандомный клиентский объект, но НЕ проверяет его на "устарелость", т.е. на валидность. Ну и конечно же уже строка: local SndName = Sender:character_name() - вполне может быть и не валидна и, если движек и не валится, то вполне может возвратить и nil. Т.о. чтобы не было ошибки вида attempt to concatenate local 'SndName' - всего то нужно или перед конкатенацией проверять составляющие строки или заведомо исключать для них nil-значения. Например так: local SndName = Sender:character_name() or "" Изменено 10 Марта 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Dostoevsky92 0 Опубликовано 10 Марта 2012 Поделиться Опубликовано 10 Марта 2012 Всем привет. Надеюсь, я по адресу. Такое дело: Когда создаёшь секцию спавна сталкера через алл.спавн, в ней есть вот такое интересное место: [smart_terrains] esc_lager = {-agroprom_military_case_have -esc_fanat_spawn} mil_lager = {+agroprom_military_case_have}, {+esc_fanat_spawn} END Вот это я нашёл у Волка. Насколько я понял, здесь прописано, что пока Меченый не заберёт у военных документы на агропроме, Волк принадлежит лагерю новичков. Как только кейс взят, Волк меняет прописку на ложбинку на армейских складах, что мы наглядно видим в игре. Частично я разобрался с понятием "инфопоршень" самостоятельно. Для теста мне удалось сделать так, чтобы Волк шёл на Склады, если у ГГ есть пистолет Макарова. Если нету - возвращается, довольно забавно)) Вот как это выглядит: -----------------------alife_mod-------------------- if not has_alife_info("morning") and actor:object("wpn_pm") ~= nil then actor:give_info_portion("morning") end if actor:object("wpn_pm")== nil then actor:disable_info_portion("morning") end ---------------------------------------------------- Но мне нужно не совсем это. Никто не может подсказать, как сделать так, чтобы скрипт срабатывал не на наличие предмета в инвентаре, а в течение определённого промежутка времени (скажем, с 6 до 12 часов)? Идея использования инфопоршней такая: создаём четыре таких условия - на утро, день, вечер, ночь. Каждому сталкеру прописано, что делать и где быть в это время. Только представьте себе, какая чудная и разообразная симуляция жизни могла бы появиться на основе этого! Простые сталкеры к примеру, утром выходят из смартов гулять, вечером возвращаются и торчат в лагерях. Бандиты день сидят на своей базе, а к вечеру подтягиваются к проходным, узким местам - в засаду. Мутанты выходят на охоту ночью) А ведь есть ещё группировки, ранги, группы сталкеров, уникальные персонажи. Всем им можно было бы сделать уникальный распорядок дня. Это породило бы огромное количество нештатных, случайных ситуаций и стычек, оживило бы игру, создало полноценный а-лайв моей мечты... Помогите мне пожалуйста) Ссылка на комментарий
Artos 99 Опубликовано 10 Марта 2012 Поделиться Опубликовано 10 Марта 2012 Dostoevsky92, не гоже конечно давать "по рукам" тому, кто увлечен чем-то, но ... разочарую тебя. Если воспользуешься ссылками из шапки (по той же логике и гулагам), то сможешь открыть для себя еще много америк и наизобретать велосипедов. И скорее всего не понадобятся никакие подсказки о которой ты просишь, т.к. и способов управления работами и гулагами достаточно много (в том числе и по времени суток) и они гораздо разнообразнее и эффективнее. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Dostoevsky92 0 Опубликовано 10 Марта 2012 Поделиться Опубликовано 10 Марта 2012 Я частый гость и на инсайде, и здесь. Дело в том, что если в спавне и конфигах я ещё что-то понимаю, то в скриптинге я полный ноль... Да и неохота мне его изучать из-за такой ерунды, как создание четырёх однородных условий. Насчёт других способов управления - да, есть, но они позволяют сделать различные состояния внутри гулага, создать скриптовые сценки, назначать анимации и работы. Они достаточно сложны для меня, могут породить многочисленные вылеты и баги. Я же хочу сделать вменяемую песочницу, симуляцию жизни вне их. Способ, предложенный мной видится мне рациональным, простым, достаточно гибким а главное - надёжным. Ссылка на комментарий
Artos 99 Опубликовано 10 Марта 2012 Поделиться Опубликовано 10 Марта 2012 (изменено) Dostoevsky92: в скриптинге я полный ноль... Да и неохота мне его изучать из-за такой ерунды Странно такое читать в топике именно по скриптам да еще и в купе с обоснованием "предложенного тобою способа" ... Извини, но этот спососб "предложили" нам всем разработчики игры и мы все давно им (и не только им) пользуемся и в игре и в модах. Ну а то, что ты считаешь, что кирпичом удобнее заколачивать гвоздь, чем молотком - возможно ты прав, не буду спорить/отговаривать. ;-) Dostoevsky92: Способ, предложенный мной видится мне рациональным, простым, достаточно гибким а главное - надёжным. - когда первокласник решает задачку на пальцах иль палочками - это и удобно ему и надежно. - второклассник начинает применять арифметику и даже таблицу умножения знает - сложнее, но быстрее и надежнее. - далее школьники уже и математику начинают применять - и скорость и гибкость решений нарастает. - студенты вообще замахиваются на интегральное исчисление и считают это и рациональным и надежным ... Кто из них прав?! Нет смысла далее вести разговор на эту тему. Каждому свое, как говорится. Но ... не стОит в топике задавать простейшие вопросы на которые давным давно даны не раз ответы и предлагать различные фантазии, которые давным давно реализованы. На этом: взгляни в xr_conditions.script на функцию is_day и используй ее в своем "новом" способе управления гулагами. :-) Изменено 11 Марта 2012 пользователем ColR_iT "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
AndreySol 215 Опубликовано 10 Марта 2012 Поделиться Опубликовано 10 Марта 2012 (изменено) Dostoevsky92 К примеру инфо-порция будет называться Is_morning. В function actor_binder:update(delta) из скрипта bind_stalker.script добавь вызов такого, к примеру, кода: local timer_trigger = nil -- объяви там, где будешь вызывать этот код. if not timer_trigger then timer_trigger = game.time() end if timer_trigger <= game.time() then timer_trigger = game.time() + 5000 local t = game.get_game_time() local y, m, d, h, min, sec, ms = t:get() if h >= 6 and < 12 then if not db.actor:has_info("Is_morning") then db.actor:give_info_portion("Is_morning") end end end смысл кода - вызывается по апдейтам актера, с дискретностью в 5 игровых секунд (определяется значением 5000). При вызове проверяет игровое время, при необходимом значении (h, часы == 6 утра) выдаем инфо-порцию. Ну а дальше Вы вроде в курсе. - выше, пример как НЕ стОит делать. --/ Artos Я бы даже сказал НЕ нужно делать. ColR_iT Добавлено через 8 мин.: И собственно мой вопрос - можно-ли, при загрузке сохранения, отловить момент когда актер уже существует и движок уже "вбросил" ему в инвентарь\слоты все необходимое барахло ? Т.е. после спавна этого барахла. Как вариант думаю на момент появления игрового худа, к этому моменту барахло уже должно быть на месте. Но как это отследить ? Изменено 11 Марта 2012 пользователем ColR_iT Ссылка на комментарий
Artos 99 Опубликовано 10 Марта 2012 Поделиться Опубликовано 10 Марта 2012 (изменено) AndreySol, большая просьба, не устраивать в топике что-то навроде "советы плохо разбирающихся в скриптах тем, кто совсем не разбирается". Все же тему читают и те, кто не отличит кривого кода от нормального и или потеряет сам время или будет засорять в дальнейшем форумы жалобами "вот мне посоветовали, а теперь ...". По вопросу: Отследить окончание "вброса" в инвентарь актору всего и вся "корявым" методом конечно можно, но как говорится овчинка выделки не стОит. Не удивлюсь, что тобою бы и метод итерации по рюкзаку на каждом апдейте актрора был бы воспринят, если бы было что проверять ... ;-) Если же не критичны милисекунды, то обычно пользуются этим: if device().precache_frame <= 1 then ... - чтобы с достаточной приближенностью предположить окончание загрузки объектов в игру/в онлайн. Аналог этой проверки имеется в xr_conditions.script - см. фукцию black_screen, так что и из штатной логики можно проверять. Изменено 10 Марта 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти