SystemProc.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592
  1. <?php
  2. //
  3. //namespace loyalsoft;
  4. //
  5. //// <editor-fold defaultstate="collapsed" desc=" 定义 ">
  6. //
  7. ///**
  8. // * 约定好的消息类型
  9. // */
  10. //class SysMessageType extends Enum {
  11. //
  12. // /** (1)XXX(玩家名称)解锁英雄XXX(紫色橙色英雄) */
  13. // const GetHero = 1;
  14. //
  15. // /** (2)XXX(玩家名称)的英雄XXX(紫色橙色英雄)神血升值40%+(40%都有) */
  16. // const Hero_purification = 2;
  17. //
  18. // /** (3)XXX 获得XXX(紫色橙色装备) */
  19. // const GetEquip = 3;
  20. //
  21. // /** (4)XXX(玩家名称)购买公会钻石礼包 */
  22. // const BuyGuild_CashPack = 4;
  23. //
  24. // /** (5)XXX(玩家名称)升到XX级别(20级以上) */
  25. // const UserLevelUp = 5;
  26. //
  27. // /** (6)XXX(玩家名称)达到XX段位(黄金以上) */
  28. // const PVP_League = 6;
  29. //
  30. // /** (7) XXX(玩家名称)打败噩梦关八岐大蛇,获得铂金宝箱,可喜可贺!
  31. // * 通过副本
  32. // * */
  33. // const Pass_carbon = 7;
  34. //
  35. // /** (4)装备-强化 */
  36. // const Weapon_Promote = 4000;
  37. //
  38. // /**
  39. // * (99)玩家自己购买的全服消息(本分区)
  40. // */
  41. // const UserSendMessage = 99;
  42. //
  43. // /**
  44. // * 得到特定品阶的武器
  45. // */
  46. // const GetSpecialQualityWeapon = 10;
  47. //
  48. // /**
  49. // * 得到特定品阶的言灵
  50. // */
  51. // const GetSpecialQualityYanling = 11;
  52. //
  53. // /**
  54. // * 通关无尽塔第X层
  55. // */
  56. // const PassEndlessTower = 12;
  57. //
  58. // /**
  59. // * 完成X个悬赏任务数量
  60. // */
  61. // const CompleteSpecialNumXuanShangTask = 13;
  62. //
  63. // /**
  64. // * 获得X数量的言灵
  65. // */
  66. // const GetSpecialNumYanling = 14;
  67. //
  68. // /**
  69. // * 恭喜XXX消耗60点体力
  70. // */
  71. // const CostTili = 15;
  72. //
  73. // /**
  74. // * 恭喜XXX连续在线20分钟
  75. // */
  76. // const onlineGiftts = 16;
  77. //
  78. //}
  79. //
  80. ///**
  81. // * 系统消息对象
  82. // */
  83. //class SysMessageModel extends Object_ext {
  84. //
  85. // /** @var SysMessageType */
  86. // public $type;
  87. //
  88. // /** @var array 消息数据 */
  89. // public $datas;
  90. //
  91. // /** @var int */
  92. // public $ts;
  93. //
  94. //}
  95. //
  96. ////
  97. //// </editor-fold>
  98. //
  99. ///**
  100. // * 系统消息逻辑处理流程
  101. // * @author gwang
  102. // */
  103. //class SystemProc {
  104. //
  105. // /**
  106. // * 系统消息的过期时间(秒)
  107. // * @var int
  108. // */
  109. // const SYS_MSG_OUTTS = 3600;
  110. //
  111. // /**
  112. // * 主逻辑分发
  113. // * @param type $req
  114. // * @return type
  115. // */
  116. // static function procMain($req) {
  117. // switch (req()->cmd) {
  118. // case CmdCode::cmd_system_userSendsysmessage: # 6904 玩家发送系统广播
  119. // return self::userPushSysMessage();
  120. // case CmdCode::cmd_system_getsysmessage: # 6901 拉取系统消息
  121. // return self::getSysMessage();
  122. // case CmdCode::cmd_system_logreport: # 6902 客户端上报日志
  123. // return self::logReport();
  124. // case CmdCode::cmd_system_clienttick: # 6903 客户端心跳包
  125. // return self::clientTick();
  126. // default :
  127. // return Resp::err(ErrCode::cmd_err);
  128. // }
  129. // }
  130. //
  131. ////
  132. //// <editor-fold defaultstate="collapsed" desc=" 暂时不管 ">
  133. ////
  134. //
  135. // /**
  136. // * [6903] 客户端心跳包
  137. // */
  138. // static function clientTick() {
  139. // $timespan = now() - ctx()->base()->lastSaveTs;
  140. //
  141. // //$ts = now() - ctx()->privateData()->onlineGiftClearTs;
  142. // if ($timespan < 300) { # 间隔超过5分钟的不算
  143. // if ($timespan < 30) { # 心跳包固定30秒1次
  144. // $timespan = 30;
  145. // }
  146. // ctx()->privateData()->onlineGiftts += $timespan;
  147. // ctx()->privateData()->onlineTs += $timespan;
  148. // self::OnlineGifttsRecord(req()->zoneid, ctx()->baseInfo->name);
  149. // UserProc::updateUserInfo();
  150. // }
  151. // return Resp::ok();
  152. // }
  153. //
  154. // /**
  155. // * [6902] 客户端日志上报
  156. // */
  157. // static function logReport() {
  158. // list($eventID, $EArgKey, $EArgValue) = req()->paras; # 客户端参数解析:
  159. // $key = MemKey_GameRun::stat_clientReportLog($eventID);
  160. // $logItem = array(# # 组装对象
  161. // 'uid' => req()->uid,
  162. // 'EArgKey' => $EArgKey,
  163. // 'EArgValue' => $EArgValue,
  164. // 'ts' => TimeUtil::dtCurrent()
  165. // );
  166. // gMem()->lpush($key, array($logItem)); # 压入日志
  167. //// $max = 300;
  168. //// $once = 30;
  169. //// if (gMem()->llen($key) > $max + $once) { # 达到清理条件
  170. //// gMem()->ltrim($key, 0, -$once); # 缩减记录
  171. //// }
  172. // return Resp::ok("copy!");
  173. // }
  174. //
  175. ////
  176. ////
  177. //// </editor-fold>
  178. ////
  179. //
  180. // /**
  181. // * 玩家通过xx副本消息
  182. // * @param type $zoneid
  183. // * @param Data_UserGame $user
  184. // * @param int $carbonID
  185. // * */
  186. // static function Carbon_Win($zoneid, $user, $carbonID, $hardLevel) {
  187. // if (512001 == $carbonID) {
  188. // self::pushSysMessage($zoneid, SysMessageType::Pass_carbon, array(
  189. // $user->name, $carbonID, $hardLevel
  190. // ));
  191. // }
  192. // }
  193. //
  194. // /**
  195. // * 玩家pvp段位消息
  196. // * @param type $zoneid
  197. // * @param Data_UserGame $user
  198. // * @param int $leagueID
  199. // * */
  200. // static function PVP_league($zoneid, $user, $leagueID) {
  201. // if ($leagueID > 10) {
  202. // self::pushSysMessage($zoneid, SysMessageType::PVP_League, array(
  203. // $user->name, GameConfig::pvp_leaguescore_getItem($leagueID)->leagueName
  204. // ));
  205. // }
  206. // }
  207. //
  208. // /**
  209. // * [6901]获取系统广播消息列表
  210. // */
  211. // static function getSysMessage() {
  212. // //客户端参数解析
  213. // $ts = req()->paras[0]; # 消息列表有效时间戳
  214. // $defaultwaitcont = 60; # 暂时使用60秒作为频率,若是有压力就调大些. 若是没有问题,可以调小些.
  215. // $itemDisplayTime = 7; # 7秒显示完一条消息
  216. //
  217. // $sysMessage = self::mem_getSysMsg_zset(req()->zoneid, $ts);
  218. //
  219. // $count = count($sysMessage) * $itemDisplayTime; # 计算下次取消息的时间
  220. // if ($count < $defaultwaitcont) { # 最低刷新时间
  221. // $count = $defaultwaitcont;
  222. // }
  223. // $ret = array(
  224. // 'sysMessage' => $sysMessage,
  225. // 'nextFetchTime' => $count
  226. // );
  227. //
  228. // return Resp::ok($ret); # 返回信息
  229. // }
  230. //
  231. // /**
  232. // * [6904]玩家发送系统广播消息
  233. // */
  234. // static function userPushSysMessage() {
  235. // list($msg, $type) = req()->paras; # 提取参数: 消息内容, 消耗道具类型,1:钻石,2:xx
  236. // $uid = req()->uid;
  237. // $user = ctx();
  238. // $cost = 0; // 花费
  239. // switch ($type) {
  240. // case 1: # 钻石
  241. // $cost = glc()->SystemMessage_UserSendToMyZone_Cost;
  242. // my_Assert($cost, ErrCode::err_msg_usersnedmsg_errorcost);
  243. // my_Assert($user->base()->Consume_Cash($cost), ErrCode::notenough_cash_msg);
  244. // break;
  245. // default :
  246. // Err(ErrCode::paras_err); // 其他类型:参数非法
  247. // }
  248. // self::pushSysMessage(req()->zoneid, #
  249. // SysMessageType::UserSendMessage, array($uid, $user->baseInfo->name, $msg));
  250. // UserProc::updateUserInfo(); // 回存账号数据
  251. // return Resp::ok(array('ret' => "succeed")); # 返回值
  252. // }
  253. //
  254. // // -----------------辅助方法---------------------
  255. // //
  256. //
  257. // /**
  258. // * 得到特定品阶的武器
  259. // * @param type $zoneid
  260. // * @param type $name
  261. // * @param type $weaponTypeId
  262. // */
  263. // static function GetSpecialQualityWeapon($zoneid, $name, $weaponTypeId) {
  264. // $mo = GameConfig::item_base_getItem($weaponTypeId);
  265. //
  266. // if ($mo->quality == 5) {
  267. // $color = "紫色";
  268. // self::pushSysMessage($zoneid, SysMessageType::GetSpecialQualityWeapon, array(
  269. // $name, $color, $mo->name
  270. // ));
  271. // }
  272. //
  273. // if ($mo->quality == 7) {
  274. // $color = "橙色";
  275. // self::pushSysMessage($zoneid, SysMessageType::GetSpecialQualityWeapon, array(
  276. // $name, $color, $mo->name
  277. // ));
  278. // }
  279. // }
  280. //
  281. // /**
  282. // * 得到特定品阶的言灵
  283. // * @param type $zoneid
  284. // * @param type $name
  285. // * @param type $yanlingTypeId
  286. // */
  287. // static function GetSpecialQualityYanling($zoneid, $name, $yanlingTypeId) {
  288. // $mo = GameConfig::item_base_getItem($yanlingTypeId);
  289. //
  290. // if ($mo->quality == 5) {
  291. // $color = "紫色";
  292. // self::pushSysMessage($zoneid, SysMessageType::GetSpecialQualityYanling, array(
  293. // $name, $color, $mo->name
  294. // ));
  295. // }
  296. //
  297. // if ($mo->quality == 7) {
  298. // $color = "橙色";
  299. // self::pushSysMessage($zoneid, SysMessageType::GetSpecialQualityYanling, array(
  300. // $name, $color, $mo->name
  301. // ));
  302. // }
  303. // }
  304. //
  305. // /**
  306. // * 通关无尽塔第X层
  307. // * @param type $zoneid
  308. // * @param type $name
  309. // * @param type $gateId
  310. // */
  311. // static function PassEndlessTower($zoneid, $name, $index) {
  312. // $endlessTowerArr = array(10, 20, 30, 40, 50, 60, 70, 80, 90, 100);
  313. // if (in_array($index, $endlessTowerArr)) {
  314. // self::pushSysMessage($zoneid, SysMessageType::PassEndlessTower, array(
  315. // $name, $index
  316. // ));
  317. // }
  318. // }
  319. //
  320. // /**
  321. // * 完成X个悬赏任务数量
  322. // * @param type $zoneid
  323. // * @param type $name
  324. // */
  325. // static function CompleteSpecialNumXuanShangTask($zoneid, $name) {
  326. // $arr = array(10, 20);
  327. // if (in_array(ctx()->privateState->shopTaskCompleteNum, $arr)) {
  328. // self::pushSysMessage($zoneid, SysMessageType::CompleteSpecialNumXuanShangTask, array(
  329. // $name, ctx()->privateState->shopTaskCompleteNum
  330. // ));
  331. // }
  332. // }
  333. //
  334. // /**
  335. // * 获得X数量的言灵
  336. // * @param type $zoneid
  337. // * @param type $name
  338. // */
  339. // static function GetSpecialNumYanling($zoneid, $name) {
  340. // $arr = array(10, 20, 30, 40, 50);
  341. // $yanling = ctx()->store->yanling;
  342. // $num = count(StlUtil::dictToArray($yanling));
  343. //
  344. // if (in_array($num, $arr)) {
  345. // self::pushSysMessage($zoneid, SysMessageType::GetSpecialNumYanling, array(
  346. // $name, $num
  347. // ));
  348. // }
  349. // }
  350. //
  351. // /**
  352. // *
  353. // * @param type $zoneid
  354. // * @param type $name
  355. // * @param type $useTili
  356. // */
  357. // static function CostTiliRecord($zoneid, $name, $useTili) {
  358. // $arr = array(60, 120, 300);
  359. // ctx()->privateData(true)->tiliRecord += abs($useTili);
  360. //
  361. // if (in_array(ctx()->privateData(true)->tiliRecord, $arr)) {
  362. // self::pushSysMessage($zoneid, SysMessageType::CostTili, array(
  363. // $name, ctx()->privateData(true)->tiliRecord
  364. // ));
  365. // }
  366. // }
  367. //
  368. // /**
  369. // * 恭喜XXX连续在线20分钟
  370. // * @param type $zoneid
  371. // * @param type $name
  372. // */
  373. // static function OnlineGifttsRecord($zoneid, $name) {
  374. // $arr = array(1200, 1800, 3600);
  375. // $onlineTs = ctx()->privateState->onlineTs;
  376. // $ennVal = $onlineTs;
  377. //
  378. // $tag = false;
  379. // if (in_array($ennVal, $arr)) {
  380. // $tag = true;
  381. // }
  382. //
  383. // if (!$tag) {
  384. // $lastVal = 0;
  385. // foreach ($arr as $time) {
  386. // if ($ennVal < $time) {
  387. // break;
  388. // }
  389. // $lastVal = $time;
  390. // }
  391. //
  392. // if ($lastVal > 0 && $ennVal - $lastVal < 15) {
  393. // $ennVal = $lastVal;
  394. // $tag = true;
  395. // }
  396. // }
  397. //
  398. // if ($tag) {
  399. // ;
  400. // self::pushSysMessage($zoneid, SysMessageType::onlineGiftts, array(
  401. // $name, intval($ennVal / 60)
  402. // ));
  403. // }
  404. // }
  405. //
  406. // /**
  407. // * 玩家升级消息
  408. // * @param type $zoneid
  409. // * @param Data_UserGame $user
  410. // * @param int $newLevel
  411. // * */
  412. // static function UserLevelUp($zoneid, $user, $newLevel) {
  413. // if ($newLevel > 20) {
  414. // self::pushSysMessage($zoneid, SysMessageType::UserLevelUp, array(
  415. // $user->name, $newLevel
  416. // ));
  417. // }
  418. // }
  419. //
  420. // /**
  421. // * 插入英雄升阶消息
  422. // * @param int $zoneid
  423. // * @param string $uid
  424. // * @param string $name
  425. // * @param string $heroname
  426. // * @param int $level
  427. // */
  428. // static function insertHero_StageUp($zoneid, $uid, $name, $heroname, $level) {
  429. //// if ($level >= glc()->SystemMessage_HeroStage_Limit_Min) {
  430. //// self::pushSysMessage($zoneid, SysMessageType::GetEquip, array(
  431. //// $uid, $name, $heroname, $level
  432. //// ));
  433. //// }
  434. // }
  435. //
  436. // /**
  437. // * 添加购买公会钻石礼包消息
  438. // * @param type $zoneid
  439. // * @param Data_UserGame $user
  440. // * */
  441. // static function BuyGuildCashPack($zoneid, $user) {
  442. // self::pushSysMessage($zoneid, SysMessageType::BuyGuild_CashPack, array(
  443. // $user->name
  444. // ));
  445. // }
  446. //
  447. // /**
  448. // * 添加获得装备消息
  449. // * @param type $zoneid
  450. // * @param Data_UserGame $user
  451. // * @param int $equipModelId
  452. // * @deprecated since version 0 待维修 --王刚2020年1月2日21:07:04
  453. // * */
  454. // static function GetEquip($zoneid, $user, $equipModelId) {
  455. // $equipModel = GameConfig::item_base_getItem($equipModelId);
  456. // if ($equipModel && $equipModel->quality > 3) { # 紫色橙色装备
  457. // self::pushSysMessage($zoneid, SysMessageType::GetEquip, array(
  458. // $user->name, $equipModel->name
  459. // ));
  460. // }
  461. // }
  462. //
  463. // /**
  464. // * 插入装备强化消息
  465. // * @deprecated since version 1.0 装备强化暂不支持了
  466. // * @param type $zoneid
  467. // * @param type $uid
  468. // * @param type $name
  469. // * @param type $weaponname
  470. // * @param type $level
  471. // */
  472. // static function insertWeapon_promoteUp($zoneid, $uid, $name, $weaponname, $level) {
  473. //// if ($level >= glc()->SystemMessage_WeaponLevel_Limit_Min) {
  474. //// self::pushSysMessage($zoneid, SysMessageType::Weapon_Promote, array(
  475. //// $uid, $name, $weaponname, $level
  476. //// ));
  477. //// }
  478. // }
  479. //
  480. //////=================////
  481. //
  482. // /**
  483. // * 添加获得英雄消息
  484. // * @param type $zoneid
  485. // * @param Data_UserGame $user
  486. // * @param int $heroId
  487. // * @return int $err
  488. // * */
  489. // static function GetHero($zoneid, $user, $heroId) {
  490. // $heroModel = GameConfig::hero_getItem($heroId);
  491. // if ($heroModel && $heroModel->zhenxidu > 3) {
  492. // self::pushSysMessage($zoneid, SysMessageType::GetHero, array(
  493. // $user->name, $heroModel->name
  494. // ));
  495. // }
  496. // }
  497. //
  498. // /**
  499. // * 添加英雄血脉提纯消息
  500. // * @param type $zoneid
  501. // * @param Data_UserGame $user
  502. // * @param int $heroId
  503. // * @return int $err
  504. // * */
  505. // static function Hero_purification($zoneid, $user, $heroId) {
  506. // $heroModel = GameConfig::hero_getItem($heroId);
  507. // if ($heroModel && $heroModel->zhenxidu > 3) {
  508. // self::pushSysMessage($zoneid, SysMessageType::Hero_purification, array(
  509. // $user->name, $heroModel->name
  510. // ));
  511. // }
  512. // }
  513. //
  514. ////
  515. //// <editor-fold defaultstate="collapsed" desc=" 读写memdb ">
  516. //
  517. // /**
  518. // * 取数据
  519. // * @param int $zoneid
  520. // * @return array
  521. // */
  522. // private static function mem_getSysMsg_zset($zoneid, $ts) {
  523. // $ret = gMem()->zrangebyscore(MemKey_GameRun::Game_SysMsgByZone_zset($zoneid), $ts, now(+1));
  524. // //todo:目前是在这里手动解码的, 应该移动到CRedisUtil里面去.
  525. // $arr = ArrayInit();
  526. // if ($ret) {
  527. // foreach ($ret as $msg) {
  528. // $arr[] = JsonUtil::decode($msg);
  529. // }
  530. // }
  531. // return $arr;
  532. // }
  533. //
  534. // /**
  535. // * 回写数据
  536. // * @param int $zoneid
  537. // * @param SysMessageModel $value
  538. // */
  539. // private static function mem_addSysMsg_zset($zoneid, $value) {
  540. // $ts = $value->ts;
  541. // $key = MemKey_GameRun::Game_SysMsgByZone_zset($zoneid);
  542. // gMem()->zadd($key, array(json_encode($value) => $ts)); # 插入消息
  543. // gMem()->zremrangebyscore($key, 0, $ts - self::SYS_MSG_OUTTS); # 清理过期数据
  544. // }
  545. //
  546. //// </editor-fold>
  547. ////
  548. //
  549. // /**
  550. // * 推送系统消息
  551. // * @param int $zoneid 分区
  552. // * @param SysMessageType $type enum
  553. // * @param array $datas
  554. // */
  555. // static function pushSysMessage($zoneid, $type, $datas) {
  556. // $newMsg = new SysMessageModel(array(# # 添加新系统消息
  557. // 'type' => $type,
  558. // 'datas' => $datas,
  559. // 'ts' => now()
  560. // ));
  561. // self::mem_addSysMsg_zset($zoneid, $newMsg); # 写入mem
  562. // }
  563. //
  564. //// <editor-fold defaultstate="collapsed" desc=" 备用 需修改">
  565. //
  566. // /**
  567. // * 添加中奖消息
  568. // * @param UserModel $user
  569. // * @param int $itemId
  570. // * @param string $src 来源: 砸木桶,砸金蛋,公会抽奖,开宝箱,蛋蛋忧伤,...
  571. // * @return int $err
  572. // * */
  573. // static function insertLotterySysMessage($zoneid, $user, $itemId, $src) {
  574. // throw new \Exception("need reimplement");
  575. // // 向系统消息区域发送中奖消息.
  576. //
  577. // $broadCastIDs = glc()->broadCastIDs;
  578. // if ($broadCastIDs == null) { # 需要广播的道具ID
  579. // $err = ErrCode::err_msg_buildrewardnoconst;
  580. // } else {
  581. // $broadItemArray = JsonUtil::decode($broadCastIDs->content);
  582. // if (CommUtil::isPropertyExists($broadItemArray, $itemId)) {# 如果是测试的话,将所有中奖物品加入到系统消息中
  583. // self::pushSysMessage($zoneid, SysMessageType::GetHero, #
  584. // array($user->oid, $user->name, $itemId, $src));
  585. // }
  586. // }
  587. // return $err;
  588. // }
  589. //
  590. //// </editor-fold>
  591. //}