Перейти к контенту

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

KD87 спасибо что откликнулся, ну я не знаю как это.

И почему нужно менять, когда мне нужно сделать новый story_id.

 

Добавлено через 7 мин.:

И еще вопрос как сделать, чтоб при взятии предмета, или во время обыска тайника, трупа спавнились НПС.

Ссылка на комментарий

Всем здравия желаю! Наверное это наиболее подходящая тема... Создал новый класс, но при старте новой игры получаю вылет

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) Собственно что я не так сделал?

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

Legend of Stalker

Ссылка на комментарий

_Призрак_, что значит "сувал под гулаг непися"? :unsure:

Если ты имеешь ввиду, писал ли я что-то в 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] : Невозможно создать файл, так как он уже существует.

 

 

 

Не соответствует правилам.

Ссылка на комментарий

ziStam, ты НЕ создал новый класс, а попытался его создать допустив ошибки.

1. Не думай, что написав удобное тебе - ты получишь новый класс. Нет такого клиентского класса "CDemon", чтобы ты его мог использовать для создания связки клиент-сервер -> т.о. эта строка просто будет проигнорирована ...

2. Т.к. в соответствии с п.1. класс не был создан -> не появится и clsid.demon_s в игре и первая же попытка в _g.script получить значение табличного поля по nil-ключу заканчивается фаталом ...

 

Загляни в топик "Справочник по классам и функциям" и почитай по теме создания новых классов/связок.

 

Чего-либо добавлять в lua_help.script не требуется. Это вообще НЕ скрипт, а записка для модмейкера, которую можно читать/выкинуть, но не использовать скриптами.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий
Artos, сначала я естесственно почитал вот это:

 

Регистрация скриптовых классов с помощью object_factory. Делал исходя из этого, но возможно некоторые аспекты я все же упустил... А если поменять CDemon на допустим CCat то я так понимаю движок это "съест"?

Legend of Stalker

Ссылка на комментарий

ziStam, ты "читал как создать", но упустил "необходимые условия для этого", т.е. то, что в игре нам в скриптах доступно не так уж много клиентских классов объектов, чтобы можно было бы содать пары (хотя и в ЗП разрабы нам немного добавили).

Ну а по вопросу - быстрее бы поменял и запустил бы игру, чтобы увидеть, что это сработает и появится у тебя в массиве clsid еще один идентификатор, сдвинув некоторые другие вниз.

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

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

ziStam, ты, очевидно, читал, что:

Естественно не получится комбинировать клиентский и серверный классы в произвольных сочетаниях. Они друг другу должны соответствовать. Кроме того, должен быть соответствующий экспортированный клиентский класс
Даже не знаю, что тут еще можно сказать. CCat движок, конечно, съест, если соответствующий серверный класс будет наследовать от cse_alife_monster_base.

Wik, работа с нет-пакетами разжевана тысячу раз. Смотри соответствующий код АМК, хотя бы.

Изменено пользователем KD87
Ссылка на комментарий

Здравствуйте! Снова я с логикой непися.

С предыдущим вопросом разобрался наконец. Заспавнил пару нпс, задал им пути. Все хорошо.

 

Заспавнил сейчас нпс, хочу сделать его что-то типа Волка из ТЧ в начале игры. При появлении ГГ, нпс махает рукой и говорит "подходи пообщаемся".

Заставляем 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

 

 

 

Помогите пожалуйста с этим разобраться. :unsure: Где я опять накосячил?

Работаю на ЗП 1.6.02

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

Не соответствует правилам.

Ссылка на комментарий

KD87

Возможно мои данные устарели, т.к конкретно с присовением story_id через нет-пакет я ещё в 2008 что то делать пытался, но если мне не изменяет память, если создать объект и приписать ему story_id, то потребуется операция save\load чтобы игра его правильно засчитала. Возможно я ошибаюсь, т.к тогда мало что по этому поводу знал. А что именно делал тогда уже не помню.

 

ziStam

Смысл тебе вообще создавать свой класс? Все серьёзные классы игровых объектов описаны в движке, и создав свой класс CDemon ты по сути получишь старый класс с другим именем (в данном случае ты просто скопируешь все свойства класса CCat). Максимум что ты можешь попробовать сделать это расширить функционал класса через скрипты. Но набор методов там довольно скудный и их можно реализовать без всяких классов и прочего. Тоесть твоя затея не несёт никакого смысла кроме как просто дать твоему монстру другой класс который по сути будет отличаться от старого одним лишь именем.

 

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий
KD87, я думаю, проблема не в том, чтоб его прочитать или записать, а в том, что он должен попасть в реестр стори_идов. А это, насколько мне известно (в том числе и по опытам, аналогичным опытам *Shoker*), происходит в момент старта игровой сессии. (черт, похоже не в тему ответила. Я имею ввиду такие ситуации, как споты в ПДА на определенные объекты. Там задействован реестр) Изменено пользователем xStream

Все, кто стоит на моем пути: идите нахрен и там погибните! ©

Ссылка на комментарий

*Shoker*, что-то ты ... не по делу ...

1. Ты забыл, что меняя нет-пакеты объектам, ты это делаешь для серверного объекта(!) и в этом случае, установив желаемый стори-ид, ты его можешь сразу же увидеть se_obj.m_story_id -> тобою установленное ...

Если же желаешь, чтобы и гейм-объект (копия серверного) получил этот идентификатор, то или как ты говоришь, делай save/load или ... все гораздо проще, нужно всего лишь отправить объект в оффлайн и обратно и дождаться, когда он оттуда выйдет. Тогда и obj:story_id() вернет установленный тобою идентификатор.

 

2. Не стОит обсуждать смысл тех или иных ковыряний в кодах игры. Кто-то учится, кто-то мод делает и его задумки нам неизвестны.

Есть ли смысл делать свой класс, который мало чем (иль ничем не) отличим от имеющихся? Для тебя может и нет смысла, но не зная задумок/целей нужно ли отговаривать?

Даже тобою упомянутая причина - иметь свой clsid, по которому годаздо проще (чем по тем же секциям/именам) выделять нужный объект в игре.

Понаделав, например, крыс на классе тушканов, можно оптом исключить их из различных апдейтов и пр. что даст разгрузку в игре.

В тех же биндерах, можно для каждого (под)класса понаделать своих методов иль проверок.

и т.п. ... причин, имеющих смысл может быть немало.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Artos, задумка собственно заставить демона летать, + чтобы он сидел на родных анимках из метро. Но чую это не выйдет... Т.к я пока подставил за место CDemon класс CFracture, то собственно возникает вопрос: где нужно регистрировать класс CDemon? Я перед этим спрашивал в ковырялке зп, где хранится список анимаций для монстров?, т.к я хочу создать свой собственный список анимаций, вот собственно и вся цель ковыряния классов.

П.с. При подстановке в конфиге допустим за место класса SM_BLOOD класса SM_BOAR, получаем вылет, мол нехватает анимки какой-нибудь. Вот и пришел к выводу что список анимаций зависит от класса

Legend of Stalker

Ссылка на комментарий

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 -> фатал.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

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

Ссылка на комментарий
ziStam, клиентский класс должен быть экспортирован из движка. В движке сталкера нет класса CDemon, соответственно, он не экспортирован. Значит, на его основе нельзя создавать сеты. Ты можешь создать скриптовый класс на основе экспортированного клиентского. Список экспортированных клиентских классов можно посмотреть в lua_help. Изменено пользователем KD87
Ссылка на комментарий

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 - то все будет штатно ...

 

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Artos

Я конечно понимаю что это может дать определённые преимущества. Но зная ziSteam могу сказать что ему пока надо совсем не это, и уровень у него ещё совсем не тот, чтобы такими тонкостями заниматься, ему сейчас класс нужен совсем не для этого.

Он хочет создать летающего монстра создав свой класс, но проблема в том, что, как я уже сказал, классы монстров зашиты в движок, и все освновные функции (их движение, анимации, атаки) зашиты в движке. (я утирую, так что не надо к словам придираться)

 

ziStam

Тоесть создав новый класс ты лишь можешь взять за основу существующий. В движке CDemon-а НЕ СУЩЕСТВУЕТ.

И в движок ты его НЕ ДОБАВИШЬ. Ты можешь лишь сделать свой класс на основе существующего, что для тебя никакой выгоды в данный момент не несёт. А в движке из летающих монстров разве что Ворона, а она кроме как летать ничего не умеет.

 

Единственное что я тебе могу посоветовать - делать Демона на классе Снорка. Он умеет прыгать, что можно анимацией переделать на полёт. И будет твой демон (из Метро я полагаю) как бэ по земле ползать да "летать" (делать большие прыжки) при виже противника.

Это лучшее что ты сможешь сделать со своей идеей. Всё что тебе надо, это подстроить модель Демона на кости и снорка (я тут тонкостей уже не знаю, это в другую тему) И никакой новый класс не нужен.

 

Artos: Если экспериментируешь с новым классом то, совет: не добавлять свой clsid напрямую в таблицы, а добавлять после проверки наличия его, т.е. типа:

Совет полезный, но ты так можешь его запутать, создаст что нить, вылета не будет но и работать не будет, вот и будет гадать.

По крайнем мере такое (имхо) стоит делать уже после тестирования объекта.

 

Подредактировал пост. В дальнейшем, адресуя слова одному - не забывай переключаться в посте на другого ... --/Artos

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий

*Shoker*, мой совет дан НЕ только одному ... и уж как раз именно для стадии тестирования. Когда перепроверено - то можно иль удалить или напрямую в таблицу включить.

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

Второе применение моего совета - писать так, когда код/скрипт может быть применен в не одной версии игры и если clsid в одной из версий отсутствует - это как раз и даст совместимость.

И ... свои разборки межличностные ведите/советуйте/отговаривайте где-нибудь в ЛС иль аске, а в топики форума пишите с учетом, что его читеете не только вы вдвоем.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

У меня пара вопросов по использованию скрипта state_mgr:

 

1. Как вручную сбрасывать состояние? Например, если я установлю состояние "wounded_heavy", а поcле определённого события нужно сбросить состояние.

2. В файле state_mgr_goap есть вот такая строка:

st.planner = state_mgr.action_planner()

кто-нибудь может объяснить, почему не происходит вылета? В скрипте state_mgr нет такой функции. Если это вызов конструктора класса, то чем это отличается от такого варианта?

st.planner = action_planner()

 

Ссылка на комментарий

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

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   1 пользователь

×
×
  • Создать...