Это популярное сообщение. Malandrinus 615 Опубликовано 8 Июля 2009 Это популярное сообщение. Поделиться Опубликовано 8 Июля 2009 (изменено) В данной теме собраны сведения по скриптовой модели сталкера: функции и классы, методы и свойства, взаимосвязь классов и последовательность работы с ними, связь работы классов и файлов конфигураций. К наполнению темы приглашаются все желающие. В наполнении темы непосредственно участвовали и существенно мне помогли: @Monnoroch, @Kolmogor, @Unnamed Black Wolf, @меченый(стрелок), @IQDDD, @Kirag, @Taroz, @dan, @7.9, @Garry_Galler, @AKKK1, @Bak и много других людей. Скрытый текст Скрытый текст класс alife_simulator. Базовые операции с серверными объектами. Пространства имён. Глобальные функции для большого числа задач. "Создание своего класса" и "Наследование от экспортированных классов". Базовые сведения об объектно-ориентированном программировании для сталкера. Необходимо прочитать, для понимания темы про биндер и некоторых других. В одном посте: Общие слова об архитектуре и скриптовой модели сталкера "Класс object_binder" расширение онлайновых объектов, колбеки, сохранение состояния. "Класс net_packet" Регистрация скриптовых классов с помощью object_factory Серверные классы. Часть 1 Иерархия серверных классов, описание не закончено. Серверные классы. Часть 2 Картинка структуры наследования и несколько заключительных слов Клиентские классы Скрытый текст Класс game_object Интерфейс ко всем онлайновым (клиентским объектам) Класс hit для нанесения урона скриптом и другая информация (IQDDD) Некоторая информация по управлению путями патрулирования здесь (Kirag) и здесь (Taroz) Неполная информация по управлению памятью неписей с примером здесь (Bak) Физическая оболочка объектов (Garry_Galler) Пост о выборе (подборе) оружия НПС и стрельбы (*Shoker*) Скрытый текст Управление заданиями Класс CGameTask и другие вспомогательные классы и функции. Управление инфопорциями Функции, колбеки, форматы файлов Список специальных системных инфопорций (Unnamed Black Wolf) Система профилей и алгоритм генерации имён. Форматы файлов, функции Дополнительная информация по параметрам профилей terrain_sect (Kolmogor) Диалоги. Часть 1 Форматы файлов, базовые сведения Диалоги. Часть 2 Скриптовые диалоги Диалоги. Часть 3 Тематическая подборка функций управления диалогами Скрытый текст Функции времени Тематическая подборка функций, связанных с управлением игровым временем. Класс CTime Вспомогательный класс для управления игровым временем Полезная скриптовая функция с использованием CTime (Garry_Galler) Скрытый текст class ini_file (меченый(стрелок)) Класс FS и CSavedGameWrapper Бинарный доступ к файлам, в том числе в игровых архивах, управление сохранёнными играми. Скрипт уровня. Забытая фишка с колбеком на заход на уровень Класс vector Некоторая полезная информация о разных вещах (меченый(стрелок)) "Класс render_device" Направление и положение камеры, характеристики экрана, программная пауза игры и др. Некоторая информация о различиях между ТЧ и ЗП в системе оконных классов и колбеков. (lekzd) Неплохо бы развить эту тему! Некоторая полезная информация о скриптовых функциях из модуля _g.script. (lekzd) Также требует развития! Полезные функции для работы с графом игры (Garry_Galler) В одном посте: Класс profile_timer Отладочные измерения скорости работы фрагментов программы Класс client_spawn_manager Колбек на выход в онлайн без использования биндера. Работа с консолью. Класс CConsole Анимации цвета. Класс color_animator Всякие моргающие элементы в окнах и пр. Управление постэффектами. Скриптовые постэффекты. Класс effector Класс sound_object. Проигрывание звуков в игре в произвольном месте, от произвольного объекта, в голове актора. (Shadows) Пост удалён автором (прим. Kirgudu) Скрытый текст Оконные классы Некоторая общая информация о создании окон Список методов, XML-тегов и событий для оконных классов (ТЧ/ЧН/ЗП) (Norman Eisenherz) Представление материала в моих статьях оптимизировано для онлайнового просмотра. Если кому не хочется лазить по спойлерам, а нужно просмотреть текст какого-либо поста "потоком", то могу рекомендовать просмотр в режиме "текстовая версия". В этом же режиме удобно сохранять содержимое темы на диск. (прим. Malandrinus) Изменено 30 Июля пользователем Kirgudu 5 5 16 Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
KD87 718 Опубликовано 11 Января 2013 Поделиться Опубликовано 11 Января 2013 (изменено) Не совсем. "Опорная" ось: angle = clamp(wind_velocity * wind_strength * 0.05, 0, 1) axis.x = -sin(wind_direction) * cos(drop_max_angle * angle - 1.57) axis.y = sin(drop_max_angle * angle - 1.57) axis.z = cos(wind_direction) * cos(drop_max_angle * angle - 1.57) drop_max_angle ~ 10 градусов Плюс для отдельных капель направления рандомизируются в диапазоне +-3 градуса от опорной оси, если я правильно помню. Изменено 11 Января 2013 пользователем KD87 2 Ссылка на комментарий
alpet 77 Опубликовано 11 Января 2013 Поделиться Опубликовано 11 Января 2013 Ещё раз спасибо, этого должно хватить. Кстати если кто-то продолжает ковырять ТЧ 1.0006, предлагаю использовать map файл от xrGame.dll для скорейшего нахождения интересных функций и улучшения логов вылетов. Сейчас он очень помогает мне понять где вылет, если хоть какой-то стек вызовов доступен. Файл получен через обработку соответствующего для отладочной версии, фактически поправлены смещения. К сожалению пока руки не дошли до переноса vftable, которые тоже при раскопках важны. У меня накопилось много информации по движку, которую буду систематизировать и публиковать ближе к выходу NLC6, сейчас катастрофически времени не хватает. 4 Плавайте поездами аэрофлота! Ссылка на комментарий
lsclon 527 Опубликовано 19 Января 2013 Поделиться Опубликовано 19 Января 2013 Подскажите пожалуйста предназначение функции keep_saved_data_anyway()? Вообще-то я белая и пушистая... Ссылка на комментарий
Viнt@rь 50 Опубликовано 2 Июня 2013 Поделиться Опубликовано 2 Июня 2013 (изменено) Нашел в lua_help.script такое вот C++ class IKinematicsAnimated { function PlayCycle(IKinematicsAnimated*, string); }; хотелось бы узнать, что это, для чего, и как юзать? Поиск по этой теме не дал результатов. Изменено 2 Июня 2013 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий
RayTwitty 492 Опубликовано 3 Июня 2013 Поделиться Опубликовано 3 Июня 2013 @Viнt@rь, ну, название вроде как намекает, что это проигрывание анимации Ссылка на комментарий
Malandrinus 615 Опубликовано 3 Июня 2013 Автор Поделиться Опубликовано 3 Июня 2013 (изменено) Viнt@rь,Этот класс является базовым для всех объектов с визуалом и костями. Однако в скриптах он никак прямо не используется, поскольку нет функции приведения к этому классу. Остался скорее всего по недосмотру. Вероятно, на каком-то этапе была функция приведения, наподобие get_holder_class(), но потом убрали. Сейчас для вызова метода проигрывания анимации есть метод play_cycle класса game_object, который внутри как раз и вызывает метод PlayCycle класса IKinematicsAnimated. lsclon, Подскажите пожалуйста предназначение функции keep_saved_data_anyway()? Это функция серверного класса, которая отвечает за сохранение клиентских данных. Как и другие методы серверного класса, метод keep_saved_data_anyway можно перегрузить в скриптах. Он должен возвращать логическое значение. Если возвращает false, то клиентские данные не сохраняются. Если не ошибаюсь, то эти данные - это то, что сохраняет/читает клиентский объект в методах биндера save/load. Наверное, надо бы что-то добавить о стратегии применения этой функции, но тут не много скажу. Обычно возвращает true, т.е. всё храним. Вероятно, когда-то имеет смысл эти самые данные обнулять. Изменено 3 Июня 2013 пользователем malandrinus 1 Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Viнt@rь 50 Опубликовано 4 Июня 2013 Поделиться Опубликовано 4 Июня 2013 (изменено) malandrinus, а можно по подробней по поводу play_cycle пытался проиграть анимацию пма с ее помощью local aa = db.actor:item_in_slot(db.actor:active_slot()) aa:play_cycle("pm_reload") но нифига не проигрывается... Изменено 4 Июня 2013 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий
RayTwitty 492 Опубликовано 4 Июня 2013 Поделиться Опубликовано 4 Июня 2013 (изменено) @Viнt@rь, почему играем анимку для актора db.actor:play_cycle("pm_reload")? При правильном вызове должна проиграться анимка у мировой модели оружия. не то написал, исправил.Включи вид от 3 лица и посмотри будет ли играть анимка. Изменено 4 Июня 2013 пользователем Shadows Ссылка на комментарий
Viнt@rь 50 Опубликовано 4 Июня 2013 Поделиться Опубликовано 4 Июня 2013 (изменено) Shadows, не то написал, исправил. При правильном вызове должна проиграться анимка у мировой модели оружия. смотрел и при виде от третьего лица(при нем же ГГ держит мировую модель), и при виде от второго лица, ничего не происходит... Изменено 4 Июня 2013 пользователем Viнt@rь GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий
Andrey07071977 18 Опубликовано 1 Августа 2013 Поделиться Опубликовано 1 Августа 2013 Кто то может доходчиво объяснить что такое tail packet? Ссылка на комментарий
Malandrinus 615 Опубликовано 1 Августа 2013 Автор Поделиться Опубликовано 1 Августа 2013 @Andrey07071977, первый раз о таком слышу. В каком это контексте? Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Sin! 71 Опубликовано 1 Августа 2013 Поделиться Опубликовано 1 Августа 2013 (изменено) @Viнt@rь, возможно, не туда смотришь . В игре у оружия существуют "мировые" (от 3-го лица) и худовые модели. Вышеупомянутая функция работает именно с "мировыми" визуалами. Что характерно, в оригинальной игре мировые модели оружия не имеют анимации вообще (а при попытке их простого добавления к модели в СДК модель в игре превращается непонятно во что), но с использованием данных функций скриптово мы можем заставить их играться. Данный факт был обнаружен при разработке GWRa, и теперь активно используется в оружиестроении, ибо открывает достаточно важные возможности (взять ту же затворную задержку для пистолетов). Если интересно - примерный код для оружия с подствольной рукоятью с возможностью установки подствола: function init_handled_wpn(obj) local new_binder = gwr_wpn_w_handle_binder(obj) obj:bind_object(new_binder)endclass "gwr_wpn_w_handle_binder" (object_binder)function gwr_wpn_w_handle_binder:__init(obj) super(obj)endfunction gwr_wpn_w_handle_binder:update() if self.object:weapon_is_grenadelauncher() then self.object:play_cycle("idle_w_gl") else self.object:play_cycle("idle") endend Изменено 1 Августа 2013 пользователем Sin! Ссылка на комментарий
Andrey07071977 18 Опубликовано 1 Августа 2013 Поделиться Опубликовано 1 Августа 2013 (изменено) @Malandrinus, в контексте работы с нет пакетами кусок кода из xs_store --write variable to tail tail_pk:w_u8(allowed_types_rev[lua_type]) tail_pk:w_stringZ(key) if lua_type=='string' then tail_pk:w_stringZ(val) elseif lua_type=='number' then tail_pk:w_float(val) elseif lua_type=='boolean' then tail_pk:w_u8(val) elseif lua_type=='table' then tail_pk:w_stringZ(serialized_tables[key]) end Пытаюсь настроить твой ogse_unist в ЗП но ловлю вылеты типа: ... not enough storage to process the command... ... not enough memory ... Вылет происходит гдето в pk:get(), но пока не знаю точно где. Решил помотреть как xStream сделала и наткнулся на tail packets. Artos также их использует П.С> вылетает не всегда, примерно через раз Вот функция из модуля для работы с пакетами function net_base:get() if not (self.obj and self._mode ~= 0) then return {} end --/> zero dlog("(%s) in net_base:get()", self_name) --/ preparation local stpk,uppk = nil,nil local stsz,upsz = 0,0 if bit_and(self._mode, 1) ~= 0 then stpk = net_packet() dlog("(%s) in net_base:get() got empty packet stpk = net_packet()", self_name) -- stpk:w_begin(0) --/ installation in the package beginning (+2) stpk:w_begin() self.obj:STATE_Write(stpk) stpk:r_seek(2) --/ installation of the beginning (+2) of reading stsz = stpk:r_tell() end dlog("net_base:get:(%s)%s):m(%s)/st(%s)/up(%s):[%s]", self.obj:name(), self.name, self._mode, self._can_st, self._can_up, ">") if bit_and(self._mode, 2) ~= 0 then uppk = net_packet() uppk:w_begin(0) --/ installation in the package beginning (+2) self.obj:UPDATE_Write(uppk) uppk:r_seek(2) --/ installation of the beginning (+2) of reading upsz = uppk:r_tell() end local t = {} if uppk ~= nil then t.upd = {} --/ sub-table for update-propeties end --/ read if self.dbg then log("net_base:get:(%s)%s):m(%s)/st(%s)/up(%s):[%s]", self.obj:name(), self.name, self._mode, self._can_st, self._can_up, ">") end --/#~# self:_read(t, stpk, uppk) if self.dbg then log("net_base:get:(%s)%s):m(%s)/st(%s)/up(%s):[%s]", self.obj:name(), self.name, self._mode, self._can_st, self._can_up, "<") end --/#~# --/ check state size and tail if stpk ~= nil then self.size = stpk:r_tell() - stsz if not stpk:r_eof() then --/ exist left? t.__tail = tail_data():peekFrom(stpk) t.__tail_size = t.__tail.pk:w_tell() - t.__tail.pk:r_tell() if true or self.dbg then log("net_base:get:obj=[%s]%s):mode=[%s]:tail(st)=[%s]:<%s>", self.obj:name(), self.name, self._mode, t.__tail_size, "Info!") end --/#~# end end --/ check update size and tail if uppk ~= nil then self.size_upd = uppk:r_tell() - upsz if not uppk:r_eof() then --/ exist left? t.upd.__tail = tail_data():peekFrom(uppk) t.upd.__tail_size = t.upd.__tail.pk:w_tell() - t.upd.__tail.pk:r_tell() if true or self.dbg then log("net_base:get:obj=[%s]%s):mode=[%s]:tail(up)=[%s]:<%s>", self.obj:name(), self.name, self._mode, t.upd.__tail_size, "Info!") end --/#~# end end dlog("(%s) net_base:get() succes, return size = %s", self_name, table.size(t)) return t --/> end После того как изменил -- stpk:w_begin(0) --/ installation in the package beginning (+2) на stpk:w_begin() вроде бы перестало вылетать... thoughts? Изменено 1 Августа 2013 пользователем Andrey07071977 Ссылка на комментарий
7.9 174 Опубликовано 7 Августа 2013 Поделиться Опубликовано 7 Августа 2013 (изменено) Фактически не подходит для проигрывания зацикленных звуков. То-есть, ни stop(), ни stop_deffered(), точно не срабатывают? А если, например, переменную заnilить - ничего не сброситься? Изменено 7 Августа 2013 пользователем 7.9 всё легко Ссылка на комментарий
RayTwitty 492 Опубликовано 7 Августа 2013 Поделиться Опубликовано 7 Августа 2013 (изменено) То-есть, ни stop(), ни stop_deffered(), точно не срабатывают? Да, не срабатывают, как и заниление. Да и сам метод называется ведь play no feedback (играть без обратной связи), следовательно все верно. З.Ы. забыл дописать пятым пунктом (сейчас уже не могу отредактировать, допишите кто имеет права): 5) Для этого метода не работает дальнейшее изменение каких-либо параметров, в т.ч. и остановка. Изменено 7 Августа 2013 пользователем Shadows 1 Ссылка на комментарий
*Shoker* 322 Опубликовано 3 Октября 2013 Поделиться Опубликовано 3 Октября 2013 Честно говоря не знаю куда это запостить, чтобы не потерялось, но ближе всего по смыслу к этой теме. Если будет тема лучше, то стоит перенести туда. Небольшой разбор параметров ef_main_weapon_type и ef_weapon_type в конфиге оружия, и + по мелочам о том, как НПС выбирает и использует ствол. (на англ. языке) Below are the settings of how the vanilla weapons are grouped together: ef_main_weapon_type: ef_weapon_type: group: 0 1 stabbing 0 5 pistol 1 7 shotguns 2 6 automatic 3 8 sniper 4 8 grenade launcher 0 10 hand grenade you will want to look in m_stalker.ltx and take note of the settings in your fire queues. note that there is nothing wrong with the vanilla settings here, but you can make them more aggressive as you see fit. below i've noted the ranges that are hard coded for each of the fire queues: ;---FIRE QUEUE PARAMETERS ;far range = 30 - 1000m. ;med range = 15 - 30m. ;close range = 0 - 15m. i've listed below what i've found from my testing. how ef_weapon_type relate to how an NPC will utilise a weapon: ef_weapon_type: NPC use of weapon: 1 - 4 as per fire queue 5 3 round burst at close and med range. as per fire queue at far range 6 as per fire queue 7 single shot at approx 1sec intervals 8 single shot at 3sec intervals 9 if range is farther than 20m, then as per the medium fire queue. if range is closer than 20m, then change weapon. 10 if range is between 3 - 20m, then as per fire queue. else change weapon 11 if range is farther than 3m, then as per fire queue. if range is closer than 3m, then change weapon 12 - 99 as per fire queue. Notes: - the weapon hierarchy is numerological. ie they will equip a weapon with a higher value in ef_weapon_type over a lower one. - except that, all pistols must be ef_weapon_type = 5 & ef_main_weapon_type = 0 or you're going to have a bad time. (or the NPCs will choose their pistol instead of their rifle, i dont know why this is). - once they have a new weapon, they might not equip it until next combat. - as we all know, NPCs must have the correct ammo type in their inventory’s or they wont be able to reload their new weapons once the mag runs out. - i really dont have any idea what ef_main_weapon_type does at all. - the upper limit is not known, i just put 99 as a place holder. - you will want to set use_single_item_rule = off in m_stalker.ltx - min_radius, max_radius & fire_distance settings in each weapons .ltx file have no effect at all. these functions are instead determined by the fire queue - as far as i can tell; mp_ranks.ltx has nothing to do with the hierarchy of NPC wpn evaluation, this is done solely by the ef_weapon_type value. In my mod i've set every weapon in the game in a logical hierarchies and given each group its own unique ef_weapon_type. using this method i have been able to successfully answer the age old questions of how to get an NPC to take an AKSU-74 off you when he already has a BM-16! if someone would want to add this to the mod wiki as an article, that would be great. Форум GSC в любой день может закрыться, поэтому сюда перепечатал. 1 Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
abramcumner 1 141 Опубликовано 3 Октября 2013 Поделиться Опубликовано 3 Октября 2013 @*Shoker*, если хотел запостить, имело смысл перевести сначала И указать для какой игры. Оружие выбирается в соотвествии с common\weaponeffectiveness.efd Что касается ЗП: параметры очередей и диапазоны растояний настраиваются в конфигах. min_radius, max_radius читаются из конфига, но не используются. Они и не нужны, так как расстояние учитывается в weaponeffectiveness.efd fire_distance - вообще используется только при расчете полета пули, на выбор никак не влияет. 1 Ссылка на комментарий
*Shoker* 322 Опубликовано 25 Октября 2013 Поделиться Опубликовано 25 Октября 2013 (изменено) function physics_world() -- в ТЧ - вылет function environment() -- в ТЧ - вылет Для тех кто вдруг не знал, в ЗП level.physics_world() работает, и его свойства можно в классе C++ class physics_world посмотреть. Это пару раз на форуме тут мелькало, но допустим я об этом узнал случайно только что, а штука между прочим интересная - позволяет гравитацию изменять. Никто кстати не знает можно ли как нибудь использовать function add_call(class CPHCondition*, class CPHAction*);, а то эти классы похоже не экспортированы. Изменено 25 Октября 2013 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
Viнt@rь 50 Опубликовано 26 Октября 2013 Поделиться Опубликовано 26 Октября 2013 (изменено) @*Shoker*, function WaitOneUpd(tData) local x = 1 local _precondition = function() x = x - 1 return x == 0 end local _action = function() event("OneUpdPassed"):once():trigger(tData) end level.add_call(_precondition, _action) end на сколько я помню, говорили эта функция запускает _precondition в новом потоке и ждет его завершения после чего вызывает _action в евент-драйвен модели xStrem, это используется для отлова зависших коллбэков ЗЫ сразу не понял, что вопрос косается класса physics_world, но что-то мне подсказывает, что она работает так же Изменено 26 Октября 2013 пользователем Viнt@rь 1 GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий
Artos 99 Опубликовано 26 Октября 2013 Поделиться Опубликовано 26 Октября 2013 (изменено) ... эта функция запускает _precondition в новом потоке и ждет его завершения после чего ... Неверно! Запущенный коллбэк постоянно (аналогично апдейтам актора) вызывает функцию _precondition и, если она возвращает true, коллбэк отключается и вызывается функция _action Изменено 27 Октября 2013 пользователем ColR_iT "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти