Advertisement
Guest User

Untitled

a guest
May 21st, 2013
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.61 KB | None | 0 0
  1. private ["_characterID","_temp","_currentWpn","_magazines","_force","_isNewPos","_humanity","_isNewGear","_currentModel","_modelChk","_playerPos","_playerGear","_playerBackp","_backpack","_killsB","_killsH","_medical","_isNewMed","_character","_timeSince","_charPos","_isInVehicle","_distanceFoot","_lastPos","_kills","_headShots","_timeGross","_timeLeft","_onLadder","_isTerminal","_currentAnim","_muzzles","_array","_key","_lastTime","_config","_currentState","_pos"];
  2. //[player,array]
  3. //diag_log ("UPDATE: " + str(_this) );
  4.  
  5. //waituntil {(typeName(_this) == "ARRAY");sleep 0.01;}; //seems to cause often infinite waits (but not for first n players)
  6.  
  7. //this only happens when we don't follow the correct parameter format...
  8. //(like supplying just the player object instead of the array in player_eat.sqf)
  9. //i've fixed this in player_eat so i can comment this part out
  10. /*if ( typeName(_this) == "OBJECT" ) then {
  11. _this = [_this,[],true];
  12. //diag_log ("DW_DEBUG: #manual fix _this: " + str(_this));
  13. };*/
  14.  
  15. //correct
  16. //"UPDATE: [B 1-1-B:1 (THE BEAST) REMOTE,[],true]"
  17. //error
  18. //"UPDATE: B 1-1-B:1 (THE BEAST) REMOTE"
  19.  
  20. _character = _this select 0;
  21. _magazines = _this select 1;
  22. _force = _this select 2;
  23. _force = true;
  24.  
  25. _characterID = _character getVariable ["characterID","0"];
  26. _charPos = getPosATL _character;
  27. _isInVehicle = vehicle _character != _character;
  28. _timeSince = 0;
  29. _humanity = 0;
  30.  
  31. //diag_log ("DW_DEBUG: (isnil _characterID): " + str(isnil "_characterID"));
  32. /*
  33. if !(isnil "_characterID") then {
  34. diag_log ("DW_DEBUG: _characterID: " + str(_characterID));
  35. };
  36. */
  37.  
  38. if (_character isKindOf "Animal") exitWith {
  39. diag_log ("ERROR: Cannot Sync Character " + (name _character) + " is an Animal class");
  40. };
  41.  
  42. if (isnil "_characterID") exitWith {
  43. diag_log ("ERROR: Cannot Sync Character " + (name _character) + " has nil characterID");
  44. };
  45.  
  46. if (_characterID == "0") exitWith {
  47. diag_log ("ERROR: Cannot Sync Character " + (name _character) + " as no characterID");
  48. };
  49.  
  50. private["_debug","_distance"];
  51. _debug = getMarkerpos "respawn_west";
  52. _distance = _debug distance _charPos;
  53. //diag_log ("debug _charPos = " + str(_charPos));
  54. //diag_log ("debug _distance = " + str(_distance));
  55. if (_distance < 2000) exitWith {
  56. diag_log format["ERROR: server_playerSync: Cannot Sync Player %1 [%2]. Position in debug! %3",name _character,_characterID,_charPos];
  57. };
  58.  
  59. //Check for server initiated updates
  60. _isNewMed = _character getVariable["medForceUpdate",false]; //Med Update is forced when a player receives some kind of med incident
  61. _isNewPos = _character getVariable["posForceUpdate",false]; //Med Update is forced when a player receives some kind of med incident
  62. _isNewGear = (count _magazines) > 0;
  63.  
  64. //diag_log ("Starting Save... MED: " + str(_isNewMed) + " / POS: " + str(_isNewPos)); sleep 0.05;
  65.  
  66. //Check for player initiated updates
  67. if (_characterID != "0") then {
  68. _playerPos = [];
  69. _playerGear = [];
  70. _playerBackp = [];
  71. _medical = [];
  72. _distanceFoot = 0;
  73.  
  74. //diag_log ("Found Character...");
  75.  
  76. //Check if update is requested
  77. if (_isNewPos or _force) then {
  78. //diag_log ("position..." + str(_isNewPos) + " / " + str(_force)); sleep 0.05;
  79. if (((_charPos select 0) == 0) and ((_charPos select 1) == 0)) then {
  80. //Zero Position
  81. } else {
  82. //diag_log ("getting position..."); sleep 0.05;
  83. _playerPos = [round(direction _character),_charPos];
  84. _lastPos = _character getVariable["lastPos",_charPos];
  85. if (count _lastPos > 2 and count _charPos > 2) then {
  86. if (!_isInVehicle) then {
  87. _distanceFoot = round(_charPos distance _lastPos);
  88. if ( _distanceFoot > 2000 ) then
  89. {
  90. _distanceFoot = 0;
  91. };
  92. //diag_log ("debug _distanceFoot = " + str(_distanceFoot));
  93. };
  94. _character setVariable["lastPos",_charPos];
  95. };
  96. if (count _charPos < 3) then {
  97. _playerPos = [];
  98. };
  99. //diag_log ("position = " + str(_playerPos)); sleep 0.05;
  100. };
  101. _character setVariable ["posForceUpdate",false,true];
  102. };
  103. if (_isNewGear) then {
  104. //diag_log ("gear..."); sleep 0.05;
  105. _playerGear = [weapons _character,_magazines];
  106. //diag_log ("playerGear: " +str(_playerGear));
  107. _backpack = unitBackpack _character;
  108. _playerBackp = [typeOf _backpack,getWeaponCargo _backpack,getMagazineCargo _backpack];
  109. };
  110. if (_isNewMed or _force) then {
  111. //diag_log ("medical..."); sleep 0.05;
  112. if (!(_character getVariable["USEC_isDead",false])) then {
  113. //diag_log ("medical check..."); sleep 0.05;
  114. _medical = _character call player_sumMedical;
  115. //diag_log ("medical result..." + str(_medical)); sleep 0.05;
  116. };
  117. _character setVariable ["medForceUpdate",false,true];
  118. };
  119.  
  120. //Process update
  121. if (_characterID != "0") then {
  122. //Record stats while we're here
  123. /*
  124. Check previous stats against what client had when they logged in
  125. this helps prevent JIP issues, where a new player wouldn't have received
  126. the old players updates. Only valid for stats where clients could have
  127. be recording results from their local objects (such as agent zombies)
  128. */
  129. _kills = ["zombieKills",_character] call server_getDiff;
  130. _killsB = ["banditKills",_character] call server_getDiff;
  131. _killsH = ["humanKills",_character] call server_getDiff;
  132. _headShots = ["headShots",_character] call server_getDiff;
  133. _humanity = ["humanity",_character] call server_getDiff2;
  134. //_humanity = _character getVariable ["humanity",0];
  135. _character addScore _kills;
  136. /*
  137. Assess how much time has passed, for recording total time on server
  138. */
  139. _lastTime = _character getVariable["lastTime",time];
  140. _timeGross = (time - _lastTime);
  141. _timeSince = floor(_timeGross / 60);
  142. _timeLeft = (_timeGross - (_timeSince * 60));
  143. /*
  144. Get character state details
  145. */
  146. _currentWpn = currentMuzzle _character;
  147. _currentAnim = animationState _character;
  148. _config = configFile >> "CfgMovesMaleSdr" >> "States" >> _currentAnim;
  149. _onLadder = (getNumber (_config >> "onLadder")) == 1;
  150. _isTerminal = (getNumber (_config >> "terminal")) == 1;
  151. //_wpnDisabled = (getNumber (_config >> "disableWeapons")) == 1;
  152. _currentModel = typeOf _character;
  153. _modelChk = _character getVariable ["model_CHK",""];
  154. if (_currentModel == _modelChk) then {
  155. _currentModel = "";
  156. } else {
  157. _currentModel = str(_currentModel);
  158. _character setVariable ["model_CHK",typeOf _character];
  159. };
  160.  
  161. if (_onLadder or _isInVehicle or _isTerminal) then {
  162. _currentAnim = "";
  163. //If position to be updated, make sure it is at ground level!
  164. if ((count _playerPos > 0) and !_isTerminal) then {
  165. _charPos set [2,0];
  166. _playerPos set[1,_charPos];
  167. };
  168. };
  169. if (_isInVehicle) then {
  170. _currentWpn = "";
  171. } else {
  172. if ( typeName(_currentWpn) == "STRING" ) then {
  173. _muzzles = getArray(configFile >> "cfgWeapons" >> _currentWpn >> "muzzles");
  174. if (count _muzzles > 1) then {
  175. _currentWpn = currentMuzzle _character;
  176. };
  177. } else {
  178. //diag_log ("DW_DEBUG: _currentWpn: " + str(_currentWpn));
  179. _currentWpn = "";
  180. };
  181. };
  182. _temp = round(_character getVariable ["temperature",100]);
  183. _currentState = [_currentWpn,_currentAnim,_temp];
  184. /*
  185. Everything is ready, now publish to HIVE
  186. */
  187. if (count _playerPos > 0) then {
  188. _array = [];
  189. {
  190. if (_x > -20000 and _x < 20000) then {
  191. _array set [count _array,_x];
  192. };
  193. } forEach (_playerPos select 1);
  194. _playerPos set [1,_array];
  195. };
  196. if (!isNull _character) then {
  197. if (alive _character) then {
  198. //Wait for HIVE to be free
  199. //Send request
  200. _key = format["CHILD:201:%1:%2:%3:%4:%5:%6:%7:%8:%9:%10:%11:%12:%13:%14:%15:%16:",_characterID,_playerPos,_playerGear,_playerBackp,_medical,false,false,_kills,_headShots,_distanceFoot,_timeSince,_currentState,_killsH,_killsB,_currentModel,_humanity];
  201. //diag_log ("HIVE: WRITE: "+ str(_key) + " / " + _characterID);
  202. _key call server_hiveWrite;
  203. };
  204. };
  205.  
  206. // If player is in a vehicle, keep its position updated
  207. if (vehicle _character != _character) then {
  208. // [vehicle _character, "position"] call server_updateObject;
  209. if (!(vehicle _character in needUpdate_objects)) then {
  210. //diag_log format["DEBUG: Added to NeedUpdate=%1",_object];
  211. needUpdate_objects set [count needUpdate_objects, vehicle _character];
  212. };
  213. };
  214.  
  215. // Force gear updates for nearby vehicles/tents
  216. _pos = _this select 0;
  217. {
  218. [_x, "gear"] call server_updateObject;
  219. } forEach nearestObjects [_pos, ["Car", "Helicopter", "Motorcycle", "Ship", "TentStorage"], 10];
  220. //[_charPos] call server_updateNearbyObjects;
  221.  
  222. //Reset timer
  223. if (_timeSince > 0) then {
  224. _character setVariable ["lastTime",(time - _timeLeft)];
  225. };
  226. };
  227. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement