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

[SoC] Ковыряемся в файлах


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

Кажется нашел файл отвечающий за скриптовое переключение гранат, но при добавлении его в игру ничего не поменялось, как не работало так и не работает, может игра не видит файл, может прописать где-то надо? Посмотрите кто-нибудь пожалуйста, есть тут что-то по переключению или нет, а то я пока в этом не понимаю увы, файл определил по названию ogse_grenade_switcher и то что в нем про гранаты и вроде про клавиши написано, могу ошибаться.

Вот содержание 

 

function attach(sm)
sm:subscribe({signal = "on_key_down", fun = this.on_key_down})
end

local grenades_sequence = {"grenade_f1", "grenade_rgd5", "grenade_light", "grenade_gd-05", "grenade_gas"}
local sect2key = {}
for i,sec in ipairs(grenades_sequence) do sect2key[sec] = i end

function on_key_down(key, bind)
if bind ~= key_bindings.kWPN_NEXT then return end
local act = db.actor
if act:active_slot() ~= 3 then return end
local gren = act:active_item()
if not gren then return end
local gren_sec = gren:section()
local start_pos = sect2key[gren_sec]
ASSERT(start_pos, "ogse_grenade_switcher.on_key_down: unregistered grenade section '"..gren_sec.."'")

for pos = start_pos,start_pos+#grenades_sequence-2 do
local cur_sec = grenades_sequence[math.fmod(pos, #grenades_sequence) + 1]
local gren_new = act:object(cur_sec)
if gren_new then
db.actor:move_to_ruck(gren)
db.actor:move_to_slot_and_activate(gren_new)
return true
end
end
end


 

Ссылка на комментарий
@GROM_27, файл подключается через систему событий ОГСЕ к каллбэку на нажатие клавиш в bind_stalker. Так как у тебя в моде ее, вернее всего, нет, то нужно просто добавить в bind_stalker этот каллбэк и в него добавить вызов ogse_grenade_switcher.on_key_down(dik, dik_to_bind(dik)). Ну, и убрать лишние секции из списка гранат. И функцию ASSERT закомментировать, т.к. у тебя ее, наверно, тоже нет.

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

Есть вот такие

 

 

self.object:set_callback(callback_ex.on_key_press, nil)

self.object:set_callback(callback_ex.on_key_press, self.on_key, self)

 

 

И с key_down

 

 

function actor_binder:on_key(key)
ogse_debug.process_actor("key", 1)
ogse.on_key(key, dik_to_bind(key))
ogse_debug.process_actor("key", 0)
self.am:call("on_key_down", key, dik_to_bind(key))
event("key_down"):trigger({key = key, bind = dik_to_bind(key)})
end

 


Сегодня читал разную информацию про скрипты, ну пока мало что понял, буду стараться освоить) а пока в этих кодах не разберусь без помощи)

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

Оно, ага. Значит, теперь тебе надо найти число, которому равен callback_ex.on_key_press. Поищи таблицу callback_ex по скриптам, в ней нужно значене поля on_key_press. Его и пиши в биндере.

 

-- это в net_destroy
self.object:set_callback(число, nil)

-- это в reinit
self.object:set_callback(число, self.on_key, self)

-- а это где-нибудь вне функций.
function actor_binder:on_key(key)
    ogse_grenade_switcher.on_key_down(key, dik_to_bind(key))
end
Если не будет работать, то еще в начале net_spawn добавить:

set_extension_flags(16)

И в конце net_destroy:

set_extension_flags(0)

 

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

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

Понял, спасибо!  :)  Буду пробовать


Я так понимаю числа вот эти?

 

 

-- коды дополнительных колбеков
callback_ex = {
["on_key_press"] = 123,
["on_key_release"] = 124,
["on_key_hold"] = 125,
["on_mouse_wheel"] = 126,
["on_mouse_move"] = 127,

["on_belt"] = 130,
["on_ruck"] = 131,
["on_slot"] = 132,

["on_inv_box_put_item"] = 151,
["entity_alive_before_hit"] = 152,
["dbg_gg_distance_failed"] = 153,
["update_addons_visibility"] = 154,
["update_hud_addons_visibility"] = 155,
["on_before_use_item"] = 156;

["pda_contact"] = 180,

 

 

 

 

["on_key_press"] = 123,


В OGSE, в net_destroy вот так всё выглядит

 

 

function actor_binder:net_destroy()
if(actor_stats.remove_from_ranking~=nil)then
actor_stats.remove_from_ranking(self.object:id())
end
-- game_stats.shutdown ()
set_extensions_flags(0)
db.del_actor(self.object)

sr_light.clean_up ()

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.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.use_object, nil)

self.object:set_callback(callback.on_key_press, nil)
self.object:set_callback(callback.on_key_release, nil)
self.object:set_callback(callback.on_key_hold, nil)
self.object:set_callback(callback.on_mouse_wheel, nil)
self.object:set_callback(callback.on_mouse_move, nil)
self.object:set_callback(callback.on_belt, nil)
self.object:set_callback(callback.on_ruck, nil)
self.object:set_callback(callback.on_slot, nil)
self.object:set_callback(callback.hit, nil)

self.object:set_callback(callback.dbg_gg_distance_failed, nil)

self.object:set_callback(callback.entity_alive_before_hit, nil)
self.object:set_callback(callback.on_before_use_item, nil)

if sr_psy_antenna.psy_antenna then
sr_psy_antenna.psy_antenna:destroy()
sr_psy_antenna.psy_antenna = false
end

xr_sound.stop_all_sound_object()

ogse.on_net_destroy()
self.am:call("on_destroy")
event("actor_destroy"):trigger()
end

 


Мне же всё это не нужно, только строка где self.object:set_callback(callback_ex.on_key_press, nil)?


Видимо я что-то не так сделал, вот что я сделал

 

function actor_binder:net_destroy()
self.object:set_callback(callback_ex.on_key_press, nil)

set_extension_flags(0)

end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:reinit()
self.object:set_callback(callback_ex.on_key_press, self.on_key, self)
end

function actor_binder:on_key(123)
ogse_grenade_switcher.on_key_down(key, dik_to_bind(key))
end

 

 

 

Получил такой вылет

 

 

Expression : fatal error
Function : CScriptEngine::lua_error
File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
Line : 73
Description :
Arguments : LUA error: ...А.Л.К.Е.Р. Тень Чернобыля\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value)

 

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

Собственно, есть урок по вызову скриптов через горячую клаавишу без выхода в меню: http://stalkerin.gameru.net/wiki/index.php?title=%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%D0%BC_%D0%B3%D0%BE%D1%80%D1%8F%D1%87%D0%B8%D1%85_%D0%BA%D0%BD%D0%BE%D0%BF%D0%BE%D0%BA._%D0%A7%D0%B0%D1%81%D1%82%D1%8C_3.

 

Куда данный скрипт нужно подключать?

 

Желательно дать конкретный пример для новичка :)


К сожалению, отредактировать предыдущее сообщение более не могу. В ссылке точка в конце обязательна. Тык.

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

Спасибо! Посмотрю, может разберусь)


Подключать я это хочу к моду, который пытаюсь делать) Реализовать правку движка на новые слоты не удалось, мне посоветовали взять папку bin от OGSE, новы слоты появились, но как оказалось в движке OGSE есть какой-то баг по переключению типа гранат, но в моде есть скрипт, позволяющий имправить эту проблему, вот я пытаюсь найти как мне это сделать

Ссылка на комментарий
@GROM_27, так не надо все удалять из функций в bind_stalker. Допиши, чего не хватает, и все. И про set_extensions_flags не забудь. С гранатами - не баг, просто отключено движковое переключение из-за того, что оно глючное само по себе. Изменено пользователем naxac

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

По поводу удалять или нет, ну тот код который я скинул выше, так вот в моём bind_stalker из чистого ТЧ, такого кода вообще я не видел, тогда я его целиком из OGSE получается копируют и вставляют в свой bind_stalker?

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

Конечно, точно такого нет. Но методы класса биндера-то те же самые есть: net_destroy, reinit, net_spawn - в них и добавляй по аналогии с другими. Я ж тебе писал.

 

function actor_binder:net_spawn(data) -- вот это есть
  set_extensions_flags(16) -- это добавить
...
end -- это тоже есть
...
function actor_binder:reinit()  - есть
...
  self.object:set_callback(123, self.on_key, self) -- добавить
...
end  -- есть
...
function actor_binder:net_destroy()  -- есть
 set_extensions_flags(0)  -- добавить
...
  self.object:set_callback(123, nil)   - добавить
...
end  -- есть
П.с.: где многоточие - это типа пропущены куски кода, не надо его писать.

 

Вроде всё понятно жи.

Изменено пользователем naxac
  • Спасибо 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

Сегодня пробовать буду :-) Может не совсем по теме, но где можно найти самые основы написания скриптов как этому научиться, есть статьи для тех кто вообще ничего не знает) или может вообще начать изучение например с Турбо Паскаль?))) Мне один человек это посоветовал, говорит что зная Турбо Паскаль, у меня уже основа для понимания будет)

Ссылка на комментарий
@GROM_27, Stalke Inside + справочное руководство по Lua + изучение файлов игры + гугл + поиск по форуму + побольше свободного времени. Больше ничего и не надо.
  • Спасибо 1
  • Согласен 1
  • Полезно 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

Что-то не работает, я думаю может код 123  on_key_press не правильно указан, я его то из OGSE взял, сейчас вспомнил, в чистом ТЧ наверно другой? В OGSE это значение написано в  _g.script, в ТЧ в этом файле нет таких значений , видимо где-то в другом файле, а так вот что у меня получилось

 

 

function actor_binder:net_spawn(data)
set_extensions_flags(16)

printf("actor net spawn")

level.show_indicators()

self.bCheckStart = true
self.weapon_hide = false -- спрятано или нет оружие при разговоре.
weapon_hide = false -- устанавливаем глобальный дефолтовый флаг.

if object_binder.net_spawn(self,data) == false then
return false
end

 

 

function actor_binder:net_destroy()
set_extensions_flags(0)
if(actor_stats.remove_from_ranking~=nil)then
actor_stats.remove_from_ranking(self.object:id())
end
-- game_stats.shutdown ()
db.del_actor(self.object)

sr_light.clean_up ()

self.object:set_callback(123, 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.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)

if sr_psy_antenna.psy_antenna then
sr_psy_antenna.psy_antenna:destroy()
sr_psy_antenna.psy_antenna = false
end

xr_sound.stop_all_sound_object()

object_binder.net_destroy(self)
end

 

 

function actor_binder:reinit()
object_binder.reinit(self)

local npc_id = self.object:id()

db.storage[npc_id] = { }

self.st = db.storage[npc_id]
self.st.pstor = nil

self.next_restrictors_update_time = -10000

self.object:set_callback(123, self.on_key, 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.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)
end

----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_key(key)
ogse_grenade_switcher.on_key_down(key, dik_to_bind(key))
end
----------------------------------------------------------------------------------------------------------------------






 


Ничего не удалял, просто добавил строки 

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

Попробую поменять значение на 15


К сожалению не помогло, всё так же. Почему-то на счетчике показывается только количество того вида гранат которая в руке, если имеется Ф1 - 5 шт и РГД-5 - 7 шт, если у ГГ в руке будет к примеру РГД, то на счетчике будет 7, а не 12, это так и должно быть? Я просто не помню как в оригинале, патроны знаю считается общее количество всех типов, обычные и бронебойные общим количеством.

Ссылка на комментарий
@GROM_27, даже и незнаю, считать это недостатком или фичей?))) скорее всего это одна из правок движка, по моему в чн потроны и гранаты при подсчете тоже не разбивались по типам, а вот в зп такое есть. А как сейчас с потронами у тебя, так же или постарому? Изменено пользователем UriZzz

 Моя нычкаНычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

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

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

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

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

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

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

Войти

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

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

×
×
  • Создать...