SkyLoader Ты сам то понял, что меняешь, как мняешь и у какого объекта?! "physic_object" --физический объект класса O_PHYS_S get_breakable_data и set_breakable_data --функции для работы с net_packet обектов класса O_BRKBL (базовая секция "breakable_object") actors\svoboda\stalker_sv_balon_1 --вообще модель сталкера, которую пытаешься применить к разрушаемому объекту.
Короче говоря, сплошные несоответствия, и ошибки. Не надо делать абы как. Раз спавнишь физический объект, то и применяй к нему функции для работы с net_packet физических объектов. А если нужен разрушаемый объект, то и спавни соответствующую секцию.
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22, модель непися или монстра можно назначить физ.объекту O_PHYS_S (если секцию создать с этим визуалом) - это мной проверено не раз, и глюков не было. А ф-ций получения и записи нет-пакета физ.объектов в амк я не нашел. Даже в xrs_utils нету.
отредактировал(а) SkyLoader: 19-06-2011 15:33 GMT3 час.
SkyLoader А никто тебе и не говорит, что модель сталкера нельзя назначить физ. объекту. Проблема лишь в том, что в выложенном тобой примере, непонятно кем ты его хочешь сделать (физ. объектом, или разрушаемым объектом). И как не странно, разрушаемым его сделать нельзя, так как моделей обломков не имеет.
А ф-ций получения и записи нет-пакета физ.объектов в амк я не нашел
Юзай net_utils.script от Artos'a. Найдёшь в Simbion'е.
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22, спасибо, заработало. Только, правда, непонятно, зачем Artos сделал обязательным использование ф-ции init(), потому что без нее при использовании get_physic_data(obj) будет вылет local 'spk' (a nil value) (эта переменная = net_packet() в ф-ции init()).
Я немного отвлеку вас от темы моделирования...
Не могли бы вы подсказать новичку как вставить в своем диалоговом окне текст, ограниченный рамкой, который можно прокручивать скроллом только в пределах заданной рамки?
На всякий, если я все же некорректно сформулировал вопрос, мое пояснение:
1) В своем скрипте главного меню я привязал на горячую клавишу F1 свое собственное диалоговое окно, с проверкой включена игра или нет. Если да - выводить окно, если нет - не выводить. 2) В скрипте своего диалогового окна я прописал файл-описатель, настроил его, в общем с текстурами проблем не возникает. Но я пользовался только методом InitStatic, который как я понимаю добавляет статичесие изображения в диалог (изображения, видео, текст и т.д.), над которыми нельзя производить никаких операций типа перемещения в пределах диалогового окна и других мульти-операций. (Это только я так понимаю, поправьте если не прав, ведь за этим на форум и залез:poisk) 3) Я пользовался методом InitStatic без проблем, но когда мне понадобилось вместить большой текст на маленькой территории, я наткнулся на проблему, что я не могу заставить мою статику сжаться на определенной территории, у меня статика записывает весь текст в одну строку. 4) Я полез за поиском решения проблемы в lua_help.script и нашел в нем методы для диалогового окна:
C++ class CScriptXmlInit {
CScriptXmlInit ();
function InitSpinText(string, CUIWindow*);
function InitTab(string, CUIWindow*);
function InitStatic(string, CUIWindow*);
function InitList(string, CUIWindow*);
function InitTrackBar(string, CUIWindow*);
function InitSpinFlt(string, CUIWindow*);
function ParseShTexInfo(string);
function InitLabel(string, CUIWindow*);
function InitSpinNum(string, CUIWindow*);
function InitMapList(string, CUIWindow*);
function ParseFile(string);
function InitCDkey(string, CUIWindow*);
function InitKeyBinding(string, CUIWindow*);
function InitMMShniaga(string, CUIWindow*);
function InitWindow(string, number, CUIWindow*);
function InitEditBox(string, CUIWindow*);
function InitCheck(string, CUIWindow*);
function InitAutoStaticGroup(string, CUIWindow*);
function InitScrollView(string, CUIWindow*);
function InitMapInfo(string, CUIWindow*);
function InitServerList(string, CUIWindow*);
function Init3tButton(string, CUIWindow*);
function InitAnimStatic(string, CUIWindow*);
function InitFrameLine(string, CUIWindow*);
function InitComboBox(string, CUIWindow*);
function InitButton(string, CUIWindow*);
function InitFrame(string, CUIWindow*);
};
5) Ну, я начал эксперементировать с этими методами, натыкался на многочисленные ошибки, но так и не смог поместить мой текст в зону, которую хотел:obstenu:... Помогите пожалуйста:sos
Труд свободных скриптеров-любителей тяжел и утомителен, полон ошибок и багов, но в то же время интересен, захватывающ и благороден.
Upgrades mod build 1.006 готов. В журнале есть новое видео.
Подробнее в журнале.
Angel from Hell Добавлю к словам Struck'a. Помимо статика, нужно использовать класс CUIScrollView(). Где твой статик с текстом, выводить как один из его элементов. При этом статик, может быть значительно больше по высоте, чем виджет скрола.
над которыми нельзя производить никаких операций типа перемещения в пределах диалогового окна и других мульти-операций. (Это только я так понимаю, поправьте если не прав, ведь за этим на форум и залез)
Почему же нельзя?! Можно. И не только это. Методы установки координат и размеров форм никто не отменял. И даже есть возможность отслеживать наведение курсора на виджет статика. Собственно это главное его отличие от других классов. Ограниченность событий.
По сути, со статиком можно производить любые динамические операции. Буть то, смена текстур, изменение текста, перемещение в пределах монитора, и за его пределы, изменение размеров, растяжение, динамическое обрезание (аналог мапа на пда) и т.д. и т.п.
Всё дело не в ограничениях возможностей, а в ограниченной фантазии, ну и конечно же умении работать с алгоритмами.
отредактировал(а) singapur22: 19-06-2011 18:58 GMT3 час. Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
SkyLoader: ... непонятно, зачем Artos сделал обязательным использование ф-ции init()
Причин немало, две основные:
1. Модуль нет-пакетов написан универсальным для всех 3-х частей игры (ТЧ/ЧН/ЗП).
Т.о. требуется вначале подстроиться под используемую версию игры и пр. установки.
В ЧН и ЗП (да и в ТЧ не помешает) объект читалки-писалки (oPsF/oPuF) нет-пакетов требуется получать в самом начале старта игры и именно им пользоваться, дабы в дальнейшем исключить некорректные пакеты ...
2. Какой смысл каждый раз получать одни и те же объекты и/или выполныть одни и те же установки/проверки при каждом обращении к модулю? Не проще ли один раз это сделать (при инициализации модуля) и пользоваться в дальнейшем?!
Всего лишь обратившись к модулю нет-пакетов один раз при старте игры (типа: 'if m_net_utils then'), можно его использовать в дальнейшем, не повторяя каждый раз одно и то же, а только заниматься 'чтением/записью'.
Вопрос. В момент убийства излома возникает такой вылет
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\xr_statistic.script:115: attempt to index local 'npc' (a nil value)
Ну и не понятно из-за чего. В чём может быть дело?
Mehanik Yar А че тут думать. Вся статистика убийств записывается в заслуги ГГ. В локальной таблице нет секции с название монстра Излома, просто впиши его туда по аналогии.
З.Ы.: Ты хоть в фаил xr_statistic.script заглядывал? Номер строки 73. :-)
Struck Да ты что. В файле xr_statistic.script всего 107 строк, а лог пишит про Line : 73.
З.Ы.: Пред тем как постить я заглянул в скрипт. :ye)
добавлено спустя 8 минут
Более того в строке 73 скрипта xr_statistic.script находится функция function getNpcType(npc) и именно на npc лог и указывает. Далее разберать, что как работает не вижу смысла.
Strchi Если ты имееш ввиду от обькта "рупора", то нужно прописывать логику этому самому "рупору". Например, написать в логике поршень on_info = {+твой_поршень} | преход в новую фазу И в новой фазе логики запускать звук сирены.
А в скрипт выброса добавить выдачу твоего_поршня.
karavan
А зачем такие "сложности"? Чтобы игрок в своих ушах слышал звук сирены (иль какой иной) обязательно чтобы матюгальник какую-то логику обрабатывал?
Все одно эта логика запускает некую функцию отыгрывания звука. Достоинство только в том, что можно иметь ID источника звука (матюгальника), хотя не сложно и иным путем его заполучить.
А хорошо ли это? Если при выбросе где-то вдали будет что-то подвывать - можно и не заметить.
Есть условие - при выбросе проигрывать звук. Что мешает по факту самого выброса просто проигрывать нужный звук удобным способом (что и сделано в АМК)?
Методы вывода звука позволяют и играть относительно позиции и играть с нужной громкостью.
Если сделать, чтобы играл сам матюгальник, то ... например, будучи на ферме (Кордон) врядли ты услышишь сирену матюгальника с блок-поста, не говоря о преходе на Свалку. :-)
Strchi
Будь немного поуважительнее к читателям твоих постов и потенциальным отвечающим.
1. 'Народ/чуваки/...' и т.п. - тут все же и не безликая толпа и не стадо баранов ... Задать вопрос иль просто обратииться можно и не указывая конкретных эпитетов адресатам.
2. Не забывай о соблюдении правил форума о грамотности своих постов!
Любое предложение начинается с заглавной буквы.
Грамотное написание - уважение к читающим.
karavanArtos спосибо Artos сорри просто привычка говорить народ с работы сохранилась) у нас с утра заставляли упражнения делать и тд) сорри за оффтоп
А вот что я хотел узнать еще как создать свой обьект на основе рупора? то есть я создал колонки в бар заменил радио и развешал по стенкам не работают(
Artos, ну а если сей скрипт не подключен к какому-либо моду и нужно с его помощью прочитать один нет-пакет, то придется вызывать еще одну ф-цию - это же геморно. Может сделать флаг, который будет показывать, запускалась ли ф-ция инит вообще. И такую проверку повесить на каждый запуск ф-ции считывания какого-либо нет-пакета, чтобы вылета не было.
SkyLoader
Модуль нет пакетов написан с учетом возможности его автономной работы независимо от модов.
Конечно не очень понимаю использование целого модуля ради однократного получения какого-то нетпакета, но ... 'хозяин барин' ... ;-)
Чем задавать подобные вопросы лучше бы просто глянул как используется модуль в том же Симбионе.
Если тебе требуется всего лишь одно обращение для получения нет-пакета какого-то физ-объекта (cse_alife_object_physic), то вариантов немало:
1. Просто получаешь нужную табличку нет-пакета (Table) такими строками:
local Table = nil --/ табличка для нет-пакета
if m_net_utils then --/ эта проверка И инициализирует (если еще не ...) сам модуль!
Table = m_net_utils.Get_Data_ObjPhysic(soObj) --/ серверный объект на входе
end
if Table then --/ пакет получен? --/ работаем дальше ...
- начальная проверка не отнимает ресурсов, но предохраняет и от отсутствия в моде данного модуля, а вторая - от некорректного объекта / ошибки получения таблицы. Это и есть альтернатива предлагаемому тобою 'флагу'.
2. Можешь просто в начале модуля в установках переменных сразу прописать вместо nil'ов сами функции, которые назначаются в init'e. Такой вариант 'в лоб' тоже сойдет ... для поделки в ТЧ.
3. Просто взять нужные для твоего пакета функции/строки и только их включить в свой скрипт.
4. В любом случае любой мод стартует из из функции '_g.start_game_callback()' (если конечно не переназначено в alife.ltx). Ничего не мешает вставить в конец вызов 'm_net_utils.init()'.
... и т.д.
Примечание Во вчерашнем минификсе к Симбиону включен подкорректированный модуль нет-пакетов, т.е. при 'прямом' вызове рабочей функции специально продублирована проверка инициализации модуля и при необходимости его принудительная инициализация.
function addKillCount(npc)
local props, sect = getNpcType(npc)
if props == nil then
return
end
local sect_name
if sect_alias[sect] ~= nil then
sect_name = sect_alias[sect]
else
sect_name = sect
end
if killCountProps[sect_name] == nil then
print_table(sect_alias)
abort("Statistic ERROR: required section [%s] not present, based [%s]", tostring(sect_name), tostring(sect))
end
actor_stats.add_points(props, sect_name, 1, killCountProps[sect_name])
db.actor:set_character_rank(db.actor:character_rank() + killCountProps[sect_name])
end
function getNpcType(npc)
if IsStalker(npc) then
local community = "neutral"
if npc:character_community() == "monolith" then
community = "monolith"
elseif npc:character_community() == "military" then
community = "military"
elseif npc:character_community() == "killer" then
community = "killer"
elseif npc:character_community() == "ecolog" then
community = "ecolog"
elseif npc:character_community() == "dolg" then
community = "dolg"
elseif npc:character_community() == "freedom" then
community = "freedom"
elseif npc:character_community() == "bandit" then
community = "bandit"
elseif npc:character_community() == "zombied" then
community = "zombied"
end
local rank = ranks.get_obj_rank_name(npc)
return "stalkerkills", community.."_"..rank
else
local community = monster_classes[get_clsid(npc)]
if community == nil then
abort("Statistic ERROR: cannot find monstr class for [%s]", npc:name())
end
if community == "NIL" then
return nil,nil
end
local rank = ranks.get_obj_rank_name(npc)
-- alterei coloquei if
if rank ~= nil and community ~= nil then
return "monsterkills", community.."_"..rank
else
return nil,nil
end
end
end
Mehanik Yar
Твоя проблема в некорректном вызове функции 'getNpcType(npc)' в 90-ой строке.
На входе имеешь аргументом npc == nil.
Разработчики в оригинале допустили ошибку в строке (115!) принудительного прерывания от этой ошибки:
abort("Statistic ERROR: cannot find monstr class for %s", npc:name()) abort( "Statistic ERROR: cannot find monstr class for [%s]", tostring( npc and npc:name() ) ) (исправлено после правильного замечания singapur22)
- т.е. сами прерывая игру из-за ошибки значения, применяют к nil'у метод 'name', для сообщения в лог об имени объекта.
1. Изменив строку 115:
abort("Statistic ERROR: cannot find monstr class for [%s]", npc and npc:name())
- ты получишь корректный вызов функции аборта ... и вылетишь из игры с другим логом.
2. Смотри сами вызовы 'getNpcType(npc)'(а скорее addKillCount(npc)) из других скриптов (например: generic_object_binder:death_callback(victim, who) ) и ищи где ты теряешь нужный аргумент (npc).
Эта тема закрыта, публикация новых сообщений недоступна.
Продолжая пользоваться сайтом, вы соглашаетесь с использованием файлов cookie. Страницы сайта могут содержать информацию, запрещенную для просмотра посетителям младше 18 лет. Авторское право на серию игр «S.T.A.L.K.E.R» и используемые в ней материалы принадлежит GSC Game World.