Портал игровых серверов GMNET.RU - ArmA2.RU
spacerspacer Главная spacerspacer Форум spacerspacer Игровые Сервера spacerspacer Правила Игровых Серверов spacerspacer
Старый 26.03.2012, 13:05   #16
FenechkA
Майор
 
Аватар для FenechkA
 
Регистрация: 02.04.2011
Адрес: Чита, Забайкалье
Сообщений: 1,918
Сказал cпасибо: 497
Поблагодарили 1,375 раз в 775 сообщениях
ну это уже лучее у автора спросить
но можно попробовать пихнуть в инит объекта, который в редакторе
FenechkA вне форума   Ответить с цитированием
Сказал спасибо (1):
Enki1 (26.03.2012)
Старый 26.03.2012, 18:23   #17
55й
Старший сержант
 
Аватар для 55й
 
Регистрация: 05.09.2011
Сообщений: 229
Сказал cпасибо: 91
Поблагодарили 111 раз в 54 сообщениях
Отправить сообщение для 55й с помощью ICQ
наверно в инит миссии init.sqf

а мне вот надо например узнать расстояние между точками на карте и азимут,тоже все изыскался, чтоб тыкнул раз точку тыкнл два ,провелась линия с расстоянием между ними и азимутом, кто знает ?
55й вне форума   Ответить с цитированием
Старый 26.03.2012, 22:17   #18
FenechkA
Майор
 
Аватар для FenechkA
 
Регистрация: 02.04.2011
Адрес: Чита, Забайкалье
Сообщений: 1,918
Сказал cпасибо: 497
Поблагодарили 1,375 раз в 775 сообщениях
плохо искал [Только зарегистрированные и активированные пользователи могут видеть ссылки. ]
среди прочего, в наличии пара функций
RMM_f_getDirection и RMM_f_getDistance

Последний раз редактировалось FenechkA; 26.03.2012 в 22:31.
FenechkA вне форума   Ответить с цитированием
Сказал спасибо (1):
55й (27.03.2012)
Старый 27.03.2012, 06:44   #19
55й
Старший сержант
 
Аватар для 55й
 
Регистрация: 05.09.2011
Сообщений: 229
Сказал cпасибо: 91
Поблагодарили 111 раз в 54 сообщениях
Отправить сообщение для 55й с помощью ICQ
amp;feature=youtu.beвот слепил наконец. линейка, компас и артиллерийский прицел с таблицей

только помогите с этим разбинарил файлик который должен изменить карту

Скрытый текст


enum {
};

class CfgPatches
{

class map_no_sat
{
units[] = { };
weapons[] = { };
requiredVersion = 1.010000;
requiredAddons[] = {
"CAUI"
};
};
};

class RscMapControl ;

class RscDisplayMainMap
{
onload = "nul = [0] execVM ""\map_no_sat\script\add_ruler.sqf"";";

class controlsBackground
{

class CA_Map : RscMapControl
{
maxSatelliteAlpha = 0;
colorBackground[] = {
0.929412, 0.929412, 0.929412, 1.000000
};
colorCountlines[] = {
0.647059, 0.533333, 0.286275, 1
};
colorMainCountlines[] = {
0.858824, 0, 0
};
colorForest[] = {
0.600000, 0.800000, 0.200000, 0.250000
};
colorLevels[] = {
0.000000, 0.000000, 0.000000, 1.000000
};
sizeExLevel = 0.030000;
};
};
};
[свернуть]


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

Последний раз редактировалось 55й; 27.03.2012 в 06:50.
55й вне форума   Ответить с цитированием
Старый 28.03.2012, 20:16   #20
55й
Старший сержант
 
Аватар для 55й
 
Регистрация: 05.09.2011
Сообщений: 229
Сказал cпасибо: 91
Поблагодарили 111 раз в 54 сообщениях
Отправить сообщение для 55й с помощью ICQ
как замутить зону перезарядки и заправки для техники? а то ставить грузовик на авианосец как то не оч выглядит )))
спасибо разобрался

Последний раз редактировалось 55й; 30.03.2012 в 21:12.
55й вне форума   Ответить с цитированием
Старый 30.03.2012, 16:23   #21
Prodavec
Подполковник
 
Аватар для Prodavec
 
Регистрация: 23.07.2009
Сообщений: 2,358
Сказал cпасибо: 268
Поблагодарили 915 раз в 549 сообщениях
Enki1
Приеду сегодня из зала, помогу, ща не могу много писать. В кратце место где добавляются все Actions на клиентской стороне. Там же можно сделать проверку, является ли юнит инженером и если НЕТ, то не добавлять действия. Кроме того после возрождения так же действие должно быть восстановлено, т.к. Actions привязываются к телу, после возрождения игроки появляются в новом теле без Actions.

Prodavec добавил через 1289 Мин. и 28 Сек.

Парни, извиняюсь за задержку, много работы. Оказалось что всё чуть сложнее чем ожидалось. Ангары после уничтожения превращаются в мусор и их нужно полностью строить с нуля. Простым setDamage 0 не обойтись. Ну и кроме того есть другие нюансы: меню действий привязано к объекту, что не катит после его уничтожения, работает на 5 метров, как раз высота потолка, надо было добавить поддержку для синглплеера.

Короче вот видяха с тем что сделано. Ща буду доделывать:


Так, вообщем скрип. Предыдущая версия сильно обновлена.

1. Поддержка синглплеера, работает и listenserver'е и на dedicated
2. Можно регулировать размер зоны починки, чинить можно любые здания, только надо им задать координаты, где они находятся
3. Чинить можно сразу несколько зданий из одной точки, например у вышки можно сразу починить все ангары, а можно поставить и раздельную починку, как угодно
4. Быстродействие миссии не нарушено, прекрасно понимаю что оно критично, хотя некоторые моменты можно улучшить для уменьшения объема кода, например определения ремонтных зон в константах Client_fnc_RH_CheckActionMenuConditions.sqf и Client_fnc_RH_GetRepairZoneIDByCoords.sqf повторяются, проверка на инженера после респауна: локальная переменная дублируется.

Мне никто не помогал, так что вероятно есть какие-то скрытые баги/дефекты о которых я не знаю, пишите тут или сами пробуйте исправить, скрипт несложный. Это важно, т.к. у меня другая версия Warfare и они могут отличаться, хотя не знаю кому этот чертов ангар понадобился и зачем его так приспичило чинить , вообщем можно починить даже летний сортир за деньги В Warfare не игрок, так что каких-то фокусов могу не знать.

Собственно скрипты:
==============================
\Client\Action\Action_RepairHangar.sqf
Код:
// ************************************************************
// * Action_RepairHangar.sqf [1.1]                            *
// * Action module for Hangar Repairing                       *
// * by Prodavec                                              *
// ************************************************************

// DEFINITIONS
// ----------------------------------------------
#define		RH_REPAIRPRICE				1

// PRE-INIT
// ----------------------------------------------

// VARIABLES
// ----------------------------------------------

// FUNCTIONS
// ----------------------------------------------

// MAIN
// ----------------------------------------------
_position = getPosATL player;

// Optimization. Get the repair zone ID, it will be transfered
// across the network instead of a building objects array
_repairZoneID = _position call fnc_RH_GetRepairZoneIDByCoords;
if (_repairZoneID == -1) exitWith {diag_log "Action_RepairHangar.sqf, _repairZoneID is -1, no repair zones found but Action menu was active. Check radius settings!";}; // Just for case

_buildingsToCheck = _repairZoneID call fnc_RH_GetBuildingsByID;

// Check if some of the buildings got ruined
_ruined = false;
{
	if (((typeOf ((_x select 0) select 0)) in ["Land_SS_hangar_ruins", "Land_Mil_hangar_ruins_EP1"]) || (isNull ((_x select 0) select 0))) exitWith {_ruined = true;};
} forEach _buildingsToCheck;

if (_ruined) then
{
	// _hangar(s) is destroyed, do additional check(s)
	if ((call GetPlayerFunds) >= RH_REPAIRPRICE) then
	{
		// player has enough money to repair, do repair
		player sideChat localize "STR_WF_RH_RepairingHangar";

		(-RH_REPAIRPRICE) call ChangePlayerFunds;
		
		WFBE_RequestRepairHangar = ["SRVFNCREQUESTREPAIRHANGAR", [_repairZoneID, player]];
		publicVariable "WFBE_RequestRepairHangar";

		if ((!isMultiplayer) || (isServer && (local player))) then
		{
			[nil, "SRVFNCREQUESTREPAIRHANGAR", [_repairZoneID, player]] spawn HandlePVF;
		};
	}
	else
	{
		// player has no enough money to repair, do nothing
		player sideChat localize "STR_WF_RH_NoEnoughMoney";
	};
}
else
{
	// _hangar(s) is not destroyed, do nothing
	player sideChat localize "STR_WF_RH_IsNotDamaged";
};

\Client\PVFunctions\RepairHangar.sqf
Код:
// ************************************************************
// * RepairHangar.sqf [1.1]                                   *
// * Client module for Hangar Repairing                       *
// * by Prodavec                                              *
// ************************************************************

// DEFINITIONS
// ----------------------------------------------

// PRE-INIT
// ----------------------------------------------

// VARIABLES
// ----------------------------------------------

// FUNCTIONS
// ----------------------------------------------

// MAIN
// ----------------------------------------------
_repairZoneID = _this select 0;
_player = _this select 1;

_buildings = _repairZoneID call fnc_RH_GetBuildingsByID;

// Repair / Rebuild Hangar(s) on the client side
// --------------------------
// _building = [[oPart0, oPart1,...], "class", [detector coords], [building coords], dir]
// _building = [[oPart0, oPart1,...], "class", [detector coords], [building coords], dir]
// ...
// _buildings = [_building0, _building1, _building3,...]

// ---
//_msg = format ["RepairHangar.sqf: %1", _buildings];
//player sideChat _msg;
//diag_log _msg;
// ---

{
	{
		if (!isNull _x) then
		{
			if (_x call fnc_RH_hasDestroyedParts) then
			{
				// ---
				//_msg = format ["RepairHangar.sqf: Deleteing %1", _x];
				//player sideChat _msg;
				//diag_log _msg;
				// ---

				deleteVehicle _x;
			}
			else
			{
				// ---
				//_msg = format ["RepairHangar.sqf: Reparing %1", _x];
				//player sideChat _msg;
				//diag_log _msg;
				// ---

				_x setDamage 0;
			};
		};
	} forEach (_x select 0);
} forEach _buildings;
// --------------------------

_player sideChat localize "STR_WF_RH_RepairingHangarDone";

\Client\Init\Init_Client.sqf
найти
Код:
//--- Options menu.
Options = player addAction ["<t color='#F8D664'>" + (localize "STR_WF_Options") + "</t>","Client\Action\Action_Menu.sqf", "", 1, false, true, "", ""];
добавить со следующей строки
Код:
// Prodavec
// Repair Hangar action init
// ----------------------------------------------
_rh_engineers =
[
	"USMC_SoldierS_Engineer",
	"MVD_Soldier_TL"
];
if ((typeOf player) in _rh_engineers) then
{
	fnc_RH_GetRepairZoneIDByCoords = compile preprocessFileLineNumbers "Client\Functions\Client_fnc_RH_GetRepairZoneIDByCoords.sqf";
	fnc_RH_CheckActionMenuConditions = compile preprocessFileLineNumbers "Client\Functions\Client_fnc_RH_CheckActionMenuConditions.sqf";

	player addAction [format [localize "STR_WF_RH_RepairHangar", 1], "Client\Action\Action_RepairHangar.sqf", [], 99, false, true, "", "call fnc_RH_CheckActionMenuConditions"];
};
// ----------------------------------------------

\Client\GUI\GUI_Respawn.sqf
найти
Код:
Options = player addAction ["<t color='#F8D664'>" + (localize "STR_WF_Options") + "</t>","Client\Action\Action_Menu.sqf", "", 1, false, true, "", ""];
добавить со следующей строки
Код:
// Prodavec
// Repair Hangar action init after respawn
// ----------------------------------------------
_rh_engineers =
[
	"USMC_SoldierS_Engineer",
	"MVD_Soldier_TL"
];
if ((typeOf player) in _rh_engineers) then
{
	player addAction [format [localize "STR_WF_RH_RepairHangar", 1], "Client\Action\Action_RepairHangar.sqf", [], 99, false, true, "", "call fnc_RH_CheckActionMenuConditions"];
};
// ----------------------------------------------

\Client\Functions\Client_fnc_RH_CheckActionMenuCon ditions.sqf
Код:
// ************************************************************
// * Client_fnc_RH_CheckActionMenuConditions.sqf [1.1]        *
// * fnc_RH_CheckActionMenuConditions for Hangar Repairing    *
// * by Prodavec                                              *
// ************************************************************

// DEFINITIONS
// ----------------------------------------------
#define		RH_REPAIRZONE_RADIUS		50
#define		RH_REPAIRZONE_KRASNOSTAV_0	[11813, 12625, 0]
#define		RH_REPAIRZONE_KRASNOSTAV_1	[12035, 12634, 0]
#define		RH_REPAIRZONE_KRASNOSTAV_2	[12198, 12598, 0]
#define		RH_REPAIRZONE_VYBOR_0		[4480, 10617, 0]
#define		RH_REPAIRZONE_VYBOR_1		[4580, 10680, 0]
#define		RH_REPAIRZONE_VYBOR_2		[4521, 10781, 0]
#define		RH_REPAIRZONE_VYBOR_3		[4720, 10220, 0]
#define		RH_REPAIRZONE_BALOTA_0		[5050, 2410, 0]
#define		RH_REPAIRZONE_BALOTA_1		[4774, 2586, 0]
#define		RH_REPAIRZONE_BALOTA_2		[4717, 2601, 0]

// PRE-INIT
// ----------------------------------------------

// VARIABLES
// ----------------------------------------------

// FUNCTIONS
// ----------------------------------------------

// MAIN
// ----------------------------------------------
private
[
	"_return",
	"_repairZones"
];
_return = false;

_repairZones =
[
	RH_REPAIRZONE_KRASNOSTAV_0,
	RH_REPAIRZONE_KRASNOSTAV_1,
	RH_REPAIRZONE_KRASNOSTAV_2,
	RH_REPAIRZONE_VYBOR_0,
	RH_REPAIRZONE_VYBOR_1,
	RH_REPAIRZONE_VYBOR_2,
	RH_REPAIRZONE_VYBOR_3,
	RH_REPAIRZONE_BALOTA_0,
	RH_REPAIRZONE_BALOTA_1,
	RH_REPAIRZONE_BALOTA_2
];

{
	if (player distance _x < RH_REPAIRZONE_RADIUS) exitWith {_return = true;};
} forEach _repairZones;

_return;

\Client\Functions\Client_fnc_RH_GetRepairZoneIDByC oords.sqf
Код:
// ************************************************************
// * Client_fnc_RH_GetRepairZoneIDByCoords.sqf [1.1]          *
// * fnc_RH_GetRepairZoneIDByCoords for Hangar Repairing      *
// * by Prodavec                                              *
// ************************************************************

// DEFINITIONS
// ----------------------------------------------
#define		RH_REPAIRZONE_RADIUS		50
#define		RH_REPAIRZONE_KRASNOSTAV_0	[11813, 12625, 0]
#define		RH_REPAIRZONE_KRASNOSTAV_1	[12035, 12634, 0]
#define		RH_REPAIRZONE_KRASNOSTAV_2	[12198, 12598, 0]
#define		RH_REPAIRZONE_VYBOR_0		[4480, 10617, 0]
#define		RH_REPAIRZONE_VYBOR_1		[4580, 10680, 0]
#define		RH_REPAIRZONE_VYBOR_2		[4521, 10781, 0]
#define		RH_REPAIRZONE_VYBOR_3		[4720, 10220, 0]
#define		RH_REPAIRZONE_BALOTA_0		[5050, 2410, 0]
#define		RH_REPAIRZONE_BALOTA_1		[4774, 2586, 0]
#define		RH_REPAIRZONE_BALOTA_2		[4717, 2601, 0]

// PRE-INIT
// ----------------------------------------------

// VARIABLES
// ----------------------------------------------

// FUNCTIONS
// ----------------------------------------------

// MAIN
// ----------------------------------------------
private
[
	"_return",
	"_position",
	"_repairZones",
	"_index"
];
_position = _this;
_return = -1;

_repairZones =
[
	RH_REPAIRZONE_KRASNOSTAV_0,
	RH_REPAIRZONE_KRASNOSTAV_1,
	RH_REPAIRZONE_KRASNOSTAV_2,
	RH_REPAIRZONE_VYBOR_0,
	RH_REPAIRZONE_VYBOR_1,
	RH_REPAIRZONE_VYBOR_2,
	RH_REPAIRZONE_VYBOR_3,
	RH_REPAIRZONE_BALOTA_0,
	RH_REPAIRZONE_BALOTA_1,
	RH_REPAIRZONE_BALOTA_2
];

_index = 0;
for "_index" from 0 to ((count _repairZones) - 1) step 1 do
{
	if ((_position distance (_repairZones select _index)) <= (RH_REPAIRZONE_RADIUS + 10)) exitWith {_return = _index;};
};

_return;
\Server\PVFunctions\RequestRepairHangar.sqf
Код:
// ************************************************************
// * RequestRepairHangar.sqf [1.1]                            *
// * Request module for Hangar Repairing                      *
// * by Prodavec                                              *
// ************************************************************

// DEFINITIONS
// ----------------------------------------------

// PRE-INIT
// ----------------------------------------------

// VARIABLES
// ----------------------------------------------

// FUNCTIONS
// ----------------------------------------------

// MAIN
// ----------------------------------------------
_repairZoneID = _this select 0;
_player = _this select 1;

_buildings = _repairZoneID call fnc_RH_GetBuildingsByID;

// Repair / Rebuild Hangar(s) on the server side
// --------------------------
// _building = [[oPart0, oPart1,...], "class", [detector coords], [building coords], dir]
// _building = [[oPart0, oPart1,...], "class", [detector coords], [building coords], dir]
// ...
// _buildings = [_building0, _building1, _building3,...]

// ---
//_msg = format ["RequestRepairHangar.sqf: %1", _buildings];
//player sideChat _msg;
//diag_log _msg;
// ---

{
	_destroyed = false;
	{
		if (!isNull _x) then
		{
			if (_x call fnc_RH_hasDestroyedParts) then
			{
				// ---
				//_msg = format ["RequestRepairHangar.sqf: Deleting %1", _x];
				//player sideChat _msg;
				//diag_log _msg;
				// ---

				deleteVehicle _x;
				_destroyed = true;
			}
			else
			{
				// ---
				//_msg = format ["RequestRepairHangar.sqf: Reparing %1", _x];
				//player sideChat _msg;
				//diag_log _msg;
				// ---

				_x setDamage 0;
			};
		}
		else
		{
			// ---
			//_msg = format ["RequestRepairHangar.sqf: Got <NULL-OBJ>", _x];
			//player sideChat _msg;
			//diag_log _msg;
			// ---

			_destroyed = true;
		};
	} forEach (_x select 0);
	if (_destroyed) then
	{
		_buildingClass = _x select 1;
		_buildingPosition = _x select 3;
		_buildingDirection = _x select 4;
		_newBuilding = createVehicle [_buildingClass, [-1000, -1000, 0], [], 0, "CAN_COLLIDE"];
		_newBuilding setDir _buildingDirection;

		// ---
		//_msg = format ["RequestRepairHangar.sqf: Rebuilding %1", _newBuilding];
		//player sideChat _msg;
		//diag_log _msg;
		// ---

		sleep 0.5;
		_newBuilding setPosATL _buildingPosition;
	};
} forEach _buildings;
// --------------------------

// Broadcast to all clients
WFBE_RepairHangar = [nil, "CLTFNCREPAIRHANGAR", [_repairZoneID, _player]];
publicVariable "WFBE_RepairHangar";

if ((!isMultiplayer) || (isServer && (local player))) then
{
	[nil, "CLTFNCREPAIRHANGAR", [_repairZoneID, _player]] spawn HandlePVF;
};

\Common\Init\Init_PublicVariables.sqf
найти
Код:
_l = _l + ["RequestSpecial"];
_l = _l + ["RequestTeamUpdate"];
добавить со следующей строки
Код:
// Prodavec: Hangar repair (server side)
// ----------------------------------------
_l = _l + ["RequestRepairHangar"];
// ----------------------------------------
найти
Код:
_l = _l + ["UAV_Reveal"];
_l = _l + ["VoteForCommander"];
добавить со следующей строки
Код:
// Prodavec: Hangar repair (client side)
// ----------------------------------------
_l = _l + ["RepairHangar"];
// ----------------------------------------

\Common\Init\Init_Common.sqf
найти
Код:
GetUnitVehicle = Compile PreprocessFile "Common\Functions\Common_GetUnitVehicle.sqf";
добавить со следующей строки
Код:
// Prodavec
// Common functions
// ----------------------------------------------
fnc_RH_GetBuildingsByID = compile preprocessFileLineNumbers "Common\Functions\Common_fnc_RH_GetBuildingsByID.sqf";
fnc_RH_hasDestroyedParts = compile preprocessFileLineNumbers "Common\Functions\Common_fnc_RH_hasDestroyedParts.sqf";
// ----------------------------------------------

\Common\Functions\Common_fnc_RH_GetBuildingsByID.s qf
Код:
// ************************************************************
// * Common_fnc_RH_GetBuildingsByID.sqf [1.1]                 *
// * fnc_RH_GetBuildingsByID for Hangar Repairing             *
// * by Prodavec                                              *
// ************************************************************

// DEFINITIONS
// ----------------------------------------------

// PRE-INIT
// ----------------------------------------------

// VARIABLES
// ----------------------------------------------

// FUNCTIONS
// ----------------------------------------------

// MAIN
// ----------------------------------------------
private
[
	"_return",
	"_id",
	"_objects",
	"_buildings"
];
_id = _this;
_return = [];

_buildings = []; // ["class", [detector coords], [building coords], direction]

// Krasnostav
// RH_REPAIRZONE_KRASNOSTAV_0 - warfare hangar
// RH_REPAIRZONE_KRASNOSTAV_1 - main hangars
// RH_REPAIRZONE_KRASNOSTAV_2 - radio tower
if ((_id >= 0) && (_id <=2)) then
{
	_buildings =
	[
		["WarfareBAirport", [11812.9, 12624.9, 0], [11812.9, 12624.9, 0], 205],
		["Land_SS_hangar", [12056.4, 12622.8, 0], [12056.4, 12622.8, 0], 199],
		["Land_SS_hangar", [12011, 12638.5, 0], [12011, 12638.5, 0], 199],
		["Land_Mil_ControlTower", [12197.8, 12598.1, 9], [12197.8, 12598.1, 0], 202.665]
	];
};

// Vybor
// RH_REPAIRZONE_VYBOR_0 - warfare hangar
// RH_REPAIRZONE_VYBOR_1 - main hangar SE
// RH_REPAIRZONE_VYBOR_2 - main hangar NW
// RH_REPAIRZONE_VYBOR_3 - radio tower
if ((_id >= 3) && (_id <=6)) then
{
	_buildings =
	[
		["WarfareBAirport", [4480.44, 10617.1, 0], [4480.44, 10617.1, 0], 330],
		["Land_SS_hangar", [4579.52, 10680, 0], [4579.52, 10680, 0], 60],
		["Land_SS_hangar", [4521.4, 10780.8, 0], [4521.4, 10780.8, 0], 60],
		["Land_Mil_ControlTower", [4719.72, 10219.5, 9], [4719.72, 10219.5, 0], 150]
	];
};

// Balota
// RH_REPAIRZONE_BALOTA_0 - warfare hangars
// RH_REPAIRZONE_BALOTA_1 - main hangars
// RH_REPAIRZONE_BALOTA_2 - radio tower
if ((_id >= 7) && (_id <=9)) then
{
	_buildings =
	[
		["WarfareBAirport", [5049.52, 2409.67, 0], [5049.52, 2409.67, 0], 30.0022],
		["Land_SS_hangar", [4791.66, 2575.64, 0], [4791.66, 2575.64, 0], 30],
		["Land_SS_hangar", [4756.77, 2595.77, 0], [4756.77, 2595.77, 0], 30],
		["Land_Mil_ControlTower", [4717.07, 2601.12, 9], [4717.07, 2601.12, 0], 86.3069]
	];
};

// Generate bulding list
for "_i" from 0 to ((count _buildings) - 1) step 1 do
{
	_objects = nearestObjects [(_buildings select _i) select 1, ["Building"], 10];
	if ((count _objects) == 0) then
	{
		// Building has no wreck, possible WFBE Airfield
		_objects = [objNull];
	};
	_entry = [_objects, (_buildings select _i) select 0, (_buildings select _i) select 1, (_buildings select _i) select 2, (_buildings select _i) select 3];
	_return set [count _return, _entry];
};

_return;

\Common\Functions\Common_fnc_RH_hasDestroyedParts. sqf
Код:
// ************************************************************
// * Common_fnc_RH_hasDestroyedParts.sqf [1.1]                *
// * fnc_RH_hasDestroyedParts for Hangar Repairing            *
// * by Prodavec                                              *
// ************************************************************

// DEFINITIONS
// ----------------------------------------------

// PRE-INIT
// ----------------------------------------------

// VARIABLES
// ----------------------------------------------

// FUNCTIONS
// ----------------------------------------------

// MAIN
// ----------------------------------------------
private
[
	"_return",
	"_building",
	"_damagedObjectList"
];
_building = _this;
_return = false;

_damagedObjectList =
[
	"Land_SS_hangar_ruins",
	"Land_Mil_hangar_ruins_EP1",
	"Land_Mil_ControlTower_dam",
	"Land_Mil_ControlTower_ruins",
	"Land_Mil_ControlTower_dam_EP1",
	"Land_Mil_ControlTower_ruins_EP1"
];

if ((typeOf _building) in _damagedObjectList) then
{
	_return = true;
};

_return;

\stringtable.xml
добавить строки
Код:
      <Key ID="STR_WF_RH_RepairHangar">
        <English>Repair Hangar for $%1.</English>
        <French>Repair Hangar for $%1.</French>
        <German>Repair Hangar for $%1.</German>
        <Russian>Repair Hangar for $%1.</Russian>
        <Italian>Repair Hangar for $%1.</Italian>
      </Key>
      <Key ID="STR_WF_RH_RepairingHangar">
        <English>Repairing Hangar...</English>
        <French>Repairing Hangar...</French>
        <German>Repairing Hangar...</German>
        <Russian>Repairing Hangar...</Russian>
        <Italian>Repairing Hangar...</Italian>
      </Key>
      <Key ID="STR_WF_RH_RepairingHangarDone">
        <English>Done.</English>
        <French>Done.</French>
        <German>Done.</German>
        <Russian>Done.</Russian>
        <Italian>Done.</Italian>
      </Key>
      <Key ID="STR_WF_RH_NoEnoughMoney">
        <English>No enough money.</English>
        <French>No enough money.</French>
        <German>No enough money.</German>
        <Russian>No enough money.</Russian>
        <Italian>No enough money.</Italian>
      </Key>
      <Key ID="STR_WF_RH_IsNotDamaged">
        <English>Hangar is not damaged.</English>
        <French>Hangar is not damaged.</French>
        <German>Hangar is not damaged.</German>
        <Russian>Hangar is not damaged.</Russian>
        <Italian>Hangar is not damaged.</Italian>
      </Key>
Вроде ничего не забыл

Код:
File List:
=========================
\Client\Action\Action_RepairHangar.sqf
\Client\PVFunctions\RepairHangar.sqf
\Client\Init\Init_Client.sqf
\Client\GUI\GUI_Respawn.sqf
\Client\Functions\Client_fnc_RH_CheckActionMenuConditions.sqf
\Client\Functions\Client_fnc_RH_GetRepairZoneIDByCoords.sqf
\Server\PVFunctions\RequestRepairHangar.sqf
\Common\Init\Init_PublicVariables.sqf
\Common\Init\Init_Common.sqf
\Common\Functions\Common_fnc_RH_GetBuildingsByID.sqf
\Common\Functions\Common_fnc_RH_hasDestroyedParts.sqf
\stringtable.xml
Чинить могут инженеры (саперы?) и TL (командиры отделений), поставьте сами нужные классы. Цену починки тоже не забудьте поменять, а то 1 доллар. Здания восстанавливаются из пепла, под ними и вокруг них убирается вся кака, которая образовалась в результате разрушений.

PS Это для Черноруссии. Для Такистана нужно добавить координаты ангаров, на подобии тех что уже добавлены. Так что это вам не hangar setDamage 0 и всё само собой заработало

Видео, демонстрирующее работу скриптов:

Последний раз редактировалось Prodavec; 31.03.2012 в 03:18. Причина: Двойной ответ
Prodavec вне форума   Ответить с цитированием
Сказали спасибо (3):
Canoptikuz (04.04.2012), Кирпич (15.04.2012), Enki1 (29.03.2012)
Старый 02.04.2012, 19:51   #22
Enki1
Младший сержант
 
Регистрация: 29.04.2010
Сообщений: 87
Сказал cпасибо: 35
Поблагодарили 28 раз в 17 сообщениях
Появились еще вопросы...
1. Что-то пока не удается запустить, вроде все сделал как описано.
Только в файле GUI_Respawn.sqf не было строки
Options = player addAction ["<t color='#F8D664'>" + (localize "STR_WF_Options") + "</t>","Client\Action\Action_Menu.sqf", "", 1, false, true, "", ""];
Добавил ее, может не стоило?
А в файле Init_Client.sqf вместо
Options = player addAction ["<t color='#F8D664'>" + (localize "STR_WF_Options") + "</t>","Client\Action\Action_Menu.sqf", "", 1, false, true, "", ""];
Была строка
Options = player addAction ["<t color='#42b6ff'>" + (localize "STR_WF_Options") + "</t>","Client\Action\Action_Menu.sqf", "", 1, false, true, "", "_target == player"]; не знаю, насколько это значимо.
Но запускал, - в менюшке слева, при приближении к ангару надпись о его ремонте не появляется... уже поперепроверял все... в основном на схожесть (чтоб не оказалось ошибки при переносе), ну и что понял - в скрипте, просмотрел... При запуске игры никаких ошибок вроде не выдает, в ярлыке -showScriptErrors тоже молчит,... Вот думаю, что еще проверить...

2. И еще, ... не получается опять запустить черно в редакторе или в лане, доходит до загрузки, когда нажимаешь "далее" и должно появиться меню выбора командира, - черный экран и надпись "загрузка" и все...
Это появилось после того как сделал ошибку с городами (дважды прописал 1 город), позавчера с этим вроде разобрался: удалил миссию Черно а2ру из всех папок редакторов, вообще из армы (миссии не а2ру - работают), удалил файл arma2oa.RPT потом снова добавил в папку редактора миссию а2ру черно, и запустилась! Потом вчера, добалял скрипты Продавца для ангара, тестил, миссия запускалась, только пока не получилось чтоб в меню появлялось это восстановление. А сегодня снова не грузит а2ру((( именно черно не запускается, а такистан, утес, заграбад - без проблем. Снова почистил все - не помогло, в файле arma2oa.RPT пишет:

Скрытый текст

"[WFBE (INIT)][frameno:6915 | ticktime:134.59] Init_Server (Delayed): Server Module - [Done]"
"[WFBE (INIT)][frameno:6915 | ticktime:134.59] Init_Server (Delayed): Ressources Module - [Done]"
"time=11.879; Buy=2; Sell=3; Place=2; Cancel=2; Take=3; Drop=2; "
"[WFBE (WARNING)][frameno:7112 | ticktime:139.702] Init_Client: Client Enki (side: EAST) Pending... no ACK answer from server were received, sending a new request..."
"[WFBE (INFORMATION)][frameno:7150 | ticktime:140.705] Server_VoteForCommander: WEST Commander = AI Commander."
"[WFBE (INFORMATION)][frameno:7189 | ticktime:141.72] Server_VoteForCommander: EAST Commander = AI Commander."
"time=17.244; Buy=3; Sell=6; Place=3; Cancel=3; Take=6; Drop=3; "
"[WFBE (WARNING)][frameno:7350 | ticktime:146.024] Init_Client: Client Enki (side: EAST) Pending... no ACK answer from server were received, sending a new request..."
"time=22.254; Buy=4; Sell=8; Place=4; Cancel=4; Take=8; Drop=4; "
"[WFBE (WARNING)][frameno:7554 | ticktime:151.42] Init_Client: Client Enki (side: EAST) Pending... no ACK answer from server were received, sending a new request..."
"time=27.351; Buy=5; Sell=10; Place=5; Cancel=5; Take=10; Drop=5; "
"[WFBE (WARNING)][frameno:7758 | ticktime:156.825] Init_Client: Client Enki (side: EAST) Pending... no ACK answer from server were received, sending a new request..."
"time=32.382; Buy=6; Sell=12; Place=6; Cancel=6; Take=12; Drop=6; "
"[WFBE (WARNING)][frameno:7964 | ticktime:162.277] Init_Client: Client Enki (side: EAST) Pending... no ACK answer from server were received, sending a new request..."
"time=37.409; Buy=7; Sell=14; Place=7; Cancel=7; Take=14; Drop=7; "

и т.д....
[свернуть]


3. И последний вопрос, как узнать координаты объекта?

Последний раз редактировалось Enki1; 02.04.2012 в 19:53. Причина: Двойной ответ
Enki1 вне форума   Ответить с цитированием
Старый 02.04.2012, 19:54   #23
Prodavec
Подполковник
 
Аватар для Prodavec
 
Регистрация: 23.07.2009
Сообщений: 2,358
Сказал cпасибо: 268
Поблагодарили 915 раз в 549 сообщениях
Уезжаю в зал, так что по-быстрому: проверить соответствует ли класс твоего персонажа, тому классу, которому эта менюшка разрешена:

\Client\Init\Init_Client.sqf
\Client\GUI\GUI_Respawn.sqf

Код:
_rh_engineers =
[
	"USMC_SoldierS_Engineer",
	"MVD_Soldier_TL"
];
if ((typeOf player) in _rh_engineers) then
{
....
	player addAction [format [localize "STR_WF_RH_RepairHangar", 1], "Client\Action\Action_RepairHangar.sqf", [], 99, false, true, "", "call fnc_RH_CheckActionMenuConditions"];
};
"USMC_SoldierS_Engineer"
и
"MVD_Soldier_TL"

Для тестирования можно меню разрешить всем классам, строку
Код:
if ((typeOf player) in _rh_engineers) then
заменить на
Код:
if (true) then
Это так, чисто что в голову пришло, в код не лазил, так что может быть дело в другом.

Если не получится, по-другому по-пробуем

Координаты:
getPosATL object; // относительно уровня земли
getPosASL object; // относительно уровня моря

например:
Код:
player sideChat (getPosATL player);
выведет координаты игрока.

А вот для ближайшего в радиусе 20 метров здания:
Код:
player sideChat getPosATL ((nearestObjects [getPosATL player, ["Building"], 20]) select 0);
на счёт городов, сложно сказать, без "обследования" посредством колоноскопии не обойтись

всё уехал....

Последний раз редактировалось Prodavec; 02.04.2012 в 19:58.
Prodavec вне форума   Ответить с цитированием
Сказал спасибо (1):
Enki1 (02.04.2012)
Старый 03.04.2012, 21:42   #24
55й
Старший сержант
 
Аватар для 55й
 
Регистрация: 05.09.2011
Сообщений: 229
Сказал cпасибо: 91
Поблагодарили 111 раз в 54 сообщениях
Отправить сообщение для 55й с помощью ICQ
Ув.ПРОДАВЕЦ
ты наш спаситель в этой ветке
У меня вот пришла в голову такая идея только ты сможешь наверно помочь
на ПВЕ есть такая фишка как "вырыть окоп" в меню действий юнита. ну делается "Fort_EnvelopeSmall" так вот можно ли создать что то подобное только из земли за минуту например вырастал "Land_BagFenceLong" ну если не вырастал то хотя бы шел таймер постройки+анимация которую можно отменить кнопкой Х например
и еще например я могу ставить не только стену с мешками из песка но и бункер, естественно больше занимает строительство, но если ко мне подойдут игроки и нажмут тоже строить бункер то скорость постройки увеличиться и мы поставим 1н бункер(они как бы мне помогут это делать)
ну и всё это под МП
55й вне форума   Ответить с цитированием
Старый 03.04.2012, 22:35   #25
FenechkA
Майор
 
Аватар для FenechkA
 
Регистрация: 02.04.2011
Адрес: Чита, Забайкалье
Сообщений: 1,918
Сказал cпасибо: 497
Поблагодарили 1,375 раз в 775 сообщениях
прям варкрафт какойто, один работник так строит, двое быстрее, а гопка вопше за пару сек
FenechkA вне форума   Ответить с цитированием
Старый 03.04.2012, 23:41   #26
55й
Старший сержант
 
Аватар для 55й
 
Регистрация: 05.09.2011
Сообщений: 229
Сказал cпасибо: 91
Поблагодарили 111 раз в 54 сообщениях
Отправить сообщение для 55й с помощью ICQ
и что тут веселого ты нашел ?
55й вне форума   Ответить с цитированием
Старый 04.04.2012, 08:25   #27
FenechkA
Майор
 
Аватар для FenechkA
 
Регистрация: 02.04.2011
Адрес: Чита, Забайкалье
Сообщений: 1,918
Сказал cпасибо: 497
Поблагодарили 1,375 раз в 775 сообщениях
если не играл, не понять

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

Последний раз редактировалось FenechkA; 04.04.2012 в 08:26. Причина: Двойной ответ
FenechkA вне форума   Ответить с цитированием
Сказал спасибо (1):
55й (04.04.2012)
Старый 04.04.2012, 14:46   #28
Prodavec
Подполковник
 
Аватар для Prodavec
 
Регистрация: 23.07.2009
Сообщений: 2,358
Сказал cпасибо: 268
Поблагодарили 915 раз в 549 сообщениях
Ну можно прикинуть алгоритм, самое элементарное что придумал и с заделом на будущую модернизацию.

Предварительно сделать удаленный вызов процедур, как в Warfare и иных крупных проектах, чтобы можно было вызвать функцию на другой машине, передав ей аргументы. Это как один из элементов инфрастуктуры. Создание требует некоторого времени.

1. Игроку, который что-то может построить (далее "Строитель"), добавляем пункт меню Build, убираем его после нажатия, добавляем "Continue"

2. Когда Строитель жмет Build, отправляется запрос на сервер через удалённый вызов процедур, содержащий в качестве аргументов: самого Строителя, координаты постройки, класс объекта постройки.

3. Сервер принимает запрос и выполняет ряд действий:
  • создаёт объект, погруженный в землю
  • через удаленный вызов процедур всем игрокам добавляется меню действий "Continue", привязанное к объекту
  • новый объект заносится в базу данных мониторинга, которая отслеживает в цикле с 1-2-3 секундой задержкой список состояния всех объектов и определяет построен объект или нет. Если недостроенных построек нет - цикл завершается, если появляется - вновь инициируется по первому запросу.
  • Отслеживается таймаут постройки - если стройка давно не обновлялась, не достраивалась, на нее забили - отменить ее мониторинг и удалить всем менюшки "Continue" для этого здания через удаленный вызов процедур
  • Сервер выполняет визуализацию действий

4. Теперь каждый игрок (далее "Помощник") может подойти к объекту и выбрать "Continue", чтобы включится в процесс постройки, а Строитель и вовсе может покинуть зону постройки (убежать, его убили, обрыв связи).

5. Помощник кликает по "Continue" и из объекта берется публичная переменная, добавляется к ней некое число, например +10% к постройке, другой помощник делается то же самое, в результате их усилия складываются. Каждый записывает число в переменную объекта, делая ее публичной (building setVariable ["Progress", _progress, true];

6. Окончание постройки определяет сервер по достижению "Progress" - 100%, в вышеупомянутом цикле мониторинга завершается мониторинг и удаляются всем менюшки "Continue"

Слабые моменты: сервер мониторит здание или здания в цикле, а это может потреблять ресурсы при большом цикле и малой задержке, возможно лучше клиент будет определять статус постройки и если "Progress" достиг пика - через удаленный вызов процедур сообщить серверу об этом.

Еще момент связанный с самой стройкой, setVariable публикует переменную, которая рассылается по сети в каждый цикл постройки. Менее критично, т.к. стройка временна, не все клиенты (скажем 10-20 человек) будут строить одно строение и пакет не очень большой.

Вот мысль: игроки проверяют Progress и сами приподнимают здания над землей, достигнув 100%, инфа сообщается на сервер и он окончательно ВЫРВАНИВАЕТ здание на замле. Зачем: два игрока строят здание: у обоих 90%, одновременно нажали "Continue", в результате здание приподнялось НАД землей, т.к. готово на 110%, его надо обратно опустить к 100% Либо всегда высоту поднимать до 80-90, а потом уже по достижению постройки, сервак через удаленный вызов процедур "доподнимет" здание до 0 метров относительно земли. Этот метод исключит постоянный цикл на сервере, проверяющий массив зданий и в зависимости от состояние определяет их высоту или создает какие-то эффекты.

А можно и еще иначе, как с базами данных: игрок через удаленный вызов процедур на сервер отправляет свои +10 копеек (про setVariable забываем), которые становятся в очередь обработки. За каждый вызов обрабатывается очередь, по достижению 100% все необработанные запросы отсеиваются, здание определяется как "достроенное", менюшки и прочее всё удаляется. В любом случае это требует отлично работающей, хорошо оптимизированной маложрущей трафик/ресусы системы вызова процедур, т.к. минус этого метода - каждый цикл постройки Помощника в эфир флудится инфа что он вложил свои +10% постройки в здание.

Можно без флуда, скажем определять высоту объект относительно земли и по ней судить о прогрессе постройки: если она выше 0 - прекратить стройку, здание подогнать под 0, точно по земле, серваку сказать чтобы убрал всем менюшки. Но как я грил - может быть ситауция, когда здание в воздухе приподнимется на несколько сантиметров / десятков сантиметров, если толпа одновременно будет строить Зиггурат

Вообщем тут есть над чем подумать в плане оптимизации использования ресурсов.

PS Сори за ошибки в орфографии, спешил, на работе.
Кто шарит в скриптах, покритикуйте)

Последний раз редактировалось Prodavec; 04.04.2012 в 15:05.
Prodavec вне форума   Ответить с цитированием
Сказал спасибо (1):
55й (04.04.2012)
Старый 04.04.2012, 16:24   #29
55й
Старший сержант
 
Аватар для 55й
 
Регистрация: 05.09.2011
Сообщений: 229
Сказал cпасибо: 91
Поблагодарили 111 раз в 54 сообщениях
Отправить сообщение для 55й с помощью ICQ
я теперь не рад что спросил
ладно давайте без "варкрафта"
одни чел строит стену мешки с песком, у него идет таймер постройки 60 секунд на экране. и появляется неведомая фигня которая означает что это чтото строится)))
если он выйдет далеко от постройки ему скажет "вы далеко собрались..." и через время постройка оборвется, если вернется к строению то постройка продолжится, при завершении строительства ,передаётся серверу что всё готово там то и он спавнит мешки с песком

Последний раз редактировалось 55й; 04.04.2012 в 16:29.
55й вне форума   Ответить с цитированием
Старый 07.04.2012, 20:41   #30
Enki1
Младший сержант
 
Регистрация: 29.04.2010
Сообщений: 87
Сказал cпасибо: 35
Поблагодарили 28 раз в 17 сообщениях
В общем, пока результаты моей прикрутки скрипта ангара такие: Перепроверил инженеров, действительно один отличался, нужны были оказывается
"USMC_SoldierS_Engineer" и "TK_Soldier_Engineer_EP1". Это исправил...

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

Далее выяснил, что файла \Client\GUI\GUI_Respawn.sqf в той миссии, что я мучаю нет, есть \Client\GUI\GUI_Menu_Respawn.sqf, а в нем нет строки
Options = player addAction ["<t color='#F8D664'>" + (localize "STR_WF_Options") + "</t>","Client\Action\Action_Menu.sqf", "", 1, false, true, "", ""];, вот тут я не знаю, что правильней, либо создать файл как , Продавец, ты написал, и в нем прописать и отсутствующую строку и далее твой скрипт, ... либо все это вставить в GUI_Menu_Respawn.sqf? Попробовал оба варианта.

Итог - скрипт ангаров заработал, точнее стало появляться в меню - отремонтировать ангар, при целом ангаре, стало писать, что он не разрушен, но при его подрыве, выбирая в меню "починить ангар" ничего не происходит... Вот думаю, может это из-за файла Menu_Respawn.sqf (как тут правильно поступить с ним?), а может где-то еще что-то проверить нужно?
Enki1 вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 10:04. Часовой пояс GMT +3.

Powered by vBulletin®
Copyright ©2000 - 2020, vBulletin Solutions, Inc.

GMNET.RU © 2003-2020 || Дизайн студии vR