Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
  • 0
kommymist173

Помогите установить статичную миссию.

Хочу поставить Стационарную миссию с ботами WAI на Napf.

Но даже не знаю с чего начать...

Тему искал , но обыскав весь форум , понял что ее нету(

Или если у кого - то завалялась скиньте пожалуйста)

 

Share this post


Link to post
Share on other sites

9 answers to this question

Recommended Posts

  • 0

И как им пользоваться?

 

В директории \WAI\missions\ есть файл MISSION_EXAMPLE.sqf:

if(isServer) then {
    
    private         ["_baserunover","_mission","_directions","_position","_crate","_crate_type","_num"];

    // Get a safe position 80 meters from the nearest object
    _position        = [80] call find_position;
    
    // Initialise the mission variable with the following options, [position, difficulty, mission name, mission type (MainHero/Mainbandit), minefield (true or false)] call mission_init;
    _mission         = [_position,"hard","Test Mission","MainHero",true] call mission_init;

    diag_log         format["WAI: Mission Test Mission started at %1",_position];

    //Setup the crate
    _crate_type     = crates_large call BIS_fnc_selectrandom; // Choose between crates_large, crates_medium and crates_small
    _crate             = createVehicle [_crate_type,[(_position select 0),(_position select 1),0],[],0,"CAN_COLLIDE"];

    // Crate Spawn Example
    // Parameters:    0: _crate
    //                1: Max number of guns OR [MAX number of guns,gun_array]
    //                2: Max number of tools OR [MAX number of tools,tool_array]
    //                3: Max number of items OR [MAX number of items,item_array]
    //                4: Max number of backpacks OR [MAX number of backpacks,backpack_array]
    [_crate,16,[8,crate_tools_sniper],[3,crate_items_high_value],[4,crate_backpacks_large]] call dynamic_crate;
    
    // Create some Buildings
    _baserunover0     = createVehicle ["land_fortified_nest_big",[(_position select 0) - 40, (_position select 1),-0.2],[], 0, "CAN_COLLIDE"];
    _baserunover1     = createVehicle ["land_fortified_nest_big",[(_position select 0) + 40, (_position select 1),-0.2],[], 0, "CAN_COLLIDE"];
    _baserunover2     = createVehicle ["land_fortified_nest_big",[(_position select 0), (_position select 1) - 40,-0.2],[], 0, "CAN_COLLIDE"];
    _baserunover3     = createVehicle ["land_fortified_nest_big",[(_position select 0), (_position select 1) + 40,-0.2],[], 0, "CAN_COLLIDE"];
    _baserunover4     = createVehicle ["Land_Fort_Watchtower",[(_position select 0) - 10, (_position select 1),-0.2],[], 0, "CAN_COLLIDE"];
    _baserunover5     = createVehicle ["Land_Fort_Watchtower",[(_position select 0) + 10, (_position select 1),-0.2],[], 0, "CAN_COLLIDE"];
    _baserunover6     = createVehicle ["Land_Fort_Watchtower",[(_position select 0), (_position select 1) - 10,-0.2],[], 0, "CAN_COLLIDE"];
    _baserunover7     = createVehicle ["Land_Fort_Watchtower",[(_position select 0), (_position select 1) + 10,-0.2],[], 0, "CAN_COLLIDE"];
    
    // Adding buildings to one variable just for tidiness
    _baserunover = [_baserunover0,_baserunover1,_baserunover2,_baserunover3,_baserunover4,_baserunover5,_baserunover6,_baserunover7];
    
    // Set some directions for our buildings
    _directions = [90,270,0,180,0,180,270,90];
    { _x setDir (_directions select _forEachIndex) } forEach _baserunover;

    // Make buildings flat on terrain surface
    { _x setVectorUp surfaceNormal position _x; } count _baserunover;

    // Group Spawn Examples
    // Parameters:    0: Position
    //                1: Unit Count
    //                2: Unit Skill ("easy","medium","hard","extreme" or "random")
    //                3: Guns (gun or [gun,launcher])
    //                    Guns options    : (0 = ai_wep_assault, 1 = ai_wep_machine, 2 = ai_wep_sniper, "random" = random weapon, "Unarmed" = no weapon)
    //                    Launcher options: (at = ai_wep_launchers_AT, aa = ai_wep_launchers_AA or "classname")
    //                4: Magazine Count
    //                5: Backpack ("random" or "classname")
    //                6: Skin ("Hero","bandit","random","special" or "classname")
    //                7: Gear (0:ai_gear0, 1:ai_gear1, 2:ai_gear2, 3:ai_gear3, 4:ai_gear4 or "random")
    //                8: AI Type ("bandit","Hero","special" or ["type", #] format to overwrite default gain amount) ***Used to determine humanity gain or loss***
    //                9: Mission variable from line 9 (_mission)
    _num = round (random 3) + 4;
    [[_position select 0, _position select 1, 0],_num,"extreme",["random","at"],4,"random","bandit","random",["bandit",150],_mission] call spawn_group;
    [[_position select 0, _position select 1, 0],4,"hard","random",4,"random","bandit","random","bandit",_mission] call spawn_group;
    [[_position select 0, _position select 1, 0],4,"random","random",4,"random","bandit","random","bandit",_mission] call spawn_group;
    [[_position select 0, _position select 1, 0],4,"random","random",4,"random","bandit","random","bandit",_mission] call spawn_group;
    [[_position select 0, _position select 1, 0],4,"random","random",4,"random","bandit","random","bandit",_mission] call spawn_group;


    // Humvee Patrol Example
    // Parameters:    0: Patrol position
    //                1: Starting position
    //                2: Patrol radius
    //                3: Number of Waypoints
    //                4: Vehicle classname
    //                5: Unit Skill ("easy","medium","hard","extreme" or "random")
    //                6: Skin ("Hero","bandit","random","special" or "classname")
    //                7: AI Type ("bandit","Hero" or "special") ***Used to determine humanity gain or loss***
    //                8: Mission variable from line 9 (_mission)
    [[(_position select 0) + 100, _position select 1, 0],[(_position select 0) + 100, _position select 1, 0],50,2,"HMMWV_Armored","random","bandit","bandit",_mission] call vehicle_patrol;
    
    // Static Turret Examples
    // Parameters:    0: Spawn position
    //                1: Classname ("classname" or "random" to pick from ai_static_weapons)
    //                2: Unit Skill ("easy","medium","hard","extreme" or "random") ***NO effect if ai_static_skills = true;***
    //                3: Skin ("Hero","bandit","random","special" or "classname")
    //                4: AI Type ("bandit","Hero" or "special") ***Used to determine humanity gain or loss***
    //                5: Gun (0:ai_wep_assault 1:ai_wep_machine 2:ai_wep_sniper or "random") ***NO effect if ai_static_useweapon = false;***
    //                6: Magazine Count ***NO effect if ai_static_useweapon = false;***
    //                7: Backpack ("random" or "classname") ***NO effect if ai_static_useweapon = false;***
    //                8: Gear (0:ai_gear0, 1:ai_gear1, 2:ai_gear2, 3:ai_gear3, 4:ai_gear4 or "random") ***NO effect if ai_static_useweapon = false;***
    //                9: Mission variable from line 9 (_mission)
    };
    [[[(_position select 0) - 10, (_position select 1) + 10, 0]],"M2StaticMG","easy","bandit","bandit",0,2,"random","random",_mission] call spawn_static;
    [[[(_position select 0) + 10, (_position select 1) - 10, 0]],"M2StaticMG","easy","bandit","bandit",0,2,"random","random",_mission] call spawn_static;
    [[[(_position select 0) + 10, (_position select 1) + 10, 0]],"M2StaticMG","easy","bandit","bandit",0,2,"random","random",_mission] call spawn_static;
    [[[(_position select 0) - 10, (_position select 1) - 10, 0]],"M2StaticMG","easy","bandit","bandit",0,2,"random","random",_mission] call spawn_static;


    // Heli Paradrop Example
    // Parameters:    0: Paradrop position
    //                1: Spawn position
    //                2: Trigger radius
    //                3: Vehicle classname
    //                4: Amount of paratroopers
    //                5: Unit Skill ("easy","medium","hard","extreme" or "random") ***NO effect if ai_static_skills = true;***
    //                6: Gun (0:ai_wep_assault 1:ai_wep_machine 2:ai_wep_sniper or "random")
    //                7: Magazine Count
    //                8: Backpack ("random" or "classname")
    //                9: Skin ("Hero","bandit","random","special" or "classname")
    //                10: Gear (0:ai_gear0, 1:ai_gear1, 2:ai_gear2, 3:ai_gear3, 4:ai_gear4 or "random")
    //                11: AI Type ("bandit","Hero" or "special") ***Used to determine humanity gain or loss***
    //                12: Heli stay and fight after troop deployment? (true or false)
    //                13: Mission variable from line 9 (_mission)
    [[(_position select 0), (_position select 1), 0],[0,0,0],400,"UH1H_DZ",10,"random","random",4,"random","bandit","random","bandit",true,_mission] spawn heli_para;


    // Assassination target example
    // This is the same as normal group spawns but we assign it to a variable instead for use in the trigger below (if there are multiple units in this group you'll need to kill them all)
    _assassinate = [[_position select 0, _position select 1, 0],1,"hard","random",4,"random","special","random","bandit",_mission] call spawn_group;


    // Mission objective options and messages
    [
        [_mission,_crate],    // mission variable (from line 9) and crate
        ["crate"],             // Mission objective type (["crate"], or ["kill",wai_kill_percent], or ["assassinate", _assassinate])
        [_baserunover],     // buildings to cleanup after mission is complete, does not include the crate
        "A Mission has spawned, hurry up to claim the loot!",    // mission announcement
        "The mission was complete/objective reached",            // mission success
        "The mission timed out and nobody was in the vicinity"    // mission fail
    ] call mission_winorfail;


    // End of mission
    diag_log format["WAI: Mission bandit base ended at %1 ended",_position];


    h_missionrunning = false;
};

В нем расписаны примеры миссии с комментариями, как и что добавлять. 

 

Также в в директории \WAI\static\ имеется файл default.sqf:

if(isServer) then {

    //Custom Spawns file//
    /*
    Custom group spawns Eg.

    [
        [953.237,4486.48,0.001],            // Position
        4,                                    // Number Of units
        "Random",                            // Skill level of unit (easy, medium, hard, extreme, Random)
        "Random",    or ["Random","at"],        // Primary gun set number and rocket launcher. "Random" for random weapon set, "at" for anti-tank, "aa" for anti-air launcher
        4,                                    // Number of magazines
        "Random",                            // Backpack classname, use "Random" or classname here
        "Random",                            // Skin classname, use "Random" or classname here
        "Random",                            // Gearset number. "Random" for random gear set
        "Bandit"                            // AI Type, "Hero" or "Bandit".
    ] call spawn_group;

    Place your custom group spawns below
    */


    /*
    Custom static weapon spawns Eg. (with mutiple positions)

    [
        [                                    // Position(s) (can be multiple)
            [911.21,4532.76,2.62],
            [921.21,4542.76,2.62]
        ],
        "M2StaticMG",                        // Classname of turret
        "easy",                                // Skill level of unit (easy, medium, hard, extreme, Random)
        "Bandit2_DZ",                        // Skin classname, use "Random" or classname here
        "Bandit",                            // AI Type, "Hero" or "Bandit".
        "Random",                            // Primary gun set number. "Random" for random weapon set
        2,                                    // Number of magazines
        "Random",                            // Backpack classname, use "Random" or classname here
        "Random"                            // Gearset classname, use "Random" or classname here
    ] call spawn_static;

    Place your custom static weapon spawns below
    */


    /*
    Custom Chopper Patrol spawn Eg.

    [
        [725.391,4526.06,0],                // Position to patrol
        [0,0,0],                            // Position to spawn chopper at
        2000,                                // Radius of patrol
        10,                                    // Number of waypoints to give
        "UH1H_DZ",                            // Classname of vehicle (make sure it has driver and two gunners)
        "Random",                            // Skill level of units (easy, medium, hard, extreme, Random)
        "Random",                            // Skin classname, use "Random" or classname here
        "Bandit"                            // AI Type, "Hero" or "Bandit".
    ] spawn heli_patrol;

    Place your heli patrols below
    */


    /* 
    Custom Vehicle patrol spawns Eg. (Watch out they are stupid)

    [
        [725.391,4526.06,0],                // Position to patrol
        [725.391,4526.06,0],                // Position to spawn at
        200,                                // Radius of patrol
        10,                                    // Number of waypoints to give
        "HMMWV_Armored",                    // Classname of vehicle (make sure it has driver and gunner)
        "Random",                            // Skill level of units (easy, medium, hard, extreme, Random)
        "Random",                            // Skin classname, use "Random" or classname here
        "Bandit"                            // AI Type, "Hero" or "Bandit".
    ] spawn vehicle_patrol;

    Place your vehicle patrols below this line
    */


    /*
    Paradropped unit custom spawn Eg.

    [
        [911.21545,4532.7612,2.6292224],    // Position that units will be dropped by
        [0,0,0],                            // Starting position of the heli
        400,                                // Radius from drop position a player has to be to spawn chopper
        "UH1H_DZ",                            // Classname of chopper (Make sure it has 2 gunner seats!)
        5,                                    // Number of units to be para dropped
        "Random",                            // Skill level of units (easy, medium, hard, extreme, Random)
        "Random",    or ["Random","at"],        // Primary gun set number and rocket launcher. "Random" for random weapon set, "at" for anti-tank, "aa" for anti-air launcher
        4,                                    // Number of magazines
        "Random",                            // Backpack classname, use "Random" or classname here
        "Bandit2_DZ",                        // Skin classname, use "Random" or classname here
        "Random",                            // Gearset number. "Random" for random gear set.
        "Bandit",                            // AI Type, "Hero" or "Bandit".
        true                                // true: Aircraft will stay at position and fight. false: Heli will leave if not under fire. 
    ] spawn heli_para;


    Place your paradrop spawns under this line
    */

    diag_log "WAI: Static mission loaded";

};

Здесь приведены примеры для статической миссии.

 

В файле config.sqf есть строки отвечающие за подключение статической миссии:

        static_missions                = true;    // включить статическую миссию
        custom_per_world            = true;        // использовать кастомный файл для миссии, если false - будет использован файл default.sqf

Если custom_per_world = true; - необходимо создать файл имя_карты.sqf и добавлять юнитов и объекты в него. В противном случае необходимо добавлять в default.sqf.

 

Используя эти примеры можно создать статическую миссию любой сложности.

Share this post


Link to post
Share on other sites



  • 0

Берешь обычную миссию WAI, копируешь, переименовываешь - вот тебе новая миссия. Добавляешь ее в missionCfg.sqf и затем открываешь саму миссию и видишь там примерно такую строку:

_position = [getMarkerPos "center",0,5500,10,0,2000,0] call BIS_fnc_findSafePos;

И меняешь ее на эту, не забыв прописать свои координаты:

_position = [0,0,0];

Share this post


Link to post
Share on other sites
  • 0

 

Берешь обычную миссию WAI, копируешь, переименовываешь - вот тебе новая миссия. Добавляешь ее в missionCfg.sqf и затем открываешь саму миссию и видишь там примерно такую строку:

_position = [getMarkerPos "center",0,5500,10,0,2000,0] call BIS_fnc_findSafePos;

И меняешь ее на эту, не забыв прописать свои координаты:

_position = [0,0,0];

спасибо) держи +

Share this post


Link to post
Share on other sites
  • 0

 

Берешь обычную миссию WAI, копируешь, переименовываешь - вот тебе новая миссия. Добавляешь ее в missionCfg.sqf и затем открываешь саму миссию и видишь там примерно такую строку:

_position = [getMarkerPos "center",0,5500,10,0,2000,0] call BIS_fnc_findSafePos;

И меняешь ее на эту, не забыв прописать свои координаты:

_position = [0,0,0];

А как сделать так чтобы на миссии спавнился бтр?

Share this post


Link to post
Share on other sites
  • 0

А как сделать так чтобы на миссии спавнился бтр?

 

Тут желательно за основу взять миссию WAI armed_vehicle.sqf и переделать следующим образом:

 

Заменить эту строку:

_vehclass = armed_vehicle call BIS_fnc_selectRandom;

На это:

 

_vehclass = "BTR90_DZ";

Вместо БТР 90 как понимаешь, можно что угодно вписать, главное не ошибиться.

 

Потом после этой строки, возможно чуть ниже, просто надо найти место чтобы вставить довольно большой блок:

PVDZE_serverObjectMonitor set [count PVDZE_serverObjectMonitor,_veh]; 

 

Вставляешь вот это:

 

// Сажаем ботов в технику

_driver = objNull;
_aiGroup = createGroup EAST;
//_driver = "GUE_Soldier_MG_DZ" createUnit [_coords, _aiGroup, "_aiunit=this;",1,"CORPORAL"];
_driver = _aiGroup createUnit ["GUE_Soldier_MG_DZ", [0,0,0], [], 1, "NONE"];
[_driver] joinSilent _aiGroup;
_driver setVariable ["unconscious",false];

0 = [_driver] call EMS_unit_setSkills;

_driver assignAsDriver _veh;
_driver moveInDriver _veh;
_driver setVariable ["isDriver",true];
_aiGroup selectLeader _driver;

//_driver addweapon _keySelected;

//_veh addWeaponCargoGlobal [_keySelected, 1];

_cargoSpots = _veh emptyPositions "cargo";
for "_i" from 0 to (_cargoSpots - 1) do {
	_cargo = _aiGroup createUnit ["GUE_Soldier_MG_DZ", [0,0,0], [], 1, "NONE"];
	[_cargo] joinSilent _aiGroup;
	0 = [_cargo] call EMS_unit_setSkills;
	_cargo setVariable ["unconscious",false];
	//_cargo setVariable ["bodyName",(name _cargo)];
	_cargo assignAsCargo _veh;
	_cargo moveInCargo [_veh,_i];
};

_turretCount = 1;
for "_i" from 0 to (_turretCount - 1) do {
	_gunner = _aiGroup createUnit ["GUE_Soldier_MG_DZ", [0,0,0], [], 1, "NONE"];
	[_gunner] joinSilent _aiGroup;
	0 = [_gunner] call EMS_unit_setSkills;
	_gunner setVariable ["unconscious",false];
	//_gunner setVariable ["bodyName",(name _gunner)];
	_gunner assignAsGunner _veh;
	_gunner moveInTurret [_veh,[_i]];
};

_aiGroup allowFleeing 0;
_aiGroup setBehaviour "AWARE";
_aiGroup setSpeedMode "NORMAL";
_aiGroup setCombatMode "YELLOW";

_aiGroup setVariable ["assignedVehicle",_veh];
_aiGroup setVariable ["isArmed",1];
_aiGroup setVariable ["spawnParams",_this];

(units _aiGroup) allowGetIn true;

// Закончили сажать ботов в технику

Этот код посадит в технику максимальное возможное число ботов для этой техники, так же должно посадить их на все турели (стрелки).

Это чисто из готового, как заставить эту технику патрулировать уже писать не буду, это новый код писать надо, я чисто скопировал уже готовый из своих архивов.

Edited by jok4r (see edit history)

Share this post


Link to post
Share on other sites
  • 0

Тут желательно за основу взять миссию WAI armed_vehicle.sqf и переделать следующим образом:

 

Заменить эту строку:

_vehclass = armed_vehicle call BIS_fnc_selectRandom;

На это:

 

_vehclass = "BTR90_DZ";

Вместо БТР 90 как понимаешь, можно что угодно вписать, главное не ошибиться.

 

Потом после этой строки, возможно чуть ниже, просто надо найти место чтобы вставить довольно большой блок:

PVDZE_serverObjectMonitor set [count PVDZE_serverObjectMonitor,_veh]; 

 

Вставляешь вот это:

 

// Сажаем ботов в технику

_driver = objNull;
_aiGroup = createGroup EAST;
//_driver = "GUE_Soldier_MG_DZ" createUnit [_coords, _aiGroup, "_aiunit=this;",1,"CORPORAL"];
_driver = _aiGroup createUnit ["GUE_Soldier_MG_DZ", [0,0,0], [], 1, "NONE"];
[_driver] joinSilent _aiGroup;
_driver setVariable ["unconscious",false];

0 = [_driver] call EMS_unit_setSkills;

_driver assignAsDriver _veh;
_driver moveInDriver _veh;
_driver setVariable ["isDriver",true];
_aiGroup selectLeader _driver;

//_driver addweapon _keySelected;

//_veh addWeaponCargoGlobal [_keySelected, 1];

_cargoSpots = _veh emptyPositions "cargo";
for "_i" from 0 to (_cargoSpots - 1) do {
	_cargo = _aiGroup createUnit ["GUE_Soldier_MG_DZ", [0,0,0], [], 1, "NONE"];
	[_cargo] joinSilent _aiGroup;
	0 = [_cargo] call EMS_unit_setSkills;
	_cargo setVariable ["unconscious",false];
	//_cargo setVariable ["bodyName",(name _cargo)];
	_cargo assignAsCargo _veh;
	_cargo moveInCargo [_veh,_i];
};

_turretCount = 1;
for "_i" from 0 to (_turretCount - 1) do {
	_gunner = _aiGroup createUnit ["GUE_Soldier_MG_DZ", [0,0,0], [], 1, "NONE"];
	[_gunner] joinSilent _aiGroup;
	0 = [_gunner] call EMS_unit_setSkills;
	_gunner setVariable ["unconscious",false];
	//_gunner setVariable ["bodyName",(name _gunner)];
	_gunner assignAsGunner _veh;
	_gunner moveInTurret [_veh,[_i]];
};

_aiGroup allowFleeing 0;
_aiGroup setBehaviour "AWARE";
_aiGroup setSpeedMode "NORMAL";
_aiGroup setCombatMode "YELLOW";

_aiGroup setVariable ["assignedVehicle",_veh];
_aiGroup setVariable ["isArmed",1];
_aiGroup setVariable ["spawnParams",_this];

(units _aiGroup) allowGetIn true;

// Закончили сажать ботов в технику

Этот код посадит в технику максимальное возможное число ботов для этой техники, так же должно посадить их на все турели (стрелки).

Это чисто из готового, как заставить эту технику патрулировать уже писать не буду, это новый код писать надо, я чисто скопировал уже готовый из своих архивов.

не а просто чтоб как награда стояла

я так понимаю тоже самое только без кода

Share this post


Link to post
Share on other sites
  • 0

... в WAI давно уже есть раздел для статичных миссий, все реализовано.

Share this post


Link to post
Share on other sites
  • 0

... в WAI давно уже есть раздел для статичных миссий, все реализовано.

И как им пользоваться?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By vitacite
      Бесплатные проекты - "пацаны собрались и замутили сервачок" долго не живут.  В этом я убеждался много раз. Нет сначала на интузиазме эффективность неплохая, но затем все это затухает управляемость команды падает.  Начинаются вопросы - "а почему это должен делать я?",  отмазки "да я на даче сегодня", "да у меня командировка" и тд...  + кто-то должен спонсировать оплату сервера, антидудосов и прочей лобуды, а такого человека интерес тоже может пропасть в любой момент. А чтобы проект был хороший - кому-то надо реально "въебывать", как на второй работе, и  кому-то постоянно вливать туда бабло.
      Поэтому, лично я, считаю любой некоммерческий проект заранее проваленным!  Побегать недельку другую с друзьями это да. Что-то более серьезное, не тратьте свои силы и время! Как минимум на  тему сталкера я таких проектов видел 10 штук и в некоторых даже сам поучаствовал. Начиналось все амбициозно и даже набирало онлайн до 100 человек. Но заканчивалось все одинаково 3-4 месяца и с десято скучающих тел, на безлюдном сервере.  С точки зрения администации, игроки ведут себя как проститутки, бегая с сервера на сервер, друзья перешли, или потому что на том добавили новый прикольный скрип, или прикольную тачку, или тут плохой пинг, а там хороший, или админ козел забанил за читы и тд.  а все эти приколюхи требуют денег, а игровое сообщество не очень расположено их платить за некачественный контент. Да и сама администрация достаточно быстро забивает и расслабляется.
      (я сейчас не говорю о конкретном проекте, скорее это собирательный образ халявы).
       
      А теперь по-существу.  Так сколько должен стоить контент с хотя бы приемлемым качеством?  

      Свое мнение я написал ниже.
       
       
      Спасибо за внимание.
       
      А что думаете Вы напишите ниже в комментариях!
       
       
    • By vitacite
      Вступление: 
      Бодрого дня комрады. Данный гайд расчитан на тех кто умеет пользоваться 3D Studio Max, умеет пользоваться Object Builder и хотя бы пытался делать собственные модели.  Я разбираюсь с этой темой с нуля,  у меня есть опыт создания стволов для Арма 3, но в Dayz, как выяснилось все совсем иначе. Статей будет видимо несколько ибо Богемия, это такая Богемия, что не важно какую игру она делает. Инструменты остаются кривожопыми, паралогичными и в целом непонятными.
       
      Начнем с полного нуля. Т.е. выбора модели и подготовки ее и текстур.
      1.  Модельный контент на самом деле ограничен в использовании. Отсюда за порт калаша из Арма 3 без учета авторских прав, может влететь не только в виде SteamBan-а вашего мода, но еще и за нарушение авторских прав.
      Поступим честно. Купим модель у автора на стоке.  В данном случае я выбрал модель АК12 я выбрал за внешний вид. Вот ссылка на саму модель. Заодно оцените сколько стоит труд моделлеров. 
      https://www.cgtrader.com/3d-models/military/gun/ak-12-m
       

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
       
      Кроме того эта модель имеет полный набор необходимых текстур (имеет карту теней, карту высот, нормали и прочее). Что позволит создать адекватный мультиматериал.  Правда все это не форматах Dayz SA (Арма 2), по переделать это не так сложно.
      Сразу скажу т.к. модель в игре будет смотреться несколько иначе.  Мне придется разобраться АК 12, чтобы выделить необходимые движущиеся части, курок, затвор, отделить магазин, прицелы, приклад в отдельные части. Так, как это используется в Dayz. Все это будет делаться в 3D макс. А так же сохранить в формате, который адекватно экспортируется в Dayz Object Builder.
      По мере прогресса, я буду выкладывать отчеты с подробным описанием действий. 
       
      Использованный софт:  изучение модели, для составление гайда (название селекшенов, лодов и тд.) проводилось с помощью программы Elitness из пакета Mikero tools  https://mikero.bytex.digital/Downloads. Подгонка моделей проводилась в бесплатной ученической версии 3DStudio Max, конверт текстур Photoshop, подгонка моделей Object Builder, конфиги писал в notepad  ++
       
      План действий такой. 
       
      Распил 3D модели в 3D макс на отдельные части (те, которые будут выделены в прокси, как отдельные предметы)
      Создание текстур и материалов (AS,SMDI,NOHQ) на базе приложенных в модели и подгонка материала.
      Создание селекшенов и лода memory
      Перемещение частей в прокси и подгонка их к базе.
      Создание model.cfg
      Создание config.cpp 
      Импорт всего этого добра в собственный
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
       
       
       
       
       
       
       
       
      Изначально модель была не готова для конверсии. В первых, все части были собраны в одну представляя из себя нагромождение частей АК-12,  во-вторых пришлось делать Detoch частей модели например затвора, т.к. изначально он был представлен двумя несвязанными друг с другом полигонами, а у нас затвор - движующаяся часть.  В итоге скрыв лишние LOD-ы (они пока нам не нужны) и пересобрав там где надо запчасти. Получилась следующая картина.

       
      Я заранее выделил, как отдельные модели части которые будут подвергнуты анимации. А именно курок (base curok) и затвор basehutter. А также выгрузил в отдельную модель рамку прицела и приклад, чтобы подцепить к модели через прокси. Об этом расскажем отдельно. А планки Пиккатини сделал неснимаемыми (без них между прицелом и базой АК будет большой зазор). Так пришлось повозиться с место крепления съемного приклада, т.к. при разборе модели на зап.части там образовалась дыра.  Готовую модель требуется конвентировать в формат FBX.
       

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
       
       
       
       
       
       
       
       
      Выделяем только те части которые нами выбраны для моделирования и делаем export selected.
      В моем случае я подготовил папку
      P:\тегпроекта\weapons\firearms\AK12\source\ При сохранении чтобы все потом правильно экспортировалось, желательно выставить чекпоинты в открытых свитках, как на скриншоте, остальное оставить по умолчанию. 

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
       
      И обязательное условие формат для экспорта должен быть FBX 2010.  Не спрашивайте почему, это загадка для меня связанная с работой Object Builder, но в моем случае нормальный экспорт получается только в 2010 FBX.
      Так же отдельными моделями по такому же принципу выгружаем приклад и прицел и магазин(ы) автомата. Это отдельные модели которые мы будем цеплять через прокси.
       

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
       
       
       
       
       
       
       
       
      При импорте в Object Builder отключите чекпоинт на Sharp & Smoth edges (иначе все идет кубами) и Animation (ее просто нет), включите Prepare materials. 
      Полученный автомат загружается неправильно ориентированным в пространстве, незатекстуренным, но с готовыми к работе selection. 
       
      Сохраняем нашу модель под именем 
       
      P:\тегпроекта\weapons\firearms\AK12\ak12_base.p3d  И займемся конфигом.  
      Открываем notepad++ и создаем model.cfg следующего содержания 
      class CfgSkeletons { class Default; class ak12_base_skel : Default //название скелета { skeletonInherit = ""; isDiscrete = 1; SkeletonBones[]= { "magazine" ,"", //кости для анимации сменный магазин "trigger" ,"", //курок "bolt" ,"" //затвор }; }; }; class CfgModels { // BASE CLASS DEFINITIONS START class Default; class ak12_base:Default //цепляем скелет к нашей модели. { skeletonName="ak12_base_Skel"; sections[]= { "magazine" //выделяем сецию магазин }; class Animations { }; }; // BASE CLASS DEFINITIONS END }; Он базовый позже мы его дополним. Конфиг я планирую использовать от ванильного АК47, врядли он будет сильно отличается, от АК12. 
      По схожим прнципам копируем файлы с будующими прокси..
      Магазин на 30 патронов.
      ak12_magazine_30rnd.p3d Магазин под барабан 
      ak12_magazine_drum.p3d Прицельная рамка
      ak12_sight.p3d Съемный приклад
      ak12_stock.p3d 
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      Итоговый вид моего рабочего каталога.
      Пришло время занятся материалом для нашего АК.
      Архив содержит текстуры для базы АК12 в формате TGA (это кстати важно т.к. позволяет сохранять битность тестур, а там где мы работаем с материалами мы будем работать с каналами)
       
      AK12_Base_A.tga  - диффузная карта
      AK12_Base_AO.tga - окружение
      AK12_Base_MSA.tga - карта отражения
      AK12_Base_MT_AO_0_G.tga - карта металик, карта отражения, и окружение вместе.
      AK12_Base_N.tga - карта нормалей (тут пришлось заморочиться т.к. эта карта нормалей для OpenGL.  а в нашем случае карта нормалей нужна для Direct X.)
       

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
       
      Разницу можно увидет на скриншотте выше в левой части нормаль в OpenGl формате в правой части нормальн в DirectX формате. 

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
       
      В нашем случае я поменял красный и зеленый каналы, синий не тронул. 
      https://community.bistudio.com/wiki/Texture_Map_Types
      про разницу карты нормалей между openGL и директ X тут - 
      https://help.cc0textures.com/doku.php?id=usage:directx-opengl
       
      Для нормального материала нам понадобится карты AS и SMDI
      Создадим их AS из AO не меняем..
      Для SMDI берем родную текстуру 
      AK12_Base_MSA.tga и создаем SMDI  (как можно узнать из статьи выше карта SMDI хранит информацию в зеленом и синем канале игнорируя красный и альфу). Создаем пустую картинку аналогичных размеров и начинаем копирование нужных каналов.  Соответственно зеленый канал из оригинальной тестуры, я скопировал в синий канал новой текстуры SMDI, красный канал SMDI залил белым (0), а в зеленый канал скопировал текстуру из красного оригинального (содержащего блестяшки и сильно ее затенил).
      (скрин не влез из-за ограничений  800кб) но ничего продолжим ниже.
       
       
       
       
      Продолжение следует........
    • By BorizzK
      В эксперементалке 1.08 если сбросить предмет находясь на машине (крыше, багажнике, капоте в кузове) предмет проваливается сквозь машину на землю или оказывается в ее текстурах
       
      Тикет
      https://feedback.bistudio.com/T152071
       
      ответ богемии поразителен - сейчас нет простого решения
       
      А ниже что? Проще не бывает...
       
      Собственно код фикса (Автор Я)
       
      Code ``` modded class ItemBase extends InventoryItem { override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc) { super.EEItemLocationChanged(oldLoc,newLoc); if (newLoc.GetType() == InventoryLocationType.GROUND) { if (oldLoc.GetParent()) { PlayerBase player = PlayerBase.Cast(oldLoc.GetParent()); if (player) { FixPositionIfDropOnCar(player); } } } } void FixPositionIfDropOnCar(PlayerBase player) { vector m_RayStart; vector m_RayEnd; m_RayStart = player.GetPosition(); m_RayStart[1] = m_RayStart[1] + 0.5; m_RayEnd = m_RayStart; m_RayEnd[1] = m_RayEnd[1] - 1; RaycastRVParams m_RayCastInput = new RaycastRVParams(m_RayStart, m_RayEnd, this, 0.05); array<ref RaycastRVResult> m_RayCastResults = new array<ref RaycastRVResult>; m_RayCastInput.with = player; m_RayCastInput.flags = CollisionFlags.FIRSTCONTACT; if (DayZPhysics.RaycastRVProxy(m_RayCastInput, m_RayCastResults)) { if (m_RayCastResults.Count() > 0) { Car car; if (Class.CastTo(car, m_RayCastResults[0].obj) || Class.CastTo(car, m_RayCastResults[0].parent)) { this.SetPosition(m_RayCastResults[0].pos + (player.GetDirection() * 0.1)); } } } } } ``` Наверное имеет смысл чуть приподнять предмет над поверхностью, но необходимость этого зависит от типа предмета, потому не стал этого делать
       
      чуть откорректировал код
    • By 123new
      Вижу крайне много любопытных вопросов по поводу идентификаторов игрока в игре. Что же, разжую для не знающих немного.
       
      В игре есть следующие типы идентификаторов:
      1. Steam64ID идентификатор профиля игрока (на пиратках его UID называют), примерно такой: 765475....65 (17 цифр).
      2. Так называемый мною, BIS ID - uid из окна (консоли) сервера игры и ADM-файлов логов сервера, который пишется самой игрой
      3. Battleye GUID игрока.
       
      Первый идентификатор (Steam64ID) на ПК является прямым идентификатором стим-профиля игрока, уникальным у каждого игрока. Т.е. публичным идентификатором вашего профиля для большинства стим-игр (например, Counter-Strike).
      Второй идентификатор (BIS ID) является определенной хеш-суммой, полученной из Steam64ID посредством конвертации сначала в sha256, а затем в base64. Спасибо за это разъяснение и пример кода-конвертации авторам игры на своем официальном форуме.
      Третий идентификатор (Battleye GUID) является публичным идентификатором Battleye античита, получаемый также из Steam64ID поcредством получения его хеш-суммы MD5. Этот же идентификатор есть в логах сервера от Battleye, в любых RCON-приложениях (DART, BEC и т.п.), также его можно конвертировать самим.
       
      Так вот, как же получить Steam64ID:
      1. Зайти на любой ресурс, предназначенный для сбора таких данных. например на: https://steamid.io/
      2. Ввести ссылку на ваш стим-профиль
      3. Получить результат из кучи данных, одно поле из которых и будет содержать ваш Steam64ID
       
      Как получить BIS ID:
      1. Открыть любой Phyton-конвертер в интернете, например: https://www.tutorialspoint.com/execute_python_online.php
      2. Ввести в него следующий код:
      # Hello World program in Python from hashlib import sha256 from base64 import b64encode def construct_bi_uid(steam_id): hashed = sha256() hashed.update(str(steam_id)) return b64encode(hashed.digest()) print construct_bi_uid(76514925976798981) 3. заменить 76514925976798981 на ваш Steam64ID
      4. Отправить код в исполнение, нажав Execute.
      5. Получить результат

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
       
      Как получить Battleye GUID:
      1. Открыть любой ресурс с готовой формой конвертирования, например:
      https://armstalker.com/guid/
      https://dayzrussia.com/f/index.php?pages/dayzguid/
      либо написать свою, на основе данных, предложенных на странице Github
      https://gist.github.com/chris579/53053b6d6438df9a9718c23c0d6bbd69
      Оставлю ниже лишь код для Phyton:
      # Thanks to gunlinux import md5 steamid=76514925976798981 temp = "" for i in range(8): temp += chr((steamid & 0xFF)) steamid >>= 8 m = md5.new("BE"+temp) print m.hexdigest() 2. Вставить в поле ввода UID(Steam64ID) ваш Steam64ID
      3. Нажать кнопку конвертирования или исполнить код, и получить в готовом виде Battleye GUID
       
      Возможно имеются и другие методы и наработки в получении данных идентификаторов более простыми методами, на других языках, либо автоматически. Я описал лишь известные мне.
      Все желающие могут добавить в комментариях свои способы конвертаций, возможно это поможет кому-либо.
    • By BorizzK
      Довольно тупое охлаждение жратвы и кастрюли если они оказались на земле
      Прикрутить охлаждение содержимого кастрюли как 2 байта сами знаете что
      Сделать охлаждение после снятия с костра и тп вобщем то же не проблема
       
      Просто код и ничего лишнего
       
      Комментарии к коду добавлю позже
      Логгирование в коде закомментировано - раскомментируйте, что бы наблюдать за процессом
       
      Для жратвы убавление температуры раз в 10 сек на 1 градус
      Для кастрюли на 2 градуса
       
      Охлаждается до дневной температуры воздуха далее охлаждение прекращается
      У бгемотов есть 2 температуры воздуха - дневная и ночная
      Идиотизм? Однозначно
      Я пытался в погоде сделать ее плавное изменение в зависимости от Overcast, Rain и тп, но забил - потом как-нибудь
       
      Есть вопросы, задавайте, отвечу если будет время.
       
      Вобщем как-то так:
       
      //08.05.2020 modded class ItemBase extends InventoryItem { ref Timer m_TemperatureDecrease; private float m_InitTemperature; private float m_DecreaseTempTime = 10; private float m_TempDecreaseCoef = -1; void ItemBase() { m_InitTemperature = 12; //g_Game.GetMission().GetWorldData().GetDayTemperature(); // Не работает ((( какого художника - я хз if ( IsInherited(Pot) /* GetInventory().GetCargo() */ ) { m_TempDecreaseCoef = -2; } } override void AfterStoreLoad() { super.AfterStoreLoad(); if (!IsInherited(FireplaceBase)) TryToStartTempDecrease(); } private void TryToStartTempDecrease() { if (GetTemperature() > GetInitTemperature()) { if (!GetHierarchyParent()) { if (!m_TemperatureDecrease) { Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: Init: TryToStartTempDecrease: this: " + this + ": GetHierarchyParent(): " + GetHierarchyParent() + ": GetTemperature(): " + GetTemperature()); StartTemperatureDecrease(); } } } } override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc) { super.EEItemLocationChanged(oldLoc,newLoc); //Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: EEItemLocationChanged: this: " + this + ": newLoc.GetType(): " + newLoc.GetType() + ": newLoc.GetParent(): " + newLoc.GetParent() + ": GetTemperature(): " + GetTemperature()); if (GetTemperature() > GetInitTemperature()) { if (!newLoc.GetParent() || newLoc.GetType() == InventoryLocationType.GROUND) { if (!m_TemperatureDecrease) { Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: EEItemLocationChanged: this: " + this + ": Begin decrease temperature: GetTemperature(): " + GetTemperature()); StartTemperatureDecrease(); } } } else { if (m_TemperatureDecrease) { Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: EEItemLocationChanged: this: " + this + ": End decrease temperature: GetTemperature(): " + GetTemperature()); StopTemperatureDecrease(); } } } private void StartTemperatureDecrease() { m_TemperatureDecrease = new Timer( CALL_CATEGORY_SYSTEM ); m_TemperatureDecrease.Run(m_DecreaseTempTime, this, "DecreaseTemperature", NULL, true); } private void StopTemperatureDecrease() { m_TemperatureDecrease.Stop(); m_TemperatureDecrease = NULL; } void DecreaseTemperature() { if (GetTemperature() > GetInitTemperature()) { AddTemperature(GetTempDecreaseCoef()); if ( IsInherited(Pot) /* GetInventory().GetCargo() */) { DecreaseCargoTemperature(); } Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: DecreaseTemperature: this: " + this + ": Decrease: GetTemperature(): " + GetTemperature()); } else { SetTemperature(GetInitTemperature()); StopTemperatureDecrease(); Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: DecreaseTemperature: this: " + this + ": Stop decrease: GetTemperature(): " + GetTemperature()); } } void DecreaseCargoTemperature() { ItemBase item; int item_count = GetInventory().GetCargo().GetItemCount(); for (int i = 0; i < item_count; i++) { item = ItemBase.Cast(GetInventory().GetCargo().GetItem(i)); if (item) { if (item.GetTemperature() > item.GetInitTemperature()) { item.AddTemperature(item.GetTempDecreaseCoef()); Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: DecreaseCargoTemperature: this: " + this + ": Decrease: item: " + item + ": item.GetTemperature(): " + item.GetTemperature()); } else { item.SetTemperature(item.GetInitTemperature()); Print("::: SERVER: [ItemBase extends InventoryItem: Decreasetemp]: DecreaseCargoTemperature: this: " + this + ": Stop decrease: item: " + item + ": item.GetTemperature(): " + item.GetTemperature()); } } } } float GetInitTemperature() { return m_InitTemperature; } float GetTempDecreaseCoef() { return m_TempDecreaseCoef; } } Немного переделал код
      Теперь охлаждается все если оно имеет Т выше 12, а если это кастрюля с содержимым, то и ее содержимое
      Получить Т воздуха в конструкторе не выходит потому указал руками
       
  • Our picks

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.