Перейти к содержимому


Фотография

Пару вопросов по скриптам


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 73

#1 OFFLINE   dimaS1k

dimaS1k

    Ефрейтор

  • Пользователи
  • 68 сообщений
  • Откуда:Moscow

Отправлено 13 August 2015 - 15:38

День добрый,
Делаю деадматч на вертолетах, застрял на моменте со спавном техники. В скриптах я не силен, да можно сказать и не шарю.
Вообщем вот что я набросал.
Файл onPlayerRespawn.sqf

_newUnit = _this select 0;
_oldUnit = _this select 1;
_mrkSpawn = "respawn_east"; // Имя маркер
_distSpawn = 300; 	// Дистанция
_typeVeh = "B_Heli_Light_01_armed_F"; // Тип техники

_vehicle = createVehicle [_typeVeh, getMarkerPos _mrkSpawn, [], _distSpawn, "FLY"]; // Cпавним верт в нужном радиусе от маркера
_vehicle setObjectTextureGlobal [0,'#(argb,8,8,3)color(1,0,0,1)']; // Текстура вертолета (Красный)
_vehicle setObjectTextureGlobal [1,'#(argb,8,8,3)color(1,0,0,1)']; // Текстура вертолета (Красный)

[_newUnit] execVM "scripts\player_init.sqf"; // Выдаем экипировку пилоту
_newUnit moveInDriver _vehicle;		// Игрока сажаем за пилота

_vehicle lock true;			// Блокируем технику
_vehicle setVehicleAmmo 1;		// побывали на сладах РАВ
_vehicle setFuel 1;			// заскочили на ГСМ склад
_vehicle setDamage 0;			// заодно и ТРМка подъезжала

Никак не могу сообразить, как заставить появляться вертолет в радиусе 300м от маркера и что бы он смотрел на него носом.

 

И еще никак не могу разобраться с зоной ограничения, хочется ограничить высоту на 200м и что бы игроки не могли отлететь от маркера дальше чем на 400м. Как это можно реализовать? Например вылазиет уведомление по типу ["DMSK_HEIGHT",[localize "STR_DMSK_NTF_HEIGHT"]] call BIS_fnc_showNotification;  и после него начинает дамажить игрока и вертолет на 0.3 каждую секунду.


Сообщение отредактировал dimaS1k: 13 August 2015 - 17:30

  • 0

#2 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1792 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 13 August 2015 - 17:25

И еще никак не могу разобраться с зоной ограничения, хочется ограничить высоту на 200м и что бы игроки не могли отлететь от маркера дальше чем на 400м. Как это можно реализовать? Например вылазиет уведомление по типу ["DMSK_HEIGHT",[localize "STR_DMSK_NTF_HEIGHT"]] call BIS_fnc_showNotification; и после него начинает дамажить игрока и вертолет на 0.3 каждую секунду.

Нужно у каждого игрока выполнить этот код:
player_init = compileFinal (preprocessFileLineNumbers "scripts\player_init.sqf"); // Предварительно обрабатываем, компилируем и присваиваем код в файле переменной, чтобы последующий вызов происходил быстрее

helicopterDestruction = {
	["DMSK_HEIGHT", [localize "STR_DMSK_NTF_HEIGHT"]] call BIS_fnc_showNotification;

	while {true} do {
		sleep 1;

		_helicopter = vehicle player;

		player setDamage ((damage player) + 0.3);
		_helicopter setDamage ((damage _helicopter) + 0.3);
	};
};

_trigger = createTrigger ["EmptyDetector", getMarkerPos "respawn_east", false];

_trigger triggerAttachVehicle [player];

_trigger setTriggerActivation ["VEHICLE", "PRESENT", true];
_trigger setTriggerArea [200, 200, 0, false]; // Почему 200, а не 400? Потому что нужно указывать полуразмеры.
_trigger setTriggerStatements [
	"(alive player) and {!this or {((getPosATL player) select 2) > 200}}", // Триггер будет активироваться, если игрок жив, не в зоне триггера или на высоте более 200 м
	"helicopterDestructionScriptHandler = [] spawn helicopterDestruction", // Запускаем код уничтожения
	"terminate helicopterDestructionScriptHandler" // Останавливаем код уничтожения
];

Никак не могу сообразить, как заставить появляться вертолет в радиусе 300м от маркера и что бы он смотрел на него носом.

Для этого я написал этот вариант onPlayerRespawn.sqf:
#define DIST 300

player call player_init;

_angle = floor (random 360);
_markerPosition = getMarkerPos "respawn_east";

_vehicle = createVehicle ["B_Heli_Light_01_armed_F", _markerPosition, [], DIST, "FLY"]; // Транспорт будет создан где-то в зоне с центром _markerPosition и радиусом DIST

_position = [ // Позиция на расстоянии 300 м от _markerPosition
	(_markerPosition select 0) + (sin _angle) * DIST,
	(_markerPosition select 1) + (cos _angle) * DIST,
	100 // Высота
];
_direction = [_position, _markerPosition] call BIS_fnc_dirTo; // Угол, на который нужно повернуться, чтобы смотреть с _position на _markerPosition

_vehicle setDir _direction;
_vehicle setPosATL _position;

_vehicle setObjectTextureGlobal [0,'#(argb,8,8,3)color(1,0,0,1)'];
_vehicle setObjectTextureGlobal [1,'#(argb,8,8,3)color(1,0,0,1)'];

player moveInDriver _vehicle;

_vehicle lock true;
setDamage, setFuel и setVehicleAmmo я не использовал, поскольку транспорт создаётся целый, с полным баком и боекомплектом.

Сообщение отредактировал Schatten: 13 August 2015 - 19:24

  • 0

#3 OFFLINE   dimaS1k

dimaS1k

    Ефрейтор

  • Пользователи
  • 68 сообщений
  • Откуда:Moscow

Отправлено 13 August 2015 - 17:43


Огромное спасибо, но вот теперь файл player_init.sqf жалует на ошибку в нем. Он с таким содержимым:

_unit = _this select 0;

removeAllWeapons _unit;
removeAllItems _unit;
removeAllAssignedItems _unit;
removeUniform _unit;
removeVest _unit;
removeBackpack _unit;
removeHeadgear _unit;
removeGoggles _unit;

_unit forceAddUniform "U_BG_Guerilla2_3";
_unit addHeadgear "H_Cap_headphones";
_unit addGoggles "G_Aviator";

_unit linkItem "ItemMap";
_unit linkItem "ItemRadio";
_unit linkItem "ItemGPS";

Я так понимаю _unit тупо заменить на this?


Сообщение отредактировал dimaS1k: 13 August 2015 - 17:44

  • 0

#4 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1792 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 13 August 2015 - 17:50

Я ещё внёс несколько изменений в решение, так что сверьтесь.

Огромное спасибо, но вот теперь файл player_init.sqf жалует на ошибку в нем. Я так понимаю _unit тупо заменить на this?

Во-первых, добавьте в конце player_init.sqf "true":
...
_unit linkItem "ItemGPS";

true
Во-вторых, нужно или вызывать функцию так:
[player] call player_init;
или в player_init.sqf убрать первую строчку и заменить _unit на _this,
или в player_init.sqf убрать первую строчку и заменить _unit на player и вызывать так:
call player_init;

Сообщение отредактировал Schatten: 13 August 2015 - 17:54

  • 0

#5 OFFLINE   dimaS1k

dimaS1k

    Ефрейтор

  • Пользователи
  • 68 сообщений
  • Откуда:Moscow

Отправлено 13 August 2015 - 18:04

Я ещё внёс несколько изменений в решение, так что сверьтесь.

Огромное спасибо, но вот теперь файл player_init.sqf жалует на ошибку в нем. Я так понимаю _unit тупо заменить на this?

Во-первых, добавьте в конце player_init.sqf "true":
...
_unit linkItem "ItemGPS";

true
Во-вторых, нужно или вызывать функцию так:
[player] call player_init;
или в player_init.sqf убрать первую строчку и заменить _unit на _this,
или в player_init.sqf убрать первую строчку и заменить _unit на player и вызывать так:
call player_init;

Все сделал, вроде все работает. Правда в МП пока не скем проверить. 
Можешь еще подскзать со скриптом на ремонт транспорта? На карте уже осталось только расположеные юниты маркер и триггер на ремонт.
вот как бы мне его тоже убрать и так же встроить в initPlayerLocal?

 

вот его условие

("Helicopter" countType thislist  > 0) && ((getpos (thislist select 0)) select 2 < 1)

а вот активация 

_xhandle= [(thislist select 0)] execVM "scripts\repair.sqf";

Сейчас запустил в мультиплеере и почему то не получаею урон при выходе из зоны, хотя сообщение вылезло.


  • 0

#6 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1792 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 13 August 2015 - 18:16

Можешь еще подскзать со скриптом на ремонт транспорта? На карте уже осталось только расположеные юниты маркер и триггер на ремонт.
вот как бы мне его тоже убрать и так же встроить в initPlayerLocal?

А может лучше просто разместить реммашины на карте?

Сейчас запустил в мультиплеере и почему то не получаею урон при выходе из зоны, хотя сообщение вылезло.

Надо прибавлять урон, а не отнимать:
player setDamage ((damage player) + 0.3);
_helicopter setDamage ((damage _helicopter) + 0.3);

  • 0

#7 OFFLINE   dimaS1k

dimaS1k

    Ефрейтор

  • Пользователи
  • 68 сообщений
  • Откуда:Moscow

Отправлено 13 August 2015 - 18:21

 

Можешь еще подскзать со скриптом на ремонт транспорта? На карте уже осталось только расположеные юниты маркер и триггер на ремонт.
вот как бы мне его тоже убрать и так же встроить в initPlayerLocal?

А может лучше просто разместить реммашины на карте?

Сейчас запустил в мультиплеере и почему то не получаею урон при выходе из зоны, хотя сообщение вылезло.

Надо прибавлять урон, а не отнимать:
player setDamage ((damage player) + 0.3);
_helicopter setDamage ((damage _helicopter) + 0.3);

 

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание


 

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

+
 

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


Сообщение отредактировал dimaS1k: 13 August 2015 - 18:31

  • 0

#8 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1792 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 13 August 2015 - 18:30

Тогда создаём триггер и настраиваем триггер для ремзоны.
Выражения триггера:
_trigger setTriggerStatements [
	"(alive player) and {this} and {((getPosATL (vehicle player)) select 2) < 0.1}",
	"(vehicle player) setDamage 0",
	""
];
Кстати, стоит везде заменить getPos на getPosATL для определения позиции над уровнем земли.

Сообщение отредактировал Schatten: 13 August 2015 - 20:25

  • 0

#9 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1792 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 13 August 2015 - 18:54

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

Миссию можно глянуть?
  • 0

#10 OFFLINE   dimaS1k

dimaS1k

    Ефрейтор

  • Пользователи
  • 68 сообщений
  • Откуда:Moscow

Отправлено 13 August 2015 - 19:05

да, конечно 

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

триггер 2 я еще не сделал пока
можешь еще посмотреть, почему не работают "новые" маркеры задания? В дискрипшен прописал, а всеравно старые.


Сообщение отредактировал dimaS1k: 13 August 2015 - 19:06

  • 0

#11 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1792 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 13 August 2015 - 19:27

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

Нужно внести изменения в файлы, в соответствии с моим сообщением.
 

можешь еще посмотреть, почему не работают "новые" маркеры задания? В дискрипшен прописал, а всеравно старые.

К сожалению, здесь помочь не могу, поскольку не работал с такими маркерами.
  • 0

#12 OFFLINE   dimaS1k

dimaS1k

    Ефрейтор

  • Пользователи
  • 68 сообщений
  • Откуда:Moscow

Отправлено 13 August 2015 - 19:33

 

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

Нужно внести изменения в файлы, в соответствии с моим сообщением.
 

можешь еще посмотреть, почему не работают "новые" маркеры задания? В дискрипшен прописал, а всеравно старые.

К сожалению, здесь помочь не могу, поскольку не работал с такими маркерами.

 

я тут попробывал создать 2 триггер, но он почему то не работает:

helicopterDestruction = {
	["DMSK_GAME_AREA", [localize "STR_DMSK_NTF_OUTZONE"]] call BIS_fnc_showNotification;

	while {true} do {
		sleep 1;

		_helicopter = vehicle player;

		player setDamage ((damage player) + 0.3);
		_helicopter setDamage ((damage _helicopter) + 0.3);
	};
};

helicopterRepair = {
	["DMSK_REPAIR_VEH", [localize "STR_DMSK_NTF_REPAIR"]] call BIS_fnc_showNotification;

	while {true} do {
		sleep 1;

		_helicopter = vehicle player;

		player setDamage ((damage player) - 0.1);
		_helicopter setDamage ((damage _helicopter) - 0.1);
//		_helicopter setVehicleAmmo ((setVehicleAmmo _helicopter) - 0.3);
//		_helicopter setFuel ((setFuel _helicopter) - 0.1);		
	};
};

_trigger = createTrigger ["EmptyDetector", getMarkerPos "respawn_east", false];

_trigger triggerAttachVehicle [player];

_trigger setTriggerActivation ["VEHICLE", "PRESENT", true];
_trigger setTriggerArea [400, 400, 0, false]; // Почему 400, а не 800? Потому что нужно указывать полуразмеры.
_trigger setTriggerStatements [
	"!this or {((getPos player) select 2) > 200}", // Триггер будет активироваться, если игрок не в зоне триггера или на высоте более 200 м
	"helicopterDestructionScriptHandler = [] spawn helicopterDestruction", // Запускаем код уничтожения
	"terminate helicopterDestructionScriptHandler" // Останавливаем код уничтожения
];

_trigger2 = createTrigger ["EmptyDetector", getMarkerPos "respawn_east", false];

_trigger2 triggerAttachVehicle [player];

_trigger2 setTriggerActivation ["VEHICLE", "PRESENT", true];
_trigger2 setTriggerArea [400, 400, 0, false]; // Почему 400, а не 800? Потому что нужно указывать полуразмеры.
_trigger2 setTriggerStatements [
	"!this and {(getPos (vehicle player)) < 0.1}", 
	"helicopterRepairScriptHandler = [] spawn helicopterRepair", // Запускаем код ремонта
	"terminate helicopterRepairScriptHandler" // Останавливаем код ремонта
];

как правильно добавить, перезарядку и заправку еще?


  • 0

#13 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1792 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 13 August 2015 - 19:45

я тут попробывал создать 2 триггер, но он почему то не работает

Потому что неправильное выражение активации. Нужно такое:
this and {(getPosATL (vehicle player)) < 0.1}
Т. е. триггер будет активироваться, если игрок в его зоне действия и находится у земли.

как правильно добавить, перезарядку и заправку еще?

_helicopter setFuel ((fuel _helicopter) + 0.1);
С перезарядкой сложнее, поэтому добавлю позже.
  • 0

#14 OFFLINE   dimaS1k

dimaS1k

    Ефрейтор

  • Пользователи
  • 68 сообщений
  • Откуда:Moscow

Отправлено 13 August 2015 - 20:01

Всю голову уже сломал, вроде все верно делаю, а он все равно не работает.

helicopterDestruction = {
	["DMSK_GAME_AREA", [localize "STR_DMSK_NTF_OUTZONE"]] call BIS_fnc_showNotification;

	while {true} do {
		sleep 1;

		_helicopter = vehicle player;

		player setDamage ((damage player) + 0.1);
		_helicopter setDamage ((damage _helicopter) + 0.1);
	};
};

helicopterRepair = {
	["DMSK_REPAIR_VEH", [localize "STR_DMSK_NTF_REPAIR"]] call BIS_fnc_showNotification;

	while {true} do {
		sleep 1;

		_helicopter = vehicle player;

		player setDamage ((damage player) - 0.2);
		_helicopter setDamage ((damage _helicopter) - 0.2);
		_helicopter setFuel ((fuel _helicopter) + 0.1);		
	};
};

_trigger = createTrigger ["EmptyDetector", getMarkerPos "respawn_east", false];
_trigger triggerAttachVehicle [player];
_trigger setTriggerActivation ["VEHICLE", "PRESENT", true];
_trigger setTriggerArea [400, 400, 0, false]; // Почему 400, а не 800? Потому что нужно указывать полуразмеры.
_trigger setTriggerStatements [
	"(alive player) and {!this or {((getPosATL player) select 2) > 200}}", // Триггер будет активироваться, если игрок жив, не в зоне триггера или на высоте более 200 м
	"helicopterDestructionScriptHandler = [] spawn helicopterDestruction", // Запускаем код уничтожения
	"terminate helicopterDestructionScriptHandler" // Останавливаем код уничтожения
];

_trigger2 = createTrigger ["EmptyDetector", getMarkerPos "respawn_east", false];
_trigger2 triggerAttachVehicle [player];
_trigger2 setTriggerActivation ["VEHICLE", "PRESENT", true];
_trigger2 setTriggerArea [400, 400, 0, false]; // Почему 400, а не 800? Потому что нужно указывать полуразмеры.
_trigger2 setTriggerStatements [
	"!this and {(getPosATL (vehicle player)) < 0.1}",
	"helicopterRepairScriptHandler = [] spawn helicopterRepair", // Запускаем код ремонта
	"terminate helicopterRepairScriptHandler" // Останавливаем код ремонта
];

  • 0

#15 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1792 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 13 August 2015 - 20:05

Нужно восклицательный знак перед this в условии активации второго триггера убрать.
  • 0

#16 OFFLINE   dimaS1k

dimaS1k

    Ефрейтор

  • Пользователи
  • 68 сообщений
  • Откуда:Moscow

Отправлено 13 August 2015 - 20:11

Нужно восклицательный знак перед this в условии активации второго триггера убрать.

без знака выдает ошибку перед  < 0.1 и так же она выскакивает при смерти (разбивании об землю и тд)

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание


Сообщение отредактировал dimaS1k: 13 August 2015 - 20:12

  • 0

#17 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1792 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 13 August 2015 - 20:24

(alive player) and {this} and {((getPosATL (vehicle player)) select 2) < 0.1}

  • 0

#18 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 13 August 2015 - 20:36

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

вместе с измерением скорости
  • 0

#19 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1792 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 13 August 2015 - 20:47

vlad333000,
Судя по заметкам, это ненадёжный вариант. Мой вариант меня ещё не подводил.
  • 0

#20 OFFLINE   dimaS1k

dimaS1k

    Ефрейтор

  • Пользователи
  • 68 сообщений
  • Откуда:Moscow

Отправлено 13 August 2015 - 20:57

(alive player) and {this} and {((getPosATL (vehicle player)) select 2) < 0.1}

Спасибо, работает. Осталось припендюрить перезарядку :)


  • 0




Яндекс.Метрика