Перейти к контенту
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

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