Artos
Об этой ошибке как то писал Камикадзе - по его мнению данная ошибка происходит при потере движком серверного объекта предмета в момент каких то манипуляций с ним в инвентаре.
Потому и я решил тогда проверять объект сразу на два фронта перед манипуляцией - а иначе как происходило: вот есть клиентский объект, он передается в метод который требует в качестве аргумента тоже клиентский объект, однако почему то все равно происходит данный вылет. У меня он происходил конечно не каждый раз, но где то на каждую пятую операцию дропа большого числа предметов. Что для меня являлось абсолютно неприемлемым - и как я уже писал, проверка на обязательное наличие серверного объекта каким то образом избавила меня от данного вылета в моем конкретном моде.
Почему так - я сам теряюсь в догадках.
В твоем коде наличия такой предпроверки я не увидел, если она присутствует, тогда конечно "лечение" ошибки должно быть иным. Но каким - бог его знает. Раздвоение игре объектов на пары клиент\сервер само по себе на мой взгляд совершенно излишне и косяки явно идут из самого движка. И если лечить основательно - то ковырять движок.:-)
ЗЫ: По большому секрету скажу - malandrinus в последнее время ковырнул движок настолько глубоко, что не удивлюсь если он сделал (или решит сделать ) "таблетку" и от этого косяка. У меня просто есть список того что он добавил в движок (помимо общеизвестных вещей)- но список секретный и меня просили не разглашать.
PPS: Код дропа не мой - взял его целиком из одного мода, да забыл подправить.:-G
Так конечно логичней.
добавлено спустя 8 минут
--------------------------------------------------------------------------------
Сейчас дошло - мы кажется говорим о разных ошибках
у меня вылечилась такая :entity not found. id_parent=какой ид id_entity=какой то ид frame=какой ид.
А твоя ошибка хотя и генерируется тот же функцией xrServer::Process_event_reject, но все таки отличается по описанию.
отредактировал(а) erlik: 05-04-2011 11:36 GMT3 час. Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
Народ, подскажите как удалить НПС после диалога? - Поговорил с Сидором и Волк удалился. И ещё: Как сделать так, чтобы НПС (тот же Волк) после диалога с Сидором оказался в другом месте. - Стоял в лагере новичков, а после диалога оказался в баре
erlik
Может быть я не очень внятно сформулировал вопрос-загадку ... Суть не в том, что возникла ошибка, а в том(!) что эта ошибка (с id_entity) была и ранее и в оригинале и в модах (хотя и редка) и когда интенсивность жизни в Зоне возрастает - ошибка проявляется чаще. Вот и задался вопросом/целью поискать вариант исключить/минимизировать ошибку.
В описании вопроса я привел 'упрощенный' вариант итерации (о чем и написал), убрав различные общие и частные проверки, которые с моей точки зрения не влияют на суть.
Повторю два основных момента:
1. При ситуации, когда непись должен подобрать некий предмет возникает ситуация, когда предмет УЖЕ оказывается принадлежащим этому неписю, хотя НИКАКИХ еще действий по трансферу/переспавну с этим предметом не проводилось.
У меня есть сэйв, на котором с 50%-ой вероятность. воспроизводится ситуация, когда я убиваю последнего бандита, охраняющего Шустрого на АТП и после диалога Шустрый пытается обобрать труп и подобрать выпавший из рук бандита обрез. Так вот когда он только подошел к обрезу и должен его взять (три такта: осмотрелся+присел+трансфер) - обрез оказывается уже 'у него'. Т.е. oItem:parent() уже равен его Id, хотя soItem.parent_id == 65535. Прервав алгоритм (иначе вылет по ошибке 'передача самому себе') - вижу обрез уже в руках у Шустрого.(!?!)
2. При обирании некоторых трупов иногда возникает ситуация, когда трансфер предметов из трупа к неписю произошел (с предпроверкой принадлежности предмета трупу), плюс прошел трансфер денег, в лог выведена информация об успешном завершении всего текущего цикла и ... вылетает по ранее указанному логу, который я трактую как: "сервер не в состоянии изьять у неписи предмет, который (предмет) имеет 'родителем' самого себя", т.е. предмет уже безхозный, а сервер об этом еще не знает, а пытается 'изъять'.
Ранее (с алгоритмами для пояса) я выяснил, что трансфер предметов от одного объекта к другому происходит в два цикла: вначале в 1-ом цикле после трансфера предмет становится безхозным, во 2-ом цикле - уже принадлежащим тому, кому переместили. И никогда сервер не ругался на ошибочный идентификатор владельца.
Если 1-ю проблемку я решил, хотя и не поняв 'почему такое возможно', то вторую ни понять ни залатать пока не могу ... Вот и обратился к любителям головоломок. :-)
Перевел инвентарный ящик в оффлайн, заспавнил в него пердметы и перевел в онлайн. Предметы сп**5001001a66cf24ce67c0** alife():story_object(id)
if sSObj then
alife():set_switch_offline(id,true)
alife():set_switch_online(id,false)
end
end[/code]
Stalk15
Не стОит методом тыка пытаться сделать что-то, когда достаточно поднапрячь мозги, продумать алгоритм и воплотить его в коде. При чем, чем проще - тем надежнее.
1. "спавн" предметов в ящик.
2. ящик сразу просто в офлайн (если он уже там - безвредно и быстрее)
3. ящик сразу просто в онлайн (если ему положено быть офлайн, наверное сам уйдёт)
Парни, я тут столкнулся с одной проблемой, подскажите плиз, если кто знает, буду очень благодарен.
В общем, вся проблема заключается в невозможности обыскивать некоторые трупы(в основном, "главных") я сейчас иду по сюжетному квесту на х18. Там на нижнем этаже надо взять инфу с трупа какого-то ученого и, когда я начинаю его шмонать, меня выкидывает и пишет вот эту ошибку.
Exeption reason:
XR_3DA.exe caused BREAKPOINT in module "C:\Program Files (x86)\GSC World Publishing\S.T.A.L.K.E.R\bin\xrCore.dll" at 0023:005BCC85, xrDebug::backend()+165 byte(s)
AHKOP
1. Этот топик НЕ по ковыряниям в конкретных модах/кодах, а по ковыряниям в 'чистой' игре или по общим для различных модов вопросам. С частностями, подобными твоей проблеме, стОит обращаться к разработчикам конкретного мода. Тем более топик по RMA (Восстановление старого сюжета) в наличии на этом портале и автор в нем постоянно появляется и отвечает.
2. Этот топик НЕ для игроков, желающих решить частную проблему своего прохождения игры/мода. Затрата времени на решение подобных проблем зачастую гораздо быстрее решается переигровкой игроком с раннего сэйва или даже с начала игры.
3. Если же возникла потребность в решении подобных проблем, требующих вмешательства в коды - озаботься предоставлением необходимой информации и прежде всего лога ошибки!
Не нужно тут приводить строки твоей операционки, ругающейся на рухнувшее приложение/игру. Найди лог игры (что/где - читай в ФАК'е) и тогда можно будет не гадать, а может и подсказать что-то.
4. Постарайся более точно формулировать: 'начинаю его шмонать' - очень расплывчато. Если вылет сразу при попытке заглянуть в труп - искать скорее всего придется некорректные предметы или квестовые обработчики, если же при попытке кликнуть по какому-то предмету/иконке - ищи корявые конфиги данного предмета.
5. Если делал свою солянку из модов - то врядли кто тут тебе будет заморачиваться и искать черную кошку в темной комнате. Сам заварил кашу - сам и расхлебывай. Объединение модов требует как минимум элементарных знаний и навыков.
Сделал озвучку для еду запускаю всё работает только исрользую лобую еде выелт вот лог
Expression : fatal error
Function : CScriptEngine::lua_error
File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp
Line : 73
Description :
Arguments : LUA error: ... Тень Чернобыля\gamedata\scripts\bind_stalker.script:419: attempt to index global 'food_sound' (a nil value)
Вот сам скрипт
function use_snd(obj)
local obj_sect = obj:section()
local snd
if obj_sect == 'bread' then snd = interface\inv_food
elseif obj_sect == 'vodka' then snd = interface\inv_vodka
elseif obj_sect == 'antirad' then snd = interface\inv_pills
elseif obj_sect == 'medkit' then snd = interface\inv_medkit
end
if snd then
local snd_obj = xr_sound.get_safe_sound_object(snd)
return true
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:net_destroy()
self.object:set_callback(callback.use_object, nil)
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)
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()
self.object:set_callback(callback.use_object, self.use_object, self)
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)
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)
--[[
local respawner = se_respawn.get_respawner_by_parent(story_id)
if respawner == nil then
return
end
--' Необходимо уменьшить счетчик в респавнере
respawner:remove_spawned(item:id())
local smart_terrain = db.strn_by_respawn[respawner:name()]
if smart_terrain == nil then
return
end
local npc = smart_terrain.gulag:get_nearest_online_obj(db.actor:position())
if npc ~= nil then
xr_sound.set_sound_play(npc, "reac_box")
xr_gulag.setGulagEnemy(smart_terrain:name() , db.actor)
end
]]
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)
printf("*INFO*: npc='%s' id='%s'", npc:name(), info_id)
--' Сюжет
level_tasks.proceed(self.object)
-- Отметки на карте
level_tasks.process_info_portion(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)
--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)
else
news_manager.send_encyclopedy("encyclopedy", group)
end
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_take (obj)
level_tasks.proceed(self.object)
--game_stats.update_take_item (obj, self.object)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:on_item_drop (obj)
level_tasks.proceed(self.object)
--game_stats.update_drop_item (obj, self.object)
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)
--' Проверка потери жизни
--[[
if self.object.health - lasthealth > 0.001 or
self.object.health - lasthealth < -0.001 then
printf("%f | %f", self.object.health, self.object.health - lasthealth, game.time() - lasttime)
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
if self.bCheckStart then
printf("SET DEFAULT INFOS")
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
printf("*AVI* RUN START AVI")
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
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:save(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
packer:w_bool(true)
utils.w_CTime(packet, self.st.disable_input_time)
end
if load_treasure_manager == true then
treasure_manager.load(reader)
end
task_manager.load(reader)
self.actor_detector:load(reader)
end
----------------------------------------------------------------------------------------------------------------------
function actor_binder:use_object(obj)
food_sound.script.use_snd(obj)
end
--------------------------------------------------------------------
--старт префетча звуков
--if string.find(command_line(), "-noprefetch") == nil then
-- sound_prefetch.prefetch_sounds()
--end
-- Weapon functions
function hide_weapon()
weapon_hide = true
end
function restore_weapon()
weapon_hide = false
end
// this is test for section iteration
/**
local function test_section_iteration(file_name, section_name)
printf ("file : %s",file_name)
printf ("section : %s",section_name)
local file = ini_file(file_name)
local n = file:line_count(section_name)
printf ("lines : %d",n)
local id, value = "", "", result
for i=0,n-1 do
result, id, value = file:r_line(section_name,i,"","")
printf ("line %d : %s = %s",i,id,value)
end
end
Alexsandr7822
Ты не находишь свой вопрос, мягко выражаясь, некорректно заданным?
Не удосужившись уточнить про чистую ли игру спрашиваешь или про какой-то конкретный мод, в лучшем случае получишь кучу флуда на эту тему.
В чистой игре каких-либо собирательств, кидания гранат и т.п. нет. Перечислять что есть кроме торговли не вижу смысла, т.к. ты даже не удосужился задуматься, а что обозначает например название 'trade_manager.script'.
Кол-во различных скриптов, отвечающих за поведение NPC в различных модах множество, как и их названий. Ты ждешь что тебе кто-то предоставит всеоблемлющий список всего и вся "и т.д."? ;-)
Хочешь спросить - спрашивай, а не начинай флудильню.
Pasha_199729
Учись писать скрипты соблюдая элементарные правила и без синтакситеских ошибок.
Ни один компиллятор LUA не поймет стоки:
snd = interface\inv_food
т.к. правила диктуют иное написание:
snd = "interface\inv_food"
Это без разбора ошибочных путей, т.к. обычно требуется:
snd = "interface\\inv_food"
Твой лог говорит тебе об ошибке самого скрита 'food_sound' - бери LUA-чекер (ссылки были одну-две странички назад) и проверяй/исправляй ошибки.
Также, не стОит свой вызов скрипта пихать в самое начало ... начни с конца, т.е. после установки штатных коллбэков. :-)
Alex-San
может быть ты и кашпировский ( ;-) ), но ... ни один из упомянутых в вопросе "собирание предметов, торговля, кидание гранат ..." не имеют никакого отношения к "ВИКИ логика НПС".
Alexsandr7822 имеет ввиду логику поведения неписей. Вещь довольнотаки сложная, это тебе не правка конфигов. Для начала могу порекомендовать вводный урок Red75 на ВИКИ логика НПС
А потом оттудаже штатный манул по настройке логики.
Осилишь...молодец)
Silent Man
Означает один из худших для анализа вариантов возникновения ошибки.
'stack overflow' - переполнен объем выделенной памяти (в данном случае стека) для неких операций.
Наиболее вероятно подобное по двум причинам:
- при зацикливании смены положения/состояния тела у неписей/монстров, т.е. следы идут из стейт-менеджера (state_mgr.script), а уж 'последняя капля' может быть где угодно (в твоем случае в smart_terrain'е);
- при зацикливании алгоритмов/кодов. Тогда распутывать цикл стОит с smart_terrain.script:751
Snork_agroproma
Если всё правильно сделал, то надо забандить кнопку, обычно "b" на запуск движка. Strchi
Картоделов тут вроде нуту :/ Да их и вообще мало( Могу посоветовать два ресурса:
Artos Помоему вопрос очень корректный. Я уже не раз задаю подобные вопросы в этой статейке. И поччему -то именно старшее поколение не может никак понять о чем идет речь. Если ты "шляпа" не можешь допереть НА ТАКОЙ ПРОСТОЙ ВОПРОС" и причем тут вобще trade_menedger_script?????? Мне просто нужно узнать какие скрипты отвечают за поседение нпс. Три скрипта я уже нашел (Logic, motivator, ai) Еще раз повторяю для тех кто в "ТАНКЕ" игрю в мод!!!
Artos Ты прав насчет модов..везде состовляющие конфиги имеют свои назначения отвечающие за логику нпс...но все они меют свой корень а всякий корень берет свре начало именно от этих скриптов.
Для тех, кто НА танке, а не в нем:
На некоторые вопросы возникает желание помочь/ответить, а на некоторые - улыбнувшись промолчать или порою выругаться ...
Воинствующее невежество никогда не способствовало познанию, но ... каждый выбирает по-себе.
Воюй дальше ... ;-)
Я недавно перенёс модель артефакта выверт из чн запускаю игру спавню его гдето всё работает а если он спавнится у нпс то вылетает с ошибкой
Expression : assertion failed
Function : CSafeFixedRotationState::create
File : e:\stalker\patch_1_0004\xr_3da\xrgame\phvalidevalues.h
Line : 81
Description : dBodyStateValide(b)
Вопрос у меня такой как нацепить на Волка или другого персонажа другой костюм.
Т.е. Волк стоит в костюме одиночки как нацепить на него к примеру костюм военного.
А точнее. Папка ..\gamedata\config\gameplay
В ней файл - character_desc_escape.xml там прописаны все персональные неписи с кордона.
Далее ищем там конфиг Волка, он после строк
И за ней строки определяющие костюм Волка - actors\neytral\stalker_neytral_balon_1
Эта тема закрыта, публикация новых сообщений недоступна.
Продолжая пользоваться сайтом, вы соглашаетесь с использованием файлов cookie. Страницы сайта могут содержать информацию, запрещенную для просмотра посетителям младше 18 лет. Авторское право на серию игр «S.T.A.L.K.E.R» и используемые в ней материалы принадлежит GSC Game World.