StoreProc.php 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083
  1. <?php
  2. namespace loyalsoft;
  3. /**
  4. * Description of StoreProc
  5. * 仓库/背包 处理流程
  6. * ===========================
  7. * 尚待处理的流程:道具售出时貌似存在多种格式....
  8. * @author
  9. */
  10. class StoreProc {
  11. /**
  12. * 逻辑分发
  13. * 所有的Proc中必须有这样一个方法
  14. * @param type $req
  15. */
  16. static function procMain($req) {
  17. switch ($req->cmd) {
  18. case CmdCode::cmd_store_put: # 6401 放入仓库
  19. return StoreProc::AddItemInStore($req);
  20. case CmdCode::cmd_store_singleSell: # 6402 出售单个道具
  21. return StoreProc::sellItem($req);
  22. case CmdCode::cmd_store_mutliSell: # 6403 批量出售 卖掉
  23. return StoreProc::sellMultiItemFromStore($req);
  24. case CmdCode::cmd_store_use: # 6404 使用道具
  25. return StoreProc::useItem($req);
  26. case CmdCode::cmd_store_refresh: # 6405 获取最新的仓库数据
  27. return StoreProc::refreshStore($req);
  28. // case CmdCode::cmd_store_decomposeItem: # 6406 分解道具
  29. // return StoreProc::decomposeItem($req);
  30. // case CmdCode::cmd_store_ItemUpgrade: # 6408 装备升级
  31. // return StoreProc::ItemUpgrade($req);
  32. // case CmdCode::cmd_store_GemCompose: # 6408 装备合成
  33. // return StoreProc::composeItem($req);
  34. //
  35. case CmdCode::cmd_store_WearEquip: # 6410 给英雄穿装备
  36. return StoreProc::WearEquipToHero($req);
  37. case CmdCode::cmd_store_UnWieldEquip: # 6411 将该装备从指定英雄上脱下
  38. return StoreProc::UnWieldEquip($req);
  39. case CmdCode::cmd_store_WearYanling: # 6416 装备言灵
  40. return StoreProc::WearYanlingToHero($req);
  41. case CmdCode::cmd_store_UnWieldYanling: # 6417 卸下言灵
  42. return StoreProc::UnWieldYanling($req);
  43. //
  44. case CmdCode::cmd_store_AddMaxPacketNum: # 6412 扩展包裹格子数量
  45. return StoreProc::AddPacketNum($req);
  46. // case CmdCode::cmd_store_MeltEquip: # 6413 装备融合
  47. // Err(ErrCode::err_method_obsoleted);
  48. //// return StoreProc::MeltEquip($req);
  49. // case CmdCode::cmd_store_PiecesCompose: # 6415 碎片合成
  50. // return StoreProc::composePieces($req);
  51. case CmdCode::cmd_store_Testcmd: # 6407 测试方法
  52. return StoreProc::Test($req);
  53. default:
  54. Err(ErrCode::cmd_err);
  55. }
  56. }
  57. /**
  58. * 测试方法
  59. * @param Req $req
  60. * @return type
  61. */
  62. static public function Test($req) {
  63. // return StoreProc::MeltEquip($req);
  64. }
  65. /**
  66. * [6404] 使用仓库道具
  67. * @param Req $req
  68. */
  69. static function useItem($req) {
  70. Err(ErrCode::msg_method_obsoleted, "代码需更新");
  71. $itemId = $req->paras[0]; # 道具id
  72. $num = 1; # 数量, 可选参数, 默认为1
  73. if (count($req->paras) > 1) { # 如果传了,
  74. $num = $req->paras[1]; # 提取可选参数: 道具数量
  75. } # end 提取参数
  76. $typeId = substr($itemId, 0, 3); # 道具分类前缀
  77. switch ($typeId) { # 使用道具()
  78. // case '701': # 宝箱
  79. // $resp = Boxes::OpenBox($req); # 调用开宝箱功能
  80. // break;
  81. default : # 其他
  82. Err(ErrCode::store_itemcantuse);
  83. break;
  84. }
  85. return $resp;
  86. }
  87. /**
  88. * [6405] 刷新仓库列表
  89. * @param Req $req
  90. */
  91. static function refreshStore($req) {
  92. StoreProc::CheckItemNum($req);
  93. return Resp::ok(array('store' => $req->userInfo->game->store));
  94. }
  95. /**
  96. * [6409] 合成道具
  97. * @param Req $req
  98. */
  99. static public function composeItem($req) {
  100. Err(ErrCode::err_method_notimplement);
  101. list($lowitemId, $usenum, $highitemId, $addnum, $gold) = $req->paras; # 提取参数: 消耗道具id, 消耗数量, 合成道具Id, 合成数量, 需要的手续费
  102. my_Assert($usenum >= 3, "数量非法!");
  103. $user = $req->userInfo->game; # user引用
  104. $store = $user->store; # 背包引用
  105. $ok = StoreProc::removeItemFromStore($store, $lowitemId, $usenum); # 从仓库里移除这个道具, 支持移除指定数量
  106. my_Assert(ErrCode::ok == $ok, $ok); # 如果仓库道具移出时出错,则直接返回错误
  107. my_Assert(UserGameModel::Consume_Gold($user, $gold), ErrCode::notenough_gold_msg); # 扣除消耗的金币
  108. ActiveProc::ChangeTaskCount($req); # 更新任务计数器
  109. $store->items->$highitemId += $addnum; # 添加新合成道具
  110. UserProc::updateUserInfo();
  111. $ret = array('resp' => "succeed!"); # 准备返回值
  112. $resp = Resp::ok($ret); # 返回必须是object
  113. StoreProc::CheckItemNum($req);
  114. return $resp;
  115. }
  116. /**
  117. * [6409] 合成碎片(几个碎片合成获得同品质或者更高品质的新碎片)
  118. * @param Req $req
  119. */
  120. static public function composePieces($req) {
  121. Err(ErrCode::err_method_notimplement);
  122. $store = $req->userInfo->game->store;
  123. // 解析客户端参数
  124. $piecesid1 = $req->paras[0]; // 碎片id1
  125. $piecesid2 = $req->paras[1]; // 碎片id2
  126. $piecesid3 = $req->paras[2]; // 碎片id3
  127. $user = $req->userInfo->game; # user引用
  128. $pieceslist = array($piecesid1, $piecesid2, $piecesid3);
  129. //1.从仓库里移除这个道具
  130. for ($i = 0; $i < count($pieceslist); $i++) {
  131. $ok = StoreProc::removeItemFromStore($store, $pieceslist[$i], 1); // 支持移除指定数量
  132. if ($ok != ErrCode::ok) {
  133. break;
  134. }
  135. }
  136. my_Assert($ok == ErrCode::ok, $ok); // 如果仓库道具移出时出错,则直接返回错误
  137. $gold = glc()->Compose_Pieces_Gold; ////临时用这个来算,等刷过数据再说
  138. echoLine($gold);
  139. $bDeal = UserGameModel::Consume_Gold($user, $gold);
  140. if ($bDeal) {
  141. ActiveProc::ChangeTaskCount($req);
  142. $reward = StoreProc::composePiecesProbability($req);
  143. StoreProc::addSegmentIntoStore($store, $reward);
  144. UserProc::updateUserInfo();
  145. # 准备返回值
  146. $result = array(
  147. 'reward' => $reward,
  148. 'store' => $req->userInfo->game->store,
  149. 'resp' => "succeed!"
  150. );
  151. $resp = Resp::ok($result);
  152. } else {
  153. Err(ErrCode::notenough_gold_msg);
  154. }
  155. StoreProc::CheckItemNum($req);
  156. return $resp;
  157. }
  158. ////合成碎片时的概率
  159. static public function composePiecesProbability($req) {
  160. $piecesid1 = $req->paras[0]; // 碎片id1
  161. $piecesid2 = $req->paras[1]; // 碎片id2
  162. $piecesid3 = $req->paras[2]; // 碎片id3
  163. $pieceslist = array($piecesid1, $piecesid2, $piecesid3);
  164. ///权重和值
  165. $weight = 0;
  166. for ($i = 0; $i < count($pieceslist); $i++) {
  167. $segmentid = $pieceslist[$i];
  168. $segItem = GameConfig::segment_getItem($segmentid); /////获取该碎片的信息
  169. $WeightItem = GameConfig::segment_ronghe_getItem($segItem->quailty); ///通过品质来获取权重
  170. $weight += $WeightItem->weight;
  171. }
  172. $reward = StoreProc::GetRewarByWeight($weight);
  173. //////根据最终三个碎片的权重值和来判断该品质的获取概率。
  174. ////用类似 3,80;5,60;10,20; 来表示 (在权重和达到3时获取率是80%,在权重和达到5时获取率是60%,在权重和达到10时获取率是10%)
  175. //
  176. // ////为了数值设置表和填数据方便,将两个表合成为一个表
  177. //
  178. ////数值设置起来方便,但是用起来稍微麻烦一些,需要取出数据表里的所有碎片的值。
  179. return $reward;
  180. }
  181. static public function GetRewarByWeight($weight) {
  182. for ($i = 0; $i < 5; $i++) {
  183. $item = GameConfig::segment_ronghe_getItem($i + 1);
  184. // $RewardList[]=$item;
  185. $ary = explode(";", $item->probability);
  186. foreach ($ary as $value) {
  187. $val = explode(",", $value);
  188. $weig = $val[0]; //达到的权重值
  189. $prob = $val[1]; //该权重下的获取概率
  190. if ($weight >= $weig) {
  191. $probList[$i] = $prob;
  192. }
  193. }
  194. }
  195. $rnd = CommUtil::random(1, 10000);
  196. $start = 0;
  197. $rew = 0;
  198. for ($i = 0; $i < 5; $i++) {
  199. if ($start < $rnd && $rnd <= $start + $probList[$i]) { # 落入区间
  200. $rew = $i + 1; # 记录物品
  201. break;
  202. }
  203. $start += $probList[$i]; # 继续判断是否落入下一物品的区间
  204. }
  205. // $piecesDataBaseList= GameConfig::segment();////获取所有的碎片数据表
  206. $tmpPiecesList = GameConfig::segment_byPinzhi_getItem($rew, 1);
  207. // foreach ($piecesDataBaseList as $typeId => $value)
  208. // {
  209. // // $value->
  210. // // echo var_dump($value);
  211. // if ($value->itemType==1) ////是英雄碎片
  212. // {
  213. // if( $value->quailty==$rew) ///碎片品质是指定品质
  214. // {
  215. // $tmpPiecesList[]=$typeId; ///保存到一个临时表里。
  216. // }
  217. // }
  218. // }
  219. $tmprnd = CommUtil::random(0, count($tmpPiecesList) - 1);
  220. return $tmpPiecesList[$tmprnd]->typeId;
  221. }
  222. // </editor-fold>
  223. // --------------- 以下为辅助方法 ------------------
  224. //
  225. // <editor-fold defaultstate="collapsed" desc=" 移除物品 ">
  226. /**
  227. * 从仓库中移除指定数量的物品
  228. * @param UserGameModel $user
  229. * @param type $itemId
  230. * @param type $itemcount
  231. * @return type
  232. */
  233. static function removeItemFromStore($store, $itemId, $itemcount) {
  234. $typeId = substr($itemId, 0, 3);
  235. switch ($typeId) {
  236. case '307': #经验书
  237. case '305': #扫荡券
  238. case '304': # 宝石
  239. if (CommUtil::isPropertyExists($store->items, $itemId)) { //
  240. if ($store->items->$itemId >= $itemcount) { // 数量足够
  241. $store->items->$itemId -= $itemcount;
  242. if ($store->items->$itemId == 0) {
  243. unset($store->items->$itemId);
  244. }
  245. return ErrCode::ok;
  246. } else {
  247. return ErrCode::store_itemnotenough; // 道具数量不足
  248. }
  249. } else {
  250. return ErrCode::store_itemno_err;
  251. }
  252. break;
  253. case '310': # 碎片
  254. case '311': # 碎片
  255. case '312': # 碎片
  256. case '313': #装备 碎片
  257. case '314': #装备 碎片
  258. case '315': #装备 碎片
  259. if (CommUtil::isPropertyExists($store->segement, $itemId)) { //
  260. if ($store->segement->$itemId >= $itemcount) { // 数量足够
  261. $store->segement->$itemId -= $itemcount;
  262. if ($store->segement->$itemId == 0) {
  263. unset($store->segement->$itemId);
  264. }
  265. return ErrCode::ok;
  266. } else {
  267. return ErrCode::store_itemnotenough; // 道具数量不足
  268. }
  269. } else {
  270. return ErrCode::store_itemno_err;
  271. }
  272. break;
  273. default : # 其他
  274. Err(ErrCode::store_itemcantuse);
  275. break;
  276. }
  277. }
  278. /**
  279. * 从仓库移出
  280. * @param type $itemId
  281. * @param StoreModel $store
  282. * @return boolean
  283. */
  284. static function removeFromStore($itemId, &$store) {
  285. //return ErrCode::succeed;
  286. $typid = substr("$itemId", 0, 3); # 取道具分类
  287. $ok = false;
  288. switch ($typid) {
  289. case "101": # 英雄 错误了的路径
  290. break;
  291. case '102': # 英雄碎片
  292. if (CommUtil::isPropertyExists($store->segement, "$itemId") && $store->segement->$itemId > 0) {
  293. $store->segement->$itemId -= 1;
  294. $ok = true;
  295. }
  296. break;
  297. case "203": # 宝箱
  298. if (CommUtil::isPropertyExists($store->boxes, "$itemId") && $store->boxes->$itemId > 0) {
  299. $store->boxes->$itemId -= 1;
  300. $ok = true;
  301. }
  302. break;
  303. default:
  304. break;
  305. }
  306. return $ok;
  307. }
  308. /**
  309. * 从仓库移出装备
  310. * @param type $itemId uid
  311. * @param StoreModel $store
  312. * @return boolean
  313. */
  314. static function removeEquipFromStore($uid, $typeId, &$req) {
  315. $ok = false;
  316. echo var_export($uid);
  317. if (CommUtil::isPropertyExists($req->userInfo->game->store->equipment, $uid)) {
  318. // $con= ConstProc::getItemConst($req->mem, $req->userInfo->game->store->equipment->$uid->typeId);
  319. echo var_export($req->userInfo->game->store->equipment->$uid->typeId);
  320. if ($typeId == $req->userInfo->game->store->equipment->$uid->typeId) {
  321. echo "typeid相同";
  322. unset($req->userInfo->game->store->equipment->$uid);
  323. $ok = true;
  324. } else {
  325. echo "typeid检验错误";
  326. }
  327. }
  328. return $ok;
  329. }
  330. /**
  331. * 从仓库移除碎片
  332. * @param StoreModel $store
  333. * @param int $segmentId
  334. * @param int $num
  335. * @return bool 成功/失败
  336. */
  337. static function removeSegmetFromStore($store, $segmentId, $num = 1) {
  338. if (CommUtil::isPropertyExists($store->segement, $segmentId) #
  339. && $store->segement->$segmentId >= $num) {
  340. $store->segement->$segmentId -= $num;
  341. return TRUE;
  342. }
  343. return false;
  344. }
  345. /**
  346. * 向仓库添加碎片
  347. * @param StoreModel $store
  348. * @param int $segmentId
  349. * @param int $num
  350. */
  351. static function addSegmentIntoStore($store, $segmentId, $num = 1) {
  352. if (CommUtil::isPropertyExists($store->segement, $segmentId)) {
  353. $store->segement->$segmentId += $num;
  354. } else {
  355. $store->segement->$segmentId = $num;
  356. }
  357. }
  358. /**
  359. * 计算玩家仓库中某种符石/道具的数量
  360. * @param type $map
  361. * @param type $stoneid
  362. * @return type
  363. */
  364. static function GetStoneCount($map, $stoneid) {
  365. $ret = 0;
  366. if ($map->store->stones && CommUtil::isPropertyExists($map->store->stones, $stoneid)) {
  367. $ret = $map->store->stones->
  368. $stoneid;
  369. }
  370. return $ret;
  371. }
  372. /**
  373. * 从仓库移除符石(道具)
  374. * @param MapModel $map
  375. * @param int $stoneid
  376. * @param int $num
  377. */
  378. static function RemoveStoneFromStore(&$map, $stoneid, $num = 1) {
  379. if ($num <= 0) {
  380. return $num;
  381. }
  382. $ret = 0;
  383. if ($map->store->stones && CommUtil::isPropertyExists($map->store->stones, $stoneid)) {
  384. $left = $map->store->stones->$stoneid - $num;
  385. if ($ret >= 0) {////这里有bug吗?应该是用$left啊,不过无所谓,反正这个函数暂时用不上,不考虑了.
  386. $map->store->stones->$stoneid -= $num;
  387. $ret = $num;
  388. }
  389. }
  390. return $ret;
  391. }
  392. // </editor-fold>
  393. //
  394. // <editor-fold defaultstate="collapsed" desc=" 放入物品 ">
  395. /**
  396. * 将其他物品放入仓库
  397. * @param type $itemId
  398. * @param UserGameModel $game
  399. */
  400. static function PutItemInStore($itemId, &$game) {
  401. if (CommUtil::isPropertyExists($game->store->items, $itemId)) {// 如果仓库中已经有这种元素,则其数目+1
  402. $game->store->items->$itemId += 1;
  403. } else {// 如果仓库中没有这种元素,则其数目置1
  404. $game->store->items->$itemId = 1;
  405. }
  406. }
  407. /**
  408. * 解包多种物品到玩家身上 【警告】此函数的异常处理功能残废,不安全
  409. * 检测如果当前物品格子大于物品总数,则可以获取战利品,否则不可以
  410. * @param Req $req
  411. * @param string $goodsStr itemid,num;itemid,num;...
  412. * @param int $src 1:战斗奖励, 2: 任务奖励, 3: 抽奖奖品, 4: 邮件领取, 5: 现金充值
  413. * @deprecated since version 0
  414. * @return type
  415. */
  416. public static function AddMultiItemInStore($req, $goodsStr, $src = 1) {
  417. $user = $req->userInfo->game;
  418. $ary = explode(";", $goodsStr);
  419. foreach ($ary as $value) {
  420. $val = explode(",", $value);
  421. my_Assert(count($val) > 1, "解析奖励字符串出错");
  422. list( $itemId, $num) = $val; # ID, 数量
  423. $smItem = GameConfig::item_base_getItem($itemId); # 道具mo
  424. switch ($smItem->subType) { # 根据类型分别添加到容器中
  425. case 1: # 金币
  426. UserGameModel::Add_Gold($user, $num);
  427. break;
  428. case 2: # 钻石
  429. UserGameModel::Add_Cash($user, $num);
  430. break;
  431. case 3: # 体力
  432. UserGameModel::Add_tili($req, $num);
  433. break;
  434. case 4: # 友情值
  435. UserGameModel::Add_FriendPoint($user, $num);
  436. break;
  437. case 101: # 武器
  438. StoreProc::PutEquipInStore($itemId, $req);
  439. break;
  440. case 401: # 言灵
  441. StoreProc::PutYanLingInStore($itemId, $req);
  442. break;
  443. case 201: # 碎片
  444. case 311: # 基因(经验丹)
  445. StoreProc::PutOverlyingItemInStore($itemId, $num); # 直接进包裹items
  446. break;
  447. case 341: # 战场中掉落,不会进入包裹
  448. case 342:
  449. case 343:
  450. Err(ErrCode::err_innerfault, "落入包裹时,出现了非法物品");
  451. break;
  452. }
  453. }
  454. UserProc::updateUserInfo();
  455. return ErrCode::ok; // 返回
  456. }
  457. /**
  458. * 向包裹中添加物品
  459. * @param req $req
  460. * @return type
  461. */
  462. public static function AddItemInStore($req) {
  463. Err(ErrCode::err_innerfault, "功能待开发 -王刚 2020年1月17日14:36:01");
  464. list($itemType, $itemId, $num) = $req->paras; # 提取参数: 道具类型, 道具ID, 数量
  465. if ($itemType < 4) {
  466. StoreProc::PutEquipInStore($itemId, $req);
  467. } else if ($itemType == 4) {
  468. StoreProc:: PutOverlyingItemInStore($itemId, $num);
  469. } else if ($itemType == 10) {
  470. StoreProc:: PutOverlyingItemInStore($itemId, $num); ///准备添加其他
  471. }
  472. UserProc::updateUserInfo(); // 更新数据库数据
  473. return Resp::ok(array('resp' => "succeed!")); //返回必须是object
  474. }
  475. /**
  476. * 将装备放入背包
  477. * @param type $itemId
  478. * @param Req $req
  479. */
  480. static function PutEquipInStore($itemId, &$req) {
  481. $privateState = $req->userInfo->game->privateState;
  482. if (!CommUtil::isPropertyExists($privateState, "currentId")) { // 如果仓库中已经有这种元素,则其数目+1
  483. $req->userInfo->game->privateState->currentId = 1;
  484. }
  485. $cid = $req->userInfo->game->privateState->currentId++;
  486. $equip = ObjectInit();
  487. $equip->typeId = $itemId;
  488. $req->userInfo->game->store->equipment->$cid = $equip;
  489. return $cid;
  490. // SystemProc::GetEquip($req->zoneid, $req->userInfo->game, $itemId); # 添加获得装备的消息
  491. }
  492. /**
  493. * 将言灵放入背包
  494. * @param type $itemId
  495. * @param Req $req
  496. */
  497. static function PutYanLingInStore($itemId, &$req) {
  498. $privateState = $req->userInfo->game->privateState;
  499. if (!CommUtil::isPropertyExists($privateState, "currentId")) { // 如果仓库中已经有这种元素,则其数目+1
  500. $req->userInfo->game->privateState->currentId = 1;
  501. }
  502. $cid = $req->userInfo->game->privateState->currentId++;
  503. $equip = ObjectInit();
  504. $equip->typeId = $itemId;
  505. $req->userInfo->game->store->yanling->$cid = $equip;
  506. return $cid;
  507. // SystemProc::GetEquip($req->zoneid, $req->userInfo->game, $itemId); # 添加获得装备的消息
  508. }
  509. /**
  510. * 将可叠加物品放入背包
  511. * @param int $itemId
  512. * @param int $num
  513. */
  514. static function PutOverlyingItemInStore($itemId, $num) {
  515. $items = req()->userInfo->game->store->items; # dic: itemid=>number
  516. if (CommUtil::isPropertyExists($items, $itemId)) { # 如果仓库中已经有这种元素,则其数目+=num
  517. $items->$itemId += $num;
  518. } else { # 如果仓库中没有这种元素,则其数目置为num
  519. $items->$itemId = $num;
  520. }
  521. }
  522. /**
  523. * 物品包裹打散成独立道具到仓库
  524. * @param GoodsItemModel $itemModel
  525. * @param Req $req
  526. * @return type
  527. */
  528. static function addSeprateItem($itemModel, $req) {
  529. Err(ErrCode::err_method_obsoleted, "未更新包裹操作");
  530. $user = $req->userInfo->game;
  531. $store = $req->userInfo->game->store;
  532. $itemContent = JsonUtil::decode($itemModel->content);
  533. foreach ($itemContent as $itemId => $itemNum) {
  534. if ($itemId == META_GOLDITEMID) { # 如果是金币 1
  535. UserModel::Add_Gold($user, $itemNum);
  536. } else if ($itemId == META_CASHITEMID) { # 如果是宝石 2
  537. UserModel::present_cash($req, $itemNum, "<" . $req->cmd . ">道具解包-" . $itemModel->name);
  538. } else if ($itemId == META_SPAEITEMID) { # 如果是能量块 3
  539. $user->spar += $itemNum;
  540. } else if ($itemId == META_YUANBAOITEMID) { # 元宝,后加的只能采用字段补偿机制 7
  541. PayProc::m_AddUserYuanbao($req, $itemNum, "<" . $req->cmd . ">道具解包-" . $itemModel->name);
  542. } else { // 否则就是道具
  543. $typid = substr("$itemId", 0, 3);
  544. switch ($typid) {
  545. case "101": # 英雄
  546. if (property_exists($user->heros, $itemId)) {
  547. DebugHelper::var_dump(" 已经有了xxx英雄了.");
  548. } else { # 给玩家创建一个英雄
  549. $hero = new HeroModel();
  550. $instanceID = now();
  551. $heroID = $itemId;
  552. $hero->reInit($heroID, $instanceID);
  553. $user->heros->$heroID = $hero;
  554. }
  555. break;
  556. case '102': # 碎片
  557. if (CommUtil::isPropertyExists($store->segement, $itemId)) {
  558. $store->segement->$itemId += $itemNum;
  559. } else {
  560. $store->segement->$itemId = $itemNum;
  561. }
  562. break;
  563. case '203': # 宝箱
  564. if (CommUtil::isPropertyExists($store->boxes, $itemId)) {
  565. $store->boxes->$itemId += $itemNum;
  566. } else {
  567. $store->boxes->$itemId = $itemNum;
  568. }
  569. break;
  570. default :
  571. break;
  572. }
  573. // for ($i = 0; $i < $itemNum; $i++) {
  574. // $store->items[] = $itemId;
  575. // }
  576. }
  577. // break; # 不会循环的,一个物品中只有第一个道具配置生效,否则
  578. }
  579. UserProc::updateUserInfo();
  580. # 添加活动记录
  581. // self::checkActiveItem($req, $itemModel);
  582. }
  583. /**
  584. * [6417] 给英雄装上言灵
  585. * @param req $req
  586. * @return type
  587. */
  588. static function WearYanlingToHero($req) {
  589. $user = $req->userInfo->game; # user引用
  590. list($itemtype, $yanling_uid, $herouid) = $req->paras; # 提取参数: 装备类型, 装备的UID, 英雄的UID
  591. if (!CommUtil::isPropertyExists($user->store->yanling, $yanling_uid)) { # 检测是否存在该言灵
  592. Err(ErrCode::store_itemno_err);
  593. }
  594. $yanlingVo = $user->store->yanling->$yanling_uid; # 取言灵对象
  595. if ($yanlingVo->herouid > 0 && $yanlingVo->herouid != $herouid) { # 检测该言灵是否装备到其他英雄身上
  596. Err(ErrCode::store_equipWeared_err);
  597. }
  598. $collectHeros = $user->heros->collectHeros; # 英雄集合
  599. if (!$collectHeros) { # 防御对象为空
  600. Err(ErrCode::err_innerfault);
  601. }
  602. if (!CommUtil::isPropertyExists($collectHeros, $herouid)) { # 检查英雄是否存在
  603. Err(ErrCode::hero_no);
  604. }
  605. $user->store->yanling->$yanling_uid->herouid = $herouid; # 言灵上添加反向引用, 避免查询时的循环
  606. $oldYLid = $collectHeros->$herouid->yanling->$itemtype->itemuid; # 旧言灵id
  607. if ($oldYLid > 0) { # 代表替换操作
  608. $user->store->yanling->$oldYLid->herouid = 0; # 清理旧言灵的
  609. }
  610. $collectHeros->$herouid->yanling->$itemtype->itemuid = $yanling_uid; # 英雄身上添加言灵记录
  611. UserProc::updateUserInfo(); # 5.回写数据
  612. $ret = array('resp' => "succeed!");
  613. $resp = Resp::ok($ret); // 返回
  614. HeroProc::CalcUserFightPower($req->zoneid, $req->uid, $user); # 更新总战力榜
  615. return $resp;
  616. }
  617. /**
  618. * [6416] 给英雄卸下言灵
  619. * @param req $req
  620. * @return type
  621. * @deprecated since version 无法卸下,只能更换
  622. */
  623. static function UnWieldYanling($req) {
  624. $user = $req->userInfo->game; # user引用
  625. list($itemtype, $yanling_uid, $herouid) = $req->paras; # 提取参数: 装备类型, 装备的UID, 拥有该装备的英雄的UID
  626. $collectHeros = $user->heros->collectHeros;
  627. if (!$collectHeros) {
  628. Err(ErrCode::err_innerfault);
  629. }
  630. if (!CommUtil::isPropertyExists($collectHeros, $herouid)) { # 检测是否存在拥有该装备的英雄
  631. Err(ErrCode::hero_no);
  632. }
  633. if (!CommUtil::isPropertyExists($user->store->yanling, $yanling_uid)) { # 检测是否存在该装备
  634. Err(ErrCode::store_itemno_err);
  635. }
  636. if ($user->store->yanling->$yanling_uid->herouid == $herouid) { # 取装备对象
  637. $user->store->yanling->$yanling_uid->herouid = 0;
  638. }
  639. if ($collectHeros->$herouid->yanling->$itemtype->itemuid != $yanling_uid) {
  640. Err(ErrCode::store_noequip_err);
  641. }
  642. $collectHeros->$herouid->equip->weapon->itemuid = 0; # 卸下
  643. UserProc::updateUserInfo(); # 回写数据
  644. $resp = Resp::ok(array('resp' => "succeed!")); // 返回
  645. // StoreProc::CheckItemNum($req);
  646. return $resp;
  647. }
  648. /**
  649. * [6410] 给英雄穿装备
  650. * @param req $req
  651. * @return type
  652. */
  653. static function WearEquipToHero($req) {
  654. list($itemtype, $equipuid, $herouid) = $req->paras; # 提取参数: 装备类型, 装备的UID, 英雄的UID
  655. $user = $req->userInfo->game; # user引用
  656. my_Assert(CommUtil::isPropertyExists($user->store->equipment, $equipuid), ErrCode::store_itemno_err); # 检测是否存在该装备
  657. $equipVo = $user->store->equipment->$equipuid; # 取装备对象
  658. if ($equipVo->herouid > 0) { # 检测该装备是否装备到其他英雄身上
  659. my_Assert($equipVo->herouid == $herouid, ErrCode::store_equipWeared_err);
  660. $user->store->equipment->$equipuid->herouid = 0; # 清理原来已经装备的言灵的反指向
  661. }
  662. $collectHeros = $user->heros->collectHeros;
  663. my_default_Obj($collectHeros);
  664. my_Assert(CommUtil::isPropertyExists($collectHeros, $herouid), ErrCode::hero_no); # 检查是否存在需要装备的英雄
  665. $user->store->equipment->$equipuid->herouid = $herouid; # 装备上添加反向引用, 避免查询时的循环
  666. $oldEquipId = 0;
  667. switch ($itemtype) { # 添加或替换英雄该部位的装备
  668. case 1: # 武器
  669. $oldEquipId = $collectHeros->$herouid->equip->weapon->itemuid;
  670. $collectHeros->$herouid->equip->weapon->itemuid = $equipuid;
  671. break;
  672. case 2: # 防具
  673. $oldEquipId = $collectHeros->$herouid->equip->armor->itemuid;
  674. $collectHeros->$herouid->equip->armor->itemuid = $equipuid;
  675. break;
  676. case 3: # 饰品
  677. $oldEquipId = $collectHeros->$herouid->equip->ring->itemuid;
  678. $collectHeros->$herouid->equip->ring->itemuid = $equipuid;
  679. break;
  680. default :
  681. Err(ErrCode::store_equip_type);
  682. break;
  683. }
  684. if ($oldEquipId > 0 && $oldEquipId != $equipuid) {
  685. $user->store->equipment->$oldEquipId->herouid = 0;
  686. }
  687. UserProc::updateUserInfo(); // 5.回写数据
  688. // StoreProc::CheckItemNum($req);
  689. HeroProc::CalcUserFightPower($req->zoneid, $req->uid, $user); # 更新总战力榜
  690. return Resp::ok(array('resp' => "succeed!")); // 返回
  691. }
  692. /**
  693. * [6411] 给英雄脱装备
  694. * @deprecated since version 不能卸下装备, 只能更换.
  695. * @param req $req
  696. * @return type
  697. */
  698. static function UnWieldEquip($req) {
  699. list($itemtype, $equipuid, $herouid) = $req->paras; # 提取参数: 装备类型, 装备的UID, 拥有该装备的英雄的UID
  700. $user = $req->userInfo->game; # user引用
  701. $collectHeros = $user->heros->collectHeros;
  702. my_default_Obj($collectHeros);
  703. my_Assert(CommUtil::isPropertyExists($collectHeros, $herouid), ErrCode::hero_no); # 检测是否存在拥有该装备的英雄
  704. my_Assert(CommUtil::isPropertyExists($user->store->equipment, $equipuid), ErrCode::store_itemno_err); # 检测是否存在该装备
  705. if ($user->store->equipment->$equipuid->herouid == $herouid) { # 取装备对象
  706. $user->store->equipment->$equipuid->herouid = 0;
  707. }
  708. switch ($itemtype) { # 检测该装备是否装备在该英雄身上
  709. case 1: # 武器
  710. if ($collectHeros->$herouid->equip->weapon->itemuid != $equipuid) {
  711. Err(ErrCode::store_noequip_err);
  712. }
  713. $collectHeros->$herouid->equip->weapon->itemuid = 0; # 卸下
  714. break;
  715. case 2: # 防具
  716. if ($collectHeros->$herouid->equip->armor->itemuid != $equipuid) {
  717. Err(ErrCode::store_noequip_err);
  718. }
  719. $collectHeros->$herouid->equip->armor->itemuid = 0;
  720. break;
  721. case 3: # 饰品
  722. if ($collectHeros->$herouid->equip->ring->itemuid != $equipuid) {
  723. Err(ErrCode::store_noequip_err);
  724. }
  725. $collectHeros->$herouid->equip->ring->itemuid = 0;
  726. break;
  727. default :
  728. Err(ErrCode::store_equip_type);
  729. }
  730. UserProc::updateUserInfo(); # 回写数据
  731. // StoreProc::CheckItemNum($req);
  732. return Resp::ok(array('resp' => "succeed!")); // 返回
  733. }
  734. // </editor-fold>
  735. //
  736. // <editor-fold defaultstate="collapsed" desc=" 辅助方法 ">
  737. /**
  738. * 将宝箱放入仓库
  739. * @param StoreModel $store
  740. * @param int $boxId 宝箱类型编号
  741. * @param int $num 数量
  742. */
  743. static function putBoxexInStore($store, $boxId, $num) {
  744. Err(ErrCode::err_method_obsoleted);
  745. if (CommUtil::isPropertyExists($store->boxes, $boxId)) {
  746. $store->boxes->$boxId += $num;
  747. } else {
  748. $store->boxes->$boxId = $num;
  749. }
  750. }
  751. /**
  752. * 检查背包中物品的个数
  753. * @param req $req
  754. * @return int
  755. */
  756. public static function CheckItemNum($req) {
  757. $ItemObj = $req->userInfo->game->store->items;
  758. $EquipObj = $req->userInfo->game->store->equipment;
  759. $SegementObj = $req->userInfo->game->store->segement;
  760. $HeroObj = $req->userInfo->game->heros->collectHeros;
  761. $ItemNum = 0;
  762. ////检查宝石类可叠加物品的格子占用
  763. if ($ItemObj) {
  764. foreach ($ItemObj as $value) {
  765. $ItemNum++;
  766. }
  767. }
  768. if ($SegementObj) {
  769. foreach ($SegementObj as $value) {
  770. $ItemNum++;
  771. }
  772. }
  773. ////检测装备类物品格子占用
  774. if ($EquipObj) {
  775. foreach ($EquipObj as $value) {
  776. $ItemNum++;
  777. }
  778. }
  779. ////检测英雄装备到身上的情况,装备到英雄身上不占格子,要减去.
  780. if ($HeroObj) {
  781. foreach ($HeroObj as $value) {
  782. // echo var_dump($HeroObj);
  783. $HeroEquipId = $value->equip->weapon->itemuid;
  784. if ($HeroEquipId > 0) {
  785. $ItemNum--;
  786. }
  787. $HeroEquipId = $value->equip->armor->itemuid;
  788. if ($HeroEquipId > 0) {
  789. $ItemNum--;
  790. }
  791. $HeroEquipId = $value->equip->ring->itemuid;
  792. if ($HeroEquipId > 0) {
  793. $ItemNum--;
  794. }
  795. }
  796. }
  797. $req->userInfo->game->privateState->ItemNum = $ItemNum;
  798. return $ItemNum;
  799. }
  800. /**
  801. * 获取物品格子的上限值
  802. * @return int 上限数值
  803. */
  804. public static function GetItemMaxNum() {
  805. $user = req()->userInfo->game;
  806. if (!CommUtil::isPropertyExists($user->privateState, "maxItemNum")) {
  807. $user->privateState->maxItemNum = glc()->Item_Packet_MaxNum;
  808. }
  809. return $user->privateState->maxItemNum;
  810. }
  811. /**
  812. * 背包扩容
  813. * @param type $req
  814. * @return type
  815. */
  816. public static function AddPacketNum($req) {
  817. $user = $req->userInfo->game; # user引用
  818. if (!CommUtil::isPropertyExists($user->privateState, "maxItemNum")) {
  819. $user->privateState->maxItemNum = glc()->Item_Packet_MaxNum;
  820. }
  821. $costCash = glc()->Item_Packet_NumCostCash; # 钻石花费
  822. my_Assert($costCash > 0, ErrCode::paras_err);
  823. my_Assert(UserGameModel::Consume_Cash($user, $costCash), ErrCode::notenough_cash_msg); # 6.进行消耗
  824. $user->privateState->maxItemNum += 10; # 扩容
  825. UserProc::updateUserInfo(); # 保存玩家数据
  826. $resp = Resp::ok(array('maxItemNum' => $user->privateState->maxItemNum)); # 返回值
  827. StoreProc::CheckItemNum($req);
  828. return $resp;
  829. }
  830. // </editor-fold>
  831. //
  832. // -------------- 已废弃的代码 -------------------------------
  833. //
  834. //
  835. // <editor-fold defaultstate="collapsed" desc=" 出售 ">
  836. //
  837. /**
  838. * 出售单一的物品
  839. * @param Req $req
  840. * @return type
  841. */
  842. static function sellItem($req) {
  843. Err(ErrCode::err_method_obsoleted, "代码需要更新");
  844. $resp = new Resp();
  845. $mem = $req->mem;
  846. // $user = $req->userInfo->user;
  847. $store = $req->userInfo->game->store; //$req->userInfo->game->store->items
  848. //客户端参数解析
  849. $type = $req->paras[0]; //1=神兽 2=建筑 //需要判断是否叠加
  850. $itemId = $req->paras[1]; // 注意:这里不是单体的id,而是物种的id
  851. if ($type > 3) {
  852. $count = intval($req->paras[2]); // 数量
  853. $uid = 0;
  854. } else {
  855. $count = 1;
  856. $uid = $req->paras[2];
  857. }//物品的uid
  858. ////0是type 1是itemid,2是uid或者是数量
  859. if ($type > 3 && $type < 8) { // 从仓库出售宝石 出售可叠加的物品
  860. $ok = StoreProc::removeItemFromStore($store, $itemId, $count); // 支持移除指定数量
  861. my_Assert($ok == ErrCode::ok, $ok); //1.如果仓库道具移出时出错,则直接返回错误
  862. // echo "弄弄";
  863. $gem = GameConfig::item_getItem($itemId); // ConstProc::getItemConst($itemId);
  864. echo var_export($gem);
  865. //2.检测是否存在该物品的原始物种
  866. if ($gem == null) {
  867. Err(ErrCode::err_godpet_noconst);
  868. }
  869. // 发金币
  870. UserGameModel::Add_Gold($req->userInfo->game, $gem->maijia * $count);
  871. $ret = array('resp' => "succeed!");
  872. $resp = Resp::ok($ret);
  873. UserProc::updateUserInfo();
  874. } else if ($type == 8) { // 从仓库出售碎片 出售可叠加的物品
  875. $ok = StoreProc::removeItemFromStore($store, $itemId, $count); // 支持移除指定数量
  876. my_Assert($ok == ErrCode::ok, $ok); //1.如果仓库道具移出时出错,则直接返回错误
  877. // echo "弄弄";
  878. $gem = GameConfig::segment_getItem($itemId); // ConstProc::getItemConst($itemId);
  879. // echo var_export($gem);
  880. //2.检测是否存在该物品的原始物种
  881. if ($gem == null) {
  882. Err(ErrCode::err_godpet_noconst);
  883. }
  884. // 发金币
  885. UserGameModel::Add_Gold($req->userInfo->game, $gem->saleGoldPrice * $count);
  886. $ret = array('resp' => "succeed!");
  887. $resp = Resp::ok($ret);
  888. UserProc::updateUserInfo();
  889. } else if ($type < 4 && $type > 0) { # 这里是装备
  890. if ($count > 1) {
  891. Err(ErrCode::paras_err);
  892. }
  893. if ($uid < 1) {
  894. Err(ErrCode::paras_err);
  895. }
  896. $ok = StoreProc::removeEquipFromStore($uid, $itemId, $req); # 从背包移除
  897. if (!$ok) {//1.如果背包道具移出时出错,则直接返回错误
  898. Err(ErrCode::store_removefail);
  899. }
  900. $item = GameConfig::item_getItem($itemId); // ConstProc::getItemConst($itemId);
  901. if ($item == null) { //2.检测是否存在装备的原始数据
  902. Err(ErrCode::err_const_no);
  903. }
  904. UserGameModel::Add_Gold($req->userInfo->game, $item->maijia);
  905. $ret = array('resp' => "succeed!");
  906. $resp = Resp::ok($ret); //返回必须是object
  907. UserProc::updateUserInfo();
  908. } else {
  909. Err(ErrCode::paras_err);
  910. }
  911. StoreProc::CheckItemNum($req);
  912. return $resp;
  913. }
  914. /**
  915. * 卖出一堆物品时候,检测每个单个物品是否符合卖的条件
  916. * @param Req $req
  917. * @return type
  918. */
  919. static function preSellSingleFromStore(&$req, $type, $itemId, $count, $uid) {
  920. Err(ErrCode::err_method_obsoleted, "代码需要更新");
  921. $resp = new Resp();
  922. $mem = $req->mem;
  923. // $user = $req->userInfo->user;
  924. $store = $req->userInfo->game->store; //$req->userInfo->game->store->items
  925. //客户端参数解析
  926. ////0是type 1是itemid,2是uid或者是数量
  927. if ($type > 3 && $type < 8) { // 从仓库出售宝石 出售可叠加的物品
  928. echoLine(":fs::");
  929. $ok = StoreProc::removeItemFromStore($store, $itemId, $count); // 支持移除指定数量
  930. //1.如果仓库道具移出时出错,则直接返回错误
  931. my_Assert($ok == ErrCode::ok, $ok);
  932. echo "弄弄";
  933. $gem = GameConfig::item_getItem($itemId); // ConstProc::getItemConst($itemId);
  934. echo var_export($gem);
  935. //2.检测是否存在该物品的原始物种
  936. if ($gem == null) {
  937. Err(ErrCode::err_godpet_noconst);
  938. }
  939. // 发金币
  940. UserGameModel::Add_Gold($req->userInfo->game, $gem->maijia * $count);
  941. $ret = array('resp' => "succeed!");
  942. $resp = Resp::ok($ret);
  943. } else if ($type == 8) { // 从仓库出售碎片 出售可叠加的物品
  944. $ok = StoreProc::removeItemFromStore($store, $itemId, $count); // 支持移除指定数量
  945. //1.如果仓库道具移出时出错,则直接返回错误
  946. my_Assert($ok == ErrCode::ok, $ok);
  947. // echo "弄弄";
  948. $gem = GameConfig::segment_getItem($itemId); // ConstProc::getItemConst($itemId);
  949. // echo var_export($gem);
  950. //2.检测是否存在该物品的原始物种
  951. if ($gem == null) {
  952. Err(ErrCode::err_godpet_noconst);
  953. }
  954. // 发金币
  955. UserGameModel::Add_Gold($req->userInfo->game, $gem->saleGoldPrice * $count);
  956. $ret = array('resp' => "succeed!");
  957. $resp = Resp::ok($ret);
  958. } else if ($type < 4 && $type > 0) { # 这里是装备
  959. if ($count > 1) {
  960. Err(ErrCode::paras_err);
  961. }
  962. if ($uid < 1) {
  963. Err(ErrCode::paras_err);
  964. }
  965. $ok = StoreProc::removeEquipFromStore($uid, $itemId, $req); # 从背包移除
  966. if (!$ok) {//1.如果背包道具移出时出错,则直接返回错误
  967. Err(ErrCode::store_removefail);
  968. }
  969. $item = GameConfig::item_getItem($itemId); // ConstProc::getItemConst($itemId);
  970. if ($item == null) { //2.检测是否存在装备的原始数据
  971. Err(ErrCode::err_const_no);
  972. }
  973. UserGameModel::Add_Gold($req->userInfo->game, $item->maijia);
  974. $ret = array('resp' => "succeed!");
  975. $resp = Resp::ok($ret); //返回必须是object
  976. } else {
  977. Err(ErrCode::paras_err);
  978. }
  979. return $resp;
  980. }
  981. /**
  982. * 从背包出售多个物品
  983. * @param Req $req
  984. * @return type
  985. */
  986. static function sellMultiItemFromStore($req) {
  987. $resp = new Resp();
  988. $obj = $req->paras[0]; // 获取物品的结构数组
  989. foreach ($obj as $value) {
  990. $type = $value[0];
  991. $itemId = $value[1];
  992. ////先判断一下物品类型,如果是可叠加的,就按数量取值,如果是不可叠加的就按uid取值
  993. if ($type > 3) {
  994. $count = intval($value[2]); // 数量
  995. $uid = 0;
  996. } else {
  997. $count = 1;
  998. $uid = $value[2];
  999. }//物品的uid
  1000. $resp = StoreProc:: preSellSingleFromStore($req, $type, $itemId, $count, $uid);
  1001. }
  1002. if (0 == $resp->err) {
  1003. UserProc::updateUserInfo();
  1004. }
  1005. StoreProc::CheckItemNum($req);
  1006. return $resp;
  1007. }
  1008. // </editor-fold>
  1009. //
  1010. }