Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
  • 0
rss_adm

Режим боя если рядом боты

Всем привет!

 

Возник такой вопрос. Игроки очень любят отагривать ботов и зомби перезаходом на сервер(реконнектом). 

 

В голове родилась порнография следующего вида(куда ее втыкать я понятия не имею): 

 if (nearestObjects [player, AI_BanditTypes, 1200]) then { // Если боты в 1200 метров от игрока

 player setVariable['startcombattimer', 1, true]; // Запуск режима боя
 } else {
 player setVariable['startcombattimer', 0, true]; // Если нет, то отключение режима боя
 };

Знающие люди, помогите пожалуйста довести идею до ума и чтобы работало, мне знаний к сожалению нехватает.. :sad:  Спасибо!

 

P.S. Куда опубликовать новый метод дюпа (а может и не новый. С помощью Battleye) и идеи его фикса? Опять же нехватает знаний для реализации сего :)

Изменено пользователем rss_adm (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендованные сообщения

  • 0

Всем привет!

 

Возник такой вопрос. Игроки очень любят отагривать ботов и зомби перезаходом на сервер(реконнектом). 

 

В голове родилась порнография следующего вида(куда ее втыкать я понятия не имею): 

 if (nearestObjects [player, AI_BanditTypes, 1200]) then { // Если боты в 1200 метров от игрока

 player setVariable['startcombattimer', 1, true]; // Запуск режима боя
 } else {
 player setVariable['startcombattimer', 0, true]; // Если нет, то отключение режима боя
 };

Знающие люди, помогите пожалуйста довести идею до ума и чтобы работало, мне знаний к сожалению нехватает.. :sad:  Спасибо!

 

P.S. Куда опубликовать новый метод дюпа (а может и не новый. С помощью Battleye) и идеи его фикса? Опять же нехватает знаний для реализации сего :)

Дюпы, баги лучше не разглошать публично. В ЛС мне скинь схему, придумаем чего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах



  • 0

У меня тело остается в мире еще 30 сек) отменно боты сливают)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

 

 

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

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

 

Дюпы, баги лучше не разглошать публично. В ЛС мне скинь схему, придумаем чего.

Описал схему. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

У меня тело остается в мире еще 30 сек) отменно боты сливают)

Вы переписали Disco Bot?) Сможете показать как у вас это реализовано? И подскажете по моему вопросу? Спасибо

Изменено пользователем rss_adm (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Я не знаю, что за диско бот.

Реализовано просто -

Выходит игрок в режиме боя, -

Создается бот в его одежде с пустоым рюкзаком(если рюкзак был), и вещами в инвентаре.

Если игрок зашел и бот жив - бот удаляется.

Если прошло 20 секунд и бот жив - бот удаляется.

Если бота убили - добавляются вещи в рюкзак, которые должны были быть в нем. И в БД обновляется запись игрока - игрок мертв.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Я не знаю, что за диско бот.

Реализовано просто -

Выходит игрок в режиме боя, -

Создается бот в его одежде с пустоым рюкзаком(если рюкзак был), и вещами в инвентаре.

Если игрок зашел и бот жив - бот удаляется.

Если прошло 20 секунд и бот жив - бот удаляется.

Если бота убили - добавляются вещи в рюкзак, которые должны были быть в нем. И в БД обновляется запись игрока - игрок мертв.

А разве не будет дюпа если сам игрок успеет зайти и убить своего бота ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

 

 

Я не знаю, что за диско бот.

Реализовано просто -

Выходит игрок в режиме боя, -

Создается бот в его одежде с пустоым рюкзаком(если рюкзак был), и вещами в инвентаре.

Если игрок зашел и бот жив - бот удаляется.

Если прошло 20 секунд и бот жив - бот удаляется.

Если бота убили - добавляются вещи в рюкзак, которые должны были быть в нем. И в БД обновляется запись игрока - игрок мертв.

 

Дискобот был раньше именно тем что вы описали, но его перестали поддерживать. Отличная борьба с релогерами :) 

Только вот что делать если игрок боится что его заковыряют зомби или боты, выходит в лобби и снова заходит и все отагриваются?

Изменено пользователем rss_adm (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

 

А разве не будет дюпа если сам игрок успеет зайти и убить своего бота ?

 

будет. но я это в свое время не смог доказать нонейму)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Он не успеет зайти.



Дискобот был раньше именно тем что вы описали, но его перестали поддерживать. Отличная борьба с релогерами :) 

Только вот что делать если игрок боится что его заковыряют зомби или боты, выходит в лобби и снова заходит и все отагриваются?

Нормально сливают боты игрока - по логам видно. Нефиг релогатся.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
 

Он не успеет зайти.


Нормально сливают боты игрока - по логам видно. Нефиг релогатся.

И хорошо, что работает.

 

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

 

зомби:

 

 

while {true} do {
sleep 10;


// No Zeds near Plot Poles
_playerPos = getPos player;
_nearPole = nearestObject [_playerPos, "Plastic_Pole_EP1_DZ"];
if (!isNull _nearPole) then {
_pos2 = getPos _nearPole;
_zombies2 = _pos2 nearEntities ["zZombie_Base", dayz_poleSafeArea];
_count2 = count _zombies2;
for "_i" from 0 to (_count2 -1) do
{
_zombie2 = _zombies2 select _i;
_zombie2 setpos [-3367.739,-120.84577,-8247.0625];
};
};
};

 

 

 

антидюп:

 

 

 

private ["_escMenu","_typf","_mxBckpcks"];

disableSerialization;
waitUntil {!isNull findDisplay 49};
_escMenu = findDisplay 49;
{
_typf = typeOf cursortarget;
_mxBckpcks = getNumber (configFile >> "CfgVehicles" >> _typf >> "transportmaxbackpacks");
if (!(isNull _x) && (canbuild) && !(_x == player || typeOf _x in ["WeaponHolder","DebugBoxPlayer_DZ"]) && (_mxBckpcks > 0)) exitWith
{
titleText ["Antidupe!", "PLAIN DOWN", 3];
systemchat "Antidupe!";
_escMenu closedisplay 0;
};
} foreach (nearestObjects [player, ["All"], 8]);

// atdp
private ["_time_count"];
cad_pvar_shared_var = player; cad_pvar_server_answer = 0; _time_count = diag_tickTime;
publicVariableServer "cad_pvar_shared_var";
while {diag_tickTime - _time_count < 8 && cad_pvar_server_answer == 0 } do {sleep 0.05;};
if (cad_pvar_server_answer == 0) exitWith {
    (findDisplay 49) closedisplay 0;
};

 

 

 

Не знаю правильно ли, думаю вообще все неправильно, но получилось как-то так: 

Прошу совета

 

 

 

while {true} do {
  sleep 2;

  _playerPos = getPos player;
  _nearzed = nearestObject [_playerPos, ["zZombie_Base"], 50];
  _nearbot = nearestObject [_playerPos, ["AI_BanditTypes"], 800];
  _escMenu = findDisplay 49;
  if (!(isNull _nearzed || _nearbot) exitWith
   {
      titleText ["Нельзя уходить с поля боя!", "PLAIN DOWN", 3];
      systemchat "Нельзя уходить с поля боя!";
	  _escMenu closedisplay 0;
      player setVariable['startcombattimer', 1, true];	  
   };
   }; 

 

 

 

 

Насколько понимаю подключать его в ините. Прошу не кидать помидорами, я в этом не понимаю, я немного по смежной специальности.

 

Еще как вариант добавить пару записей в player_onPause.sqf , но т.к. он находится в config.bin я не знаю что делать :)

 

 

 

private ["_display","_btnRespawn","_btnAbort","_timeOut","_timeMax","_btnAbortText"];
disableSerialization;
waitUntil {
	_display = findDisplay 49;
	!isNull _display;
};
_btnRespawn = _display displayCtrl 1010;
_btnAbort = _display displayCtrl 104;
_btnRespawn ctrlEnable false;
_btnAbort ctrlEnable false;
_btnAbortText = ctrlText _btnAbort;
_timeOut = 0;
_timeMax = diag_tickTime+10;
dayz_lastCheckBit = time;
		
// if(r_player_dead) exitWith {_btnAbort ctrlEnable true;};
if(r_fracture_legs && !r_player_dead) then {_btnRespawn ctrlEnable true;};
		
//force gear save
if (!r_player_dead && time - dayz_lastCheckBit > 10) then {
	call dayz_forceSave;
};			

if (r_player_dead || (!alive player)) exitWith {_btnAbort ctrlEnable true; _btnAbort ctrlSetText _btnAbortText;};		
_sleep = 1;

while {!isNull _display} do {
	switch true do {
		case (!r_player_dead && {isPlayer _x} count (player nearEntities ["AllVehicles", 12]) > 1) : {
			_btnAbort ctrlEnable false;
			cutText [localize "str_abort_playerclose", "PLAIN DOWN"];
			_sleep = 1;
		};
		case (!r_player_dead && !canbuild) : {
			_btnAbort ctrlEnable false;
			cutText [(localize "str_epoch_player_12"), "PLAIN DOWN"];
			_sleep = 1;
		};
		case (!r_player_dead && player getVariable["combattimeout", 0] >= time) : {
			_btnAbort ctrlEnable false;
			//cutText ["Cannot Abort while in combat!", "PLAIN DOWN"];
			cutText [localize "str_abort_playerincombat", "PLAIN DOWN"];
			_sleep = 1;
		};
		case (_timeOut < _timeMax) : {
			_btnAbort ctrlEnable false;
			_btnAbort ctrlSetText format["%1 (in %2)", _btnAbortText, (ceil ((_timeMax - diag_tickTime)*10)/10)];
			cutText ["", "PLAIN DOWN"];	
			_sleep = 0.1;
		};
// #################################################
		case (nearestObject [player, ["AI_BanditTypes"], 800];) : {
			_btnAbort ctrlEnable false;
			cutText ["Нельзя выходить если рядом находятся боты", "PLAIN DOWN"];	
			_sleep = 0.1;
		};
		case (nearestObject [player, ["zZombie_Base"], 50];) : {
			_btnAbort ctrlEnable false;
			cutText ["Нельзя выходить если рядом находятся зомби", "PLAIN DOWN"];	
			_sleep = 0.1;
		};
// #################################################
		default {
			_btnAbort ctrlEnable true;
			_btnAbort ctrlSetText _btnAbortText;
			cutText ["", "PLAIN DOWN"];	
			_sleep = 1;
		};
	};
	sleep _sleep;
	_timeOut = diag_tickTime;
};
cutText ["", "PLAIN DOWN"];
 

 

 

 

Изменено пользователем rss_adm (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Какая разница, что там кто то рядом? Alt+F4 и нет проблем.

Ну да, - поваляться мб придется, если друг с эпенифрином не вколет.

А так - фигня все эти оповещения, телепортации зм, и т.п.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Какая разница, что там кто то рядом? Alt+F4 и нет проблем.

Ну да, - поваляться мб придется, если друг с эпенифрином не вколет.

А так - фигня все эти оповещения, телепортации зм, и т.п.

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

Изменено пользователем rss_adm (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

хорошо. что тогда делать в этой ситуации?

Выше написана схема.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

 

Он не успеет зайти.

У меня на загруженном сервере машины иногда по пять секунд открываются...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

У меня на загруженном сервере машины иногда по пять секунд открываются...

В случае с тачками, - не помню, как там реализовано, но - вероятнее всего, что то отправляется на сервер при открытии техники, а сервер раздает клиентам.

Если канал загружен(а в А2 он загружен при большом онлайне), сервер по 5 сек будет обрабатывать очередь запросов.

Но это никак не связано со скриптом которых запущен на сервере, изначально, и в котором задержка стоит с uiSleep - т.е. основанная на реальном времени, а не на итерациях(скорости выполнения основного цикла) ядра А2.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Выше написана схема.

Вы мне поможете довести скрипт до рабочего состояния? Что из предложенного мной скрипта неправильно. Вам как профессионалу это раз плюнуть, а мы тут воду льем. У меня просто напросто не хватает знаний и я только этому учусь. Поэтому и написал в форум где сидят знающие люди.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Вы мне поможете довести скрипт до рабочего состояния? Что из предложенного мной скрипта неправильно. Вам как профессионалу это раз плюнуть, а мы тут воду льем. У меня просто напросто не хватает знаний и я только этому учусь. Поэтому и написал в форум где сидят знающие люди.

Я свои серверные скрипты не выкладываю.

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

А так - раздел покупки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Я свои серверные скрипты не выкладываю.

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

А так - раздел покупки.

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

Вопрос был как раз на предыдущей странице. Я попробовал этот скрипт написать.

http://s-platoon.ru/index.php?/topic/3305-rezhim-boia-esli-riadom-boty/?p=28933

 

Продублирую

 

while {true} do {
  sleep 2;
 
  _playerPos = getPos player;
  _nearzed = nearestObject [_playerPos, ["zZombie_Base"], 50];
  _nearbot = nearestObject [_playerPos, ["AI_BanditTypes"], 800];
  _escMenu = findDisplay 49;
  if (!(isNull _nearzed || _nearbot) exitWith
   {
      titleText ["Нельзя уходить с поля боя!", "PLAIN DOWN", 3];
      systemchat "Нельзя уходить с поля боя!";
	  _escMenu closedisplay 0;
      player setVariable['startcombattimer', 1, true];	  
   };
   }; 
 

Это то что получилось.. Прошу вашего совета как незнающий к знающему чтобы это заработало :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

1.

 

 

_nearbot = nearestObject [_playerPos, ["AI_BanditTypes"], 800];
 

 

Тут я так понимаю проверка, - нет ли кого в пределах 800м в форме бандита? - А что люди не могут форму бандита одеть?

 

2. Тут и написание не верно и скобочка пропущена

 

if (!(isNull _nearzed || _nearbot) exitWith
 

 

 

Заменить на:

 

if ( !(isNull _nearzed) || !(isNil _nearbot) ) exitWith
 

 

 

Или так:

 

if ( (isNull _nearzed) && (isNil _nearbot) ) exitWith {};
 

 

 

3.

 

 

player setVariable['startcombattimer', 1, true];
 

 

Да сразу секунд 10 прибавь, толку от 1 секунды?

 

player setVariable['startcombattimer', 10, true];
 

 

 

 

4. А что он проверят только раз в 2 секунды? - этого достаточно?

Раз уж проверять то - раз в секунду.

И вставить uiSleep вместо sleep

И ботов искать ближе, - зачем такой радиус - 800м?

300 - вполне достаточно.

Не ну можно и за 2КМ отслеживать...

   

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

 

1.

 

 

_nearbot = nearestObject [_playerPos, ["AI_BanditTypes"], 800];
 

 

Тут я так понимаю проверка, - нет ли кого в пределах 800м в форме бандита? - А что люди не могут форму бандита одеть?

 

2. Тут и написание не верно и скобочка пропущена

 

if (!(isNull _nearzed || _nearbot) exitWith
 

 

 

Заменить на:

 

if ( !(isNull _nearzed) || !(isNil _nearbot) ) exitWith
 

 

 

Или так:

 

if ( (isNull _nearzed) && (isNil _nearbot) ) exitWith {};
 

 

 

3.

 

 

player setVariable['startcombattimer', 1, true];
 

 

Да сразу секунд 10 прибавь, толку от 1 секунды?

 

player setVariable['startcombattimer', 10, true];
 

 

 

 

4. А что он проверят только раз в 2 секунды? - этого достаточно?

Раз уж проверять то - раз в секунду.

И вставить uiSleep вместо sleep

И ботов искать ближе, - зачем такой радиус - 800м?

300 - вполне достаточно.

Не ну можно и за 2КМ отслеживать...

Большое вам спасибо за ответ! Все ясно и доходчиво объяснили.

 

Получилось вот что:

Уже лучше выглядит?

while {true} do {
  uiSleep 1;

  _playerPos = getPos player;
  _nearzed = nearestObject [_playerPos, ["zZombie_Base"], 50];
  _nearbot = nearestObject [_playerPos, ["CAManBase"], 400];
  _escMenu = findDisplay 49;
  if ((isNull _nearzed) && (isNil _nearbot)) exitWith {};
   {
      titleText ["Нельзя уходить с поля боя!", "PLAIN DOWN", 3];
      systemchat "Нельзя уходить с поля боя!";
	  _escMenu closedisplay 0;
      player setVariable['startcombattimer', 10, true];	  
   };
   };

Но возник вопрос. А возможно ли как то отделить игроков и ботов? Насколько я понимаю "CAManBase" - это и игроки и боты?

Каким образом можно назначить проверку нескольких скинов бандитов?  Спасибо!

Изменено пользователем rss_adm (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Смотри конфиги WAI или DZMS как называется спавн бота.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Смотри конфиги WAI или DZMS как называется спавн бота.

Посмотрел. У wai и у dzms боты спавнятся командой createUnit и ссылает на выбор скинов для ботов. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Как теперь понимаю CAManBase является общим классом для всех скинов. И чтобы разграничить ботов и игроков надо ботам дать определенные скины и не давать их игрокам и список этих скинов проинициализировать в variables и название этого списка уже пихать в скрипт. 

Брал информацию с сайта бисов, а именно тут https://community.bistudio.com/wiki/ArmA_2:_CfgVehicles#Man_Class_Vehicles

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Можно все сделать гораздо проще.

При создании бота, в WAI, DZMS, DZAI добавить 1 строку -

 

 

_unit setVariable ["bot", true, true];
 

 

 

где

_unit - ссылка на бота при его создании

а далее мы указываем, что это бот, а не игрок.

т.е. - вешаем на всех создаваемых ботов переменную "bot"

 

Ну а дальше, где то в скриптах определения -

 

_nearbot = nearestObject [_playerPos, ["CAManBase"], 400];
{
    //определяем - бот это или нет.
    _bot = _x getVariable ["bot", false];
    // если бот
    if (_bot) then
       {
           .......тут выполнение какого то скрипта.
       };
}forEach _nearbot;
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

 

Можно все сделать гораздо проще.

При создании бота, в WAI, DZMS, DZAI добавить 1 строку -

 

 

_unit setVariable ["bot", true, true];
 

 

 

где

_unit - ссылка на бота при его создании

а далее мы указываем, что это бот, а не игрок.

т.е. - вешаем на всех создаваемых ботов переменную "bot"

 

Ну а дальше, где то в скриптах определения -

 

_nearbot = nearestObject [_playerPos, ["CAManBase"], 400];
{
    //определяем - бот это или нет.
    _bot = _x getVariable ["bot", false];
    // если бот
    if (_bot) then
       {
           .......тут выполнение какого то скрипта.
       };
}forEach _nearbot;
 

Большое спасибо за ответ Ультима!

 

Я боюсь что если я так сделаю, то потом про это забуду и будет путанница при каком нибудь обновлении..  :sad:

 

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

 

В файле variables дал определения какие скины бандиты (AI_Bandit) и какие скины герои для миссий wai (AI_Hero), 

Написал скрипт в таком виде..:

 private ["_playerPos","_nearzed","_nearbot_b","_nearbot_h","_escMenu"];
 
 while {true} do { 

 uiSleep 1;  

 _playerPos = getPos player; 
 _nearzed = nearestObject [_playerPos, ["zZombie_Base"], 50]; 
 _nearbot_b = nearestObject [_playerPos, ["AI_Bandit"], 400]; 
 _nearbot_h = nearestObject [_playerPos, ["AI_Hero"], 400]; 

 _escMenu = findDisplay 49; 

 if ((isNull _nearzed) && (isNil _nearbot_b) && (isNil _nearbot_h)) exitWith {}; 

 { 	 
 _escMenu closedisplay 0; 
 player setVariable['startcombattimer', 10, true];	 
 }; 
 };
 

Убрал из него текст сообщения игроку.

Подцепляю в файле init после закрывающей скобки !isDedicated

 

Получаю в рпт следующую ошибку:

19:04:29 Error in expression 
while {true} do { 
uiSleep 1;  
_playerPos = getPos player; 
_nearz>
19:04:29   Error position: <  
_playerPos = getPos player; 
_nearz>
19:04:29   Error Invalid number in expression
19:04:29 File mpmissions\__cur_mp.Chernarus\tmp\nearzed.sqf, line 5

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Похожие публикации

    • Автор: SpiritWolf
      Народ, кто-то ковырял поведение и логику Жениных ботов?
      Они невероятно глупые (конкретно пехота). Можно ли как-то ужесточить их? Дальность обнаружения игрока, ибо они стреляют только с 200м.
    • Автор: Шапокляк
      Как сделать чтоб Боты агрелись на Игрока с расстояния   1000-1500 метров. Темы вродибы есть но решений нет.
      ai_share_info = true; // AI share info on player position ai_share_distance = 2000; // distance from killed AI for AI to share your rough position ai_skill_extreme = [["aimingAccuracy",1.00],["aimingShake",1.00],["aimingSpeed",1.00],["endurance",1.00],["spotDistance",3.99],["spotTime",1.00],["courage",1.00],["reloadSpeed",1.00],["commanding",1.00],["general",1.00]]; // Extreme ai_skill_hard = [["aimingAccuracy",1.00],["aimingShake",1.00],["aimingSpeed",1.00],["endurance",1.00],["spotDistance",3.99],["spotTime",1.00],["courage",1.00],["reloadSpeed",1.00],["commanding",1.00],["general",1.00]]; // Hard менял все не помогает.!!!
    • Автор: Sancezz063
      Всем привет!
      скачал оффлай режим, построил ,решил сохранить, в итоге ничего не сохранилось.
      Знаю что можно в init прописать, но потом я их дальше в оффлайне редактировать не смогу. Помню раньше просто нажимал save , потом заходит и все стояло на своих местах
    • Автор: BorizzK
      Накрапал функций (по мотивам того что делали для 0.62 когда-то)
      Проверяем сколько машин на сервере (кстати, кому известны координаты центра Черноруси и макс полезный радиус от центра где могут располагаться объекты?)
      Если машин данного типа достаточно на карте, не спавним
      Если не хватает, перед спавном проверяем нет ли машины рядом (что бы не заспавнить внутрь другой)
      Если все норм, спавним
       
      int CheckNearObjects(vector pos, int radius, string objectClass) //Проверка обьектов поблизости { array<Object> nearest_objects = new array<Object>; array<CargoBase> proxy_cargos = new array<CargoBase>; Object object; string className; int objectcount = 0; GetGame().GetObjectsAtPosition(pos, radius, nearest_objects, proxy_cargos); Print("::: SpawnCars.c ::: CheckNearObjects (EntityAI m_Object, int radius) ::: Radius: " + radius.ToString() + ", all nearest_objects: " + nearest_objects.Count().ToString()); for ( int i = 0; i < nearest_objects.Count(); i++ ) { object = nearest_objects.Get(i); className = object.GetType(); if ( className == objectClass ) { objectcount++; Print( "::: SpawnCars.c ::: CheckNearestObjects: found object " + objectcount.ToString() + ": " + object.ToString() + ", Type/Class: " + className + " !!!"); } } return objectcount; } int SpawnCar(string m_Car_Class, TVectorArray spawn_Points, int max_Car_Count, float min_Car_Health, float max_Car_Health, bool damageallow) //Спавн машины по заданным параметрам { Print("::: SpawnCars.c ::: SpawnCar(" + m_Car_Class + ", " + spawn_Points.ToString() + ") :::"); vector m_Car_Pos; EntityAI m_Car; int n_Car_Count = 0; int all_Car_Count = 0; int s_Car_Count = 0; array<string> m_Car_Equip_Array = new array<string>; if (m_Car_Class == "OffroadHatchback") { /* Так то же можно m_Car_Equip_Array.Insert("HatchbackWheel"); m_Car_Equip_Array.Insert("HatchbackWheel"); m_Car_Equip_Array.Insert("HatchbackWheel"); m_Car_Equip_Array.Insert("HatchbackWheel"); m_Car_Equip_Array.Insert("CarBattery"); m_Car_Equip_Array.Insert("SparkPlug"); m_Car_Equip_Array.Insert("EngineBelt"); m_Car_Equip_Array.Insert("CarRadiator"); m_Car_Equip_Array.Insert("HatchbackDoors_Driver"); m_Car_Equip_Array.Insert("HatchbackDoors_CoDriver"); m_Car_Equip_Array.Insert("HatchbackHood"); m_Car_Equip_Array.Insert("HatchbackTrunk"); */ //И так можно m_Car_Equip_Array = {"HatchbackWheel","HatchbackWheel","HatchbackWheel","HatchbackWheel","CarBattery","SparkPlug","SparkPlug","EngineBelt","CarRadiator","HatchbackDoors_Driver","HatchbackDoors_CoDriver","HatchbackHood","HatchbackTrunk"}; //Проверяем m_Car_Equip_Array.Debug(); } /* else if (m_Car_Class == "M3S") { //Тут заполняем массив комплектующими M3S } */ else { Print("::: SpawnCars.c ::: SpawnCar() ::: NO CAR / WRONG CLASS SPECIFIED :::"); return s_Car_Count; } all_Car_Count = CheckNearObjects("7000 0 7000", 20000, m_Car_Class); //Можно отключить если сервер глючит при старте, тогда присовойте all_Car_Count значение - all_Car_Count = 1; (см ниже) //all_Car_Count = 1; for ( int i = 0; i < spawn_Points.Count(); i++ ) { m_Car_Pos = spawn_Points.Get(i); n_Car_Count = CheckNearObjects(m_Car_Pos, 10, m_Car_Class); Print("::: SpawnCars.c ::: n_Car_Count = " + n_Car_Count.ToString()); if (s_Car_Count + all_Car_Count < max_Car_Count) { if (n_Car_Count < 1) { m_Car = EntityAI.Cast(GetGame().CreateObject(m_Car_Class, m_Car_Pos, false, true)); for ( int e = 0; e < m_Car_Equip_Array.Count(); e++ ) { m_Car.GetInventory().CreateAttachment( m_Car_Equip_Array.Get(e) ); } m_Car.SetAllowDamage(damageallow); m_Car.SetHealth("","",Math.RandomInt(min_Car_Health,max_Car_Health)); Print("::: SpawnCars.c ::: Spawned car: " + m_Car.ToString() + ", Position: " + m_Car.GetPosition().ToString()); if (m_Car) { s_Car_Count++; } } else { Print("::: SpawnCars.c ::: Car spawn not allowed at position: " + m_Car_Pos.ToString() + ", becouse nearest car with same class " + m_Car_Class + " found."); } } else { Print("::: SpawnCars.c ::: Car spawn not allowed becouse cars with same class " + m_Car_Class + " >= " + max_Car_Count.ToString()); } } return s_Car_Count; }  
      Подключение
       
      Правим по своему вкусу
      Помещаем код в файл и размещаем в папке доступной серверу
       
      В самом начале init.c
      #include "$CurrentDir:\\путь\\путь\\имя файла с кодом.c
       
      Далее в функции main вызываем спавн
       
      TVectorArray spawn_Points_Niva = {"6063 0 7871"}; //array with positions, for more cars write more positios in to array int SpawnCarsCarsCount = SpawnCar("OffroadHatchback", spawn_Points_Niva, 32, 100, 100, false); //Class, Positions, Max count, min health, max health, damage allow - true/false Print("::: SpawnCars.c ::: SpawnCars() ::: Spawned cars: " + SpawnCarsCarsCount.ToString()); //это просто каммент  
      Или просто
      int SpawnCarsCarsCount;
      SpawnCarsCarsCount = SpawnCar("M3S", {"6000 0 6000", "7000 0 8000"}, 44, 100, 100, false);
       
      Но для M3S нужно прописать комплектуху в SpawnCar() в массив m_Car_Equip_Array
       
      Ну вобщем разберетесь )))
       
       
      Добавлено:
      Альтернативный вариант от комьюнити:
       
    • Автор: BorizzK
      Функция вернет кол-во игроков рядом с текущей позицией игрока в заданном радиусе
      Использую на своем сервере при рандомном спавне нового игрока, что бы не заспавнился рядом с уже вооруженным и злым
      Если при спавне рядом есть игрок, то выбираются новые координаты для спавна
       
      int CheckNearestObjects(PlayerBase player, int radius) { array<Object> nearest_objects = new array<Object>; array<CargoBase> proxy_cargos = new array<CargoBase>; Object object; string className; int objectcount = 0; GetGame().GetObjectsAtPosition (player.GetPosition(), radius, nearest_objects, proxy_cargos ); Print("::: init_mod.c ::: CheckNearestObjects (int radius) ::: Radius: " + radius.ToString() + ", nearest_objects: " + nearest_objects.Count().ToString()); for ( int i = 0; i < nearest_objects.Count(); i++ ) { object = nearest_objects.Get(i); className = object.GetType(); if ( object ) { if (object.IsMan()) { if (player != object) { Print( "::: Init.c ::: CheckNearestObjects: IsMan(): "+i.ToString()+" => " + object.ToString() + " => Type: " + className + " => Position: " + object.GetPosition().ToString()); objectcount = objectcount + 1; } else { Print( "::: Init.c ::: CheckNearestObjects: isMan(): player and object " + object.ToString() + " the same object!"); } } } } return objectcount; }  
  • Наш выбор

×
×
  • Создать...

Важная информация

Используя этот сайт, вы автоматически обязуетесь соблюдать наши Правила и Политика конфиденциальности.
Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.