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

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

пишу так:

Скрытый текст

if  db.actor:is_on_belt("af_medusa") then

скрипт вешаю на апдейт
Как итог - ничего не происходит, а всё остальное тупо перестаёт работать: (оружие не достаётся, другие скрипты, висящие на апдейте, тоже не функционируют.

следовательно вопрос, что я делаю не так? 
спасибоньки

Убрал кавычки:
 

Скрытый текст

if  db.actor:is_on_belt(af_medusa) then

функция по-прежнему не работает, но всё другое больше не ломается.
Что подскажете? 

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

God save Hatsune Miku!

Ссылка на комментарий
5 часов назад, Labadal сказал:

Что подскажете?

Ну во первых - это в тему скриптования.

Во вторых - ты либо нам показал неполную функцию - либо непонятно, что ты хочешь сделать!? Ну написал ты условие-проверку, "находится ли медуза на поясе" - а дальше то что? Сейчас оно выглядит так: "если на поясе медуза - тогда......." - Что тогда? Ну и конец функции где? Т.е. "end".

  • Согласен 2
 

Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz).
Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб).
Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge.

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор

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

@Labadal

1. Приблизительно так:

local obj = db.actor:object("af_medusa")
if obj and db.actor:is_on_belt(obj) then
--	что-то делаем
end

2. Не совсем понятно желание использования многострадального actor_update вместо специально добавленного в XRE коллбека on_item_belt.

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

@Купер, @Labadal, Не надежное решение.

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

А если у актора, к примеру, две медузы. Одна на поясе, а другая нет. То результат такой проверки непредсказуем.

Использовать on_item_belt будет правильнее, с проверкой секции предмета в нем. Или, если по каким-то соображениям все таки надо это делать на апдейте, то надежное решение потребует итерации инвентаря/пояса в цикле.

  • Нравится 2

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

Ссылка на комментарий
8 часов назад, Romann сказал:

Ну во первых - это в тему скриптования.

Почему в тему скриптования? функция db.actor:is_on_belt - это функция, добавленная проектом Xray extensions, так что логичней спрашивать об этом здесь. 
А что дальше, не важно, проблема заключалась именно с этой новой функцией проверки нахождения предмета на поясе. 

God save Hatsune Miku!

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

@Zander_driver, так вводные изначально туманные, поэтому

18.12.2020 в 08:44, Купер сказал:

Приблизительно так

Медуза выше, разумеется, вполне себе конкретная и определённая Медуза. Никак не "расходник" и множественности в инвентаре не предусматривает. Иначе, естественно.

 

@Labadal, судя по направленности вопросов, интересует "артефактный" переносимый вес, похоже? Можно подглядеть у @RayTwitty в Shadows Addon. Самый, пожалуй, изящный вариант реализации с минимумом "подсебяшных прокладок".

 

  • Спасибо 1
Ссылка на комментарий

Блин, не могу активировать скриптовой келлбэк на выделения контакта в пда...

Пробовал подсмотреть в ОГСЕ, там в таблице кэллбэк называется вроде - pda_contact.

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

self.object:set_callback(callback.pda_contact, self.pda_contact, self)

Функция:

function actor_binder:pda_contact(id)
end

Получаю вылет с таким логом:

Скрытый текст

* Detected CPU: GenuineIntel Pentium-III, F6/M7/S10, 3005.00 mhz, 32-clk 'rdtsc'
* CPU Features: RDTSC, MMX, SSE, SSE2

Initializing File System...
using fs-ltx fsgame.ltx
FS: 29499 files cached, 4052Kb memory used.
Init FileSystem 0.997419 sec
'xrCore' build 3312, Feb 27 2008

Initializing Engine...
Executing config-script "user.ltx"...
[d:\s.t.a.l.k.e.r\stalker-shoc\user.ltx] successfully loaded.
Starting INPUT device...
Loading DLL: xrRender_R2.dll
Loading DLL: xrGame.dll
xrGame.dll Start adress: 3fe0000
* [win32]: free[4065184 K], reserved[47652 K], committed[81404 K]
* [ D3D ]: textures[0 K]
* [x-ray]: crt heap[6346 K], process heap[669 K], game lua[0 K], engine lua[0 K], render[0 K]
* [x-ray]: economy: strings[1619 K], smem[0 K]
Executing config-script "d:\s.t.a.l.k.e.r\gamedata\config\default_controls.ltx"...
! cant convert dik_name for dik[144], prop=[
[d:\s.t.a.l.k.e.r\gamedata\config\default_controls.ltx] successfully loaded.
Executing config-script "user.ltx"...
Executing config-script "d:\s.t.a.l.k.e.r\gamedata\config\rspec_default.ltx"...
[d:\s.t.a.l.k.e.r\gamedata\config\rspec_default.ltx] successfully loaded.
Executing config-script "d:\s.t.a.l.k.e.r\gamedata\config\default_controls.ltx"...
[d:\s.t.a.l.k.e.r\gamedata\config\default_controls.ltx] successfully loaded.
[d:\s.t.a.l.k.e.r\stalker-shoc\user.ltx] successfully loaded.
SOUND: OpenAL: enumerate devices...
SOUND: OpenAL: EnumerationExtension Present
devices Generic Hardware
SOUND: OpenAL: system  default SndDevice name is Generic Hardware
SOUND: OpenAL: default SndDevice name set to Generic Software
SOUND: OpenAL: All available devices:
1. Generic Software, Spec Version 1.1 (default)
2. Generic Software, Spec Version 1.1 (default)
SOUND: OpenAL: SelectBestDevice is Generic Software 1.1
SOUND: OpenAL: Required device: Generic Software. Created device: Generic Software.
* sound: EAX 2.0 extension: absent
* sound: EAX 2.0 deferred: absent
* sound : cache: 65538 kb, 7609 lines, 8820 bpl
Starting RENDER device...
* GPU [vendor:10DE]-[device:622]: NVIDIA GeForce 9600 GT (Microsoft Corporation - WDDM v1.1)
* GPU driver: 8.15.11.8593
* CREATE: DeviceREF: 1
* Vertex Processor: PURE HARDWARE
*     Texture memory: 2784 M
*          DDI-level: 9.0
* GPU shading: vs(fffe0300/3.0/30), ps(ffff0300/3.0/30)
* GPU vertex cache: recognized, 24
* DVB created: 6144K
* DIB created: 512K
! Version conflict in shader 'def_shaders\def_aref'
! Version conflict in shader 'def_shaders\def_aref_v'
! Version conflict in shader 'def_shaders\def_trans'
! Version conflict in shader 'def_shaders\def_trans_v'
! Version conflict in shader 'def_shaders\def_trans_v_tuchi'
! Version conflict in shader 'def_shaders\lod_old'
! Renderer doesn't support blender 'effects\shadow_world'
! Version conflict in shader 'effects\watertest-1'
count of .thm files=16
load time=99 ms
* NULLRT supported
* ...and used
* HWDST/PCF supported and used
* NV-DBT supported and used
- r__tf_aniso 4
- r2_tf_mipbias 0.
Starting engine...
Loading DLL: xrGameSpy.dll
* DVB created: 6144K
* DIB created: 512K
- r__tf_aniso 4
- r2_tf_mipbias 0.
* GPU shading: vs(fffe0300/3.0/30), ps(ffff0300/3.0/30)
* GPU vertex cache: recognized, 24
*** RESET [615 ms]
"d:\s.t.a.l.k.e.r\bin\xr_3da.exe" 
* phase time: 0 ms
* phase cmem: 103570 K
Кэширование объектов...
Loading objects...
Loading models...
* [prefetch] time:    7369 ms
* [prefetch] memory:  82461Kb
* phase time: 7408 ms
* phase cmem: 175164 K
Сервер: Старт...
* phase time: 54 ms
* phase cmem: 175387 K
Сервер: Загрузка симуляции жизни...
* phase time: 7 ms
* phase cmem: 175387 K
Создание новой игры...
* Creating new game...
* Loading spawn registry...
* 8642 spawn points are successfully loaded
* Saving spawns...
* Saving objects...
* 17343 objects are successfully saved
* Game all.sav is successfully saved to file 'd:\s.t.a.l.k.e.r\stalker-shoc\savedgames\all.sav'
* New game is successfully created!
* phase time: 3719 ms
* phase cmem: 219150 K
Сервер: Соединяемся...
MaxPlayers = 32
* phase time: 39 ms
* phase cmem: 219167 K
Клиент: Соединение с localhost...
# Player not found. New player created.
* client : connection accepted - <>
* phase time: 8 ms
* phase cmem: 219191 K
Открытие потока...
* phase time: 16 ms
* phase cmem: 223190 K
Загрузка формы объектов...
* phase time: 3274 ms
* phase cmem: 295858 K
Загрузка шейдеров...
* phase time: 312 ms
* phase cmem: 297850 K
Загрузка геометрии...
* phase time: 63 ms
* phase cmem: 298210 K
Загрузка базы пространств...
* phase time: 563 ms
* phase cmem: 302526 K
Загрузка детальных объектов...
* [DETAILS] VertexConsts(256), Batch(61)
* [DETAILS] 40687 v(20), 26352 p
* [DETAILS] Batch(61), VB(794K), IB(154K)
* phase time: 67 ms
* phase cmem: 310764 K
Загрузка секторов и порталов...
* Loading HOM: d:\s.t.a.l.k.e.r\gamedata\levels\l01_escape\level.hom
* phase time: 14 ms
* phase cmem: 310938 K
Загрузка ИИ объектов...
- Loading music tracks from 'l01_escape_musics'...
* phase time: 79 ms
* phase cmem: 306978 K
Клиент: Создание...
- Game configuring : Started 
- Game configuring : Finished 
* phase time: 310 ms
* phase cmem: 315189 K
Загрузка текстур...
* t-report - base: 1472, 532800 K
* t-report - lmap: 5, 5120 K
* phase time: 4922 ms
* phase cmem: 315189 K
Клиент: Синхронизация...
* phase time: 35 ms
* phase cmem: 315189 K
* [win32]: free[2794284 K], reserved[102296 K], committed[1297660 K]
* [ D3D ]: textures[537921 K]
* [x-ray]: crt heap[315189 K], process heap[7977 K], game lua[26496 K], engine lua[237 K], render[0 K]
* [x-ray]: economy: strings[4332 K], smem[28197 K]
 
FATAL ERROR
 
[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: ...\s.t.a.l.k.e.r\gamedata\scripts\ogsm_function.script:101: attempt to index field 'actor' (a nil value)
 

stack trace:

Пытался сделать по аналогии с shadows addon 0.8, такая же фигня в логе, ЧЯДНТ?

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

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

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

UriZzz.gif

Ссылка на комментарий
Только что, UriZzz сказал(а):

scripts\ogsm_function.script:101: attempt to index field 'actor' (a nil value)

Ну явно что не колбеки тому причиной...

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

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

@Zander_driver да в том то и дело что в нём самом. Вылет пропал когда я закомментировал выше мной написанные строки:facepalm:

  • Не нравится 1

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

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

UriZzz.gif

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

Полного кода ты нигде не показывал. В том, что показывал, переменная actor даже не упоминается - т.е. на наличие/отсутствие того вылета, влиять не может. И настаиваешь на всякой чертовщине...

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

  • Нравится 1
  • Не нравится 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

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

@Zander_driver я знаю что сборка работала стабильно, до того как я попытался активировать кэллбэк. После добавления соответствующих строк в function actor_binder:net_destroy() и function actor_binder:reinit(), а также прописания соответствующей функции:

function actor_binder:pda_contact(id)
end

Сборка и начала вылетать с таким логом.

Мне ни нужны Кашпировские и разные Аланы Чумаки, я хочу понять как активировать кэллбэк на выделение контакта в ПДА.

Я не знаю что ещё показать... Если ты считаешь меня совсем глупым то вот содержание bind_stalker.script

Скрытый текст

function init    (obj)
    xr_motivator.AddToMotivator(obj)
end

function actor_init    (npc)
    npc:bind_object(actor_binder(npc))
end

local game_difficulty_by_num = {
    [0] = "gd_novice",
    [1] = "gd_stalker",
    [2] = "gd_veteran",
    [3] = "gd_master"
    }

lasthealth  = 0
lasttime    = 0
post_process = 0
local weapon_hide = false
----------------------------------------------------------------------------------------------------------------------
class "actor_binder" (object_binder)
----------------------------------------------------------------------------------------------------------------------
function actor_binder:__init (obj) super(obj)
    self.bCheckStart = false
    self.weather_manager = level_weathers.WeatherManager()
    self.actor_detector = xr_detector.actor_detector()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:net_spawn(data)

    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

    db.add_actor(self.object)
    
    if self.st.disable_input_time == nil then
        level.enable_input()
    end

    self.weather_manager:reset()
--    game_stats.initialize ()

    if(actor_stats.add_to_ranking~=nil)then
        actor_stats.add_to_ranking(self.object:id())
    end

    --' Загружаем настройки дропа
    death_manager.init_drop_settings()

    amk.on_game_load()

    -- Очищаем уровни от бесхозного оружия
    remove_weapons.off_weapons()    

    if xrs_ai then xrs_ai.actor_net_spawn(self) end

    return true
end

-- ------------------------------------------------------------------
-- схема за 05.07.2015 от makdm с правками от Zander_driver
-- В начале игры удаляем все объекты ставящие себе ID от левелчейнжера в качестве PARENT_ID
-- что приводит к битью сейвов и вылету движка по CHILD REGISTERED BUT NOT FOUND

local parent_id = {}
local remove_sobj = {}
local i = 1
-- Пробегаем по объектам и айдишники всех level_changer помещаем в талицу
while i < 65535 do 
    local sobj = alife():object( i )
    if sobj and sobj:clsid() == clsid.level_changer then
        parent_id[ sobj.id ] = sobj.id
    end
    i = i + 1
end
-- Пробегаем по объектам и все child level_changer помещаем в талицу
for n = 1, 65534 do
    local sobj = alife():object( n )
    if sobj then
        for k,v in pairs( parent_id ) do
            if sobj.parent_id == v then 
                table.insert(remove_sobj, sobj.id)
            end
        end
    end
end
--Удаляем child level_changer
for _k,_v in pairs( remove_sobj ) do
    local sobj_for_remove = alife():object(_v)
    if sobj_for_remove then
        alife():release(sobj_for_remove, true)
    end
end

----------------------------------------------------------------------------------------------------------------------
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 ()
    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.select_pda_contact, 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(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)
    self.object:set_callback(callback.use_object, self.use_object, self)
    self.object:set_callback(callback.select_pda_contact, self.select_pda_contact, self)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:take_item_from_box(box, item)
    local story_id = box:story_id()
    if story_id == nil then
        return
    end

    treasure_manager.take_item_from_box(box, story_id)

end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:level_border_enter(npc, info_id)
    self.actor_detector:actor_enter()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:level_border_exit(npc, info_id)
    self.actor_detector:actor_exit()
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:info_callback(npc, info_id)

    --' Сюжет
    level_tasks.proceed(self.object)
    -- Отметки на карте
    level_tasks.process_info_portion(info_id)

    amk.on_actor_info(info_id)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_trade (item, sell_bye, money)
    if sell_bye == true then
       game_stats.money_trade_update (money)
    else       
       game_stats.money_trade_update (-money) 
    end   
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:article_callback(npc, group, name, article_type)
    --printf("article_callback [%s][%s]", group, name)
    if device().precache_frame >1 then return end
    
    if group == "Diary" then
        news_manager.send_encyclopedy("diary", group)
        amk.send_tip(game.translate_string(name), "Заметка в журнале:", nil, 7)
    elseif group == "Mutants" then
        news_manager.send_encyclopedy("encyclopedy", group)
        amk.send_tip(game.translate_string(name), "Заметка о мутантах:", nil, 7)
    elseif group == "Social" then
        news_manager.send_encyclopedy("encyclopedy", group)
        amk.send_tip(game.translate_string(name), "Информация о группировке:", nil, 7)
    elseif group == "Artifacts" then
        news_manager.send_encyclopedy("encyclopedy", group)
        amk.send_tip(game.translate_string(name), "Заметка об артефактах:", nil, 7)
    elseif group == "Anomalies" then
        news_manager.send_encyclopedy("encyclopedy", group)
        amk.send_tip(game.translate_string(name), "Заметка об аномалиях:", nil, 7)
    elseif group == "Locations" then
        news_manager.send_encyclopedy("encyclopedy", group)
        amk.send_tip(game.translate_string(name), "Информация о локации:", nil, 7)
    elseif group == "Zone-story" then
        news_manager.send_encyclopedy("encyclopedy", group)
        amk.send_tip(game.translate_string(name), "История Зоны:", nil, 7)
    elseif group == "Stories" then
        news_manager.send_encyclopedy("encyclopedy", group)
        amk.send_tip(game.translate_string(name), "Местный фольклор:", nil, 7)
    elseif group == "memuars" then
        news_manager.send_encyclopedy("encyclopedy", group)
        amk.send_tip(game.translate_string(name), "Личная заметка:", nil, 7)
    elseif group == "Found_PDA" then
        news_manager.send_encyclopedy("encyclopedy", group)
        amk.send_tip(game.translate_string(name), "Скачаны данные:", nil, 7)
    elseif group == "st_operation_agroprom" or group == "LabX18_information" or group == "aes_military_task" then
        news_manager.send_encyclopedy("encyclopedy", group)
        amk.send_tip(game.translate_string(name), "Заметка в журнале:", nil, 7)
    end
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_take (obj)
    level_tasks.proceed(self.object)
    ogsm_function.outfit_fix(obj)
    --game_stats.update_take_item (obj, self.object)
    if xrs_ai then xrs_ai.actor_item_take(obj) end
    if obj:clsid() == clsid.wpn_ammo then
        dunin_ammo.on_take(obj)
    end
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_drop (obj)
    level_tasks.proceed(self.object)
    --game_stats.update_drop_item (obj, self.object)
    amk.on_item_drop(obj)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:use_object(obj)
    ogsm_quests.use_items(obj)    
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:select_pda_contact(id)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:task_callback(_task, _objective, _state)
    task_manager.task_callback(_task:get_id(), _objective:get_idx(), _state)
    if _objective:get_idx() == 0 then
        if _state == task.fail then
            news_manager.send_task(db.actor, "fail", _task, _objective)
        elseif _state == task.completed then
            task_manager.reward_by_task(_task)
            news_manager.send_task(db.actor, "complete", _task, _objective)
        else
            news_manager.send_task(db.actor, "new", _task, _objective)
        end
    else
        if _task:get_objective(0):get_state() == task.in_progress then
            news_manager.send_task(db.actor, "update", _task, _objective)
        end
    end
end

----------------------------------------------------------------------------------------------------------------------
function actor_binder:map_location_added_callback(spot_type_str, object_id)
    if (false==app_ready()) or (device().precache_frame>1) then return end
    --'news_manager.send_task(db.actor, "new")
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:update(delta)
    object_binder.update(self, delta)

    -- DEBUG slowdown
--    slowdown.update()

    local time = time_global()
    
    game_stats.update (delta, self.object)

    -- Обновление сна
    if sleep_manager.is_sleep_active() and xr_conditions.actor_dead() then
        xr_logic.issue_event(db.actor, db.storage[db.actor:id()]["ar_sleep"], "update")
    end

    -- апдейт погоды
    self.weather_manager:update()
    
    -- апдейт схемы детектора
    self.actor_detector:update()

    -- апдейт звуковой схемы актера
    xr_sound.update_actor()
    
    --' Проверка потери жизни
--[[
    if self.object.health - lasthealth > 0.001 or
       self.object.health - lasthealth < -0.001 then
        lasthealth = self.object.health
        lasttime = game.time()
    end
]]    
    -- Обновление отключения ввода с клавиатуры.
    if self.st.disable_input_time ~= nil and
       game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle 
    then
        level.enable_input()
        self.st.disable_input_time = nil
    end
    -- Обновление сна с переносом чувака в указанную позицию
    if self.st.sleep_relocate_time ~= nil and
       game.get_game_time():diffSec(self.st.sleep_relocate_time) >= self.st.sleep_relocate_idle 
    then
        self.object:set_actor_position(self.st.sleep_relocate_point)
        local dir = self.st.sleep_relocate_point:sub(self.st.sleep_relocate_look)
        self.object:set_actor_direction(dir:getH())
        self.st.sleep_relocate_time = nil
    end

    -- Апдейт прятание оружия игрока во время диалога
    if weapon_hide == true or self.object:is_talking() then
        if self.weapon_hide == false then
            self.object:hide_weapon()
            self.weapon_hide = true
        end
    else
        if self.weapon_hide == true then
            self.object:restore_weapon()
            self.weapon_hide = false
        end
    end    

    -- обновление рестрикторов, которые под логикой, срабатывает через интервалы времени
    if self.next_restrictors_update_time < time then
        bind_restrictor.actor_update(delta)

        self.next_restrictors_update_time = time + 200

        task_manager.actor_update()
    end

    -- обновление постпроцессов
    if post_process ~= 0 then
        if post_process:update () == true then
           post_process = 0
        end
    end

    -- обновление пси-антенны
    if sr_psy_antenna.psy_antenna then
        sr_psy_antenna.psy_antenna:update(delta)
    end

    --' Вывод сообщения о большой радиации
    if self.object.radiation >= 0.7 then
        local hud = get_hud()
        local custom_static = hud:GetCustomStatic("cs_radiation_danger")
        if custom_static == nil then
            hud:AddCustomStatic("cs_radiation_danger", true)
            hud:GetCustomStatic("cs_radiation_danger"):wnd():SetTextST("st_radiation_danger")
        end
    else
        local hud = get_hud()
        local custom_static = hud:GetCustomStatic("cs_radiation_danger")
        if custom_static ~= nil then
            hud:RemoveCustomStatic("cs_radiation_danger")
        end
    end

    -- Запускаем затычку от возможной потери содержимого тайников
    treasure_manager.get_treasure_manager():loss_workaround()


     if self.bCheckStart then

        if not has_alife_info("storyline_actor_start") and
           (level.name() == "l01_escape")
        then
            self.object:give_info_portion("storyline_actor_start")
            _G.g_start_avi = true
        end

--        if not has_alife_info("encyclopedy") then
--            self.object:give_info_portion("encyclopedy")
--        end

        if not has_alife_info("global_dialogs") then
            self.object:give_info_portion("global_dialogs")
        end

        if not has_alife_info("level_changer_icons") then
            self.object:give_info_portion("level_changer_icons")
        end

        level_tasks.add_lchanger_location()

        self.bCheckStart = false        
    end        

    -- Обновление актора
    amk.on_actor_update()

    -- Обновление АИ-пака
    if xrs_ai then xrs_ai.actor_update(delta) end

    -- Обновление упаковщика патронов
    if not self.object:is_talking() then
        dunin_ammo.on_update()
    end

    --ссылаемся на секцию спринта
    self:hud_sprint_animation()

end

----------------------------------------------------------------------------------------------------------------------
--спринт by RayTwitty

local sprint = false
local last_active_item_id = 0
function actor_binder:hud_sprint_animation()
    local active_item = self.object:active_item()
    if active_item and last_active_item_id ~= active_item:id() then
        last_active_item_id = active_item:id()
        sprint = false
    end
    if active_item and (active_item:is_knife() or active_item:is_missile()) then
        if (active_item:get_hud_item_state() == 0 and active_item:is_knife()) or (active_item:get_hud_item_state() == 2 and active_item:is_missile()) then
            if self.object:is_actor_sprinting() then
                if not sprint then
                    active_item:play_hud_animation(system_ini():r_string(active_item:section().."_hud", "anim_idle_sprint"), true)
                    sprint = true
                end
            elseif sprint then
                active_item:play_hud_animation(system_ini():r_string(active_item:section().."_hud", "anim_idle"), true)
                sprint = false
            end
        elseif sprint then
            sprint = false
        end
    end
end

----------------------------------------------------------------------------------------------------------------------
function actor_binder:save(packet)
    local pk1 = fake_net_packet.fake_net_packet()
    self:save_old(pk1)
    -- get_console():execute("Packet_size_is_"..pk1:w_tell())
    if pk1:w_tell() > 7500 then
        task_manager.cleanup_actor()
    end
    self:save_old(packet)
end 

function actor_binder:save_old(packet)


    local save_treasure_manager = true

    object_binder.save(self, packet)

    --' Сохраняем уровень сложности
    if save_treasure_manager == true then
        packet:w_u8(level.get_game_difficulty() + 128)
    else
        packet:w_u8(level.get_game_difficulty())
    end


    --' Сохраняем данные об отключенном вводе
    if self.st.disable_input_time == nil then
        packet:w_bool(false)
    else
        packet:w_bool(true)
        utils.w_CTime(packet, self.st.disable_input_time)
    end

    xr_logic.pstor_save_all(self.object, packet)
    self.weather_manager:save(packet)

    sr_psy_antenna.save( packet )

    if save_treasure_manager == true then
        treasure_manager.save(packet)
    end

    task_manager.save(packet)
    self.actor_detector:save(packet)    

-- ------------------------------------------------------------------
-- схема за 05.07.2015 от makdm с правками от Zander_driver
-- перед сейвом удаляем все объекты ставящие себе ID от левелчейнжера в качестве PARENT_ID
-- что приводит к битью сейвов и вылету движка по CHILD REGISTERED BUT NOT FOUND

    local parent_id = {}

    local remove_sobj = {}
    local i = 1
-- Пробегаем по объектам и айдишники всех level_changer помещаем в талицу
    while i < 65535 do 
        local sobj = alife():object( i )
        if sobj and sobj:clsid() == clsid.level_changer then
            parent_id[ sobj.id ] = sobj.id
        end
        i = i + 1
    end
-- Пробегаем по объектам и все child level_changer помещаем в талицу
    for n = 1, 65534 do
        local sobj = alife():object( n )
        if sobj then
            for k,v in pairs( parent_id ) do
                if sobj.parent_id == v then
                    table.insert(remove_sobj, sobj.id)
                end
            end
        end
    end
--Удаляем child level_changer
    for _k,_v in pairs( remove_sobj ) do
        local sobj_for_remove = alife():object(_v)
        if sobj_for_remove then
            alife():release(sobj_for_remove, true)
        end
    end
-- ------------------------------------------------------------------
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:load(reader)
    object_binder.load(self, reader)

    --' Загружаем уровень сложности
    local game_difficulty = reader:r_u8()

    local load_treasure_manager = false      
    if game_difficulty >= 128 then           
        game_difficulty = game_difficulty - 128
        load_treasure_manager = true           
    end

    get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])

    if reader:r_eof() then
        abort("SAVE FILE IS CORRUPT")
    end

    local stored_input_time = reader:r_u8()
    if stored_input_time == true then
        self.st.disable_input_time = utils.r_CTime(reader)
    end

    xr_logic.pstor_load_all(self.object, reader)
    self.weather_manager:load(reader)

    sr_psy_antenna.load(reader)

    if load_treasure_manager == true then
        treasure_manager.load(reader)
    end

    task_manager.load(reader)
    self.actor_detector:load(reader)    

-- ------------------------------------------------------------------
-- схема за 05.07.2015 от makdm с правками от Zander_driver
-- в конце загрузки удаляем все объекты ставящие себе ID от левелчейнжера в качестве PARENT_ID
-- что приводит к битью сейвов и вылету движка по CHILD REGISTERED BUT NOT FOUND

    local parent_id = {}
    local remove_sobj = {}
    local i = 1
-- Пробегаем по объектам и айдишники всех level_changer помещаем в талицу
    while i < 65535 do 
        local sobj = alife():object( i )
        if sobj and sobj:clsid() == clsid.level_changer then
            parent_id[ sobj.id ] = sobj.id
        end
        i = i + 1
    end
-- Пробегаем по объектам и все child level_changer помещаем в талицу
    for n = 1, 65534 do
        local sobj = alife():object( n )
        if sobj then
            for k,v in pairs( parent_id ) do
                if sobj.parent_id == v then 
                    table.insert(remove_sobj, sobj.id)
                end
            end
        end
    end
--Удаляем child level_changer
    for _k,_v in pairs( remove_sobj ) do
        local sobj_for_remove = alife():object(_v)
        if sobj_for_remove then
            alife():release(sobj_for_remove, true)
        end
    end
-- ------------------------------------------------------------------
end
----------------------------------------------------------------------------------------------------------------------

-- Weapon functions
function hide_weapon()
    weapon_hide = true
end
function restore_weapon()
    weapon_hide = false
end

Это взято из shadows addon 0.8

А вот файл в котором якобы ошибка:

Скрытый текст

----------- Дополнительные функции и фиксы для OGSM 2.x ------------
-------------- Copyright 2007-2008 DEXXX, lvg_brest ----------------

-- Создание "убийственной зоны" на Радаре
function check_radar_off()
    if (level.name() == "l10_radar") then
        if not has_alife_info("bar_deactivate_radar_done") then
            local pos = db.actor:position()
            if pos.z>65 and pos.x>350 and pos.x<410 then
                if amk.load_variable("rfx",0)==0 then
                    level.add_pp_effector("fire_hit.ppe", 1523, true)
                    level.set_pp_effector_factor(1523, 0.5)
                    amk.save_variable("rfx",1)
                    amk.start_timer("rfx",5)
                end
            end
        end
    end
end

function radar_fix()
    level.remove_pp_effector(1523)
    local pos = db.actor:position()
    if pos.z>65 and pos.x>350 and pos.x<410 then
        db.actor:kill(db.actor)
    end
    amk.del_variable("rfx")
end

-- Багфикс таймеров
function fix_timers()
    for i=1,100 do
        amk.del_variable("rt"..i)
        amk.del_variable("rt"..i.."d")
        amk.del_variable("rt"..i.."p")
        amk.del_variable("gt"..i)
        amk.del_variable("gt"..i.."d")
        amk.del_variable("gt"..i.."p")
    end

    amk.del_variable("rfx")
    amk.del_variable("blt")
    amk.del_variable("drnk")
    amk.del_variable("bl1")
    amk.del_variable("bl2")
    amk.del_variable("bl3")
    amk.del_variable("bl4")
    amk.del_variable("bl5")
    amk.del_variable("bl6")
    amk.del_variable("bl7")
    amk.del_variable("rsp")

    amk.g_start_timer("bl1",0, 24+math.random(-4,4), 0)
    amk.g_start_timer("rsp",0, 4+math.random(-1,1), 0)
    -- get_console():execute("amk.g_start_timers_restart!")
end

-- Удаление при загрузке трупов в Припяти во фриплее и фантомов пси-собак на Радаре, в Припяти, на ЧАЭС
local dist_to_corpses = 150 -- расстояние от ГГ, свыше которого считаются трупы.
local a = 0
local b = 0

function clean_level()
    if has_alife_info("freeplay") and level.name()=="l11_pripyat" and a==0 then
        for i=1,65535 do
            local obj = level.object_by_id(i)
            if obj then
                local posobj = obj:position()
                local actorpos = db.actor:position()
                local npc_name = obj:name()
                if IsStalker(obj) and not obj:alive() and npc_name~="mil_freedom_member0012" and npc_name~="mil_freedom_member0021" and npc_name~="mil_freedom_member0018" and npc_name~="mil_freedom_member0026" and npc_name~="mil_freedom_member0023" then
                    if (posobj:distance_to(actorpos) > dist_to_corpses) then
                        local obj_1 = alife():object(obj:id())
                        if obj_1 then
                            local result = pcall(prot_release_ogd, obj_1)
                        end
                    end
                end
            end
        end
        a = 1
    end
    if (level.name()=="l10_radar" or level.name()=="l11_pripyat" or level.name()=="l12_stancia" or level.name()=="l12_stancia_2") and b==0 then 
        for i=1,100 do
            local obj_1 = alife():object("psy_dog_phantom")
            if obj_1 then
                local result = pcall(prot_release_ogd, obj_1)
            end
        end
        b = 1
    end
end

function prot_release_ogd(obj_1)
    alife():release(obj_1, true)
end

-- Исправление сброса визуала игрока, если в его инвентаре находится более двух костюмов, Shadows
function outfit_fix(obj)
    if string.find(obj:section(),"outfit") then
        local actor_outfit = db.actor:item_in_slot(6) -- Вот эта строчка
        if actor_outfit and actor_outfit:id() ~= obj:id() then db.actor:transfer_item(actor_outfit, db.actor) end
    end
end

--[[

Если вы собираетесь использовать данный скрипт целиком или частично в своих 
разработках по игре S.T.A.L.K.E.R., пожалуйста не удаляйте копирайты, указывайте настоящего 
автора(ов) и не выдавайте чужие идеи и их реализацию за свои. Спасибо за понимание.

]]--
 

Но чем это поможет, сея функция мною будет вырезана за ненадобностью, так как это дело поправлено в движке. Я уже пробовал - отключал её, но вылет сохранился, просто ругань была уже на другое место, и всё так же на field 'actor'.

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

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

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

UriZzz.gif

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

@UriZzz 

Ты пишешь, что добавил кэллбэк pda_contact, а в коде бинд_сталкер прописано select_pda_contact. Так как правильно кэллбэк назван в X-Ray extensions?

  • Нравится 1
Ссылка на комментарий

@AndreySol в том то и дело что не знаю. pda_contact это вроде в OGSE, но там этот кэллбэк не используют. select_pda_contact это в shadows addon 0.8, пробовал и так и так, не получилось. Жду может @НаноБотнарисуется, он вроде ещё возится с xray ext (надеюсь), может он подскажет:(

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

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

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

UriZzz.gif

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

@UriZzz , как называется каллбэк - не важно. В функцию set_callback нужно передавать число. А чтобы callback.select_pda_contact или callback.pda_contact стали числом, надо сделать что-то типа

callback.select_pda_contact = 12345

где 12345 - номер каллбэка. В общем, добавить в класс callback соответствующую переменную, потому что движок сам этого не делает - каллбэк-то "самопальный".

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

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

naxac.gif

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

@naxac ого, для меня это открытие:shok2:

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

Интересно, как оно там делается??? Ну, это риторический вопрос. В ТЧ движке, в ОГСР или просто седьмом патче можно в принципе и в исходниках подсмотреть, если что. А x ray ext для меня черный ящик.

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

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

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

UriZzz.gif

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

Кто нибуть знает как вернуть метод bomb:explose(0) чтоб не назначать инициатора? Это для ЗП. Закоментировать переход на фикс (7 байтный) не помогает...

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

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

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

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

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

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

Войти

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

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

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