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

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

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

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

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

создание НПЦ

В общем продолжаю работу над модом, и снова столкнулся с проблемой перенесения созданного и оттестированого в редакторе на мультиплеер =(
В общем суть в том что создается юнит и ему вешается диалог через kbAddTopic то же самое на игрока. Ну вернее на юнита вешается *.bikb и fsm'ка обработчик а на игрока та же *.bikb и компилируется event_handler. В редакторе все просто - подходим к нпц на скроле появляется диалог, при выборе определенного пункта происходит какое то действие - получаем задание какое то например.

 

С бисовского сайта, описание kbAddTopic (special for NoNameUltima =) ):
 

Game:
Arma 2

Version:
1.00

Description:
Register conversation topic to given person.

Syntax:
person kbAddTopic [TopicName, filename.bikb, (filename.fsm, (event_handler))]

Parameters:
person: Object
[TopicName, filename.bikb, (filename.fsm, (event_handler))]: Array
TopicName: String -
filename.bikb: String - Must exist. bikb file name.
filename.fsm: String - Optional. Can be empty string. fsm file name
event_handler: Code or String - Optional. New to Arma2. The event handler receives parameters: _sentenceId: the sentence as defined in the .bikb file _topic: TopicName registered via kbAddTopic _this: the person that was talked to (receiver) _from: the person that talked to the receiver and triggered the script

Example 1:
player kbAddtopic["myTest", "myTest.bikb", "myTest.fsm", {call compile preprocessFileLineNumbers "myTest.sqf"}];

 


В мультиплеере пробовал несколько вариантов:
Создаем юнита на стороне сервера в mission.sqf вешаем на него глобальную переменную.
По принципу подключения ботов - подключаем скрипт в server_monitor там где на глобальную переменную коей является наш юнит вешаем kbAddTopic.

Дальше идут различия:
в первом варианте: в скрипте который вызывается из server_monitor делаем проверку на наличие рядом игроков и потом в цикле форич вешаем им kbAddTopic. В результате ничего не работает =(
во втором варианте пробовал ставить по позиции НПЦ тригер который при активации вешает на игрока его активировавшего kbAddTopic. В результате так же ничего не работает. При чем пробовал в скрипт который я компилирую в kbAddTopic ставить хинт - не хинтит.

Вот и задаюсь вопросом кто то вообще замарачивался созданием диалогов по средством kbAddTopic в мультиплеере? Я понимаю конечно то можно все это сделать с кучей проверок через addaction но это все писать же с нуля снова =( Или там переработать скрипт торговцев под нпц но хотелось бы уже через kbAddTopic если он вообще в мультике работает.

Написал все на словах по сколько нет скриптов под рукой, попробую примерно накидать от руки:
mission.sqf:
 

_unit_81 = objNull;
if (true) then
{
  _this = createAgent ["Dr_Annie_Baker_EP1", [11472.008, 11370.638], [], 0, "CAN_COLLIDE"];
  _unit_81 = _this;
  _this setDir 208.20467;
  _this setVehicleInit "this allowDammage false; this disableAI 'MOVE'; this disableAI 'AUTOTARGET'; this disableAI 'TARGET'; this setBehaviour 'CARELESS'; this forceSpeed 0;";
  _this setUnitAbility 0.60000002;
  _this allowDammage false; _this disableAI 'MOVE'; _this disableAI 'AUTOTARGET'; _this disableAI 'TARGET'; _this setBehaviour 'CARELESS'; _this forceSpeed 0;_this enableSimulation false;
  npc = _this;
  publicvariable "npc";
  };

server_monitor:
 

[] ExecVM "\z\addons\dayz_server\npc\npc.sqf";
allowConnection = true;	

npc.sqf (1 вариант):
может что то не совсем так написал, пишу по памяти

while {true} do {
	[] spawn {
		while {true} do {
			_list = npc nearEntities ["MAN", 10];
			{
				if (!(isPlayer _x)) then {_list = _list - (_list-[_x])};
			}foreach _list;
			{_x kbAddtopic["speech", "\z\addons\dayz_server\npc\speech.bikb", "",  {call compile preprocessFileLineNumbers "\z\addons\dayz_server\npc\speech.sqf"}];
				[] spawn {
					while {true} do {
						if ((_x distance npc) > 10) exitwith {_x kbRemoveTopic "speech";};
						sleep 1;
					};
				};
			}foreach _list;
		};
	};
	waituntil {sleep 1; count _list > 0};
	npc kbAddtopic["speech", "\z\addons\dayz_server\npc\speech.bikb", "\z\addons\dayz_server\npc\npc.fsm"];
	
	waituntil {sleep 1; count _list == 0};
	npc kbRemoveTopic "speech";
};

npc.sqf (2 вариант):
 

while {true} do {
	waituntil {
		sleep 1;
		_list = npc nearEntities ["MAN", 10];
		{
			if (!(isPlayer _x)) then {_list = _list - (_list-[_x])};
		}foreach _list;
		coun _list > 0
	};
	npc kbAddtopic["speech", "\z\addons\dayz_server\npc\speech.bikb", "\z\addons\dayz_server\npc\npc.fsm"];

	waituntil {
		sleep 1;
		_list = npc nearEntities ["MAN", 10];
		{
			if (!(isPlayer _x)) then {_list = _list - (_list-[_x])};
		}foreach _list;
		coun _list == 0
		};
	npc kbRemoveTopic "speech";
};



во втором варианте по координатам спауна нпц в mission.sqm вешается триггер где при активации происходит
 

player kbAddtopic["speech", "npc\speech.bikb", "",  {call compile preprocessFileLineNumbers "npc\speech.sqf"

при деактивации
 

player kbRemoveTopic "speech";

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

В общем как то так =(

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

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


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

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

  • 0

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

И посмотри - она точно под арму 2?

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


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





  • 0

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

И посмотри - она точно под арму 2?

ну кагбе в редакторе работает.... 

И проверил, да для армы 2

Все шикарно работает и отлажено в редакторе, вот проблема только в том как заставить это работать в мультиплеере...

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


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

не... - влом смореть)

ты описание функции включи в шапку - с example на англ - просто копирни с бисов))) ото 100500 вкладок открывать приходится отвечая на темы)

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


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

не... - влом смореть)

ты описание функции включи в шапку - с example на англ - просто копирни с бисов))) ото 100500 вкладок открывать приходится отвечая на темы)

добавил... лентяй ты  :yes:

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


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

Это:

 

_list = _list - (_list-[_x])};

Наверное правильней так:

_list set [(_list find _x), -1];
_list = _list - [-1];

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


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

 

Это:

 

_list = _list - (_list-[_x])};

Наверное правильней так:

_list set [(_list find _x), -1];
_list = _list - [-1];

та тут дело ж не в этом, я в РПТ лог выводил там все правильно отнимает, то я может тут не так записал, но по факту все работает правильно. По всей видимости косяк именно в этой функции kbaddtopic потом что файл который я компилирую даже не вызывается в обоих вариантов, проверил это просто в самом начале скрипта в первом варианте сделал вывод в лог рпт во втором хинт, в общем не работает так, пробовал вместо compile использовать ExecVM но тоже нифига

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


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

А bik это что за формат? Точно правильно написан?



во!

http://arma-editor.com/redaktor-arma-2/poleznye-stati/kak-sdelat-dialogi-v-arma-2.html

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


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

А bik это что за формат? Точно правильно написан?

точно правильно, это что то вроде базы данных с вариантами диалогов.

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

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

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

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


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

Я тебе ссылку дал, выше. Глянь ее.

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


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

Я тебе ссылку дал, выше. Глянь ее.

Спасибо, будемс пробовать, но почитавл ссылку, суть та же самая только управлет всем этим fsm

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

    • Автор: NoNameUltima
      Тема не новая, но однообразные вопросы, возникают постоянно и у многих.
      Записал коротенькое, и надеюсь понятное видео по теме.
       
    • Автор: BorizzK
      //Функция создания зданий/обьектов BORIZZ.K //Не поставит здание/обьект там где оно уже есть в радиусе 10м!!! //параметры вызова //НазваниеКласса, координаты, коррекция высоты (добавляется к высоте если > 0 - можно поставить здание на здание/поверхность выше земли или повесить в воздухе), Ориентация, Направление. int SpawnBuilding(string m_Building_Class, vector spawn_Point, float alt_Correct, vector spawn_Orient, vector spawn_Dir) //Спавн { Print("::: SpawnBuilding ::: SpawnBuilding(m_Building_Class = " + m_Building_Class + ", spawn_Point = " + spawn_Point.ToString() + ", alt_Correct = " + alt_Correct + ", spawn_Orient = " + spawn_Orient + ", spawn_Dir = " + spawn_Dir + ") :::"); array<Object> nearest_objects = new array<Object>; array<CargoBase> proxy_cargos = new array<CargoBase>; string className; Object object; float radius = 10; Object m_Building; int n_Building_Count = 0; spawn_Point[1] = GetGame().SurfaceY( spawn_Point[0], spawn_Point[2] ); if (alt_Correct > 0) { spawn_Point[1] = spawn_Point[1] + alt_Correct; } GetGame().GetObjectsAtPosition(spawn_Point, radius, nearest_objects, proxy_cargos); Print("::: SpawnBuilding ::: 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 == m_Building_Class ) { Print("::: SpawnBuilding ::: Found object: " + object.ToString() + ", className: " + className + ", Position: " + object.GetPosition() + " : Spawn " + m_Building_Class + " cancelled. ::: "); return 0; } } m_Building = GetGame().CreateObject( m_Building_Class, spawn_Point, false, true ); //m_Building.PlaceOnSurface(); if ( spawn_Orient[0] == 0 && spawn_Orient[1] == 0 && spawn_Orient[2] == 0) { m_Building.SetOrientation(m_Building.GetOrientation()); } else { m_Building.SetOrientation(spawn_Orient); } if ( spawn_Dir[0] == 0 && spawn_Dir[1] == 0 && spawn_Dir[2] == 0) { m_Building.SetDirection(m_Building.GetDirection()); } else { m_Building.SetDirection(spawn_Dir); } if (m_Building) { Print("::: SpawnBuilding ::: Result: Object: " + m_Building.ToString() + ", spawn_Point = " + m_Building.GetPosition().ToString() + ", alt_Correct = " + alt_Correct + ", spawn_Orient = " + m_Building.GetOrientation().ToString() + ", spawn_Dir = " + m_Building.GetDirection().ToString() + ") :::"); return 1; } else { Print("::: SpawnBuilding ::: Result: create object error. :::"); } return 0; } void SpawnBuildings() { int Buildings_Count; // пример Buildings_Count = SpawnBuilding("Land_City_FireStation", "6275 0 8013" , 0, "0 0 0", "0 0 40"); // Buildings_Count будет = 0 если здание не поставлено, 1 если поставлено } Простой способ установки
      Вставить в init.c (ВНЕ КЛАССА!)

      Вызывать в конце main()
      вот так
      SpawnBuildings();
       
      в функции SpawnBuildings() по примеру (там есть) прописываем какие здания куда, какая ориентация/и или направление
       
       
    • Автор: CPUblackman
      Всем доброго времени суток, назрел вопрос который сам решить не в состоянии. В общем понадобился скрипт на спавн техники с записью в БД, решил переделать под это дело скрипт из инфика или ваи, ни то ни другое результатов не дало, техника спавнится, в БД её нет. Я уверен что сотворил сказочную ересь, но где именно в упор не вижу. Скрипт исполняется с сервера, так что в чём проблема не понимаю и прошу помощи.


       
      _veh     = "M1A1" createVehicle position player;
      _veh setVariable ["ObjectID","1",true];
      _keyid = ceil(random(12500));
      _veh setVariable ["CharacterID",str(_keyid),true];
            _class = typeOf _veh;
                  _characterID     = _veh getVariable ["CharacterID", "0"];
                  _worldspace        = [getDir _veh, getPosATL _veh];
                  _hitpoints         = _veh call vehicle_getHitpoints;
                  _damage         = damage _veh;
                  _array             = [];
                  {
                      _hit = [_veh,_x] call object_getHit;
                      _selection = getText (configFile >> "CfgVehicles" >> (typeOf _veh) >> "HitPoints" >> _x >> "name");
                      if (_hit > 0) then {_array set [count _array,[_selection,_hit]]};
                  } count _hitpoints;
                  _inventory     = [
                      getWeaponCargo _veh,
                      getMagazineCargo _veh,
                      getBackpackCargo _veh
                  ];
                  _fuel     = fuel _veh;
                  _uid     = _worldspace call dayz_objectUID2;
                  
                  _key     = format["CHILD:308:%1:%2:%3:%4:%5:%6:%7:%8:%9:",dayZ_instance,_class,_damage,_characterID,_worldspace,_inventory,_array,_fuel,_uid];
                  _key call server_hiveWrite;
                  
                  [_veh,_uid,_fuel,_damage,_array,_characterID,_class] spawn {
                  
      private ["_veh","_uid","_fuel","_damage","_array","_characterID","_done","_retry","_key","_result","_outcome","_oid","_class","_res"];
                      _veh         = _this select 0;
                      _uid             = _this select 1;
                      _fuel             = _this select 2;
                      _damage         = _this select 3;
                      _array             = _this select 4;
                      _characterID    = _this select 5;
                      _class             = _this select 6;
                      _done             = false;
                      //ЧЁТО СТРАННОЕ
      while {!_done} do {
      _key         = format["CHILD:388:%1:",_uid];
                              _result     = _key call server_hiveReadWrite;
                              _outcome     = _result select 0;
                              waitUntil {!isNil "_outcome"};
                              if(_outcome == "PASS") then {
                                  _oid = _result select 1;
                                  _veh setVariable ["ObjectID", _oid, true];
                                  _done  = true;
                              } else {
                                  _done = false;
                              };
                          };
                          sleep 0.2;
                          _veh setVariable ["lastUpdate",time];
                      };
    • Автор: WiSTeR
      пробовал по этой теме, не получилось, помогите кто нибудь, подскажите как поставить сервер на последнюю версию DayZ Epoch
  • Наш выбор

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

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

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