pluginitemdiagnostic.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692
  1. class PluginItemDiagnosticEventHandler extends ScriptedWidgetEventHandler
  2. {
  3. PluginItemDiagnostic m_Owner;
  4. override bool OnMouseEnter(Widget w, int x, int y)
  5. {
  6. if( ButtonWidget.Cast(w))
  7. {
  8. GetGame().GetMission().AddActiveInputExcludes({"menu"});
  9. }
  10. return true;
  11. }
  12. override bool OnMouseLeave(Widget w, Widget enterW, int x, int y)
  13. {
  14. if( ButtonWidget.Cast(w))
  15. {
  16. GetGame().GetMission().RemoveActiveInputExcludes({"menu"},true);
  17. }
  18. return true;
  19. }
  20. override bool OnClick( Widget w, int x, int y, int button )
  21. {
  22. return m_Owner.OnClick( w, x, y, button );
  23. }
  24. override bool OnMouseButtonDown(Widget w, int x, int y, int button)
  25. {
  26. return m_Owner.OnMouseButtonDown( w, x, y, button );
  27. }
  28. override bool OnMouseButtonUp(Widget w, int x, int y, int button)
  29. {
  30. return m_Owner.OnMouseButtonUp( w, x, y, button );
  31. }
  32. }
  33. class PluginItemDiagnostic extends PluginDeveloper
  34. {
  35. Object m_Entity;
  36. ref Timer myTimer1;
  37. ref map<PlayerBase,Object> m_ObserversMap = new map<PlayerBase,Object>;
  38. ref array<string> m_Agents = new array<string>;
  39. ref map<string,float> m_Floats = new map<string,float>;
  40. ref map<string,float> m_VarsNumbersFinalServer = new map<string,float>;
  41. ref map<string,float> m_VarsFinalClient = new map<string,float>;
  42. ref array<ref Param> m_Properties = new array<ref Param>;
  43. bool m_IsActive = false;
  44. bool m_ScriptMenuOpened;
  45. string m_NoteClient;
  46. ref PluginItemDiagnosticEventHandler m_EventHandler;
  47. bool m_IsDragging;
  48. PluginConfigDebugProfile m_ConfigDebugProfile;
  49. Widget m_DebugRootWidget;
  50. Widget m_FrameWidget;
  51. TextListboxWidget m_DebugAgentListWidget;
  52. TextWidget m_DebugOutputServer;
  53. TextWidget m_DebugOutputClient;
  54. TextListboxWidget m_DebugFloatsProperListWidget;
  55. TextListboxWidget m_DebugClientVarsWidget;
  56. TextWidget m_ClassNameWidget;
  57. TextWidget m_DistanceWidget;
  58. ItemPreviewWidget m_ItemPreviewWidget;
  59. ButtonWidget m_DebugButtonWidget1;
  60. ButtonWidget m_DebugButtonWidget2;
  61. ButtonWidget m_DebugButtonWidget3;
  62. ButtonWidget m_DebugButtonWidget4;
  63. ButtonWidget m_CloseButton;
  64. Shape m_ItemLine;
  65. vector m_DraggingOffset;
  66. void PluginItemDiagnostic()
  67. {
  68. #ifndef NO_GUI
  69. InitializeWidgets();
  70. ShowWidgets(false);
  71. #endif
  72. }
  73. void ~PluginItemDiagnostic()
  74. {
  75. ClearProperties();
  76. if (m_ItemLine)
  77. {
  78. m_ItemLine.Destroy();
  79. m_ItemLine = null;
  80. }
  81. }
  82. override void OnInit()
  83. {
  84. m_ConfigDebugProfile = PluginConfigDebugProfile.Cast( GetPlugin(PluginConfigDebugProfile) );
  85. if ( m_ConfigDebugProfile )
  86. {
  87. vector pos = m_ConfigDebugProfile.GetItemDebugPos();
  88. if (m_DebugRootWidget && pos != vector.Zero)
  89. {
  90. float wx = pos[0];
  91. float wy = pos[1];
  92. m_DebugRootWidget.SetPos(wx, wy);
  93. }
  94. }
  95. }
  96. bool OnMouseButtonDown(Widget w, int x, int y, int button)
  97. {
  98. if (button == 0)
  99. SetDragging(true);
  100. if (button == 1)
  101. {
  102. if (m_Entity)
  103. {
  104. float xx, yy;
  105. m_DebugRootWidget.GetPos(xx,yy);
  106. ContextMenu.DisplayContextMenu(x - xx, y - yy, EntityAI.Cast(m_Entity), m_DebugRootWidget, this);
  107. }
  108. }
  109. return true;
  110. }
  111. bool OnMouseButtonUp(Widget w, int x, int y, int button)
  112. {
  113. if (button == 0)
  114. SetDragging(false);
  115. return true;
  116. }
  117. void SetDragging(bool enable)
  118. {
  119. if(enable && !m_IsDragging)
  120. OnDraggingStart();
  121. else if (!enable && m_IsDragging)
  122. OnDraggingEnd();
  123. m_IsDragging = enable;
  124. }
  125. void OnDraggingStart()
  126. {
  127. int mx, my;
  128. float wx, wy;
  129. GetMousePos(mx,my);
  130. m_DebugRootWidget.GetScreenPos(wx,wy);
  131. m_DraggingOffset[0] = wx - mx;
  132. m_DraggingOffset[1] = wy - my;
  133. }
  134. void OnDraggingEnd()
  135. {
  136. if ( m_ConfigDebugProfile )
  137. {
  138. float wx, wy;
  139. m_DebugRootWidget.GetScreenPos(wx,wy);
  140. m_ConfigDebugProfile.SetItemDebugPos(Vector(wx,wy,0));
  141. }
  142. }
  143. bool OnClick( Widget w, int x, int y, int button )
  144. {
  145. SetDragging(false);
  146. if (w == m_CloseButton)
  147. {
  148. ToggleDebugWindowEvent();
  149. return true;
  150. }
  151. return true;
  152. }
  153. void RegisterDebugItem(Object item, PlayerBase player)
  154. {
  155. if(!myTimer1)
  156. {
  157. myTimer1 = new Timer();
  158. myTimer1.Run(1, this, "Tick", NULL, true);
  159. }
  160. if(m_ObserversMap.Contains(player))
  161. {
  162. m_ObserversMap.Set(player,item);
  163. }
  164. else
  165. {
  166. m_ObserversMap.Insert(player,item);
  167. }
  168. #ifdef DEVELOPER
  169. SetDebugDeveloper_item(item);
  170. #endif
  171. }
  172. Object GetWatchedItem(PlayerBase player)
  173. {
  174. return m_ObserversMap.Get(player);
  175. }
  176. bool IsActive()
  177. {
  178. return m_IsActive;
  179. }
  180. void OnScriptMenuOpened(bool opened/*1 - opened , 0 - closed*/)
  181. {
  182. m_ScriptMenuOpened = opened;
  183. }
  184. void ShowWidgets(bool show)
  185. {
  186. m_IsActive = show;
  187. if(m_DebugRootWidget)
  188. m_DebugRootWidget.Show(show);
  189. }
  190. void OnSelectAction(EntityAI ent, int actionId)
  191. {
  192. #ifdef DIAG_DEVELOPER
  193. PlayerBase player = PlayerBase.Cast( GetGame().GetPlayer() );
  194. player.GetActionManager().OnInstantAction(ActionDebug,new Param2<EntityAI,int>(ent,actionId));
  195. #endif
  196. }
  197. void ReleaseFocus()
  198. {
  199. GetGame().GetInput().ResetGameFocus();
  200. GetGame().GetUIManager().ShowUICursor(false);
  201. if (GetGame().GetUIManager())
  202. {
  203. if (GetGame().GetUIManager().IsDialogVisible())
  204. {
  205. GetGame().GetUIManager().CloseDialog();
  206. }
  207. }
  208. }
  209. void ToggleDebugWindowEvent()
  210. {
  211. if (m_IsActive)
  212. {
  213. PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer());
  214. GetGame().RPCSingleParam(player, ERPCs.RPC_ITEM_DIAG_CLOSE,null, true);
  215. ShowWidgets(false);
  216. ClearWidgets();
  217. GetGame().GetCallQueue( CALL_CATEGORY_GUI ).CallLater( ReleaseFocus, 100);
  218. //m_IsActive = false;
  219. SetDragging(false);
  220. }
  221. else
  222. {
  223. ShowWidgets(true);
  224. //m_IsActive = true;
  225. }
  226. }
  227. void ClearWidgets()
  228. {
  229. m_DebugAgentListWidget.ClearItems();
  230. m_DebugOutputServer.SetText("");
  231. m_DebugOutputClient.SetText("");
  232. m_DebugFloatsProperListWidget.ClearItems();
  233. m_ItemPreviewWidget.SetItem(NULL);
  234. m_ClassNameWidget.SetText("");
  235. }
  236. void Tick()
  237. {
  238. for(int i = 0; i < m_ObserversMap.Count();i++)
  239. {
  240. Object item = m_ObserversMap.GetElement(i);
  241. PlayerBase player = m_ObserversMap.GetKey(i);
  242. if (item && player)
  243. {
  244. GeneratePropertiesObject(EntityAI.Cast(item));
  245. SendRPC(item, player);
  246. }
  247. else
  248. {
  249. Debug.LogError("PluginItemDiagnostic: dead debug record, removing record");
  250. m_ObserversMap.RemoveElement(i);
  251. }
  252. }
  253. }
  254. void ClearProperties()
  255. {
  256. m_Properties.Clear();
  257. }
  258. void GeneratePropertiesObject(EntityAI item)
  259. {
  260. ClearProperties();
  261. GetLocalProperties(item, m_Properties);
  262. }
  263. void SendRPC(Object item, PlayerBase player)
  264. {
  265. Param1<Object> p1 = new Param1<Object>(item);
  266. m_Properties.InsertAt(p1,0);
  267. GetGame().RPC(player,ERPCs.RPC_ITEM_DIAG,m_Properties,true,player.GetIdentity());
  268. if (!GetGame().IsMultiplayer())
  269. {
  270. m_Entity = item;
  271. }
  272. }
  273. void StopWatchRequest(PlayerBase player)//called from player after an RPC call
  274. {
  275. if( m_ObserversMap.Contains(player) )
  276. {
  277. m_ObserversMap.Remove(player);
  278. }
  279. }
  280. void OnRPC(Object entity, ParamsReadContext ctx)
  281. {
  282. if (!GetGame().IsMultiplayer())
  283. {
  284. entity = m_Entity;
  285. }
  286. else
  287. {
  288. m_Entity = entity;
  289. }
  290. ItemBase item = ItemBase.Cast(entity);
  291. #ifdef DEVELOPER
  292. SetDebugDeveloper_item(entity);
  293. #endif
  294. if( !IsActive() )
  295. {
  296. ShowWidgets(true);
  297. }
  298. ctx.Read(CachedObjectsParams.PARAM1_STRING);
  299. string debug_output_server = CachedObjectsParams.PARAM1_STRING.param1;
  300. array<ref Param> vars_client;
  301. array<ref Param> vars_server;
  302. if (item)
  303. {
  304. ctx.Read(CachedObjectsParams.PARAM1_INT);//hardcoded to index 1
  305. int agents_count = CachedObjectsParams.PARAM1_INT.param1;
  306. ctx.Read(CachedObjectsParams.PARAM1_INT);//hardcoded to index 2
  307. int individual_items_count = CachedObjectsParams.PARAM1_INT.param1;
  308. FillAgentArray(ctx, agents_count);
  309. vars_server = new array<ref Param>;
  310. FillServerFinalVars(individual_items_count, ctx, vars_server);
  311. vars_client = new array<ref Param>;
  312. GetLocalProperties(item, vars_client, true);
  313. }
  314. if (EntityAI.Cast(entity))
  315. {
  316. DisplayAll(EntityAI.Cast(entity), vars_server, vars_client, debug_output_server );
  317. }
  318. if (GetDayZGame().IsInventoryOpen() || GetGame().GetUIManager().FindMenu(MENU_SCRIPTCONSOLE))
  319. m_DebugRootWidget.SetSort(-1);
  320. else
  321. m_DebugRootWidget.SetSort(10);
  322. m_DebugRootWidget.Show(true);
  323. }
  324. void FillServerFinalVars(int count, ParamsReadContext ctx, array<ref Param> params )
  325. {
  326. for(int i = 0; i < count; i++)
  327. {
  328. Param2<string,float> p2 = new Param2<string,float>("",0);
  329. ctx.Read(p2);
  330. /*
  331. string name = CachedObjectsParams.PARAM2_STRING_FLOAT.param1;
  332. float value = CachedObjectsParams.PARAM2_STRING_FLOAT.param2;
  333. PrintString(name+","+value.ToString());
  334. */
  335. params.Insert(p2);
  336. }
  337. //PrintString("----------------------------------------------------");
  338. }
  339. void InitializeWidgets()
  340. {
  341. m_EventHandler = new PluginItemDiagnosticEventHandler;
  342. m_EventHandler.m_Owner = this;
  343. if(!m_DebugRootWidget)
  344. m_DebugRootWidget = GetGame().GetWorkspace().CreateWidgets("gui/layouts/debug/debug_item.layout");
  345. m_DebugRootWidget.SetHandler(m_EventHandler);
  346. m_FrameWidget = m_DebugRootWidget.FindAnyWidget("FrameWidget0");
  347. m_DebugAgentListWidget = TextListboxWidget.Cast(m_DebugRootWidget.FindAnyWidget("w_Agents"));
  348. m_DebugOutputServer = TextWidget.Cast(m_DebugRootWidget.FindAnyWidget("DebugOutputServer"));
  349. m_DebugOutputClient = TextWidget.Cast(m_DebugRootWidget.FindAnyWidget("DebugOutputClient"));
  350. m_DebugFloatsProperListWidget = TextListboxWidget.Cast(m_DebugRootWidget.FindAnyWidget("w_FloatsProper"));
  351. m_ItemPreviewWidget = ItemPreviewWidget.Cast(m_DebugRootWidget.FindAnyWidget("w_ItemPreview"));
  352. m_ClassNameWidget = TextWidget.Cast(m_DebugRootWidget.FindAnyWidget("w_ClassName"));
  353. m_DistanceWidget = TextWidget.Cast(m_DebugRootWidget.FindAnyWidget("w_Distance"));
  354. m_DebugButtonWidget1 = ButtonWidget.Cast(m_DebugRootWidget.FindAnyWidget("DebugButton1"));
  355. m_DebugButtonWidget2 = ButtonWidget.Cast(m_DebugRootWidget.FindAnyWidget("DebugButton2"));
  356. m_DebugButtonWidget3 = ButtonWidget.Cast(m_DebugRootWidget.FindAnyWidget("DebugButton3"));
  357. m_DebugButtonWidget4 = ButtonWidget.Cast(m_DebugRootWidget.FindAnyWidget("DebugButton4"));
  358. m_CloseButton = ButtonWidget.Cast(m_DebugRootWidget.FindAnyWidget("CloseButton"));
  359. }
  360. override void OnUpdate(float delta_time)
  361. {
  362. super.OnUpdate(delta_time);
  363. if (!m_Entity || !m_IsActive)
  364. {
  365. if (m_ItemLine)
  366. {
  367. m_ItemLine.Destroy();
  368. m_ItemLine = null;
  369. }
  370. return;
  371. }
  372. m_ItemPreviewWidget.Show(!m_ScriptMenuOpened);
  373. if (m_IsDragging)
  374. {
  375. int x,y;
  376. GetMousePos(x,y);
  377. m_DebugRootWidget.SetPos(x + m_DraggingOffset[0], y + m_DraggingOffset[1]);
  378. }
  379. vector pts[2];
  380. pts[0] = GetGame().GetPlayer().GetPosition();
  381. pts[1] = m_Entity.GetPosition();
  382. if (m_ItemLine)
  383. {
  384. m_ItemLine.Destroy();
  385. m_ItemLine = null;
  386. }
  387. m_ItemLine = Shape.CreateLines(COLOR_BLUE, ShapeFlags.TRANSP|ShapeFlags.NOOUTLINE|ShapeFlags.NOZBUFFER, pts, 2);
  388. m_DistanceWidget.SetText(vector.Distance(pts[0], pts[1]).ToString()+"m.");
  389. }
  390. void DisplayAll(EntityAI item, array<ref Param> vars_server, array<ref Param> vars_client, string debug_text_server)
  391. {
  392. m_ClassNameWidget.SetText( item.GetType() );
  393. m_ItemPreviewWidget.SetItem(item);
  394. UpdateAgentWidget();
  395. //UpdateFloatWidget();
  396. if (vars_server && vars_client)
  397. UpdateNumericalVarsWidget(vars_server, vars_client);
  398. m_DebugOutputServer.SetText(debug_text_server);
  399. m_DebugOutputClient.SetText(item.GetDebugText());
  400. /*
  401. string button1, button2, button3, button4;
  402. item.GetDebugButtonNames(button1, button2, button3, button4);
  403. m_DebugButtonWidget1.SetText(button1);
  404. m_DebugButtonWidget2.SetText(button2);
  405. m_DebugButtonWidget3.SetText(button3);
  406. m_DebugButtonWidget4.SetText(button4);
  407. */
  408. }
  409. void FillAgentArray(ParamsReadContext ctx, int agents_count)
  410. {
  411. m_Agents.Clear();
  412. for(int i = 0; i < agents_count; i++)
  413. {
  414. if(ctx.Read(CachedObjectsParams.PARAM1_STRING))
  415. {
  416. string agent = CachedObjectsParams.PARAM1_STRING.param1;
  417. m_Agents.Insert(agent);
  418. }
  419. }
  420. }
  421. void UpdateAgentWidget()
  422. {
  423. m_DebugAgentListWidget.ClearItems();
  424. for(int i = 0; i < m_Agents.Count(); i++)
  425. {
  426. string agent = m_Agents.Get(i);
  427. m_DebugAgentListWidget.AddItem(agent,NULL,0);
  428. }
  429. }
  430. void UpdateNumericalVarsWidget(array<ref Param> vars_server, array<ref Param> vars_client)
  431. {
  432. m_DebugFloatsProperListWidget.ClearItems();
  433. for(int i = 0; i < vars_server.Count(); i++)
  434. {
  435. Param param_server = vars_server.Get(i);
  436. Param2<string,float> p2_server = Param2<string,float>.Cast(param_server);
  437. Param param_client = vars_client.Get(i);
  438. Param2<string,float> p2_client = Param2<string,float>.Cast(param_client);
  439. string name = p2_server.param1;
  440. m_DebugFloatsProperListWidget.AddItem(name,NULL,0);
  441. m_DebugFloatsProperListWidget.SetItem(i,p2_server.param2.ToString(),NULL,1);
  442. m_DebugFloatsProperListWidget.SetItem(i,p2_client.param2.ToString(),NULL,2);
  443. }
  444. }
  445. void PrintOut()
  446. {
  447. Debug.LogArrayString(m_Agents,"ItemDebug");
  448. Debug.Log("----------------------","ItemDebug");
  449. }
  450. //-------------------------
  451. // QUERY FOR DEBUG PROPERTIES
  452. //-------------------------
  453. void GetLocalProperties(EntityAI entity, array<ref Param> properties, bool client = false)
  454. {
  455. if(!entity)
  456. return;
  457. ItemBase item = ItemBase.Cast(entity);
  458. if(!client)
  459. {
  460. // -------- DEBUG OUTPUT ------
  461. Param1<string> debug_output = new Param1<string>(entity.GetDebugText());
  462. properties.Insert(debug_output);
  463. if(!item)
  464. return;
  465. // -------- AGENTS ------------
  466. int num_of_agents = FillWithAgents(item, properties);
  467. Param1<int> agents_count = new Param1<int>(num_of_agents);
  468. properties.InsertAt(agents_count,1);// hard coded index 1 !!
  469. }
  470. if(!item)
  471. return;
  472. // ------ INDIVIDUAL VARS------
  473. int number_of_items = 0;
  474. Param2<string, float> quantity = new Param2<string, float>("quantity", item.GetQuantity() );
  475. properties.Insert(quantity);
  476. number_of_items++;
  477. //-----------------------------
  478. Param2<string, float> liquid_type = new Param2<string, float>("liquid_type", item.GetLiquidType() );
  479. properties.Insert(liquid_type);
  480. number_of_items++;
  481. //-----------------------------
  482. Param2<string, float> wetness = new Param2<string, float>("wetness", item.GetWet() );
  483. properties.Insert(wetness);
  484. number_of_items++;
  485. //-----------------------------
  486. Param2<string, float> temperature = new Param2<string, float>("temperature", item.GetTemperature() );
  487. properties.Insert(temperature);
  488. number_of_items++;
  489. //-----------------------------
  490. Param2<string, float> frozen = new Param2<string, float>("frozen", item.GetIsFrozen() );
  491. properties.Insert(frozen);
  492. number_of_items++;
  493. //-----------------------------
  494. Param2<string, float> FTProgress = new Param2<string, float>("F/T pgs", item.GetFreezeThawProgress() );
  495. properties.Insert(FTProgress);
  496. number_of_items++;
  497. //-----------------------------
  498. #ifdef DEVELOPER
  499. Param2<string, float> FTChangeTime = new Param2<string, float>("LastChangeTime", item.m_LastFTChangeTime );
  500. properties.Insert(FTChangeTime);
  501. number_of_items++;
  502. //-----------------------------
  503. Param2<string, float> FTRemainingTime = new Param2<string, float>("FTTimeRemaining", item.m_PresumedTimeRemaining );
  504. properties.Insert(FTRemainingTime);
  505. number_of_items++;
  506. #endif
  507. //-----------------------------
  508. Param2<string, float> OverheatPgs = new Param2<string, float>("Overheat pgs", item.GetItemOverheatProgress() );
  509. properties.Insert(OverheatPgs);
  510. number_of_items++;
  511. //-----------------------------
  512. Edible_Base food;
  513. if (Class.CastTo(food,item) && food.GetFoodStage() != null)
  514. {
  515. Param2<string, float> CookingTime = new Param2<string, float>("CookingTime", food.GetCookingTime() );
  516. properties.Insert(CookingTime);
  517. number_of_items++;
  518. //-----------------------------
  519. Param2<string, float> DecayTime = new Param2<string, float>("DecayTime (remaining)", food.GetDecayTimer() );
  520. properties.Insert(DecayTime);
  521. number_of_items++;
  522. //-----------------------------
  523. Param2<string, float> DecayDelta = new Param2<string, float>("DecayDelta (last)", food.GetDecayDelta() );
  524. properties.Insert(DecayDelta);
  525. number_of_items++;
  526. }
  527. //-----------------------------
  528. Param2<string, float> energy = new Param2<string, float>("energy", item.GetEnergy() );
  529. properties.Insert(energy);
  530. number_of_items++;
  531. //-----------------------------
  532. Param2<string, float> health;
  533. if(!client)
  534. {
  535. health = new Param2<string, float>("health", item.GetHealth("", "") );
  536. }
  537. else
  538. {
  539. health = new Param2<string, float>("NO SYNC",0 );
  540. }
  541. properties.Insert(health);
  542. number_of_items++;
  543. //-----------------------------
  544. /*int r,g,b,a;
  545. item.GetColor(r,g,b,a);
  546. Param2<string, float> p2r = new Param2<string, float>("R",r);
  547. properties.Insert(p2r);
  548. number_of_items++;
  549. Param2<string, float> p2g = new Param2<string, float>("G",g);
  550. properties.Insert(p2g);
  551. number_of_items++;
  552. Param2<string, float> p2b = new Param2<string, float>("B",b);
  553. properties.Insert(p2b);
  554. number_of_items++;
  555. Param2<string, float> p2a = new Param2<string, float>("A",a);
  556. properties.Insert(p2a);
  557. number_of_items++;*/
  558. //-----------------------------
  559. if(!client)
  560. {
  561. Param1<int> item_count = new Param1<int>(number_of_items);
  562. properties.InsertAt(item_count,2);
  563. }
  564. }
  565. int FillWithAgents(ItemBase item, array<ref Param> properties)
  566. {
  567. if (!item)
  568. {
  569. return 0;
  570. }
  571. int agents = item.GetAgents();
  572. if(agents == 0) return 0;
  573. int num_of_agents = 0;
  574. ref array<int> agents_aray = new array<int>;
  575. PluginTransmissionAgents.BuildAgentArray(agents, agents_aray);
  576. int agents_count = agents_aray.Count();
  577. for(int i = 0; i < agents_count; i++)
  578. {
  579. //PluginTransmissionAgents mta = PluginTransmissionAgents.Cast(GetPlugin(PluginTransmissionAgents));
  580. string agent_name = PluginTransmissionAgents.GetNameByID(agents_aray.Get(i));
  581. Param1<string> param1 = new Param1<string>(agent_name);
  582. properties.Insert(param1);
  583. num_of_agents++;
  584. }
  585. return num_of_agents;
  586. }
  587. }