Перейти к содержанию

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

 
 

Прописал в логику =disable_anomaly(toz_camp) для костра со стори айди, в СДК у костра стори айди прописан:

Snipaste-2021-10-25-10-38-06.png

Но ловлю вылет:

FATAL ERROR
 
[error]Expression    : !m_error_code
[error]Function      : raii_guard::~raii_guard
[error]File          : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
[error]Line          : 748
[error]Description   : ...r call of pripyat\gamedata\scripts\xr_effects.script:2130: attempt to index local 'obj' (a nil value)

stack trace:

Вроде как жалуется, что не может найти объект с таким айди, но он же прописан. Что я делаю не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

mortan лог закрепил в спойлер, помоги пожалуйста, до определенного момента этого вылета не было. Копался только в конфигах и скриптах. 

Спойлер

* Detected CPU: Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz [GenuineIntel], F6/M14/S10, 2808.00 mhz, 26-clk 'rdtsc'
* CPU features: RDTSC, MMX, 3DNowExt!, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, HTT
* CPU cores/threads: 6/6

Initializing File System...
using fs-ltx fsgame.ltx
FS: 63541 files cached 44 archives, 9630Kb memory used.
Init FileSystem 1.486414 sec
'xrCore' build 7090, Jul  5 2018

EH: D8524A36AF9B3F32084FDA4649221CFA

-----loading c:\program files (x86)\dead air\gamedata\configs\system.ltx
-----loading c:\program files (x86)\dead air\gamedata\configs\system.ltx
Initializing Engine...
Starting INPUT device...
Loading DLL: xrRender_R2.dll
Loading DLL: xrRender_R3.dll
refCount:m_pAdapter 1
Loading DLL: xrRender_R4.dll
command line -dbgdev -no_staging
Executing config-script "user.ltx"...
[appdata\user.ltx] successfully loaded.
Loading DLL: xrRender_R2.dll
Loading DLL: xrGame.dll
* [win32]: free[4036400 K], reserved[60396 K], committed[97444 K]
* [ D3D ]: textures[0 K]
* [x-ray]: process heap[27089 K], game lua[0 K], render[0 K]
* [x-ray]: economy: strings[21896 K], smem[0 K]
SOUND: OpenAL: enumerate devices...
SOUND: OpenAL: EnumerationExtension Present
dir[0]=C:\Program Files (x86)\Dead Air\
dir[1]=C:\Program Files (x86)\Dead Air\
dir[2]=C:\Program Files (x86)\Dead Air\
dir[3]=C:\WINDOWS\system32\
CleanDeviceSpecifierList
CleanDeviceSpecifierList DirectSound Software
devices Generic Software
SOUND: OpenAL: system  default SndDevice name is DirectSound3D
SOUND: OpenAL: All available devices:
1. Generic Software, Spec Version 1.1  eax[2] efx[no] xram[no]
Executing config-script "c:\program files (x86)\dead air\gamedata\configs\default_controls.ltx"...
[c:\program files (x86)\dead air\gamedata\configs\default_controls.ltx] successfully loaded.
Executing config-script "user.ltx"...
Executing config-script "c:\program files (x86)\dead air\gamedata\configs\rspec_extreme.ltx"...
~ Invalid syntax in call to 'r2_sun_quality'
~ Valid arguments: st_opt_low/st_opt_medium/st_opt_high
[c:\program files (x86)\dead air\gamedata\configs\rspec_extreme.ltx] successfully loaded.
Executing config-script "c:\program files (x86)\dead air\gamedata\configs\default_controls.ltx"...
[c:\program files (x86)\dead air\gamedata\configs\default_controls.ltx] successfully loaded.
~ Invalid syntax in call to 'sv_adm_menu_ban_time'
~ Valid arguments: ui_mp_am_10_minutes/ui_mp_am_30_minutes/ui_mp_am_1_hour/ui_mp_am_6_hours/ui_mp_am_1_day/ui_mp_am_1_week/ui_mp_am_1_month/ui_mp_am_3_monthes/ui_mp_am_forever
[appdata\user.ltx] successfully loaded.
SOUND: Selected device is Generic Software
* sound: EAX 2.0 extension: present
* sound: EAX 2.0 deferred: present
* sound : cache: 65537 kb, 4856 lines, 13820 bpl
Starting RENDER device...
* GPU [vendor:10DE]-[device:1B80]: NVIDIA GeForce GTX 1080
* GPU driver: 30.0.14.7168
* CREATE: DeviceREF: 1
* Vertex Processor: PURE HARDWARE
*     Texture memory: 4081 M
*          DDI-level: 9.0
* GPU shading: vs(fffe0300/3.0/30), ps(ffff0300/3.0/30)
* GPU vertex cache: unrecognized, 16
* NVidia MGPU: Logical(1), Physical(1)
* Starting rendering as 2-GPU.
* DVB created: 1536K
* DIB created: 512K
! Renderer doesn't support blender 'effects\shadow_world'
! Version conflict in shader 'models\helicopter'
! Version conflict in shader 'models\lightplanesself'
! Version conflict in shader 'models\model_puh'
! Version conflict in shader 'models\model_refl'
! Version conflict in shader 'models\xbrainglass'
! Version conflict in shader 'models\xdistortcolorlinv'
! Version conflict in shader 'models\xglass'
! Version conflict in shader 'models\xglass2'
! Version conflict in shader 'models\xlens'
stack trace:

0023:00B589B4 xrCore.dll, IReaderBase<IReader>::find_chunk()
0023:061633EB xrRender_R2.dll
0023:061BD156 xrRender_R2.dll
 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

AziatkaVictor , в ЗП регистрация стори айди объектам читается из под скриптов. Обычно регистрация производится внутри скриптовых серверных классов. У костра нет. Если правильно помню, даже скриптового варианта серверного класса нет. Пиши его и добавь чтение и регистрацию айдишника, тут все просто по аналогии.
p.s. Но никто не запрещает регать и из под биндера на пример или откуда-то еще. (пригодится может. Т.К. Не все до экспортировано в луа.)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Ekagors а можно подробнее пожалуйста? Если честно, я не понял что конкретно нужно делать, точнее где и что писать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

AziatkaVictor , осуществляется все в скрипте story_objects.script, вызовом check_spawn_ini_for_story_id(sObj)
то есть story_objects.check_spawn_ini_for_story_id(sObj)
Где sObj - серверный объект. И все. Рега закончена. Читает из секции конфига и из кастюм даты, проверяет есть ли стори айди, то регает.
Пример (вырезка из ПЫС скрипта кусок скриптового серверного класса брони):
 

Спойлер

function se_outfit:on_register()
	cse_alife_item_custom_outfit.on_register( self )
	-- Проверяем кастомдату обьекта на наличие стори айди.
	story_objects.check_spawn_ini_for_story_id(self) --// Вот и оно, это чудо.

	-- Собираем статистику по предметам.
	if registred_items[self:section_name()] == nil then
		registred_items[self:section_name()] = 1
	else
		registred_items[self:section_name()] = registred_items[self:section_name()] + 1
	end

	self.secret_item = treasure_manager.get_treasure_manager():register_item(self)
end

 

P.S. Необязательно регать там. Но ПЫС регают там.

p.s.s По скриптовым серверным классам: Как, что и где связано разберешься сам. Интуитивно понятно, а если нет, то гайдов нет, есть описания по работе с скриптовыми серверными классами, на АМК точно помню было, они даже ценней.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
9 часов назад, AziatkaVictor сказал:

Прописал в логику =disable_anomaly(toz_camp) для костра со стори айди,

Так попробуй. Работать будет только на DX10

function disable_campfire(actor, npc, p)
    local obj = get_story_object(p[1])
    if obj then
        local campfire = obj:get_campfire()
        campfire:turn_off()
    end
end


Терпение... И все получится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

makdm , у него вылет не жалуется, что метод неподходящий, он жалуется на отсутствие obj.
 

11 часов назад, AziatkaVictor сказал:

xr_effects.script:2130: attempt to index local 'obj' (a nil value)

А если просто открыть эффектс и посмотреть:

Спойлер

function disable_anomaly(actor, npc, p)
	if p[1] == nil then
		abort("Story id for disable_anomaly function is not set")
	end

	local obj = get_story_object(p[1]) --Тут читаем по стори ид.
	if not obj then
		abort("There is no object with story_id %s for disable_anomaly function", tostring(p[1]))
	end
	obj:disable_anomaly()
end

 

Раз его нет. Он не зареган, не зареган он может быть только по четырем причинам:
1. Он не прописан нигде или прописан неправильно.
2. Регистрация происходит слишком поздно.
3. Регистрации вообще не осуществляется для данного объекта.
4. Сбой, неправильная работа скриптов, ввиду какой-то ошибки.

Но у нас, первое, он прописан. Второе, это вряд ли, такое могло быть при имениях существующих скриптов или добавлении своего кода с ошибками. Третье, на лицо оно. К тому же я не помню, чтобы у костров был скриптовый серверный класс и даже если есть, на пример точно помню, что у тех же визуальных зон не прописана рега стори айди (жгучий-пух). Четвертый пункт, маловероятен в нашем случае.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Ekagors то есть, я не могу отключить его, так как ему просто не присваивается айдишник? Но как тогда его отключают, если присвоить специальное имя смарт тиррейна? Когда там нету ни одного НПС, то костры отключаются.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

AziatkaVictor , а кто запрещает отключать? Ты в ручную оффаешь, через ф-ию которая дает тебе объекты из таблицы по их стори айди. То есть, у тебя есть ф-ия disable_anomaly в xr_effects, которую ты вызываешь из под логики.
Что внутри нее:
 

Спойлер

function disable_anomaly(actor, npc, p)
	if p[1] == nil then
		abort("Story id for disable_anomaly function is not set")
	end

	local obj = get_story_object(p[1])
	if not obj then
		abort("There is no object with story_id %s for disable_anomaly function", tostring(p[1]))
	end
	obj:disable_anomaly()
end

 

Видишь же, что она объект получает передавая тобой переданный аргумент в get_story_object.
get_story_object в свою же очередь, это ф-ия которая прописана в _g.script:

Спойлер

function get_story_object(story_obj_id)
	local obj_id = story_objects.get_story_objects_registry():get(story_obj_id)
	if obj_id == nil then return nil end
	return (db.storage[obj_id] and db.storage[obj_id].object) or (level ~= nil and level.object_by_id(obj_id))
end

 

Которая взывает как раз таки таблицу внутри класса из скрипта story_objects , где зареганы (записаны в таблицу) айдишники. По принципу {[name_sid]=id,[name_sid_arbuz]=id,[rad_pm]=id и т.д.}. Получив этот айди, по айди дает тебе объект либо из стора (таблица, которая уже заполняется из под биндеров), либо через двигло с помощью level.object_by_id.

Расписал, немного. Чтобы было понятно. Что там свой механизм и отключается там в скриптах имея объект. У тебя же случай, где ты хочешь получить объект и провести с ним операцию. Получить по выше описному. Но его просто там нет. Его нет в табле стори айдишников. Он не "зареган". Следовательно нет ID, следовательно объекта никак не получить.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

AziatkaVictor попробуй заменить obj = alife():object(p[1]) --здесь НАЗВАНИЕ В СДК аномалии
if obj ~= nil then ...
должно сработать

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

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

  • Печаль 1

Boomsticks & Sharpsticks: https://discord.gg/vThnFWrbaA

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
2 часа назад, liner сказал:

попробуй заменить obj = alife():object(p[1]) --здесь НАЗВАНИЕ В СДК аномалии
if obj ~= nil then ...

В чистом ЗП нет метода на получение серверного объекта по его имени. Только по ID.
(В ЧН и ТЧ есть. В ЗП вырезан.)
 

Спойлер

Конечно, никто не запрещает сделать вот такую страшную хитрость:
 

Спойлер


	local obj
	for i=1,65534 do
		if level.object_by_id(i) and alife():object(i):name() == p[1] then
			obj = level.object_by_id(i)
			break
		end
	end

 

НО ДАВАЙТЕ БУДЕМ ПРОТИВ КОСТЫЛЕЙ, КОГДА ИХ МОЖНО НЕ ДЕЛАТЬ!

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

intro_start game_loaded
* MEMORY USAGE: 413727 K
* End of synchronization A[1] R[1]
intro_delete ::update_game_loaded
weather= atmosfear_clear
compiling shader shadow_direct_model_aref_2
 
FATAL ERROR
 
[error]Expression    : no_assert
[error]Function      : CIni_IdToIndex<1,struct COMMUNITY_DATA,class shared_str,int,class CHARACTER_COMMUNITY>::GetById
[error]File          : d:\projects\x-ray_callofchernobyl-master\src\xrgame\ini_id_loader.h
[error]Line          : 134
[error]Description   : item not found, id
[error]Arguments     : 
 

stack trace:

0023:00563C43 xrCore.dll, xrDebug::fail()
0023:05399863 xrGame.dll, CDialogHolder::UseIndicators()

 

Подскажите пожалуйста, что 3а вылет такой и как лечить ? Это при убийстве сталкера зомбированого !

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Kalambur зачем посылать одно и тоже сообщение в две темы?


бывший модоел

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Kalambur 

Зачем вообще с КОКом лезть в тему по ЗП,  не различаете разницу???


Группа мода в VK
Мод делался и тестировался на железе
i5-11400, 32Гб ОЗУ, Radeon RX580  Разрешение 2560 х 1440.  ВСЕ на максималке

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Kalambur Чел не туда пишешь.

Поподробнее распиши про вылет. Зомби симуляционный или уникальный? Вылет стабильный или нестабильный?

  • Спасибо 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

удалено
 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Как отобразить в GUI например списком содержимое рюкзака ГГ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Paradox27kms перебор инвентаря - db.actor:iterate_inventory(функция, obj)   function функция (actor, item) ...здесь добавляете в список или в  таблицу что надо от item ... end.  Пример составления списка можно посмотреть в файле ui_load_dialog.script


В беге за рассветом приближаешь свой закат

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

vader_33 Ну вот я например взял скрипт на проверку содержимого определенного оружия в инвентаре (пример проверка на оружие у бандита Валета) и нужно чтобы оружие отображалось в списке уже в listbox gui. (сам список то я реализовал) т.е нужно как-то прикрутить скрипт к списку.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Paradox27kms ui_load_dialog.script смотрите, там всё есть. Функция FillList, там уже поиском по файлу AddItemToList и остальное всё найдёте, как там добавлять в список


В беге за рассветом приближаешь свой закат

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
1 час назад, vader_33 сказал:

Paradox27kms ui_load_dialog.script смотрите, там всё есть. Функция FillList, там уже поиском по файлу AddItemToList и остальное всё найдёте, как там добавлять в список

local weapons_table = {
"wpn_ak74",
"wpn_ak74u",
}

function ui_mm_mod:FillListShop()
         local tbl
         local name

     self.list_shop:Clear()    

tbl = weapons_table -- список предметов (оружия) отображаемого в списке listbox

     for i, v in ipairs(tbl) do
         name = game.translate_string(system_ini():r_string(v, "inv_name"))
         self:AddItemToListShop(name, v)
     end
end

P.S нужно сделать так чтобы отображалось только то оружие которое есть в таблице weapons_table и в слоте для оружия, те должно получиться так что если данного оружия в слоте нет то оно и не будет отображаться  списке weapons_table

вот подобный скрипт на проверку оружия в слоте 2 и 3  

Спойлер

    for k,v in pairs(weapons_table) do
        if db.actor:item_in_slot(2)~= nil and db.actor:item_in_slot(2):section() == v then
            return true
        elseif db.actor:item_in_slot(3)~= nil and db.actor:item_in_slot(3):section() == v then
            return true
        end
    end

    return false
end

Но нужно это как-то к списку прикрутить. Скорее всего я так думаю должно получиться что-то типо этого только рабочий вариант

Спойлер

function ui_mm_mod:FillListInv()
         local tbl
         local name

     self.list_inv:Clear()    

tbl = inv_table

     for i, v in ipairs(tbl) do
         name = game.translate_string(system_ini():r_string(v, "inv_name"))
         self:AddItemToListInv(name, v)
         if db.actor:item_in_slot(2)~= nil and db.actor:item_in_slot(2):section() == v then
             return true
         elseif db.actor:item_in_slot(3)~= nil and db.actor:item_in_slot(3):section() == v then
             return true
         end
    end

    return false
end

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Paradox27kms вот так сразу надо, а не ходить вокруг да около. Зачем tbl = inv_table?

Спойлер

 

function ui_mm_mod:FillListInv()
         local tbl
         local name

     self.list_inv:Clear()    

tbl = inv_table

     for i, v in ipairs(tbl) do
         name = game.translate_string(system_ini():r_string(v, "inv_name"))
         if (db.actor:item_in_slot(2)~= nil and db.actor:item_in_slot(2):section() == v) or  ( db.actor:item_in_slot(3)~= nil and db.actor:item_in_slot(3):section() == v) then
             self:AddItemToListInv(name, v)
         end
    end
end

 

 

  • Лайк 1

В беге за рассветом приближаешь свой закат

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
7 минут назад, vader_33 сказал:

Paradox27kms вот так сразу надо, а не ходить вокруг да около. Зачем tbl = inv_table?

  Показать контент

 

function ui_mm_mod:FillListInv()
         local tbl
         local name

     self.list_inv:Clear()    

tbl = inv_table

     for i, v in ipairs(tbl) do
         name = game.translate_string(system_ini():r_string(v, "inv_name"))
         if (db.actor:item_in_slot(2)~= nil and db.actor:item_in_slot(2):section() == v) or  ( db.actor:item_in_slot(3)~= nil and db.actor:item_in_slot(3):section() == v) then
             self:AddItemToListInv(name, v)
         end
    end
end

 

 

Большое спасибо. А как реализовать чтобы при клике на предмете в списке активировалась функция? p.s я к сожалению знаю только как так сделать в компоненте выпадающий список (combo_box) но мне нужно с простым списком list_box

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

Всем привет. Столкнулся с такой проблемой, с которой ранее не сталкивался.

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

Вот в чём заключается проблема, все мобы и нпс - тупые и слепые. Даже на мастере мутантам меня сложно убить.

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

А нпс даже при полном счетчике палива стоят секунд 10, а потом стреляют, но по инвалидному при чём на мастере.


Дополнено 0 минут спустя

Я и понятия не имею, почему они так тупят.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   1 пользователь онлайн