StoreProc.php 52 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085
  1. <?php
  2. namespace loyalsoft;
  3. /**
  4. * Description of StoreProc
  5. * 仓库/背包 处理流程
  6. * ===========================
  7. * 尚待处理的流程:道具售出时貌似存在多种格式....
  8. * @author
  9. */
  10. class StoreProc {
  11. /**
  12. * 逻辑分发
  13. * 所有的Proc中必须有这样一个方法
  14. */
  15. static function procMain() {
  16. switch (req()->cmd) {
  17. case CmdCode::cmd_store_put: # 6401 放入仓库
  18. return StoreProc::AddItemInStore();
  19. case CmdCode::cmd_store_singleSell: # 6402 出售单个道具
  20. return StoreProc::sellItem();
  21. case CmdCode::cmd_store_mutliSell: # 6403 批量出售 卖掉
  22. return StoreProc::sellMultiItemFromStore();
  23. case CmdCode::cmd_store_use: # 6404 使用道具
  24. return StoreProc::useItem();
  25. case CmdCode::cmd_store_refresh: # 6405 获取最新的仓库数据
  26. return StoreProc::refreshStore();
  27. case CmdCode::cmd_store_delItem: # 6406 从仓库删除道具
  28. return StoreProc::delItemFromStore();
  29. case CmdCode::cmd_store_Testcmd: # 6407 测试方法
  30. return StoreProc::Test();
  31. // case CmdCode::cmd_store_ItemUpgrade: # 6408 装备升级
  32. // return StoreProc::ItemUpgrade($req);
  33. // case CmdCode::cmd_store_GemCompose: # 6408 装备合成
  34. // return StoreProc::composeItem($req);
  35. //
  36. case CmdCode::cmd_store_WearEquip: # 6410 给英雄穿装备
  37. return StoreProc::WearEquipToHero();
  38. case CmdCode::cmd_store_UnWieldEquip: # 6411 将该装备从指定英雄上脱下
  39. return StoreProc::UnWieldEquip();
  40. //
  41. case CmdCode::cmd_store_AddMaxPacketNum: # 6412 扩展包裹格子数量
  42. return StoreProc::AddPacketNum();
  43. // case CmdCode::cmd_store_MeltEquip: # 6413 装备融合
  44. // Err(ErrCode::err_method_obsoleted);
  45. //// return StoreProc::MeltEquip($req);
  46. // case CmdCode::cmd_store_PiecesCompose: # 6415 碎片合成
  47. // return StoreProc::composePieces($req);
  48. case CmdCode::cmd_store_WearYanling: # 6416 装备言灵
  49. return StoreProc::WearYanlingToHero();
  50. case CmdCode::cmd_store_UnWieldYanling: # 6417 卸下言灵
  51. return StoreProc::UnWieldYanling();
  52. case CmdCode::cmd_store_mergeYanlingbook: # 6418 利用言灵召唤书碎片合成召唤书
  53. return self::MergeYanlingBook();
  54. case CmdCode::cmd_store_callyanling: # 6419 利用言灵召唤书召唤言灵
  55. return self::CallYanlingByBook();
  56. case CmdCode::cmd_store_yanling_upgrade: # 6420 言灵进阶
  57. return self::YanlingUpgrade();
  58. case CmdCode::cmd_store__weapon_upgrade: # 6421武器升级
  59. return self::weaponUpgrade();
  60. case CmdCode::cmd_store__weapon_tupo: # 6422武器突破
  61. return self::weaponTupo();
  62. case CmdCode::cmd_store__weaponReplace: # 6423武器替换
  63. return self::weaponReplace();
  64. case CmdCode::cmd_store_GemCompose: #6424
  65. return StoreProc::GemComposeItem();
  66. case CmdCode::cmd_store_GemResearchLvUp: # 6425
  67. return StoreProc::GemResearchLvUp();
  68. default:
  69. Err(ErrCode::cmd_err);
  70. }
  71. }
  72. /**
  73. * 宝石合成
  74. */
  75. static function GemComposeItem() {
  76. list($gemId,$num) = req()->paras; # 参数 言灵uid(指定进阶的言灵实例id)
  77. $user = req()->userInfo->game;
  78. //my_Assert(CommUtil::isPropertyExists($myPacketItems, $costItemId), ErrCode::store_itemnotenough); #
  79. $mo = GameConfig::gem_formula_getItem($gemId);
  80. my_Assert($mo != null, ErrCode::err_const_no); #
  81. my_Assert($mo->levellimit >= $user->Gem->level, ErrCode::store_GemComplose_ResearchLevelLimit); #
  82. $itemId = $mo->drawItem;
  83. if($itemId != ""){
  84. my_Assert(StlUtil::dictHasProperty($user->store->items,$itemId) && $user->store->items->$itemId>0 , ErrCode::store_GemComploseTuZhiNotEnough); #
  85. }
  86. if($mo->composeMaterial != ""){
  87. $mList = explode(',', $mo->composeMaterial);
  88. $itemId = $mList[0];
  89. $num = $mList[1];
  90. my_Assert(StlUtil::dictHasProperty($user->store->items,$itemId) && $user->store->items->$itemId> $num , ErrCode::store_GemComploseMaterialNotEnough);
  91. //扣除材料
  92. StoreProc::removeItemFromStore($user->store, $itemId,$num);
  93. }
  94. $gList = explode(',', $mo->composeGem);
  95. $itemId = $gList[0];
  96. my_Assert(StlUtil::dictHasProperty($user->store->items,$itemId) && $user->store->items->$itemId>$gList[1] , ErrCode::store_ComploseGemNotEnough);
  97. my_Assert($user->baseInfo->gold>=$mo->composeGold, ErrCode::notenough_gold_msg);
  98. //扣除配方金币 宝石
  99. $user->base(true)->Consume_Gold($mo->composeGold);
  100. StoreProc::removeItemFromStore($user->store, $gList[0],$gList[1]);
  101. req()->userInfo->game = $user;
  102. UserProc::updateUserInfo(); # 回写玩家数据
  103. return Resp::ok(array(
  104. "store" => $user->store, # # 目前来看只涉及到items变化
  105. 'gold' => $user->baseInfo->gold,
  106. ));
  107. }
  108. /**
  109. * 宝石合成的研究等级提升
  110. */
  111. static function GemResearchLvUp() {
  112. //list() = req()->paras; # 参数 言灵uid(指定进阶的言灵实例id)
  113. $user = req()->userInfo->game;
  114. $researchLevel = $user->Gem->level;//研究等级
  115. $mo = GameConfig::gem_researchlevel_getItem($researchLevel+1);
  116. my_Assert($mo != null, ErrCode::err_const_no);
  117. my_Assert($mo->userlevelLimit <= $user->baseInfo->level, ErrCode::store_GemResearchLvUp_UserLevelLimit);
  118. $list = explode(',',$mo->unlockLevelGoldCost);
  119. my_Assert($list[1]<= $user->baseInfo->gold, ErrCode::notenough_gold_msg);
  120. $user->base(true)->Consume_Gold($list[1]);
  121. $user->Gem->level += 1;
  122. req()->userInfo->game = $user;
  123. UserProc::updateUserInfo(); # 回写玩家数据
  124. return Resp::ok(array(
  125. "lv" => $user->Gem->level, # # 目前来看只涉及到items变化
  126. 'gold' => $user->baseInfo->gold,
  127. ));
  128. }
  129. /**
  130. * 武器升级
  131. */
  132. static function weaponUpgrade() {
  133. list($uid, $wuqiList, $items) = req()->paras; # 参数 言灵uid(指定进阶的言灵实例id)
  134. $user = req()->userInfo->game;
  135. $equipment = $user->store->equipment;
  136. my_Assert(CommUtil::isPropertyExists($equipment, $uid), ErrCode::store_weapon_err); # 玩家拥有此英雄
  137. $myPacketItems = $user->store->items;
  138. //消耗材料道具
  139. $total = 0;
  140. $totalGold = 0;
  141. foreach ($items as $costItemId => $costNumber) {
  142. my_Assert(CommUtil::isPropertyExists($myPacketItems, $costItemId), ErrCode::store_itemnotenough); #
  143. my_Assert($myPacketItems->$costItemId >= $costNumber, ErrCode::store_itemnotenough); # 检查道具的数量,在背包中是否充足
  144. $mo = GameConfig::item_stones_getItem($costItemId);
  145. my_Assert($mo != null, ErrCode::err_const_no);
  146. StoreProc::removeItemFromStore($user->store, $costItemId, $costNumber);
  147. $total += $mo->baseExp * $costNumber;
  148. $totalGold += $mo->costGold * $costNumber;
  149. }
  150. $wuqiExp = 0;
  151. //消耗武器
  152. foreach ($wuqiList as $wuqiId) {
  153. my_Assert(CommUtil::isPropertyExists($equipment, $wuqiId), ErrCode::store_weapon_err); # 玩家拥有此英雄
  154. $mo = GameConfig::item_weapon_getItem($equipment->$wuqiId->typeId);
  155. $baseExp = $mo->baseExp;
  156. //$needExp = GameConfig::weapon_levelexp_getItem(GameConfig::item_base_getItem($equipment->$wuqiId->typeId)->quality,$equipment->$wuqiId->level)->needExp;
  157. $wuqiExp += $baseExp + $equipment->$wuqiId->exp * 0.75;
  158. $totalGold += $mo->costGold;
  159. StlUtil::dictRemove($user->store->equipment, $wuqiId);
  160. }
  161. my_Assert($user->baseInfo->gold >= $totalGold, ErrCode::notenough_gold_msg);
  162. $equipVo = new Ins_Weapon($equipment->$uid);
  163. $initLevel = $equipVo->level;
  164. $equipVo->exp += $total + (int) $wuqiExp;
  165. $curlevel = self::Upgrade($equipVo->exp, GameConfig::item_base_getItem($equipVo->typeId)->quality, Enum_UpgradeType::Wuqi);
  166. $curStar = $equipVo->starLevel; #当前星级
  167. $equipVo->level = $curlevel;
  168. if ($curStar < 5) {
  169. $starlimitLv = GameConfig::weaponextra_level_getItem($equipVo->typeId, $curStar + 1)->starlimitLv;
  170. if ($starlimitLv < $curlevel) {
  171. $equipVo->level = $starlimitLv;
  172. $equipVo->xp = GameConfig::weapon_levelexp_getItem(GameConfig::item_base_getItem($equipVo->typeId)->quality, $starlimitLv)->requiredExp;
  173. }
  174. }
  175. $user->store->equipment->$uid = $equipVo;
  176. UserProc::CollectUserBaseParam(req()->cmd, 2, $user->baseInfo->gold, $totalGold, $user->baseInfo->gold - $totalGold, "");
  177. $user->baseInfo->gold -= $totalGold;
  178. req()->userInfo->game = $user;
  179. req()->userInfo->game->store->items = $myPacketItems; # 更新背包数据
  180. if ($equipVo->level != $initLevel) {
  181. NormalEventProc::OnWeaponLvlUp($uid, $equipVo->level); # 广播英雄升级事件
  182. }
  183. UserProc::updateUserInfo(); # 回写玩家数据
  184. return Resp::ok(array(
  185. "store" => $user->store, # # 目前来看只涉及到items变化
  186. 'gold' => $user->baseInfo->gold,
  187. ));
  188. }
  189. /**
  190. * 武器升级计算
  191. * @param type $xp
  192. * @param type $type
  193. * @return type
  194. */
  195. static function Upgrade($xp, $qual, $type) {
  196. $curLv = 0;
  197. if ($type == Enum_UpgradeType::Wuqi) {
  198. $heroLvDic = GameConfig::weapon_levelexp()->$qual;
  199. } else {
  200. $heroLvDic = GameConfig::yanlingLevel_type()->$qual;
  201. }
  202. $f = (array) $heroLvDic;
  203. ksort($f);
  204. foreach ($f as $lv => $mo) {
  205. if ($xp < $mo->requiredExp) {
  206. $curLv = $lv - 1;
  207. break;
  208. }
  209. // if($lv>=glc()->Weapon_Upgrade_BasicMaxLevel){
  210. // $curLv = glc()->Weapon_Upgrade_BasicMaxLevel;
  211. // break;
  212. // }
  213. }
  214. return $curLv;
  215. }
  216. /**
  217. * 武器突破
  218. */
  219. static function weaponTupo() {
  220. list($uid) = req()->paras; # 参数 言灵uid(指定进阶的言灵实例id)
  221. $user = req()->userInfo->game;
  222. $equipment = $user->store->equipment;
  223. my_Assert(CommUtil::isPropertyExists($equipment, $uid), ErrCode::store_weapon_err); # 玩家拥有此英雄
  224. $typeId = $equipment->$uid->typeId;
  225. $curStar = $equipment->$uid->starLevel;
  226. my_Assert($curStar < 5, ErrCode::hero_yanling_canotTupo);
  227. $mo = GameConfig::weaponextra_level_getItem($typeId, $curStar + 1);
  228. my_Assert($mo != null, ErrCode::err_const_no);
  229. my_Assert($equipment->$uid->level >= $mo->starlimitLv, ErrCode::hero_yanling_canotTupo);
  230. my_Assert($user->baseInfo->level >= $mo->userlvLimit, ErrCode::hero_yanling_canotTupo);
  231. my_Assert($user->baseInfo->gold >= $mo->gold, ErrCode::notenough_gold_msg);
  232. // $segID = $mo->segID;
  233. // my_Assert(StlUtil::dictHasProperty($user->store->items,$segID) , ErrCode::store_itemnotenough);
  234. // my_Assert($user->store->items->$segID>=$mo->segNum , ErrCode::store_itemnotenough);
  235. $costItemsList = explode(';', $mo->costItems);
  236. foreach ($costItemsList as $value) {
  237. $list = explode(',', $value);
  238. StoreProc::removeItemFromStore($user->store, $list[0], $list[1]);
  239. }
  240. UserProc::CollectUserBaseParam(req()->cmd, 2, $user->baseInfo->gold, $mo->gold, $user->baseInfo->gold - $mo->gold, "");
  241. $user->baseInfo->gold -= $mo->gold;
  242. $equipment->$uid->starLevel += 1;
  243. NormalEventProc::OnWeaponLvTuPo($uid, $equipment->$uid->starLevel); # 广播英雄升级事件
  244. TaskProc::OnWeaponStarUp($equipment->$uid->starLevel);
  245. $user->store->equipment = $equipment;
  246. req()->userInfo->game = $user;
  247. UserProc::updateUserInfo(); # 回写玩家数据
  248. return Resp::ok(array(
  249. "store" => $user->store, # # 目前来看只涉及到items变化
  250. 'gold' => $user->baseInfo->gold,
  251. ));
  252. }
  253. /**
  254. * 武器替换
  255. * @return type
  256. */
  257. static function weaponReplace() {
  258. list($uid, $replaceId) = req()->paras; # 参数 言灵uid(指定进阶的言灵实例id)
  259. $user = req()->userInfo->game;
  260. $equipment = $user->store->equipment;
  261. my_Assert(property_exists($equipment, $uid), "找不到这个言灵");
  262. my_Assert(property_exists($equipment, $replaceId), "找不到这个言灵");
  263. $herouid = $equipment->$uid->herouid;
  264. $herouid_replace = $equipment->$replaceId->herouid;
  265. $equipment->$replaceId->herouid = $herouid;
  266. $equipment->$uid->herouid = $herouid_replace;
  267. $user->store->equipment = $equipment;
  268. req()->userInfo->game = $user;
  269. UserProc::updateUserInfo(); # 回写玩家数据
  270. return Resp::ok(array(
  271. "store" => $user->store, # # 目前来看只涉及到items变化
  272. ));
  273. }
  274. /**
  275. * [6420] 言灵进阶
  276. */
  277. static function YanlingUpgrade() {
  278. list($yanlingUid) = req()->paras; # 参数 言灵uid(指定进阶的言灵实例id)
  279. $user = req()->userInfo->game;
  280. my_Assert(property_exists($user->store->yanling, $yanlingUid), "找不到这个言灵");
  281. $yanlingObj = $user->store->yanling->$yanlingUid;
  282. $yanlingMoId = $yanlingObj->typeId;
  283. $curGrade = property_exists($yanlingObj, "grade") ? $yanlingObj->grade : 1; # 当前等阶
  284. $toGrade = $curGrade + 1; # 下一等阶
  285. my_Assert($toGrade <= 5, ErrCode::store_yanlingGrade_max); # 已经进阶到最高
  286. $toGradeCfg = GameConfig::yanling_upgrade_getItem($yanlingMoId, $toGrade); # 下一阶配置
  287. my_Assert(null != $toGradeCfg, ErrCode::err_const_no); # 找不到言灵进阶常量
  288. $costs = explode(';', $toGradeCfg->cost_materials);
  289. my_Assert(count($costs) > 0, ErrCode::store_yanlingGrade_cfg); # 言灵进阶数据有误
  290. foreach ($costs as $c) {
  291. list($itemId, $num) = explode(',', $c); # 解析材料
  292. $err = self::removeItemFromStore($user->store, $itemId, $num); # 扣除 材料
  293. my_Assert(ErrCode::ok == $err, $err); # 防御扣除材料失败
  294. }
  295. $yanlingObj->grade = $toGrade; # 修改进阶
  296. $user->store->yanling->$yanlingUid = $yanlingObj; # 回写言灵数据
  297. UserProc::updateUserInfo(); # 回写玩家数据
  298. return Resp::ok(array(
  299. "store" => $user->store, # # 目前来看只涉及到items变化
  300. ));
  301. }
  302. /**
  303. * [6418] 利用言灵召唤书碎片合成召唤书
  304. */
  305. static function MergeYanlingBook() {
  306. list($bookId) = req()->paras; # 参数 言灵召唤书id
  307. $user = req()->userInfo->game;
  308. $bookIdCfg = GameConfig::item_yanlingbook_getItem($bookId);
  309. my_Assert(null != $bookIdCfg, ErrCode::err_const_no); # 找不到言灵书常量
  310. list($segId, $num) = explode(',', $bookIdCfg->seg_num); # 解析所需碎片信息
  311. $err = self::removeItemFromStore($user->store, $segId, $num); # 扣除 碎片
  312. my_Assert(ErrCode::ok == $err, $err); # 防御扣除碎片失败
  313. self::PutOverlyingItemInStore($bookId); # 添加召唤书
  314. UserProc::updateUserInfo(); # 回写数据
  315. return Resp::ok(array(
  316. "store" => $user->store, # # 目前来看只涉及到items变化
  317. ));
  318. }
  319. /**
  320. * [6419] 利用言灵召唤书召唤言灵
  321. */
  322. static function CallYanlingByBook() {
  323. list($bookId) = req()->paras; # 参数 利用的言灵召唤书id
  324. $user = req()->userInfo->game;
  325. $bookIdCfg = GameConfig::item_yanlingbook_getItem($bookId);
  326. my_Assert(null != $bookIdCfg, ErrCode::err_const_no); # 找不到言灵书常量
  327. $err = self::removeItemFromStore($user->store, $bookId); # 扣除 召唤书
  328. my_Assert(ErrCode::ok == $err, $err); # 防御扣除召唤书失败
  329. $costs = explode(';', $bookIdCfg->cost_materials);
  330. my_Assert(count($costs) > 0, ErrCode::store_book_info); # 召唤书数据有误
  331. foreach ($costs as $c) {
  332. list($itemId, $num) = explode(',', $c); # 解析材料
  333. $err = self::removeItemFromStore($user->store, $itemId, $num); # 扣除 材料
  334. my_Assert(ErrCode::ok == $err, $err); # 防御扣除材料失败
  335. }
  336. self::PutYanLingInStore($bookIdCfg->yanling_id); # 添加言灵
  337. UserProc::updateUserInfo(); # 回写数据
  338. return Resp::ok(array(
  339. "store" => $user->store, # # 目前来看只涉及到items变化
  340. ));
  341. }
  342. /**
  343. * 测试方法
  344. * @return type
  345. */
  346. static public function Test() {
  347. Err(ErrCode::msg_method_obsoleted, "代码需更新");
  348. }
  349. /**
  350. * [6404] 使用仓库道具
  351. */
  352. static function useItem() {
  353. list($itemType, $num) = req()->paras; # 提取参数
  354. $mo = GameConfig::item_base_getItem($itemType);
  355. my_Assert(null != $mo, ErrCode::err_const_no);
  356. switch ($mo->subType) {
  357. case 601: # 任务卡
  358. my_Assert($num == 1, "任务卡一次只能使用一张!");
  359. $store = req()->userInfo->game->store();
  360. $err = $store->RemoveItemFromStore($itemType, $num); # 扣除任务卡
  361. my_Assert(ErrCode::ok == $err, $err);
  362. StoreProc::PutTaskCardInStore($itemType);
  363. req()->userInfo->game->store = $store;
  364. break;
  365. default :
  366. break;
  367. }
  368. UserProc::updateUserInfo();
  369. return Resp::ok(array(
  370. 'priv' => req()->userInfo->game->privateState,
  371. 'store' => req()->userInfo->game->store));
  372. // Err(ErrCode::msg_method_obsoleted, "代码需更新");
  373. }
  374. /**
  375. * [6405] 刷新仓库列表
  376. */
  377. static function refreshStore() {
  378. StoreProc::CheckItemNum();
  379. return Resp::ok(array('store' => req()->userInfo->game->store));
  380. }
  381. /**
  382. * [6406] 从仓库删除道具
  383. */
  384. static function delItemFromStore() {
  385. list($itemId, $num) = req()->paras;
  386. $err = self::removeItemFromStore(req()->userInfo->game->store, $itemId, $num);
  387. my_Assert(ErrCode::ok == $err, $err);
  388. UserProc::updateUserInfo();
  389. return Resp::ok(array('store' => req()->userInfo->game->store));
  390. }
  391. /**
  392. * [6409] 合成道具
  393. */
  394. static public function composeItem() {
  395. Err(ErrCode::err_method_notimplement);
  396. }
  397. /**
  398. * [6409] 合成碎片(几个碎片合成获得同品质或者更高品质的新碎片)
  399. */
  400. static public function composePieces() {
  401. Err(ErrCode::err_method_notimplement);
  402. }
  403. // </editor-fold>
  404. // --------------- 以下为辅助方法 ------------------
  405. //
  406. // <editor-fold defaultstate="collapsed" desc=" 移除物品 ">
  407. /**
  408. * 从仓库中移除指定数量的物品
  409. * @param Info_Store $store
  410. * @param type $itemId
  411. * @param type $itemcount
  412. * @return type
  413. */
  414. static function removeItemFromStore($store, $itemId, $itemcount = 1) {
  415. my_Assert(CommUtil::isPropertyExists($store->items, $itemId), ErrCode::store_itemno_err); # 没有这个道具
  416. my_Assert($store->items->$itemId >= $itemcount, ErrCode::store_itemnotenough); # 数量不足
  417. $store->items->$itemId -= $itemcount;
  418. if ($store->items->$itemId == 0) {
  419. unset($store->items->$itemId);
  420. }
  421. NormalEventProc::OnBag_Remove_Item($itemId, $itemcount); # 插入事件
  422. return ErrCode::ok;
  423. }
  424. /**
  425. * 从仓库移出装备
  426. * @param type $itemId uid
  427. * @param Info_Store $store
  428. * @return boolean
  429. */
  430. static function removeEquipFromStore($uid, $typeId) {
  431. $ok = false;
  432. if (CommUtil::isPropertyExists(req()->userInfo->game->store->equipment, $uid)) {
  433. my_Assert($typeId == req()->userInfo->game->store->equipment->$uid->typeId, "typeid检验错误"); // typeid相同;
  434. unset(req()->userInfo->game->store->equipment->$uid);
  435. $ok = true;
  436. }
  437. return $ok;
  438. }
  439. /**
  440. * 从仓库移除碎片
  441. * @param Info_Store $store
  442. * @param int $segmentId
  443. * @param int $num
  444. * @return bool 成功/失败
  445. */
  446. static function removeSegmetFromStore($store, $segmentId, $num = 1) {
  447. if (CommUtil::isPropertyExists($store->segement, $segmentId) #
  448. && $store->segement->$segmentId >= $num) {
  449. $store->segement->$segmentId -= $num;
  450. return TRUE;
  451. }
  452. return false;
  453. }
  454. /**
  455. * 向仓库添加碎片
  456. * @param Info_Store $store
  457. * @param int $segmentId
  458. * @param int $num
  459. */
  460. static function addSegmentIntoStore($store, $segmentId, $num = 1) {
  461. if (CommUtil::isPropertyExists($store->segement, $segmentId)) {
  462. $store->segement->$segmentId += $num;
  463. } else {
  464. $store->segement->$segmentId = $num;
  465. }
  466. $segMo = GameConfig::item_segment_getItem($segmentId);
  467. my_Assert($segMo != null, ErrCode::err_const_no);
  468. TaskProc::OnHeroSegmengNum($segMo->protoHeroID, $num);
  469. }
  470. // </editor-fold>
  471. //
  472. // <editor-fold defaultstate="collapsed" desc=" 放入物品 ">
  473. /**
  474. * 将其他物品放入仓库
  475. * @param type $itemId
  476. * @param Data_UserGame $game
  477. */
  478. static function PutItemInStore($itemId, &$game) {
  479. if (CommUtil::isPropertyExists($game->store->items, $itemId)) { // 如果仓库中已经有这种元素,则其数目+1
  480. $game->store->items->$itemId += 1;
  481. } else {// 如果仓库中没有这种元素,则其数目置1
  482. $game->store->items->$itemId = 1;
  483. }
  484. }
  485. /**
  486. * 解包多种物品到玩家身上 【警告】此函数的异常处理功能残废,不安全
  487. * 检测如果当前物品格子大于物品总数,则可以获取战利品,否则不可以
  488. * @param string $goodsStr itemid,num;itemid,num;...
  489. * @param int $src 1:战斗奖励, 2: 任务奖励, 3: 抽奖奖品, 4: 邮件领取, 5: 现金充值
  490. * @deprecated since version 0
  491. * @return type
  492. */
  493. public static function AddMultiItemInStore($goodsStr, $src = 1, $mask = 0) {
  494. $user = req()->userInfo->game;
  495. $ary = explode(";", $goodsStr);
  496. foreach ($ary as $value) {
  497. $val = explode(",", $value);
  498. $cid = "";
  499. my_Assert(count($val) > 1, "解析奖励字符串出错");
  500. list( $itemId, $num) = $val; # ID, 数量
  501. $smItem = GameConfig::item_base_getItem($itemId); # 道具mo
  502. switch ($smItem->subType) { # 根据类型分别添加到容器中
  503. case META_EXP: # 指挥官经验
  504. // Data_UserGame::Add_Exp($user->baseInfo, $num);
  505. $user->base()->Add_Exp($num); # 加指挥官经验
  506. break;
  507. case META_GOLD_ITEMID: # 金币
  508. // Data_UserGame::Add_Gold($user->baseInfo, $num);
  509. $user->base()->Add_Gold($num, $mask); # 增加金币
  510. break;
  511. case META_CASH_ITEMID: # 钻石
  512. // Data_UserGame::Add_Cash($user->baseInfo, $num);
  513. $user->base()->Add_Cash($num, $mask); # 增加钻石
  514. break;
  515. case META_tili_ITEMID: # 体力
  516. // Data_UserGame::Add_tili($num);
  517. $user->base()->Add_tili($num); # 增加体力
  518. break;
  519. case META_FriendShipPoit_ItemId: # 友情值
  520. // Data_UserGame::Add_FriendPoint($user->baseInfo, $num);
  521. $user->base()->Add_FriendPoint($num); # 加友情点
  522. break;
  523. case META_PVPCOIN_ITEMID: # 竞技币
  524. $user->pvp->pvpCoins += $num;
  525. break;
  526. case META_ActivePoint_ITEMID:
  527. // $user->task->dailyActivePoint += $num; # 每日任务活跃点
  528. break;
  529. case META_RESPOINT_ITEMID:
  530. $user->base()->Add_resPoint($num); # 增加资源点
  531. // Data_UserGame::Add_resPoint($user->baseInfo, $num); # 资源点添加
  532. break;
  533. case 101: # 武器
  534. for ($n = 0; $n < $num; $n++) {
  535. $cid = StoreProc::PutEquipInStore($itemId);
  536. }
  537. CornerSignEventProc::OnBag_new_Weapon();
  538. break;
  539. case 401: # 言灵
  540. for ($n = 0; $n < $num; $n++) {
  541. $cid = StoreProc::PutYanLingInStore($itemId);
  542. }
  543. CornerSignEventProc::OnBag_new_Yanling();
  544. break;
  545. case 501: # 限购礼包
  546. $itemMO = GameConfig::item_package_getItem($itemId);
  547. my_Assert(null != $itemMO, ErrCode::err_const_no);
  548. $err = StoreProc::AddMultiItemInStore($itemMO->contents); # 发放奖励
  549. my_Assert(ErrCode::ok == $err, $err);
  550. break;
  551. case 601: # 任务卡
  552. $cid = StoreProc::PutTaskCardInStore($itemId);
  553. break;
  554. case 201: # 碎片
  555. $segMo = GameConfig::item_segment_getItem($itemId);
  556. my_Assert($segMo != null, ErrCode::err_const_no);
  557. TaskProc::OnHeroSegmengNum($segMo->protoHeroID, $num);
  558. CornerSignEventProc::OnBag_new_Fragment();
  559. StoreProc::PutOverlyingItemInStore($itemId, $num); # 直接进包裹items
  560. break;
  561. case 202: # 召唤书碎片
  562. case 351: # 言灵召唤书
  563. StoreProc::PutOverlyingItemInStore($itemId, $num); # 直接进包裹items
  564. $book = GameConfig::item_yanlingbook_getItem($itemId);
  565. my_Assert(null != $book, ErrCode::err_const_no);
  566. $ylCfg = GameConfig::item_yanling_getItem($book->yanling_id);
  567. my_Assert(null != $ylCfg, ErrCode::err_const_no);
  568. switch ($ylCfg->career) { # 根据不同职业更新角标系统
  569. case 1:
  570. CornerSignEventProc::OnCall_Warrior_new(); # 战士
  571. break;
  572. case 2:
  573. CornerSignEventProc::OnCall_Magician_new(); # 法师
  574. break;
  575. case 3:
  576. CornerSignEventProc::OnCall_Archer_new(); # 射手
  577. break;
  578. default :
  579. break;
  580. }
  581. break;
  582. case 321: # 进阶材料
  583. case 322: # 进阶材料
  584. case 323: # 锻造材料
  585. case 324: # 魂器
  586. case 332: #普通祈愿券
  587. case 333: #活动祈愿券
  588. case 325: #元素突破材料
  589. case 326: #职业突破材料
  590. case 327: #言灵的突破石
  591. case 328: #言灵的突破材料
  592. case 329: #武器的突破石
  593. case 330: #武器的突破材料
  594. StoreProc::PutOverlyingItemInStore($itemId, $num); # 直接进包裹items
  595. CornerSignEventProc::OnBag_new_Material();
  596. break;
  597. case 311: # 基因(经验丹)
  598. case 312: # 强化道具
  599. case 313:
  600. StoreProc::PutOverlyingItemInStore($itemId, $num); # 直接进包裹items
  601. break;
  602. case 341: # 战场中掉落,不会进入包裹
  603. case 342:
  604. case 343:
  605. Err(ErrCode::err_innerfault, "落入包裹时,出现了非法物品($itemId)");
  606. break;
  607. default :
  608. Err(ErrCode::err_innerfault, "落入包裹时,出现了非法物品($itemId)");
  609. }
  610. TaskProc::OnGainItem($itemId, $num); // 检查获得道具的任务进度
  611. NormalEventProc::OnBag_new_Item($itemId, $num, $cid);
  612. }
  613. return ErrCode::ok; // 返回
  614. }
  615. /**
  616. * [6401]向包裹中添加物品
  617. */
  618. public static function AddItemInStore() {
  619. list($rwdStr, $mask) = req()->paras; //mask = 1:表示战斗中掉落
  620. $user = req()->userInfo->game;
  621. if ($mask == 1) {
  622. $err = self::AddMultiItemInStore($rwdStr, 1, 1);
  623. } else {
  624. $err = self::AddMultiItemInStore($rwdStr);
  625. }
  626. my_Assert(ErrCode::ok == $err, $err);
  627. UserProc::updateUserInfo();
  628. return Resp::ok(array(
  629. 'gold' => $user->baseInfo->gold,
  630. 'tili' => $user->baseInfo->tili,
  631. 'cash' => $user->baseInfo->cash,
  632. 'resPoint' => $user->baseInfo->resPoint,
  633. 'store' => $user->store));
  634. }
  635. /**
  636. * 将装备放入背包
  637. * @param type $itemId
  638. */
  639. static function PutEquipInStore($itemId) {
  640. $privateState = req()->userInfo->game->privateState;
  641. if (!CommUtil::isPropertyExists($privateState, "currentId")) { // 如果仓库中已经有这种元素,则其数目+1
  642. req()->userInfo->game->privateState->currentId = 1;
  643. }
  644. $cid = req()->userInfo->game->privateState->currentId++;
  645. //$equip = ObjectInit();
  646. $equip = new Ins_Weapon();
  647. $equip->typeId = $itemId;
  648. req()->userInfo->game->store->equipment->$cid = $equip;
  649. return $cid;
  650. // SystemProc::GetEquip($req->zoneid, $req->userInfo->game, $itemId); # 添加获得装备的消息
  651. }
  652. /**
  653. * 将言灵放入背包
  654. * @param type $itemId
  655. */
  656. static function PutYanLingInStore($itemId) {
  657. my_Assert(count((array) req()->userInfo->game->store->yanling) < 100, ErrCode::store_yanling_bagfull);
  658. $privateState = req()->userInfo->game->privateState;
  659. if (!CommUtil::isPropertyExists($privateState, "currentId")) { # 如果仓库中已经有这种元素,则其数目+1
  660. req()->userInfo->game->privateState->currentId = 1;
  661. }
  662. $cid = req()->userInfo->game->privateState->currentId++;
  663. //$equip = ObjectInit();
  664. $equip = new Ins_YanLin();
  665. $equip->typeId = $itemId;
  666. req()->userInfo->game->store->yanling->$cid = $equip;
  667. return $cid;
  668. }
  669. /**
  670. * 将任务卡放入背包
  671. * @param type $itemId
  672. */
  673. static function PutTaskCardInStore($itemId) {
  674. $privateState = req()->userInfo->game->privateState;
  675. if (!CommUtil::isPropertyExists($privateState, "currentId")) { # 如果仓库中已经有这种元素,则其数目+1
  676. req()->userInfo->game->privateState->currentId = 1;
  677. }
  678. $cid = req()->userInfo->game->privateState->currentId++;
  679. $mo = GameConfig::item_taskcard_getItem($itemId); # 任务卡常量
  680. my_Assert(null != $mo, ErrCode::err_const_no);
  681. $itembaseMo = GameConfig::item_base_getItem($itemId);
  682. my_Assert(null != $itembaseMo, ErrCode::err_const_no);
  683. if ($itembaseMo->pileNum > 0) { # 可叠加
  684. Err(ErrCode::taskCard_no_pile); # 不可堆叠!!! 我支持不了.gwang 2020年12月12日13:40:04
  685. // <editor-fold defaultstate="collapsed" desc=" 折叠 ">
  686. // $taskCard = null;
  687. // foreach ($req->userInfo->game->store->taskcards as $uuid => &$val) {
  688. // $val = new Ins_TaskCard($val);
  689. // if ($val->typeId == $itemId) {
  690. // $taskCard = $val;
  691. // break;
  692. // }
  693. // }
  694. // if (null == $taskCard) { # 原来么有
  695. // $taskCard = new Ins_TaskCard($itemId);
  696. // $taskCard->uid = $cid;
  697. // $req->userInfo->game->store->taskcards->$cid = $taskCard;
  698. // }
  699. // $taskCard->count += 1;
  700. // </editor-fold>
  701. } else {
  702. $taskCard = new Ins_TaskCard($itemId);
  703. $taskCard->uid = $cid;
  704. req()->userInfo->game->store->taskcards->$cid = $taskCard;
  705. }
  706. NormalEventProc::OnTaskBag_new_Card($cid, 1); # 播放获得任务卡事件
  707. if (null != $taskCard) {
  708. req()->paras = array($cid);
  709. TaskProc::OnTaskCard_active(); # 自动激活任务卡
  710. }
  711. return $cid;
  712. }
  713. /**
  714. * 将可叠加物品放入背包
  715. * @param int $itemId
  716. * @param int $num
  717. */
  718. static function PutOverlyingItemInStore($itemId, $num = 1) {
  719. $items = req()->userInfo->game->store->items; # dic: itemid=>number
  720. if (CommUtil::isPropertyExists($items, $itemId)) { # 如果仓库中已经有这种元素,则其数目+=num
  721. $items->$itemId += $num;
  722. } else { # 如果仓库中没有这种元素,则其数目置为num
  723. $items->$itemId = $num;
  724. }
  725. }
  726. /**
  727. * 物品包裹打散成独立道具到仓库
  728. * @param GoodsItemModel $itemModel
  729. * @deprecated since version now
  730. */
  731. static function addSeprateItem($itemModel) {
  732. Err(ErrCode::err_method_obsoleted, "未更新包裹操作");
  733. }
  734. /**
  735. * [6416] 给英雄装上言灵
  736. */
  737. static function WearYanlingToHero() {
  738. $user = req()->userInfo->game; # user引用
  739. list($itemtype, $yanling_uid, $herouid) = req()->paras; # 提取参数: 装备类型, 装备的UID, 英雄的UID
  740. my_Assert(CommUtil::isPropertyExists($user->store->yanling, $yanling_uid), ErrCode::store_itemno_err); # 检测是否存在该言灵
  741. $yanlingVo = new Ins_YanLin($user->store->yanling->$yanling_uid); # 取言灵对象
  742. if (isset($yanlingVo->herouid) && $yanlingVo->herouid > 0 #
  743. && $yanlingVo->herouid != $herouid) { # 检测该言灵是否装备到其他英雄身上
  744. Err(ErrCode::store_equipWeared_err);
  745. }
  746. $collectHeros = $user->heros->collectHeros; # 英雄集合
  747. my_Assert(null != $collectHeros, ErrCode::err_innerfault); # 防御对象为空
  748. my_Assert(CommUtil::isPropertyExists($collectHeros, $herouid), ErrCode::hero_no); # 检查英雄是否存在
  749. $hero = new Ins_UserHero($collectHeros->$herouid); # 取hero
  750. my_Assert($hero->level >= $yanlingVo->mo()->require_herolvl, "请提升唤灵师等级"); # 可装备的言灵等级受唤灵师等级限制.
  751. $user->store->yanling->$yanling_uid->herouid = $herouid; # 言灵上添加反向引用, 避免查询时的循环
  752. $oldYLid = $collectHeros->$herouid->yanling->$itemtype->itemuid; # 旧言灵id
  753. if ($oldYLid > 0) { # 代表替换操作
  754. $user->store->yanling->$oldYLid->herouid = 0; # 清理旧言灵的
  755. }
  756. $hero->yanling->$itemtype->itemuid = $yanling_uid; # 英雄身上添加言灵记录
  757. $collectHeros->$herouid = $hero;
  758. TaskProc::OnHeroWearYanling($collectHeros->$herouid->typeId, $user->store->yanling->$yanling_uid->typeId);
  759. UserProc::updateUserInfo(); # 5.回写数据
  760. $ret = array('resp' => "succeed!",
  761. 'store' => $user->store);
  762. $resp = Resp::ok($ret); // 返回
  763. HeroProc::CalcUserFightPower(req()->zoneid, req()->uid, $user); # 更新总战力榜
  764. return $resp;
  765. }
  766. /**
  767. * [6417] 给英雄卸下言灵
  768. * @deprecated since version 无法卸下,只能更换
  769. */
  770. static function UnWieldYanling() {
  771. $user = req()->userInfo->game; # user引用
  772. list($itemtype, $yanling_uid, $herouid) = req()->paras; # 提取参数: 装备类型, 装备的UID, 拥有该装备的英雄的UID
  773. $collectHeros = $user->heros->collectHeros;
  774. my_Assert(null != $collectHeros, ErrCode::err_innerfault); # 防御
  775. my_Assert(CommUtil::isPropertyExists($collectHeros, $herouid), ErrCode::hero_no); # 检测是否存在拥有该装备的英雄
  776. my_Assert(CommUtil::isPropertyExists($user->store->yanling, $yanling_uid), ErrCode::store_itemno_err); # 检测是否存在该装备
  777. if ($user->store->yanling->$yanling_uid->herouid == $herouid) { # 取装备对象
  778. $user->store->yanling->$yanling_uid->herouid = 0; # 清理反向引用
  779. }
  780. // $arr = $collectHeros->$herouid->yanling;
  781. // my_Assert(in_array($yanling_uid, $arr), ErrCode::hero_yanling_notfound); # 未装备此言灵
  782. // StlUtil::arrayRemove($arr, $yanling_uid);
  783. // $collectHeros->$herouid->yanling = $arr;
  784. my_Assert($collectHeros->$herouid->yanling->$itemtype->itemuid == $yanling_uid, ErrCode::store_noequip_err); # 防御
  785. $collectHeros->$herouid->yanling->$itemtype->itemuid = 0; # 卸下
  786. UserProc::updateUserInfo(); # 回写数据
  787. $resp = Resp::ok(array('resp' => "succeed!")); // 返回
  788. // StoreProc::CheckItemNum($req);
  789. return $resp;
  790. }
  791. /**
  792. * [6410] 给英雄穿装备
  793. */
  794. static function WearEquipToHero() {
  795. list($itemtype, $equipuid, $herouid) = req()->paras; # 提取参数: 装备类型, 装备的UID, 英雄的UID
  796. $user = req()->userInfo->game; # user引用
  797. my_Assert(CommUtil::isPropertyExists($user->store->equipment, $equipuid), ErrCode::store_itemno_err); # 检测是否存在该装备
  798. $equipVo = new Ins_Weapon($user->store->equipment->$equipuid); # 取装备对象
  799. if ($equipVo->herouid > 0) { # 检测该装备是否装备到其他英雄身上
  800. my_Assert($equipVo->herouid == $herouid, ErrCode::store_equipWeared_err);
  801. $user->store->equipment->$equipuid->herouid = 0; # 清理原来已经装备的言灵的反指向
  802. }
  803. $collectHeros = $user->heros->collectHeros;
  804. my_default_Obj($collectHeros);
  805. my_Assert(CommUtil::isPropertyExists($collectHeros, $herouid), ErrCode::hero_no); # 检查是否存在需要装备的英雄
  806. $hero = new Ins_UserHero($collectHeros->$herouid); # 取hero
  807. my_Assert($hero->level >= $equipVo->mo()->require_herolvl, "请升级唤灵师."); # 检查武器要求的唤灵师等级, -gwang 2021.4.20
  808. $user->store->equipment->$equipuid->herouid = $herouid; # 装备上添加反向引用, 避免查询时的循环
  809. $oldEquipId = 0;
  810. switch ($itemtype) { # 添加或替换英雄该部位的装备
  811. case 1: # 武器
  812. $oldEquipId = $collectHeros->$herouid->equip->weapon->itemuid;
  813. $collectHeros->$herouid->equip->weapon->itemuid = $equipuid;
  814. break;
  815. case 2: # 防具
  816. $oldEquipId = $collectHeros->$herouid->equip->armor->itemuid;
  817. $collectHeros->$herouid->equip->armor->itemuid = $equipuid;
  818. break;
  819. case 3: # 饰品
  820. $oldEquipId = $collectHeros->$herouid->equip->ring->itemuid;
  821. $collectHeros->$herouid->equip->ring->itemuid = $equipuid;
  822. break;
  823. default :
  824. Err(ErrCode::store_equip_type);
  825. break;
  826. }
  827. if ($oldEquipId > 0 && $oldEquipId != $equipuid) {
  828. $user->store->equipment->$oldEquipId->herouid = 0;
  829. }
  830. UserProc::updateUserInfo(); // 5.回写数据
  831. // StoreProc::CheckItemNum($req);
  832. TaskProc::OnHeroWearWeapon($collectHeros->$herouid->typeId, $user->store->equipment->$equipuid->typeId);
  833. HeroProc::CalcUserFightPower(req()->zoneid, req()->uid, $user); # 更新总战力榜
  834. return Resp::ok(array('resp' => "succeed!",
  835. 'store' => $user->store)); // 返回
  836. }
  837. /**
  838. * [6411] 给英雄脱装备
  839. * @deprecated since version 不能卸下装备, 只能更换.
  840. */
  841. static function UnWieldEquip() {
  842. list($itemtype, $equipuid, $herouid) = req()->paras; # 提取参数: 装备类型, 装备的UID, 拥有该装备的英雄的UID
  843. $user = req()->userInfo->game; # user引用
  844. $collectHeros = $user->heros->collectHeros;
  845. my_default_Obj($collectHeros);
  846. my_Assert(CommUtil::isPropertyExists($collectHeros, $herouid), ErrCode::hero_no); # 检测是否存在拥有该装备的英雄
  847. my_Assert(CommUtil::isPropertyExists($user->store->equipment, $equipuid), ErrCode::store_itemno_err); # 检测是否存在该装备
  848. if ($user->store->equipment->$equipuid->herouid == $herouid) { # 取装备对象
  849. $user->store->equipment->$equipuid->herouid = 0;
  850. }
  851. switch ($itemtype) { # 检测该装备是否装备在该英雄身上
  852. case 1: # 武器
  853. if ($collectHeros->$herouid->equip->weapon->itemuid != $equipuid) {
  854. Err(ErrCode::store_noequip_err);
  855. }
  856. $collectHeros->$herouid->equip->weapon->itemuid = 0; # 卸下
  857. break;
  858. case 2: # 防具
  859. if ($collectHeros->$herouid->equip->armor->itemuid != $equipuid) {
  860. Err(ErrCode::store_noequip_err);
  861. }
  862. $collectHeros->$herouid->equip->armor->itemuid = 0;
  863. break;
  864. case 3: # 饰品
  865. if ($collectHeros->$herouid->equip->ring->itemuid != $equipuid) {
  866. Err(ErrCode::store_noequip_err);
  867. }
  868. $collectHeros->$herouid->equip->ring->itemuid = 0;
  869. break;
  870. default :
  871. Err(ErrCode::store_equip_type);
  872. }
  873. UserProc::updateUserInfo(); # 回写数据
  874. return Resp::ok(array('resp' => "succeed!")); // 返回
  875. }
  876. // </editor-fold>
  877. //
  878. // <editor-fold defaultstate="collapsed" desc=" 辅助方法 ">
  879. //
  880. /**
  881. * 检查背包中物品的个数
  882. * @return int
  883. */
  884. public static function CheckItemNum() {
  885. $ItemObj = req()->userInfo->game->store->items;
  886. $EquipObj = req()->userInfo->game->store->equipment;
  887. $SegementObj = req()->userInfo->game->store->segement;
  888. $HeroObj = req()->userInfo->game->heros->collectHeros;
  889. $ItemNum = 0;
  890. if ($ItemObj) {
  891. foreach ($ItemObj as $value) { ////检查宝石类可叠加物品的格子占用
  892. $ItemNum++;
  893. }
  894. }
  895. if ($SegementObj) {
  896. foreach ($SegementObj as $value) { # 碎片
  897. $ItemNum++;
  898. }
  899. }
  900. if ($EquipObj) {
  901. foreach ($EquipObj as $value) { // 检测装备类物品格子占用
  902. $ItemNum++;
  903. }
  904. }
  905. if ($HeroObj) {
  906. foreach ($HeroObj as $value) { // 检测英雄装备到身上的情况,装备到英雄身上不占格子,要减去.
  907. $HeroEquipId = $value->equip->weapon->itemuid;
  908. if ($HeroEquipId > 0) {
  909. $ItemNum--;
  910. }
  911. $HeroEquipId = $value->equip->armor->itemuid;
  912. if ($HeroEquipId > 0) {
  913. $ItemNum--;
  914. }
  915. $HeroEquipId = $value->equip->ring->itemuid;
  916. if ($HeroEquipId > 0) {
  917. $ItemNum--;
  918. }
  919. }
  920. }
  921. req()->userInfo->game->privateState->ItemNum = $ItemNum;
  922. return $ItemNum;
  923. }
  924. /**
  925. * 获取物品格子的上限值
  926. * @return int 上限数值
  927. */
  928. public static function GetItemMaxNum() {
  929. $user = req()->userInfo->game;
  930. if (!CommUtil::isPropertyExists($user->privateState, "maxItemNum")) {
  931. $user->privateState->maxItemNum = glc()->Item_Packet_MaxNum;
  932. }
  933. return $user->privateState->maxItemNum;
  934. }
  935. /**
  936. * 6412 背包扩容
  937. */
  938. public static function AddPacketNum() {
  939. $user = req()->userInfo->game; # user引用
  940. if (!CommUtil::isPropertyExists($user->privateState, "maxItemNum")) {
  941. $user->privateState->maxItemNum = glc()->Item_Packet_MaxNum;
  942. }
  943. $costCash = glc()->Item_Packet_NumCostCash; # 钻石花费
  944. my_Assert($costCash > 0, ErrCode::paras_err);
  945. my_Assert($user->base()->Consume_Cash($costCash), ErrCode::notenough_cash_msg); # 6.进行消耗
  946. $user->privateState->maxItemNum += 10; # 扩容
  947. UserProc::updateUserInfo(); # 保存玩家数据
  948. $resp = Resp::ok(array('maxItemNum' => $user->privateState->maxItemNum)); # 返回值
  949. StoreProc::CheckItemNum();
  950. return $resp;
  951. }
  952. // </editor-fold>
  953. //
  954. // <editor-fold defaultstate="collapsed" desc=" 出售 ">
  955. //
  956. /**
  957. * 出售单一的物品
  958. */
  959. static function sellItem() {
  960. Err(ErrCode::err_method_obsoleted, "代码需要更新");
  961. }
  962. /**
  963. * 卖出一堆物品时候,检测每个单个物品是否符合卖的条件
  964. */
  965. static function preSellSingleFromStore($type, $itemId, $count, $uid) {
  966. Err(ErrCode::err_method_obsoleted, "代码需要更新");
  967. }
  968. /**
  969. * 6403 从背包出售多个物品
  970. */
  971. static function sellMultiItemFromStore() {
  972. Err(ErrCode::err_method_obsoleted, "代码需要更新");
  973. $obj = req()->paras[0]; // 获取物品的结构数组
  974. foreach ($obj as $value) {
  975. $type = $value[0];
  976. $itemId = $value[1];
  977. if ($type > 3) {
  978. $count = intval($value[2]); // 数量
  979. $uid = 0;
  980. } else { ////先判断一下物品类型,如果是可叠加的,就按数量取值,如果是不可叠加的就按uid取值
  981. $count = 1;
  982. $uid = $value[2];
  983. }//物品的uid
  984. $resp = StoreProc:: preSellSingleFromStore($type, $itemId, $count, $uid);
  985. }
  986. if (0 == $resp->err) {
  987. UserProc::updateUserInfo();
  988. }
  989. StoreProc::CheckItemNum();
  990. return $resp;
  991. }
  992. // </editor-fold>
  993. //
  994. }