Kondr48 314 Опубликовано 19 Июля 2012 Поделиться Опубликовано 19 Июля 2012 (изменено) Daniar299, вся "враждебность" заключается в группировке, спавни непися как всегда, только с группировкой нужной. NaslednikTutti, легче через all.spawn параметр health Чем же распаковка, правка и обратная компиляция лешче багальной фушкции установки хдоровья актору в нужное (раненое) значение? И тем более, подобное не заставит актора валяться и/или просить аптечку. --/Artos Изменено 20 Июля 2012 пользователем Artos Ссылка на комментарий
NaslednikTutti 1 Опубликовано 19 Июля 2012 Поделиться Опубликовано 19 Июля 2012 (изменено) Вампир35, через health в all.spawn я пробовал)) поставил health = 0.1, при старте игры у гг просто меньше здоровья. А мне нужно так, чтобы ГГ при старте игры именно лежал на полу как раненный нпс. Править следует два параметра: health и upd:health ... важен имменно второй. --/Artos Добавлено через 29 мин.: Даже просто сделать так, чтобы при старте игры, такая скриптовая сцена (или как она там называется=)), ГГ лежит на полу без сознания и потом типо очнулся и встает... Как это реализовать на ЗП. Подскажите пожалуйста. Есть же такое в ТЧ, когда ГГ теряет сознание и падает..потом ролик.. а после он очнулся и встает. Только это нужно на ЗП. Изменено 20 Июля 2012 пользователем Artos Не соответствует правилам. Ссылка на комментарий
Scarabay 98 Опубликовано 19 Июля 2012 Поделиться Опубликовано 19 Июля 2012 NaslednikTutti, ну так что мешает сделать такое на ЗП? При старте новой игры запускаешь кат-сцену ГГ лежит на полу без сознания и потом типо очнулся и встает. Делается через "sr_cutscene". Подробнее читай тут [logic] active = sr_idle [sr_idle] on_info = {!black_screen +agru_nvidia_presentation} sr_cutscene@cam1 ;Здесь мы проверяем инфопоршен agru_nvidia_presentation и функцию ;black_screen (нет ли черного экрана) и переходим в секцию sr_cutscene@cam1 [sr_cutscene@cam1] point = agru_nv_camera_walk ;точка walk где игрок будет находится после камеры look = agru_nv_camera_look ;точка look куда будет направлена камера игрока после камеры cam_effector = scenario_cam\agroprom_underground\camera1_0_904 ;файл камеры и путь к нему on_signal = cameff_end | sr_cutscene@cam2 ;сигнал окончание камеры и переход в следующую секцию [sr_cutscene@cam2] .... Мой YouTube-канал Ссылка на комментарий
AndreySol 215 Опубликовано 21 Июля 2012 Поделиться Опубликовано 21 Июля 2012 (изменено) Подскажите, какое максимальное целое бесзнаковое число можно хранить в числовой переменной для ТЧ на 32-bit ОС ? Понятиям "переменная" не применимо - "числовая", что присвоил - тому и соответствует. Понятие "хранить" - очень растяжимо, формулируй вопрс(ы) более точно и однозначно. Применительно к сохранениям значения переменных в сэйвы игры - существуют методы r_u64 и w_u64, которые могут читать/писать в нет-пакеты соответственно 2х4 байта для числа, однако ими никто не пользуется и применяют максимально r_u32 и w_u32, т.е. 4-х байтовые. Нужно больше - запоминай чвстями. --/Artos Изменено 22 Июля 2012 пользователем Artos Ссылка на комментарий
7.9 174 Опубликовано 21 Июля 2012 Поделиться Опубликовано 21 Июля 2012 (изменено) Вроде-бы - 2^23, не точно, в "Справочнике функций и классов..." это обсуждалось, давно. Изменено 21 Июля 2012 пользователем 7.9 всё легко Ссылка на комментарий
ins33 16 Опубликовано 21 Июля 2012 Поделиться Опубликовано 21 Июля 2012 ---------- -- чтение формы из нет-пакета ---------- function r_shape(packet) local s local st = {} st.count = packet:r_u8() st.shapes = {} for i=1, st.count do s = {} s.type = packet:r_u8() if s.type == 0 then s.center = packet:r_vec3() s.radius = packet:r_float() else s.axis_x = packet:r_vec3() s.axis_y = packet:r_vec3() s.axis_z = packet:r_vec3() s.offset = packet:r_vec3() end st.shapes[i] = s end return st end ---------- -- запись формы в нет-пакет ---------- function w_shape(packet, st) local s packet:w_u8(st.count) for i=1, st.count do s = st.shapes[i] packet:w_u8(s.type) if s.type == 0 then packet:w_vec3(s.center) packet:w_float(s.radius) else packet:w_vec3(s.axis_x) packet:w_vec3(s.axis_y) packet:w_v ec3(s.axis_z) packet:w_vec3(s.offset) end end end ---------- -- перепаковка нет-пакета созданного скриптом рестрикта ---------- function rewrite_restrictor(se_obj, custom, radius) local packet = net_packet() se_obj:STATE_Write(packet) local game_vertex_id = packet:r_u16() local distance = packet:r_float() local direct_control = packet:r_s32() local level_vertex_id = packet:r_s32() local object_flags = packet:r_s32() local custom_data = packet:r_stringZ() local story_id = packet:r_s32() local spawn_story_id = packet:r_s32() local shape = r_shape(packet) local restrictor_type = packet:r_u8() custom_data = custom shape = {} shape.count = 1 shape.shapes = {} shape.shapes[1] = {} shape.shapes[1].type = 0 shape.shapes[1].center = vector():set(0,0,0) shape.shapes[1].radius = radius packet:w_u16(game_vertex_id) packet:w_float(distance) packet:w_s32(direct_control) packet:w_s32(level_vertex_id) packet:w _s32(object_flags) packet:w_stringZ(custom_data) packet:w_s32(story_id) packet:w_s32(spawn_story_id) w_shape(packet, shape) packet:w_u8(restrictor_type) se_obj:STATE_Read(packet, packet:w_tell() - packet:r_tell()) end function create_shompl_restr() local se_obj = alife():create("space_restrictor",vector():set(-247.4907989502,-20.131322860718,-153.27322387695),12047,47) local custom = "[logic]\ncfg = scripts\ins\shompl.ltx" --путь к логике рестриктора rewrite_restrictor(se_obj, custom, 5.0) --5.0 - это радиус действия нашего рестриктора end Вроде всё правильно сделал, но при добавлении в бинд_сталкер имя_файла.create_shompl_restr(), происходит вылет по этой строчке. Подскажите, может что-то пропустил? Ссылка на комментарий
AutoGnom 0 Опубликовано 21 Июля 2012 Поделиться Опубликовано 21 Июля 2012 class "MapTex" (CUIScriptWnd) function MapTex:__init() super() self:Init(0, 0, device().width, device().height) self.overlay = CUIStatic() self.overlay:Init(15, 15, 256, 256) self.overlay:InitTexture("MapTex\\MapTex") -- текстурка self.overlay:SetStretchTexture(true) self.overlay:Show(true) self:AttachChild(self.overlay) end Мне нужно скриптом повернуть эту текстуру, как? Ссылка на комментарий
Charsi 440 Опубликовано 21 Июля 2012 Поделиться Опубликовано 21 Июля 2012 (изменено) AutoGnom, для поворота текстуры статика его необходимо создавать, используя InitStatic. В конфиге статика указать параметр heading="1". Поворачивается статик с помощью метода SetHeading. Всё это было описано много раз.Не ленись использовать поиск. Изменено 21 Июля 2012 пользователем Charsi Lua и LuaJIT плагины для Notepad++ SciTE-RU 3.5.5 плагины для MilkShape3D Ссылка на комментарий
AutoGnom 0 Опубликовано 21 Июля 2012 Поделиться Опубликовано 21 Июля 2012 В конфиге статика указать параметр heading="1". Это динамический статик, я не прописываю ему никакой конфы в ui_custom_msgs.xml Ссылка на комментарий
Desertir 202 Опубликовано 21 Июля 2012 Поделиться Опубликовано 21 Июля 2012 (изменено) Занялся логикой, схемами поведения и т.п. Возник вопрос про условия экшена. Например есть строки action:add_precondition (world_property(stalker_ids.property_alive, true)) action:add_precondition (world_property(stalker_ids.property_enemy, false)) action:add_precondition (world_property(stalker_ids.property_danger,false)) action:add_precondition (world_property(stalker_ids.property_anomaly,false)) Сами условия более менее понятны, но как они проверяются? Но даже если это списать на проверку в движке - константы из класса stalker_ids, то встает вопрос про "самодельные" константы: function addCommonPrecondition(action) --action:add_precondition (world_property(xr_evaluators_id.reaction,false)) action:add_precondition (world_property(xr_evaluators_id.stohe_meet_base + 1,false)) action:add_precondition (world_property(xr_evaluators_id.sidor_wounded_base + 0, false)) action:add_precondition (world_property(xr_evaluators_id.chugai_heli_hunter_base, false)) action:add_precondition (world_property(xr_evaluators_id.abuse_base, false)) end Откуда такие смещения в 1, 0(?), в других скриптах бывает 2 и т.д. Я нигде не нашел проверки на эти константы, только использование в конструкторе world_property. Так как это все работает? Что за класс такой world_property? PS: а кто нибудь описывал, какие условия проверяются для каждой константы из класса stalker_ids? PPS: ТЧ 1.0004 если это важно. Изменено 21 Июля 2012 пользователем Desertir ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
Artos 99 Опубликовано 22 Июля 2012 Поделиться Опубликовано 22 Июля 2012 (изменено) Desertir 1. По world_property - посмотри хотя бы азбуку (lua_help.script). В кратце там можно разобраться что-к-чему ... 2. Советую вначале ознакомиться с классами stalker_ids, planner_action и action_planner. Имеютс встроенные в движек 'property' и 'action', имеются скриптовые, которые добавлены в прописаны в xr_evaluators_id.script и xr_actions_id.script. Можно и "ручками" назначить и использовать. Суть: Кажому 'property' (условию) и 'action' (действию), сопоставлена некая числовая констатна (эксклюзивная), и именно по этим числам движек и скрипты оперируют в своих действиях, нахоодя по этим константам нужный класс эвалуатора или экшена. Нередко в схемах имеется не одно условие и/или не одно действие - вот и регистрируется несколько, взяв за базу основное значение. Например, в state_mgr.script pbhtubcnhbhjdfyj одна константа xr_evaluators_id.state_mgr, а все остальные вычисляются именно по смещению +1, +2, ... Т.о. смещение обозначает, какое берется из значений, зарезервирвованных для данной схемы. Я нигде не нашел проверки на эти константы, только использование в конструкторе world_property А world_property - это и есть проверка "этих констант" ... Постарайся читать и понимать написанное, например приведенная тобою строка: action:add_precondition (world_property(xr_evaluators_id.stohe_meet_base + 1,false)) - означает, что некоему действию схемы назначается проверка условия из схемы 'meet'. Если заглянуть в эту схему, то можно видеть, что значению xr_evaluators_id.stohe_meet_base + 1 сопоставлен эвалуатор 'evaluator_contact' этой схемы. Вот и будет активизация некоего твоего действия зависеть от проверки этого эвалуатора, т.е. если эвалуатор вернет 'false' - простым языком: "если непись не вступила в контакт/разговор с актором". Изменено 22 Июля 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Desertir 202 Опубликовано 22 Июля 2012 Поделиться Опубликовано 22 Июля 2012 Напишу тут. Пара уточнений. Под объектом в целом я буду иметь ввиду клиентский объект NPC. Менеджер - объект, получаемый методом motivation_action_manager() объекта: local manager = object:motivation_action_manager() Экшн - объект класса унаследованного от action_base. Прописать условие в менджер: manager:add_evaluator(id, property_evaluator(npc, name)) Установить условие экшену: action:add_precondition(world_property(id, true/false)) Итак, есть функция из xr_logic - enable_generic_schemes, которая косвенно через пару функций вызывается из апдейтов биндеров, так же она вызывается из метода класса gulag, но я пока не о гулагах. В этой функции прописаны схемы которые по идее активны всегда, так ведь? Ну если условия все пройдут. В конечном итоге еще через пару функций вызывается функция add_to_binder для каждой схемы, прописанной в enable_generic_schemes. В add_to_binder прописываются различные условия, например: manager:add_evaluator (properties["abuse"], evaluator_abuse("evaluator_abuse", st)) где properties["abuse"] = xr_evaluators_id.abuse_base. Если эта схема всегда активна, в своей новой, которая прописывается как например walker или kamp, т.е. которая активна не всегда, я могу опять получить менеджер объекта, в котором уже есть это условие, и установить это условие в каком нибудь экшене. В итоге работает это все так: -Есть несколько схем, которые активны всегда. -В этих схемах в менеджер каждого объекта прописываются разные условия с идом. -Позже к любому экшену в любой другой схемы можно добавить это условие по иду с помощью класса world_property. Так ли это, ну хотя бы образно? Если да, тогда имеет смысл порядок включения схем в enable_generic_schemes? Допустим в одной схеме есть установка условия на что-либо, а прописывается само условие на что-либо в менеджер только в следующей схеме. Или условие в экшн устанавливается только как ид, и не важно, прописано это условие в менеджер? И что если установить эшену несуществующее условие, если движок не найдет по иду условие - вылет? ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
AutoGnom 0 Опубликовано 22 Июля 2012 Поделиться Опубликовано 22 Июля 2012 (изменено) local health_hud = nil local power_hud = nil local spots = {} local spot_init_table = {} local maptex = nil local is_hide = false local health = nil local power = nil function start_update() for id = 1, 65535 do local sobj = alife():object(id) if sobj then local ssect = sobj:section_name() for _, v in ipairs(list_arts) do if ssect == v then artefacts[id] = {} artefacts[id].spot = false artefacts[id].time_beep = 0 a_m.Tips:show(sobj:section_name(), "CAutoGnomTest",nil,5) end end end end end class "CAutoGnomSpot" (CUIScriptWnd) function CAutoGnomSpot:__init(owner, id, x, y) super() self:Init(0, 0, device().width, device().height) self.owner = owner self.id = id if spots[self.id] == nil then spots[self.id] = CUIStatic() spots[self.id]:SetAutoDelete(true) spots[self.id]:InitTexture("autognom_minimap\\white_dot") spots[self.id]:SetStretchTexture(false) spots[self.id]:SetWndRect(x, y, 2, 2) -- spots[self.id]:SetFont(GetFontLetterica16Russian()) spots[self.id]:Show(true) self:AttachChild(spots[self.id]) end end function CAutoGnomSpot:Update() CUIScriptWnd.Update(self) local obj = level.object_by_id(self.id) if obj and obj:position():distance_to_xz(db.actor:position()) <= self.owner.max_distantion and obj.health > 0 then local x, y = self.owner:get_pos_data(obj:position()) spots[self.id]:SetWndRect(x, y, 2, 2) if is_hide == false then spots[self.id]:Show(true) else spots[self.id]:Show(false) end local color = self:get_color(self.id) spots[self.id]:SetColor(color) if obj.health <= 0 then RemoveSpot(self.id) end else spots[self.id]:Show(false) end end function CAutoGnomSpot:get_color(id) local obj = level.object_by_id(id) local so = alife():object(id) local stalker = IsStalker(so) if obj:alive() then if obj:id() == db.actor:id() then return GetARGB(255, 255, 132, 0) -- its me) end if stalker then if obj:relation(db.actor) == game_object.friend then return GetARGB(255, 0, 255, 0) -- green elseif obj:relation(db.actor) == game_object.enemy then return GetARGB(255, 255, 0, 0) -- red else return GetARGB(255, 255, 255, 0) -- yelloy end end else return GetARGB(255, 127, 127, 127) end end -- *_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_* -- *_# Класс полоски здоровья -- *_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_* class "CAutoGnomHealth" (CUIScriptWnd) function CAutoGnomHealth:__init() super() self:Init(0, 0, device().width, device().height) self.overlay = CUIStatic() self.overlay:Init(157, 173, 128, 128) self.overlay:InitTexture("autognom_minimap\\green\\autognom_green_25") self.overlay:SetStretchTexture(true) self.overlay:SetAutoDelete(true) self.overlay:Show(true) self:AttachChild(self.overlay) end function CAutoGnomHealth:Update() CUIScriptWnd.Update(self) if health ~= db.actor.health then local num = math.floor(db.actor.health * 25) health = db.actor.health if num >= 0 then self.overlay:InitTexture("autognom_minimap\\green\\autognom_green_" .. tostring(num)) else self.overlay:InitTexture("autognom_minimap\\green\\autognom_green_0") end end if is_hide == false then self.overlay:Show(true) else self.overlay:Show(false) end end -- *_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_* -- *_# Класс полоски выносливости -- *_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_* class "CAutoGnomPower" (CUIScriptWnd) function CAutoGnomPower:__init() super() self:Init(0, 0, device().width, device().height) self.overlay = CUIStatic() self.overlay:Init(145, 10, 128, 128) self.overlay:InitTexture("autognom_minimap\\blue\\autognom_blue_25") self.overlay:SetStretchTexture(true) self.overlay:SetAutoDelete(true) self.overlay:Show(true) self:AttachChild(self.overlay) end function CAutoGnomPower:Update() CUIScriptWnd.Update(self) if power ~= db.actor.power then local num = math.floor(db.actor.power * 25) power = db.actor.power if num >= 0 then self.overlay:InitTexture("autognom_minimap\\blue\\autognom_blue_" .. tostring(num)) else self.overlay:InitTexture("autognom_minimap\\blue\\autognom_blue_0") end end if is_hide == false then self.overlay:Show(true) else self.overlay:Show(false) end end -- *_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_* -- *_# Класс миникарты -- *_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_* class "CAutoGnomMiniMap" function CAutoGnomMiniMap:__init() self.max_distantion = 70 self.map_radius = 85 self.map_cntr_x = 138 self.map_cntr_y = 138 self.disabled = false self.signal_power = { l01_escape = {90, 100}, l02_garbage = true, l03_agroprom = true, l04_darkvalley = true, l05_bar = true, l06_rostok = true, l07_military = true, l08_yantar = true, l10_radar = true, l11_pripyat = true } self.time_update = time_global() + 1000 self.update_map_r = false end function CAutoGnomMiniMap:update_map_radius(signal) self.map_radius = signal end function CAutoGnomMiniMap:update_map_radius_random() if self.update_map_r == true then local now_time = time_global() if now_time > self.time_update then self.time_update = now_time + math.random(500, 2000) local signal = math.random(self.signal_power[level.name()][1], self.signal_power[level.name()][2]) self:update_map_radius(signal) end end end function CAutoGnomMiniMap:get_pos_data(tpos) local cam_dir = device().cam_dir local dir = tpos:sub(db.actor:position()) vect = vector_rotate_y(vector():set(dir.x / self.max_distantion * self.map_radius, 0, -dir.z / self.max_distantion * self.map_radius), math.atan2(-cam_dir.x, cam_dir.z) / math.pi * 180) return vect.x + self.map_cntr_x, vect.z + self.map_cntr_y end function CAutoGnomMiniMap:is_disabled() if self.disabled == true then -- return true end return false end function CAutoGnomMiniMap:update() if self:is_disabled() then return end local hud = get_hud() if maptex == nil then ShowPowerHud() ShowHealthHud() ShowMapTex() end for id, obj in pairs(db.storage) do local obj = level.object_by_id(id) local sobj = alife():object(id) if sobj and obj then local stalker = IsStalker(sobj) if stalker and obj:position():distance_to_xz(db.actor:position()) <= self.max_distantion then local x, y = self:get_pos_data(obj:position()) if obj.health > 0 then local id = obj:id() -- if spots[id] == nil then AddSpot(self, id, x, y) -- end end end end end end -- *_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_* -- *_# Класс текстурки миникарты -- *_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_* class "CAutoGnomMapTex" (CUIScriptWnd) function CAutoGnomMapTex:__init() super() self:Init(0, 0, device().width, device().height) self.overlay = CUIStatic() self.overlay:Init(15, 15, 256, 256) self.overlay:InitTexture("autognom_minimap\\autognom_minimap") self.overlay:SetStretchTexture(true) self.overlay:Show(true) self.overlay:SetAutoDelete(true) self:AttachChild(self.overlay) end function CAutoGnomMapTex:Update() CUIScriptWnd.Update(self) --self.overlay:SetHeading(math.rad(math.random(360))) if is_hide == false then self.overlay:Show(true) else self.overlay:Show(false) end end function ShowMapTex() if maptex == nil then maptex = CAutoGnomMapTex() get_hud():AddDialogToRender(maptex) end end function RemoveMapTex() if maptex ~= nil then get_hud():RemoveDialogToRender(maptex) maptex = nil end end function CAutoGnomMapTex:__finalize() RemoveMapTex() end function ShowHealthHud() if health_hud == nil then health_hud = CAutoGnomHealth() get_hud():AddDialogToRender(health_hud) end end function RemoveHealthHud() if health_hud ~= nil then get_hud():RemoveDialogToRender(health_hud) health_hud = nil end end function CAutoGnomHealth:__finalize() RemoveHealthHud() end function ShowPowerHud() if power_hud == nil then power_hud = CAutoGnomPower() get_hud():AddDialogToRender(power_hud) end end function RemovePowerHud() if power_hud ~= nil then get_hud():RemoveDialogToRender(power_hud) power_hud = nil end end function CAutoGnomPower:__finalize() RemovePowerHud() end function AddSpot(owner, id, x, y) if spot_init_table[id] == nil then spot_init_table[id] = CAutoGnomSpot(owner, id, x, y) get_hud():AddDialogToRender(spot_init_table[id]) end end function RemoveSpot(id) if spot_init_table[id] ~= nil then get_hud():RemoveDialogToRender(spot_init_table[id]) spot_init_table[id] = nil end end function CAutoGnomSpot:__finalize() RemoveSpot(self.id) end function HideAllStatics() is_hide = true end function ShowAllStatics() is_hide = false end Когда загружаю игру, все мои статики корректно отображаются, всё работает без проблем, игра загружается через F6 без прблем Проблема в следующем: при переходе на другую локацию, игра крашится без лога. Показывается "Сервер: старт игры" и вылет без лога. Понять не могу вчём тут дело, помогите пожалуйста Както не хочется бросать эти наработки на пол дороги Используй для кодов соответствующий тэг (code), чтобы сохранять форматирование/отступы. --/Artos Изменено 23 Июля 2012 пользователем Artos Ссылка на комментарий
Shredder 49 Опубликовано 22 Июля 2012 Поделиться Опубликовано 22 Июля 2012 AutoGnom, очень хочется спросить: А за чем это всё? Эти полоски и миникарта они же и так есть... Ссылка на комментарий
AutoGnom 0 Опубликовано 23 Июля 2012 Поделиться Опубликовано 23 Июля 2012 AutoGnom, Я пишу свою модификацию, много чего не знаю ещё, учусь), хочется своих нароботок, а не копипастов)) Ссылка на комментарий
Shredder 49 Опубликовано 23 Июля 2012 Поделиться Опубликовано 23 Июля 2012 Я имею ввиду в оригинале есть. Или это тоже копипаст считается? =) Ссылка на комментарий
Artos 99 Опубликовано 23 Июля 2012 Поделиться Опубликовано 23 Июля 2012 (изменено) AutoGnom, создавая об'екты оконных классов в некоторых ситуациях следует их отключать/удалять "ручками", когда в них отпала надобность. Используй коллбэк на завершение игры и/или перехода на др.локацию и удаляй созданные об'екты. И/или, взгляни, например в _g.start_game_callback() - наверное не зря разработчики зачищают task_manager.clear_task_manager() и прочее. Добавлено через 26 мин.: Возвращаяс (по просьбе Kirgudu) к пропущенным прошлым вопросам: Вопрос о пропаже 'tktvtynf универсального хранилища: Непросто ответить в отрыве от применяемого контекста конкретного мода, тем более приведены логи только по созданию и чтению элементов хранилища. Честно говоря, меня несколько удивляет об'ем записи (6х8kB) и не является ли факт "пропажи" сбоем при записи некорректных данных. Если такая ситуация возникает (с чем еще ни разу не сталкивался), то следует вывести в лог и строки собственно функции записи в создаваемые элементы, их очистки/удаления элементов хранилица, и их спавна при загрузке сэйва и анализировать. И уточни версию скриптов универсального хранилища, т.к. вполне может быть что используешь устаревшую. На вопрос о прекращении табличной сортировки штатным методом, могу только сказать, что если в скриптах этот метод не затрагивается (а в m_helpers.script этого как раз нет), то причины изменения функционирования следует искать в ином месте. У меня и у других метод table.sort работает вполне корректно. Возможно используешь "странные таблицы", менял/добавлял динамические библиотеки (движек) или используешь какой-то лаунчер для запуска игры ... Добавлено через 22 мин.: Desertir Кратко: Почитай материалы по ООП, т.к. начинаешь оперировать не линейным кодом, а об'ектами. По идам ты в менеджер добавляешь об'екты классов схем и соответственно отсутствие какого-либо добавляемого об'ект спровоцирует вылет. Не зря в таких случаях предусмотрено добавление заглушки property_evaluator_const(false). Ну и конечно порядок активации схем важен, если последующие схемы используют в своей работе эвалуаторы/экшены от предшествующих. Не будет активирована требуемая схема - не будет и соответствующих об'ектов этой схемы - получишь вылет. Изменено 23 Июля 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Kirgudu 1 204 Опубликовано 23 Июля 2012 Поделиться Опубликовано 23 Июля 2012 Непросто ответить в отрыве от применяемого контекста конкретного мода, тем более приведены логи только по созданию и чтению элементов хранилища. Честно говоря, меня несколько удивляет об'ем записи (6х8kB) и не является ли факт "пропажи" сбоем при записи некорректных данных. Даже не знаю, как показать контекст. Вот архив с модулями, в которые я внедрил хранилище (все файлы, которые к нему относятся) https://dl.dropbox.com/u/56394435/HWM/HWM_plus_store.7z Данные в хранилище пишутся в модулях ogsm_notepad.script, ogsm_rare_items_manager и ogsm_rt_manager, остальное - часть комплекта хранилища или его подключение. Но в отрыве от мода запустить их вряд ли получится, если только код посмотреть. Могу архивнуть и выложить мод целиком. Логи я привёл только как иллюстрацию пропажи объекта, а не для показа конкретной ошибки. Ошибки-то я как раз и не обнаружил, о чём ниже. Что же касается объёма записи, то ничего удивительного тут нет. Он, кстати, даже больше - 6x16kB, - ведь речь идёт о моде для CS. Просто в хранилище должны были сохраняться изменяемые данные статей экспериментального КПК - дата создания и изменения, статус, всяческие примечания, заметки игрока. Особенно заметки игрока, уж очень их игроки просили. Пока пришлось отказаться. Если такая ситуация возникает (с чем еще ни разу не сталкивался), то следует вывести в лог и строки собственно функции записи в создаваемые элементы, их очистки/удаления элементов хранилица, и их спавна при загрузке сэйва и анализировать. Это было первое, что я сделал. Поставил вывод в лог во всех возможных закоулках как в se_stor и m_helpers, так и в bind_stalker, а также в модулях, где использовал хранилище. Всё чисто, никаких ошибок, некорректных данных нет (я специально оптимизировал сохраняемые таблицы так, чтобы в них были только простые типы данных или, максимум, вложенные таблицы с простыми типами собственных данных). Потом, при сужении области поиска, как раз и обнаружил, что пропадает custom объект вместе со своим tail пакетом, причём именно при чтении, а при записи по всем фронтам вроде бы порядок... И уточни версию скриптов универсального хранилища, т.к. вполне может быть что используешь устаревшую. Комплект хранилища брал отсюда: http://www.amk-team.ru/forum/index.php?sho...st&p=695329 Внедрял в мод с небольшой модификацией, описанной здесь (в конце поста): http://www.amk-team.ru/forum/index.php?s=&...st&p=707932 На вопрос о прекращении табличной сортировки штатным методом, могу только сказать, что если в скриптах этот метод не затрагивается (а в m_helpers.script этого как раз нет), то причины изменения функционирования следует искать в ином месте. У меня и у других метод table.sort работает вполне корректно. Возможно используешь "странные таблицы", менял/добавлял динамические библиотеки (движек) или используешь какой-то лаунчер для запуска игры ... В скриптах метод не затрагивается, расширений движка не делалось, лаунчер не используется, но штатный метод больше не работает. Впрочем, вопрос этот больше риторический, так как написанная мной функция прекрасно взяла на себя обязанности штатного метода. Может, кому-нибудь она тоже пригодится. А что в Lua подразумевается под "странными таблицами"? Вложенные таблицы, индексы, отличные от последовательной нумерации, метатаблицы, что-то ещё? Инструмент Ссылка на комментарий
Shredder 49 Опубликовано 23 Июля 2012 Поделиться Опубликовано 23 Июля 2012 Kirgudu, тоже сортировка сломалась (ЗП). Правда использую xray-extension. Если не сложно, выложи самописную функцию, чтобы мне велосипед не изобретать. А вот код, где сортировка не работает: --Таблица items заполняется выше и имеет структуру: --items[id_предмета] = секция_предмета local sort_items = {} for k,v in pairs(items) do item_w, item_h = _m.get_icon_size(v) sort_items[k] = {sect = v, width = item_w, id = k} end if _m.table_size(sort_items) > 1 then table.sort(sort_items, function(a,b) return (a.width < b.width) end) end Ссылка на комментарий
Kirgudu 1 204 Опубликовано 23 Июля 2012 Поделиться Опубликовано 23 Июля 2012 Shredder, да-да, точно такая сортировка, по одному из полей значений, и у меня перестала работать, но при этом без понятных (мне) внешних причин. В изначальном посте, где я про сортировку спрашивал, всё есть. И описание, и сама функция (с доп. функцией поддержки), и примеры использования. Вот здесь: http://www.amk-team.ru/forum/index.php?s=&...st&p=707932 Инструмент Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти