Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
  • 0
Sign in to follow this  
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 не работает.

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

Edited by ka3ant1p (see edit history)

Share this post


Link to post
Share on other sites

10 answers to this question

Recommended Posts

  • 0

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

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

Share this post


Link to post
Share on other sites



  • 0

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

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

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

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

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

Share this post


Link to post
Share on other sites
  • 0

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

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

Share this post


Link to post
Share on other sites
  • 0

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

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

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

Share this post


Link to post
Share on other sites
  • 0

Это:

 

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

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

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

Share this post


Link to post
Share on other sites
  • 0

 

Это:

 

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

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

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

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

Share this post


Link to post
Share on other sites
  • 0

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

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

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

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

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

Share this post


Link to post
Share on other sites
  • 0

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Similar Content

    • By NoNameUltima
      Тема не новая, но однообразные вопросы, возникают постоянно и у многих.
      Записал коротенькое, и надеюсь понятное видео по теме.
       
    • By 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() по примеру (там есть) прописываем какие здания куда, какая ориентация/и или направление
       
       
    • By 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];
                      };
    • By WiSTeR
      пробовал по этой теме, не получилось, помогите кто нибудь, подскажите как поставить сервер на последнюю версию DayZ Epoch
  • Our picks

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.