Jump to content


Photo

addAction в MP


Best Answer Schatten , 14 September 2016 - 11:08

_den_,

[<unit>, {_this addAction ["Запустить скрипт","script2.sqf"]}] remoteExec ["call", 0, true]

Лучше так:
[_unit, ["Launch script", "script.sqf"]] remoteExec ["addAction", 0, true];

скрипт с таким содержимым выполнять не хочет:

deleteVehicle MySolder;
deleteGroup MyGroup;

Если сценарий запускается с помощью действия, добавленного командой addAction, то попробуйте так:
_target = _this select 0;

_group = group _target;

deleteVehicle _target;

_group remoteExec ["deleteGroup", _group];
Go to the full post


  • Please log in to reply
6 replies to this topic

#1 OFFLINE   _den_

_den_

    Рядовой

  • Пользователи
  • 14 posts

Posted 13 September 2016 - 19:56

Здравствуйте форумчане!

 

Простите меня за такой банальный, для знатоков, вопрос, но как реализовать addAction в мультиплеере?

 

Ситуация такая:

Есть горе скрипт script1.sqf с таким содержимым:

MyGroup = createGroup independent;
MySolder = MyGroup createUnit ["B_G_Soldier_F",[0,0,0],[],0,"FORM"];
MySolder disableAI "ALL";
MySolder setSpeaker "NoVoice";
MySolder allowDamage false;
MySolder setPos [3589.31,2178.99,0.411235];
MySolder setDir 268.781;
removeAllWeapons MySolder;
removeUniform MySolder;
removeHeadgear MySolder;
removeBackpack MySolder;
removeVest MySolder;
removeGoggles MySolder;
MySolder adduniform "U_I_C_Soldier_Para_4_F";
[MySolder, "REPAIR_VEH_KNEEL"] call BIS_fnc_ambientAnim;
MyAction = MySolder addAction ["Запустить скрипт","script2.sqf"];

Этот скрипт создает бота в определенном месте, переодевает, задает анимацию и добавляет кнопку.

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

создается 2 копии солдата, и addAction у каждого.

 

Как я понимаю скрипт выполняется дважды, на сервере и на клиенте походу... Или как то иначе.

 

Можно наверно сделать выполнение этого скрипта только на сервере через:

if (isServer) then {
[] execVM "script1.sqf"
};

Тогда все спамится нормально, вот только кнопка больше не появляется :(

Полазил по форумам богемии но прикрутить сюда чет не получается ничего.

 

Подскажите пожалуйста, как скриптом создать бота и добавить ему рабочую, у всех отображающуюся кнопку?

PS - Мультиплеер подразумевается сервер EXILE


Edited by _den_, 13 September 2016 - 19:56.

  • 0

#2 OFFLINE   vlad333000

vlad333000

    Полковник

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

Posted 13 September 2016 - 21:35

_den_,
[<unit>, {_this addAction ["Запустить скрипт","script2.sqf"]}] remoteExec ["call", 0, true]

  • 0

#3 OFFLINE   _den_

_den_

    Рядовой

  • Пользователи
  • 14 posts

Posted 14 September 2016 - 08:44

Спасибо большое!

 

Кнопка появилась, но вот скрипт с таким содержимым выполнять не хочет:

deleteVehicle MySolder;
deleteGroup MyGroup;

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

Не подскажите в чем проблема?

 


  • 0

#4 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1829 posts

Posted 14 September 2016 - 11:08   Best Answer

_den_,

[<unit>, {_this addAction ["Запустить скрипт","script2.sqf"]}] remoteExec ["call", 0, true]

Лучше так:
[_unit, ["Launch script", "script.sqf"]] remoteExec ["addAction", 0, true];

скрипт с таким содержимым выполнять не хочет:

deleteVehicle MySolder;
deleteGroup MyGroup;

Если сценарий запускается с помощью действия, добавленного командой addAction, то попробуйте так:
_target = _this select 0;

_group = group _target;

deleteVehicle _target;

_group remoteExec ["deleteGroup", _group];

Edited by Schatten, 14 September 2016 - 11:09.

  • 0

#5 OFFLINE   _den_

_den_

    Рядовой

  • Пользователи
  • 14 posts

Posted 14 September 2016 - 13:53

Schatten, большое Вам спасибо! :clapping:

Все отлично добавилось, и удалилось :)


  • 0

#6 OFFLINE   _den_

_den_

    Рядовой

  • Пользователи
  • 14 posts

Posted 15 September 2016 - 13:42

Ребят, а подскажите как сделать следующее:

 

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

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

 

А как сделать скрипт который все это потом сможет удалить?

Не важно в принципе как он будет вызван - важно как удалить группу объектов

созданных скриптом в мультиплеере.

 

Вариант предложенный Schatten удаляет объект к которому было добавлено действие, то есть 1 объект

 

  1. _target = _this select 0;
  2. _group = group _target;
  3. deleteVehicle _target;
  4. _group remoteExec ["deleteGroup", _group];

 

А как удалить не один объект в этом случае а множество, все то что было наспавнено скриптом?

 

Множество обычных команд deleteVehicle _veh; ведь не сработает или надо писать так?

_veh0 = _this select 0;
_veh1 = _this select 1;
_veh2 = _this select 2;
deleteVehicle _veh0;
deleteVehicle _veh1;
deleteVehicle _veh2;

Edited by _den_, 15 September 2016 - 14:00.

  • 0

#7 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1829 posts

Posted 15 September 2016 - 14:51

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

: объект, которому добавлено действие, - это _this select 0. Если хотите передать в сценарий обработки действия ещё какие-нибудь объекты, то их надо указать в третьем аргументе команды addAction и обращаться к ним в сценарии через "_this select 3".
Однако лучше при создании "декораций" сохранять их в глобальный массив, например, так
objects = [];

{
	_x spawn {
		_type = _this select 0;
		_position = _this select 1;

		_object = _type createVehicle _position;

		objects pushBack _object;
	};
}
forEach [
	[<type1>, <position1>],
	...
];
а потом удалять их, например, так:
{_x spawn {deleteVehicle _this}} forEach objects;

[] spawn {
	waitUntil {
		sleep 0.1;

		({isNull _x} count objects) == (count objects)
	};

	objects = nil;
};

Edited by Schatten, 15 September 2016 - 14:52.

  • 0




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