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

Справочник по функциям и классам

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

@AndreySol Ну, не курение конечно... Но без пузыря там точно не разобраться.

Информация из исходников.

S.T.A.L.K.E.R. CoP Objects (upd 10.04.24)


Подарки

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

    Наверное, сюда:

     

    function my_func()

    ...

    level.set_weather_fx( ... ) -- висим, и через некоторое время вылет без лога либо CCustomMotion::Length()

    ...

    end

     

    level.add_call( my_func, another_func )

     

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

    Однократного вызова достаточно.

    Зачем он в апдейте - например, проверять, выполнено ли некое условие, и именно тогда - вызвать, в остальное время - делать что-то еще.

    Ссылка на комментарий
    В 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.

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

    вот полный код:

    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( ... ).

     

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

    Хотелось бы узнать о таком применении функции:

    function add_call(object, const function<boolean>&, const function<void>&);
    function add_call(object, string, string);

     

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

    @Graff46 тоже самое, только вызываются методы объекта. В первом случае они передаются ссылкой, во втором - названием. Насколько я помню, там, где это не исправлялись, они не рабочие, как и соотв. им remove_call. remove_call сам по себе не очень рабочий. Например, если его вызвать из функции, которая выполняется из add_call.

     

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

    Здравствуйте, может здесь кто подскажет.

    Есть ли у оружия wpn_rg-6 (который гранатомёт Бульдог-6) свойство отвечающее за готовность к стрельбе? Или функция инициализации/ресета для приведения в нулёвое состояние?

    Кстати, заклинившие стволы тоже должны иметь похожее свойство.

    Проблемка - когда отключаю в конфиг-файле tri_state_reload = off и добавляю анимку anm_reload (без неё вылет), после выстреливания количества гранат указанного в ammo_mag_size, сколько ни перезаряжай, стрелять не хочет. Думаю, может скриптами это пофиксить можно? Пока, кроме как тупо забрать РГ-6 у актора и тут-же выдать новый ничего в голову не приходит.

    Кстати, заодно не подскажете как из скрипта запустить анимацию (например перезарядки) в ЗП, для рук и оружия?

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

    @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.

    Изменено пользователем НаноБот
    • Полезно 1

    ...в конце концов, важен лишь, машинный код.

    СТАЛКЕР только для ПК!

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

    Различия 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);

     

    Изменено пользователем Graff46
    • Полезно 2
    Ссылка на комментарий

    Хотелось бы иметь описания методов и свойств классов:

    Скрытый текст
    
    
    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*);
    
    };

     

     

    Изменено пользователем Graff46
    • Согласен 2
    Ссылка на комментарий

    Описания классов действий

    Отсюда 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;
    };

     

    Возможно можно добавить в шапку ссылку на данный пост.

    Изменено пользователем Graff46
    • Полезно 2
    Ссылка на комментарий

    Доброго времени!

    Вопрос - как реализовать в ЗП, чтобы группировка относилась к одному (!) из НПС из враждебной группировки как к своему, независимо ни от чего, этакий "свой среди чужих"? Если это возможно, конечно, в ЗП. В ТЧ я когда-то такое видел, но вроде как отличия между платформами существенные.

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

    Найдено в ориг. исходниках ЗП 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 ; отключает коллизию

     

    • Полезно 3
    Ссылка на комментарий
    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

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

    Отношения между людьми- главная ценность в человеческом обществе.
    Любая полученная информация- это только повод для размышлений, а не побуждение к действию.
    Это должен знать каждый: уроки боевой подготовки Дяди Саши https://yadi.sk/d/60Ec2B06goLAE
    Накопано и накнопано:https://yadi.sk/d/mzVY5jQEspwpt

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

    Всем добра!

    Перейду сразу к сути вопроса. Есть некая функция (скажем klonilka.save_itm()), которая читает название предмета, передаваемого NPC, и сохраняет его в виде переменной sis в pstor. Внимание вопрос: как запросить (sis, inv_name) в xml формате для вставки в диалог?

     

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

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

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

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

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

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

    Войти

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

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

      Ни один зарегистрированный пользователь не просматривает эту страницу.

    AMK-Team.ru

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