Карлан 1 049 Опубликовано 6 Сентября 2013 (изменено) @Девятки, ну я этот мод не ковырял, делал подобное сам, и следуя здравой логике, из этого скрипта(arc.script, они обычно бывают базовые) вызываются два коллбека в биндер монстров, а именно хит коллбек(когда мы в них стреляем, и ведем подсчет), и дез колбек(для, непосредственно, спавна). Т.о. найди два этих вызова и просто перенеси их в биндер монстров, и все, профит. , гляди http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4_NPC_%D0%B2_offline-online_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82 Изменено 6 Сентября 2013 пользователем Карлан Поделиться этим сообщением Ссылка на сообщение
Карлан 1 049 Опубликовано 6 Сентября 2013 (изменено) , тебе дана готовая конструкция, что еще надобно? Ясное дело она будет показывать ошибку, у тебя смекалки не хватило что-ли комментарий убрать? И, я не уверен, но вроде вместо switch_online(id) надо вызывать switch_offline_online(id), т.к. в ней проверяем нет ли объекта в онлайне и идентифицируем его айди. Но(!) в любом случае работать у тебя она не будет, т.к. тут не известна функция get_se_object(id) (разумеется очевидно, что она делает, но все же). Не знаю на счет других частей, но в ТЧ она точно не глобальная. Так что жди Шредера. P.S. Я в моддинге новичок, так что меня можно не слушать Изменено 6 Сентября 2013 пользователем Карлан Поделиться этим сообщением Ссылка на сообщение
Карлан 1 049 Опубликовано 16 Сентября 2013 (изменено) @Fear94, ну чего ленивый то какой? Ведь страницу назад это обсуждали, http://www.amk-team.ru/forum/index.php?showtopic=5525&p=794823 Изменено 16 Сентября 2013 пользователем Карлан Поделиться этим сообщением Ссылка на сообщение
Карлан 1 049 Опубликовано 10 Октября 2013 @proper70,в оригинале нельзя, поставь x-ray extensions, там сделали коллбек отслежки того, кто хитовал ГГ, дальше дело техники. Без него нормально сделать никак не выйдет. Т.к. даже что-бы отследить тип хита нужен хит коллбек, ну а если он будет, то проще по клсиду, ну или еще как - дело вкуса. Поделиться этим сообщением Ссылка на сообщение
Карлан 1 049 Опубликовано 13 Октября 2013 @Dniwe, что ты вкладываешь в понятие "динамические"? Формулируй вопрос яснее. Если тебе нужен диалог типа "Что интересного?", то тебе в dialog_manager.script, а если тебе нужна рандомная фраза, то нужно просто вызвать перед ветвлением функцию, которая рандомно выберет твои фразы, можешь поглядеть Megadeath Mod, там по моему это было. Продублирую свой вопрос из соседнего топика, там мне отвечать не хотят. Как получить стори айди собеседника?Так не выходит: function test(s1,s2) if s1:id() == (db.actor or db.actor:id()) then return s2:story_id() end return s1:story_id() --/> номер из game_story_ids end Пробовал и сразу вот так: function test(s1,s2) if s1:id() == (db.actor or db.actor:id()) then return alife():story_object(s2:story_id()) end return alife():story_object(s1:story_id()) --/> объект по sid end Поделиться этим сообщением Ссылка на сообщение
Карлан 1 049 Опубликовано 14 Октября 2013 @Artos, действительно, поправил, по прежнему никакого результата. ТЧ 1.0006 function sendtip(text) --/ текст return news_manager.send_tip(db.actor, text, 0, "default", 10000) end function test_sid(s1,s2) if s1:id() == db.actor:id() then sendtip("S2 sid~~: "..tostring(s2:story_id())) return s2:story_id() end return s1:story_id() --/> номер из game_story_ids sendtip("S1 sid~~: "..tostring(s1:story_id())) end ... <phrase id="13"> <text>carlan_mod_sidor_13</text> <action>my_mod.test_sid</action> </phrase> ... Поделиться этим сообщением Ссылка на сообщение
Карлан 1 049 Опубликовано 14 Октября 2013 Вопрос снят, все заработало. Можете удалить мои посты. Поделиться этим сообщением Ссылка на сообщение
Карлан 1 049 Опубликовано 14 Октября 2013 (изменено) @Artos, т.о. мы получаем именно непосредственно индентификатор(число)? И story_id() у нас возвращает число соответствующее строке из game_story_ids(типа "000" => 0). И для сидора функция возвращает нам 3(а не 003), а для бармена 500(как и в game_story_ids). Правильно-ли я все понял? Если правильно, тогда поясните на кой черт вообще сдался game_story_ids.ltx со story id(для квестов?)? И как тогда понимать ; Номер SID-а состоит из номера уровня + номер персонажа (2 цифры).? P.S. в том случае у меня как раз таки никакого результата не было. Изменено 14 Октября 2013 пользователем Карлан Поделиться этим сообщением Ссылка на сообщение
Карлан 1 049 Опубликовано 16 Октября 2013 (изменено) Возможно-ли как-то получить реальную текущую дату?(16.10.13) Через скрипты, разумеется. Изменено 16 Октября 2013 пользователем Карлан Поделиться этим сообщением Ссылка на сообщение
Карлан 1 049 Опубликовано 16 Октября 2013 (изменено) Спасибо, @Charsi. Вот наваял функцию получения номера билда по формуле GSC, без введения циферок ручками. Теперь функция полностью автономна. --// by Карлан function get_build_date() get_console():execute("mod loaded") local flist = getFS():file_list_open_ex("$logs$",FS.FS_ListFiles,"*.log") flist:Sort(FS.FS_sort_by_modif_down) local res = flist:GetAt(0):ModifDigitOnly() if not (res and res ~= "") then return 0 end local days = {0,31,59,90,120,151,181,212,243,273,303,334,365} local y = tonumber( res:sub(7,10) or 0 ) local m = tonumber( res:sub(4,5) or 0 ) local d = tonumber( res:sub(1,2) or 0 ) local bd = (365*(y - 1999) - 31 + days[m] + d ) return "(build: "..bd..")" end Вариант куда более лучший, от @Charsi --// by Charsi function get_build_date() get_console():execute("cfg_save") local f = getFS() local flist = f:file_list_open_ex("$app_data_root$",FS.FS_ListFiles,"user.ltx") local file = flist:GetAt(0) local res = file:ModifDigitOnly() local d,m,y = res:match("(%d+)%d+)%d+)") local days = {0,31,59,90,120,151,181,212,243,273,303,334,365} local bd = (365*(y - 1999) - 31 + days[tonumber(m)] + d ) return "(build: "..bd..")" end Финальная версия: --// ------------------------------------------------------------------------------------------- --// Версия мода в виде (build: 5369) [+171013], где первое - номер билда, второе - номер фикса --// Работает полностью автономно, вызывать в меню, либо где угодно еще --// ------------------------------------------------------------------------------------------- function get_build_date() get_console():execute("cfg_save") local flist = getFS():file_list_open_ex("$app_data_root$",FS.FS_ListFiles,"user.ltx") local res = flist:GetAt(0):ModifDigitOnly() local d,m,y = res:match("(%d+)%d+)%d+)") local fix = tonumber(res:sub(9,10)) local days = {0,31,59,90,120,151,181,212,243,273,303,334,365} local bd = (365*(tonumber(y) - 1999) - 31 + days[tonumber(m)] + tonumber(d) ) return "(build: "..bd..") [+"..tonumber(d..m..fix).."]" end Изменено 16 Октября 2013 пользователем Карлан Поделиться этим сообщением Ссылка на сообщение
Карлан 1 049 Опубликовано 17 Октября 2013 (изменено) 4. Довольно странные определения билда и фикса... Получается что, когда запустил игру - тогда и билд сделан с фиксом?! Все же 'build' и 'fix' - некие даты, когда были созданы коды или изменения к ним, а не "дата создания запущенной игры"... Разумеется я это учел, т.к. номера-даты менялись бы ежедневно вне зависимости от каких-либо правок, что, как ты подметил, в корне не верно. 3. В "финальном" варианте явно ошибочен патерн, вероятно должно быть: Форум проглотил патерн, было: "(%d+)%d+)%d+)" Расскажите пожалуйста о том, как влияют различные параметры ГГ(репутация/ранг...) на коэффициенты торговли в оригинальном ТЧ? И вообще влияют-ли как-то? Я пока нигде информации о влиянии подобных параметров не нашел, возможно как-то это обрабатывается движком. Изменено 17 Октября 2013 пользователем Карлан Поделиться этим сообщением Ссылка на сообщение
Карлан 1 049 Опубликовано 17 Октября 2013 (изменено) У меня теперь вопрос конкретно про репутацию встал. Сейчас начну формулировать, начал я с того, что вывел кастом статиком db.actor:character_reputation(), и она мне стала показывать репутацию ГГ. Ясно, что она в наградах за таски прописывается, и где то в диалогах о помощи и etc., а вот насчет смерти я например не нашел. Искал в xr_motivator.script что-либо что могло бы повлиять на репутацию, но не нашел. Нашел только непонятную функцию: if(actor_stats.remove_from_ranking~=nil)then local community = self.object:character_community() if community == "zombied" or community == "monolith" or community == "arena_enemy" then return end actor_stats.remove_from_ranking(self.object:id()) end Итак, собственно вопросы: 1 По каким критериям она изменяется? 2 Каков ее диапазон? 3 Как она влияет на отношения разных группировок/торговцев/монстров на ГГ? (н-р убили сталкера, репутация отнялась, как на это отреагируют бандиты?) Еще добавлю подобный вопрос про функцию goodwill, чем отличается от general_goodwill? Как и от чего изменяется? Мне возвращает всегда 0, пострелял, выполнил пару заданий, и по прежнему было 0. Изменено 17 Октября 2013 пользователем Карлан Поделиться этим сообщением Ссылка на сообщение
Карлан 1 049 Опубликовано 21 Октября 2013 (изменено) Можете мне рассказать что делает данная секция? Просто респавнит кабанов в точке? Или это все же гулаг? И кроме этого где-либо нужно указывать для него какие-то параметры? Или просто добавил, и готово? ; cse_abstract properties section_name = respawn name = esc_boar_respawn_mod position = -48.3812408447266, -17.0997714996338, -169.678924560547 direction = 0, 0, -1.07722399889099e-007 id = 65535 version = 118 script_version = 6 spawn_id = 984 ; cse_alife_object properties game_vertex_id = 106 distance = 19.6 level_vertex_id = 231011 object_flags = 0xffffff3e custom_data = <<END [respawn] respawn_section = boar_weak,10, boar_normal,7,boar_strong,4 ;max_count = 8 ;min_count = 1 max_spawn = 3 idle_spawn = medium END ; cse_shape properties shapes = 1 shape_0:type = sphere shape_0:offset = 0,0,0 shape_0:radius = 1 ; cse_alife_space_restrictor properties restrictor_type = 0 ; se_respawn properties spawned_obj = Так же хотел бы узнать где прописывается радиус смарттеррейна-гулага, в ключе distance или shape_0:radius. . Изменено 21 Октября 2013 пользователем Карлан Поделиться этим сообщением Ссылка на сообщение
Карлан 1 049 Опубликовано 22 Октября 2013 Объясните мне мою проблему, что-то бьюсь бьюсь и никак не пойму, то стек переполняется то вот такой вылет. Я просто решил добавить двух чуваков в гулаг новичкам, одного - рядового, второго - уникального. Рядовой добавляется и бегает, выполняя какую-либо работу, так же кто-то(может и новенький) выполняет добавленную мною работу...в общем все хорошо, а как только сую уникального, захожу в игру и проходит несколько секунд и выкидывает меня вот с этим(подозреваю, что с логикой напортачил): 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: ...ing\s.t.a.l.k.e.r. 1.0006\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value) Собственно мои добавления: <specific_character id="esc_squash" team_default = "1"> <name>squash</name> <icon>ui_npc_u_stalker_neytral_balon_1</icon> <bio>sim_stalker_novice_bio</bio> <class>esc_squash</class> <community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect> <money min="600" max="2000" infinitive="0"/> <rank>550</rank> <reputation>553</reputation> <visual>actors\neytral\stalker_neytral_rukzak_5</visual> <snd_config>characters_voice\human_01\monolith\</snd_config> <crouch_type>-1</crouch_type> <panic_treshold>0</panic_treshold> <supplies> [spawn] \n wpn_pm \n ammo_9x18_fmj = 1 \n wpn_ak74u \n ammo_5.45x39_fmj \n device_torch \n hand_radio \n </supplies> #include "gameplay\character_criticals_3.xml" <start_dialog>hello_dialog_dark_stalker</start_dialog> <actor_dialog>dm_cool_info_dialog</actor_dialog> <actor_dialog>dm_help_wounded_medkit_dialog</actor_dialog> </specific_character> <character id="esc_squash"> <class>esc_squash</class> </character> [esc_squash]:stalker $spawn = "respawn\esc_squash" character_profile = esc_squash spec_rank = regular community = stalker [124] ; cse_abstract properties section_name = stalker name = esc_squash position = -181.63005065918, -5.95726537704468, -30.6638507843018 direction = 0.0445535257458687, -0.000645029998850077, 0.0144814234226942 id = 65535 version = 118 script_version = 6 spawn_id = 99 ; cse_alife_trader_abstract properties money = 5000 character_profile = esc_squash ; cse_alife_object properties distance = 3.5 game_vertex_id = 55 level_vertex_id = 79998 object_flags = 0xffffffbf custom_data = <<END [smart_terrains] esc_lager = true END ; cse_visual properties visual_name = actors\novice\green_stalker_2 ; cse_alife_creature_abstract properties g_team = 0 g_squad = 1 g_group = 5 dynamic_out_restrictions = dynamic_in_restrictions = ; cse_alife_monster_abstract properties equipment_preferences = 2, 2, 0, 1, 0 main_weapon_preferences = 2, 1, 2, 1 ; cse_ph_skeleton properties ; se_stalker properties upd:health = 1 upd:timestamp = 0xef20e0ec upd:creature_flags = 0xe5 upd:position = -173.606140136719, -20.0129489898682, -133.752899169922 upd:o_torso = -0.000645029998850077, 0.0445535257458687, 0 upd:g_squad = 1 upd:g_group = 5 ; cse_alife_human_stalker properties upd:start_dialog = ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; [esc_lager_squash_camp] points = p0 p0:name = wp00 p0:flags = 0x1 p0:position = -170.06298828125,-20.014019012451,-136.57836914063 p0:game_vertex_id = 55 p0:level_vertex_id = 79998 [esc_lager_squash_camp_look] points = p0 p0:name = wp00 p1:position = -170.23962402344,-20.173686981201,-153.82247924805 p1:game_vertex_id = 45 p1:level_vertex_id = 79973 t = { section = "logic@esc_lager_squash", idle = 0, prior = 16, state = {0,1}, online = true, in_rest = "", out_rest = "esc_lager_guard_kill_zone", predicate = function(obj_info) return obj_info.profile_name == "esc_squash" end } table.insert(sj, t) [logic@esc_lager_squash] active = camper@esc_lager_squash [camper@esc_lager_squash] path_walk = squash_camp path_look = squash_camp_look meet = meet@lager Поделиться этим сообщением Ссылка на сообщение
Карлан 1 049 Опубликовано 23 Октября 2013 (изменено) @AndreySol, а че так сильно западло соседний топик глянуть? http://www.amk-team.ru/forum/index.php?showtopic=7450&p=466444 @sanjaaa, почитай про функций рандома, наверняка задаешь не так(одну цифру пишешь например), а убирать файлы очень глупо, бороться надо с причиной, а не со следствием. Подскажите, а возможно-ли как-то сделать так, что бы метки рестрикторов не перекрывали собой метки предметов/персонажей, которые находятся в/рядом с рестриктором. Точнее мне нужно инверсное перекрытие, что бы метки которые стоят на персонажах/итемах перекрывали метку рестриктора. Изменено 23 Октября 2013 пользователем Карлан Поделиться этим сообщением Ссылка на сообщение
Карлан 1 049 Опубликовано 23 Октября 2013 (изменено) @sanjaaa, да блин че не ясного? Указал же, и рандомность вылета вполне оправданна, менеджер берет случайные итемы из секций конфигов лута, еслии менеджер берет ключ секции, который написан с ошибками(либо сам ключ, либо, судя по вылету - значение), то происходит вылет, попробуй вот так: if (count_by_level[k].min and count_by_level[k].max) then local number = math.ceil(math.random(count_by_level[k].min, count_by_level[k].max)) --// значение ключа верно else local number = math.ceil(math.random(count_by_level[k].min) --// второе значение не указано, берем от первого end Или если тернарный нравится, то: local number = (count_by_level[k].min and count_by_level[k].max) and (math.ceil(math.random(count_by_level[k].min, count_by_level[k].max))) or (math.ceil(math.random(count_by_level[k].min)) Оставлять так не советую, лучше исправь ошибки в конфиге... Изменено 23 Октября 2013 пользователем Карлан Поделиться этим сообщением Ссылка на сообщение
Карлан 1 049 Опубликовано 23 Октября 2013 (изменено) @sanjaaa, мне че в третий раз тебе повторить? grenade_rgd5 = 0 должно быть вообще закомментировано(вырезано)! ammo_5.56x45_ss190 = 2 Если ты хочешь что бы всегда было две пачки, то надо писать так, я это уже выше сказал два раза... ammo_5.56x45_ss190 = 2, 2 Короче все, больше я не отвечаю, если ты сейчас не сообразишь... то я не знаю как еще до тебя донести мысль. (одну цифру пишешь например) Вот по этому догадаться то никак нельзя было? Я тебе еще дал коды, которые фиксят вылет, но урезают функционал менеджера, че еще надо-то я понять не могу? ------------- Перенесу свой вопрос сюда: Подскажите, а возможно-ли как-то сделать так, что бы метки рестрикторов не перекрывали собой метки предметов/персонажей, которые находятся в/рядом с рестриктором. Точнее мне нужно инверсное перекрытие, что бы метки которые стоят на персонажах/итемах перекрывали метку рестриктора. Изменено 23 Октября 2013 пользователем Карлан Поделиться этим сообщением Ссылка на сообщение
Карлан 1 049 Опубликовано 28 Октября 2013 @losiara, да ну начерта фигней-то страдать? Пишешь проверку по level.name() и все, а такая порнуха как у тебя использовалась в некоторых модах 2008 года... Не, ну на вкус и цвет конечно...Но все же. Очень трудно бывает отследить ход и логику действий при твоем подходе, ковырял один мод такой, где использована подобная конструкция... эх и намучался, думайте о тех, кто будет ковырять ваши моды в конце-то концов 1 Поделиться этим сообщением Ссылка на сообщение
Карлан 1 049 Опубликовано 29 Октября 2013 (изменено) @AndreySol, так сложно в менеджер посмотреть? Вся награда и прибавки к репутации, рангу и etc. прописаны в task_manager.ltx и черпаются оттуда. При создании любого(!) квеста награда должна задаваться явно(!), как это уже говорилось выше, только в зависимости от типа квеста(т.н. однотипный, или же полностью свой) награда задается по разному, только и всего. Хотя если приколоться, то можно и свой аналог написать под свои нужды...ну тут уже воля фантазии. Сегодня/завтра покопаюсь с goodwill'ами, потестирую и напишу как что работает. Пока в теории видно, что функционал методов установки отношений хорошо настраивается, а так же не используется весь функционал, который прописан... правда работает он, или нет, я пока не знаю. Изменено 29 Октября 2013 пользователем Карлан Поделиться этим сообщением Ссылка на сообщение
Карлан 1 049 Опубликовано 29 Октября 2013 (изменено) Особо не ковырялся, но вроде там все и так ясно, параметры пока не тестировал, внесу кое какие разъяснения. Коридор изменения коэффициента отношений относительно группировки -3000, 1000; относительно персонажа -1000; 1000, скоро посмотрю для гулагов этот диапазон. goodwill ничем не отличается от relation, просто relation завязан на константы ALife::ERelationType, эти константы можно менять в конфиге. goodwill(game_object*) и general_goodwill(game_object*) эквивалентные функции, по крайней мере я пока отличий не выявил. Для гулагов функции с goodwill применяются такие же, как к группировкам. Изменено 29 Октября 2013 пользователем Карлан 1 Поделиться этим сообщением Ссылка на сообщение