StoreProc.php 60 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638
  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_UnWield: # 6411 将该装备从指定英雄上脱下
  38. return StoreProc::UnWieldEquip($req);
  39. //
  40. case CmdCode::cmd_store_AddMaxPacketNum: # 6412 扩展包裹格子数量
  41. return StoreProc::AddPacketNum($req);
  42. case CmdCode::cmd_store_MeltEquip: # 6413 装备融合
  43. return StoreProc::MeltEquip($req);
  44. case CmdCode::cmd_store_PiecesCompose: # 6415 碎片合成
  45. return StoreProc::composePieces($req);
  46. case CmdCode::cmd_store_Testcmd: # 6407 测试方法
  47. return StoreProc::Test($req);
  48. default:
  49. Err(ErrCode::cmd_err);
  50. }
  51. }
  52. /**
  53. * 测试方法
  54. * @param Req $req
  55. * @return type
  56. */
  57. static public function Test($req) {
  58. return StoreProc::MeltEquip($req);
  59. }
  60. /**
  61. * [6404] 使用仓库道具
  62. * @param Req $req
  63. */
  64. static function useItem($req) {
  65. // return ResponseVo::ErrResponse($req, ErrCode::msg_method_obsoleted);
  66. $itemId = $req->paras[0]; # 道具id
  67. $num = 1; # 数量, 可选参数, 默认为1
  68. if (count($req->paras) > 1) { # 如果传了,
  69. $num = $req->paras[1]; # 提取可选参数: 道具数量
  70. } # end 提取参数
  71. $typeId = substr($itemId, 0, 3); # 道具分类前缀
  72. switch ($typeId) { # 使用道具()
  73. case '701': # 宝箱
  74. $resp = Boxes::OpenBox($req); # 调用开宝箱功能
  75. break;
  76. default : # 其他
  77. Err(ErrCode::store_itemcantuse);
  78. break;
  79. }
  80. return $resp;
  81. }
  82. /**
  83. * [6405] 刷新仓库列表
  84. * @param Req $req
  85. */
  86. static function refreshStore($req) {
  87. StoreProc::CheckItemNum($req);
  88. $result = array(
  89. 'store' => $req->userInfo->game->store
  90. );
  91. return Resp::ok($result);
  92. }
  93. //
  94. // <editor-fold defaultstate="collapsed" desc=" 物品升级 ">
  95. /**
  96. * [6408] 物品的升级
  97. * @param Req $req
  98. * @return type
  99. */
  100. static function ItemUpgrade($req) {
  101. $mem = $req->mem;
  102. $uid = $req->paras[0]; //获取物品uid
  103. $money = $req->paras[1]; //需要的手工费
  104. $resp = new Resp();
  105. $user = $req->userInfo->game; # user引用
  106. $ary = $req->paras[3]; //获取物品的结构数组
  107. foreach ($ary as $value) {
  108. $itemId = $value[1];
  109. $uid = $value[2];
  110. if ($uid < 1) {
  111. Err(ErrCode::paras_err);
  112. }
  113. $ok = StoreProc::removeEquipFromStore($uid, $itemId, $req); # 从背包移除
  114. if (!$ok) {//1.如果背包道具移出时出错,则直接返回错误
  115. Err(ErrCode::store_removefail);
  116. }
  117. $item = GameConfig::item_getItem($itemId); //ConstProc::getItemConst($itemId);
  118. if ($item == null) { //2.检测是否存在装备的原始数据
  119. Err(ErrCode::err_const_no);
  120. }
  121. $ret = array('resp' => "succeed!");
  122. $resp = Resp::ok($ret); //返回必须是object
  123. }
  124. $bDeal = UserGameModel::Consume_Gold($user, $money);
  125. if ($bDeal) {
  126. ActiveProc::ChangeTaskCount($req);
  127. $result = array(
  128. 'store' => $req->userInfo->game->store,
  129. 'resp' => "succeed!"
  130. );
  131. $resp = Resp::ok($result);
  132. } else {
  133. Err(ErrCode::notenough_gold_msg);
  134. }
  135. if (0 == $resp->err) {
  136. StoreProc:: UpdateItem($req);
  137. $result = array(
  138. 'store' => $req->userInfo->game->store,
  139. 'resp' => "succeed!"
  140. );
  141. $resp = Resp::ok($result);
  142. }
  143. StoreProc::CheckItemNum($req);
  144. return $resp;
  145. }
  146. /**
  147. * 更新单个物品属性
  148. * @param Req $req
  149. */
  150. private static function UpdateItem($req) {
  151. $store = $req->userInfo->game->store;
  152. $uid = $req->paras[0]; //获取物品uid
  153. $obj = $req->paras[2]; //获取物品的结构数组
  154. $itemLevel = 0;
  155. $bUplevel = false;
  156. foreach ($obj as $key => $value) {
  157. if ($key === "level") {
  158. if (CommUtil::isPropertyExists($store->equipment->$uid, $key)) {
  159. if ($store->equipment->$uid->$key < $value) {
  160. $bUplevel = true;
  161. $itemLevel = $value;
  162. }
  163. } else {
  164. if ($value > 1) {
  165. $bUplevel = true;
  166. $itemLevel = $value;
  167. }
  168. }
  169. }
  170. if ($bUplevel) {
  171. $item = GameConfig::item_getItem($store->equipment->$uid->typeId);
  172. if ($item == null) { //2.检测是否存在装备的原始数据
  173. Err(ErrCode::err_const_no);
  174. }
  175. // 推送系统消息
  176. SystemProc::insertWeapon_promoteUp($req->zoneid, $req->uid, $req->userInfo->game->name, $item->name, $itemLevel);
  177. }
  178. $store->equipment->$uid->$key = $value;
  179. }
  180. UserProc::updateUserInfo($req);
  181. $ret = array('resp' => "succeed!");
  182. $resp = Resp::ok($ret); //返回必须是object
  183. return $resp;
  184. }
  185. /**
  186. * [6413] 装备熔炼
  187. * @param Req $req
  188. * @return type
  189. */
  190. static function MeltEquip($req) {
  191. ////1获取参数
  192. $uid = $req->paras[0]; //获取物品uid
  193. if ($uid < 1) {
  194. Err(ErrCode::paras_err);
  195. }
  196. $resp = new Resp();
  197. $user = $req->userInfo->game; # user引用
  198. ///2检测装备是否在英雄身上
  199. $HeroObj = $req->userInfo->game->heros->collectHeros;
  200. ////检测英雄装备到身上的情况,装备到英雄身上要减去.
  201. if ($HeroObj) {
  202. foreach ($HeroObj as $value) {
  203. // echo var_dump($HeroObj);
  204. $HeroEquipId = $value->equip->weapon->itemuid;
  205. if ($HeroEquipId == $uid) {
  206. echoLine("该物品已经装备到英雄身上无法熔炼");
  207. Err(ErrCode::store_equipWeared_err);
  208. }
  209. $HeroEquipId = $value->equip->armor->itemuid;
  210. if ($HeroEquipId == $uid) {
  211. echoLine("该物品已经装备到英雄身上无法熔炼");
  212. Err(ErrCode::store_equipWeared_err);
  213. }
  214. $HeroEquipId = $value->equip->ring->itemuid;
  215. if ($HeroEquipId == $uid) {
  216. echoLine("该物品已经装备到英雄身上无法熔炼");
  217. Err(ErrCode::store_equipWeared_err);
  218. }
  219. }
  220. }
  221. ///3检查装备熔炼等级,是否打到熔炼上限,如果达到上限,报错.然后查看相应等级需要的七宗罪元素数量是否足够,金币是否足够.
  222. $itemId = $user->store->equipment->$uid->typeId;
  223. $item = GameConfig::item_getItem($itemId);
  224. if ($item == null) { ////检测是否存在装备的原始数据
  225. Err(ErrCode::err_const_no);
  226. }
  227. // echoLine($item->baoji);
  228. if ($user->store->equipment->$uid->melt_level > $item->melt_level) {
  229. $meltLevel = $user->store->equipment->$uid->melt_level;
  230. } else {
  231. $meltLevel = $item->melt_level;
  232. }
  233. $meltLevel++;
  234. var_dump($meltLevel);
  235. // var_dump(GameConfig::smelting());
  236. $melt = GameConfig::smelting_getItem($meltLevel);
  237. // var_dump($melt);
  238. if ($melt == null) { ////在装备熔炼等级表里找不到该等级的熔炼规则
  239. Err(ErrCode::err_const_no);
  240. }
  241. $gold = $melt->spendgold; ////当前熔炼等级需要的金币数
  242. $costElement = $melt->costamoun; ////当前熔炼等级消耗的熔炼元素数
  243. $successRate = $melt->successrate; ////当前熔炼等级的成功率
  244. ////消耗金币和元素
  245. $ok = StoreProc::RemoveElementFromStore($req, $costElement);
  246. if (!$ok) {//1.如果背包道具移出时出错,则直接返回错误
  247. Err(ErrCode::store_removefail);
  248. }
  249. $bDeal = UserGameModel::Consume_Gold($user, $gold);
  250. if ($bDeal) {
  251. $result = array(
  252. 'resp' => "succeed!"
  253. );
  254. $resp = Resp::ok($result);
  255. } else {
  256. Err(ErrCode::notenough_gold_msg);
  257. }
  258. ///4按熔炼等级来确定当前操作的成功率,投骰子决定是否成功,失败的话,装备不变且不返还金币和元素。成功的话,消耗金币和元素,装备升级(按数据表要求增加属性)
  259. # 投骰子
  260. if (0 == $resp->err) {
  261. $rnd = CommUtil::random(0, 99);
  262. echoLine($rnd);
  263. if ($successRate > $rnd) {
  264. StoreProc:: UpgradeMeltEquip($req);
  265. $result = array(
  266. 'store' => $req->userInfo->game->store,
  267. 'resp' => "succeed!"
  268. );
  269. } else {
  270. $result = array(
  271. 'element' => $req->userInfo->game->store->element,
  272. 'resp' => "Failed!"
  273. );
  274. }
  275. $resp = Resp::ok($result);
  276. }
  277. UserProc::updateUserInfo($req);
  278. return $resp;
  279. }
  280. static function UpgradeMeltEquip($req) {
  281. $store = $req->userInfo->game->store;
  282. $uid = $req->paras[0]; //获取物品uid
  283. // echo var_export($uid);
  284. $itemId = $store->equipment->$uid->typeId;
  285. $item = GameConfig::item_getItem($itemId);
  286. if ($store->equipment->$uid->melt_level > $item->melt_level) {
  287. $meltLevel = $store->equipment->$uid->melt_level;
  288. } else {
  289. $meltLevel = $item->melt_level;
  290. }
  291. $meltLevel++;
  292. $melt = GameConfig::smelting_getItem($meltLevel);
  293. // var_dump($melt);
  294. if ($melt == null) { ////在装备熔炼等级表里找不到该等级的熔炼规则
  295. Err(ErrCode::err_const_no);
  296. }
  297. $attrib = $melt->attribute; ////当前熔炼等级成功后属性加成
  298. foreach ($item as $key => $value) {
  299. if ($key === "melt_level") {
  300. $store->equipment->$uid->$key = $meltLevel;
  301. }
  302. if ($key === "gongji") {
  303. if ($store->equipment->$uid->$key > $value) {
  304. $store->equipment->$uid->$key = (int) ($store->equipment->$uid->$key * $attrib);
  305. } else {
  306. $store->equipment->$uid->$key = (int) ($value * $attrib);
  307. }
  308. }
  309. if ($key === "fangyu") {
  310. if ($store->equipment->$uid->$key > $value) {
  311. $store->equipment->$uid->$key = (int) ($store->equipment->$uid->$key * $attrib);
  312. } else {
  313. $store->equipment->$uid->$key = (int) ($value * $attrib);
  314. }
  315. }
  316. if ($key === "hp") {
  317. if ($store->equipment->$uid->$key > $value) {
  318. $store->equipment->$uid->$key = (int) ($store->equipment->$uid->$key * $attrib);
  319. } else {
  320. $store->equipment->$uid->$key = (int) ($value * $attrib);
  321. }
  322. }
  323. if ($key === "minjie") {
  324. if ($store->equipment->$uid->$key > $value) {
  325. $store->equipment->$uid->$key = (int) ($store->equipment->$uid->$key * $attrib);
  326. } else {
  327. $store->equipment->$uid->$key = (int) ($value * $attrib);
  328. }
  329. }
  330. if ($key === "baoji") {
  331. if ($store->equipment->$uid->$key > $value) {
  332. $store->equipment->$uid->$key = (int) ($store->equipment->$uid->$key * $attrib);
  333. } else {
  334. $store->equipment->$uid->$key = (int) ($value * $attrib);
  335. }
  336. }
  337. }
  338. //
  339. // $EquipObj = $store->equipment->$uid;
  340. // ////检测装备的情况,装备升级时,基础属性要乘以系数. 如果之前升过级,那么它的"原始值"就不同了.
  341. // if ($EquipObj) {
  342. // foreach ($EquipObj as $key=> $value) {
  343. // if ($key === "melt_level") {
  344. // $key=$meltLevel;
  345. // }
  346. // if ($key === "melt_level") {
  347. // $key=$meltLevel;
  348. // }
  349. // }
  350. // }
  351. // echo var_export($store);
  352. $ret = array('resp' => "succeed!");
  353. $resp = Resp::ok($ret); //返回必须是object
  354. return $resp;
  355. }
  356. static function getItemProperty($req) {
  357. $store = $req->userInfo->game->store;
  358. $uid = $req->paras[0]; //获取物品uid
  359. // echo var_export($uid);
  360. $itemId = $store->equipment->$uid->typeId;
  361. $item = GameConfig::item_getItem($itemId);
  362. }
  363. /**
  364. * [6409] 合成道具
  365. * @param Req $req
  366. */
  367. static public function composeItem($req) {
  368. $resp = \Resp::err(ErrCode::err_method_notimplement);
  369. $store = $req->userInfo->game->store;
  370. // 解析客户端参数
  371. $lowitemId = $req->paras[0]; // 道具id
  372. $usenum = $req->paras[1]; // 数量
  373. $highitemId = $req->paras[2]; // 道具id
  374. $addnum = $req->paras[3]; // 数量
  375. $gold = $req->paras[4]; // 需要的手续费
  376. echo var_export($gold);
  377. $user = $req->userInfo->game; # user引用
  378. if ($usenum < 3) {
  379. Err(ErrCode::paras_err, "数量非法!");
  380. }
  381. //1.从仓库里移除这个道具
  382. $ok = StoreProc::removeItemFromStore($store, $lowitemId, $usenum); // 支持移除指定数量
  383. //如果仓库道具移出时出错,则直接返回错误
  384. if ($ok != ErrCode::ok) {
  385. Err($ok);
  386. }
  387. $bDeal = UserGameModel::Consume_Gold($user, $gold);
  388. if ($bDeal) {
  389. ActiveProc::ChangeTaskCount($req);
  390. $store->items->$highitemId += $addnum;
  391. UserProc::updateUserInfo($req);
  392. # 准备返回值
  393. $ret = array('resp' => "succeed!");
  394. $resp = Resp::ok($ret); //返回必须是object
  395. } else {
  396. Err(ErrCode::notenough_gold_msg);
  397. }
  398. StoreProc::CheckItemNum($req);
  399. return $resp;
  400. }
  401. /**
  402. * [6409] 合成碎片(几个碎片合成获得同品质或者更高品质的新碎片)
  403. * @param Req $req
  404. */
  405. static public function composePieces($req) {
  406. $resp = Resp::err(ErrCode::err_method_notimplement);
  407. $store = $req->userInfo->game->store;
  408. // 解析客户端参数
  409. $piecesid1 = $req->paras[0]; // 碎片id1
  410. $piecesid2 = $req->paras[1]; // 碎片id2
  411. $piecesid3 = $req->paras[2]; // 碎片id3
  412. $user = $req->userInfo->game; # user引用
  413. $pieceslist = array($piecesid1, $piecesid2, $piecesid3);
  414. //1.从仓库里移除这个道具
  415. for ($i = 0; $i < count($pieceslist); $i++) {
  416. $ok = StoreProc::removeItemFromStore($store, $pieceslist[$i], 1); // 支持移除指定数量
  417. if ($ok != ErrCode::ok) {
  418. break;
  419. }
  420. }
  421. //如果仓库道具移出时出错,则直接返回错误
  422. if ($ok != ErrCode::ok) {
  423. Err($ok);
  424. }
  425. $gold = glc()->Compose_Pieces_Gold; ////临时用这个来算,等刷过数据再说
  426. echoLine($gold);
  427. $bDeal = UserGameModel::Consume_Gold($user, $gold);
  428. if ($bDeal) {
  429. ActiveProc::ChangeTaskCount($req);
  430. $reward = StoreProc::composePiecesProbability($req);
  431. StoreProc::addSegmentIntoStore($store, $reward);
  432. UserProc::updateUserInfo($req);
  433. # 准备返回值
  434. $result = array(
  435. 'reward' => $reward,
  436. 'store' => $req->userInfo->game->store,
  437. 'resp' => "succeed!"
  438. );
  439. $resp = Resp::ok($result);
  440. } else {
  441. Err(ErrCode::notenough_gold_msg);
  442. }
  443. StoreProc::CheckItemNum($req);
  444. return $resp;
  445. }
  446. ////合成碎片时的概率
  447. static public function composePiecesProbability($req) {
  448. $piecesid1 = $req->paras[0]; // 碎片id1
  449. $piecesid2 = $req->paras[1]; // 碎片id2
  450. $piecesid3 = $req->paras[2]; // 碎片id3
  451. $pieceslist = array($piecesid1, $piecesid2, $piecesid3);
  452. ///权重和值
  453. $weight = 0;
  454. for ($i = 0; $i < count($pieceslist); $i++) {
  455. $segmentid = $pieceslist[$i];
  456. $segItem = GameConfig::segment_getItem($segmentid); /////获取该碎片的信息
  457. $WeightItem = GameConfig::segment_ronghe_getItem($segItem->quailty); ///通过品质来获取权重
  458. $weight += $WeightItem->weight;
  459. }
  460. $reward = StoreProc::GetRewarByWeight($weight);
  461. //////根据最终三个碎片的权重值和来判断该品质的获取概率。
  462. ////用类似 3,80;5,60;10,20; 来表示 (在权重和达到3时获取率是80%,在权重和达到5时获取率是60%,在权重和达到10时获取率是10%)
  463. //
  464. // ////为了数值设置表和填数据方便,将两个表合成为一个表
  465. //
  466. ////数值设置起来方便,但是用起来稍微麻烦一些,需要取出数据表里的所有碎片的值。
  467. return $reward;
  468. }
  469. static public function GetRewarByWeight($weight) {
  470. for ($i = 0; $i < 5; $i++) {
  471. $item = GameConfig::segment_ronghe_getItem($i + 1);
  472. // $RewardList[]=$item;
  473. $ary = explode(";", $item->probability);
  474. foreach ($ary as $value) {
  475. $val = explode(",", $value);
  476. $weig = $val[0]; //达到的权重值
  477. $prob = $val[1]; //该权重下的获取概率
  478. if ($weight >= $weig) {
  479. $probList[$i] = $prob;
  480. }
  481. }
  482. }
  483. $rnd = CommUtil::random(1, 10000);
  484. $start = 0;
  485. $rew = 0;
  486. for ($i = 0; $i < 5; $i++) {
  487. if ($start < $rnd && $rnd <= $start + $probList[$i]) { # 落入区间
  488. $rew = $i + 1; # 记录物品
  489. break;
  490. }
  491. $start += $probList[$i]; # 继续判断是否落入下一物品的区间
  492. }
  493. // $piecesDataBaseList= GameConfig::segment();////获取所有的碎片数据表
  494. $tmpPiecesList = GameConfig::segment_byPinzhi_getItem($rew, 1);
  495. // foreach ($piecesDataBaseList as $typeId => $value)
  496. // {
  497. // // $value->
  498. // // echo var_dump($value);
  499. // if ($value->itemType==1) ////是英雄碎片
  500. // {
  501. // if( $value->quailty==$rew) ///碎片品质是指定品质
  502. // {
  503. // $tmpPiecesList[]=$typeId; ///保存到一个临时表里。
  504. // }
  505. // }
  506. // }
  507. $tmprnd = CommUtil::random(0, count($tmpPiecesList) - 1);
  508. return $tmpPiecesList[$tmprnd]->typeId;
  509. }
  510. // </editor-fold>
  511. // --------------- 以下为辅助方法 ------------------
  512. //
  513. // <editor-fold defaultstate="collapsed" desc=" 移除物品 ">
  514. /**
  515. * 从仓库中移除指定数量的物品
  516. * @param UserGameModel $user
  517. * @param type $itemId
  518. * @param type $itemcount
  519. * @return type
  520. */
  521. static function removeItemFromStore($store, $itemId, $itemcount) {
  522. $typeId = substr($itemId, 0, 3);
  523. switch ($typeId) {
  524. case '307': #经验书
  525. case '305': #扫荡券
  526. case '304': # 宝石
  527. if (CommUtil::isPropertyExists($store->items, $itemId)) { //
  528. if ($store->items->$itemId >= $itemcount) { // 数量足够
  529. $store->items->$itemId -= $itemcount;
  530. if ($store->items->$itemId == 0) {
  531. unset($store->items->$itemId);
  532. }
  533. return ErrCode::ok;
  534. } else {
  535. return ErrCode::store_itemnotenough; // 道具数量不足
  536. }
  537. } else {
  538. return ErrCode::store_itemno_err;
  539. }
  540. break;
  541. case '310': # 碎片
  542. case '311': # 碎片
  543. case '312': # 碎片
  544. case '313': #装备 碎片
  545. case '314': #装备 碎片
  546. case '315': #装备 碎片
  547. if (CommUtil::isPropertyExists($store->segement, $itemId)) { //
  548. if ($store->segement->$itemId >= $itemcount) { // 数量足够
  549. $store->segement->$itemId -= $itemcount;
  550. if ($store->segement->$itemId == 0) {
  551. unset($store->segement->$itemId);
  552. }
  553. return ErrCode::ok;
  554. } else {
  555. return ErrCode::store_itemnotenough; // 道具数量不足
  556. }
  557. } else {
  558. return ErrCode::store_itemno_err;
  559. }
  560. break;
  561. default : # 其他
  562. Err(ErrCode::store_itemcantuse);
  563. break;
  564. }
  565. }
  566. /**
  567. * 从仓库移出
  568. * @param type $itemId
  569. * @param StoreModel $store
  570. * @return boolean
  571. */
  572. static function removeFromStore($itemId, &$store) {
  573. //return ErrCode::succeed;
  574. $typid = substr("$itemId", 0, 3); # 取道具分类
  575. $ok = false;
  576. switch ($typid) {
  577. case "101": # 英雄 错误了的路径
  578. break;
  579. case '102': # 英雄碎片
  580. if (CommUtil::isPropertyExists($store->segement, "$itemId") && $store->segement->$itemId > 0) {
  581. $store->segement->$itemId -= 1;
  582. $ok = true;
  583. }
  584. break;
  585. case "203": # 宝箱
  586. if (CommUtil::isPropertyExists($store->boxes, "$itemId") && $store->boxes->$itemId > 0) {
  587. $store->boxes->$itemId -= 1;
  588. $ok = true;
  589. }
  590. break;
  591. default:
  592. break;
  593. }
  594. return $ok;
  595. }
  596. /**
  597. * 从仓库移出装备
  598. * @param type $itemId uid
  599. * @param StoreModel $store
  600. * @return boolean
  601. */
  602. static function removeEquipFromStore($uid, $typeId, &$req) {
  603. $ok = false;
  604. echo var_export($uid);
  605. if (CommUtil::isPropertyExists($req->userInfo->game->store->equipment, $uid)) {
  606. // $con= ConstProc::getItemConst($req->mem, $req->userInfo->game->store->equipment->$uid->typeId);
  607. echo var_export($req->userInfo->game->store->equipment->$uid->typeId);
  608. if ($typeId == $req->userInfo->game->store->equipment->$uid->typeId) {
  609. echo "typeid相同";
  610. unset($req->userInfo->game->store->equipment->$uid);
  611. $ok = true;
  612. } else {
  613. echo "typeid检验错误";
  614. }
  615. }
  616. return $ok;
  617. }
  618. /**
  619. * 从仓库移除碎片
  620. * @param StoreModel $store
  621. * @param int $segmentId
  622. * @param int $num
  623. * @return bool 成功/失败
  624. */
  625. static function removeSegmetFromStore($store, $segmentId, $num = 1) {
  626. if (CommUtil::isPropertyExists($store->segement, $segmentId) #
  627. && $store->segement->$segmentId >= $num) {
  628. $store->segement->$segmentId -= $num;
  629. return TRUE;
  630. }
  631. return false;
  632. }
  633. /**
  634. * 向仓库添加碎片
  635. * @param StoreModel $store
  636. * @param int $segmentId
  637. * @param int $num
  638. */
  639. static function addSegmentIntoStore($store, $segmentId, $num = 1) {
  640. if (CommUtil::isPropertyExists($store->segement, $segmentId)) {
  641. $store->segement->$segmentId += $num;
  642. } else {
  643. $store->segement->$segmentId = $num;
  644. }
  645. }
  646. /**
  647. * 计算玩家仓库中某种符石/道具的数量
  648. * @param type $map
  649. * @param type $stoneid
  650. * @return type
  651. */
  652. static function GetStoneCount($map, $stoneid) {
  653. $ret = 0;
  654. if ($map->store->stones && CommUtil::isPropertyExists($map->store->stones, $stoneid)) {
  655. $ret = $map->store->stones->
  656. $stoneid;
  657. }
  658. return $ret;
  659. }
  660. /**
  661. * 从仓库移除符石(道具)
  662. * @param MapModel $map
  663. * @param int $stoneid
  664. * @param int $num
  665. */
  666. static function RemoveStoneFromStore(&$map, $stoneid, $num = 1) {
  667. if ($num <= 0) {
  668. return $num;
  669. }
  670. $ret = 0;
  671. if ($map->store->stones && CommUtil::isPropertyExists($map->store->stones, $stoneid)) {
  672. $left = $map->store->stones->$stoneid - $num;
  673. if ($ret >= 0) {////这里有bug吗?应该是用$left啊,不过无所谓,反正这个函数暂时用不上,不考虑了.
  674. $map->store->stones->$stoneid -= $num;
  675. $ret = $num;
  676. }
  677. }
  678. return $ret;
  679. }
  680. /**
  681. * 从仓库移除七宗罪炼金元素(道具)
  682. * @param $req
  683. * @param int $elementid
  684. * @param int $num
  685. */
  686. static function RemoveElementFromStore(&$req, $num) {
  687. if ($num < 0) {
  688. return FALSE;
  689. }
  690. echoLine("元素数量");
  691. $ok = StoreProc::CheckElementNum($req, $num);
  692. if (!$ok) {
  693. echoLine("元素数量不足");
  694. } else {
  695. $ElementObj = $req->userInfo->game->store->element;
  696. if ($ElementObj) {
  697. foreach ($ElementObj as $key => $value) {
  698. // echo var_dump($HeroObj);
  699. if ($value >= $num) {
  700. $req->userInfo->game->store->element->$key -= $num;
  701. } else {
  702. return FALSE;
  703. }
  704. }
  705. return true;
  706. }
  707. }
  708. return FALSE;
  709. }
  710. /**
  711. * 检测身上的熔炼元素是否够数量
  712. * @param type $req
  713. * @param type $num
  714. */
  715. static function CheckElementNum($req, $num) {
  716. if (!CommUtil::isPropertyExists($req->userInfo->game->store, "element")) {
  717. echoLine("没有element节点,开始创建");
  718. // $req->userInfo->game->store->element= ObjectInit();
  719. $req->userInfo->game->store->element = array('388001' => 0, '388002' => 0, '388003' => 0, '388004' => 0, '388005' => 0, '388006' => 0, '388007' => 0);
  720. UserProc::updateUserInfo($req);
  721. }
  722. $ElementObj = $req->userInfo->game->store->element;
  723. ////检测英雄装备到身上的情况,装备到英雄身上要减去.
  724. if ($ElementObj) {
  725. foreach ($ElementObj as $value) {
  726. // echo var_dump($HeroObj);
  727. if ($value < $num) {
  728. return FALSE;
  729. }
  730. }
  731. return true;
  732. }
  733. return FALSE;
  734. }
  735. // </editor-fold>
  736. //
  737. // <editor-fold defaultstate="collapsed" desc=" 放入物品 ">
  738. /**
  739. * 将其他物品放入仓库
  740. * @param type $itemId
  741. * @param UserGameModel $game
  742. */
  743. static function PutItemInStore($itemId, &$game) {
  744. if (CommUtil::isPropertyExists($game->store->items, $itemId)) {// 如果仓库中已经有这种元素,则其数目+1
  745. $game->store->items->$itemId += 1;
  746. } else {// 如果仓库中没有这种元素,则其数目置1
  747. $game->store->items->$itemId = 1;
  748. }
  749. }
  750. /**
  751. * 检测是否允许放入仓库
  752. * @param BuildModel $build
  753. * @return type
  754. */
  755. static function canPutInStore($build) {
  756. if ($build->categoryId == INIT_HABITID) {
  757. return ErrCode::ok;
  758. }
  759. return ErrCode::store_putinto;
  760. }
  761. /**
  762. * 解包多种物品到玩家身上 【警告】此函数的异常处理功能残废,不安全
  763. * 检测如果当前物品格子大于物品总数,则可以获取战利品,否则不可以
  764. * @param Req $req
  765. * @param string $goodsStr itemid,num;itemid,num;...
  766. * @param int $src 1:战斗奖励, 2: 任务奖励, 3: 抽奖奖品, 4: 邮件领取, 5: 现金充值
  767. * @deprecated since version 0
  768. * @return type
  769. */
  770. public static function AddMultiItemInStore($req, $goodsStr, $src = 1) {
  771. $user = $req->userInfo->game;
  772. $ary = explode(";", $goodsStr);
  773. foreach ($ary as $value) {
  774. $val = explode(",", $value);
  775. $itemId = $val[0];
  776. $num = $val[1]; //数量
  777. $str1 = substr($itemId, 0, 3); # prefix
  778. switch ($str1) {
  779. // 10x 怪物卡或者英雄卡牌获取
  780. case "101":
  781. case "202":
  782. case "201":
  783. // if (1 == $src && $user->heros->maxCollectCount <= StoreProc::CheckHeroNum($req)) {
  784. // # 战斗模块获得的英雄,超过上限丢弃
  785. // echo "英雄满了."; # 满了如何处理? 直接丢弃吗? 是的, ok. gwang 2017年4月22日 16:49:58 问过
  786. // } else {
  787. // HeroProc::AddHeroTFromStore($req, $itemId);
  788. // }
  789. break;
  790. // 30x 装备物品的获取.
  791. case "301":
  792. case "302":
  793. case "303":
  794. if (StoreProc::GetItemMaxNum($req) > StoreProc::CheckItemNum($req)) {
  795. StoreProc::PutEquipInStore($itemId, $req);
  796. }
  797. break;
  798. //宝石的获取 + 抽奖券+经验书
  799. case "304":
  800. case "305":
  801. case "307":
  802. if (StoreProc::GetItemMaxNum($req) > StoreProc::CheckItemNum($req)) {
  803. StoreProc:: PutOverlyingItemInStore($itemId, $num, $req);
  804. }
  805. break;
  806. // // 31x 碎片
  807. case "310": # 英雄碎片
  808. case "311": # 小怪碎片
  809. case "312": # boss碎片
  810. case "313": # 装备碎片
  811. case "314": # 装备碎片
  812. case "315": # 装备碎片\
  813. if (StoreProc::GetItemMaxNum($req) > StoreProc::CheckItemNum($req)) {
  814. StoreProc::addSegmentIntoStore($req->userInfo->game->store, $itemId, $num);
  815. }
  816. break;
  817. case "701": # 宝箱
  818. case "702":
  819. case "703":
  820. case "704":
  821. StoreProc::putBoxexInStore($req->userInfo->game->store, $itemId, $num);
  822. break;
  823. // 游戏内货币的获取
  824. case "399":
  825. switch ($itemId) {
  826. case META_CASH_ITEMID: # 钻石
  827. UserGameModel::Add_Cash($req->userInfo->game, $num);
  828. break;
  829. case META_GOLD_ITEMID: # 金币
  830. UserGameModel::Add_Gold($req->mem, $req->userInfo->game, $num);
  831. break;
  832. case META_tili_ITEMID: # 体力
  833. UserGameModel::Add_tili($req, $num);
  834. break;
  835. case META_FriendShipPoit_ItemId: # 友情
  836. UserGameModel::Add_FriendPoint($req->userInfo->game, $num);
  837. break;
  838. default :
  839. }
  840. break;
  841. ////熔炼元素的获取
  842. case "388":
  843. StoreProc::PutElementInStore($itemId, $num, $req);
  844. break;
  845. default:
  846. break;
  847. }
  848. }
  849. // // 更新数据库数据
  850. UserProc::updateUserInfo($req); ////这行不要注释掉,除非在邮件和任务领奖那里加入更新(在调用addmultiInstore函数的后面加入updateuserinfo的话,就可以注销到这行代码)
  851. return ErrCode::ok; // 返回
  852. }
  853. /// 物品类型,物品typeid,物品数量
  854. public static function AddItemInStore($req) {
  855. $itemType = $req->paras[0];
  856. $itemId = $req->paras[1];
  857. $num = $req->paras[2]; //数量
  858. if ($itemType < 4) {
  859. StoreProc::PutEquipInStore($itemId, $req);
  860. } else if ($itemType == 4) {
  861. StoreProc:: PutOverlyingItemInStore($itemId, $num, $req);
  862. } else if ($itemType == 10) {
  863. StoreProc:: PutOverlyingItemInStore($itemId, $num, $req); ///准备添加其他
  864. }
  865. // 更新数据库数据
  866. UserProc::updateUserInfo($req);
  867. // 返回
  868. $ret = array('resp' => "succeed!");
  869. $resp = Resp::ok($ret); //返回必须是object
  870. return $resp;
  871. }
  872. /**
  873. * 将装备放入背包
  874. * @param type $itemId
  875. * @param Req $req
  876. */
  877. static function PutEquipInStore($itemId, &$req) {
  878. $privateState = $req->userInfo->game->privateState;
  879. if (!CommUtil::isPropertyExists($privateState, "currentId")) {// 如果仓库中已经有这种元素,则其数目+1
  880. $req->userInfo->game->privateState->currentId = 1;
  881. }
  882. $cid = $req->userInfo->game->privateState->currentId++;
  883. $equip = ObjectInit();
  884. $equip->typeId = $itemId;
  885. $req->userInfo->game->store->equipment->$cid = $equip;
  886. SystemProc::GetEquip($req->zoneid, $req->userInfo->game, $itemId); # 添加获得装备的消息
  887. }
  888. /**
  889. * 将可叠加物品放入背包
  890. * @param type $itemId
  891. * @param UserGameModel $game
  892. */
  893. static function PutOverlyingItemInStore($itemId, $num, &$req) {
  894. // $game->userInfo->game;
  895. if (CommUtil::isPropertyExists($req->userInfo->game->store->items, $itemId)) {// 如果仓库中已经有这种元素,则其数目+1
  896. $req->userInfo->game->store->items->$itemId += $num;
  897. } else {// 如果仓库中没有这种元素,则其数目置1
  898. $req->userInfo->game->store->items->$itemId = $num;
  899. }
  900. }
  901. /**
  902. * 将炼金元素放入仓库
  903. * @param type $itemId
  904. *
  905. */
  906. static function PutElementInStore($elementId, $num, &$req) {
  907. // $game->userInfo->game;
  908. $g = glc();
  909. if (CommUtil::isPropertyExists($req->userInfo->game->store->element, $elementId)) {// 如果仓库中已经有这种元素,则其数目+
  910. if ($req->userInfo->game->store->element->$elementId + $num < $g->Melt_Element_MaxNum) { ////如果炼金元素增加之后的数量没到上限,则加
  911. $req->userInfo->game->store->element->$elementId += $num;
  912. } else {
  913. $req->userInfo->game->store->element->$elementId = $g->Melt_Element_MaxNum; ////如果到上限了,就直接等于上限.
  914. }
  915. } else {// 如果仓库中没有这种元素,则当做之前数量零处理
  916. if ($num > $g->Melt_Element_MaxNum) { ////如果要添加的数量超过最大值,那么等于最大值.
  917. $req->userInfo->game->store->element->$elementId = $g->Melt_Element_MaxNum;
  918. }
  919. }
  920. }
  921. /**
  922. * 物品包裹打散成独立道具到仓库
  923. * @param GoodsItemModel $itemModel
  924. * @param Req $req
  925. * @return type
  926. */
  927. static function addSeprateItem($itemModel, $req) {
  928. // var_dump($itemModel);
  929. $user = $req->userInfo->game;
  930. $store = $req->userInfo->game->store;
  931. $itemContent = JsonUtil::decode($itemModel->content);
  932. foreach ($itemContent as $itemId => $itemNum) {
  933. if ($itemId == META_GOLDITEMID) { # 如果是金币 1
  934. UserModel::Add_Gold($user, $itemNum);
  935. } else if ($itemId == META_CASHITEMID) { # 如果是宝石 2
  936. UserModel::present_cash($req, $itemNum, "<" . $req->cmd . ">道具解包-" . $itemModel->name);
  937. } else if ($itemId == META_SPAEITEMID) { # 如果是能量块 3
  938. $user->spar += $itemNum;
  939. } else if ($itemId == META_YUANBAOITEMID) { # 元宝,后加的只能采用字段补偿机制 7
  940. PayProc::m_AddUserYuanbao($req, $itemNum, "<" . $req->cmd . ">道具解包-" . $itemModel->name);
  941. } else { // 否则就是道具
  942. $typid = substr("$itemId", 0, 3);
  943. switch ($typid) {
  944. case "101": # 英雄
  945. if (property_exists($user->heros, $itemId)) {
  946. DebugHelper::var_dump(" 已经有了xxx英雄了.");
  947. } else { # 给玩家创建一个英雄
  948. $hero = new HeroModel();
  949. $instanceID = now();
  950. $heroID = $itemId;
  951. $hero->reInit($heroID, $instanceID);
  952. $user->heros->$heroID = $hero;
  953. }
  954. break;
  955. case '102': # 碎片
  956. if (CommUtil::isPropertyExists($store->segement, $itemId)) {
  957. $store->segement->$itemId += $itemNum;
  958. } else {
  959. $store->segement->$itemId = $itemNum;
  960. }
  961. break;
  962. case '203': # 宝箱
  963. if (CommUtil::isPropertyExists($store->boxes, $itemId)) {
  964. $store->boxes->$itemId += $itemNum;
  965. } else {
  966. $store->boxes->$itemId = $itemNum;
  967. }
  968. break;
  969. default :
  970. break;
  971. }
  972. // for ($i = 0; $i < $itemNum; $i++) {
  973. // $store->items[] = $itemId;
  974. // }
  975. }
  976. // break; # 不会循环的,一个物品中只有第一个道具配置生效,否则
  977. }
  978. UserProc::updateUserInfo($req);
  979. # 添加活动记录
  980. // self::checkActiveItem($req, $itemModel);
  981. }
  982. ///给英雄穿装备
  983. static function WearEquipToHero($req) {
  984. $user = $req->userInfo->game; # user引用
  985. $itemtype = $req->paras[0]; //装备类型
  986. $equipuid = $req->paras[1]; //装备的UID
  987. $herouid = $req->paras[2]; //英雄的UID
  988. echo "开始进去";
  989. //1.检测是否存在该装备
  990. if (!CommUtil::isPropertyExists($user->store->equipment, $equipuid)) {
  991. Err(ErrCode::store_itemno_err);
  992. }
  993. //2.检查是否存在需要装备的英雄
  994. $collectHeros = $user->heros->collectHeros;
  995. if (!$collectHeros) {
  996. $collectHeros = ObjectInit();
  997. }
  998. if (!CommUtil::isPropertyExists($collectHeros, $herouid)) {
  999. Err(ErrCode::hero_no);
  1000. }
  1001. //3.检测该装备是否装备到其他英雄身上
  1002. foreach ($collectHeros as $tmpheroid => $tempvalue) {
  1003. if ($tempvalue->equip->weapon->itemuid == $equipuid) {
  1004. Err(ErrCode::store_equipWeared_err);
  1005. } elseif ($tempvalue->equip->armor->itemuid == $equipuid) {
  1006. Err(ErrCode::store_equipWeared_err);
  1007. } elseif ($tempvalue->equip->ring->itemuid == $equipuid) {
  1008. Err(ErrCode::store_equipWeared_err);
  1009. }
  1010. }
  1011. ///4.添加或替换英雄该部位的装备
  1012. if ($itemtype == 1) {
  1013. $collectHeros->$herouid->equip->weapon->itemuid = $equipuid;
  1014. }
  1015. if ($itemtype == 2) {
  1016. $collectHeros->$herouid->equip->armor->itemuid = $equipuid;
  1017. }
  1018. if ($itemtype == 3) {
  1019. $collectHeros->$herouid->equip->ring->itemuid = $equipuid;
  1020. }
  1021. //5.回写数据
  1022. UserProc::updateUserInfo($req);
  1023. $ret = array('resp' => "succeed!");
  1024. $resp = Resp::ok($ret); //返回必须是object
  1025. StoreProc::CheckItemNum($req);
  1026. return $resp;
  1027. }
  1028. ///给英雄穿装备
  1029. static function UnWieldEquip($req) {
  1030. $user = $req->userInfo->game; # user引用
  1031. $itemtype = $req->paras[0]; //装备类型
  1032. $equipuid = $req->paras[1]; //装备的UID
  1033. $herouid = $req->paras[2]; //拥有该装备的英雄的UID
  1034. echo "开始进去";
  1035. //1.检测是否存在拥有该装备的英雄
  1036. $collectHeros = $user->heros->collectHeros;
  1037. if (!$collectHeros) {
  1038. $collectHeros = ObjectInit();
  1039. }
  1040. if (!CommUtil::isPropertyExists($collectHeros, $herouid)) {
  1041. Err(ErrCode::hero_no);
  1042. }
  1043. //2.检测该装备是否装备在该英雄身上
  1044. if ($itemtype == 1) {
  1045. if ($collectHeros->$herouid->equip->weapon->itemuid != $equipuid) {
  1046. Err(ErrCode::store_noequip_err);
  1047. }
  1048. }
  1049. if ($itemtype == 2) {
  1050. if ($collectHeros->$herouid->equip->armor->itemuid != $equipuid) {
  1051. Err(ErrCode::store_noequip_err);
  1052. }
  1053. }
  1054. if ($itemtype == 3) {
  1055. if ($collectHeros->$herouid->equip->ring->itemuid != $equipuid) {
  1056. Err(ErrCode::store_noequip_err);
  1057. }
  1058. }
  1059. ///4.卸下英雄该部位的装备
  1060. if ($itemtype == 1) {
  1061. $collectHeros->$herouid->equip->weapon->itemuid = 0;
  1062. }
  1063. if ($itemtype == 2) {
  1064. $collectHeros->$herouid->equip->armor->itemuid = 0;
  1065. }
  1066. if ($itemtype == 3) {
  1067. $collectHeros->$herouid->equip->ring->itemuid = 0;
  1068. }
  1069. //5.回写数据
  1070. UserProc::updateUserInfo($req);
  1071. $ret = array('resp' => "succeed!");
  1072. $resp = Resp::ok($ret); //返回必须是object
  1073. StoreProc::CheckItemNum($req);
  1074. return $resp;
  1075. }
  1076. // </editor-fold>
  1077. //
  1078. // <editor-fold defaultstate="collapsed" desc=" 辅助方法 ">
  1079. /**
  1080. * 将宝箱放入仓库
  1081. * @param StoreModel $store
  1082. * @param int $boxId 宝箱类型编号
  1083. * @param int $num 数量
  1084. */
  1085. static function putBoxexInStore($store, $boxId, $num) {
  1086. if (CommUtil::isPropertyExists($store->boxes, $boxId)) {
  1087. $store->boxes->$boxId += $num;
  1088. } else {
  1089. $store->boxes->$boxId = $num;
  1090. }
  1091. }
  1092. public static function CheckHeroNum($req) {
  1093. $heroNum = 0;
  1094. $gamedata = $req->userInfo->game;
  1095. $HeroObj = $gamedata->heros->collectHeros;
  1096. if ($HeroObj) {
  1097. foreach ($HeroObj as $value) {
  1098. $heroNum++;
  1099. }
  1100. }
  1101. return $heroNum;
  1102. }
  1103. /**
  1104. * 检查背包中物品的个数
  1105. * @param type $req
  1106. * @return int
  1107. */
  1108. public static function CheckItemNum($req) {
  1109. $ItemObj = $req->userInfo->game->store->items;
  1110. $EquipObj = $req->userInfo->game->store->equipment;
  1111. $SegementObj = $req->userInfo->game->store->segement;
  1112. $HeroObj = $req->userInfo->game->heros->collectHeros;
  1113. $ItemNum = 0;
  1114. ////检查宝石类可叠加物品的格子占用
  1115. if ($ItemObj) {
  1116. foreach ($ItemObj as $value) {
  1117. $ItemNum++;
  1118. }
  1119. }
  1120. if ($SegementObj) {
  1121. foreach ($SegementObj as $value) {
  1122. $ItemNum++;
  1123. }
  1124. }
  1125. ////检测装备类物品格子占用
  1126. if ($EquipObj) {
  1127. foreach ($EquipObj as $value) {
  1128. $ItemNum++;
  1129. }
  1130. }
  1131. ////检测英雄装备到身上的情况,装备到英雄身上不占格子,要减去.
  1132. if ($HeroObj) {
  1133. foreach ($HeroObj as $value) {
  1134. // echo var_dump($HeroObj);
  1135. $HeroEquipId = $value->equip->weapon->itemuid;
  1136. if ($HeroEquipId > 0) {
  1137. $ItemNum--;
  1138. }
  1139. $HeroEquipId = $value->equip->armor->itemuid;
  1140. if ($HeroEquipId > 0) {
  1141. $ItemNum--;
  1142. }
  1143. $HeroEquipId = $value->equip->ring->itemuid;
  1144. if ($HeroEquipId > 0) {
  1145. $ItemNum--;
  1146. }
  1147. }
  1148. }
  1149. $req->userInfo->game->privateState->ItemNum = $ItemNum;
  1150. return $ItemNum;
  1151. }
  1152. /**
  1153. * 获取物品格子的上限值
  1154. * @param type $req
  1155. * @return int 上限数值
  1156. */
  1157. public static function GetItemMaxNum($req) {
  1158. $g = glc();
  1159. if (!CommUtil::isPropertyExists($req->userInfo->game->privateState, "maxItemNum")) {
  1160. $req->userInfo->game->privateState->maxItemNum = $g->Item_Packet_MaxNum;
  1161. }
  1162. return $req->userInfo->game->privateState->maxItemNum;
  1163. }
  1164. public static function AddPacketNum($req) {
  1165. $g = glc();
  1166. // $user = $req->userInfo->game; # user引用
  1167. if (!CommUtil::isPropertyExists($req->userInfo->game->privateState, "maxItemNum")) {
  1168. $req->userInfo->game->privateState->maxItemNum = $g->Item_Packet_MaxNum;
  1169. }
  1170. $costCash = $g->Item_Packet_NumCostCash;
  1171. $bDeal = false;
  1172. if ($costCash > 0) {
  1173. if ($req->userInfo->game->cash < $costCash) {
  1174. Err(ErrCode::notenough_spar);
  1175. }
  1176. $bDeal = UserGameModel::Consume_Cash($req->userInfo->game, $costCash);
  1177. } else {
  1178. Err(ErrCode::paras_err);
  1179. }
  1180. //6.进行消耗
  1181. if ($bDeal) {
  1182. $req->userInfo->game->privateState->maxItemNum += 10;
  1183. UserProc::updateUserInfo($req);
  1184. $result = ObjectInit();
  1185. $result->maxItemNum = $req->userInfo->game->privateState->maxItemNum;
  1186. $resp = Resp::ok($result);
  1187. }
  1188. StoreProc::CheckItemNum($req);
  1189. return $resp;
  1190. }
  1191. // </editor-fold>
  1192. //
  1193. // -------------- 已废弃的代码 -------------------------------
  1194. //
  1195. // <editor-fold defaultstate="collapsed" desc=" --- 已废弃的代码 --- ">
  1196. //
  1197. /**
  1198. * 符石放入仓库
  1199. * @param type $itemId
  1200. * @param MapModel $map
  1201. */
  1202. static function putStoneInStore($itemId, $itemNum, &$map) {
  1203. if (!CommUtil::isPropertyExists($map->store, "stones")) {
  1204. $map->store->stones = ObjectInit();
  1205. }
  1206. if (CommUtil::isPropertyExists($map->store->stones, $itemId)) {
  1207. $map->store->stones->$itemId += $itemNum;
  1208. } else {// 如果仓库中没有这种元素,则其数目置1
  1209. $map->store->stones->$itemId = $itemNum;
  1210. }
  1211. }
  1212. // </editor-fold>
  1213. //
  1214. // <editor-fold defaultstate="collapsed" desc=" 出售 ">
  1215. //
  1216. // /**
  1217. // * 从仓库出售可叠加物品
  1218. // * @param RequestVo $req
  1219. // * @return type
  1220. // */
  1221. // static function sellGemFromStore($req)
  1222. // {
  1223. // $resp = new ResponseVo();
  1224. // $mem = $req->mem;
  1225. // // $user = $req->userInfo->user;
  1226. // $store = $req->userInfo->game->store; //$req->userInfo->game->store->items
  1227. ////客户端参数解析
  1228. // $type = $req->paras[0]; //1=神兽 2=建筑 //需要判断是否叠加
  1229. // $itemId = $req->paras[1]; // 注意:这里不是单体的id,而是物种的id
  1230. // $count = intval($req->paras[2]); // 数量
  1231. //
  1232. // ////0是type 1是itemid,2是uid,3是数量
  1233. //
  1234. // if (4 == $type) { // 从仓库出售宝石 出售可叠加的物品
  1235. //
  1236. // $ok = StoreProc::removeItemFromStore($store, $itemId, $count); // 支持移除指定数量
  1237. //
  1238. ////1.如果仓库道具移出时出错,则直接返回错误
  1239. // if ($ok != ErrCode::succeed) {
  1240. // $resp = ResponseVo::ErrResponse($req, $ok);
  1241. //
  1242. // } else {
  1243. // // echo "弄弄";
  1244. // $gem = ConstProc::getItemConst ($mem, $itemId);
  1245. // echo var_export($gem);
  1246. ////2.检测是否存在该物品的原始物种
  1247. // if ($gem == null) {
  1248. // $resp = ResponseVo::ErrResponse($req, ErrCode::err_godpet_noconst);
  1249. // } else {
  1250. // // 发金币
  1251. //
  1252. // UserGameModel::Add_Gold($mem, $req->userInfo->game,$gem->maijia *$count );
  1253. //
  1254. // $resp = ResponseVo::RetResponse($req, "succeed!");
  1255. //
  1256. // UserProc::updateUserInfo($req);
  1257. //
  1258. // }
  1259. // }
  1260. // } else if (1 == $type) { # 建筑 // 其它
  1261. // if ($count > 1) {
  1262. // $resp = ResponseVo::ErrResponse($req, ErrCode::err_msg_paras);
  1263. // } else {
  1264. // $ok = StoreProc::removeFromStore($itemId, $map); # 从仓库移除
  1265. // if ($ok) {//1.如果仓库道具移出时出错,则直接返回错误
  1266. // $resp = ResponseVo::ErrResponse($req, ErrCode::err_store_removefail);
  1267. // } else {
  1268. // $build = ConstProc::getBuildConst($mem, $itemId);
  1269. // if (build == null) { //2.检测是否存在建筑的原始数据
  1270. // $resp = ResponseVo::errResponse($req->oid, $req->msgid, ErrCode::err_build_noconst);
  1271. // } else {
  1272. // UserModel::Add_Gold($user, JsonUtil::decode($build->sellPrice)->g); # 加金币
  1273. // $resp = ResponseVo::myRetResponse($req, "succeed!"); # 返回值
  1274. // //成就触发--获取金币
  1275. // /// AchievementProc::dealAchievementState($req, $resp, AchievementProc::Gold);
  1276. // UserProc::updateUserInfo($req);
  1277. // }
  1278. // }
  1279. // }
  1280. // }
  1281. // }
  1282. //
  1283. //
  1284. //
  1285. //
  1286. //
  1287. //
  1288. //
  1289. /**
  1290. * 出售单一的物品
  1291. * @param Req $req
  1292. * @return type
  1293. */
  1294. static function sellItem($req) {
  1295. $resp = new Resp();
  1296. $mem = $req->mem;
  1297. // $user = $req->userInfo->user;
  1298. $store = $req->userInfo->game->store; //$req->userInfo->game->store->items
  1299. //客户端参数解析
  1300. $type = $req->paras[0]; //1=神兽 2=建筑 //需要判断是否叠加
  1301. $itemId = $req->paras[1]; // 注意:这里不是单体的id,而是物种的id
  1302. if ($type > 3) {
  1303. $count = intval($req->paras[2]); // 数量
  1304. $uid = 0;
  1305. } else {
  1306. $count = 1;
  1307. $uid = $req->paras[2];
  1308. }//物品的uid
  1309. ////0是type 1是itemid,2是uid或者是数量
  1310. if ($type > 3 && $type < 8) { // 从仓库出售宝石 出售可叠加的物品
  1311. $ok = StoreProc::removeItemFromStore($store, $itemId, $count); // 支持移除指定数量
  1312. //1.如果仓库道具移出时出错,则直接返回错误
  1313. if ($ok != ErrCode::ok) {
  1314. Err($ok);
  1315. }
  1316. // echo "弄弄";
  1317. $gem = GameConfig::item_getItem($itemId); // ConstProc::getItemConst($itemId);
  1318. echo var_export($gem);
  1319. //2.检测是否存在该物品的原始物种
  1320. if ($gem == null) {
  1321. Err(ErrCode::err_godpet_noconst);
  1322. }
  1323. // 发金币
  1324. UserGameModel::Add_Gold($mem, $req->userInfo->game, $gem->maijia * $count);
  1325. $ret = array('resp' => "succeed!");
  1326. $resp = Resp::ok($ret);
  1327. UserProc::updateUserInfo($req);
  1328. } else if ($type == 8) { // 从仓库出售碎片 出售可叠加的物品
  1329. $ok = StoreProc::removeItemFromStore($store, $itemId, $count); // 支持移除指定数量
  1330. //1.如果仓库道具移出时出错,则直接返回错误
  1331. if ($ok != ErrCode::ok) {
  1332. Err($ok);
  1333. }
  1334. // echo "弄弄";
  1335. $gem = GameConfig::segment_getItem($itemId); // ConstProc::getItemConst($itemId);
  1336. // echo var_export($gem);
  1337. //2.检测是否存在该物品的原始物种
  1338. if ($gem == null) {
  1339. Err(ErrCode::err_godpet_noconst);
  1340. }
  1341. // 发金币
  1342. UserGameModel::Add_Gold($mem, $req->userInfo->game, $gem->saleGoldPrice * $count);
  1343. $ret = array('resp' => "succeed!");
  1344. $resp = Resp::ok($ret);
  1345. UserProc::updateUserInfo($req);
  1346. } else if ($type < 4 && $type > 0) { # 这里是装备
  1347. if ($count > 1) {
  1348. Err(ErrCode::paras_err);
  1349. }
  1350. if ($uid < 1) {
  1351. Err(ErrCode::paras_err);
  1352. }
  1353. $ok = StoreProc::removeEquipFromStore($uid, $itemId, $req); # 从背包移除
  1354. if (!$ok) {//1.如果背包道具移出时出错,则直接返回错误
  1355. Err(ErrCode::store_removefail);
  1356. }
  1357. $item = GameConfig::item_getItem($itemId); // ConstProc::getItemConst($itemId);
  1358. if ($item == null) { //2.检测是否存在装备的原始数据
  1359. Err(ErrCode::err_const_no);
  1360. }
  1361. UserGameModel::Add_Gold($mem, $req->userInfo->game, $item->maijia);
  1362. $ret = array('resp' => "succeed!");
  1363. $resp = Resp::ok($ret); //返回必须是object
  1364. UserProc::updateUserInfo($req);
  1365. } else {
  1366. Err(ErrCode::paras_err);
  1367. }
  1368. StoreProc::CheckItemNum($req);
  1369. return $resp;
  1370. }
  1371. /**
  1372. * 卖出一堆物品时候,检测每个单个物品是否符合卖的条件
  1373. * @param Req $req
  1374. * @return type
  1375. */
  1376. static function preSellSingleFromStore(&$req, $type, $itemId, $count, $uid) {
  1377. $resp = new Resp();
  1378. $mem = $req->mem;
  1379. // $user = $req->userInfo->user;
  1380. $store = $req->userInfo->game->store; //$req->userInfo->game->store->items
  1381. //客户端参数解析
  1382. ////0是type 1是itemid,2是uid或者是数量
  1383. if ($type > 3 && $type < 8) { // 从仓库出售宝石 出售可叠加的物品
  1384. echoLine(":fs::");
  1385. $ok = StoreProc::removeItemFromStore($store, $itemId, $count); // 支持移除指定数量
  1386. //1.如果仓库道具移出时出错,则直接返回错误
  1387. if ($ok != ErrCode::ok) {
  1388. Err($ok);
  1389. }
  1390. echo "弄弄";
  1391. $gem = GameConfig::item_getItem($itemId); // ConstProc::getItemConst($itemId);
  1392. echo var_export($gem);
  1393. //2.检测是否存在该物品的原始物种
  1394. if ($gem == null) {
  1395. Err(ErrCode::err_godpet_noconst);
  1396. }
  1397. // 发金币
  1398. UserGameModel::Add_Gold($mem, $req->userInfo->game, $gem->maijia * $count);
  1399. $ret = array('resp' => "succeed!");
  1400. $resp = Resp::ok($ret);
  1401. } else if ($type == 8) { // 从仓库出售碎片 出售可叠加的物品
  1402. $ok = StoreProc::removeItemFromStore($store, $itemId, $count); // 支持移除指定数量
  1403. //1.如果仓库道具移出时出错,则直接返回错误
  1404. if ($ok != ErrCode::ok) {
  1405. Err($ok);
  1406. }
  1407. // echo "弄弄";
  1408. $gem = GameConfig::segment_getItem($itemId); // ConstProc::getItemConst($itemId);
  1409. // echo var_export($gem);
  1410. //2.检测是否存在该物品的原始物种
  1411. if ($gem == null) {
  1412. Err(ErrCode::err_godpet_noconst);
  1413. }
  1414. // 发金币
  1415. UserGameModel::Add_Gold($mem, $req->userInfo->game, $gem->saleGoldPrice * $count);
  1416. $ret = array('resp' => "succeed!");
  1417. $resp = Resp::ok($ret);
  1418. } else if ($type < 4 && $type > 0) { # 这里是装备
  1419. if ($count > 1) {
  1420. Err(ErrCode::paras_err);
  1421. }
  1422. if ($uid < 1) {
  1423. Err(ErrCode::paras_err);
  1424. }
  1425. $ok = StoreProc::removeEquipFromStore($uid, $itemId, $req); # 从背包移除
  1426. if (!$ok) {//1.如果背包道具移出时出错,则直接返回错误
  1427. Err(ErrCode::store_removefail);
  1428. }
  1429. $item = GameConfig::item_getItem($itemId); // ConstProc::getItemConst($itemId);
  1430. if ($item == null) { //2.检测是否存在装备的原始数据
  1431. Err(ErrCode::err_const_no);
  1432. }
  1433. UserGameModel::Add_Gold($mem, $req->userInfo->game, $item->maijia);
  1434. $ret = array('resp' => "succeed!");
  1435. $resp = Resp::ok($ret); //返回必须是object
  1436. } else {
  1437. Err(ErrCode::paras_err);
  1438. }
  1439. return $resp;
  1440. }
  1441. /**
  1442. * 从背包出售多个物品
  1443. * @param Req $req
  1444. * @return type
  1445. */
  1446. static function sellMultiItemFromStore($req) {
  1447. $resp = new Resp();
  1448. $obj = $req->paras[0]; //获取物品的结构数组
  1449. echo var_export($obj);
  1450. foreach ($obj as $value) {
  1451. $type = $value[0];
  1452. $itemId = $value[1];
  1453. ////先判断一下物品类型,如果是可叠加的,就按数量取值,如果是不可叠加的就按uid取值
  1454. if ($type > 3) {
  1455. $count = intval($value[2]); // 数量
  1456. $uid = 0;
  1457. } else {
  1458. $count = 1;
  1459. $uid = $value[2];
  1460. }//物品的uid
  1461. $resp = StoreProc:: preSellSingleFromStore($req, $type, $itemId, $count, $uid);
  1462. echo var_export($resp);
  1463. #sellitem();
  1464. }
  1465. if (0 == $resp->err) {
  1466. UserProc::updateUserInfo($req);
  1467. }
  1468. // echo var_export($resp);
  1469. StoreProc::CheckItemNum($req);
  1470. return $resp;
  1471. }
  1472. // </editor-fold>
  1473. //
  1474. }