Svoboда 3 Опубликовано 23 Апреля 2009 Поделиться Опубликовано 23 Апреля 2009 Тема для обсуждения скриптов всего и всех в серии игр STALKER. Задавая вопрос (!): 1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего; 2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме); 3. Изучите информацию которая может вам помочь: Stalkerin. Там есть много хороших статей касательно данной темы.Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения. Справочное руководство по языку Lua 5.1https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ruСправочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены. Логика со вступлением и четырьмя частями: ВступлениеЧасть перваяЧасть втораяЧасть третьяЧасть четвертая. Smart_terrain (в простонароде - гулаг)Интересный способ настроики логики для гулаговСкриптовая часть игровой логики 4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос; 5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе; 6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода; 7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины. 8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ. 9. И помните: «Правильно заданный вопрос – половина ответа». Какие вопросы следует задавать, а какие нет... Задавайте вопросы, которые касаются непосредственно скриптов и их работы, т.е. Вы что-то делаете, а у Вас что-то не получается, при этом у Вас на руках должен быть хотя бы какой-то код, свидетельствующий о Вашей причастности к вопросу. Вопросы которые будут удалятся, следовательно их задавать не нужно:-- Где находится та или иная функция? Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;-- Как сделать что-то/то-то? С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов? В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос. И последнее: очень рекомендовано к прочтению Правила форума 1 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/
Artos 99 Опубликовано 4 Марта 2012 Поделиться Опубликовано 4 Марта 2012 (изменено) _Призрак_, а стОит ли называть более элегантным, если это вообще решение ли(?) того, чего хочет получить AndreySol (но нам пока не известно)? Что дает в данном случае x-Ray Extensions? Всего лишь доступ к некоей цифирьке, которая говорит о некоем весе инфентаря, который каким-то только ему ведомым способом подсчитал движек. Попробуй сам проверить достоверность этой цифры ... Так что кроме простоты получения некоей близкой к истинной цифре - этот вариант более ничего не дает. И, если бы посмотрел коды, то видно, что именно на попытке подсчитать с точностью веса одного патрона(!) в неполной пачке и имеет проблемы AndreySol. Если еще сюда отнести вес патронов в стволах, вес надетых аддонов на оружие, вес подствольных зарядов в подствольниках и т.п. - то задачка то не решается твоим "элегантным" вариантом ... ;-) Добавлено через 6 мин.: *Shoker*, зачем задавать вопрос, на который опять только погадалки можно дать и общие рекомендации по поиску кривого кода? Уж если не в терпеж 'помусорить' - делай это в топике по CS. Изменено 4 Марта 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/198/#findComment-679327
AndreySol 215 Опубликовано 4 Марта 2012 Поделиться Опубликовано 4 Марта 2012 Ну забыл указать, что работаю с ТЧ v1.0005. в подобном чтении, которое применяешь именно ты ... это самое чтение я взял из примера "Перепаковщик патронов для SoC" с STALKER Inside Wiki. И в точно таком-же виде оно присутствует в скрипте vergas_lib.script в NLC 6. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/198/#findComment-679331
Artos 99 Опубликовано 4 Марта 2012 Поделиться Опубликовано 4 Марта 2012 (изменено) AndreySol Опять повторю: а своя голова для чего? Перепаковщик патронов - срабатывает именно по тэйк, т.е. на взятие предмета или на открытие ящика ... и НЕ нагружает игру. По vergas_lib.script в NLC 6 - лучше бы не поминал, более "кривого и грязного" исполнения кодов (IMHO) редко в серьезных модах можно встретить, и также, никак не предназначен для работы в каждом апдейте актора! И, видно ты не читаешь тексты ответов, ведь ясно сказал, что на ТЧ твой код работает, ну а то, что у тебя рушится - ищи в своей реализации. Изменено 4 Марта 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/198/#findComment-679334
Zander_driver 10 348 Опубликовано 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. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/198/#findComment-679392
Viнt@rь 50 Опубликовано 5 Марта 2012 Поделиться Опубликовано 5 Марта 2012 (изменено) Так как раньше тема называлась "скриптирование, спавн и логика" и более подходящей темы для моего вопроса нет, то я задам его сдесь. Мб кто знает почему на движке ЗП вертолет, после пролета по паре точек, начинает лететь криво, тоесть: вот он спавнится, летит нормально мордой вниз хвост вверх, но при пролете через пару точек он начинает менять свое положение противоположно - морда вверх и хвост вниз, и потом летит так постоянно? Что пробывал: 1) делал точки как в ТЧ 2) все скрипты/конфиги были взяты из ТЧ и переделаны/адаптированы под ЗП Результат: все тоже самое Изменено 5 Марта 2012 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/198/#findComment-679508
*Shoker* 322 Опубликовано 5 Марта 2012 Поделиться Опубликовано 5 Марта 2012 (изменено) Возможно проблема с точкой point_look. Тоесть с точкой, куда смотрит вертолёт. Как вариант она у тебя где то в небесах заспавнена или типа того. Ну или ещё вариант, перемудрил со скоростью вертолёта. Не знаю где это регулируется в логике, но я когда управлял вертолётом напрямую через скрипт, при очень большой скорости он у меня чуть ли не вертикально летел (правда носом к низу, а не к верх) Изменено 5 Марта 2012 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/198/#findComment-679538
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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/198/#findComment-679574
Viнt@rь 50 Опубликовано 5 Марта 2012 Поделиться Опубликовано 5 Марта 2012 *Shoker*, т. point_look у вертолета используется только тогда, когда он стоит на месте. Ну или ещё вариант, перемудрил со скоростью вертолёта. проверил, не в скорости дело( GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/198/#findComment-679686
Artos 99 Опубликовано 5 Марта 2012 Поделиться Опубликовано 5 Марта 2012 (изменено) Viнt@rь, твои слова о point_look противоречат ранее тобою сказанному: "делал точки как в ТЧ". Вертолет или летит по точкам подчиняясь схеме, а значит и point_look(!), т.к. это и есть "задание" положения в пространстве, или дергается скриптом - тогда можно хоть хвостом вперед заставить лететь ... Т.о. или твои точки перенесенные из ТЧ в ЗП некорректны (смотри вертексы) или у тебя летает не по точкам, а управление скриптом где-то сбоИт. И без конкретных кодов (скрипты, точки и вертексы на локациях) - бесполезно гадать почему у тебя в какие-то моменты вертушка нос задирает иль иное. Что мешает тебе в восстановленные скрипты вставить в нужные места вывод в лог и посмотреть когда и почему разворачивается твоя вертушка? Изменено 5 Марта 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/198/#findComment-679691
*Shoker* 322 Опубликовано 6 Марта 2012 Поделиться Опубликовано 6 Марта 2012 Viнt@rь point_look как раз таки и во время полёта используется, другое дело что будет с вертолётом, если его не указать. Скорее всего будет на точку пути смотреть, но сам не проверял. Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/198/#findComment-679737
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()" ???? Если второй вариант, то получается вылет может быть, потому что НПС каким то чудом исчез, ушел в оффлан или? Вобщем я запутался и не знаю что делать, кто поможет? Только без пафоса пожалуйста. Что-то кончается, что-то начинается... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/198/#findComment-680909
_Призрак_ 11 Опубликовано 9 Марта 2012 Поделиться Опубликовано 9 Марта 2012 Видимо проблема в том что почему то Sender - не сталкер. Поэтому я бы тебе посоветовал вставить эту строку перед получением character_name: get_console():execute("news:name="..Sender:name()) И я готов поспорить что имя будет принадлежать не сталкеру Freedom Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/198/#findComment-680910
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 Что-то кончается, что-то начинается... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/198/#findComment-680911
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 "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/198/#findComment-680923
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 часов)? Идея использования инфопоршней такая: создаём четыре таких условия - на утро, день, вечер, ночь. Каждому сталкеру прописано, что делать и где быть в это время. Только представьте себе, какая чудная и разообразная симуляция жизни могла бы появиться на основе этого! Простые сталкеры к примеру, утром выходят из смартов гулять, вечером возвращаются и торчат в лагерях. Бандиты день сидят на своей базе, а к вечеру подтягиваются к проходным, узким местам - в засаду. Мутанты выходят на охоту ночью) А ведь есть ещё группировки, ранги, группы сталкеров, уникальные персонажи. Всем им можно было бы сделать уникальный распорядок дня. Это породило бы огромное количество нештатных, случайных ситуаций и стычек, оживило бы игру, создало полноценный а-лайв моей мечты... Помогите мне пожалуйста) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/198/#findComment-680979
Artos 99 Опубликовано 10 Марта 2012 Поделиться Опубликовано 10 Марта 2012 Dostoevsky92, не гоже конечно давать "по рукам" тому, кто увлечен чем-то, но ... разочарую тебя. Если воспользуешься ссылками из шапки (по той же логике и гулагам), то сможешь открыть для себя еще много америк и наизобретать велосипедов. И скорее всего не понадобятся никакие подсказки о которой ты просишь, т.к. и способов управления работами и гулагами достаточно много (в том числе и по времени суток) и они гораздо разнообразнее и эффективнее. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/198/#findComment-681000
Dostoevsky92 0 Опубликовано 10 Марта 2012 Поделиться Опубликовано 10 Марта 2012 Я частый гость и на инсайде, и здесь. Дело в том, что если в спавне и конфигах я ещё что-то понимаю, то в скриптинге я полный ноль... Да и неохота мне его изучать из-за такой ерунды, как создание четырёх однородных условий. Насчёт других способов управления - да, есть, но они позволяют сделать различные состояния внутри гулага, создать скриптовые сценки, назначать анимации и работы. Они достаточно сложны для меня, могут породить многочисленные вылеты и баги. Я же хочу сделать вменяемую песочницу, симуляцию жизни вне их. Способ, предложенный мной видится мне рациональным, простым, достаточно гибким а главное - надёжным. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/198/#findComment-681015
Artos 99 Опубликовано 10 Марта 2012 Поделиться Опубликовано 10 Марта 2012 (изменено) Dostoevsky92: в скриптинге я полный ноль... Да и неохота мне его изучать из-за такой ерунды Странно такое читать в топике именно по скриптам да еще и в купе с обоснованием "предложенного тобою способа" ... Извини, но этот спососб "предложили" нам всем разработчики игры и мы все давно им (и не только им) пользуемся и в игре и в модах. Ну а то, что ты считаешь, что кирпичом удобнее заколачивать гвоздь, чем молотком - возможно ты прав, не буду спорить/отговаривать. ;-) Dostoevsky92: Способ, предложенный мной видится мне рациональным, простым, достаточно гибким а главное - надёжным. - когда первокласник решает задачку на пальцах иль палочками - это и удобно ему и надежно. - второклассник начинает применять арифметику и даже таблицу умножения знает - сложнее, но быстрее и надежнее. - далее школьники уже и математику начинают применять - и скорость и гибкость решений нарастает. - студенты вообще замахиваются на интегральное исчисление и считают это и рациональным и надежным ... Кто из них прав?! Нет смысла далее вести разговор на эту тему. Каждому свое, как говорится. Но ... не стОит в топике задавать простейшие вопросы на которые давным давно даны не раз ответы и предлагать различные фантазии, которые давным давно реализованы. На этом: взгляни в xr_conditions.script на функцию is_day и используй ее в своем "новом" способе управления гулагами. :-) Изменено 11 Марта 2012 пользователем ColR_iT "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/198/#findComment-681031
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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/198/#findComment-681056
Artos 99 Опубликовано 10 Марта 2012 Поделиться Опубликовано 10 Марта 2012 (изменено) AndreySol, большая просьба, не устраивать в топике что-то навроде "советы плохо разбирающихся в скриптах тем, кто совсем не разбирается". Все же тему читают и те, кто не отличит кривого кода от нормального и или потеряет сам время или будет засорять в дальнейшем форумы жалобами "вот мне посоветовали, а теперь ...". По вопросу: Отследить окончание "вброса" в инвентарь актору всего и вся "корявым" методом конечно можно, но как говорится овчинка выделки не стОит. Не удивлюсь, что тобою бы и метод итерации по рюкзаку на каждом апдейте актрора был бы воспринят, если бы было что проверять ... ;-) Если же не критичны милисекунды, то обычно пользуются этим: if device().precache_frame <= 1 then ... - чтобы с достаточной приближенностью предположить окончание загрузки объектов в игру/в онлайн. Аналог этой проверки имеется в xr_conditions.script - см. фукцию black_screen, так что и из штатной логики можно проверять. Изменено 10 Марта 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/198/#findComment-681158
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти