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

Поиск в системе

Результаты поиска по тегам 'техника'.

  • Поиск по тегам

    Введите теги через запятую.
  • Поиск по автору

Тип контента


Категории

  • Правки для ОП-2.2
  • Вопросы по правкам / настройке ОП-2.1
  • ЧаВо по форуму
  • Шпаргалка AMK: Основы
  • Шпаргалка AMK: Ковыряние
  • Шпаргалка AMK: Оптимизация
  • Шпаргалка AMK: Работа с консолью
  • Справочник вылетов (Line 1 - Line 100)
  • Справочник вылетов (Line 101 - Line 200)
  • Справочник вылетов (Line 201 - Line 400)
  • Справочник вылетов (Line 401 -)
  • [CoP] Библиотека моделей оружия

Форумы

  • S.T.A.L.K.E.R.
    • AMK мод
    • Школа моддинга
    • Мастерская ТЧ
    • Мастерская ЧН
    • Мастерская ЗП
    • AMK English Version
  • S.T.A.L.K.E.R. 2
    • Предрелизный раздел S.T.A.L.K.E.R. 2
  • Общий форум
    • Флейм
    • AMK Склад
    • Административный раздел
  • Сетевые баталии
    • Сетевые баталии
  • Metro 2033 и Metro: Last Light
  • Другие игры
    • FPS / Action
    • RPG / RTS / TBS
    • Гонки / Симуляторы
    • Квесты/Аркады
    • Онлайн игры
    • Разное
    • Консоли
  • Форум клуба Клуб "Звуковиков"
  • Форум клуба Клуб Бункер Бобра
  • Общая тема Клуб разработчиков
  • Torque 3D Клуб разработчиков
  • NeoAxis 3D Клуб разработчиков
  • Unity Клуб разработчиков
  • Unreal Engine Клуб разработчиков
  • CryEngine Клуб разработчиков
  • OGRE 3D Клуб разработчиков
  • Свободная вкладка Клуб разработчиков
  • Blender Клуб разработчиков
  • Lumberyard Клуб разработчиков
  • Приемный покой Клуб "Безумный Психиатр"
  • Форум клуба Клуб "TEXCOORDN;"
  • Темы 'Фанат Отчуждения'

Искать результаты в...

Искать результаты, которые...


Дата создания

  • Начать

    Конец


Последнее обновление

  • Начать

    Конец


Фильтр по количеству...

Зарегистрирован

  • Начать

    Конец


Группа


Звание


Карта банка


BTC (Bitcoin)


ETH (Ethereum)


AIM


MSN


Сайт


ICQ


Yahoo


Jabber


Skype


Реальное имя


Город


Интересы

Найдено 4 результата

  1. Думаю тема будет востребована. В данной теме будут описываться аспекты работы с транспортом во всех аддонах "Сталкера". Возвращение боеспособности БТР. Автор - @lychagin0 Источник Логика транспорта автор - @lychagin0 Источник Не полное описание класса CCar из Lua_help ТЧ. Описание - @singapur22 Источник Исправление скрипта ph_car.script [ТЧ], что бы машины корректно ехали к 1-й точке пути и при запрокидывании на бок пытались восстановиться. Автор - @Graff46 Ссылка. Новая логика вертолётов в ТЧ от @Kirag: http://www.amk-team.ru/forum/topic/7977-ai-vertoletov/ Урок по созданию и настройке машин в "Сталкере" (Автор: @Saruman) Этот урок *.doc файлом. Ссылка. Усложнённый вариант создания моделей колёсной техники в 3DSMax. Для более "низкоуровнего" понимания управления техникой https://www.amk-team.ru/forum/topic/14212-upravlenie-obektami-igrovogo-mira/
  2. Информация взята отсюда: https://xray-engine.org/index.php?title=Управление_персонажем Автор К.Д. (написание ника в источнике указанно именно так). Скрытый текст Движок Сталкера реализует две концепции управления объектами: FSM (Finite State Machines) и GOAP (Goal-Oriented Action Planning). Начнем с FSM. О том, что такое FSM, читаем у Ясенева: Для реализации управления объектами с помощью концепции FSM в классе game_object есть ряд методов: function see(const game_object*); function command(const entity_action*, boolean); function action_by_index(number); function action_count() const; function action() const; function get_script() const; function get_script_name() const; function reset_action_queue(); function script(boolean, string); function can_script_capture() const; Они подробно будут разобраны далее. Методы эти можно вызывать для объектов, наследующих от класса CScriptEntity, или, проще говоря - для: торговцев, сталкеров, монстров, машин, прожекторов. Не всякий объект, даже из перечисленных групп, подходит для управления. Это вызвано тем, что неписями постоянно кто-то рулит - движок, смарт-террейны, игровая логика. Однако, выход есть. В классе game_object существует метод script(): void script(bool f, string g); Этот метод позволяет взять (или отпустить) объект под скриптовый контроль принудительно. Аргумента тут два: первый - булевое значение, определяющее, взять или отпустить объект из-под контроля. Второй - имя управляющего скрипта. Может быть абсолютно любым, это сделано, видимо, для отладки, чтобы можно было видеть, в каком состоянии находится непись. Также существуют вспомогательные методы для определения объекта под скриптом: bool get_script() const; //возвращает true, если объект контролируется скриптом. string get_script_name() const; //возвращает имя скрипта, контролирующего объект. Если нет - возвращает "". bool can_script_capture() const; //возвращает true, если объект можно взять под скриптовый контроль. Итак, объект взят под контроль. В таком состоянии объект становится слеп и глух ко всем раздражителям игрового мира (не реагирует даже на стрельбу). Чтобы прояснить, как им управлять, следует сказать пару слов о специфике скриптового управления. У каждого объекта, который можно взять под скрипт, существует очередь СОСТОЯНИЙ, через которые он проходит. У объектов не под скриптом очередь пуста. Для управления очередью доступны следующие методы: int action_count() const; //возвращает размер очереди состояний объекта. Для объектов без очереди возвращает 0. void reset_action_queue(); //завершает текущее состояние и очищает очередь entity_action* action_by_index(int action_index); //возвращает объект состояния по индексу, передаваемому аргументом action_index. Если не найден - вернет nil entity_action* action() const; //возвращает объект текущего состояния void command(const entity_action* tpEntityAction, bool bHighPriority); //добавляет в очередь состояний объект состояния tpEntityAction. Аргумент bHighPriority определяет приоритет добавляемого состояния. Если true, текущее принудительно завершается. В целом, можно свободно управлять очередью состояний. Дело за малым - разобраться, как эти состояния делать. Каждое состояние - объект класса entity_action (CScriptEntityAction в движке). Вот его псевдоописание: class entity_action { //конструкторы entity_action* entity_action(); entity_action* entity_action(const entity_action*); //функции установки конкретного действия. void set_action(act&); void set_action(anim&); void set_action(cond&); void set_action(look&); void set_action(move&); void set_action(object&); void set_action(particle&); void set_action(sound&); //общие функции bool completed(); bool all(); //проверяет, есть ли хоть одно незавершенное действие и выдает false, если есть. Зачем две одинаковых функции - неясно. bool time(); //проверяет, закончилось ли время жизни действия //функции проверки окончания экшена (флаг m_bCompleted) bool anim() const; bool look() const; bool move() const; bool object() const; bool particle() const; bool sound() const; }; Создание состояния можно описать так: 1. Создание объекта состояния методом entity_action() 2. Заполнение состояния действиями с помощью методов set_action(). Вот список доступных действий: -act //глобальное поведение монстров -anim //проигрывание анимации монстрами/сталкерами -look //задание направления взгляда монстра/сталкера -move //движение объекта -object //взятие в руки предмета -particle //проигрывание партикла на монстре/сталкере -sound //проигрывание звука от монстра/сталкера -cond //не действие, по сути, а объект, управляющий переходом в следующее состояние. С помощью задания cond можно управлять длительностью состояний. Перед этим надо создать объект соответствующего ДЕЙСТВИЯ (как - смотрите ниже). В одном состоянии может быть несколько РАЗНЫХ действий. Далее состояние можно помещать в очередь состояний объекта. Следует заметить, что удалить действие из состояния нельзя, так что создавайте состояния с умом. Впрочем, всегда можно создать очередь из пустых состояний, а потом заполнять их как угодно. Описания классов действий: 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; }; В целом - все понятно. Создаем объект действия одним из конструкторов, недостающие данные заполняем методами класса. После добавления действия в состояние его нельзя ни удалить, ни изменить. Рабочий пример: function execute_act(cObj) cObj:script(true, "my") --cObj - клиентский объект какого-нибудь монстра add_action(cObj, act(act.rest), cond(cond.time_end, 20000)) add_action(cObj, act(act.attack, db.actor), cond(cond.time_end, 20000)) add_action(cObj, act(act.panic, db.actor), cond(cond.time_end, 20000)) end function add_action(cObj, ...) local arg = {...} local act = entity_action() local i = 1 while true do if (arg[i] ~= nil) then act:set_action(arg[i]) else break end i = i + 1 end if (cObj ~= nil) then cObj:command(act,false) end return entity_action(act) end После запуска этого скрипта свинка пойдет под ближайшее дерево отдыхать, через 200 секунд встанет и нападет на актора, еще через 200 секунд будет от актора убегать в панике. Теперь об ограничениях. В движке управление монстрами и сталкерами реализовано так: планировщик поведения монстров построен на концепции FSM (Finite State Machine), сталкерский планировщик - на концепции GOAP (Goal-Oriented Action Planning). Хотя в билдах сталкерами тоже можно было полностью рулить на FSM, к финалке это было урезано, так что для сталкеров некоторые действия не работают - это move и look. Возможно, я ошибаюсь, если у кого-нибудь получится заставить ходить сталкера под FSM, дайте знать. Теперь, стало быть, разберем, как рулить сталкерами с помощью GOAP. Начальное слово, опять же, предоставлю Ясеневу :) То есть суть такова: имеем планировщик, привязанный к объекту. Планировщик постоянно вызывает эвалуаторы (спецфункции, проверяющие, выполнены ли предусловия для действия). Если эвалуатор возвращает true, планировщик запускает действие. Пост @Полтергейст о управлении НПС в оффлайне: https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkciyam-i-klassam/?do=findComment&comment=738560 Возможно кто-то дополнит/исправит. * Возможно хорошо было-бы спрятать большие участки кода во вложенные спойлеры?
  3. Базовая платформа для разработки модов ЗП Жизнь не вечна... Пример тому, Korpus. 4 мая, сего года, он покинул нас навсегда, не успев доделать свой мод, и оставив разработки где-то в своём компьютере. Памяти Korpus эта тема посвящается. Здесь будет опубликован проект для Сталкер ЗП (гибридная версия 1600-03) и исходники, а так же наработки моделей и прочего. Ничего подобного ранее, за исключением некоторых файлов, не было в открытом доступе. Я прям так пафосно пишу, что мне самому верится, что это кому то пригодится. Теперь о движке: движок выше версии 1.6.02 с поддержкой шейдеров 1.6.03. Правки под автотранспорт. Кого заинтересует проект, окажу техническую помощь. Правки будут постоянными. --------------------------------------------------------------------------------------------------------------------------------- Добавлен движок из исходников 1.6.02 MANOWAR.Serguei I. Ivantsov + доработки под авто, Дизель. Общее: Скрытый текст Добавлены в gamedata, как патчи в распакованном виде: содержит папку с шейдерами 1.6.03 патч 1.6.02 xrRender: правка травы. xrGame: правка авто, фикс бага смерти, новые камеры, туториалы, анимация, запрещены все слоты в авто. gamedata: 1. Локация "Припять объединённая" (правка Скатом) интегрированная в оригинал игры с заменой старой Припяти (автор локации Lagos). All.spawn пересобран (Автор Дизель). 2. Правка моделей актёра сингла (под авто, смещены шейпы головы) и сетевой(полный пакет анимаций сталкера) (Автор Дизель). 3. Модели различные (авто, животные и т.д). (Автор Дизель). 4. Звуки разлиные (авто, туториал и т.д). (Автор Дизель). 5. Текстуры разлиные (авто, животные, ui, вода, песок и т.д). (Автор Дизель). 6. Правка и добавление материалов (под авто, для погружения) и партиклов (все xr). (Автор Дизель). 7. Правка ттх оружия (частично) + новый вид ПКМ (универсальный класс, для БТР он же). (Автор Дизель). 8. Правка погоды. 9. Тестовые локации для грунтов драфт качества, песок (dakar), земля (prohorovka). (автор Дизель) 10. Добавлены тестовые фичи: сон, координаты, спавн, телепорт. (Авторы SGM, Дизель). 11. Замена собаки Ноя, на другие класс обычной собаки и модель овчарки. Правка логики (автор Дизель). 12. В Припяти, во избежание смещения с аи сетки, передвинуты нпс + новый спавн. 13. Добавлена возможность прослушивания музыки в авто. Кнопкой X (та что включает ускоренный бег). 14. Несколько стартов ( в Припяти и на Затоне). 15. Техника: Урал кузов, Урал кунг, Маз, Cougar, Страйкер, БТР (только для теста пулемёта). (автор рипа моделей Дизель). 16. Новая модель Дегтярёва в куртке лесника, с худом, броником (всё как надо) (автор Дизель). 17. Правка катсцен у вертолётов на Затоне и при десантировании Ноя в телепорт. Теперь не надо смотреть на то как вас кушают мутанты во время сцены. 18. Добавлены к контролёру на Затоне псевдособаки. 19. Вырезан pri_actor в Припяти, для снятия бага с двумя ГГ. Теперь надо подумать как с Затона пройти в Припять? (Будет найдено решение позднее) 20.Новые камеры в авто - 3 шт. 21.Подключение стрельбы БТР к мыши. 22.Водный транспорт. В авто: Tab - стрелять в БТР (также стрельба ПКМ (правая кнопка мыши)). X - музыка через меню: K - координаты в отдельный файл S - сон T - телепорт (Затон) R - доска сцен ( Затон, Юпитер, Припять) O - тестовый спавн. ALL_0011: Скрытый текст Скачать архив (игровой, gamedata + bin): https://yadi.sk/d/EkOcZnRluB8nd581 Мб. Перезалито 13.08.2016. Версия ALL_0011 После выхода версии 0012, ссылка на старую версию будет удалена, из-за бага с выходом из игры в Виндовс. Причина баг логики на Скадовске. Устанавливается в любую версию ЗП. Структура папок смещена на один уровень, потому устанавливать новый bin и gamedata в папку ALL (которая, в свою очередь, устанавливается в корень игры). Скачать исходники: https://yadi.sk/d/EVfwL2jNuTp8g113.3 Мб. Правки: август 2016г. AtmosFear_3_CoP, Absolute_Nature_4.01_CoP на базе движка ALL 0012 Скрытый текст Для Зов Припяти: AtmosFear_3_CoP, Absolute_Nature_4.01_CoP на базе движка ALL 0012 (чищенная от багов). Авторов указывать при реализации проекта: GSC, Cromm Cruac, KamikaZze, Makdm, Дизель. Разрешается только бесплатное распространение. Есть на облаке: https://mega.nz/#F!bGhxQbIR!yKENf2PB-NCl66izh44mhQ ALL_0015: Скрытый текст Новый класс: HELCAR основной, движковый HEL_CAR. Данный класс является универсальным - типа амфибия. Новые возможности вращения костей ведущих рулевых осей, есть реверсы. (смотреть конфиг boat_car) Новый дополнительный движок для вращения костей ведущих осей. (смотреть конфиг boat_car) Дополнительные псевдоанимированные кости рулей - есть реверс. (смотреть конфиг boat_car) Новый transmission_gear_ratio, келбек для снятия бага, после загрузки сохранения техники - реверс вектора. (смотреть конфиг boat_car) Новый driver_animation_type = 2 - смена анимации ГГ за рулём лодки. Свой вызов. (смотреть конфиг boat_car) Класс лодки был основан на классе авто, но не является зависимым. Если надумаете подключать логику, то там свои скриптовые функции - подобные авто, но под другим именем. (смотри исходники) Исходники (Без SDK). ALL_0015b Тестовая gamedata (ALL_0015b_gamedata). 500Мб. Спавн нового класса через алспавн ACDC (настроеный): Скачать. Пояснения по вызову-спавну, через меню игры - кнопки: B - boat_car, класс HELCAR, имя zat_boat_car_3. N - boat_car, класс HEL_CAR, имя zat_boat_car_2. O - helcar_btr_diesel, класс HEL_CAR, имя zat_use_her_2. F1,F2,F3 - виды камер. R,T,S,K - кнопки для тестов геймплея. Кнопки активные в игре: 1-2 цифры для автоприцела, пока не полностью активны, только в обычном классе авто работают. 3-6 цифры для тестов физики и ремонта. X - динамическая музыка. Мышь ЛКМ - стрельба (аналог Tab). Присутствуют наработки скриптов kamikazze и makdm. Пока не всё гладко отточено. Для этого и создается данная тема. История правок и патчей: Скрытый текст 16.05.2016 (для версии ALL_0009) Патч движка (папка bin): Новая версия движка, перекомпилировал на WIN 10, работает уверенно, нет вылета по рестрибутивам визуалки. https://yadi.sk/d/c-NROX5urj9mQ Копировать с заменой. Или использовать как новую (всё есть). Худ рук бушлата Лесника https://yadi.sk/d/w12acrNjriKWw (добавлена анимация). Патч новых материалов https://yadi.sk/d/fAXOu-xSrm8mR (убраны фризы на песке от следов авто). Патч бага с координатами https://yadi.sk/d/_KP7MbAlrm8mH 17.05.2016 Вышла версия ALL_0010 20.06.2016 Вышел патч ALL 0011 для версии ALL_0010. 2.5 Мб. (добавлена стрельба в БТР с помощью ЛКМ, плюс камеры авто) Исходники xrGame под версию ALL 0011 1.6Мб 13.08.2016 Добавлен полный архив gamedata АLL_0011 25.08.2016 Добавлен полный ресурс исходников STALKER_COP_all_0011 https://youtu.be/osyTSDq-F1g https://youtu.be/u9yNk-eU40k

AMK-Team.ru

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