Перейти к контенту

Рекомендуемые сообщения

malandrinus, сорри, лоханулся... заковырявшись с методами нет-пакетов, которые несколько отличны от методов для ini_file. Да и ошибка в логике, про которую говорил (и в ЛС) автор вопроса, сбила с толку. ;-)

 

Однако, все же стОит в первую очередь рекомендовать 'штатные' для игры/схемы значения или хотя бы упоминать возможные.

Нередко в логике булево значение задается не чтением булева значения напрямую, а строкою и именно "true" / "false", с последующим переводом по услових проверки типа if value == "true" then ...

В подобных случаях, учитывая слабые навыки, например у Daemonion, не каждый совладает с варициями : "true", "yes", "on", "1".

 

 

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Еще раз здравствуйте,

 

Я пытаюсь изменить/создать скрипт, который будет отделять звуки выстрела игрока от звуков выстрела 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

Изменено пользователем Daemonion
Ссылка на комментарий

Daemonion,

1. Сам коллбэк (callback) hear_callback деактивирован в биндере сталкеров (SHoC) и требует соответсвующей правки (set_callback).

2. Активированный коллбэк достаточно глюкав (очевидно это и послужило причиной его отключения разработчиками) и требует особого внимания и отладки...

Вариант кодов с активированным и работающим коллбэком hear_callback можно посмотреть в версии игры CoP или в моде SIMBION:SHoC v3.0 rc12

 

Примечание: Сами звуки выстрелов не будут "отдельными" для актора и НПС, а с помошью раздельных флагов (WPN_shoot_actor и WPN_shoot) уже в самом обработчике коллбэка можно ветвить алгоритм.

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Artos,

 

Я включил этот код в xr_motivator.script:

self.object:set_callback(callback.sound, motivator_binder.hear_callback, self)

 

Не могли бы вы объяснить это больше? спасибо:

Сами звуки выстрелов не будут "отдельными" для актора и НПС, а с помошью раздельных флагов (WPN_shoot_actor и WPN_shoot) уже в самом обработчике коллбэка можно ветвить алгоритм.
Ссылка на комментарий

Daemonion, не знаю поймешь ли ты мой ответ, но объяснять по иному не имею возможности:

1. Задавая вопрос, формулируй именно конечную цель, а не некое, оторванное от конкретики, свое пожелание.

Мне непонятны твои слова о:

... новую строку для snd_shoot_actor, которая бы использовалась только для игрока
, т.к. их трактовать можно по разному.

Вероятно ты имеешь ввиду, что с помошью этой строки ты собираешься заставить для оружия звучать разные звуки "для актора" и "для остальных".

Если это так,то это врядли возможно без значительной переделки движка игры. Движек не различает для оружия в чьих руках оно находится и выводит звуки только по тем параметрам, которые зарегистрированы в нем самом. Любые попытки добавить "отсебятину" - движком просто игнорируются.

Т.о. твоя "цель" прописать свою строку в конфиг каждому (иль какому-то одному) оружию выполнима, пиши хоть десяток, но(!) движек то их читать не будет.

Скриптами конечно можно читать добавленные строки, но как ты передашь что с этими строками делать движку? Так что твоя "локальная" цель достижима, но толку от нее никакого.

2. То, что ты затеял с hear_callback, т.е. дать скриптам возможность различать при звучании кто является "виновником" (who) - тоже осуществимо, но(!) это уже последствия вывода звука и им то как раз ты не управляешь, а можешь только по флагу "это (не)актор" в дальнейшем выполнять какие-то действия, например, дополнять исходный звук своими собственными.

Т.о. в любом случае для одного и того же оружия (секции) звуки будут одинаковы как для актора так и для всех остальных.

 

Единственный, ИМХО, выход - иметь для каждого типа оружия по две секуции. Одна - для актора, вторая - для остальных НПС, и в этих секциях уже и прописывать 'штатным' параметрам имена своих звуковых файлов. Ну а ситуации, когда то или иное оружие попадает не по назначению (к актору или НПС), разрешать уже известным способом, т.е. удалять неподходящее и заменять (переспавном) на соответсвующее.

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

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

Изменено пользователем ColR_iT
Ссылка на комментарий

Здравствуйте всем. Такая проблема: я пытаюсь сделать так, что бы если здоровье ГГ меньше или равно 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

--' (сообщение для теста вообще взял)

 

 

Так вот, как сделать что бы эта функция выполнялась только единожды, к примеру один раз за все время прибывания на локации?

Ссылка на комментарий

Такой вот вопрос.

 

Внес такие строки в код класса se_outfit (файл se_item.script):

Ожидал, при спауне броника увидеть сообщение 1 раз - в __init переменную проинициализировали false, в первом вызове STATE_Write установили в true, все - больше сообщение появлятся не должно. Однако при спауне броника в игре, сообщение выдается 2 раза подряд. Почему ? Думал до этого так - при создании игрового объекта, создается объект класса se_outfit, представляющий серверную часть объекта, ну инициализируется там как положено и в дальнейшем существует до выхода из игры или загрузки сохранения. А тут получается что объект класса создается дважды ? Объясните, что к чему !

 

Замечал нечто похожее с on_register, причем только для скриптового спавна - написал об этом баге в справочнике функций и классов. Там же выложено решение - вывод в лог записи о том, что функция вызвана второй раз и немедленное прекращение её выполнения.

P.S. Попробуй выводить не id объекта, а его имя. Предполагаю, что там не будет имен предметов, которые создаются через all.spawn.

Изменено пользователем Полтергейст
Ссылка на комментарий

Всем привет.

У меня такой вопрос. Как добавить к артефактам idle звуки или какой скрипт отвечает за idle звуки у аномалий? Заранее спасибо.

Ссылка на комментарий

xgamers, а с чего ты решил, что вообще скрипты должны отвечать за все-про-все в игре? Движек читает конфиги - он и "отвечает"...

 

 

Полтергейст, что-то не нашел твоего поста о "баге" в топике справочника... Да и баг ли это? Не встречал ситуации, когда метод on_register вызывался бы дважды для одного объекта, если конечно это не баг сторонних скриптов, но тогда "лечить" нужно баговый скрипт, а не кастрировать в конструкторе серверного класса.

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

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)

в ТЧ не помню есть ли такие или нет

Изменено пользователем Viнt@rь
Ссылка на комментарий

Не встречал ситуации, когда метод 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

 

 

Ссылка на комментарий

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 иль иных - то это совершенно иная история. Все же не нужно путать скриптовые объекты с движковыми...

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Magnus1,

local sactor = alife():actor() --получаем серверный объект актера

local cactor = level.object_by_id(sactor.id) --по его ID получаем клиентский объект актера

Зачем же такие извращения? db.actor разве не катит?

Изменено пользователем Shadows
Ссылка на комментарий

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, ну захотелось человеку)) или кто-то порекомендовал так....

Изменено пользователем Viнt@rь
Ссылка на комментарий

Доброго времени суток.

Вопрос из разряда бональщины, но все же...

Вот ума не приложу, почему из-за этого происходит вылет. С точки зрения моей логики вроде все правильно.

Игра ЗП.

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

 

 

И попутно еще вопросик. Имеется функция вызываемая из апдейта актора, но при загрузке игры возникает коллизия, так вот, можно ли пропустить несколько апдейтов и толко потом обрабатывать мою функцию?

userbar368.png

Ссылка на комментарий

Во первых почитай про область видимость переменных. Например такой код выдаст ошибку:

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 end

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)
my_flag_1 = 1
end

if time_m =~ 59 then
my_flag_1 = 0
end
end

 

 

 

З.Ы.бАнальщина

Freedom

Ссылка на комментарий

Callisto, это "с точки зрения твоей логики вроде все правильно.", однако ... парсер кода скрипта считает иначе и в результате - ошибка.

Попробуй применить "логику" чтения движком, т.е. читать последовательно. Дойдя в третьей строке до необходимости проверки условия my_flag_1 == 0 - что движек должен с чем сравнивать? Тобою не определена переменная my_flag_1 и попытка сравнения nil с числом приводит к естественному событию - вылету.

Ну и далее, как уже написал _Призрак_, не следует слепо применять 'local'.

 

Пропустить циклы апдейта в биндере актора в общем-то довольно просто.

Во-первых можно просто напросто использовать счетчик, который устанавливается в самом начале и по достижении нужного кол-ва апдейтов - уже начинает что-то нужное выполнять.

Во-вторых, имеется метод device().precache_frame, который как раз позволяет пропускать ~27 циклов начальных апдейтов. Т.е. на самом первом апдейте этот метод вернет число 27 и далее с каждым циклом апдейта будет уменьшиться до 0 (аналог вышеупомянутого счетчика). Так что можешь выбирать сколько нужно пропустить из этого диапазона.

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Это моя ошибка, забыла в посте указать, что перед функцией устанавлен local my_flag_1 = 0

Сама конструкция функции, как выяснилось, полная ересь, которая крашит игру и при, казалось бы, правильном написании (или это только у меня так).

Да и local я уже потом понапихала, когда идеи кончились, изначально их не было.

Более правильный вариант уже подсказал Charsi.

 

В общем, всем большое спасибо.

 

А вот для того, чтобы отделять ересь от задумок автора кода, и следует в первую очередь указывать цель/задачу, которую должен решать код, и затем давать конкретный код с попыткой ее решения и лог с ошибкою - тогда обсуждение/подсказки будут более продуктивными.

--/ Artos

Изменено пользователем Artos

userbar368.png

Ссылка на комментарий

Я и не знал, что в lua появился новый оператор =~ (наверное "примерного присваивания" что ли?)

Я бы мог понять это :

if time_m =~ 59 then

Так :

Если переменной time_m присвоено значение примерно 59, то... :-)

Изменено пользователем Gun12
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...