Wik 0 Опубликовано 8 Января 2012 Поделиться Опубликовано 8 Января 2012 KD87 спасибо что откликнулся, ну я не знаю как это. И почему нужно менять, когда мне нужно сделать новый story_id. Добавлено через 7 мин.: И еще вопрос как сделать, чтоб при взятии предмета, или во время обыска тайника, трупа спавнились НПС. Ссылка на комментарий
ziStam 1 Опубликовано 8 Января 2012 Поделиться Опубликовано 8 Января 2012 (изменено) Всем здравия желаю! Наверное это наиболее подходящая тема... Создал новый класс, но при старте новой игры получаю вылет 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 : d:\x-ray cop sdk\editors\gamedata\scripts\_g.script:562: table index is nil stack trace: Прилагаю подробные коды: cs_register (object_factory, "CDemon", "se_monster.se_monster", "SM_DMN", "demon_s") monster_classes = { ... [clsid.demon_s] = true} -- вот на эту строчку игра и ругается function is_monster_demon(actor, npc) return npc:clsid() == clsid.demon_s end monster_classes = { ... [clsid.demon_s ] = "demon", -- в конце предыдущей строки запятая была изначально, сделал по анологии } C++ class clsid { ... const demon_s = 400; }; C++ class CDemon : CGameObject { CDemon (); function Visual() const; function _construct(); function getEnabled() const; function net_Import(net_packet&); function net_Export(net_packet&); function getVisible() const; function net_Spawn(cse_abstract*); function use(CGameObject*); }; П.с Платформа ЗП Вопроса два: 1) Нужно ли добавлять класс в lua_help.script 2) Собственно что я не так сделал? Изменено 8 Января 2012 пользователем ziStam Legend of Stalker Ссылка на комментарий
NaslednikTutti 1 Опубликовано 8 Января 2012 Поделиться Опубликовано 8 Января 2012 _Призрак_, что значит "сувал под гулаг непися"? Если ты имеешь ввиду, писал ли я что-то в gulag_ххх.script, то нет. Пути прописал в way_xxx.ltx, логику в файл с логикой непися - esc_blokpost_sniper1_logic.ltx и всё. [escape_blokpost_chasovoy_look] points = p0,p1 p0:name = name00|a=guard_chasovoy p0:flags = 0x2 p0:position = -158.486877,-30.824171,-286.253876 p0:game_vertex_id = 1091 p0:level_vertex_id = 92831 p1:name = name01|a=guard_chasovoy p1:flags = 0x1 p1:position = -149.406265,-29.899168,-363.256896 p1:game_vertex_id = 1026 p1:level_vertex_id = 103521 [escape_blokpost_chasovoy_walk] points = p0,p1 p0:name = name00 p0:flags = 0x1 p0:position = -168.318710,-25.436260,-353.395844 p0:game_vertex_id = 1021 p0:level_vertex_id = 80829 p0:links = p1(1) p1:name = name01 p1:flags = 0x2 p1:position = -166.309357,-25.436119,-354.571533 p1:game_vertex_id = 1021 p1:level_vertex_id = 83334 p1:links = p0(1) [smart_terrains] none = true [logic@esc_blokpost_sniper1] active = walker1 danger = danger_ignore [danger_ignore] ignore_distance = 5 [walker1] path_walk = escape_blokpost_chasovoy_walk path_look = escape_blokpost_chasovoy_look team = escape_blocpost Переименовал пути: имя_смарта_имя_пути esc_blokpost_sniper1_smart - имя_смарта escape_blokpost_chasovoy_walk - имя_пути ! Unknown command: dump_infos ! Cannot find saved game ~abort-raw:there is no patrol path %s * Log file has been saved successfully! ! Cannot find saved game ~abort:there is no patrol path esc_blokpost_sniper1_smart_esc_blokpost_sniper1_smart_escape_blokpost_chasovoy_w alk * Log file has been saved successfully! stack trace: 0023:0826E8B3 xrGame.dll, CDialogHolder::CDialogHolder() 0023:0826FB45 xrGame.dll, CDialogHolder::CDialogHolder() 0023:05772EA3 lua.JIT.1.1.4.dll, luaopen_io() [error][ 183] : Невозможно создать файл, так как он уже существует. Не соответствует правилам. Ссылка на комментарий
Artos 99 Опубликовано 8 Января 2012 Поделиться Опубликовано 8 Января 2012 (изменено) ziStam, ты НЕ создал новый класс, а попытался его создать допустив ошибки. 1. Не думай, что написав удобное тебе - ты получишь новый класс. Нет такого клиентского класса "CDemon", чтобы ты его мог использовать для создания связки клиент-сервер -> т.о. эта строка просто будет проигнорирована ... 2. Т.к. в соответствии с п.1. класс не был создан -> не появится и clsid.demon_s в игре и первая же попытка в _g.script получить значение табличного поля по nil-ключу заканчивается фаталом ... Загляни в топик "Справочник по классам и функциям" и почитай по теме создания новых классов/связок. Чего-либо добавлять в lua_help.script не требуется. Это вообще НЕ скрипт, а записка для модмейкера, которую можно читать/выкинуть, но не использовать скриптами. Изменено 8 Января 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
ziStam 1 Опубликовано 8 Января 2012 Поделиться Опубликовано 8 Января 2012 Artos, сначала я естесственно почитал вот это: Регистрация скриптовых классов с помощью object_factory. Делал исходя из этого, но возможно некоторые аспекты я все же упустил... А если поменять CDemon на допустим CCat то я так понимаю движок это "съест"? Legend of Stalker Ссылка на комментарий
Artos 99 Опубликовано 8 Января 2012 Поделиться Опубликовано 8 Января 2012 (изменено) ziStam, ты "читал как создать", но упустил "необходимые условия для этого", т.е. то, что в игре нам в скриптах доступно не так уж много клиентских классов объектов, чтобы можно было бы содать пары (хотя и в ЗП разрабы нам немного добавили). Ну а по вопросу - быстрее бы поменял и запустил бы игру, чтобы увидеть, что это сработает и появится у тебя в массиве clsid еще один идентификатор, сдвинув некоторые другие вниз. Т.к. никаких пока секций ты не спавнишь, то голый класс без созданных на его базе объектов ничем в игре не помешает. Ну а далее - все зависит от тебя и от параметров для создаваемых тобою объектов, зависящих от используемого клиентского класса. Изменено 8 Января 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
KD87 718 Опубликовано 9 Января 2012 Поделиться Опубликовано 9 Января 2012 (изменено) ziStam, ты, очевидно, читал, что: Естественно не получится комбинировать клиентский и серверный классы в произвольных сочетаниях. Они друг другу должны соответствовать. Кроме того, должен быть соответствующий экспортированный клиентский классДаже не знаю, что тут еще можно сказать. CCat движок, конечно, съест, если соответствующий серверный класс будет наследовать от cse_alife_monster_base. Wik, работа с нет-пакетами разжевана тысячу раз. Смотри соответствующий код АМК, хотя бы. Изменено 9 Января 2012 пользователем KD87 Ссылка на комментарий
NaslednikTutti 1 Опубликовано 9 Января 2012 Поделиться Опубликовано 9 Января 2012 (изменено) Здравствуйте! Снова я с логикой непися. С предыдущим вопросом разобрался наконец. Заспавнил пару нпс, задал им пути. Все хорошо. Заспавнил сейчас нпс, хочу сделать его что-то типа Волка из ТЧ в начале игры. При появлении ГГ, нпс махает рукой и говорит "подходи пообщаемся". Заставляем NPC здороваться и прощаться голосом Отредактировать секцию meet в логике: [meet_guide] close_snd_hello = rolan_hello_snd close_snd_bye = rolan_hello_snd_bye abuse = false use = true allow_break = false meet_on_talking = false В файле configs\misc\script_sound_xxx.ltx создать секции Rolan_hello_snd и rolan_hello_snd_bye по аналогии с др.(разобраться легко) [smart_terrains] none = true [logic@widmore_mercenaries1] active = remark1 danger = danger_ignore [danger_ignore] ignore_distance = 5 [remark1] no_move = true anim = hello_wpn <--- Анимация - НПС с оружием в одной руке, машет другой target = story | actor <--- НПС смотрит только на ГГ on_signal = anim_end | remark@wait <--- По окончании проигрывания анимации, нпс переходит на схему remark@wait meet = meet_guide [remark@wait] no_move = true anim = guard <--- Анимация - НПС стоит с оружием в руках target = story | actor [meet_guide] close_snd_hello = widmore_mercenaries_hello <--- Как я понял вызов звука abuse = false use = true allow_break = false meet_on_talking = false В игре, он только машет рукой, на схему remark@wait не переходит и звук не проигрывается. [remark] anim = анимация snd = звук snd_anim_sync = true on_signal = action_end | следующая схема Происходит тоже самое, он машет только рукой, на следующею схему не переходит и звук не проигрывается. Сам звук "widmore_mercenaries_hello" взял из ТЧ. В script_sound.ltx добавил #include "script_sound_escape.ltx" Создал файл "script_sound_escape.ltx в нём прописал [list_script_sound_escape] widmore_mercenaries_hello [widmore_mercenaries_hello] type = npc path = scenario\escape\widmore_mercenaries_hello shuffle = seq idle = 1,1,100 Помогите пожалуйста с этим разобраться. Где я опять накосячил? Работаю на ЗП 1.6.02 Изменено 9 Января 2012 пользователем NaslednikTutti Не соответствует правилам. Ссылка на комментарий
*Shoker* 322 Опубликовано 9 Января 2012 Поделиться Опубликовано 9 Января 2012 (изменено) KD87 Возможно мои данные устарели, т.к конкретно с присовением story_id через нет-пакет я ещё в 2008 что то делать пытался, но если мне не изменяет память, если создать объект и приписать ему story_id, то потребуется операция save\load чтобы игра его правильно засчитала. Возможно я ошибаюсь, т.к тогда мало что по этому поводу знал. А что именно делал тогда уже не помню. ziStam Смысл тебе вообще создавать свой класс? Все серьёзные классы игровых объектов описаны в движке, и создав свой класс CDemon ты по сути получишь старый класс с другим именем (в данном случае ты просто скопируешь все свойства класса CCat). Максимум что ты можешь попробовать сделать это расширить функционал класса через скрипты. Но набор методов там довольно скудный и их можно реализовать без всяких классов и прочего. Тоесть твоя затея не несёт никакого смысла кроме как просто дать твоему монстру другой класс который по сути будет отличаться от старого одним лишь именем. Изменено 9 Января 2012 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
KD87 718 Опубликовано 9 Января 2012 Поделиться Опубликовано 9 Января 2012 *Shoker*, так ведь story_id хранится в пакете cse_alife_object, а не cse_abstract. Это значит, что прочитать его можно в любой момент. Ссылка на комментарий
xStream 86 Опубликовано 9 Января 2012 Поделиться Опубликовано 9 Января 2012 (изменено) KD87, я думаю, проблема не в том, чтоб его прочитать или записать, а в том, что он должен попасть в реестр стори_идов. А это, насколько мне известно (в том числе и по опытам, аналогичным опытам *Shoker*), происходит в момент старта игровой сессии. (черт, похоже не в тему ответила. Я имею ввиду такие ситуации, как споты в ПДА на определенные объекты. Там задействован реестр) Изменено 9 Января 2012 пользователем xStream Все, кто стоит на моем пути: идите нахрен и там погибните! © Ссылка на комментарий
Artos 99 Опубликовано 9 Января 2012 Поделиться Опубликовано 9 Января 2012 (изменено) *Shoker*, что-то ты ... не по делу ... 1. Ты забыл, что меняя нет-пакеты объектам, ты это делаешь для серверного объекта(!) и в этом случае, установив желаемый стори-ид, ты его можешь сразу же увидеть se_obj.m_story_id -> тобою установленное ... Если же желаешь, чтобы и гейм-объект (копия серверного) получил этот идентификатор, то или как ты говоришь, делай save/load или ... все гораздо проще, нужно всего лишь отправить объект в оффлайн и обратно и дождаться, когда он оттуда выйдет. Тогда и obj:story_id() вернет установленный тобою идентификатор. 2. Не стОит обсуждать смысл тех или иных ковыряний в кодах игры. Кто-то учится, кто-то мод делает и его задумки нам неизвестны. Есть ли смысл делать свой класс, который мало чем (иль ничем не) отличим от имеющихся? Для тебя может и нет смысла, но не зная задумок/целей нужно ли отговаривать? Даже тобою упомянутая причина - иметь свой clsid, по которому годаздо проще (чем по тем же секциям/именам) выделять нужный объект в игре. Понаделав, например, крыс на классе тушканов, можно оптом исключить их из различных апдейтов и пр. что даст разгрузку в игре. В тех же биндерах, можно для каждого (под)класса понаделать своих методов иль проверок. и т.п. ... причин, имеющих смысл может быть немало. Изменено 9 Января 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
ziStam 1 Опубликовано 9 Января 2012 Поделиться Опубликовано 9 Января 2012 Artos, задумка собственно заставить демона летать, + чтобы он сидел на родных анимках из метро. Но чую это не выйдет... Т.к я пока подставил за место CDemon класс CFracture, то собственно возникает вопрос: где нужно регистрировать класс CDemon? Я перед этим спрашивал в ковырялке зп, где хранится список анимаций для монстров?, т.к я хочу создать свой собственный список анимаций, вот собственно и вся цель ковыряния классов. П.с. При подстановке в конфиге допустим за место класса SM_BLOOD класса SM_BOAR, получаем вылет, мол нехватает анимки какой-нибудь. Вот и пришел к выводу что список анимаций зависит от класса Legend of Stalker Ссылка на комментарий
Artos 99 Опубликовано 9 Января 2012 Поделиться Опубликовано 9 Января 2012 (изменено) ziStam, ты замахнулся на 'выше своей головы', т.е. не по багажу своих сегодняшних знаний игры. Поштудируй мануалы по теме. 1. Не путай, анимки для сталкеров (гуманоидов) действительно имеют и списки и менеджер анимок и пр., но все не так для всех остальных объектов/классов. Монстры НЕ имеют списков, все прописано по классам в моделях и файлах gamedata\meshes\monsters\xxx__animation.omf. Соответственно какой класс у твоего монстра - те анимки ему и доступны. 2. Не путай ты себя классом CDemon, нигде не нужно его прописывать. Ты сoздал свой класс, точнее связку клиент-сервер классов и этой новой связке/классу присвоил прописанный тобой CLSID = 'SM_DMN', который в массиве clsid будет иметь под тобою заданным полем 'demon_s' некий эксклюзивный числовой идентификатор. О каких SM_BLOOD иль SM_BOAR ты ведешь речь? Ты делаешь секции для прежних классов кровососа иль кабана? Если ты создаешь свою секцию для своего монстра - то и обязан внести в эту секцию все необходимые параметры для данного класса (те же самые что и для родительского) и естественно использовать только те анимки, которые доступны (см. п.1) для выбранной модели. Если модель будет от неподходящего класса, т.е. не будет соответствия с xxx__animation.omf -> фатал. Изменено 9 Января 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
ziStam 1 Опубликовано 9 Января 2012 Поделиться Опубликовано 9 Января 2012 Artos, возможно я опять что-то упустил, но при старте новой игры происходит вылет: Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : d:\x-ray cop sdk\editors\gamedata\scripts\_g.script:562: table index is nil Вылет происходит в любом случае, даже если демон и не заспавнен. Но! Если поменять класс демона на класс излома(CDemon на CFracture), то вылет исчезнет. Ясное дело что такая затычка несовсем правильная, встает вопрос, почему? Коды приводил выше Legend of Stalker Ссылка на комментарий
KD87 718 Опубликовано 9 Января 2012 Поделиться Опубликовано 9 Января 2012 (изменено) ziStam, клиентский класс должен быть экспортирован из движка. В движке сталкера нет класса CDemon, соответственно, он не экспортирован. Значит, на его основе нельзя создавать сеты. Ты можешь создать скриптовый класс на основе экспортированного клиентского. Список экспортированных клиентских классов можно посмотреть в lua_help. Изменено 9 Января 2012 пользователем KD87 Ссылка на комментарий
Artos 99 Опубликовано 9 Января 2012 Поделиться Опубликовано 9 Января 2012 ziStam, жаль, что ты не читаешь/не воспринимаешь уже сказанное. :-( Повторю еще раз - далее сам ковыряйся. 1. Нет такого CDemon клиентского класса игре. Ничего движек игры о CDemon не знает и любые попытки создать серверную пару с ним будут выдавать нил-результат. Поэтому у тебя и НЕ создаются ни пара, ни регистрируются CLSID'ы(!), но ... движек в лог тебе ничего не выдает. Ну а так как не был зарегистрирован новый класс/пара - то и твое clsid.demon_s == nil (!) Естественно, любая попытка получить из какой-либо таблицы нечто типа: table[clsid.demon_s] приводит к фатальной ошибке (table[nil]). Когда ты меняешь CDemon => CFracture (иль иной клиентский класс имеющийся в игре и доступный из скриптов), то и пара создается и регистрируется твой clsid.demon_s - вот и нет вылетов. 2. Если экспериментируешь с новым классом то, совет: не добавлять свой clsid напрямую в таблицы, а добавлять после проверки наличия его, т.е. типа: monster_classes = { [clsid.bloodsucker_s] = true, ... } if clsid.demon_s then monster_classes[clsid.demon_s] = true end ... - тогда при ошибке создания класса не будет вылета, но и создать новый объект на несуществующем классе не сможешь. Ну а если создан класс/clsid - то все будет штатно ... "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
*Shoker* 322 Опубликовано 10 Января 2012 Поделиться Опубликовано 10 Января 2012 (изменено) Artos Я конечно понимаю что это может дать определённые преимущества. Но зная ziSteam могу сказать что ему пока надо совсем не это, и уровень у него ещё совсем не тот, чтобы такими тонкостями заниматься, ему сейчас класс нужен совсем не для этого. Он хочет создать летающего монстра создав свой класс, но проблема в том, что, как я уже сказал, классы монстров зашиты в движок, и все освновные функции (их движение, анимации, атаки) зашиты в движке. (я утирую, так что не надо к словам придираться) ziStam Тоесть создав новый класс ты лишь можешь взять за основу существующий. В движке CDemon-а НЕ СУЩЕСТВУЕТ. И в движок ты его НЕ ДОБАВИШЬ. Ты можешь лишь сделать свой класс на основе существующего, что для тебя никакой выгоды в данный момент не несёт. А в движке из летающих монстров разве что Ворона, а она кроме как летать ничего не умеет. Единственное что я тебе могу посоветовать - делать Демона на классе Снорка. Он умеет прыгать, что можно анимацией переделать на полёт. И будет твой демон (из Метро я полагаю) как бэ по земле ползать да "летать" (делать большие прыжки) при виже противника. Это лучшее что ты сможешь сделать со своей идеей. Всё что тебе надо, это подстроить модель Демона на кости и снорка (я тут тонкостей уже не знаю, это в другую тему) И никакой новый класс не нужен. Artos: Если экспериментируешь с новым классом то, совет: не добавлять свой clsid напрямую в таблицы, а добавлять после проверки наличия его, т.е. типа: Совет полезный, но ты так можешь его запутать, создаст что нить, вылета не будет но и работать не будет, вот и будет гадать. По крайнем мере такое (имхо) стоит делать уже после тестирования объекта. Подредактировал пост. В дальнейшем, адресуя слова одному - не забывай переключаться в посте на другого ... --/Artos Изменено 10 Января 2012 пользователем Artos Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Artos 99 Опубликовано 10 Января 2012 Поделиться Опубликовано 10 Января 2012 (изменено) *Shoker*, мой совет дан НЕ только одному ... и уж как раз именно для стадии тестирования. Когда перепроверено - то можно иль удалить или напрямую в таблицу включить. Ну а то, что вылета не будет - так и вопрошать начнет уже не про этот банальный вылет, а про иное, и ... глядишь сам поймет свою ошибку. Второе применение моего совета - писать так, когда код/скрипт может быть применен в не одной версии игры и если clsid в одной из версий отсутствует - это как раз и даст совместимость. И ... свои разборки межличностные ведите/советуйте/отговаривайте где-нибудь в ЛС иль аске, а в топики форума пишите с учетом, что его читеете не только вы вдвоем. Изменено 10 Января 2012 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Полтергейст 37 Опубликовано 11 Января 2012 Поделиться Опубликовано 11 Января 2012 У меня пара вопросов по использованию скрипта state_mgr: 1. Как вручную сбрасывать состояние? Например, если я установлю состояние "wounded_heavy", а поcле определённого события нужно сбросить состояние. 2. В файле state_mgr_goap есть вот такая строка: st.planner = state_mgr.action_planner() кто-нибудь может объяснить, почему не происходит вылета? В скрипте state_mgr нет такой функции. Если это вызов конструктора класса, то чем это отличается от такого варианта? st.planner = action_planner() Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти