steal.php 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038
  1. <?php
  2. defined( 'IN_WEB') or die( 'Include Error!');
  3. class ModelSteal {
  4. public $cfg;
  5. public $ratioPro =[
  6. ["id"=>1,"bet"=>0.07,"f_weight"=>0,"weight"=>75,"isRobot"=>0],
  7. ["id"=>2,"bet"=>0.3,"f_weight"=>20,"weight"=>0,"isRobot"=>0],
  8. ["id"=>3,"bet"=>0.6,"f_weight"=>40,"weight"=>25,"isRobot"=>0],
  9. ["id"=>4,"bet"=>0.85,"f_weight"=>20,"weight"=>0,"isRobot"=>0],
  10. ["id"=>5,"bet"=>1,"f_weight"=>20,"weight"=>0,"isRobot"=>0],
  11. ];
  12. public function __construct()
  13. {
  14. $this->cfg = oo::cfg('stealattack')['steal'];
  15. }
  16. /**
  17. * Notes:绑定
  18. * User: wsc
  19. * Time: 2020/6/28 11:02
  20. * @param $uid
  21. * @param $level
  22. * @return array|mixed
  23. */
  24. public function getBindKing($uid,$level){
  25. $rk = okeys::richestKing($uid);
  26. $richestKingJson = oo::commonOprRedis('server')->get($rk);
  27. if(!empty($richestKingJson)){
  28. $king =json_decode($richestKingJson,true);
  29. return $king;
  30. }
  31. $king = $this->getRichestKing($uid,$level);
  32. if(empty($king)){
  33. return [];
  34. }
  35. $res = oo::commonOprRedis('server')->setex($rk,json_encode($king),oo::redisRandomExpire(86400));
  36. oo::commonOprRedis('server')->sAdd(okeys::richestKingTo($king['uid']),$uid);
  37. $info = oo::commonOprModel('member')->getUserAssetsInfo($king['uid']);//被偷用户当前货币信息
  38. $this->toOutQueue($king['uid'],$king['levelId'],$info['money']);//尝试出队
  39. return $king;
  40. }
  41. /**
  42. * Notes:解绑
  43. * User: wsc
  44. * Time: 2020/6/28 11:02
  45. * @param $uid
  46. * @return bool
  47. */
  48. public function clearBindKing($uid){
  49. $rk = okeys::richestKing($uid);
  50. $richestKingJson = oo::commonOprRedis('server')->get($rk);
  51. if(!empty($richestKingJson)){
  52. $king =json_decode($richestKingJson,true);
  53. oo::commonOprRedis('server')->delete($rk);
  54. oo::commonOprRedis('server')->sRemove(okeys::richestKingTo($king['uid']),$uid);
  55. // oo::commonOprRedis('usercache')->delete(okeys::richestKingCoin($uid,$king['uid']));//删除绑定的钱及倍率(old)
  56. oo::commonOprRedis('usercache')->delete(okeys::richestKingInfo($uid));//其他人绑定的king信息(new)
  57. }
  58. //以防未删除king的详细信息
  59. $king = oo::commonOprRedis('usercache')->hGetAll(okeys::richestKingInfo($uid));
  60. if(!empty($king)){
  61. oo::commonOprRedis('server')->sRemove(okeys::richestKingTo($king['toUid']),$uid);
  62. oo::commonOprRedis('usercache')->delete(okeys::richestKingInfo($uid));//其他人绑定的king信息(new)
  63. }
  64. return true;
  65. }
  66. /**
  67. * Notes:清理与$toUid的绑定关系
  68. * User: wsc
  69. * Time: 2020/6/28 12:57
  70. * @param $toUid
  71. * @param int $uid 需要排除的用户
  72. */
  73. public function clearOtherBind($toUid,$uid=0){
  74. $kingTokey = okeys::richestKingTo($toUid);
  75. $arr = oo::commonOprRedis('server')->sMembers($kingTokey);
  76. if(!empty($arr)){
  77. foreach ($arr as $v){
  78. if($v!=$uid){
  79. oo::commonOprRedis('usercache')->delete(okeys::richestKingInfo($v));//其他人绑定的king信息(new)
  80. $multiple = oo::commonOprRedis('usercache')->get(okeys::curUserBet($v));
  81. oo::commonOprModel('user')->getRichestKing($v,$multiple,true);//从刷king,
  82. }
  83. }
  84. }
  85. }
  86. /**
  87. * Notes:获取richestkong
  88. * User: wsc
  89. * Time: 2020/6/24 18:33
  90. * @param $uid -用户id
  91. * @param $level -uid等级
  92. * @param bool $onlyRand -是否仅来自全集合
  93. * @return array|mixed ["uid"=>66,"money"=>666]
  94. */
  95. public function getRichestKing($uid,$level,$onlyRand=false){
  96. $king = $this->getFriend($uid);
  97. if(!empty($king)){
  98. $money = $this->isPassMoney($level,$king,1);
  99. if(intval($money)>100000){
  100. $king['money'] = $money;
  101. }else{
  102. $king = [];
  103. }
  104. }
  105. if(empty($king)||$onlyRand){//优先好友
  106. $actionLevel = oo::getActionLevel('steal',$level);
  107. $king = [];
  108. for ($i=$actionLevel['max'];$i>=$actionLevel['min'];$i--){
  109. $key = akey::userLevelStealList($i);
  110. $one = oo::commonOprRedis('server')->zRevRange($key,0,1,true);
  111. if(!empty($one)){
  112. foreach ($one as $k=>$v){
  113. if((!isset($king['money'])||intval($king['money'])<$v)&&$k!=$uid){
  114. $king['money'] = $v;
  115. $king['uid'] = $k;
  116. $king['levelId']=$i;
  117. }
  118. }
  119. }
  120. }
  121. $money = $this->isPassMoney($level,$king);
  122. if(intval($money)<100000){//若不满足1.8.6版本新的最低金币要求
  123. $king = [];
  124. }else{
  125. $king['money'] = $money;
  126. }
  127. }
  128. return $king;
  129. }
  130. public function getRichestKing2($uid,$level,$onlyRand=false){
  131. $king = $this->getFriend($uid);
  132. if(empty($king)||$onlyRand){//优先好友
  133. $actionLevel = oo::getActionLevel('steal',$level);
  134. $newKey = akey::newStealList($level);
  135. for ($i=$actionLevel['max'];$i>=$actionLevel['min'];$i--){
  136. $keyList[] = akey::userLevelStealList($i);
  137. $keyqList[] = 1;
  138. }
  139. $num = oo::commonOprRedis('server')->zUnion($newKey,$keyList,$keyqList,"min");
  140. if($num<=0){
  141. return [];
  142. }
  143. $kings = oo::commonOprRedis('server')->zRevRange($newKey,0,2,true);
  144. oo::commonOprRedis('server')->delete($newKey);
  145. if(!empty($kings)&&is_array($kings)){
  146. foreach ($kings as $k=>$v){
  147. if($k!=$uid){
  148. $info = oo::commonOprModel('member')->getUserAssetsInfo($k);
  149. $king=["uid"=>$k,"money"=>$v,"levelId"=>$info['levelId']];
  150. break;
  151. }
  152. }
  153. }
  154. }
  155. return $king;
  156. }
  157. /**
  158. * Notes:获取满足条件的好友
  159. * User: wsc
  160. * Time: 2020/6/24 18:35
  161. * @param $uid
  162. * @return array|mixed
  163. */
  164. public function getFriend($uid){
  165. $friendlist = oo::commonOprModel('friend')->getUserAllFriend($uid);
  166. foreach ($friendlist as $k=>$v){
  167. $res = $this->verifyIsPass($v,1);
  168. if($res>0){
  169. $minLv = max(intval(oo::cfg('stealattack')['steal']['minLv']),4);
  170. $info = oo::commonOprModel('member')->getUserAssetsInfo($v);
  171. if(!isset($info['levelId'])||empty($info['levelId'])||$info['levelId']<$minLv){
  172. continue;
  173. }
  174. $minMoney = oo::commonOprModel('level')->getLevelConf($info['levelId']);
  175. if($info['money']<intval($minMoney['minMoney'])*0.5){//是否达到可被偷的钱数标准
  176. continue;
  177. }
  178. $data[] = ["uid"=>$v,"money"=>$info['money'],"levelId"=>$info['levelId']];
  179. }
  180. }
  181. if(!empty($data)){
  182. array_multisort(array_column($data,'money'),SORT_DESC,$data);
  183. return $data[0];
  184. }
  185. return [];
  186. }
  187. /**
  188. * Notes:入队
  189. * User: wsc
  190. * Time: 2020/6/19 11:40
  191. * @param $uid
  192. * @param $money
  193. * @return bool
  194. */
  195. public function toJoinQueue($uid,$level,$money){
  196. $pass =$this->verifyIsPass($uid);
  197. if($pass<0){
  198. $this->joinBTFQueue($uid,$level,$money);//入备选池
  199. return false;
  200. }
  201. if($level<=$this->cfg['minLv']){//是否小于最小可偷等级
  202. return false;
  203. }
  204. oo::commonOprRedis('server')->zDelete(akey::userLevelStealListBTF($level),$uid);//备选池清理
  205. $minMoney = $this->joinMinMoney($level);//oo::commonOprModel('level')->getLevelConf($level);
  206. if($money<$minMoney){//是否达到可被偷的钱数标准
  207. return false;
  208. }
  209. oo::commonOprRedis('server')->zAdd(akey::userLevelStealList($level),intval($money),$uid);//入队
  210. return true;
  211. }
  212. /**
  213. * Notes:出队
  214. * User: wsc
  215. * Time: 2020/6/28 12:18
  216. * @param $uid
  217. * @param $level
  218. * @param $money
  219. * @return bool
  220. */
  221. public function toOutQueue($uid,$level,$money){
  222. $minMoney = $this->joinMinMoney($level);//oo::commonOprModel('level')->getLevelConf($level);
  223. $res1 = $money<$minMoney?true:false;//当前剩余钱是否满足出队条件
  224. $queueMoney = intval(oo::commonOprRedis('server')->zScore(akey::userLevelStealList($level),$uid));
  225. if($queueMoney/10>$money){
  226. oo::commonOprRedis('server')->zDelete(akey::userLevelStealList($level),$uid);//出队主池
  227. $this->joinBTFQueue($uid,$level,$money);//进入备选
  228. $bindUlist =oo::commonOprRedis('server')->sMembers(okeys::richestKingTo($uid));
  229. if (!empty($bindUlist)) foreach ($bindUlist as $buid){ oo::commonOprModel('user')->getRichestKing($buid,0,true);}
  230. }
  231. if($res1){
  232. oo::commonOprRedis('server')->zDelete(akey::userLevelStealList($level),$uid);//出队主池
  233. oo::commonOprRedis('server')->zDelete(akey::userLevelStealListBTF($level),$uid);//出队备选池
  234. return true;
  235. }
  236. $res2 = $this->verifyIsPass($uid);
  237. if($res2<0){//当前状态是否满足出队条件
  238. oo::commonOprRedis('server')->zDelete(akey::userLevelStealList($level),$uid);//出队
  239. $this->joinBTFQueue($uid,$level,$money);//进入备选
  240. return true;
  241. }
  242. return false;
  243. }
  244. /**
  245. * Notes:入备选池
  246. * User: wsc
  247. * Time: 2020/6/28 15:48
  248. * @param $uid
  249. * @param $level
  250. * @param $money
  251. * @return bool
  252. */
  253. public function joinBTFQueue($uid,$level,$money){
  254. $minMoney = $this->joinMinMoney($level);//oo::commonOprModel('level')->getLevelConf($level);
  255. if($money<$minMoney||$level<=$this->cfg['minLv']){//是否达到可被偷的钱数标准,或小于最小可偷等级
  256. return false;
  257. }
  258. oo::commonOprRedis('server')->zAdd(akey::userLevelStealListBTF($level),intval($money),$uid);//入队备选池
  259. }
  260. /**
  261. * Notes:双池出队
  262. * User: wsc
  263. * Time: 2020/7/4 14:55
  264. * @param $uid
  265. * @param $level
  266. */
  267. public function outAllQueue($uid,$level){
  268. if($level>0){
  269. oo::commonOprRedis('server')->zDelete(akey::userLevelStealList($level),$uid);//偷选池出队
  270. oo::commonOprRedis('server')->zDelete(akey::userLevelStealListBTF($level),$uid);//偷备选池出队
  271. }
  272. }
  273. /**
  274. * Notes:定时备选入队
  275. * User: wsc
  276. * Time: 2020/6/28 16:23
  277. * @return bool
  278. */
  279. public function cronToJoinQueue(){
  280. $maxNum = intval(oo::commonOprModel('readconfig')->getCon('basic','curMaxLevel'));
  281. for($lv=$this->cfg['minLv'];$lv<$maxNum;$lv++){
  282. $bkey = akey::userLevelStealListBTF($lv);
  283. $list = oo::commonOprRedis('server')->zRevRange($bkey,0,-1,true);
  284. if(!empty($list)&&is_array($list)){
  285. foreach ($list as $k=>$v){
  286. $info = oo::commonOprModel('member')->getUserAssetsInfo($k);
  287. if($info['levelId']!=$lv){
  288. $this->outAllQueue($k,$lv);
  289. }
  290. $this->toJoinQueue($k,$info['levelId'],$info['money']);//尝试入队
  291. }
  292. }
  293. }
  294. return true;
  295. }
  296. /**
  297. * Notes:是否满足入队条件
  298. * User: wsc
  299. * Time: 2020/6/19 11:41
  300. * @param $uid
  301. * @return bool
  302. */
  303. public function verifyIsPass($uid,$f=0){
  304. $nowDay = date("Ymd",time());
  305. $time = oo::commonOprModel('activitynew')->getEndproteTime($uid, $nowDay);
  306. if(!empty($time)&&$time>time()){//在保护期
  307. return -1;
  308. }
  309. $beStealNum = oo::commonOprRedis('server')->hGet(akey::beStealNumHashKey($nowDay),$uid);
  310. if($f==1){//好友额外10次
  311. $this->cfg['maxLimit'] = $this->cfg['maxLimit']+10;
  312. }
  313. if($beStealNum>=$this->cfg['maxLimit']){//已达被偷最大次数
  314. return -2;
  315. }
  316. $bindNum = oo::commonOprRedis('server')->sSize(okeys::richestKingTo($uid));
  317. $maxNum = intval(oo::commonOprModel('readconfig')->getCon('richestKing','MaxNum'));
  318. if($bindNum>=$maxNum){//超过最大绑定数
  319. return -3;
  320. }
  321. $result = oo::commonOprRedis('common')->get(okeys::beStealLock($uid));
  322. if($result){//是否被人锁定了
  323. return -4;
  324. }
  325. return 1;
  326. }
  327. //清理已绑定的richking
  328. public function outRichking($uid){
  329. $level = oo::commonOprModel('member')->getUserLevelId($uid);
  330. oo::commonOprRedis('server')->zDelete(akey::userLevelStealList($level),$uid);//出队主池
  331. $bindUlist =oo::commonOprRedis('server')->sMembers(okeys::richestKingTo($uid));
  332. if (!empty($bindUlist)) foreach ($bindUlist as $buid){ oo::commonOprModel('user')->getRichestKing($buid,0,true);}
  333. }
  334. //入队最少金币数
  335. public function joinMinMoney($lv){
  336. $levelInfo = oo::commonOprModel('level')->getLevelConf($lv);
  337. // $money = intval($levelInfo['minMoney']);
  338. if($lv>=200){
  339. $money = intval($levelInfo['minMoney'])*0.2;
  340. }else if($lv>=101){
  341. $money = intval($levelInfo['minMoney'])*0.5;
  342. }else if($lv>=51){
  343. $money = intval($levelInfo['minMoney'])*0.8;
  344. }else{
  345. $money = intval($levelInfo['minMoney']);
  346. }
  347. return $money;
  348. }
  349. /**
  350. * Notes:设置保护时间
  351. * User: wsc
  352. * Time: 2020/6/19 14:34
  353. * @param $uid
  354. * @param $time
  355. * @return bool
  356. */
  357. public function setProteTime($uid,$time){
  358. $now = time();
  359. $nowDay = date("Ymd",$now);
  360. $oldTime = oo::commonOprModel('activitynew')->getEndproteTime($uid, $nowDay);
  361. if($oldTime>$now&&$time<($oldTime-$now)){//不做处理
  362. // $ovTime = 0;
  363. return true;
  364. }else{
  365. $ovTime = $now+$time;
  366. }
  367. oo::async()->add("oo::commonOprModel('steal')->outRichking",[$uid]);//异步推送更换king,加速响应
  368. $newDay = date("Ymd",$ovTime);//要设置的时间
  369. if($newDay>$nowDay){//跨天
  370. oo::commonOprModel('activitynew')->upEndproteTime($uid, $newDay, $ovTime);
  371. $key = oo::commonOprModel('activitynew')->getEndproteTimeKey($uid, $newDay);
  372. $nlen = oo::commonOprRedis('server')->hLen($key);
  373. if($nlen<2){//第一次设置过期,减少数据堆积
  374. oo::commonOprModel('activitynew')->upEndproteTimeExpire($uid, $newDay, strtotime($newDay)+86400-1);
  375. }
  376. }
  377. $res = oo::commonOprModel('activitynew')->upEndproteTime($uid, $nowDay, $ovTime);
  378. $key = oo::commonOprModel('activitynew')->getEndproteTimeKey($uid, $nowDay);
  379. $len = oo::commonOprRedis('server')->hLen($key);
  380. if($len<2){//第一次设置过期,减少数据堆积
  381. oo::commonOprModel('activitynew')->upEndproteTimeExpire($uid, $nowDay, strtotime($nowDay)+86400-1);
  382. }
  383. $info = oo::commonOprModel('member')->getUserAssetsInfo($uid);
  384. $this->toOutQueue($uid,$info['levelId'],$info['money']);
  385. return $res;
  386. }
  387. /**
  388. * Notes:设置被偷次数
  389. * User: wsc
  390. * Time: 2020/6/19 15:45
  391. * @param $uid
  392. * @return int
  393. */
  394. public function setBeStealNum($uid){
  395. $nowDay = date("Ymd",time());
  396. $num = oo::commonOprRedis('server')->hIncrBy(akey::beStealNumHashKey($nowDay),$uid,1);
  397. $len = oo::commonOprRedis('server')->hLen(akey::beStealNumHashKey($nowDay));
  398. if($len<2){//第一次设置过期,减少数据堆积
  399. oo::commonOprRedis('server')->expireAt(akey::beStealNumHashKey($nowDay),oo::redisRandomExpire(strtotime($nowDay)+86400-1));
  400. }
  401. return $num;
  402. }
  403. //========================================================================================
  404. /**
  405. * Notes:获取偷取对象数据
  406. * User: wsc
  407. * Time: 2021/2/23 18:22
  408. * @param $uid
  409. * @return array ["toUid"=>"273230","nick"=>"Vita","s_picture"=>"https://...","u_flag"=>1,"vip"=>0,"vipLv"=>0,"vipExpire"=>0,"avatar"=>0,"coins"=>568000]
  410. */
  411. public function getStealData($uid){
  412. $dataInfo= [];
  413. $key = okeys::richestKingInfo($uid);
  414. $info = oo::commonOprRedis('usercache')->hGetAll($key);
  415. if(!empty($info)){
  416. return $info;
  417. }
  418. // $bet = oo::commonOprRedis('usercache')->get(okeys::curUserBet($uid)) ?? 1;
  419. $userInfo = oo::commonOprModel('member')->getUserAssetsInfo($uid);
  420. $kingInfo = $this->getBindKing($uid,$userInfo['levelId']);
  421. $king = isset($kingInfo['uid'])?$kingInfo['uid']:'';
  422. if(!$king){
  423. $robot = oo::commonOprModel('robot')->getAllRobot();
  424. $king = $robot[array_rand($robot,1)];
  425. // $coinConfig = oo::commonOprModel('level')->getCoinConfig(min($userInfo['levelId'],50));
  426. // $coinConfig = json_decode($coinConfig,true);
  427. $randMoney = $userInfo['levelId']>9?mt_rand(50000,150000):mt_rand(5000,50000);
  428. $money = $this->getMaxRaticMoney($userInfo['levelId'])*0.07+$randMoney;
  429. $money = oo::Thousand($money);
  430. $isrobot = 1;
  431. }else{
  432. // $money = $this->getStealMoney($uid,$kingInfo['money'],$king,$userInfo['levelId']);
  433. $money = oo::Thousand($kingInfo['money']);
  434. $isrobot =0;
  435. }
  436. $dataInfo = oo::commonOprModel('member')->getUserLevel($king);
  437. if($isrobot){
  438. $dataInfo['levelId'] = max(3,$userInfo['levelId']+mt_rand(-3,5));
  439. for($i=0;$i<5;$i++){
  440. $r1 = mt_rand(0,4);
  441. $r2 = mt_rand($r1,4);
  442. $r3= $r2!=$r1?1:0;
  443. $element[] = ["id"=>$i+1,"level"=>$r1,"maxLevel"=>$r2,"status"=>$r3];
  444. }
  445. $dataInfo['element'] = json_encode($element);
  446. }else{
  447. $dataInfo['element'] =json_encode($dataInfo['element']);
  448. }
  449. $userInfoKing = oo::commonOprModel('member')->getUserInfo($king);
  450. $dataInfo['toUid'] = $king;
  451. $dataInfo['nick'] = oo::commonOprModel('member')->getUserFirstName($userInfoKing['nick']) ?? 'crazyKing';
  452. $dataInfo['s_picture'] = $userInfoKing['s_picture'];
  453. $dataInfo['u_flag'] = $userInfoKing['u_flag'];
  454. $dataInfo['vip'] = $userInfoKing['vip'];
  455. $dataInfo['vipLv'] = $userInfoKing['vipLv'];
  456. $dataInfo['vipExpire'] = $userInfoKing['vip_expire'];
  457. $dataInfo['avatar'] = intval($userInfoKing['avatar']);
  458. $dataInfo['coins'] = $money;
  459. $dataInfo['isrobot'] = $isrobot;
  460. oo::commonOprRedis('usercache')->hMset($key,$dataInfo);
  461. oo::commonOprRedis('usercache')->expire($key,3*3600);
  462. return $dataInfo;
  463. }
  464. /**
  465. * Notes:获取实际可偷总钱(弃用)
  466. * User: wsc
  467. * Time: 2021/2/5 18:34
  468. * @param $uid
  469. * @param $kingMoney
  470. * @param $king
  471. * @param $levelId
  472. * @return int
  473. */
  474. public function getStealMoney($uid,$kingMoney,$king,$levelId){
  475. $toUserLevelInfo = oo::commonOprModel('member')->getUserLevel($king);
  476. $levelCfg = oo::commonOprModel('level')->getLevelConf($levelId);
  477. $s = $levelId-$toUserLevelInfo['levelId'];
  478. if($s>=0){
  479. $a=1;
  480. }else if($s>-10){
  481. $a=1/(abs($s));
  482. }else{
  483. $a=0.1;
  484. }
  485. $money = $kingMoney*0.75*$a;
  486. $friendlist = oo::commonOprModel('friend')->getUserAllFriend($uid);
  487. if(!in_array($king,$friendlist)){
  488. $money = 0.5*$money;
  489. }
  490. $rand_money = mt_rand(1,50)*1000;
  491. if($levelId<=30){
  492. if($money>$levelCfg['sumMoney']/10){
  493. $money = $levelCfg['sumMoney']/10-$rand_money;
  494. }
  495. }else if ($levelId<=100){
  496. $nlv = $levelId-20;
  497. if($money>$levelCfg['sumMoney']/$nlv){
  498. $money = $levelCfg['sumMoney']/$nlv-$rand_money;
  499. }
  500. }else if ($levelId<=120){
  501. $nlv = $levelId*5-420;
  502. if($money>$levelCfg['sumMoney']/$nlv){
  503. $money = $levelCfg['sumMoney']/$nlv-$rand_money;
  504. }
  505. }else if ($levelId<=200){
  506. $nlv = $levelId*10-1025;
  507. if($money>$levelCfg['sumMoney']/$nlv){
  508. $money = $levelCfg['sumMoney']/$nlv-$rand_money;
  509. }
  510. }else{
  511. $nlv = $levelId*20-3025;
  512. if($money>$levelCfg['sumMoney']/$nlv){
  513. $money = $levelCfg['sumMoney']/$nlv-$rand_money;
  514. }
  515. }
  516. return intval($money);
  517. }
  518. /**
  519. * Notes:陌生人rachking 的钱是否满足被偷条件/ 好友钱处理
  520. * User: wsc
  521. * Time: 2021/4/20 17:22
  522. * @param $levelId
  523. * @param $kingInfo
  524. * @return bool|float|int
  525. */
  526. public function isPassMoney($levelId,$kingInfo,$isfriend=0){
  527. $ratioProCfgJson = oo::commonOprRedis('config')->get(okeys::stealRaticProCfg());
  528. $ratioProCfg = $ratioProCfgJson?json_decode($ratioProCfgJson,true):'';
  529. $ratioProCfg = !empty($ratioProCfg)?$ratioProCfg:$this->ratioPro;
  530. if(!$isfriend){
  531. $ratioPro = array_column($ratioProCfg,'weight','id');
  532. $id = funs::get_randByProb($ratioPro);
  533. $ratioCfg =array_column($ratioProCfg,null,'id');
  534. if($ratioCfg[$id]['isRobot']){
  535. return 0;
  536. }
  537. $ratio =$ratioCfg[$id]['bet']?$ratioCfg[$id]['bet']:1;
  538. }else{
  539. $ratioPro = array_column($ratioProCfg,'f_weight','id');
  540. $id = funs::get_randByProb($ratioPro);
  541. $ratioCfg =array_column($ratioProCfg,null,'id');
  542. $ratio =$ratioCfg[$id]['bet']?$ratioCfg[$id]['bet']:1;
  543. }
  544. $money = $kingInfo['money']*0.75;
  545. $rn = 100;
  546. if($levelId<9){
  547. $rn=5;
  548. }
  549. $MaxRaticMoney = $this->getMaxRaticMoney($levelId);
  550. if(!$isfriend){//非好友
  551. if($money<$MaxRaticMoney*$ratio){
  552. return 0;
  553. }else{
  554. $MaxRaticMoney = $MaxRaticMoney*$ratio;
  555. }
  556. }else{
  557. if($money<=$MaxRaticMoney*0.07){
  558. return 0;
  559. }
  560. else if($money>$MaxRaticMoney){//rachking的全部*0.75 大于$MaxRaticMoney
  561. $MaxRaticMoney = $MaxRaticMoney*$ratio;
  562. }
  563. else{
  564. $rn=1;
  565. $MaxRaticMoney = $money;
  566. }
  567. }
  568. $randMoney = mt_rand(1,$rn)*1000;
  569. $lastMoney= $MaxRaticMoney-$randMoney>0?$MaxRaticMoney-$randMoney:$MaxRaticMoney;
  570. return $lastMoney;
  571. }
  572. public function getMaxRaticMoney($levelId){
  573. // $cfg = oo::cfg("stealattack")["stealMaxMoney"];
  574. $key =okeys::stealMaxMoney();
  575. $maxMoney=oo::commonOprRedis('common')->hGet($key,$levelId);
  576. if(!$maxMoney){
  577. $tb = otable::commonConfig();
  578. $sql = "SELECT * FROM {$tb} where type='stealMaxMoney'";
  579. $conf = oo::commonOprDb('config')->getOne($sql,1);
  580. if(!empty($conf)){
  581. $confArr =json_decode($conf['conf']);
  582. $confArr2= array_column($confArr,'maxCoin','levelId');
  583. oo::commonOprRedis('common')->hMset($key,$confArr2);
  584. $maxMoney = $confArr2[$levelId];
  585. }
  586. }
  587. return $maxMoney;
  588. }
  589. public function getMaxRaticMoney_old($levelId){
  590. $levelCfg = oo::commonOprModel('level')->getLevelConf($levelId);
  591. if($levelId<=8){
  592. $nlv= $levelId+2;
  593. }
  594. else if($levelId<=30){
  595. $nlv = 10;
  596. }else if ($levelId<=100){
  597. $nlv = $levelId-20;
  598. }else if ($levelId<=120){
  599. $nlv = $levelId*5-420;
  600. }else if ($levelId<=200){
  601. $nlv = $levelId*10-1025;
  602. }else{
  603. $nlv = $levelId*20-3025;
  604. }
  605. $MaxRaticMoney = $levelCfg['sumMoney']/$nlv;//金币上限
  606. return $MaxRaticMoney;
  607. }
  608. public function toSteal($uid,$levelId,$bet){
  609. $data = [];
  610. $bet = max($bet,1);
  611. $kingInfoBash =$kingInfo = $this->getStealData($uid);
  612. $kingInfoBash['element'] = $kingInfo['element'] = json_decode($kingInfo['element'],true);
  613. $toUid = $kingInfo['toUid'];
  614. $money = intval($kingInfo['coins']);
  615. //临时偷锁(用作极端情况同偷一人时是否真偷的依据)
  616. $lockRes = oo::commonOprRedis('common')->setnx(okeys::beStealLock($toUid),$uid);
  617. oo::commonOprRedis('common')->expire(okeys::beStealLock($toUid),300);
  618. $kingInfo['lockRes'] = $lockRes;
  619. //通知其他人更换king
  620. if(!$kingInfo['isrobot']){
  621. $this->clearOtherBind($toUid,$uid);
  622. }
  623. //获取坑位奖励信息
  624. $stealDataInfo = $this->getOptMoney($uid,$money,$bet,$levelId);//获取坑位金币分布
  625. $stealData = $stealDataInfo[0];
  626. $isPerfect=intval($stealData[2])>0?1:0;//是否完美偷
  627. $petStealInfo = oo::commonOprModel('pet')->usePetSkill($uid,1,array_sum($stealData) * $bet);
  628. $optInfo = $this->getOptInfo($uid,$levelId,$stealData,$petStealInfo,$bet);//获取坑位详情(包括金币及宝箱,空,宠物加成)
  629. $kingInfo['optInfo'] = $optInfo;
  630. $kingInfo['steal_result'] = $stealDataInfo[1];
  631. //发奖
  632. $data = $this->sendStealReward($uid,$kingInfo);
  633. $data['kingInfo'] = $kingInfoBash;
  634. //返回奖励信息组装
  635. $data['petCoinsPercent'] = $petStealInfo[1]?$petStealInfo[1]:0;//宠物加成率
  636. $data['optInfo'] = $optInfo;
  637. $data['isPerfect'] = $isPerfect;
  638. return $data;
  639. }
  640. /**
  641. * Notes:发放偷奖励
  642. * User: wsc
  643. * Time: 2021/2/26 15:27
  644. * @param $uid
  645. * @param $kingInfo
  646. * @return mixed
  647. */
  648. public function sendStealReward($uid,$kingInfo){
  649. $sumStealMoney = 0;//已乘倍率的偷取金币总数
  650. $sumPetStealMoney =0;//已乘倍率的宠物偷取金币总数
  651. $isPerfect =1;//是否完美偷
  652. $treasureType=0;//宝箱类型
  653. $toUid = $kingInfo['toUid'];
  654. $optInfo = $kingInfo['optInfo'];
  655. foreach ($optInfo as $k=>$v){
  656. $sumStealMoney += $v['coins'];
  657. $sumPetStealMoney+=$v['pet'];
  658. $bet = max($v['bet'],1);
  659. if($v['coins']==0){
  660. $isPerfect=0;
  661. }
  662. if(intval($v['treasureType'])>0){
  663. $treasureType = intval($v['treasureType']);
  664. }
  665. }
  666. $basicsStealMoney=$sumStealMoney/$bet;//人偷基数
  667. $basicsPetStealMoney=$sumPetStealMoney/$bet;//宠物偷基数
  668. $steal_num = $basicsStealMoney+$basicsPetStealMoney;//被偷总基数
  669. $userGetCoinNum = $sumStealMoney+$sumPetStealMoney;//用户总获得金币数
  670. $data['haveMinePlace'] = 0;//有雷的坑位
  671. //--金币发放--
  672. if($kingInfo['isrobot'] == 1){
  673. oo::commonOprModel('statistics')->addWarning($uid,"返回RichestKing数据失败,追加机器人:{$toUid} 金币 {$steal_num}",0,$steal_num);
  674. oo::commonOprModel('member')->optProperty($uid,array('money'=>$userGetCoinNum),'+',9,"机器人补发:偷到用户:{$toUid}的金币,基数:{$steal_num},宠物:{$basicsPetStealMoney},bet:{$bet}");
  675. $systemPay = true;
  676. }else{
  677. $ttl = oo::commonOprModel('activitynew')->getEndproteTime($toUid)-time();
  678. if($ttl > 0||!$kingInfo['lockRes']){
  679. oo::commonOprModel('member')->optProperty($uid,array('money'=>$userGetCoinNum),'+',10,"偷到用户:{$toUid}的金币,用户被保护,系统发放");
  680. $systemPay = true;
  681. }else{
  682. $userMoney = oo::commonOprModel('member')->getUserAssetsInfo($toUid)['money'];
  683. $n=intval($sumPetStealMoney)>0?0.85:0.75;
  684. $canBeSteal = ceil($userMoney*$n);//用户可被偷的最大钱数
  685. if($canBeSteal>$steal_num){//用户钱够被偷
  686. $beStealMoney =$steal_num;//实际被偷
  687. $petSteal = $basicsPetStealMoney;
  688. $personSteal = $basicsStealMoney;
  689. }else{//用户钱不够被偷
  690. $beStealMoney =$canBeSteal;//实际被偷
  691. $petSteal = 0;
  692. $personSteal = $canBeSteal;
  693. }
  694. oo::commonOprModel('member')->optProperty($toUid,array('money'=>$beStealMoney),'-',7,"被用户:{$uid}偷取金币,被用户偷了{$personSteal},宠物偷了{$petSteal}");
  695. oo::commonOprModel('member')->optProperty($uid,array('money'=>$beStealMoney),'+',4,"偷到用户:{$toUid}的金币");
  696. //其余部分系统补
  697. $fromSys = $userGetCoinNum -$beStealMoney;
  698. if($fromSys>0){
  699. oo::commonOprModel('member')->optProperty($uid,array('money'=>$fromSys),'+',10,"倍率偷取:系统补发(当前倍率:{$bet},偷到用户{$beStealMoney},宠物偷了{$basicsPetStealMoney},系统补发{$fromSys},实际发放{$userGetCoinNum})");
  700. }
  701. //被偷者大于1.8.5且有雷,返回雷所在坑位
  702. $toVersion = oo::commonOprModel('member')->getUserInfo($toUid)['version'];
  703. if(oo::compareVersion($toVersion,'1.8.5')){
  704. $aid = oo::commonOprModel('activitynew')->activityLock($toUid,'change_collect');
  705. if($aid){
  706. $toUidItemInfo = oo::commonOprRedis('activity')->hGetAll(okeys::activityUserCollectChangeInfo($toUid,$aid));
  707. $data['haveMinePlace'] = intval($toUidItemInfo['place']);
  708. }
  709. }
  710. }
  711. }
  712. // VIP 加成
  713. $stealCoinsPro = oo::commonOprModel('newvip')->vipRewardConf($uid,'stealCoinsPro');
  714. $data['vipCoins']= $vipCoins = $sumStealMoney* $stealCoinsPro;
  715. $vipCoins > 0 && oo::commonOprModel('member')->optProperty($uid,['money'=>$vipCoins],'+',353,"VIP加成:偷取 {$toUid}");
  716. //金币爆炸活动加成
  717. $bet2 = oo::commonOprModel('activitynew')->getCoinBlastBetByType($uid,'steal');
  718. $data['coin_blast_Coins'] = $basicsStealMoney*$bet*$bet2;
  719. if($bet2>0){
  720. oo::commonOprModel('member')->optProperty($uid,array('money'=>$data['coin_blast_Coins']),'+',219,"偷取 {$toUid}");
  721. }
  722. //--宝箱发放--
  723. if($treasureType>0){
  724. oo::commonOprModel('member')->sendReward($uid,$treasureType,1,10,'偷挖坑出宝箱');
  725. }
  726. //--活动类--
  727. //通行证
  728. $data['trafficPermit'] = oo::commonOprModel('activitynew')->getUserActData($uid,'traffic_permit');
  729. oo::commonOprModel('activitynew')->addTrafficPermitNum($uid,3,$bet);//通行证加经验
  730. if($sumPetStealMoney>0){//存在宠物参与偷
  731. //通行证任务5
  732. oo::commonOprModel('activitynew')->addTrafficPermitNum($uid,5,$bet);
  733. //宠物参与统计
  734. $flag = (int)oo::commonOprRedis('statistics')->get(okeys::participationPetKey($uid, 1));
  735. oo::commonOprModel('currency')->participation($uid, 'steal', $flag);
  736. }
  737. //超级收集
  738. $ts=$isPerfect?1:2;
  739. $retData=oo::commonOprModel('activitynew')->setRateByDo($uid,'steal',$ts,$bet);
  740. if(oo::commonOprModel('activitynew')->activityLock($uid,'super_collect')){
  741. $symbol = oo::commonOprModel('activitynew')->getUserActData($uid,'super_collect');
  742. }
  743. $data['symbol'] = $symbol;
  744. // $data['stealAttack'] = oo::commonOprModel('activitynew')->getUserActData($uid,'steal');
  745. if(isset($retData["rankCollectNum"])&&$retData["rankCollectNum"]>0){
  746. $data['AcRankData'] = oo::commonOprModel('activitynew')->getUserActData($uid,'rank');
  747. $data['AcRankNoProData'] = oo::commonOprModel('activitynew')->getUserActData($uid,'rank2');
  748. }
  749. //--清理各类绑定信息--
  750. oo::commonOprRedis('common')->delete(okeys::beStealLock($toUid));//同偷一人极端情况锁
  751. if($kingInfo['isrobot'] == 1){
  752. oo::commonOprRedis('usercache')->delete(okeys::richestKingInfo($uid));//其他人绑定的king信息(new)
  753. }else{
  754. $this->clearBindKing($uid);//清除$uid与$toUid所有绑定关系,及绑定的用户信息
  755. }
  756. //--关联被偷用户处理--
  757. if(!$systemPay){
  758. //仇人列表追加
  759. oo::commonOprRedis('common')->zAdd(okeys::NewEnemyUidList($toUid),time(),$uid);
  760. //推消息
  761. $toUidInfo = oo::commonOprModel('member')->getUserAssetsInfo($toUid); //被偷用户资产
  762. $uidInfo = oo::commonOprModel('member')->getUserInfo($uid);
  763. $nick = oo::commonOprModel('member')->getUserFirstName($uidInfo['nick']);
  764. //挖雷奖励信息
  765. $data['preMineReward']=0;
  766. if(oo::compareVersion($uidInfo['version'],'1.8.5')&&$toUidItemInfo['spareNum']>0){
  767. $data['preMineReward'] =oo::commonOprModel('activitynew')->getCoinRewardByTypeAndLevel('change_collect',$toUidInfo['levelId']);
  768. }
  769. //被偷用户是否在线(发在线消息,设置保护时间)
  770. $isOnline = oo::commonOprModel('Workerman')->isUidOnline($toUid);
  771. if($isOnline){
  772. $nowDay = date("Ymd",time());
  773. $stealLimit= oo::commonOprRedis('server')->hGet(akey::beStealNumHashKey($nowDay),$uid);//当日被偷次数
  774. if($stealLimit>$this->cfg['proteCfg']['changeProteTimeLimit']){//被偷5次保护时间加长
  775. $times = $this->cfg['proteCfg']['changeOnlineProteTime']?$this->cfg['proteCfg']['changeOnlineProteTime']:720*60;
  776. }else{
  777. $times = $this->cfg['proteCfg']['onlineProteTime']?$this->cfg['proteCfg']['onlineProteTime']:30*60;
  778. }
  779. oo::commonOprModel('member')->setUserStealProtect($toUid,$times,true);
  780. oo::commonOprModel('Workerman')->push($toUid,ocmd::$SVR_SELF_RAID_MESSAGE,[
  781. 'nick' =>$nick,
  782. 'vip' =>$uidInfo['vip'],
  783. 'vipLv'=>$uidInfo['vipLv'],
  784. 'vipExpire'=>$uidInfo['vip_expire'],
  785. 'avatar'=>intval($uidInfo['avatar']),
  786. 'u_flag'=>$uidInfo['u_flag'],
  787. 'url'=>$uidInfo['s_picture'],
  788. 'coins'=>intval($beStealMoney),
  789. 'selfCoin'=>intval($toUidInfo['money']),
  790. 'petCoin'=>intval($basicsPetStealMoney)
  791. ],true);
  792. }else{
  793. $userKinfoInfo = oo::commonOprModel('member')->getUserInfo($uid);//被偷玩家基本信息
  794. $longTime = $this->cfg['proteCfg']['longNoOnlineTime']?$this->cfg['proteCfg']['longNoOnlineTime']:2880 * 60;
  795. if(time() - $userKinfoInfo['lasttime'] > $longTime){//长时间不在线
  796. $times = $this->cfg['proteCfg']['longNoOnlineProteTime']?$this->cfg['proteCfg']['longNoOnlineProteTime']:23*60*60;
  797. }else{
  798. $times = $this->cfg['proteCfg']['noOnlineProteTime']?$this->cfg['proteCfg']['noOnlineProteTime']:120*60;
  799. }
  800. oo::commonOprModel('member')->setUserStealProtect($toUid,$times,true);
  801. }
  802. oo::commonOprModel('member')->setUserStealProtect($uid,60);//偷别人保护一下自己
  803. oo::commonOprModel('push')->pushNews($toUid,'push.title.steal','push.content.steal', [$nick,funs::CoinFormat($beStealMoney)],'steal');
  804. oo::commonOprModel('message')->addMessage($toUid,$uid,$nick,$uidInfo['s_picture'],$beStealMoney,1,0,[1=>$basicsPetStealMoney]);
  805. //触发挖雷
  806. if(!oo::compareVersion($uidInfo['version'],'1.8.5')){//挖坑者小于1.8.5版本,自动100%触发
  807. oo::commonOprModel('activitynew')->sendItemReward($uid,$toUid,0,1);
  808. }
  809. }
  810. //记录类
  811. oo::commonOprModel('statistics')->attackStealSta('steal',$steal_num,$sumStealMoney,$uid);//打偷统计
  812. oo::commonOprRedis('User')->setex(okeys::LastStealCoinsNum($uid),$sumStealMoney,2*60*60);//用作广告加倍
  813. $data['petGetExp']=intval(oo::commonOprModel('pet')->addUserPetExpBy($uid,1,"stealAddExp",$bet,122,"偷宠物触发"));//宠物经验
  814. //数数事件-数据组装-完成偷
  815. $isFriend = oo::commonOprModel('friend')->isfriend($uid,$toUid);
  816. $petInfo = oo::commonOprModel('pet')->getUserPet($uid,1);
  817. $steal_pet_remain_time =intval($petInfo['feedEffecteTime'])>time()?$petInfo['feedEffecteTime']-time():0;
  818. $eventData=[
  819. "steal_target_user"=>$toUid,
  820. "steal_relation"=>$kingInfo['isrobot']?1:($isFriend?3:2),
  821. "steal_result"=>$kingInfo['steal_result'].",".$treasureType,
  822. "steal_bet"=>$bet,
  823. "steal_collect_symbol"=>intval($retData['collectNum']),
  824. "steal_rank_symbol"=>intval($retData['rankCollectNum']),
  825. "steal_coin_basic"=>$kingInfo['coins'],
  826. "steal_coin_final"=>$userGetCoinNum+intval($vipCoins)+intval($data['coin_blast_Coins']),//(人+宠物)+vip+金币爆炸活动
  827. "steal_pet_remain_time"=>$steal_pet_remain_time,
  828. "steal_pet_level"=>intval($petInfo['lv']),
  829. ];
  830. $data['eventData'] = $eventData;
  831. return $data;
  832. }
  833. //偷坑结果权重 a完美偷 b(65+25+其他) c(65+10+其他) d(25+其他+其他)
  834. public $stealRetWeight = [
  835. ["id"=>1,"slv"=>1,"elv"=>10,"weight"=>["a"=>25,"b"=>25,"c"=>25,"d"=>25]],
  836. ["id"=>2,"slv"=>11,"elv"=>50,"weight"=>["a"=>25,"b"=>25,"c"=>25,"d"=>25]],
  837. ["id"=>3,"slv"=>51,"elv"=>100,"weight"=>["a"=>20,"b"=>25,"c"=>30,"d"=>25]],
  838. ["id"=>4,"slv"=>101,"elv"=>150,"weight"=>["a"=>15,"b"=>25,"c"=>30,"d"=>30]],
  839. ["id"=>5,"slv"=>151,"elv"=>200,"weight"=>["a"=>15,"b"=>25,"c"=>30,"d"=>30]],
  840. ["id"=>6,"slv"=>201,"elv"=>1000,"weight"=>["a"=>15,"b"=>25,"c"=>30,"d"=>30]],
  841. ];
  842. //空位宝箱的权重分配 a空 b木箱子 c白银箱子 d黄金箱子
  843. public $boxRetWeight = [
  844. ["id"=>1,"weight"=>["a"=>100,"b"=>0,"c"=>0,"d"=>0]],
  845. ["id"=>2,"weight"=>["a"=>90,"b"=>7,"c"=>2,"d"=>1]],
  846. ["id"=>3,"weight"=>["a"=>85,"b"=>11,"c"=>3,"d"=>1]],
  847. ["id"=>4,"weight"=>["a"=>80,"b"=>14,"c"=>4,"d"=>2]],
  848. ["id"=>5,"weight"=>["a"=>75,"b"=>18,"c"=>5,"d"=>2]],
  849. ["id"=>6,"weight"=>["a"=>70,"b"=>21,"c"=>6,"d"=>3]],
  850. ];
  851. //倍率调整偷金币坑权重系数
  852. public $betRetWeight =[
  853. ["id"=>1,"bet"=>1,"coefficient"=>["a"=>1,"b"=>1,"c"=>1,"d"=>1]],
  854. ["id"=>2,"bet"=>2,"coefficient"=>["a"=>1,"b"=>1,"c"=>1,"d"=>1]],
  855. ["id"=>3,"bet"=>3,"coefficient"=>["a"=>1,"b"=>1,"c"=>1,"d"=>1]],
  856. ["id"=>4,"bet"=>5,"coefficient"=>["a"=>1,"b"=>1,"c"=>1,"d"=>1]],
  857. ["id"=>5,"bet"=>10,"coefficient"=>["a"=>1,"b"=>1.2,"c"=>1.2,"d"=>1.2]],
  858. ["id"=>6,"bet"=>20,"coefficient"=>["a"=>1,"b"=>1.2,"c"=>1.2,"d"=>1.2]],
  859. ["id"=>7,"bet"=>40,"coefficient"=>["a"=>1,"b"=>1.5,"c"=>1.5,"d"=>1.5]],
  860. ["id"=>8,"bet"=>80,"coefficient"=>["a"=>1,"b"=>1.5,"c"=>1.5,"d"=>1.5]],
  861. ["id"=>9,"bet"=>100,"coefficient"=>["a"=>1,"b"=>2,"c"=>2,"d"=>2]],
  862. ["id"=>10,"bet"=>200,"coefficient"=>["a"=>1,"b"=>3,"c"=>3,"d"=>3]],
  863. ];
  864. //倍率调整空位宝箱权重系数
  865. public $betBoxRetWeight =[
  866. ["id"=>1,"bet"=>1,"coefficient"=>["a"=>1,"b"=>0,"c"=>0,"d"=>0]],
  867. ["id"=>2,"bet"=>2,"coefficient"=>["a"=>1,"b"=>0,"c"=>0,"d"=>0]],
  868. ["id"=>3,"bet"=>3,"coefficient"=>["a"=>1,"b"=>1,"c"=>1,"d"=>1]],
  869. ["id"=>4,"bet"=>5,"coefficient"=>["a"=>1,"b"=>1,"c"=>1,"d"=>1]],
  870. ["id"=>5,"bet"=>10,"coefficient"=>["a"=>1,"b"=>1.2,"c"=>1.2,"d"=>1.2]],
  871. ["id"=>6,"bet"=>20,"coefficient"=>["a"=>1,"b"=>1.2,"c"=>1.2,"d"=>1.2]],
  872. ["id"=>7,"bet"=>40,"coefficient"=>["a"=>1,"b"=>1.5,"c"=>1.5,"d"=>1.5]],
  873. ["id"=>8,"bet"=>80,"coefficient"=>["a"=>1,"b"=>1.5,"c"=>1.5,"d"=>1.5]],
  874. ["id"=>9,"bet"=>100,"coefficient"=>["a"=>1,"b"=>2,"c"=>2,"d"=>2]],
  875. ["id"=>10,"bet"=>200,"coefficient"=>["a"=>1,"b"=>3,"c"=>3,"d"=>3]],
  876. ];
  877. /**
  878. * Notes:获取坑位钱分布
  879. * User: wsc
  880. * Time: 2020/10/12 14:48
  881. * @param $uid
  882. * @param $king
  883. * @param $money
  884. * @param $bet
  885. * @param $robot
  886. * @return array
  887. */
  888. public function getOptMoney($uid,$kingMoney,$bet,$levelId){
  889. $levelId = max($levelId,1);
  890. $bet = max($bet,1);
  891. $money = oo::Thousand($kingMoney);
  892. $probId = 1;//当前选中的权重id
  893. $prob = ["id"=>1,"slv"=>1,"elv"=>10,"weight"=>["a"=>500,"b"=>300,"c"=>100,"d"=>100]];
  894. $stealRetWeight = oo::commonOprModel('config')->getSlotRetConfig("stealRetWeight");
  895. $stealRetWeight =$stealRetWeight?$stealRetWeight:$this->stealRetWeight;
  896. if(!empty($stealRetWeight)){
  897. foreach ($stealRetWeight as $v){
  898. if($levelId>=$v['slv']&&$levelId<=$v['elv']){
  899. $prob = $v;
  900. $probId = $v['id'];
  901. break;
  902. }
  903. }
  904. }
  905. //调整偷到坑位结果权重=权重*系数
  906. $betRetWeight = oo::commonOprModel('config')->getSlotRetConfig("betRetWeight");
  907. $betRetWeight = $betRetWeight?$betRetWeight:$this->betRetWeight;
  908. $coefficientCfgArr = array_column($betRetWeight,'coefficient','bet');
  909. $coefficientCfg = !empty($coefficientCfgArr[$bet])&&is_array($coefficientCfgArr[$bet])?$coefficientCfgArr[$bet]:$betRetWeight[0]['coefficient'];
  910. foreach ($prob['weight'] as $k=>$v){
  911. $retWeight[$k] = $coefficientCfg[$k]*$v;
  912. }
  913. $ret1 = funs::get_randByProb($retWeight);
  914. switch ($ret1){
  915. case 'a'://完美偷
  916. $stealData = [$money*0.65,$money*0.25,$money*0.10];
  917. break;
  918. case 'b':// 65+25+其他
  919. $stealData = [$money*0.65,$money*0.25,0];
  920. break;
  921. case 'c'://65+10+其他
  922. $stealData = [$money*0.65,$money*0.10,0];
  923. break;
  924. case 'd'://25+10+其他
  925. $stealData = [$money*0.25,$money*0.10,0];
  926. break;
  927. default:
  928. $stealData = [$money*0.65,$money*0.10,0];
  929. $ret1="c";
  930. break;
  931. }
  932. array_push($stealData,$probId);
  933. return [$stealData,$ret1];
  934. }
  935. /**
  936. * Notes:坑位奖励详情
  937. * User: wsc
  938. * Time: 2021/2/23 15:50
  939. * @param $uid
  940. * @param $levelId
  941. * @param $stealData
  942. * @param $petStealCoin
  943. * @param $bet
  944. * @return array
  945. */
  946. public function getOptInfo($uid,$levelId,$stealData,$petStealInfo,$bet){
  947. //宠物偷信息
  948. $data = [];
  949. $optData = array_slice($stealData,0,3);//3个坑
  950. $petCoinsPercent = max($petStealInfo[1],0);//宠物加成系数
  951. foreach ($optData as $k=>$v){
  952. $data[$k]['bet'] = $bet;//倍率
  953. $data[$k]['coins'] = $v* $bet;//每个坑的钱,已加倍
  954. $data[$k]['pet'] = $v*$petCoinsPercent*$bet;//宠物触发的额外收益,已加倍
  955. $data[$k]['petFeed'] = 0;//宠物食物
  956. $data[$k]['treasureType'] =0;//宝箱类型 0空 1木 2白银 3黄金
  957. $data[$k]['optId'] =$k;//坑位
  958. //空位补充宝箱
  959. if($stealData[$k]==0&&$levelId > 2){
  960. $boxRetWeight = oo::commonOprModel('config')->getSlotRetConfig("boxRetWeight");
  961. $boxRetWeight = $boxRetWeight?$boxRetWeight:$this->boxRetWeight;
  962. $betBoxRetWeight = oo::commonOprModel('config')->getSlotRetConfig("betBoxRetWeight");
  963. $betBoxRetWeight = $betBoxRetWeight?$betBoxRetWeight:$this->betBoxRetWeight;
  964. $probInfo = array_column($boxRetWeight,'weight','id');
  965. $prob = !empty($probInfo[$stealData[3]])?$probInfo[$stealData[3]]:$boxRetWeight[0]['weight'];
  966. //调整偷到宝箱坑位结果权重=权重*系数
  967. $coefficientCfgArr = array_column($betBoxRetWeight,'coefficient','bet');
  968. $coefficientCfg = !empty($coefficientCfgArr[$bet])&&is_array($coefficientCfgArr[$bet])?$coefficientCfgArr[$bet]:$betBoxRetWeight[0]['coefficient'];
  969. $sum =0;
  970. foreach ($prob as $k2=>$v2){
  971. $coefficientCfg[$k2] = $coefficientCfg[$k2]?$coefficientCfg[$k2]:1;
  972. $retWeight[$k2] = $coefficientCfg[$k2]*$v2;
  973. if($retWeight[$k2]==0) $sum++;
  974. }
  975. if($sum==count($retWeight)){//避免配置异常参数bug
  976. $data[$k]['treasureType']=0;
  977. $ret1 ='a';
  978. }else{
  979. $ret1 = funs::get_randByProb($retWeight);
  980. }
  981. switch ($ret1){
  982. case 'a'://空
  983. $data[$k]['treasureType']=0;
  984. break;
  985. case 'b'://木宝箱
  986. $data[$k]['treasureType']=1;
  987. break;
  988. case 'c'://白银宝箱
  989. $data[$k]['treasureType']=2;
  990. break;
  991. case 'd'://黄金宝箱
  992. $data[$k]['treasureType']=3;
  993. break;
  994. default:
  995. $data[$k]['treasureType']=0;
  996. break;
  997. }
  998. }
  999. }
  1000. // shuffle($data);
  1001. return $data;
  1002. }
  1003. }