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


Фотография

moveInCargo MP


Лучший Ответ Schatten , 29 November 2015 - 18:37

В чем дело?

В неправильной организации миссии.

А если попробовать так?

 

initServer.sqf

plane flyinHeight 4000;

initPlayerLocal.sqf

execVM "scripts\loadout.sqf";

loadout.sqf

_string = "%1 execVM 'scripts\loadouts\%2.sqf'";

if (isServer) then {
	{
		_vehicleName = _x select 0;
		_scriptName = _x select 1;

		if (call (compile ("local " + _vehicleName))) then {call (compile (format [_string, _vehicleName, _scriptName]))};
	}
	forEach [
		["uLeader", "leader"],
		["uAssault1", "assault"],
		["uAssault2", "assault"],
		["uHeavy", "heavy_gunner"],
		["uSniper", "sniper"],
		["uMedic", "medic"]
	];

	{if (local _x) then {_x spawn {_this moveInCargo plane}}} foreach units uLeader;
}
else {
	_vehicleName = vehicleVarName player;

	_scriptName = switch (_vehicleName) do {
		case "uLeader": {"leader"};
		case "uAssault1": {"assault"};
		case "uAssault2": {"assault"};
		case "uHeavy": {"heavy_gunner"};
		case "uSniper": {"sniper"};
		case "uMedic": {"medic"};
	};

	call (compile (format [_string, _vehicleName, _scriptName]));

	player moveInCargo plane;
};

leader.sqf

removeAllWeapons _this;
_this addWeapon "...";
...
Перейти к сообщению


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

#1 OFFLINE   SomeOneAndrey

SomeOneAndrey

    Ефрейтор

  • Пользователи
  • 43 сообщений

Отправлено 29 November 2015 - 15:11

Привет всем. 

 

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

 

initPlayerLocal.sqf

waituntil {!isnil "bis_fnc_init"};
[] execVM "scripts\loadout.sqf";
[] execVM "scripts\intro_local.sqf";

loadout.sqf

[uLeader] execVM "scripts\loadouts\leader.sqf";
[uAssault1] execVM "scripts\loadouts\assault.sqf";
[uAssault2] execVM "scripts\loadouts\assault.sqf";
[uHeavy] execVM "scripts\loadouts\heavy_gunner.sqf";
[uSniper] execVM "scripts\loadouts\sniper.sqf";
[uMedic] execVM "scripts\loadouts\medic.sqf";

leader.sqf

this = _this select 0;
<экспортированный код из виртуального арсенала>

intro_local.sqf

plane flyinHeight 4000;
{_x moveInCargo plane} foreach units uLeader;

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

 


  • 0

#2 OFFLINE   Schatten

Schatten

    Капитан

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

Отправлено 29 November 2015 - 18:37   Лучший Ответ

В чем дело?

В неправильной организации миссии.

А если попробовать так?

 

initServer.sqf

plane flyinHeight 4000;

initPlayerLocal.sqf

execVM "scripts\loadout.sqf";

loadout.sqf

_string = "%1 execVM 'scripts\loadouts\%2.sqf'";

if (isServer) then {
	{
		_vehicleName = _x select 0;
		_scriptName = _x select 1;

		if (call (compile ("local " + _vehicleName))) then {call (compile (format [_string, _vehicleName, _scriptName]))};
	}
	forEach [
		["uLeader", "leader"],
		["uAssault1", "assault"],
		["uAssault2", "assault"],
		["uHeavy", "heavy_gunner"],
		["uSniper", "sniper"],
		["uMedic", "medic"]
	];

	{if (local _x) then {_x spawn {_this moveInCargo plane}}} foreach units uLeader;
}
else {
	_vehicleName = vehicleVarName player;

	_scriptName = switch (_vehicleName) do {
		case "uLeader": {"leader"};
		case "uAssault1": {"assault"};
		case "uAssault2": {"assault"};
		case "uHeavy": {"heavy_gunner"};
		case "uSniper": {"sniper"};
		case "uMedic": {"medic"};
	};

	call (compile (format [_string, _vehicleName, _scriptName]));

	player moveInCargo plane;
};

leader.sqf

removeAllWeapons _this;
_this addWeapon "...";
...

  • 0

#3 OFFLINE   SomeOneAndrey

SomeOneAndrey

    Ефрейтор

  • Пользователи
  • 43 сообщений

Отправлено 29 November 2015 - 19:05

 

В intro_local.sqf не одна строка. Чтобы тема была короче, я указал только проблемное место. Полное содержимое:

execVM "scripts\time_stop.sqf";
execVM "scripts\goon_snowstorm.sqf";

plane flyinHeight 4000;

{_x assignAsCargo plane; _x moveInCargo plane} foreach units uLeader;

playMusic "Intro";
0 fadeMusic 2;
0 fadeRadio 1.5;

Sleep 2;
HQ = [WEST, "BASE"];
HQ sideRadio "actor_a_1";
Sleep 4;
HQ sideRadio "actor_a_2";
Sleep 4; 
HQ sideRadio "actor_a_3";
Sleep 5; 
HQ sideRadio "actor_a_4";
Sleep 4; 
HQ sideRadio "actor_a_5";
Sleep 23; 
HQ sideRadio "actor_a_6";

Sleep 1; 
plane addAction ["Eject",{player action [ "getOut", vehicle player]},[],1,false,true,"","_this in _target"];
plane setVehicleLock "DEFAULT";

Sleep 5;
enableEnvironment False;
execVM "scripts\snow_sound.sqf";

Sleep 20;
{deleteVehicle _x;} forEach crew plane; 
deleteVehicle plane;

Sleep 30;
playMusic "LeadTrack02_F";
0 fadeMusic 0.3;

initPlayerLocal.sqf вроде бы вызывается только клиентом, зачем в вашем решении в loadout.sqf проверка на то, сервер ли это?

Зачем тут динамические методы? Задача не настолько массовая. Я так понимаю, Вы предлагаете использовать call вместо execVM, пойду попробовать.

 

Да и согласно вики бохемы - flyInHeight локальная функция.

Есть другие варианты решения проблемы? В чем собственно заключается проблема?


  • 0

#4 OFFLINE   Sa-Matra

Sa-Matra

    Ефрейтор

  • Пользователи
  • 97 сообщений

Отправлено 29 November 2015 - 19:20

Экипировка выдается как попало

this = _this select 0;
this будет глобальной переменной между всеми тредами которые вы сделали через execVM, отсюда и бардак что каждый раз все как попало.
  • 1

#5 OFFLINE   Schatten

Schatten

    Капитан

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

Отправлено 29 November 2015 - 19:26

Да и согласно вики бохемы - flyInHeight локальная функция.
Есть другие варианты решения проблемы? В чем собственно заключается проблема?

Проблема заключается в неправильной организации миссии.
В одиночной игре все объекты являются локальными по отношению к компу, на котором запущена миссия, поэтому можно пользоваться командами без ограничений. В сетевой же игре так не получится, поскольку некоторые команды требуют локальные аргументы, а некоторые глобальные.
В частности, команда flyInHeight принимает локальный агрумент. Это значит, что она должна быть выполнена там, где plane локален, т. е. на сервере, а не на компах игроков.
Т. о., при создании сетевой миссии нужно распределить "нагрузку" между клиентами и сервером.
 

initPlayerLocal.sqf вроде бы вызывается только клиентом, зачем в вашем решении в loadout.sqf проверка на то, сервер ли это?

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

Зачем тут динамические методы? Задача не настолько массовая. Я так понимаю, Вы предлагаете использовать call вместо execVM, пойду попробовать.

Здесь нет динамических методов, и я не предлагал использовать call вместо execVM.


Сообщение отредактировал Schatten: 29 November 2015 - 19:28

  • 0

#6 OFFLINE   SomeOneAndrey

SomeOneAndrey

    Ефрейтор

  • Пользователи
  • 43 сообщений

Отправлено 29 November 2015 - 20:12

Schatten, выходит, все боты являются локальными для сервера.

Значит, локально мне нужно выдавать экипировку только себе, на сервере же при старте игры выдать экипировку всем. Верно?


  • 0

#7 OFFLINE   Schatten

Schatten

    Капитан

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

Отправлено 29 November 2015 - 20:23

Schatten, выходит, все боты являются локальными для сервера.

Да, а также для игрока, кто хостит миссию.
 

Значит, локально мне нужно выдавать экипировку только себе, на сервере же при старте игры выдать экипировку всем. Верно?

Не совсем.
Выше в loadout.sqf я написал кусок кода, который отвечает за раздачу. Там проверяется, если это одиночная игра, или игрок - сервер, то экипировка будет выдана игроку и ИИ-игрокам, а также все они будут посажены в самолёт; если же игрок - присоединившийся клиент, то экипировка будет выдана только ему и только он будет посажен в самолёт.
Можно выдачу экипировки разделить. Команда removeAllWeapons принимает локальный аргумент, значит, её можно запускать только у игрока, а команда addUniform принимает глобальный аргумент, значит, её можно запустить на сервере. Однако лучше это всё сделать у игрока, чтобы выдача экипировки была в одном месте.


Сообщение отредактировал Schatten: 29 November 2015 - 20:23

  • 1

#8 OFFLINE   SomeOneAndrey

SomeOneAndrey

    Ефрейтор

  • Пользователи
  • 43 сообщений

Отправлено 29 November 2015 - 20:33

Schatten, Ясно, спасибо. 


  • 0




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