X-Ray extensions - Страница 81 - Скрипты / конфиги / движок - AMK Team
Перейти к контенту

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

пишу так:

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

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, предположительно - не оно? "Пошурши" по форуму на предмет использования.

@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/Тема на AP-PRO

naxac.gif

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

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

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

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

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

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

UriZzz.gif

@UriZzz , почитай вики по проекту - многое прояснится.

https://xray-engine.org/index.php?title=X-Ray_extensions

  • Спасибо 1
  • Согласен 2
  • Полезно 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO

naxac.gif

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

@GGG_STALKER , а ты попробуй вместо id инициатора передать, к примеру, 65535.

  • Согласен 1
  • Полезно 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO

naxac.gif

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

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

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

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

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

Войти

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

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

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