singapur22, Gun12
Сплошные респекты :-) ...
А вернемся от искусственного примера к реалиям и применим ка 'правильные' решения к практике!?
Например частенько в кодах игры применяется сбор в массив объектов (как делал тот же SkyLoader).
Возьмем более 'правильный' варант с занесением неких параметров непися в таблицу по ключу его игрового идентификатора, как обычно делается для:
db.storage[idObj] = {...}
Теперь, учитывая то, что таблица может использоваться различными скриптами и в том числе некоторые поля обнуляться (как штатно для db.storage[idObj] = nil) сторонними скриптами так и объекты исчезать из игры, какова будет 'правильная' и оптимальная функция глобальной 'чистки' таблицы? ;-) (вопрос с подвохом!)
А точнее, какова должна быть 'правильная' таблица и методы работы с нею, чтобы ею можно было пользоваться в ассинхронном режиме и периодически (или автоматом) выполнять глобальные чистки от устаревших пустых полей?
#Strchi : stalker_aGG--- game.graph либо не создан либо портаченый...
создай или пересоздай геймграф
Гейм граф есть я когда из Ле[Level editor] уровень вытошил тот гейм граф обьеденил с графом из ориганала тоесть мой из моего грава в оригиналльный граф вставил свой левл а он вот это пигшет когда на уровень новый загружает Expression : cross_table().header().game_guid() == game_graph().header().guid()
Function : CAI_Space::load
File : E:\stalker\patch_1_0004\xr_3da\xrGame\ai_space.cpp
Line : 121
Description : graph doesn't correspond to the cross table
Люди кто знает помогите пожалусто!
"Graph doesn't" узе отношение имеет к геймграфу... в нем косяк!
4. отвечать на вопросы желательно достаточно развернуто, задевая все аспекты касающиеся конкретного вопроса
в твоих же ответах кроме 'намека' на нечто ... более ничего полезного. :-(
Если НЕ выдергивать из сообщения лога знакомых буковок - то можно более информативное заключение дать:
graph doesn't correspond to the cross table - невозможно создать общую таблицу графа, иными словами для полноты массива не хватает данных (вероятно пробелы в диапазонах гейм-вертексов для собираемых локаций).
Artos Задача изначально лежала по строго-индектированным таблицам, с чем собственно и работали.
А вот про смешанн**5002618d69873ce82a42** ("условие") then
table.insert(tbl, k)
end
end
for _,v in ipairs(tbl) do
db.storage[v] = nil
end[/code]
Описаний я думаю производить не нужно. И так понятно, что для начала производим запоминание ссылок на нежелательные элементы. После чего, путём их итерации производим удаление их из превоначальной таблицы.
Это только первое моё решение, без учёта всех нежелательных факторов.
Ты хочешь сказать, что тебе нужно, не только решение чистки, но и оптимальную конструкцию самой таблицы?
отредактировал(а) singapur22: 07-06-2011 19:54 GMT3 час. Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22
Ну изначально то как раз таблица у SkyLoader'а была 'свалкой объектов' без всякой индексации ...
Ну да не суть.
В моем предложении упор не столь на 'как добавить иль обнулить', а правильное и оптимальное ее использование и чистка.
В предложенном тобою варианте будет немало пустых полей после 'чистки' и если берем тот же db.storage, то немало вариантов из исходных кодов с:
if id=1,#db.storage do
...
end
или:
local var = table.getn(db.storage[idObj].param)
будут выдавать далеко не всегда корректные значения
P.S. Вот когда зайдет речь об упомянутом мною 'подводном камне' - тогда всплывет вопрос о правильной структуре таблицы. Это скорее всего необходимо, если не будет найден вариант чистки 'обычной' структуры (например, для той же db.storage)
Artos #db.storage ??? Это ещё как? Таблица изначально не строго-индексирована (смешанная). А значит, данный оператор никогда не вернёт реальный размер таблицы.
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
Artos Но если использовать строгую индексацию, и сохранять id в его значениях, то запрос объекта по его id будет достаточно сложным. Для каждого объекта придётся итерировать таблицу. А это, время. Что ещё более не желательно.
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22
Упомяну про подводный камень. Т.к. отловить подобное на практике практически нереально, то конкретных подтвержденных случаев не имею, но есть подозрения, что порой все же возможно ...
Как известно игровые идентификаторы (ID) выдаются строго индавидуально и не могут дублироваться в игре. Это и является преимуществом их использования в качестве ключа при создании таблиц/массивов.
Идентификаторы порою освобождаются и ... выдаются вновь(!), т.к. выдается первый свободный идентификатор.
Возникает ситуация:
1. В массив запоминаем по ключу идентификатору объект (точнее линк/ссылку на его юзердату).
2. При удалении объекта из игры возникает рассинхронизация: запоминали клиентский объект, сервер удаляет серверный объект (т.е. клиентская юзердата еще в игре!) и может сразу выдать освободившийся идентификатор в игру совершенно иному заспавнившемуся объекту.
3. Как минумум возникает кратковременная ассинхронная ко всем скриптам коллизия наличия в таблице и ключа и устаревшей уже юзердаты и ... невозможность проверить достаточно однозначно отсутствие серверного объекта в данным идентификатором.
Т.о. с одной стороны нежелательность утяжелять код излишними перепроверками, а с другой ... хотя и малая, но вероятность возникновения коллизий. Поэтому и упомянул о 'правильной' структуре таблицы ...
Пока же придерживаюсь правила - стараться не использовать в массивах сами объекты(юзердаты), что конечно же зачастую несколько накладнее ...
Artos Можно создать отдельную функцию (или метод), производимый операцию alife():release() с очисткой db.storage от удаляемого объекта. Но в этом случае придётся править всю скриптовую систему, где используется данный метод. Но и это не решит проблему. Есть ещё один подводный камень. db.storage работает только с клиентскими объектами, а значит и при переходе онных в offline так же происходит кратковременная рассинхронизация.
добавлено спустя 4 минут
Strucklocal obj = level_object_by_sid(sid) Определяет объект по его сиду, если онный находится в онлайн. Иначе возвращает nil.
К сведенью. Каждый объект в игре имеет как свой id, так и свой sid. Только sid, в отличии от id можно задать объекту заранее (принудительно). Проверить, задан объекту sid принудительно, или автоматом, можно сравнивая его со списом sid'ов в файле game_story_ids.ltx общеизвестными методами класса ini_file().
отредактировал(а) singapur22: 07-06-2011 21:10 GMT3 час. Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22 alife():release() - удаляет сервеный объект и задержка удаления клиентского объекта как минимум два периода апдейта актора (~40ms).
Сам то db.storage хранит не объекты в полях, а таблицы с параметрами, поэтому с этой таблицей попроще, только нилы подчищать для оптимизации (если есть желание у кого).
Вот учитывая и твои и мои 'нюансы' и еще не названные и призвал потрениоваться на создании и 'правильных' таблиц и 'правильных' функций работы с ними. :-)
P.S. и поправлю:
Каждый объект в игре имеет как свой id, так и свой sid.
Если id строго индивидуален и не может быть одинаковых у двух и более объектов, то sid, если он не присвоен 'ручками' (в конфигах иль иначе), то всегда един 4294967296 (-1). Т.е. образом не у каждого 'свой' эксклюзивный.
А в 'game_story_ids.ltx' во-первых, далеко не все sid'ы и это скорее массив соответствий числовых и тексовых меток ... для использования, например, тем же таск-менеджером.
Если id строго индивидуален и не может быть одинаковых у двух и более объектов, то sid, если он не присвоен 'ручками' (в конфигах иль иначе), то всегда един 4294967296 (-1). Т.е. образом не у каждого 'свой' эксклюзивный.
Отнюдь, не всегда. Тестировал данную тему разносторонне, и не однократно происходило назначение различных sid. (Обычно в пределах 5000.) При спавне скриптом. Хотя, возможно это из-за кривости работы двигателя, в некоторых случаях.
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22
Я и не тороплю. :-), вернемся конечно же позже.
P.S.
... и не однократно происходило назначение различных sid
Извини, но не поверю!
Присвоение сида (story_id) при спавне возможно только при спавне по секции из all.spawn'а, т.е. объекта, достаточно полно описанного в соотв.секции с назначением сида.
При обычном спавне всем объектам прописывается дефолтное w_s32(-1) и движок тут не при чем. За весь период юзания мною различных версий игры ни разу не ловил 'левых' сидов.
Artos Кстати, escape_dialog.esc_unik_npc по статье вставил в info_portions.xml. В указанные строки и получилось: storyline_eliminate_gunslinger escape_dialog.esc_unik_npc
Что это за строки?
1. Вы сейчас в интернете
2. Вы на сайте stalker-portal
3. Вы читаете
5. Вы не заметили, что отсутствует пункт 4
6. Вы это проверили
7. Вы улыбаетесь
8. Поставь себе в подпись и нас будет больше
serega_zombi_stalker это инфопоршень который выдается при старте игры, вызывается если память не изменяет из апдейта актора, впринципе туда можно вписать все стартовые функции
serega_zombi_stalker
1. У меня нет никакого желания растолковывать азы. Различных строк в кодах ой как немало и заниматься объяснениями их у меня нет ни времени ни желания. Читай статьи, хотя ...
2. Нет так же желания выступать редактором и правщиком всевозможных статей, коих понаписано ой как немало и с ... ой каким качеством :-(
Почему-то автору, используемой тобою статьи, взбрело в голову вставлять тэги c вызовом функции в инфопоршни, кои для этого НЕ предназначены.
Вставь указанные тэги в диалог Сидоровичу и не морочь голову ни себе ни другим, как это сделал горе-автор статьи ...
Или:
Открой тот же 'escape_dialog.script' и вставь свою строку спавна в функцию:
function give_weapon_to_actor (trader, actor)
dialogs.relocate_item_section(trader, "wpn_pm", "in")
dialogs.relocate_item_section(trader, "ammo_9x18_fmj", "in")
dialogs.relocate_item_section(trader, "ammo_9x18_fmj", "in")
dialogs.relocate_item_section(trader, "wpn_knife", "in") alife():create("esc_unik_npc",vector():set(-218.20,-20.2,-145.63),35362,47)
end
и будет спавнится твой NPC при разговоре с Волком (одновременно с выдачей ГГ оружия).
А как можно запустить в окошке по порядку текстуры(создать эффект видеоролика)?...пока вижу только выход делать динамическими статиками, спрашиваю в расчёте на то, что есть более рациональный способ.
В частности желательно разобрать пример на текстурах типа ui_pda_anims_0x.dds
И второй вопрос, можно ли как-то обрабатывать строки из листинга? В частности мне нужно около элементов(непосредственно самих строк) отрисовывать иконки(хотя бы одного типа).(Если только делать кучу статиков с каждой иконкой, то я пожалуй откажусь от этой идеи)
Появились проблемы кое-какие:
1)У кого-нибудь работает нет-спавн монстров? У меня он вроде не обрабатывается. Тестировал на гражданских зомби.
2)Есть ли оригинальные методы поиска файла и дальнейшего получения пути? Или надо пользоваться методами длл от alpeta?
Ребята всем спс разобрался новая локация подключена.!
Есть ешо один (уровень как токо вышел из сдк я его тестил освишение хорошее) аа (вот как в сингл подключил к отстольным уровням сразу странное и не красвое стало освишение ) почему так и как исправить ? За рание спс
добавлено спустя 7 минут
#Dark Scripter :
Strchi
На создание одной добротной локации одним человеком могут уйти годы.
:no) Я один в команде мапер но работаю нормально и локации хорошие выходят, и не тратил я на это многие годы а карты добротные как вы говорите, тестер одобрил - а маперством занимаюсь всего пол года!:ye)
отредактировал(а) stalker_aGG---: 08-06-2011 08:07 GMT3 час. Не отпушу, стой догоню :):-G
stalker_aGG--- для того чтобы делать интересные и захватывающие локации не нужен стаж, а нужна фантазия
А по тестеру...знаешь говорят "Не равняй всех, по одному", я конечно искренне верю что локации и вправду хорошие, но некоторым не понравится(всем же не угодишь, да и не надо к этому стремится), а некоторые специально будут говорить что локации дрянь
#Struck :
Согласен у меня сечас токо одна проблема сначал на локации хорошее освишение обьектов а как в в сингл запихаю сразу мерское становится аот не знаю что делать
:( если кто знает помогите плизззз !?
Создал ХУД модель оружия, экспортировал в СДК, устанавливая тип костей пол**5001618d69873ce82a42**ed: !Index !=-1, file P:\MagicFM_borland\FreeMagic\Source\Containment3D\MgcCont3dMinSphere.cpp, line 497[/code]
Знающие люди подскажите в чём дело и возможные пути решения.
S.T.A.L.K.E.R. Secret of the Zone: Gunslinger's Story. Prologue - разработка.
Эта тема закрыта, публикация новых сообщений недоступна.
Продолжая пользоваться сайтом, вы соглашаетесь с использованием файлов cookie. Страницы сайта могут содержать информацию, запрещенную для просмотра посетителям младше 18 лет. Авторское право на серию игр «S.T.A.L.K.E.R» и используемые в ней материалы принадлежит GSC Game World.