cserver.php 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. <?php
  2. require_once( PATH_LIB . 'cserver/ESPacket.php' );
  3. require_once( PATH_LIB . 'cserver/NetUtil.php' );
  4. class IDataServer{
  5. const PHP_CALL_SERVER_GET_PROPERTY = 0x1004; //获取用户基本信息
  6. const PHP_CALL_SERVER_UPDATE_PROPERTY = 0x1005; //设置用户基本信息
  7. const PHP_CALL_SERVER_MATCH_INFO = 0x910; //获取比赛场相关信息
  8. const PHP_UPDATE_MATCH_INFO_NOTICE_SERVER = 0x909; //通知server比赛场信息有修改
  9. const PHP_UPDATE_MATCH_STATUS_NOTICE_SERVER = 0x908; //通知server比赛场状态有修改 开或者关
  10. private $errCode;
  11. private $errMsg;
  12. private $enumArr = array(1, 2, 3); //修改用户属性的枚举类型 1=>money 2=>safe_box 3=>total_money
  13. public function __construct(){
  14. $this->errCode = 0;
  15. $this->errMsg = '';
  16. }
  17. /**
  18. * 获取用户金币,经验,输,赢
  19. * @param unknown $mid
  20. * @return boolean|multitype:NULL number
  21. */
  22. public function getUserProperty( $mid ){
  23. if ( ! $mid = oo::functions()->uint( $mid)) {
  24. return false;
  25. }
  26. $packet = new ESPacket();
  27. $packet->WriteBegin( self::PHP_CALL_SERVER_GET_PROPERTY);
  28. $packet->WriteInt($mid);
  29. $packet->WriteEnd();
  30. $request = $packet->GetPacketBuffer();
  31. $moneyServerIp = oo::$config['MoneyServer'][0];
  32. $moneyServerPort = oo::$config['MoneyServer'][1];
  33. $response = NetUtil::tcpCmd($moneyServerIp, $moneyServerPort, $request, 5, 3 );
  34. if(empty($response)){
  35. return false;
  36. }
  37. $RevPacket = new ESPacket();
  38. $RevPacket->SetRecvPacketBuffer($response , strlen($response));
  39. $RevPacket->ParsePacket();
  40. $retCode = $RevPacket->ReadInt();
  41. if ( $retCode == 0) {
  42. $retStr = $RevPacket->ReadString();//逗号分隔字符串
  43. $array = array();
  44. $retArr = explode(',', $retStr);
  45. $array['money'] = intval($retArr[0]);
  46. $array['safebox'] = intval($retArr[1]);
  47. $array['totalMoney'] = intval($retArr[2]);
  48. $array['exp'] = intval($retArr[3]);
  49. $array['level'] = intval($retArr[4]);
  50. $array['wintimes'] = intval($retArr[5]);
  51. $array['losetimes'] = intval($retArr[6]);
  52. $array['diamonds'] = intval($retArr[7]);
  53. $array['masterPoints'] = intval($retArr[8]);
  54. } else {
  55. return false;
  56. }
  57. return $array;
  58. }
  59. /**
  60. * 修改用户金币,经验,输,赢
  61. * @param unknown $mid
  62. * @param unknown $array uid,money,exp,win, reason 标识
  63. * @return boolean|mixed
  64. */
  65. public function updateUserProperty($array){
  66. if ( !$uid = oo::functions()->uint( $array['uid'])) {
  67. return false;
  68. }
  69. //过滤出uid和reason,再加一个是否需要通知
  70. $uid = $array['uid'];
  71. $reason = empty($array['reason']) ? 20000 : $array['reason'];
  72. $needNotice = $array['neednotice'];
  73. unset($array['uid'], $array['reason'], $array['neednotice']);
  74. $oprLen = count($array);//操作类型的长度
  75. $packet = new ESPacket();
  76. $packet->WriteBegin(self::PHP_CALL_SERVER_UPDATE_PROPERTY);
  77. $packet->WriteInt($uid);
  78. $packet->WriteString('');
  79. $packet->WriteByte($oprLen);
  80. foreach ($array as $type => $val) {
  81. $packet->WriteInt($type);
  82. if( in_array($type, $this->enumArr) ){
  83. $packet->WriteInt64($val);
  84. }else{
  85. $packet->WriteInt($val);
  86. }
  87. }
  88. $packet->WriteInt($reason);
  89. $packet->WriteEnd();
  90. $request = $packet->GetPacketBuffer();
  91. $moneyServerIp = oo::$config['MoneyServer'][0];
  92. $moneyServerPort = oo::$config['MoneyServer'][1];
  93. $response = NetUtil::tcpCmd( $moneyServerIp, $moneyServerPort, $request, 5, 3 );
  94. if( empty($response) )
  95. {
  96. return false;
  97. }
  98. $packet = new ESPacket();
  99. $packet->SetRecvPacketBuffer($response, strlen($response));
  100. $packet->ParsePacket();
  101. $retCode = $packet->ReadInt();
  102. if( $retCode != 0 ){
  103. return false;
  104. }
  105. $retStr = $packet->ReadString();
  106. $retArr = explode(',', $retStr);
  107. $arr = array();
  108. $arr['money'] = $retArr[0];
  109. $arr['safe_box'] = $retArr[1];
  110. $arr['total_money'] = $retArr[2];
  111. $arr['exp'] = $retArr[3];
  112. $arr['leve'] = $retArr[4];
  113. $arr['wintimes'] = $retArr[5];
  114. $arr['losetimes'] = $retArr[6];
  115. $arr['diamonds'] = $retArr[7];
  116. $arr['masterpoints'] = $retArr[8];
  117. //广播通知 --- 更新用户属性,包括金币,经验等
  118. if( $needNotice ) {
  119. oo::broadCastServer()->notifyPropertyChange($uid, $arr);
  120. }
  121. return $arr;
  122. }
  123. /**
  124. * 通过比赛场level获取比赛场信息
  125. */
  126. public function getMatchInfoByLevel($matchLevel = 0)
  127. {
  128. $data = array();
  129. if ( empty($matchLevel) ) {
  130. return $data;
  131. }
  132. $level = intval($matchLevel);
  133. $packet = new ESPacket();
  134. $packet->WriteBegin(self::PHP_CALL_SERVER_MATCH_INFO);
  135. $packet->WriteInt($level);
  136. $packet->WriteEnd();
  137. $request = $packet->GetPacketBuffer();
  138. $moneyServerIp = oo::$config['MatchServer_'.$level][0];
  139. $moneyServerPort = oo::$config['MatchServer_'.$level][1];
  140. $response = NetUtil::tcpCmd( $moneyServerIp, $moneyServerPort, $request, 5, 3 );
  141. if( empty($response) )
  142. {
  143. return $data;
  144. }
  145. $RevPacket = new ESPacket();
  146. $RevPacket->SetRecvPacketBuffer($response, strlen($response));
  147. $RevPacket->ParsePacket();
  148. $sMatchLevel = $RevPacket->ReadInt();
  149. if ( $sMatchLevel != $level ) {
  150. return $data;
  151. }
  152. $sCurrentJoinCnt = $RevPacket->ReadInt(); //当前报名人数
  153. $sCurrentJoinOnline = $RevPacket->ReadInt(); //当前报名在线人数
  154. $sCurrentPlayCnt = $RevPacket->ReadInt(); //当前在玩人数
  155. $sCurrentMatchCnt = $RevPacket->ReadInt(); //当前状态,0表示没有开赛,1以上数字表示同时整在进行几场
  156. $sM_MaintainSwitch = $RevPacket->ReadInt(); //当前系统维护标志,0表示禁止报名,1表示允许报名
  157. $data['matchlevel'] = $sMatchLevel;
  158. $data['currentJoinCnt'] = $sCurrentJoinCnt;
  159. $data['currentJoinOnline'] = $sCurrentJoinOnline;
  160. $data['currentPlayCnt'] = $sCurrentPlayCnt;
  161. $data['currentMatchCnt'] = $sCurrentMatchCnt;
  162. $data['m_MaintainSwitch'] = $sM_MaintainSwitch;
  163. return $data;
  164. }
  165. /**
  166. * 比赛场有修改后通知server端
  167. * @param int $matchLevel
  168. * @return array|string
  169. */
  170. public function noticeServerMatchInfoUpdate($matchLevel = 0)
  171. {
  172. $matchLevel = intval($matchLevel);
  173. if(empty($matchLevel)) {
  174. return false;
  175. }
  176. $matchServerIP = oo::$config['MatchServer_'.$matchLevel][0];
  177. $matchServerPort = oo::$config['MatchServer_'.$matchLevel][1];
  178. if(empty($matchServerIP) || empty($matchServerPort)) {
  179. return false;
  180. }
  181. $packet = new ESPacket();
  182. $packet->WriteBegin(self::PHP_UPDATE_MATCH_INFO_NOTICE_SERVER);
  183. $packet->WriteEnd();
  184. $request = $packet->GetPacketBuffer();
  185. oo::logs()->debug3("IP:{$matchServerIP} port:{$matchServerPort} request:{$request}", 'Match.php');
  186. NetUtil::tcpCmd($matchServerIP, $matchServerPort, $request, 5, 3);//server端没有给返回
  187. return true;
  188. }
  189. /**
  190. * 比赛场状态有修改后通知server端
  191. * @param int $matchLevel
  192. * @param int $status 0 关闭 1 打开
  193. * @return array|string
  194. */
  195. public function noticeServerMatchStatusUpdate($matchLevel = 0, $status = 1)
  196. {
  197. $matchLevel = intval($matchLevel);
  198. if(empty($matchLevel)) {
  199. return false;
  200. }
  201. if(!in_array($status, [0, 1])) {
  202. return false;
  203. }
  204. $matchServerIP = oo::$config['MatchServer_'.$matchLevel][0];
  205. $matchServerPort = oo::$config['MatchServer_'.$matchLevel][1];
  206. if(empty($matchServerIP) || empty($matchServerPort)) {
  207. return false;
  208. }
  209. $packet = new ESPacket();
  210. $packet->WriteBegin(self::PHP_UPDATE_MATCH_STATUS_NOTICE_SERVER);
  211. $packet->WriteInt($status);
  212. $packet->WriteEnd();
  213. $request = $packet->GetPacketBuffer();
  214. oo::logs()->debug3("IP:{$matchServerIP} port:{$matchServerPort} request:{$request}", 'Match.php');
  215. $response = NetUtil::tcpCmd($matchServerIP, $matchServerPort, $request, 5, 3);//server端返回1 则成功
  216. if( empty($response) )
  217. {
  218. return false;
  219. }
  220. $RevPacket = new ESPacket();
  221. $RevPacket->SetRecvPacketBuffer($response, strlen($response));
  222. $RevPacket->ParsePacket();
  223. $retCode = $RevPacket->ReadInt();
  224. oo::logs()->debug3("IP:{$matchServerIP} port:{$matchServerPort} request:{$request}##end responseCode:{$retCode}'##end", 'Match.php');
  225. if ( $retCode == 1 ) {
  226. return true;
  227. }
  228. return false;
  229. }
  230. }