Это популярное сообщение. 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 Ссылка на комментарий
Это популярное сообщение. WinCap 316 Опубликовано 18 Сентября 2017 Это популярное сообщение. Поделиться Опубликовано 18 Сентября 2017 Не нашёл на форуме какой-то обобщённой информации по этому вопросу и вот: Выбор оружия NPC по типу и дистанции. Платформа CoP 1.6.0.2 Имея в своём арсенале более одного типа оружия, NPC решает, какое из них использовать, основываясь на следующих факторах: - тип своего оружия - тип оружия врага - дистанция до врага Тип оружия определяется параметром ef_weapon_type, заданным в его конфигах. Это число от 1 до 12 и одинаково как для своего оружия, так и для вражеского. Дистанция до врага определяется абсолютной величиной и приводится движком к трём значениям: 1 - ближе 3 м 2 - от 3 до 20 м 3 - более 20 м Таким образом, для выбора оружия определяются три переменные, условно назовём их: SELF_WPN_TYPE 1 .. 12 ENEMY_WPN_TYPE 1 .. 12 DIST_TO_ENEMY 1 .. 3 По этим трём переменным из таблицы, хранящейся в файле ai\common\WeaponEffectiveness.efd, считывается значение, назовём его RATIO, по которому и определяется какое оружие из имеющегося у NPC нужно сейчас использовать. Если значение RATIO одинаково для нескольких типов имеющегося оружия, то используется самое дорогое из них с учётом обвесов и снаряженных патронов. Пример: Скрытый текст NPC имеет в арсенале Обрез и ПМм и находится на расстоянии 15м от врага вооружённого ПМм, в этом случае переменные будут иметь следующие значения: Для Обреза: SELF_WPN_TYPE = 9 ENEMY_WPN_TYPE = 5 DIST_TO_ENEMY = 2 Для ПМм: SELF_WPN_TYPE = 5 ENEMY_WPN_TYPE = 5 DIST_TO_ENEMY = 2 Из таблицы WeaponEffectiveness RATIO будет равен: SELF ENEMY DIST WPN WPN TO RATIO TYPE TYPE ENEMY 5 5 1 30 5 5 2 35 5 5 3 30 . . . 9 5 1 90 9 5 2 65 9 5 3 30 Полный вариант Для Обреза: RATIO = 65 Для ПМм: RATIO = 35 Поскольку RATIO для Обреза больше чем для ПМм NPC выберет Обрез. Теперь допустим, что расстояние до врага увеличилось до 25м, тогда: DIST_TO_ENEMY = 3 По таблице определяется: Для Обреза: RATIO = 30 Для ПМм: RATIO = 30 Поскольку значения RATIO равны NPC выберет ПМм, поскольку он дороже, чем Обрез. 2 3 S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Ссылка на комментарий
AndreySol 215 Опубликовано 25 Октября 2017 Поделиться Опубликовано 25 Октября 2017 @WinCap Спрошу, однако: информация откуда ? Тесты, курение исходников, еще что-то ? Ссылка на комментарий
WinCap 316 Опубликовано 25 Октября 2017 Поделиться Опубликовано 25 Октября 2017 @AndreySol Ну, не курение конечно... Но без пузыря там точно не разобраться. Информация из исходников. S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 5 Февраля 2018 Поделиться Опубликовано 5 Февраля 2018 Наверное, сюда: function my_func() ... level.set_weather_fx( ... ) -- висим, и через некоторое время вылет без лога либо CCustomMotion::Length() ... end level.add_call( my_func, another_func ) Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
abramcumner 1 159 Опубликовано 5 Февраля 2018 Поделиться Опубликовано 5 Февраля 2018 @Dennis_Chikin, то есть ты каждый апдейт запускаешь level.set_weather_fx? Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 5 Февраля 2018 Поделиться Опубликовано 5 Февраля 2018 Однократного вызова достаточно. Зачем он в апдейте - например, проверять, выполнено ли некое условие, и именно тогда - вызвать, в остальное время - делать что-то еще. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Это популярное сообщение. Graff46 598 Опубликовано 27 Марта 2018 Это популярное сообщение. Поделиться Опубликовано 27 Марта 2018 Вроде как потерялся класс sound_object. Взял отсюда. Прошу битую ссылку в шапке на этот пост настроить. Описание класса из lua_help Скрытый текст C++ class sound_object { const looped = 1; // зацикленность звука const s2d = 2; // играть в голове актора const s3d = 0; // играть в пространстве property frequency; // частота property max_distance; // максимальная дистанция слышимости property min_distance; // минимальная дистанция слышимости property volume; // громкость sound_object (string); // создание звукового объекта, в аргументе - путь до звукового файла sound_object (string, enum ESoundTypes); // тоже самое, что и предыдущее + установка типа звука function set_position(const vector&); // установить позицию звука function stop_deffered(); // отложенная остановка function get_position() const; // получить позицию звука function stop(); // остановка function length(); // получить длительность звука function playing() const; // играет ли звук в данный момент function play_no_feedback(game_object*, number, number, vector, number); function play_at_pos(game_object*, const vector&); function play_at_pos(game_object*, const vector&, number); function play_at_pos(game_object*, const vector&, number, number); function play(game_object*); function play(game_object*, number); function play(game_object*, number, number); }; Описание ESoundTypes из движка игры Скрытый текст enum ESoundTypes { SOUND_TYPE_NO_SOUND = 0x0, SOUND_TYPE_WEAPON = 0x80000000, SOUND_TYPE_ITEM = 0x40000000, SOUND_TYPE_MONSTER = 0x20000000, SOUND_TYPE_ANOMALY = 0x10000000, SOUND_TYPE_WORLD = 0x8000000, SOUND_TYPE_PICKING_UP = 0x4000000, SOUND_TYPE_DROPPING = 0x2000000, SOUND_TYPE_HIDING = 0x1000000, SOUND_TYPE_TAKING = 0x800000, SOUND_TYPE_USING = 0x400000, SOUND_TYPE_SHOOTING = 0x200000, SOUND_TYPE_EMPTY_CLICKING = 0x100000, SOUND_TYPE_BULLET_HIT = 0x80000, SOUND_TYPE_RECHARGING = 0x40000, SOUND_TYPE_DYING = 0x20000, SOUND_TYPE_INJURING = 0x10000, SOUND_TYPE_STEP = 0x8000, SOUND_TYPE_TALKING = 0x4000, SOUND_TYPE_ATTACKING = 0x2000, SOUND_TYPE_EATING = 0x1000, SOUND_TYPE_IDLE = 0x800, SOUND_TYPE_OBJECT_BREAKING = 0x400, SOUND_TYPE_OBJECT_COLLIDING = 0x200, SOUND_TYPE_OBJECT_EXPLODING = 0x100, SOUND_TYPE_AMBIENT = 0x80, SOUND_TYPE_ITEM_PICKING_UP = 0x44000000, SOUND_TYPE_ITEM_DROPPING = 0x42000000, SOUND_TYPE_ITEM_HIDING = 0x41000000, SOUND_TYPE_ITEM_TAKING = 0x40800000, SOUND_TYPE_ITEM_USING = 0x40400000, SOUND_TYPE_WEAPON_SHOOTING = 0x80200000, SOUND_TYPE_WEAPON_EMPTY_CLICKING = 0x80100000, SOUND_TYPE_WEAPON_BULLET_HIT = 0x80080000, SOUND_TYPE_WEAPON_RECHARGING = 0x80040000, SOUND_TYPE_MONSTER_DYING = 0x20020000, SOUND_TYPE_MONSTER_INJURING = 0x20010000, SOUND_TYPE_MONSTER_STEP = 0x20008000, SOUND_TYPE_MONSTER_TALKING = 0x20004000, SOUND_TYPE_MONSTER_ATTACKING = 0x20002000, SOUND_TYPE_MONSTER_EATING = 0x20001000, SOUND_TYPE_ANOMALY_IDLE = 0x10000800, SOUND_TYPE_WORLD_OBJECT_BREAKING = 0x8000400, SOUND_TYPE_WORLD_OBJECT_COLLIDING = 0x8000200, SOUND_TYPE_WORLD_OBJECT_EXPLODING = 0x8000100, SOUND_TYPE_WORLD_AMBIENT = 0x8000080, SOUND_TYPE_WEAPON_PISTOL = 0x80000000, SOUND_TYPE_WEAPON_GUN = 0x80000000, SOUND_TYPE_WEAPON_SUBMACHINEGUN = 0x80000000, SOUND_TYPE_WEAPON_MACHINEGUN = 0x80000000, SOUND_TYPE_WEAPON_SNIPERRIFLE = 0x80000000, SOUND_TYPE_WEAPON_GRENADELAUNCHER = 0x80000000, SOUND_TYPE_WEAPON_ROCKETLAUNCHER = 0x80000000, }; Методы проигрывания звуков: Описание параметров:obj - игровой объектtimeout - задержка перед проигрыванием звукаposition - позицияvolume - громкостьflags - набор констант класса sound_object (looped, s2d, s3d) play Скрытый текст function play(obj); function play(obj, timeout); function play(obj, timeout, flags); методы с одним и двумя аргументами не работают; работает только для актора. Метод годится только для проигрывания звуков в голове актора. play_at_pos Скрытый текст function play_at_pos(obj, position); function play_at_pos(obj, position, timeout); function play_at_pos(obj, position, timeout, flags); для метода с двумя аргументами, второй аргумент - это позиция на уровне. Звук не перемещается вместе с объектом, а остается играть там, где запустили. Работает и для актора и для других объектов; метод с тремя аргументами работает как и предыдущий, но появилась возможность установки таймаута; особенности метода с четырьмя аргументами: для актора аргумент position - это смещение звука относительно актора. Звук смещается вместе с актором. Также, необходимо использовать флаг s2d (при s3d звука не будет); для других объектов аргумент position является позицией на уровне. В этом случае необходимо использовать флаг s3d. play_no_feedback Скрытый текст function play_no_feedback(obj, flags, timeout, position, volume); в случае проигрывания в голове актора - параметр position устанавливает смещение относительно актора; звук перемещается вместе с актором; необходимо использовать флаг s2d (при s3d звука не будет); в случае проигрывания в пространстве - параметр position устанавливает позицию проигрывания звука на уровне; необходимо использовать флаг s3d; если задано циклическое проигрывание звука, то оно не прекратится, даже если перезагрузить уровень; громкость задается в интервале от 0.0 до 1.0; поскольку метод без обратной связи, в процессе проигрывания звука нельзя изменить его громкость, позицию, а также оставить проигрывание. Данный метод подходит для проигрывания не цикличных звуков, для который не требуется дальнейшее изменение параметров. Внимание! При использовании методов play и play_at_pos необходимо сохранять созданный звуковой объект во внешнюю локальную переменную, иначе сборщик мусора затрет звук. 5 Ссылка на комментарий
Winsor 177 Опубликовано 12 Апреля 2018 Поделиться Опубликовано 12 Апреля 2018 В 05.02.2018 в 02:01, Dennis_Chikin сказал: level.add_call( my_func, another_func ) level.add_call добавляет на каждом апдейте вызов Ваших функций, указанных как параметры таким образом первый параметр - это функция которая должна в обязательном порядке вернуть значение булевого типа. если функция вернула true - это условие для вызова функции во втором параметре. результат второй функции - не важен. так как данная проверка происходит на каждом OnFrame - для ускорения работы движок не проверяет валидность результата функции my_func вообще. Если функция возвращает , например, userdata, либо не возвращает ничего - будет вылет. По поводу однократного вызова - проверка my_func будет вызываться до тех пор пока не будет сделан level.remove-call( my_func, another_func ) - ну и само собой - если my_func вернула true на каждом вызове - то и постоянно будет вызываться another_func. Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 12 Апреля 2018 Поделиться Опубликовано 12 Апреля 2018 вот полный код: function update() local v = upd_t[upd_i] if v then local st = v.st if st.active_section then issue_event( v.object, st[st.active_scheme], "update", delta ) else upd_t[upd_i] = false -- удаляем из списка на апдейт end upd_i = upd_i + 1 elseif v == false then -- удаляем из списка на апдейт table_remove( idx_t, upd_i ) table_remove( upd_t, upd_i ) upd_n = upd_n - 1 else upd_end = true end return false end Если через issue_event() каким-то образом доходит до level.set_weather_fx( ... ) - вот на ней и виснем. Если это же самое вызывать не через level.add_call( update, dummy_action ), а, например, из апдейта актора, либо конкретно if условие then ... level.set_weather_fx( ... ) ... end вынести в тот же апдейт актора - все замечательно работает. То есть, делаем вывод, что все-таки связка level.add_call( ... ) + level.set_weather_fx( ... ). Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Graff46 598 Опубликовано 12 Апреля 2018 Поделиться Опубликовано 12 Апреля 2018 Хотелось бы узнать о таком применении функции: function add_call(object, const function<boolean>&, const function<void>&); function add_call(object, string, string); Ссылка на комментарий
dsh 3 824 Опубликовано 12 Апреля 2018 Поделиться Опубликовано 12 Апреля 2018 @Graff46 тоже самое, только вызываются методы объекта. В первом случае они передаются ссылкой, во втором - названием. Насколько я помню, там, где это не исправлялись, они не рабочие, как и соотв. им remove_call. remove_call сам по себе не очень рабочий. Например, если его вызвать из функции, которая выполняется из add_call. dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
Serge_888 114 Опубликовано 29 Октября 2018 Поделиться Опубликовано 29 Октября 2018 Здравствуйте, может здесь кто подскажет. Есть ли у оружия wpn_rg-6 (который гранатомёт Бульдог-6) свойство отвечающее за готовность к стрельбе? Или функция инициализации/ресета для приведения в нулёвое состояние? Кстати, заклинившие стволы тоже должны иметь похожее свойство. Проблемка - когда отключаю в конфиг-файле tri_state_reload = off и добавляю анимку anm_reload (без неё вылет), после выстреливания количества гранат указанного в ammo_mag_size, сколько ни перезаряжай, стрелять не хочет. Думаю, может скриптами это пофиксить можно? Пока, кроме как тупо забрать РГ-6 у актора и тут-же выдать новый ничего в голову не приходит. Кстати, заодно не подскажете как из скрипта запустить анимацию (например перезарядки) в ЗП, для рук и оружия? Ссылка на комментарий
НаноБот 742 Опубликовано 29 Августа 2019 Поделиться Опубликовано 29 Августа 2019 (изменено) @Serge_888, на счёт РГ-6, это движковой правкой. В новой ревизии ХЕ это по фиксил, выложу завтра. Тут выкладывали функцию проекции точки на экран . function point_projection(pos) local x, y local scr_w, scr_h = dev.width, dev.height local ppp = vector():sub(pos, dev.cam_pos) local dp = dev.cam_dir:dotproduct(ppp) if dp>0 then local scr_dist_dp = 0.5 * scr_h/(math.tan(dev.fov*grad2rand*0.5)*dp) x = 512 + dev.cam_right:dotproduct(ppp)*scr_dist_dp*(1024/scr_w) y = 384 - dev.cam_top:dotproduct(ppp)*scr_dist_dp*(768/scr_h) if x<0 or x>1024 or y<0 or y>768 then x, y = nil, nil end end return x, y end Исправлена ошибка, когда метка отображалась за спиной. Если координата вне экрана, то возвращает nil. Изменено 29 Августа 2019 пользователем НаноБот 1 ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Ссылка на комментарий
Graff46 598 Опубликовано 2 Октября 2019 Поделиться Опубликовано 2 Октября 2019 (изменено) Различия lua_help.script между ТЧ и ЗП версиями от @abramcumner Скрытый текст + class vector2 - const story_ids::XXX + const callback::action_removed и callback::weapon_no_ammo - const key_bindings::kCAM_4 и key_bindings::kCROUCH_TOGGLE - class game_messages - class game_phases - class game_player_flags + const GAME_TYPE::eGameIDCaptureTheArtefact + const task::additional и task::storyline - const ui_events::INVENTORY_ХХХ и тому подобное + class GameGraph__LEVEL_MAP__value_type + class MEMBERS__value_type + class award_pair_t + class best_scores_pair_t + clsid::XXX + const CSightParams::eSightTypeAnimationDirection + function FS_item::ModifDigitOnly - class RPoint + class Patch_Dawnload_Progress + class rotation + class award_data - class SZoneMapEntityData - class TEX_INFO - class game_PlayerState + class profile + function class action_base::weight - class ZoneMapEntities + class suggest_nicks_cb + class account_profiles_cb + class login_operation_cb + class account_operation_cb + class found_email_cb + class store_operation_cb + function CAI_Bloodsucker::force_visibility_state(number); + function CALifeHumanBrain::can_choose_alife_tasks(boolean); + function CALifeMonsterBrain::can_choose_alife_tasks(boolean); - function alife_simulator::object(const alife_simulator*, string); + CALifeSmartTerrainTask::CALifeSmartTerrainTask (number, number); + class CActor + class CAntirad + class CArtefact + function CXXXArtefact::SwitchVisibility(boolean); + function CXXXArtefact::FollowByPath(string, number, vector); + function CXXXArtefact::GetAfRank() const; + class CBottleItem + function CConsole::execute_deferred(CConsole*, string); + function cover_point::is_smart_cover(const cover_point*); + class CDestroyablePhysicsObject - function CDialogHolder::start_stop_menu(CUIDialogWnd*, boolean); - function CDialogHolder::MainInputReceiver(); + class CPhraseScript + class CExplosiveItem + class CFoodItem + function CGameGraph::levels(const CGameGraph*); ~ class CGameTask сильно переделан. + class CGrenadeLauncher ~ class CHelicopter вроде как расширен значительно + class CInventoryBox + class CLevelChanger - class CKinematicsAnimated + class CMainMenu + class CMedkit + class CPda + class CPhysicObject - class CPhraseScript + class CRadioactiveZone + property cse_abstract::angle; и всем наследникам - function XXX::FillProps(string, class xr_vector<class PropItem *,class xalloc<class PropItem *> >&); + class cse_alife_inventory_box + class cse_alife_item_weapon_auto_shotgun ~ class cse_alife_monster_abstract и наследники + class cse_alife_monster_rat + class cse_smart_cover + const anim::capture_prepare = 1; + property game_object::bleeding + function game_object::active_detector() const; + function game_object::actor_look_at_point(vector); + function game_object::add_animation(string, boolean, vector, vector, boolean); + function game_object::add_combat_sound(string, number, enum ESoundTypes, number, number, number, string); + function game_object::aim_bone_id() const; + function game_object::aim_bone_id(string); + function game_object::aim_time(game_object*); + function game_object::aim_time(game_object*, number); + function game_object::allow_break_talk_dialog(boolean); + function game_object::allow_sprint(boolean); + function game_object::apply_loophole_direction_distance() const; + function game_object::apply_loophole_direction_distance(number); + function game_object::attachable_item_load_attach(string); + function game_object::burer_get_force_gravi_attack(); + function game_object::burer_set_force_gravi_attack(boolean); + function game_object::buy_item_condition_factor(number); + function game_object::can_select_weapon() const; + function game_object::can_select_weapon(boolean); + function game_object::can_throw_grenades() const; + function game_object::can_throw_grenades(boolean); + function game_object::character_icon(); + function game_object::community_goodwill(string); + function game_object::deadbody_can_take(boolean); + function game_object::deadbody_can_take_status(); + function game_object::deadbody_closed(boolean); + function game_object::deadbody_closed_status(); + function game_object::death_sound_enabled() const; + function game_object::death_sound_enabled(boolean); + function game_object::disable_hit_marks() const; + function game_object::disable_hit_marks(boolean); + function game_object::disable_inv_upgrade(); + function game_object::disable_show_hide_sounds(boolean); + function game_object::enable_inv_upgrade(); + function game_object::enable_level_changer(boolean); + function game_object::enable_night_vision(boolean); + function game_object::enable_torch(boolean); + function game_object::find_best_cover(vector); + function game_object::force_set_goodwill(number, game_object*); + function game_object::force_stand_sleep_animation(number); + function game_object::force_visibility_state(number); + function game_object::get_artefact(); + function game_object::get_bone_id(string) const; + function game_object::get_campfire(); - function game_object::get_bleeding() const; + function game_object::get_dest_smart_cover(); + function game_object::get_dest_smart_cover_name(); + function game_object::get_force_anti_aim(); - function game_object::get_info_time(string); + function game_object::get_movement_speed() const; + function game_object::get_physics_object(); + function game_object::get_smart_cover_description() const; + function game_object::get_visibility_state(); + function game_object::get_visual_name() const; + function game_object::give_game_news(string, string, string, number, number); + function game_object::give_game_news(string, string, string, number, number, number); - function game_object::give_game_news(string, string, Frect, number, number); + function game_object::give_talk_message2(string, string, string, string); + function game_object::group_throw_time_interval() const; + function game_object::group_throw_time_interval(number); + function game_object::idle_max_time() const; + function game_object::idle_max_time(number); + function game_object::idle_min_time() const; + function game_object::idle_min_time(number); + function game_object::invulnerable() const; + function game_object::invulnerable(boolean); + function game_object::inv_box_can_take(boolean); + function game_object::inv_box_can_take_status(); + function game_object::inv_box_closed(boolean, string); + function game_object::inv_box_closed_status(); + function game_object::in_current_loophole_fov(vector) const; + function game_object::in_current_loophole_range(vector) const; + function game_object::in_loophole_fov(string, string, vector) const; + function game_object::in_loophole_range(string, string, vector) const; + function game_object::in_smart_cover() const; + function game_object::is_door_locked_for_npc() const; + function game_object::is_inv_upgrade_enabled(); + function game_object::is_level_changer_enabled(); + function game_object::is_there_items_to_pickup() const; + function game_object::iterate_inventory_box(function<void>, object); + function game_object::level_vertex_light(const number&) const; + function game_object::lock_door_for_npc(); + function game_object::lookout_max_time() const; + function game_object::lookout_max_time(number); + function game_object::lookout_min_time() const; + function game_object::lookout_min_time(number); + function game_object::make_item_active(game_object*); + function game_object::movement_target_reached(); + function game_object::night_vision_enabled() const; + function game_object::on_door_is_closed(); + function game_object::on_door_is_open(); + function game_object::poltergeist_get_actor_ignore(); + function game_object::poltergeist_set_actor_ignore(boolean); + function game_object::register_door_for_npc(); + function game_object::register_in_combat(); + function game_object::release_stand_sleep_animation(); ~ function game_object::run_talk_dialog(game_object*, boolean); + function game_object::set_active_task(CGameTask*); + function game_object::set_capture_anim(game_object*, string, const vector&, number); + function game_object::set_collision_off(boolean); + function game_object::set_community_goodwill(string, number); - function game_object::set_character_reputation(number); + function game_object::set_dest_game_vertex_id(number); + function game_object::set_dest_loophole(); + function game_object::set_dest_loophole(string); + function game_object::set_dest_smart_cover(); + function game_object::set_dest_smart_cover(string); + function game_object::set_enemy(game_object*); + function game_object::set_force_anti_aim(boolean); + function game_object::set_home(number, number, number, boolean, number); + function game_object::set_level_changer_invitation(string); + function game_object::set_movement_selection_type(enum ESelectionType); + function game_object::set_npc_position(vector); + function game_object::set_smart_cover_target(); + function game_object::set_smart_cover_target(game_object*); + function game_object::set_smart_cover_target(vector); + function game_object::set_smart_cover_target_default(boolean); + function game_object::set_smart_cover_target_fire(); + function game_object::set_smart_cover_target_fire_no_lookout(); + function game_object::set_smart_cover_target_idle(); + function game_object::set_smart_cover_target_lookout(); + function game_object::set_smart_cover_target_selector(); + function game_object::set_smart_cover_target_selector(function<void>); + function game_object::set_smart_cover_target_selector(function<void>, object); + function game_object::set_sympathy(number); + function game_object::set_visual_memory_enabled(boolean); + function game_object::set_visual_name(string); + function game_object::set_vis_state(number); + function game_object::sniper_fire_mode() const; + function game_object::sniper_fire_mode(boolean); + function game_object::sniper_update_rate() const; + function game_object::sniper_update_rate(boolean); + function game_object::special_danger_move(); + function game_object::special_danger_move(boolean); + function game_object::start_particles(string, string); + function game_object::stop_particles(string, string); + function game_object::suitable_smart_cover(game_object*); + function game_object::switch_to_upgrade(); + function game_object::sympathy(); + function game_object::take_items_enabled() const; + function game_object::take_items_enabled(boolean); + function game_object::torch_enabled() const; + function game_object::unlock_door_for_npc(); + function game_object::unregister_door_for_npc(); + function game_object::unregister_in_combat(); + function game_object::use_smart_covers_only() const; + function game_object::use_smart_covers_only(boolean); + function game_object::weapon_grenadelauncher_status(); + function game_object::weapon_is_grenadelauncher(); + function game_object::weapon_is_scope(); + function game_object::weapon_is_silencer(); + function game_object::weapon_scope_status(); + function game_object::weapon_silencer_status(); + const hit::light_burn = 11; + const move::run_with_leader = 7; + const move::walk_with_leader = 6; + function sound_object::attach_tail(string); + function CScriptXmlInit::InitSleepStatic(string, CUIWindow*); + function CScriptXmlInit::InitTextWnd(string, CUIWindow*); + function CScriptXmlInit::InitProgressBar(string, CUIWindow*); + function CScriptXmlInit::InitListBox(string, CUIWindow*); + function CScriptXmlInit::InitMPPlayerName(string, CUIWindow*); - function CScriptXmlInit::InitList(string, CUIWindow*); - function CScriptXmlInit::ParseShTexInfo(string); - function CScriptXmlInit::InitLabel(string, CUIWindow*); - function CScriptXmlInit::InitAutoStaticGroup(string, CUIWindow*); - function CScriptXmlInit::InitButton(string, CUIWindow*); + class CSilencer + const stalker_ids::sound_enemy_lost_no_allies = 12; + const stalker_ids::sound_enemy_lost_with_allies = 13; + const stalker_ids::sound_wounded = 18; + class CTorridZone - class CUICaption + class CWeaponAmmo + class CWeaponAutomaticShotgun + class CZoneCampfire + class FactionState - class IKinematicsAnimated - class SGameTaskObjective + class smart_cover_object + class profile_store + function cast_planner(action_base*); + function IsDynamicMusic(); + function IsGameTypeSingle(); + function IsImportantSave(); + function render_get_dx_level(); + function valid_saved_game(string); - function cast_action_to_planner(action_base*); - function cast_alife_object_to_creature(cse_alife_object*); - function cast_alife_object_to_trader_abstract(cse_alife_object*); - function cast_planner_to_action(action_planner*); - function GetTextureInfo(string, string); - function GetTextureName(string); - function GetTextureRect(string); - function xrRender_test_r2_hw(); + function level.change_game_time(number, number, number); + function level.get_wfx_time(); + function level.hide_indicators_safe(); + function level.high_cover_in_direction(number, const vector&); + function level.low_cover_in_direction(number, const vector&); + function level.show_weapon(boolean); + function level.start_weather_fx_from_time(string, number); + function level.stop_weather_fx(); + function level.vertex_id(vector); - function level.cover_in_direction(number, const vector&); - function level.main_input_receiver(); - function level.start_stop_menu(CUIDialogWnd*, boolean); Изменено 2 Октября 2019 пользователем Graff46 2 Ссылка на комментарий
Graff46 598 Опубликовано 12 Октября 2019 Поделиться Опубликовано 12 Октября 2019 (изменено) Хотелось бы иметь описания методов и свойств классов: Скрытый текст C++ class action_base { property object; property storage; action_base (); action_base (game_object*); action_base (game_object*, string); function finalize(); function add_precondition(const world_property&); function execute(); function remove_precondition(const number&); function setup(game_object*, property_storage*); function set_weight(const number&); function add_effect(const world_property&); function show(string); function initialize(); function remove_effect(const number&); }; C++ class action_planner { property object; property storage; action_planner (); function initialized() const; function remove_action(const number&); function action(const number&); function add_action(const number&, action_base*); function show(string); function update(); function clear(); function evaluator(const number&); function setup(game_object*); function set_goal_world_state(action_planner*, world_state*); function current_action(); function add_evaluator(const number&, property_evaluator*); function remove_evaluator(const number&); function current_action_id() const; function actual(const action_planner*); }; C++ class planner_action : action_planner,action_base { property object; property storage; planner_action (); planner_action (game_object*); planner_action (game_object*, string); function finalize(); function action(const number&); function add_precondition(const world_property&); function add_action(const number&, action_base*); function update(); function remove_effect(const number&); function current_action(); function current_action_id() const; function initialized() const; function weight(const world_state&, const world_state&) const; function initialize(); function actual(const action_planner*); function remove_action(const number&); function remove_precondition(const number&); function execute(); function clear(); function evaluator(const number&); function set_goal_world_state(action_planner*, world_state*); function set_weight(const number&); function add_effect(const world_property&); function show(string); function setup(game_object*); function setup(game_object*, property_storage*); function remove_evaluator(const number&); function add_evaluator(const number&, property_evaluator*); }; C++ class world_state { world_state (); world_state (world_state); function clear(); function includes(const world_state&) const; operator ==(const world_state&, world_state); function remove_property(const number&); function add_property(const world_property&); operator <(const world_state&, world_state); function property(const number&) const; }; C++ class world_property { world_property (number, boolean); function value() const; operator <(const world_property&, world_property); function condition() const; operator ==(const world_property&, world_property); }; C++ class property_evaluator { property object; property storage; property_evaluator (); property_evaluator (game_object*); property_evaluator (game_object*, string); function evaluate(); function setup(game_object*, property_storage*); }; C++ class property_evaluator_const : property_evaluator { property object; property storage; property_evaluator_const (boolean); function evaluate(); function setup(game_object*, property_storage*); }; Изменено 12 Октября 2019 пользователем Graff46 2 Ссылка на комментарий
Graff46 598 Опубликовано 14 Мая 2020 Поделиться Опубликовано 14 Мая 2020 (изменено) Описания классов действий Отсюда https://xray-engine.org/index.php?title=Управление_персонажем Автор: К. Д. Скрытый текст class act { //глобальное поведение монстров //MonsterSpace::EScriptMonsterGlobalAction const rest = 0; //отдыхать. Место отдыха монстр выбирает сам. У меня ложился под дерево. const eat = 1; //кушать труп. const attack = 2; //атаковать что-нибудь const panic = 3; //убегать в панике //конструкторы: void act(); //кто его знает, зачем такой конструктор - ни одно свойство у класса выставить нельзя. void act(enum MonsterSpace::EScriptMonsterGlobalAction); //создает экшен с установленным типом поведения. Этот конструктор можно вызвать только с типом rest. attack и eat просто не будут работать, вместо panic монстр уходить спокойно погулять. void act(enum MonsterSpace::EScriptMonsterGlobalAction, game_object*); //Конструктор для eat, attack, panic. Вторым аргументом задается объект, по отношению к которому устанавливается поведение. Для eat - это объект трупа, для attack - кого атакуем, для panic - от кого бежим. }; class anim { //анимация сталкеров и монстров. //MonsterSpace::EMentalState const danger = 0; //состояние опасности const free = 1; //обычное состояние const panic = 2; //состояние паники //MonsterSpace::EScriptMonsterAnimAction const stand_idle = 0; //спокойно стоять const sit_idle = 1; //спокойно сидеть const lie_idle = 2; //спокойно лежать const eat = 3; //есть const sleep = 4; //спать const rest = 5; //отдыхать const attack = 6; //атаковать const look_around = 7; //вертеть башкой const turn = 8; //повернуться //конструкторы void anim (); //создает пустой объект экешна void anim (string caAnimationToPlay); void anim (string caAnimationToPlay, bool use_single_hand); //создает экешен с установленной анимацией //конструкторы для сталкеров void anim (enum MonsterSpace::EMentalState); //создает пустой объект экешна с установленным состоянием //!ПРОВЕРИТЬ! судя по всему, сам по себе не работает, надо использовать в паре с move //конструктор для монстров void anim (enum MonsterSpace::EScriptMonsterAnimAction, int index); //создает пустой объект экешна с установленным состоянием и индексом анимации (?). Задавал 0, все работало //методы bool completed(); //закончен ли экшн void type(enum MonsterSpace::EMentalState state); //установить состояние void anim(string caAnimationToPlay); //установить анимацию }; class cond { //установка времени действия экшена //CScriptActionCondition::EActionFlags const move_end = 1; const look_end = 2; const anim_end = 4; const sound_end = 8; const object_end = 32; const time_end = 64; const act_end = 128; //такое чувство, что не работает ничего, кроме time_end. //конструкторы. void cond (); //создает пустой объект. Непонятно, зачем. void cond (int dwFlags); // создает объект, устанавливая флаги экшенов. void cond (int dwFlags, double dTime); // создает объект, устанавливая флаги экшенов и время жизни экшена. }; class look { //установка взгляда сталкеров //SightManager::ESightType const cur_dir = 0; //смотреть по текущему направлению const path_dir = 1; //смотреть по пути const direction = 2; //смотреть в каком-то направлении const point = 3; //смотреть в точку только головой // eSightTypeObject = 4 const danger = 5; //смотреть по сторонам куда хочу, даже если придётся менять направление тела const search = 6; //смотреть по сторонам так, чтобы не менять направление тела, которое ориентировано по пути // eSightTypeLookOver = 7 // eSightTypeCoverLookOver = 8 // eSightTypeFireObject = 9 const fire_point = 10; //смотреть в точку головой и автоматом void look (); //создает пустой завешенный (!) экшн //для cur_dir и path_dir. void look (enum SightManager::ESightType tWatchType); //для остальных типов void look (enum SightManager::ESightType tWatchType, vector& direction); //tWatchType - тип взгляда, direction - точка, куда смотрим. void look (enum SightManager::ESightType tWatchType, game_object* tpObjectToWatch); void look (enum SightManager::ESightType tWatchType, game_object* tpObjectToWatch, string bone_to_watch); //tWatchType - тип взгляда, tpObjectToWatch - объект, на который смотрим, bone_to_watch - кость, на которую смотрим //по идее, тут можно задать скорость поворота, но у меня оба конструктора не работают. void look (const vector& target, float vel1, float vel2); void look (game_object* tpObjectToWatch, float vel1, float vel2); bool completed(); //закончен ли экшн void type(enum SightManager::ESightType); //установить отип взгляда. void object(game_object* tpObjectToWatch); //установить объект, на который смотрим. void bone(string); //установить кость, на которую смотрим. void direct(const vector&); //установить направление взгляда. }; class move { //движение объектов. Нельзя применять для прожекторов. //MonsterSpace::EBodyState const crouch = 0; const standing = 1; //MonsterSpace::EMovementType const walk = 0; const run = 1; const stand = 2; //DetailPathManager::EDetailPathType const curve = 0; const dodge = 1; const criteria = 2; const line = 0; const curve_criteria = 2; //CScriptMovementAction::EInputKeys const none = 1; const fwd = 2; const back = 4; const left = 8; const right = 16; const up = 32; //ShiftUp const down = 64; //ShiftDown const handbrake = 128; const on = 256; //EngineOn const off = 512; //EngineOff //MonsterSpace::EScriptMonsterMoveAction const walk_fwd = 0; const walk_bkwd = 1; //никто из монстров не умеет бегать назад. Зачем это? const run_fwd = 2; const drag = 3; const jump = 4; const steal = 5; //MonsterSpace::EScriptMonsterSpeedParam const default = 0; const force = 1; // eSP_None = -1 //конструктор объекта с дефолтными параметрами void move (); //конструкторы для машин void move (enum CScriptMovementAction::EInputKeys tInputKeys); void move (enum CScriptMovementAction::EInputKeys tInputKeys, float fSpeed); //с InputKeys все понятно, fSpeed - ограничение скорости. По умолчанию 0, то есть, нет ограничения //конструкторы для сталкерья void move (enum MonsterSpace::EBodyState tBodyState, enum MonsterSpace::EMovementType tMovementType, enum DetailPathManager::EDetailPathType tPathType, game_object* tpObjectToGo); void move (enum MonsterSpace::EBodyState tBodyState, enum MonsterSpace::EMovementType tMovementType, enum DetailPathManager::EDetailPathType tPathType, game_object* tpObjectToGo, float fSpeed); //tBodyState - в каком положении идти (сидя, стоя), tMovementType - как идти (бежать, стоять, идти), tPathType - тип пути (прямая, кривая, дуга), tpObjectToGo - за кем идти, fSpeed - с какой скоростью идти. void move (enum MonsterSpace::EBodyState tBodyState, enum MonsterSpace::EMovementType tMovementType, enum DetailPathManager::EDetailPathType tPathType, const patrol& tPatrolPathParams); void move (enum MonsterSpace::EBodyState tBodyState, enum MonsterSpace::EMovementType tMovementType, enum DetailPathManager::EDetailPathType tPathType, const patrol& tPatrolPathParams, float fSpeed); //cм выше, только вместо объекта - путь, по которому идем. void move (enum MonsterSpace::EBodyState tBodyState, enum MonsterSpace::EMovementType tMovementType, enum DetailPathManager::EDetailPathType tPathType, const vector& position); void move (enum MonsterSpace::EBodyState tBodyState, enum MonsterSpace::EMovementType tMovementType, enum DetailPathManager::EDetailPathType tPathType, const vector& position, float fSpeed); //см выше, вместо объекта - координаты, куда идем. //конструкторы для монстров. void move (enum MonsterSpace::EScriptMonsterMoveAction tAct, patrol& tPatrolPathParams); void move (enum MonsterSpace::EScriptMonsterMoveAction tAct, patrol& tPatrolPathParams, float dist_to_end); void move (enum MonsterSpace::EScriptMonsterMoveAction tAct, patrol& tPatrolPathParams, float dist_to_end, enum MonsterSpace::EScriptMonsterSpeedParam speed_param); void move (enum MonsterSpace::EScriptMonsterMoveAction tAct, vector& tPosition); void move (enum MonsterSpace::EScriptMonsterMoveAction tAct, vector& tPosition, float fSpeed); void move (enum MonsterSpace::EScriptMonsterMoveAction tAct, vector& tPosition, float fSpeed, enum MonsterSpace::EScriptMonsterSpeedParam); void move (enum MonsterSpace::EScriptMonsterMoveAction tAct, int node_id, vector& tPosition); void move (enum MonsterSpace::EScriptMonsterMoveAction tAct, int node_id, vector& tPosition, float dist_to_end); void move (enum MonsterSpace::EScriptMonsterMoveAction tAct, game_object* tpObjectToGo); void move (enum MonsterSpace::EScriptMonsterMoveAction tAct, game_object* tpObjectToGo, float dist_to_end); void move (enum MonsterSpace::EScriptMonsterMoveAction tAct, game_object* tpObjectToGo, float dist_to_end, enum MonsterSpace::EScriptMonsterSpeedParam speed_param); void move (const vector& tPosition, float dist_to_end); bool completed(); //закончен ли экшн //методы установки параметров объекта void body(enum MonsterSpace::EBodyState tBodyState); //состояние тела void move(enum MonsterSpace::EMovementType tMovementType); //тип движения void path(enum DetailPathManager::EDetailPathType tPathType); //тип пути void object(game_object* tpObjectToGo); //к кому идти void patrol(const CPatrolPath *path, shared_str path_name); //путь для движения void position(const vector& tPosition); //координаты назначения void input(enum CScriptMovementAction::EInputKeys tInputKeys); //клавиши управления }; class object { //манипуляции сталкеров с объектом (оружие, рации и типа того). Также работает для машин (открыть/закрыть дверь). //MonsterSpace::EObjectAction const switch1 = 0; const switch2 = 1; const reload = 2; const reload1 = 2; const reload2 = 3; const aim1 = 4; const aim2 = 5; const fire1 = 6; const fire2 = 7; const idle = 8; const strap = 9; const drop = 10; // eObjectActionAimReady1 = 11 // eObjectActionAimReady2 = 12 // eObjectActionAimForceFull1 = 13 // eObjectActionAimForceFull2 = 14 const activate = 15; const deactivate = 16; const use = 17; const turn_on = 18; const turn_off = 19; const show = 20; const hide = 21; const take = 22; // eObjectActionMisfire1 = 23 // eObjectActionEmpty1 = 24 // eObjectActionNoItems = 65535 const dummy = -1; //конструкторы void object (); //конструкторы для сталкеров. void object (game_object* tpLuaGameObject, enum MonsterSpace::EObjectAction tObjectActionType); void object (game_object* tpLuaGameObject, enum MonsterSpace::EObjectAction tObjectActionType, int dwQueueSize); //tpLuaGameObject – объект, с которым нужно что-то делать, tObjectActionType - что делать, dwQueueSize – размер очереди при стрельбе //конструктор для машин void object (string caBoneName, enum MonsterSpace::EObjectAction tObjectActionType); //caBoneName - имя кости (например, для того, чтобы открыть/закрыть дверь в машине (activate\deactivate)). Но у меня открыть/закрыть двери не вышло. //это не работает void object (enum MonsterSpace::EObjectAction tObjectActionType); bool completed(); //закончен ли экшн void object(string caBoneName); //установить кость, к которой присоединяем объект void object(game_object* tpLuaGameObject); //установить объект, который присоединяем void action(enum MonsterSpace::EObjectAction tObjectActionType); //установить тип экшена }; class particle { //отыгрывание на объекте партиклов //конструкторы particle (); particle (string caPartcileToRun, string caBoneName); particle (string caPartcileToRun, string caBoneName, const particle_params& tParticleParams); particle (string caPartcileToRun, string caBoneName, const particle_params& tParticleParams, bool bAutoRemove); //caPartcileToRun – имя системы частиц, caBoneName – имя кости, tParticleParams – экземпляр класса particle_param, bAutoRemove – зацикленный партикл. Gервые два параметра обязательны, остальные по умолчанию равны нулю particle (string caPartcileToRun, const particle_params& tParticleParams); particle (string caPartcileToRun, const particle_params& tParticleParams, bool bAutoRemove); //см. выше, точка проигрывания партикла берется из tParticleParams. bool completed(); //закончен ли экшн void set_velocity(const vector& vel); //установить скорость движения партикла void set_position(const vector& pos); //установить координаты партикла void set_bone(string caBoneName); //установить кость, от которой играется партикл void set_angles(const vector& angle); //установить углы (?) партикла void set_particle(string caParticleToRun, bool bAutoRemove); //установить партикл }; class particle_params { //параметры отыгрывания партиклов particle_params (); particle_params (const vector& tPositionOffset); particle_params (const vector& tPositionOffset, const vector& tAnglesOffset); particle_params (const vector& tPositionOffset, const vector& tAnglesOffset, const vector& tVelocity); }; class patrol { //параметры движения сталкеров и монстров по путям. Используется в классе move. //PatrolPathManager::EPatrolStartType const start = 0; // ePatrolStartTypeLast = 1 const nearest = 2; const custom = 3; //ePatrolStartTypePoint const next = 4; //PatrolPathManager::EPatrolRouteType const stop = 0; const continue = 1; //common const dummy = -1; patrol (string caPatrolPathToGo); patrol (string caPatrolPathToGo, enum PatrolPathManager::EPatrolStartType tPatrolPathStart); patrol (string caPatrolPathToGo, enum PatrolPathManager::EPatrolStartType tPatrolPathStart, enum PatrolPathManager::EPatrolRouteType tPatrolPathStop); patrol (string caPatrolPathToGo, enum PatrolPathManager::EPatrolStartType tPatrolPathStart, enum PatrolPathManager::EPatrolRouteType tPatrolPathStop, bool bRandom); patrol (string caPatrolPathToGo, enum PatrolPathManager::EPatrolStartType tPatrolPathStart, enum PatrolPathManager::EPatrolRouteType tPatrolPathStop, bool bRandom, int index); //аргументы конструкторов: <имя пути>, <тип старта пути>, <тип финиша пути>, <если путь имеет ветвления, то выбирать ли их случайно>. Нетрудно видеть, что первый аргумент конструктора (имя пути) - обязательный, остальные по умолчанию таковы: тип старта = patrol.nearest, тип финиша = patrol.continue, случайность = true. int level_vertex_id(int point_id) const; //возвращает число заданной точки пути. Аргумент - номер точки, начиная с 0 (pN:level_vertex_id = ... в алл.спавне). vector point(int point_id); //возвращает координаты заданной точки пути. Аргумент - номер точки, начиная с 0 (pN:position = ... в алл.спавне). bool flag(int point_id, int flag) const; //возвращает true, если значение флага в точке number1 равно number2, иначе false. Агрументы: первый - номер точки, второй - число (в оригинальных скриптах почему-то только от 1 до 32) int game_vertex_id(int point_id) const; //возвращает гейм вертекс заданной точки пути. Аргумент - номер точки, начиная с 0 (pN:game_vertex_id = ... в алл.спавне). flags32 flags(int point_id) const; //возвращает флаг данной точки пути (pN:flags = ... в алл.спавне). Аргумент - номер точки, начиная с 0. Значение флага можно узнать методом get() класса flags32 string name(int point_id) const; //возвращает название заданной точки пути. Аргумент - номер точки, начиная с 0 (pN:name = ... в алл.спавне). int index(string name) const; //возвращает id точки пути c заданным именем. bool terminal(int point_id) const; // возвращает true, если из данной точки нет переходов на другие точки и false, если есть (есть ли pN:links = ... в алл.спавне). Аргумент - номер точки, начиная с 0. int count() const; //возвращает количество точек в пути int get_nearest(const vector& pos) const; //ищет ближайшую к заданным вектором координатам точку пути }; class sound { //отыгрывание объектом звуков //MonsterSound::EType // eMonsterSoundBase = 0 const idle = 1; const eat = 2; const attack = 3; //eMonsterSoundAggressive const attack_hit = 4; const take_damage = 5; // eMonsterSoundStrike = 6 const die = 7; // eMonsterSoundDieInAnomaly = 8 const threaten = 9; const steal = 10; const panic = 11; // eMonsterSoundIdleDistant = 12 // eMonsterSoundScript = 128 // eMonsterSoundCustom = 16384 // eMonsterSoundDummy = -1 //видимо, не экспортированы, но есть void sound (string caSoundToPlay, const vector& tPosition, const vector& tAngleOffset, bool bLooped, enum MonsterSound::EType sound_type); void sound (string caSoundToPlay, string caBoneName, const vector& tPositionOffset, const vector& tAngleOffset, bool bLooped, enum MonsterSound::EType sound_type); void sound (sound_object& sound, string caBoneName, const vector& tPositionOffset, const vector& tAngleOffset, bool bLooped, enum MonsterSound::EType sound_type); void sound (sound_object& sound, const vector& tPosition, const vector& tAngleOffset, bool bLooped, enum MonsterSound::EType sound_type); //конструкторы void sound (); //конструкторы для сталкеров и монстров void sound (string caSoundToPlay, string caBoneName); void sound (string caSoundToPlay, string caBoneName, const vector& tPositionOffset); void sound (string caSoundToPlay, string caBoneName, const vector& tPositionOffset, const vector& tAngleOffset); void sound (string caSoundToPlay, string caBoneName, const vector& tPositionOffset, const vector& tAngleOffset, bool bLooped); //<sound_name>, <bone_name>, <position_offset>, <angle_offset>, <looped>. sound_name – имя звука, bone_name – имя кости, position_offset – вектор, смещение относительно позиции кости, angle_offset – вектор, угловое смещение относительно углов кости, looped – зацикленный звук. Первые два параметра обязательны, остальные по умолчанию равны нулю void sound (string caSoundToPlay, const vector& tPosition); void sound (string caSoundToPlay, const vector& tPosition, const vector& tAngleOffset); void sound (string caSoundToPlay, const vector& tPosition, const vector& tAngleOffset, bool bLooped); //см. выше, играется по умолчанию от головы void sound (sound_object& sound, string caBoneName, const vector& tPositionOffset); void sound (sound_object& sound, string caBoneName, const vector& tPositionOffset, const vector& tAngleOffset); void sound (sound_object& sound, string caBoneName, const vector& tPositionOffset, const vector& tAngleOffset, bool bLooped); //см. выше, инициализуется не строковым именем, а объектом звука (см. класс sound_object) void sound (sound_object& sound, const vector& tPosition); void sound (sound_object& sound, const vector& tPosition, const vector& tAngleOffset); void sound (sound_object& sound, const vector& tPosition, const vector& tAngleOffset, bool bLooped); //см. выше, инициализуется не строковым именем, а объектом звука (см. класс sound_object), играется по умолчанию от головы //конструкторы для монстров void sound (enum MonsterSound::EType sound_type); void sound (enum MonsterSound::EType sound_type, int delay); //sound_type – тип звука (см. перечисление выше), delay – задержка звука. //этот конструктор предполагает, что объект еще будет корчить рожи. Но, поскольку это умеет только Cидор, видимо, это для торговцев (CAI_Trader). У меня сталкеры выражение лица не меняли. void sound (string caSoundToPlay, string caBoneName, enum MonsterSpace::EMonsterHeadAnimType head_anim_type); //caSoundToPlay – имя звука, caBoneName – имя кости, head_anim_type - член перечисления MonsterSpace, анимация лица. bool completed(); //закончен ли экшн void set_position(const vector& pos); //установить координаты звука void set_bone(string caBoneName); //установить кость, от которой играется звук void set_angles(const vector& angle); //установить углы (?) звука void set_sound(string caSoundToPlay); //установить звук void set_sound(const sound_object& sound); //установить звук void set_sound_type(enum ESoundTypes sound_type); //установить тип звука. Тип брать из перечисления snd_type. }; class sound_object { //параметры отыгрывания звуков const looped = 1; const s2d = 2; const s3d = 0; property frequency; property max_distance; property min_distance; property volume; sound_object (string); sound_object (string, enum ESoundTypes); function set_position(const vector&); function stop_deffered(); function get_position() const; function play_no_feedback(game_object*, number, number, vector, number); function play_at_pos(game_object*, const vector&); function play_at_pos(game_object*, const vector&, number); function play_at_pos(game_object*, const vector&, number, number); function stop(); function length(); function play(game_object*); function play(game_object*, number); function play(game_object*, number, number); function playing() const; }; Возможно можно добавить в шапку ссылку на данный пост. Изменено 14 Мая 2020 пользователем Graff46 2 Ссылка на комментарий
mdm64 579 Опубликовано 28 Августа 2020 Поделиться Опубликовано 28 Августа 2020 Доброго времени! Вопрос - как реализовать в ЗП, чтобы группировка относилась к одному (!) из НПС из враждебной группировки как к своему, независимо ни от чего, этакий "свой среди чужих"? Если это возможно, конечно, в ЗП. В ТЧ я когда-то такое видел, но вроде как отличия между платформами существенные. Ссылка на комментарий
h0N0r 341 Опубликовано 26 Октября 2021 Поделиться Опубликовано 26 Октября 2021 Найдено в ориг. исходниках ЗП 1.6.02: Скрытый текст *************************************** В секции bloodsucker: if(pSettings->line_exist(section,"collision_hit_off")){ collision_hit_off = true; bloodsucker / boar: if(!pSettings->line_exist(section,"is_friendly")) com_man().add_ability(ControlCom::eControlRunAttack); // атака на бегу Проверка на наличие строки в секции, но она должна быть с параметром (1 или on), наподобие af_actor_properties = on в ТЧ, включает показ параметров арта в описании, а удаление это строки - отключает: ui_af_params.cpp, bool CUIArtefactParams::Check(const shared_str& af_section) { return !!pSettings->line_exist(af_section, "af_actor_properties"); } *************************************** В m_stalker.ltx, секция [fire_queue_params]: (эти параметры есть в движке, но не добавлены в конфиг) pstl_queue_fire_dist_med = 15.0 pstl_queue_fire_dist_far = 30.0 shtg_queue_fire_dist_med = 15.0 shtg_queue_fire_dist_far = 30.0 snp_queue_fire_dist_med = 15.0 snp_queue_fire_dist_far = 30.0 mchg_queue_fire_dist_med = 15.0 mchg_queue_fire_dist_far = 30.0 auto_queue_fire_dist_med = 15.0 auto_queue_fire_dist_far = 30.0 *************************************** В секции уровня (game_maps_single.ltx): minimap_zoom = 1 ; -< 1=normal >+ (масштаб миникарты) *************************************** В секции device_pda, или унаследованной от неё: play_function = file.function (типа xr_effects.pda_play_function) *************************************** В кастомдате мутанта можно переопределять параметры базовой секции (base_monster_startup.cpp): [settings_overrides] SoundThreshold RunAttack_PathDistance RunAttack_StartDistance DayTime_Begin DayTime_End distance_to_corpse satiety_threshold DamagedThreshold idle_sound_delay eat_sound_delay attack_sound_delay distant_idle_sound_delay distant_idle_sound_range eat_freq eat_slice eat_slice_weight LegsCount max_hear_dist attack_effector Это не подходит для ЗП, т.к. вся живность спавнится другими методами, не используя all.spawn, но можно в ТЧ. *************************************** Хак от GSC В базовой секции [stalker], или унаследованной от неё (CharacterPhysicsSupport.cpp): hack_terrible_donot_collide_on_spawn = true ; отключает коллизию 4 https://sites.google.com/view/xray-sdk-0-4-smg Ссылка на комментарий
aromatizer 4 460 Опубликовано 26 Октября 2021 Поделиться Опубликовано 26 Октября 2021 25 минут назад, h0N0r сказал: pstl_queue_fire_dist_med = 15.0 pstl_queue_fire_dist_far = 30.0 shtg_queue_fire_dist_med = 15.0 shtg_queue_fire_dist_far = 30.0 snp_queue_fire_dist_med = 15.0 snp_queue_fire_dist_far = 30.0 mchg_queue_fire_dist_med = 15.0 mchg_queue_fire_dist_far = 30.0 auto_queue_fire_dist_med = 15.0 auto_queue_fire_dist_far = 30.0 Странно, что для пистолетов, дробовиков, снайперок и автоматического оружия заданы одинаковые дистанции... Отношения между людьми- главная ценность в человеческом обществе.Любая полученная информация- это только повод для размышлений, а не побуждение к действию.Это должен знать каждый: уроки боевой подготовки Дяди Саши https://yadi.sk/d/60Ec2B06goLAEНакопано и накнопано:https://yadi.sk/d/mzVY5jQEspwpt Ссылка на комментарий
Tiran_ua 0 Опубликовано 15 Февраля 2023 Поделиться Опубликовано 15 Февраля 2023 (изменено) Всем добра! Перейду сразу к сути вопроса. Есть некая функция (скажем klonilka.save_itm()), которая читает название предмета, передаваемого NPC, и сохраняет его в виде переменной sis в pstor. Внимание вопрос: как запросить (sis, inv_name) в xml формате для вставки в диалог? Изменено 15 Февраля 2023 пользователем Tiran_ua Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти