From 72600db99807b7de2f8efd566a7508b851ec5b81 Mon Sep 17 00:00:00 2001 From: hujiabin <519660157@qq.com> Date: Fri, 30 Jun 2023 18:09:53 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8B=B1=E9=9B=84=E9=87=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/Hero.py | 31 ++++++ webapp/bootstrap/constant.php | 2 + webapp/controller/HeroController.class.php | 82 ++++++++++++++- webapp/controller/UserController.class.php | 32 +++--- webapp/models/Transaction.php | 1 + webapp/services/callback/BuyPassCbService.php | 99 ++++++++++++++++++- .../services/callback/GameItemMallBuyOk.php | 7 +- 7 files changed, 231 insertions(+), 23 deletions(-) diff --git a/doc/Hero.py b/doc/Hero.py index 1cd28893..fda7df4c 100644 --- a/doc/Hero.py +++ b/doc/Hero.py @@ -134,6 +134,37 @@ class Hero(object): _common.RspHead(), ['!hero', [_common.Hero()], '英雄信息'] ] + },{ + 'name': 'beforeHeroReset', + 'desc': '英雄重置前', + 'group': 'Hero', + 'url': 'webapp/index.php?c=Hero&a=beforeHeroReset', + 'params': [ + _common.ReqHead(), + ['hero_unnid', 0, '英雄唯一id'], + ], + 'response': [ + _common.RspHead(), + ['ceg', 0, 'ceg'], + ['gold', 0, 'gold'], + ['piece', 0, '碎片'], + ['serum', 0, '材料'], + ] + },{ + 'name': 'heroResetLevel', + 'desc': '英雄重置', + 'group': 'Hero', + 'url': 'webapp/index.php?c=Hero&a=heroResetLevel', + 'params': [ + _common.ReqHead(), + ['hero_unnid', 0, '英雄唯一id'], + ['price', 0, 'ceg数量'], + ], + 'response': [ + _common.RspHead(), + ['trans_id', 0, '订单号'], + ['params', 0, 'params'], + ] }, ] diff --git a/webapp/bootstrap/constant.php b/webapp/bootstrap/constant.php index 3d74705b..9ee9bbd6 100644 --- a/webapp/bootstrap/constant.php +++ b/webapp/bootstrap/constant.php @@ -12,6 +12,7 @@ define('V_ITEM_ACTIVE', 10004); //活跃度 define('V_ITEM_BCEG', 10010); //BCEG define('V_ITEM_STAR', 10011); //星星 define('V_ITEM_PASS', 10012); //通行证 +define('V_ITEM_RESET_CARD', 10013); //重置卡 define('V_ITEM_REVIVE_COIN', 140001); //复活币 define('V_ITEM_HERO_META', 100005); //英雄升级材料 define('V_ITEM_GUN_META', 100006); //枪械升级材料 @@ -51,6 +52,7 @@ define('TN_DAILY_USED_GOLD_NUM', 9015); define('TN_DAILY_GET_STAR_NUM', 9016); define('TN_DAILY_BUY_PASS_STATE', 9017); define('TN_DAILY_BUY_LEVEL_STATE', 9018); +define('TN_DAILY_RESET_HERO_LEVEL_STATE', 9019); define('TN_WEEKLY_BEGIN', 10001); define('TN_WEEKLY_ACTIVE', 10002); diff --git a/webapp/controller/HeroController.class.php b/webapp/controller/HeroController.class.php index b0ba8dca..e19ca3a7 100644 --- a/webapp/controller/HeroController.class.php +++ b/webapp/controller/HeroController.class.php @@ -12,10 +12,13 @@ require_once('models/ChipPage.php'); require_once('models/Gun.php'); require_once('models/HeroPreset.php'); require_once('models/Bag.php'); +require_once('models/Transaction.php'); +require_once('models/BcOrder.php'); require_once('services/AwardService.php'); require_once('services/PropertyChgService.php'); require_once('services/LogService.php'); +require_once('services/BlockChainService.php'); @@ -27,6 +30,8 @@ use models\Gun; use models\Nft; use models\HeroPreset; use models\Bag; +use models\Transaction; +use models\BcOrder; use services\LogService; class HeroController extends BaseAuthedController { @@ -59,8 +64,10 @@ class HeroController extends BaseAuthedController { $nftDb = Nft::getNft($heroDb['token_id']); $heroDb['tags'] = $nftDb['tags']; } + $resetLv_state = $this->_getDailyV(TN_DAILY_RESET_HERO_LEVEL_STATE, $unique_id); $hero = Hero::toDto($heroDb); + $hero['resetLv_state'] = $resetLv_state; $this->_rspData(array( 'data' => $hero )); @@ -317,6 +324,7 @@ class HeroController extends BaseAuthedController { 英雄碎片合成 */ public function heroPieceSys(){ + error_log("HERO PRICE : " . json_encode($_REQUEST)); $itemId = getReqVal('item_id',0); $pieceNum = \mt\Parameter::getVal('hero_piece_synthesis_num',0); $itemMeta = \mt\Item::get($itemId); @@ -344,11 +352,81 @@ class HeroController extends BaseAuthedController { )); } + public function beforeHeroReset(){ + $hero_unnid = getReqVal('hero_unnid',0); + $heroDb = Hero::find($hero_unnid); + if (!$heroDb){ + $this->_rspErr(1, "param hero_unnid error"); + return; + } + $paramMeta = \mt\Parameter::getListValue('hero_reset_cost'); + if (!$paramMeta){ + $this->_rspErr(1, "parameter hero_reset_cost is null "); + return; + } + $actual_price = 0; + foreach ($paramMeta as $value){ + $temp = explode(":",$value); + if ($heroDb['hero_lv'] == $temp[0]){ + $actual_price = $temp[1]; + } + } + $piece = 0; + $serum = 0; + $gold = 0; + for ($i=1;$i<=$heroDb['hero_lv'];$i++){ + $heroLevelMeta = mt\HeroLevel::getByLevel($i); + $piece += $heroLevelMeta['piece']; + $serum += $heroLevelMeta['serum']; + $gold += $heroLevelMeta['gold']; + } + $this->_rspData(array( + 'ceg' => $actual_price, + 'gold' => $gold, + 'piece' => $piece, + 'serum' => $serum, + )); + } /* - 英雄重置 + 英雄重置 2:5|3:10|4:15|5:20|6:25|7:30|8:35|9:40|10:45|11:50|12:55|13:60|14:65|15:70 */ public function heroResetLevel(){ - + $hero_unnid = getReqVal('hero_unnid',0); + $price = getReqVal('price', 0); + $heroDb = Hero::find($hero_unnid); + if (!$heroDb){ + $this->_rspErr(1, "param hero_unnid error"); + return; + } + if ($heroDb['hero_lv'] <= 1){ + $this->_rspErr(1, "This is the lowest level of hero"); + return; + } + $paramMeta = \mt\Parameter::getListValue('hero_reset_cost'); + if (!$paramMeta){ + $this->_rspErr(1, "parameter hero_reset_cost is null "); + return; + } + $actual_price = 0; + foreach ($paramMeta as $value){ + $temp = explode(":",$value); + if ($heroDb['hero_lv'] == $temp[0]){ + $actual_price = $temp[1]; + } + } + if($price != $actual_price){ + $this->_rspErr(1, "The number of CEGs is incorrect "); + return; + } + $response = services\BlockChainService::gameItemMallBuy( + Transaction::RESET_HERO_LEVEL_TYPE, services\BlockChainService::formatCurrency($price), V_ITEM_RESET_CARD, 1); + $this->_setV(TN_DAILY_RESET_HERO_LEVEL_STATE, $hero_unnid, 1); + BcOrder::upsert($response['trans_id'], array( + 'item_id' => V_ITEM_RESET_CARD, + 'item_num' => 1, + 'ext_data' => json_encode($hero_unnid), + )); + $this->_rspData($response); } /* diff --git a/webapp/controller/UserController.class.php b/webapp/controller/UserController.class.php index 9932b195..06adf91b 100644 --- a/webapp/controller/UserController.class.php +++ b/webapp/controller/UserController.class.php @@ -114,22 +114,22 @@ class UserController extends BaseAuthedController { } } - if (SERVER_ENV == _TEST) { - - array_push($addItems, - array( - 'item_id' => V_ITEM_GOLD, - 'item_num' => 500000 - )); - $itemIds = array(30100,30200,30300,30400,30500,30600,30700,30800,30900,31000,40702,40902,40102); - foreach ($itemIds as $row){ - array_push($addItems, - array( - 'item_id' => $row, - 'item_num' => 1 - )); - } - } +// if (SERVER_ENV == _TEST) { +// +// array_push($addItems, +// array( +// 'item_id' => V_ITEM_GOLD, +// 'item_num' => 500000 +// )); +// $itemIds = array(30100,30200,30300,30400,30500,30600,30700,30800,30900,31000,40702,40902,40102); +// foreach ($itemIds as $row){ +// array_push($addItems, +// array( +// 'item_id' => $row, +// 'item_num' => 1 +// )); +// } +// } $awardService = new services\AwardService(); $propertyChgService = new services\PropertyChgService(); diff --git a/webapp/models/Transaction.php b/webapp/models/Transaction.php index b82cbaa4..1a0746a8 100644 --- a/webapp/models/Transaction.php +++ b/webapp/models/Transaction.php @@ -21,6 +21,7 @@ class Transaction extends BaseModel { const BUY_EXP_ACTION_TYPE = 101; const BUY_PASS_ACTION_TYPE = 102; const BUY_GOODS_ACTION_TYPE = 103; + const RESET_HERO_LEVEL_TYPE = 104; const BUY_END_ACTION_TYPE = 200; diff --git a/webapp/services/callback/BuyPassCbService.php b/webapp/services/callback/BuyPassCbService.php index 26446d32..d706a23c 100644 --- a/webapp/services/callback/BuyPassCbService.php +++ b/webapp/services/callback/BuyPassCbService.php @@ -4,9 +4,13 @@ namespace services; require_once('mt/BattlePass.php'); +require_once('mt/HeroLevel.php'); +require_once('mt/Item.php'); require_once ('services/callback/ShopAddItemService.php'); use mt\BattlePass; +use mt\HeroLevel; +use mt\Item; use phpcommon\SqlHelper; class BuyPassCbService @@ -54,12 +58,99 @@ class BuyPassCbService )), )); } + break; + //重置英雄等级回调 + case V_ITEM_RESET_CARD : { + $itemService->addGameLog($order['address'],"resetHero","begin",array( + 'param1' => $order['order_id'], + 'param2' => json_encode(array( + 'item_id' => $order['item_id'], + 'item_num' => $order['item_num'], + 'hero_unnid' => json_decode($order['ext_data']), + )), + )); + $this->_resetHeroLevel($order); + error_log("callback resetHeroLevel address: {$order['address']}, order_id: {$order['order_id']}, item_id: {$order['item_id']}, item_num: {$order['item_num']}"); + $itemService->addGameLog($order['address'],"resetHero","end",array( + 'param1' => $order['order_id'], + 'param2' => json_encode(array( + 'item_id' => $order['item_id'], + 'item_num' => $order['item_num'], + 'hero_unnid' => json_decode($order['ext_data']), + )), + )); + } default : { } } } + private function _resetHeroLevel($order){ + $heroDb = SqlHelper::ormSelectOne( + myself()->_getMysql($order['address']), + 't_hero', + array( + 'idx' => json_decode($order['ext_data']) + ) + ); + $piece_item_id = 0; + $metaList = Item::getMetaListByType(Item::FRAGMENT_TYPE); + foreach ($metaList as $meta){ + if ($meta['relationship'] == $heroDb['hero_id']) { + $piece_item_id = $meta['id']; + break; + } + } + $piece = 0; + $serum = 0; + $gold = 0; + for ($i=1;$i<=$heroDb['hero_lv'];$i++){ + $heroLevelMeta = HeroLevel::getByLevel($i); + $piece += $heroLevelMeta['piece']; + $serum += $heroLevelMeta['serum']; + $gold += $heroLevelMeta['gold']; + } + SqlHelper::update + (myself()->_getMysql($order['address']), + 't_hero', + array( + 'idx' => json_decode($order['ext_data']) + ), + array( + 'hero_lv' => 1, + 'rand_attr' => $heroDb['base_attr'], + ) + ); + $conn = myself()->_getMysql($order['address']); + $this->_addBagItem($conn,$order['account_id'],$piece_item_id,$piece); + $this->_addBagItem($conn,$order['account_id'],V_ITEM_HERO_META,$serum); + $this->_addBagItem($conn,$order['account_id'],V_ITEM_GOLD,$gold); + $this->_updateDynData($order,TN_DAILY_RESET_HERO_LEVEL_STATE,json_decode($order['ext_data'])); + } + + private function _addBagItem($conn,$accountId,$itemId,$itemNum){ + SqlHelper::upsert + ($conn, + 't_bag', + array( + 'account_id' => $accountId, + 'item_id' => $itemId + ), + array( + 'item_num' => function () use($itemNum) { return "item_num + {$itemNum}";}, + 'modifytime' => myself()->_getNowTime(), + ), + array( + 'account_id' => $accountId, + 'item_id' => $itemId, + 'item_num' => $itemNum, + 'createtime' => myself()->_getNowTime(), + 'modifytime' => myself()->_getNowTime() + ) + ); + } + private function _activateUser($address){ SqlHelper::update (myself()->_getMysql($address), @@ -114,17 +205,17 @@ class BuyPassCbService ) ); $this->_updatePassData($userDbNew); - $this->_updateDynData($userDbNew); + $this->_updateDynData($userDbNew,TN_DAILY_BUY_LEVEL_STATE,0); } - private function _updateDynData($user){ + private function _updateDynData($user,$x,$y){ SqlHelper::update ( myself()->_getMysql($user['address']), 't_dyndata', array( 'account_id' => $user['account_id'], - 'x' => TN_DAILY_BUY_LEVEL_STATE, - 'y' => 0 + 'x' => $x, + 'y' => $y ), array( 'val' => 0, diff --git a/webapp/services/callback/GameItemMallBuyOk.php b/webapp/services/callback/GameItemMallBuyOk.php index 903aa4d3..8faa6881 100644 --- a/webapp/services/callback/GameItemMallBuyOk.php +++ b/webapp/services/callback/GameItemMallBuyOk.php @@ -58,7 +58,12 @@ class GameItemMallBuyOk { } private function _isVirtualItem($itemId){ - return in_array($itemId, array(V_ITEM_EXP, V_ITEM_PASS)); + return in_array($itemId, array( + V_ITEM_EXP, + V_ITEM_PASS, + V_ITEM_RESET_CARD, + ) + ); } private function _updateOrderState($address,$transId){