Artos 99 Опубликовано 16 Октября 2012 Поделиться Опубликовано 16 Октября 2012 (изменено) malandrinus, сорри, лоханулся... заковырявшись с методами нет-пакетов, которые несколько отличны от методов для ini_file. Да и ошибка в логике, про которую говорил (и в ЛС) автор вопроса, сбила с толку. ;-) Однако, все же стОит в первую очередь рекомендовать 'штатные' для игры/схемы значения или хотя бы упоминать возможные. Нередко в логике булево значение задается не чтением булева значения напрямую, а строкою и именно "true" / "false", с последующим переводом по услових проверки типа if value == "true" then ... В подобных случаях, учитывая слабые навыки, например у Daemonion, не каждый совладает с варициями : "true", "yes", "on", "1". Изменено 16 Октября 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Daemonion 0 Опубликовано 21 Октября 2012 Поделиться Опубликовано 21 Октября 2012 (изменено) Еще раз здравствуйте, Я пытаюсь изменить/создать скрипт, который будет отделять звуки выстрела игрока от звуков выстрела NPC/не игрока. Моя цель - иметь в каждом w_xxx.ltx новую строку для snd_shoot_actor, которая бы использовалась только для игрока. До сих пор мне говорили, что может помочь изменение function motivation_binder в xr_motivation.script. Вот этот код. В общем, я добавил вот это: if bit_and(sound_type, snd_type.weapon_shoot) == snd_type.weapon_shoot then if who:id() == db.actor:id() then type = "WPN_shoot_actor" else type = "WPN_shoot" end Я использую w_pm.ltx для тестирования. Что мой w_pm.ltx считывает: snd_draw = weapons\pm_draw snd_holster = weapons\generic_holster snd_shoot = weapons\t_pm_shot snd_shoot_actor = daemonion\weapons\actor_shoot snd_empty = weapons\pistol_empty snd_reload = weapons\pm_reload, 0.8 snd_close = weapons\generic_close Опять же, моя цель - иметь отдельные звуки выстрелов для игрока и NPC. То, что я попробовал не сработало. Есть какие-нибудь другие идеи? Спасибо за ваше время и помощь! [edit] для SoC Изменено 21 Октября 2012 пользователем Daemonion Ссылка на комментарий
Artos 99 Опубликовано 21 Октября 2012 Поделиться Опубликовано 21 Октября 2012 (изменено) Daemonion, 1. Сам коллбэк (callback) hear_callback деактивирован в биндере сталкеров (SHoC) и требует соответсвующей правки (set_callback). 2. Активированный коллбэк достаточно глюкав (очевидно это и послужило причиной его отключения разработчиками) и требует особого внимания и отладки... Вариант кодов с активированным и работающим коллбэком hear_callback можно посмотреть в версии игры CoP или в моде SIMBION:SHoC v3.0 rc12 Примечание: Сами звуки выстрелов не будут "отдельными" для актора и НПС, а с помошью раздельных флагов (WPN_shoot_actor и WPN_shoot) уже в самом обработчике коллбэка можно ветвить алгоритм. Изменено 21 Октября 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Daemonion 0 Опубликовано 21 Октября 2012 Поделиться Опубликовано 21 Октября 2012 Artos, Я включил этот код в xr_motivator.script: self.object:set_callback(callback.sound, motivator_binder.hear_callback, self) Не могли бы вы объяснить это больше? спасибо: Сами звуки выстрелов не будут "отдельными" для актора и НПС, а с помошью раздельных флагов (WPN_shoot_actor и WPN_shoot) уже в самом обработчике коллбэка можно ветвить алгоритм. Ссылка на комментарий
Artos 99 Опубликовано 21 Октября 2012 Поделиться Опубликовано 21 Октября 2012 (изменено) Daemonion, не знаю поймешь ли ты мой ответ, но объяснять по иному не имею возможности: 1. Задавая вопрос, формулируй именно конечную цель, а не некое, оторванное от конкретики, свое пожелание. Мне непонятны твои слова о: ... новую строку для snd_shoot_actor, которая бы использовалась только для игрока , т.к. их трактовать можно по разному.Вероятно ты имеешь ввиду, что с помошью этой строки ты собираешься заставить для оружия звучать разные звуки "для актора" и "для остальных". Если это так,то это врядли возможно без значительной переделки движка игры. Движек не различает для оружия в чьих руках оно находится и выводит звуки только по тем параметрам, которые зарегистрированы в нем самом. Любые попытки добавить "отсебятину" - движком просто игнорируются. Т.о. твоя "цель" прописать свою строку в конфиг каждому (иль какому-то одному) оружию выполнима, пиши хоть десяток, но(!) движек то их читать не будет. Скриптами конечно можно читать добавленные строки, но как ты передашь что с этими строками делать движку? Так что твоя "локальная" цель достижима, но толку от нее никакого. 2. То, что ты затеял с hear_callback, т.е. дать скриптам возможность различать при звучании кто является "виновником" (who) - тоже осуществимо, но(!) это уже последствия вывода звука и им то как раз ты не управляешь, а можешь только по флагу "это (не)актор" в дальнейшем выполнять какие-то действия, например, дополнять исходный звук своими собственными. Т.о. в любом случае для одного и того же оружия (секции) звуки будут одинаковы как для актора так и для всех остальных. Единственный, ИМХО, выход - иметь для каждого типа оружия по две секуции. Одна - для актора, вторая - для остальных НПС, и в этих секциях уже и прописывать 'штатным' параметрам имена своих звуковых файлов. Ну а ситуации, когда то или иное оружие попадает не по назначению (к актору или НПС), разрешать уже известным способом, т.е. удалять неподходящее и заменять (переспавном) на соответсвующее. Изменено 21 Октября 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Daemonion 0 Опубликовано 24 Октября 2012 Поделиться Опубликовано 24 Октября 2012 (изменено) Artos, I am sorry, but I have to respond in English. First, thank you for your reply. You are always very helpful. I mostly understand what you are saying; a friend translated for me. If you need me to post in Russian, let me know, I will ask a friend. To answer your question: I am the lead sound designer for LURK 1.2. One of the big things I am working on is all-new weapon audio. Since I am a firearm instructor in America, I have access to many guns, and I also have professional audio recording equipment and software. I want to make two audio files for each gun shot - one for first person perspective (player), and one for third person perspective (NPC). For the player (first person), the gun will sound more powerful, have more mechanical noise (bolt cycling, trigger reset, etc), have more environmental echo and (hopefully) will play in stereo. I don't really want any of these things from the third-person perspective (when NPCs are firing their guns). So, my goal is to have the game differentiate between the actor shooting (first person in the HUD) and all non-actors shooting. It sounds like I will need to have the game dynamically change .ltx files. I am looking at the Progressive Weapons Mod from Zhat to give me some inspiration in how to do this - use one .ltx for the actor and use another .ltx for the NPCs, so that they can use different sounds. К сожалению, не все на форуме обладают познаниями английского языка, поэтому прошу вас излагать мысли на языке принятом на данном форуме, а именно на русском. Благодарю. ColR_iT Изменено 24 Октября 2012 пользователем ColR_iT Ссылка на комментарий
Magnus1 0 Опубликовано 28 Октября 2012 Поделиться Опубликовано 28 Октября 2012 Здравствуйте всем. Такая проблема: я пытаюсь сделать так, что бы если здоровье ГГ меньше или равно 0.3, то вызывалась определенная функция. Все получилось, но работает не совсем коректно, а именно эта функция вызывается постоянно. Сделал все вот так: --' ГГ при малом ХП теряет сознание и его несут на базу к доктору if self.object.health <=0.3 then magnus1.hp_test1() end function hp_test1() local sactor = alife():actor() --получаем серверный объект актера local cactor = level.object_by_id(sactor.id) --по его ID получаем клиентский объект актера cactor:give_game_news( "Свободу тушканам!\\nТушканчики всех стран, объединяйтесь!", -- строка сообщение, может быть многострочной "ui\\ui_npc_monster", --текстура, из которой берется аватара "отправителя" Frect():set(0,215,163,105), --координаты и размеры вырезаемого из текстуры изображения math.random(1000, 3000), --начало показа сообщения с текущего момента (в миллисекундах) 5000 --длительность показа сообщения (в миллисекундах) ) end --' (сообщение для теста вообще взял) Так вот, как сделать что бы эта функция выполнялась только единожды, к примеру один раз за все время прибывания на локации? Ссылка на комментарий
Полтергейст 38 Опубликовано 28 Октября 2012 Поделиться Опубликовано 28 Октября 2012 (изменено) Такой вот вопрос. Внес такие строки в код класса se_outfit (файл se_item.script): Ожидал, при спауне броника увидеть сообщение 1 раз - в __init переменную проинициализировали false, в первом вызове STATE_Write установили в true, все - больше сообщение появлятся не должно. Однако при спауне броника в игре, сообщение выдается 2 раза подряд. Почему ? Думал до этого так - при создании игрового объекта, создается объект класса se_outfit, представляющий серверную часть объекта, ну инициализируется там как положено и в дальнейшем существует до выхода из игры или загрузки сохранения. А тут получается что объект класса создается дважды ? Объясните, что к чему ! Замечал нечто похожее с on_register, причем только для скриптового спавна - написал об этом баге в справочнике функций и классов. Там же выложено решение - вывод в лог записи о том, что функция вызвана второй раз и немедленное прекращение её выполнения. P.S. Попробуй выводить не id объекта, а его имя. Предполагаю, что там не будет имен предметов, которые создаются через all.spawn. Изменено 28 Октября 2012 пользователем Полтергейст Ссылка на комментарий
xgamers 0 Опубликовано 28 Октября 2012 Поделиться Опубликовано 28 Октября 2012 Всем привет. У меня такой вопрос. Как добавить к артефактам idle звуки или какой скрипт отвечает за idle звуки у аномалий? Заранее спасибо. Ссылка на комментарий
Artos 99 Опубликовано 28 Октября 2012 Поделиться Опубликовано 28 Октября 2012 xgamers, а с чего ты решил, что вообще скрипты должны отвечать за все-про-все в игре? Движек читает конфиги - он и "отвечает"... Полтергейст, что-то не нашел твоего поста о "баге" в топике справочника... Да и баг ли это? Не встречал ситуации, когда метод on_register вызывался бы дважды для одного объекта, если конечно это не баг сторонних скриптов, но тогда "лечить" нужно баговый скрипт, а не кастрировать в конструкторе серверного класса. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Viнt@rь 50 Опубликовано 28 Октября 2012 Поделиться Опубликовано 28 Октября 2012 (изменено) Magnus1, ты вешал свою функцию на какой коллбэк? как я понял на апдейт актора... тогда почему ты не можешь понять, почему твоя функция вызывается постоянно? зная что апдейт актора происходит постоянно... самое простое решение это выдавать/забирать инфопоршень после выполнения функции if self.object.health <=0.3 and not has_alife_info("info") then magnus1.hp_test1() give_info("info") end function hp_test1() local sactor = alife():actor() --получаем серверный объект актера local cactor = level.object_by_id(sactor.id) --по его ID получаем клиентский объект актера cactor:give_game_news("Свободу тушканам!\\nТушканчики всех стран, объединяйтесь!","ui\\ui_npc_monster",Frect():set(0,215,163,105),math.random(1000, 3000),5000) disable_info("info") end зы has_alife_info("info") give_info("info") disable_info("info") -- функции из ЗП(_g.script) в ТЧ не помню есть ли такие или нет Изменено 28 Октября 2012 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий
Полтергейст 38 Опубликовано 28 Октября 2012 Поделиться Опубликовано 28 Октября 2012 Не встречал ситуации, когда метод on_register вызывался бы дважды для одного объекта, если конечно это не баг сторонних скриптов, но тогда "лечить" нужно баговый скрипт, а не кастрировать в конструкторе серверного класса. Возможно это баг шестого патча, на остальных не проверял. Описание бага тут. В любом случае, скриптами on_register нигде явно не вызывается. Баг проявляется в начале загрузки игры, между стадиями "Сервер: Загрузка симуляции жизни" и "Сервер: Соединяемся". Под спойлером кусок свежего лога с использованием той правки, что в описании. ! Unknown command: pseudodog_weak17747_already_registered_in_simulation ! Unknown command: pseudodog_weak17748_already_registered_in_simulation ! Unknown command: pseudodog_weak17750_already_registered_in_simulation ! Unknown command: dog_strong17751_already_registered_in_simulation ! Unknown command: dog_strong17752_already_registered_in_simulation ! Unknown command: pseudodog_weak17753_already_registered_in_simulation ! Unknown command: pseudodog_weak17755_already_registered_in_simulation ! Unknown command: pseudodog_weak17756_already_registered_in_simulation ! Unknown command: bar_dolg_respawn_117757_already_registered_in_simulation ! Unknown command: bar_dolg_respawn_117769_already_registered_in_simulation ! Unknown command: bar_dolg_respawn_117779_already_registered_in_simulation ! Unknown command: mil_freedom_barier_respawn_117791_already_registered_in_simulation ! Unknown command: mil_stalker_respawn_317792_already_registered_in_simulation ! Unknown command: mil_stalker_respawn_217803_already_registered_in_simulation ! Unknown command: mil_stalker_respawn_217814_already_registered_in_simulation ! Unknown command: mil_stalker_respawn_217828_already_registered_in_simulation ! Unknown command: mil_stalker_respawn_217841_already_registered_in_simulation ! Unknown command: mil_stalker_respawn_217852_already_registered_in_simulation Ссылка на комментарий
Artos 99 Опубликовано 28 Октября 2012 Поделиться Опубликовано 28 Октября 2012 Viнt@rь, ты сам попробуй проанализируй свое предложенеие ;-) Функция вызывается при отсутствии инфопоршня и в ней же этот несуществующий - удаляется? Хм... То, что через инфопоршень можно осуществить "единожды" - это верно, но для "к примеру один раз за все время прибывания на локации" - придеться еще попотеть. :-) Полтергейст, и все же твой "баг" скорее всего искусственного происхождения, т.е. именно из-за сторонних вмешательств. В методе on_register в ЧН и ЗП имеется строка: story_objects.check_spawn_ini_for_story_id(self) --/ Проверяем кастомдату обьекта на наличие стори айди .По этой строке регистрируется в скриптовой базе каждый объект и, если будет попытка зарегистрироваться дважды - будет вызвано прерывание игры (abort). Т.о. любой вторичный вызов метода on_register приведет в фатальному завершению игры, чего в чистых ЧН и ТЧ не наблюдается... Эта же строка была мною добавлена во все доступные конструкторы серверных классов в ТЧ и ни разу за годы игры в мод не возникало проблем с вторичным вызовом метода on_register на любом из патчей 1.0004/5/6 ТЧ ни через all.spawn, ни через спавн скриптами... Ну а то, что в исходном вопросе было упомянуто про двойные вызовы методов __init иль иных - то это совершенно иная история. Все же не нужно путать скриптовые объекты с движковыми... "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
RayTwitty 509 Опубликовано 29 Октября 2012 Поделиться Опубликовано 29 Октября 2012 (изменено) Magnus1, local sactor = alife():actor() --получаем серверный объект актераlocal cactor = level.object_by_id(sactor.id) --по его ID получаем клиентский объект актера Зачем же такие извращения? db.actor разве не катит? Изменено 29 Октября 2012 пользователем Shadows Ссылка на комментарий
Viнt@rь 50 Опубликовано 31 Октября 2012 Поделиться Опубликовано 31 Октября 2012 (изменено) Artos, точняк, проморгал))(или мне показалось что функция новостей вызывается через время...) if self.object.health <=0.3 and not has_alife_info("info") then magnus1.hp_test1() give_info("info") end function hp_test1() local sactor = alife():actor() --получаем серверный объект актера local cactor = level.object_by_id(sactor.id) --по его ID получаем клиентский объект актера cactor:give_game_news("Свободу тушканам!\\nТушканчики всех стран, объединяйтесь!","ui\\ui_npc_monster",Frect():set(0,215,163,105),math.random(1000, 3000),5000) end disable_info("info") -- через какое то время(с помощью таймеров) либо при каком-то событии а по поводу но для "к примеру один раз за все время прибывания на локации" - придеться еще попотеть. :-) при смене локации удалять инфопоршень(правда при заходе на ту же локу опять, сообщение будет выдаваться заново, что бы такого не было, нужно использовать массив(сохраняемых), или несколько переменных(сохраняемых)) Shadows, ну захотелось человеку)) или кто-то порекомендовал так.... Изменено 31 Октября 2012 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий
Callisto 2 Опубликовано 3 Ноября 2012 Поделиться Опубликовано 3 Ноября 2012 Доброго времени суток. Вопрос из разряда бональщины, но все же... Вот ума не приложу, почему из-за этого происходит вылет. С точки зрения моей логики вроде все правильно. Игра ЗП. function every_hour() local time_m = level.get_time_minutes() if time_m == 59 and my_flag_1 == 0 then local snd = sound_object([[interface\mp_reward]]) snd:play_no_feedback(db.actor,sound_object.s2d, 0, vector():set(0, 0, 0), 2.0) local my_flag_1 = 1 end if time_m =~ 59 then local my_flag_1 = 0 end end И попутно еще вопросик. Имеется функция вызываемая из апдейта актора, но при загрузке игры возникает коллизия, так вот, можно ли пропустить несколько апдейтов и толко потом обрабатывать мою функцию? Ссылка на комментарий
_Призрак_ 11 Опубликовано 3 Ноября 2012 Поделиться Опубликовано 3 Ноября 2012 Во первых почитай про область видимость переменных. Например такой код выдаст ошибку: local a=1 if a==1 then local b =15 end b = b+1 С руганью на то что мы не создали переменную b. Почему? Мы создали ее в условии, но эта переменная удалится при выходе из условия. То же самое с циклами и функциями. Можно сделать глобальную переменную, которая будет видна везде. Тогда нужно просто не писать local перед именем переменной. Но это плохой стиль программирования и может вызвать колизию Так же я не уверен что у тебя при старте будет инициализирована переменная my_flag_1. Сделай так: function every_hour()if not my_flag_1 then my_flag_1 = 0 endlocal time_m = level.get_time_minutes()if time_m == 59 and my_flag_1 == 0 thenlocal snd = sound_object([[interface\mp_reward]])snd:play_no_feedback(db.actor,sound_object.s2d, 0, vector():set(0, 0, 0), 2.0)my_flag_1 = 1endif time_m =~ 59 thenmy_flag_1 = 0endend З.Ы.бАнальщина Freedom Ссылка на комментарий
Artos 99 Опубликовано 3 Ноября 2012 Поделиться Опубликовано 3 Ноября 2012 Callisto, это "с точки зрения твоей логики вроде все правильно.", однако ... парсер кода скрипта считает иначе и в результате - ошибка. Попробуй применить "логику" чтения движком, т.е. читать последовательно. Дойдя в третьей строке до необходимости проверки условия my_flag_1 == 0 - что движек должен с чем сравнивать? Тобою не определена переменная my_flag_1 и попытка сравнения nil с числом приводит к естественному событию - вылету. Ну и далее, как уже написал _Призрак_, не следует слепо применять 'local'. Пропустить циклы апдейта в биндере актора в общем-то довольно просто. Во-первых можно просто напросто использовать счетчик, который устанавливается в самом начале и по достижении нужного кол-ва апдейтов - уже начинает что-то нужное выполнять. Во-вторых, имеется метод device().precache_frame, который как раз позволяет пропускать ~27 циклов начальных апдейтов. Т.е. на самом первом апдейте этот метод вернет число 27 и далее с каждым циклом апдейта будет уменьшиться до 0 (аналог вышеупомянутого счетчика). Так что можешь выбирать сколько нужно пропустить из этого диапазона. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Callisto 2 Опубликовано 3 Ноября 2012 Поделиться Опубликовано 3 Ноября 2012 (изменено) Это моя ошибка, забыла в посте указать, что перед функцией устанавлен local my_flag_1 = 0 Сама конструкция функции, как выяснилось, полная ересь, которая крашит игру и при, казалось бы, правильном написании (или это только у меня так). Да и local я уже потом понапихала, когда идеи кончились, изначально их не было. Более правильный вариант уже подсказал Charsi. В общем, всем большое спасибо. А вот для того, чтобы отделять ересь от задумок автора кода, и следует в первую очередь указывать цель/задачу, которую должен решать код, и затем давать конкретный код с попыткой ее решения и лог с ошибкою - тогда обсуждение/подсказки будут более продуктивными. --/ Artos Изменено 3 Ноября 2012 пользователем Artos Ссылка на комментарий
Nazgool 250 Опубликовано 3 Ноября 2012 Поделиться Опубликовано 3 Ноября 2012 (изменено) Я и не знал, что в lua появился новый оператор =~ (наверное "примерного присваивания" что ли?) Я бы мог понять это : if time_m =~ 59 then Так : Если переменной time_m присвоено значение примерно 59, то... :-) Изменено 3 Ноября 2012 пользователем Gun12 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти