slot.php 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826
  1. <?php
  2. defined( 'IN_WEB') or die( 'Include Error!');
  3. /**
  4. * 老虎机
  5. */
  6. class ModelSlot{
  7. private $response = ['code'=>-1,'msg'=>'','data'=>[]];//返回信息
  8. protected $slot_type = [];
  9. public function getSlotConfig($levelId){
  10. $ret = oo::commonOprRedis('common')->hGet(okeys::slotConfig(),$levelId);
  11. if(!empty($ret)){
  12. return json_decode($ret,true);
  13. }
  14. //查询数据库概率
  15. $tb = otable::slotConfig();
  16. $sql = "select * from {$tb} where levelId={$levelId} limit 1";
  17. $conf = oo::commonOprDb('config')->getOne($sql, MYSQLI_ASSOC);
  18. oo::commonOprRedis('common')->hSet(okeys::slotConfig(),$levelId,$conf['slotpro']);
  19. $ret = json_decode($conf['slotpro'],true);
  20. return $ret;
  21. }
  22. public function getSlotActivityConfig($levelId){
  23. $ret = oo::commonOprRedis('common')->hGet(okeys::slotActivityConfig(),$levelId);
  24. if(!empty($ret)){
  25. return json_decode($ret,true);
  26. }
  27. //查询数据库概率
  28. $tb = otable::slotActivityConfig();
  29. $sql = "select * from {$tb} where levelId={$levelId} limit 1";
  30. $conf = oo::commonOprDb('config')->getOne($sql, MYSQLI_ASSOC);
  31. if(empty($conf)){
  32. $sql = "select * from {$tb} where levelId=1 limit 1";
  33. $conf = oo::commonOprDb('config')->getOne($sql, MYSQLI_ASSOC);
  34. }
  35. oo::commonOprRedis('common')->hSet(okeys::slotActivityConfig(),$levelId,$conf['data']);
  36. $ret = json_decode($conf['data'],true);
  37. return $ret;
  38. }
  39. public function get_rand($proArr,$float = false) {
  40. $result = '';
  41. if($float){
  42. foreach ($proArr as $k=>$v){
  43. $proArr[$k] = $v*10;
  44. }
  45. }
  46. $min = 1;
  47. //概率数组的总概率精度
  48. while (true){
  49. if(empty($proArr)){
  50. $result = 5; // 一个金币
  51. break;
  52. }
  53. $proSum = array_sum($proArr);
  54. $key = array_rand($proArr,1);
  55. if($proSum <= $min){
  56. $randNum = $min;
  57. }else{
  58. $randNum = random_int($min, $proSum);
  59. }
  60. if ($randNum <= $proArr[$key]) {
  61. $result = $key;
  62. break;
  63. }
  64. unset ($proArr[$key]);
  65. }
  66. return $result;
  67. }
  68. public function getSlotImgConfig($uid){
  69. $baseSlotImgConfig =[
  70. ['type'=>1,'imgId'=>1],
  71. ['type'=>2,'imgId'=>2],
  72. ['type'=>3,'imgId'=>3],
  73. ['type'=>1,'imgId'=>4],
  74. ['type'=>4,'imgId'=>5],
  75. ['type'=>5,'imgId'=>6],
  76. ];
  77. $version = oo::commonOprModel('user')->getUserVersion($uid);
  78. if(oo::compareVersion($version,'1.7.7')){
  79. $actInfo = oo::commonOprModel('activitynew')->getBindActivity($uid,'super_collect',true);
  80. if(!empty($actInfo)&&isset($actInfo['reward_conf'])){
  81. $reward_conf = json_decode($actInfo['reward_conf'],true);
  82. $groupId = intval($reward_conf['groupId']);
  83. if(in_array($groupId,[1,2,3,4,7])){
  84. $lock =true;
  85. }
  86. }
  87. }
  88. if(!$lock){
  89. $aid =oo::commonOprModel('activitynew')->activityLock($uid,'rank');
  90. if($aid){
  91. $actInfo = oo::commonOprModel('activitynew')->getActivity($aid);
  92. if($actInfo['reward_time']-10<time()){
  93. $lock =true;
  94. }
  95. }
  96. }
  97. if($lock){
  98. array_push($baseSlotImgConfig,['type'=>6,'imgId'=>7]);
  99. }
  100. if(oo::compareVersion($version,'1.8.5')){//小玩法收集
  101. $aid = oo::commonOprModel('activitynew')->getBindActivity($uid,'change_collect');
  102. if($aid){
  103. array_push($baseSlotImgConfig,['type'=>7,'imgId'=>8]);
  104. }
  105. }
  106. return $baseSlotImgConfig;
  107. }
  108. /**
  109. * 水果机配置,1.13.1版本水果机添加12格
  110. * @param int $levelId 玩家等级
  111. * @param string $version 版本, 2:表示新版12格水果机
  112. * Created on: 2021/7/15 12:12
  113. */
  114. public function getSlotTurnConfig($leveId, $version = ''){
  115. $key = okeys::slotTurntable($version);
  116. $redisCache = oo::commonOprRedis('common')->hGet($key,$leveId);
  117. if(!empty($redisCache)){
  118. return json_decode($redisCache,true);
  119. }
  120. $tbs = otable::slotTurntable($version);
  121. $sqls = "select * from {$tbs} where levelId= {$leveId} limit 1";
  122. $confs = oo::commonOprDb('config')->getOne($sqls, MYSQLI_ASSOC);
  123. oo::commonOprRedis('common')->hSet($key,$leveId,$confs['slotpro']);
  124. return json_decode($confs['slotpro'],true);
  125. }
  126. public function getSpinsTurnConfig($type){
  127. $key = okeys::spinsTurntable(1,$type);
  128. $redisCache = oo::commonOprRedis('common')->get($key);
  129. if(!empty($redisCache)){
  130. return json_decode($redisCache,true);
  131. }
  132. $tbs = otable::spinsTurntable();
  133. $sql = "select * from {$tbs} where levelId=1 AND type={$type} limit 1";
  134. $conf = oo::commonOprDb('config')->getOne($sql, MYSQLI_ASSOC);
  135. oo::commonOprRedis('common')->set($key,$conf['slotpro']);
  136. return json_decode($conf['slotpro'],true);
  137. }
  138. /**
  139. * 升级版大转盘配置
  140. * @param $levelId
  141. * @return mixed
  142. * Created by: Owen
  143. * Created on: 2019/12/5 16:33
  144. */
  145. public function getTurnConfigPlusConfig($levelId){
  146. $key = okeys::TurntableConfigPlus();
  147. $redisCache = oo::commonOprRedis('common')->hGet($key,$levelId);
  148. if(!empty($redisCache)){
  149. return json_decode($redisCache,true);
  150. }
  151. $tbs = otable::TurntableConfigPlus();
  152. $sql = "select * from {$tbs} where levelId={$levelId} limit 1";
  153. $conf = oo::commonOprDb('config')->getOne($sql, MYSQLI_ASSOC);
  154. oo::commonOprRedis('common')->hSet($key,$levelId,$conf['slotpro']);
  155. return json_decode($conf['slotpro'],true);
  156. }
  157. /**
  158. * 转转盘,2021/07/15 v1.13添加12格水果机
  159. * @param int $type 6是订阅会员免费转转盘
  160. * @param int $origType
  161. * @return array
  162. */
  163. public function actionTurnTable($uid,$type,$origType){
  164. $key = okeys::bigwheel($uid);
  165. $bigwheel = oo::commonOprRedis('common')->get($key);
  166. $flag = 0; //免费转
  167. if($bigwheel && $type == 2){
  168. $tpInfo = self::getTpInfo($uid);
  169. return oo::response(-2,[
  170. 'tpCountdown'=> $tpInfo['countdown'],
  171. 'tpInfo' => $tpInfo
  172. ],'您已经体验了一次了,请倒计时结束后在重试',true);
  173. }else if($type == 3){
  174. $flag = 1; //付费转
  175. $payWheel = oo::commonOprRedis('common')->hGetAll(okeys::bigwheelPay($uid));
  176. if(empty($payWheel)){
  177. return oo::response(-3,[],'请先购买');
  178. }else{
  179. $time = time();
  180. $keys = array_keys($payWheel);
  181. $run = $keys[0];
  182. $order_id = $payWheel[$keys[0]];
  183. $paymenttb = otable::payment($uid);
  184. $sql = " SELECT * FROM {$paymenttb} WHERE uid = {$uid} AND order_id = {$order_id} AND status = 2 LIMIT 1";
  185. $ret = oo::commonOprDb('payment')->getOne($sql,1);
  186. if(!empty($ret['use_time'])){ // 校验数据库
  187. oo::commonOprRedis('common')->hDel(okeys::bigwheelPay($uid),$run); // 删除redis
  188. return oo::response(-3,[],'请先购买');
  189. }
  190. $sql = " UPDATE {$paymenttb} SET use_time={$time} WHERE uid = {$uid} AND order_id = {$order_id} AND status = 2 LIMIT 1";
  191. oo::commonOprDb('payment')->query($sql); // 更新数据库
  192. oo::commonOprRedis('common')->hDel(okeys::bigwheelPay($uid),$run); // 删除redis
  193. }
  194. }
  195. $memberAssets = oo::commonOprModel('member')->getUserAssetsInfo($uid);
  196. $levelId = 1;
  197. if(!empty($memberAssets) && !empty($memberAssets['levelId'])){
  198. $levelId = $memberAssets['levelId'];
  199. }
  200. $version = oo::commonOprModel('user')->getUserVersion($uid);
  201. $newVer = oo::compareVersion($version,'1.13.0') ? '2' : '';
  202. $trun_arr = self::getSlotTurnConfig($levelId, $newVer);
  203. $arr = [];
  204. $luckNum = min(intval(oo::commonOprRedis('common')->get(okeys::bigwheelLuckNum($uid))),7);//幸运值
  205. foreach ($trun_arr as $val) {
  206. if($val['id']<$luckNum){
  207. // continue;
  208. }
  209. if($type == 3){
  210. $pro = floatval($val['pv']);
  211. }else if($origType == 5){
  212. $pro = isset($val['av']) ? floatval($val['av']) : floatval($val['v']);
  213. }else{
  214. $pro = floatval($val['v']);
  215. }
  216. if($pro > 0){
  217. $arr[$val['id']] = $pro;
  218. }
  219. }
  220. $res['rid'] = max(0,$this->get_rand($arr,true));
  221. //转盘得奖分布 统计
  222. oo::commonOprModel('statistics')->turnTablePrizeSta(($type == 6 ? 2 : $type),$levelId,$res['rid']);
  223. $tpDown = 86400;
  224. $vipInfo = oo::commonOprModel('newvip')->checkVip($uid);
  225. if($vipInfo['tpStatus'] > 0){
  226. $tpDown = 0;
  227. oo::commonOprRedis('common')->hIncrBy(okeys::vipTurnTable(),$uid,1);
  228. }
  229. $isDouble = 1;
  230. if($res['rid'] >=7 || $origType == 2){
  231. $isDouble = 0;
  232. }
  233. $res['prize'] = intval($trun_arr[$res['rid']]['prize']) * (($type==3)?10:1);
  234. $res['type'] = 1;
  235. $res['betRewardTime'] = 10;
  236. $res['tpCountdown'] = $tpDown;
  237. $res['nextTime'] = $tpDown + time();
  238. $res['feeTimes'] = self::getTurnTableFeeTimes($uid);
  239. $addRid = $flag ? 43 : 41;
  240. oo::commonOprModel('member')->optProperty($uid,array('money'=>$res['prize']),'+',$addRid,'大转盘摇奖');
  241. oo::commonOprRedis('usercache')->setex(okeys::TurntableBetReward($uid),$res['prize'],180);
  242. $val = $res['prize'].'#'.$res['rid'].'#'.$type.'#1';
  243. $type == 2 && oo::commonOprRedis('common')->setex($key,$val,$tpDown);
  244. if($type == 3){ //付费才给偷保护
  245. oo::commonOprModel('member')->setUserStealProtect($uid,intval(oo::commonOprModel('readconfig')->getCon('basic','payStealProtectTime')) * 60);
  246. }
  247. $memberAssets = oo::commonOprModel('member')->getUserAssetsInfo($uid);
  248. $res['lastMoney'] = $memberAssets['money'];
  249. $res['lastSpins'] = $memberAssets['spins'];
  250. $res['isDouble'] = $isDouble;
  251. $res['tpInfo'] = self::getTpInfo($uid);
  252. /**
  253. * 通行证任务7
  254. */
  255. $type == 3 && oo::commonOprModel('activitynew')->addTrafficPermitNum($uid,7);
  256. if($type == 3){
  257. if($luckNum>0){
  258. oo::commonOprRedis('common')->incrBy(okeys::bigwheelLuckNum($uid),-1);//幸运值-1
  259. }
  260. oo::commonOprModel('currency')->participation($uid, 'turntable', 1); //免费大转盘参与率
  261. }else{
  262. $n = ceil($luckNum/2);
  263. if($n>0){
  264. oo::commonOprRedis('common')->incrBy(okeys::bigwheelLuckNum($uid),-$n);//幸运值减半
  265. }
  266. oo::commonOprModel('currency')->participation($uid, 'turntable', 0); //付费大转盘参与率
  267. }
  268. if($type == 2){
  269. oo::commonOprRedis('Usercache')->zAdd(okeys::PushCrontab("TurnTable"),time() + 24 * 60 * 60,$uid);
  270. }
  271. //数数事件-点击水果机
  272. $arr =[2=>2,3=>4,4=>1,5=>1,6=>3];//映射
  273. $fruit_type = intval($arr[$origType]);
  274. if($type==6){
  275. $fruit_type=3;
  276. }
  277. $ssEventData =[
  278. "fruit_coin"=>$res['prize'],
  279. "fruit_result"=>$res['rid'],
  280. "fruit_type"=>$fruit_type
  281. ];
  282. oo::commonOprModel('ta')->setEventData($uid,'tap_fruit',$ssEventData);
  283. return oo::response(1,$res,'',true);
  284. }
  285. /**
  286. * 用户转盘信息
  287. * @param $uid
  288. * @return array
  289. * Created by: Owen
  290. * Created on: 2020/8/12 14:56
  291. */
  292. public function getTpInfo($uid){
  293. $key = okeys::bigwheel($uid);
  294. $payWheel = oo::commonOprRedis('common')->hGetAll(okeys::bigwheelPay($uid));
  295. if(!empty($payWheel)){
  296. $tpStatus = 4;
  297. }else{
  298. $bigWheel = oo::commonOprRedis('common')->get(okeys::bigwheel($uid));
  299. if(empty($bigWheel)){
  300. $tpStatus = 1;
  301. }else{
  302. $data = explode('#',$bigWheel);
  303. if(count($data) == 3 || count($data) == 5){
  304. $tpStatus = 2;
  305. }else{
  306. $tpStatus = 3;
  307. }
  308. }
  309. }
  310. $tpCountdown = oo::commonOprRedis('common')->ttl($key);
  311. return [
  312. 'feeTimes' => oo::commonOprModel('slot')->getTurnTableFeeTimes($uid),
  313. 'nextTime' => $tpCountdown + time(),
  314. 'countdown' => $tpCountdown,
  315. 'status' => $tpStatus,
  316. 'shareTimes'=> intval(oo::commonOprRedis('common')->hGet(okeys::fbTurnCount(),$uid)),
  317. ];
  318. }
  319. /**
  320. * 翻倍领取
  321. * @param $uid
  322. * @param $bet
  323. * @return string
  324. * Created by: Owen
  325. * Created on: 2019/12/5 19:43
  326. */
  327. public function getTurntableBetReward($uid,$bet = 0){
  328. $price = oo::commonOprRedis('usercache')->get(okeys::TurntableBetReward($uid));
  329. if(!$price){
  330. return oo::response(-2,[],'过期');
  331. }
  332. if(!$bet){
  333. $bet = oo::commonOprModel('readconfig')->getCon('basic','turntableBet');
  334. }
  335. $bet = $bet -1;
  336. oo::commonOprModel('member')->optProperty($uid,['money'=>$price*$bet],'+',41,'大转盘摇奖:倍率领取');
  337. oo::commonOprRedis('usercache')->delete(okeys::TurntableBetReward($uid));
  338. $memberAssets = oo::commonOprModel('member')->getUserAssetsInfo($uid);
  339. $res['lastMoney'] = $memberAssets['money'];
  340. $res['money'] = $price*$bet;
  341. return oo::response(1,$res,'',true);
  342. }
  343. /**
  344. * 付费转盘剩余次数
  345. * @param $uid
  346. * @return mixed
  347. * Created by: Owen
  348. * Created on: 2020/5/27 14:44
  349. */
  350. public function getTurnTableFeeTimes($uid){
  351. $configTimes = oo::commonOprModel('readconfig')->getCon('basic',"tpFeeTimes");
  352. $curTimes = oo::commonOprRedis('common')->get(okeys::TpFeeTimes($uid));
  353. return max(0,$configTimes-$curTimes);
  354. }
  355. //=======================================老虎机==================================================
  356. /**
  357. * Notes:新的老虎机旋转
  358. * User: wsc
  359. * Time: 2021/2/25 19:42
  360. * @param $uid
  361. * @param $multiple
  362. * @param int $maxBet
  363. * @param int $autoSpins
  364. * @param int $n
  365. * @return array
  366. */
  367. public function getShowNewSlot($uid,$multiple,$maxBet = 0,$autoSpins = 0,$n=0){
  368. $multiple = funs::bet($multiple);
  369. $actionSpinsNum = 1 * $multiple;
  370. $version = oo::commonOprModel('user')->getUserVersion($uid);
  371. //体力恢复及体力不足判断
  372. $refreshSpinsTime = max(oo::commonOprModel('user')->refreshSpins($uid,$multiple),0);
  373. $userAssetsInfo = oo::commonOprModel('member')->getUserAssetsInfo($uid);
  374. if($userAssetsInfo['spins'] <= 0 || $userAssetsInfo['spins'] < $actionSpinsNum){
  375. $dts =0;
  376. // $dts = max(0,oo::commonOprRedis('common')->ttl(okeys::SpeedUpSpins($uid)));
  377. // if($refreshSpinsTime<$dts){
  378. // $dts = $refreshSpinsTime/2;
  379. // }
  380. $this->response['code'] = -2;
  381. $this->response['msg'] = '体力不足';
  382. $this->response['data'] = ['curSpins'=>$userAssetsInfo['spins'],'lastTime'=>$refreshSpinsTime,'spinNextTime'=>$refreshSpinsTime+time()-$dts];
  383. return $this->response;
  384. }
  385. //扣除体力
  386. $userSpins = oo::commonOprModel('member')->optProperty($uid,['spins'=>$actionSpinsNum],'-',1,'摇奖扣除能量');
  387. if(is_bool($userSpins)){
  388. $userSpins =0;
  389. }
  390. // $userSpins = $userAssetsInfo['spins'] - $actionSpinsNum;
  391. //更换倍率缓存
  392. $curBet = oo::commonOprRedis('usercache')->get(okeys::curUserBet($uid));
  393. if($curBet != $multiple){
  394. oo::commonOprRedis('usercache')->set(okeys::curUserBet($uid),$multiple);
  395. }
  396. oo::commonOprRedis('usercache')->expire(okeys::curUserBet($uid),3600*2);
  397. $levelId = max($userAssetsInfo['levelId'],1);
  398. $maxSpins = oo::commonOprModel('member')->getLevelUpLimit($levelId,'spins') ?? 50;//体力恢复上限
  399. //收集活动
  400. $actInfo = oo::commonOprModel('activitynew')->getBindActivity($uid, 'super_collect', true);
  401. $actChildType =0;//活动子类型
  402. $otherData=[];
  403. if($actInfo){
  404. $aid = $actInfo['id'];
  405. $superCollectAid = $aid;
  406. oo::commonOprModel('activitynew')->refreshRid($uid, $actInfo, $userAssetsInfo['spins']);
  407. $actChildType = oo::commonOprModel('activitynew')->getCollectGroupType($uid);
  408. if(in_array($actChildType,[4,5])&&!oo::compareVersion($version,'1.8.6')){//排除偷收集,打收集配置在1.8.5版本带来的影响
  409. $actChildType=0;
  410. }
  411. $otherData['leftSpins'] = $userSpins; //用户剩余体力
  412. $otherData['rid'] = oo::commonOprRedis('activity')->get(okeys::userBindActRid($uid,$aid));//绑定活动奖励方案id
  413. $otherData['stage'] = oo::commonOprRedis('activity')->hGet(okeys::userActivityStageRate($uid,$aid),'stage');
  414. // $otherData['groupId'] = oo::commonOprModel('config')->getUserGroupIdByCid($uid, 5);
  415. $userDynamicsData = oo::commonOprModel('member')->getUserDynamicsData($uid);
  416. $userGroupId = explode(',',$userDynamicsData['groupId3']);
  417. if(empty($userGroupId)){
  418. $userGroupId = [0];
  419. }
  420. $otherData['groupId'] = $userGroupId;
  421. $otherData['aid'] = $aid;
  422. $otherData['actGroupId'] = json_decode($actInfo['reward_conf'], true)['groupId'] ?? 0;
  423. }
  424. if(in_array($actChildType,[0])){//无3个收集物的活动时
  425. $rankInfo = oo::commonOprModel('activitynew')->getBindActivity($uid,'rank',true);
  426. if($rankInfo&&$rankInfo['reward_time']>time()-5){//有排行榜活动并且在领奖期前
  427. $actChildType=1;
  428. }
  429. }
  430. $change =0;
  431. if(oo::compareVersion($version,'1.8.5')){//小玩法收集
  432. $aid2 = oo::commonOprModel('activitynew')->activityLock($uid,'change_collect');
  433. if($aid2){
  434. $change =1;
  435. }
  436. }
  437. //体力存钱罐活动
  438. $spinSafeAid = oo::compareVersion($version,'1.13.1') ? (int)oo::commonOprModel('activitynew')->activityLock($uid,'spin_safe') : 0;
  439. if($spinSafeAid){
  440. $change = $change ? 3 : 2;
  441. }
  442. //获取转动本次结果
  443. $slotResult = oo::commonOprModel('slotresult')->getSlotResult($uid,$levelId,$multiple,$actChildType,$change,$n,$otherData);
  444. //新手1级用户体力概率调整
  445. if($levelId == 1 && $userSpins < 5){
  446. $newcomerSpinNum = oo::commonOprRedis('User')->get(okeys::newcomerSpinNum($uid));
  447. if($newcomerSpinNum < 10){
  448. $spinsRand = intval(oo::commonOprRedis('User')->get(okeys::NewComerSpinRandNum($uid)));
  449. if($spinsRand > rand(0,100)){
  450. $newcomerSpins = true;
  451. $slotResult['type'] = 2;
  452. $slotResult['rid'] = 3;
  453. }
  454. oo::commonOprRedis('User')->setex(okeys::NewComerSpinRandNum($uid),$spinsRand + 34,84600);
  455. }
  456. }
  457. //返回数据结构
  458. $res = $slotResult;
  459. $prize = $slotResult['prize'];
  460. unset($res['prize']);
  461. $ssEventData=["slot_bet"=>$multiple];
  462. if($res['type'] == 1){ //加的是金币
  463. $ssEventData['slot_coin_basic'] = intval($prize['prize']);
  464. $res['num'] = intval($prize['prize']) * $multiple;
  465. $res['rewardId'] = intval($prize['rewardId']);
  466. oo::commonOprModel('member')->optProperty($uid,array('money'=>$res['num']),'+',1,'摇奖奖励金币:'.$res['rewardId']);
  467. //金币爆炸活动加金币
  468. $bet2 = oo::commonOprModel('activitynew')->getCoinBlastBetByType($uid,'slot');
  469. if($bet2>0){
  470. oo::commonOprModel('member')->optProperty($uid,array('money'=>$res['num']*$bet2),'+',219,'摇奖奖励金币:'.$res['rewardId']);
  471. $res['coin_blast_bet'] = $bet2;
  472. $ssEventData['slot_coin_blast_ratio']= $bet2;
  473. }
  474. $ssEventData['slot_coin_final'] = $res['num'] +$res['num']*$bet2;
  475. ////保险柜活动加金币储蓄
  476. //$res['curSafeBoxNum'] = oo::commonOprModel('activitynew')->actionSteelSafe($uid,$res['num']);
  477. }
  478. else if($res['type'] == 2){ //加的是体力
  479. $res['num'] = 10 * intval($multiple);
  480. $ssEventData['slot_spin']=$res['num'];
  481. $curSpins = oo::commonOprModel('member')->optProperty($uid,array('spins'=>$res['num']),'+',1,'摇奖奖励能量'.$res['num']);
  482. $userSpins = $curSpins;
  483. self::pauseSpinsTiming($uid,intval($curSpins),$version,$maxBet,$autoSpins,$maxSpins);//如果体力满了就在记录下时间,暂停倒计时
  484. if($newcomerSpins){
  485. oo::commonOprRedis('common')->incrBy(okeys::newcomerSpinNum($uid),$res['num']);
  486. oo::commonOprRedis('common')->expire(okeys::newcomerSpinNum($uid),oo::redisRandomExpire(86400));
  487. }
  488. //体力存钱罐活动加金币储蓄
  489. if($spinSafeAid){
  490. $res['pigBankData'] = [
  491. 'curSpinBoxNum' => oo::commonOprModel('activitynew')->actionSteelSafe($uid,3, $spinSafeAid, $multiple),
  492. 'SpinCollectNum' => 3,
  493. ];
  494. $ssEventData['slot_collect_symbol'] = $res['pigBankData']['curSpinBoxNum'];
  495. }
  496. }
  497. else if($res['type'] == 3){ // 偷
  498. $res['stealInfo'] = oo::commonOprModel('steal')->toSteal($uid,$levelId,$multiple);
  499. $stealEventData = $res['stealInfo']['eventData'];
  500. unset($res['stealInfo']['eventData']);
  501. // oo::commonOprModel('currency')->log($uid,"slot_steal","+",1,0,1,"转到偷");//转到偷流水
  502. }
  503. else if($res['type'] == 4){ //攻击
  504. $res['attackInfo'] = oo::commonOprModel('attack')->getDefaultAttackerInfo($uid,$levelId,$multiple);
  505. oo::commonOprRedis('usercache')->incrBy(okeys::slotTypeLimit($res['type'],$uid),1);//记录本次转到打,用于完成打验证
  506. oo::commonOprModel('currency')->log($uid,"slot_attack","+",1,0,1,"转到打:{$res['attackInfo']['toUid']}");//转到打流水
  507. }
  508. else if($res['type'] == 5){ //加的是盾牌
  509. $res['num'] = 1 * intval($multiple);
  510. $lastShield = intval($userAssetsInfo['shield']) + $res['num'];
  511. $shield = oo::commonOprModel('member')->getUserLevelUpLimit($uid,'shield');
  512. if($lastShield > $shield){ //盾牌最大为3 多出了加回体力
  513. $res['shieldSpins'] = $lastShield - $shield; //多出来的盾牌
  514. $needAddShield = $shield - intval($userAssetsInfo['shield']);// 需要增加的盾牌
  515. if($needAddShield > 0){
  516. oo::commonOprModel('member')->optProperty($uid,array('shield'=>$needAddShield),'+',1,'摇奖奖励盾牌体力');
  517. $ssEventData['slot_shield']=$needAddShield;
  518. }else if($needAddShield<0){//超出盾牌上限
  519. $needdelShield = $userAssetsInfo['shield'] -$shield;
  520. oo::commonOprModel('member')->optProperty($uid,array('shield'=>$needdelShield),'-',1,'盾牌突破上限扣除');
  521. }
  522. $curSpins = oo::commonOprModel('member')->optProperty($uid,array('spins'=>$res['shieldSpins']),'+',5,'摇奖盾牌转能量');
  523. if($res['shieldSpins']>0){
  524. if(!empty($superCollectAid)){ #盾牌转体力 且有收集活动时,“累计消耗体力”做一次减法
  525. $key = okeys::getCollectActSpins($superCollectAid);
  526. $decrSpins = -1 * $res['shieldSpins'];
  527. oo::commonOprRedis('activity')->hIncrBy($key, $uid, $decrSpins);
  528. }
  529. $ssEventData['slot_shield_tospin'] = $res['shieldSpins'];
  530. }
  531. $userSpins = $curSpins;
  532. self::pauseSpinsTiming($uid,intval($curSpins),$version,$maxBet,$autoSpins,$maxSpins);//如果体力满了就在记录下时间,暂停倒计时
  533. }else{
  534. oo::commonOprModel('member')->optProperty($uid,array('shield'=>$res['num']),'+',1,'摇奖奖励盾牌');
  535. $ssEventData['slot_shield']=$res['num'];
  536. }
  537. if($ssEventData['slot_shield']>0){
  538. oo::commonOprModel('attack')->JoinAttackQueue($uid,$levelId,$shield+intval($ssEventData['slot_shield']));
  539. }
  540. }
  541. else if($res['type'] == 6){//转到收集物
  542. $num = $res['rid']==14?3:($res['rid']==13?2:1);
  543. $res['specialNum'] = $num;
  544. $retData =oo::commonOprModel('activitynew')->setRateByDo($uid,'super_collect',$num,intval($multiple));
  545. $res['symbol'] = oo::commonOprModel('activitynew')->getUserActData($uid,'super_collect');
  546. $res['AcRankData'] = oo::commonOprModel('activitynew')->getUserActData($uid,'rank');
  547. $ssEventData['slot_collect_symbol'] = isset($retData['collectNum'])?intval($retData['collectNum']):0;
  548. $ssEventData['slot_rank_symbol'] = isset($retData['rankCollectNum'])?intval($retData['rankCollectNum']):0;
  549. $res['AcRankNoProData'] = oo::commonOprModel('activitynew')->getUserActData($uid,'rank2');
  550. }
  551. else if($res['type'] == 7){//转到小玩法收集
  552. $num = $res['rid']==17?3:($res['rid']==16?2:1);
  553. $res['specialNum'] = $num;
  554. $res['collectItemInfo'] =oo::commonOprModel('activitynew')->addCollectChangeItem($aid2,$uid,$num,intval($multiple));//添加收集物
  555. $ssEventData['slot_collect_symbol'] = isset($res['collectItemInfo']['count'])?intval($res['collectItemInfo']['count']):0;
  556. $actChildType =3;
  557. }
  558. else if($res['type'] == 8){//转到偷特殊
  559. $num = $res['rid']==19?2:1;
  560. $res['specialNum'] = $num;
  561. $retData =oo::commonOprModel('activitynew')->setRateByDo($uid,'steal_item',$num,intval($multiple));
  562. $res['symbol'] = oo::commonOprModel('activitynew')->getUserActData($uid,'super_collect');
  563. $ssEventData['slot_collect_symbol'] = intval($retData['collectNum']);
  564. }
  565. else if($res['type'] == 9){//转到打特殊
  566. $num = $res['rid']==21?2:1;
  567. $res['specialNum'] = $num;
  568. $retData =oo::commonOprModel('activitynew')->setRateByDo($uid,'attack_item',$num,intval($multiple));
  569. $res['symbol'] = oo::commonOprModel('activitynew')->getUserActData($uid,'super_collect');
  570. $ssEventData['slot_collect_symbol'] = intval($retData['collectNum']);
  571. }else if($res['type'] == 10){ //体力存钱罐
  572. $num = $res['rid']==22?1:2;
  573. $res['pigBankData'] = [
  574. 'curSpinBoxNum' => oo::commonOprModel('activitynew')->actionSteelSafe($uid, $num, $spinSafeAid, $multiple),
  575. 'SpinCollectNum' => $num,
  576. ];
  577. $ssEventData['slot_collect_symbol'] = $res['pigBankData']['curSpinBoxNum'];
  578. }
  579. //数数事件-转动老虎机
  580. $ssEventData["slot_result"] = $res['rid'];
  581. oo::commonOprModel('ta')->setEventData($uid,'slot_machine',$ssEventData);
  582. if($stealEventData){
  583. //数数事件-完成偷
  584. oo::commonOprModel('ta')->setEventData($uid,'steal',$stealEventData);
  585. }
  586. //权重修正
  587. oo::commonOprModel('slotresult')->delResSpinsLost($uid,$levelId,$multiple,$actChildType);//对比是否达到配置值,再处理体力消耗值
  588. oo::commonOprModel('slotresult')->changeResSpinsLost($uid,$res['rid'],$multiple);//旋转结果体力消耗(相当于反向幸运值)
  589. // oo::commonOprModel('slotresult')->addSlotExpendLog($uid, $multiple);//累计6小时累计旋转次数,旋转消耗体力
  590. //排行榜活动体力房间分配
  591. $aid = oo::commonOprModel('activitynew')->activityLock($uid,'rank');
  592. $aid && oo::commonOprRedis('activity')->hGet(okeys::activityUserRankBindRoomId($aid),$uid) && oo::commonOprRedis('Activity')->hIncrBy(okeys::UserRankSpendSpins($aid),$uid,$actionSpinsNum);
  593. //小于25点体力,恢复加倍活动判别
  594. // if($userSpins < 25){
  595. // oo::commonOprModel('activitynew')->doubleSpins($uid,$maxBet,$autoSpins);
  596. // }
  597. //对用户的一些处理
  598. if(intval($userSpins) < $maxSpins && $refreshSpinsTime){
  599. oo::commonOprRedis('common')->hSet(okeys::spinsFirebase(),$uid,$refreshSpinsTime);// 体力恢复满推送
  600. }else{
  601. oo::commonOprRedis('common')->hDel(okeys::spinsFirebase(),$uid);
  602. oo::commonOprRedis('common')->hDel(okeys::spinsFirebaseEndTime(),$uid);
  603. }
  604. $refreshSpinsTime = max(0,oo::commonOprModel('user')->refreshSpins($uid,0));
  605. $res['lastTime'] = $refreshSpinsTime;
  606. $dts=0;
  607. // $dts = max(0,oo::commonOprRedis('common')->ttl(okeys::SpeedUpSpins($uid)));
  608. // if($refreshSpinsTime<$dts){
  609. // $dts = $refreshSpinsTime/2;
  610. // }
  611. //限时bet活动
  612. $this->crazyBetLimit($uid,$userSpins);
  613. //通行证任务
  614. oo::commonOprModel('activitynew')->trafficPermitSpendSpinsTask($uid,$actionSpinsNum);
  615. //召回活动--完成任务
  616. oo::commonOprModel('callback')->doTask($uid, 3, $actionSpinsNum);
  617. if(in_array($res['type'],[3,4])){
  618. $tid = $res['type']==3?1:2;
  619. oo::commonOprModel('callback')->doTask($uid, $tid, 1);
  620. }
  621. //统计
  622. oo::commonOprModel('currency')->setUserDayData($uid,'spin_times',1);//每日产销-旋转次数统计
  623. oo::commonOprModel('statistics')->slotSpinsSta($uid,$levelId,1,$multiple,$res['rid'],$aid,$actionSpinsNum);
  624. unset($res['rid']);
  625. $res['spinNextTime'] = $refreshSpinsTime+time()-$dts;
  626. $res['curSpins'] = $userSpins;
  627. $res['type'] = (int)$res['type'];
  628. $this->response['code'] = 1;
  629. $this->response['msg'] = '获取数据成功';
  630. $this->response['data'] = $res;
  631. return $this->response;
  632. }
  633. /**
  634. * 苹果过审包概率设置
  635. * @param int $uid
  636. * @param int $times
  637. * @return array
  638. */
  639. public function iosApplySlotResult($uid, $times = 1, $levelId = 1, $multiple = 1) {
  640. $times = $times > 10 ? rand(1, 11) : $times;
  641. //$n = 1:打,2:偷,3:体力,5-10:金币
  642. switch($times){
  643. case 2: //四选一活动
  644. case 10: //四选一活动
  645. $res = ['type' => 11, 'prize' => []];
  646. break;
  647. case 5: //大转盘
  648. $res = ['type' => 10, 'prize' => []];
  649. break;
  650. case 9: //打
  651. $res = ['type' => 4, 'rid' => 1, 'prize' => []];
  652. break;
  653. case 11: //偷
  654. $res = ['type' => 3, 'rid' => 2, 'prize' => []];
  655. break;
  656. default: //转到金币
  657. $res = oo::commonOprModel('slotresult')->getSlotResult($uid,$levelId,$multiple,0,0,rand(5, 10));
  658. break;
  659. }
  660. return $res;
  661. }
  662. public function pauseSpinsTiming($uid,$curSpins,$version,$maxBet,$autoSpins,$maxSpins){
  663. //当获取后的体力大于50 或者 当前用户大于50
  664. if($curSpins >= $maxSpins){
  665. $keys = okeys::userRestoreTime($uid);
  666. $is_Restore = oo::commonOprRedis('common')->get($keys);
  667. //先判断有没有在计时的数据 有的话把时间改为 0* 剩余时间 记录暂停
  668. if($is_Restore){
  669. //切割 时间戳*剩余时间
  670. $time = explode('*',$is_Restore);
  671. if($time[0] > 0 && $time[1] > 0){
  672. //当前时间减去上一次记录的时间戳
  673. //剩余时间
  674. $last_time = $time[1] - (time() - $time[0]);//计算剩余时间 暂停处理 剩余时间-(当前时间-上一次记录时间戳)
  675. if($last_time > 0){
  676. $val = '0*'.$last_time;
  677. oo::commonOprRedis('common')->set($keys, $val);
  678. }else{
  679. oo::commonOprRedis('common')->delete($keys);
  680. }
  681. }
  682. }
  683. }
  684. }
  685. /**
  686. * 限时crazy bet 活动
  687. * @param $uid
  688. * @param $curSpins
  689. * @return bool
  690. * Created by: Owen
  691. * Created on: 2020/12/18 16:51
  692. */
  693. public function crazyBetLimit($uid,$curSpins){
  694. if(oo::commonOprRedis('activity')->get(okeys::CrazyBetLimitInterval($uid))){
  695. return false;
  696. }
  697. $config = json_decode(oo::commonOprModel('readconfig')->getSysCon("activity","crazyBet"),true) ?? [];
  698. if(empty($config)){
  699. return false;
  700. }
  701. if($curSpins <= $config['spins']){
  702. return false;
  703. }
  704. $curTime = intval(oo::commonOprRedis('User')->get(okeys::CrazyBetLimitNum($uid)));
  705. if($curTime >= $config['times']){
  706. return false;
  707. }
  708. if(oo::commonOprModel('activitynew')->activityLock($uid,"crazy_bet")){
  709. return false;
  710. }
  711. oo::commonOprRedis('activity')->setex(okeys::CrazyBetLimitInterval($uid),1,$config['interval'] * 60);
  712. oo::commonOprModel('member')->sendReward($uid,31,$config['time'],0,116);
  713. oo::commonOprRedis('User')->setex(okeys::CrazyBetLimitNum($uid),$curTime + 1,oo::todayDeadline());
  714. return true;
  715. }
  716. /**(20210728-wsc-老攻击逻辑)
  717. // $warning = true;
  718. // $attack = oo::commonOprModel('member')->getEnemyData($uid);
  719. // if(isset($attack['toUid'])){
  720. // $aUid = oo::commonOprRedis('common')->get(okeys::beAttactLock($attack['toUid']));//攻击并发锁
  721. // if($aUid && $aUid != $uid){//有被锁定则转到金币
  722. // $attack['toUid'] = '';
  723. // $warning = false;
  724. // }
  725. // }
  726. // if(!isset($attack['toUid'])||empty($attack['toUid'])){
  727. // $res['rid'] = 6;
  728. // $prize = $slotResult['prize'][$res['rid'] - 1];
  729. // $res['type'] = intval($prize['type']);
  730. // $res['num'] = intval($prize['prize']) * $multiple;
  731. // $res['rewardId'] = intval($prize['rewardId']);
  732. // oo::commonOprModel('member')->optProperty($uid,array('money'=>$res['num']),'+',1,'摇奖奖励金币');
  733. // //金币爆炸活动加金币
  734. // $bet2 = oo::commonOprModel('activitynew')->getCoinBlastBetByType($uid,'slot');
  735. // if($bet2>0){
  736. // oo::commonOprModel('member')->optProperty($uid,array('money'=>$res['num']*$bet2),'+',219,'摇奖奖励金币:'.$res['rewardId']);
  737. // $res['coin_blast_bet'] = $bet2;
  738. // }
  739. // //保险柜活动加金币储蓄
  740. // $res['curSafeBoxNum'] = oo::commonOprModel('activitynew')->actionSteelSafe($uid,$res['num']);
  741. // $warning && oo::commonOprModel('statistics')->addWarning($uid,"老虎机获取攻击对象失败,返回金币:{$res['num']}",1,$res['num']);
  742. // }else{
  743. // oo::commonOprRedis('common')->setex(okeys::beAttactLock($attack['toUid']),$uid,300);//添加保护锁
  744. // //获取被攻击者用户资产信息
  745. // $userInfo = oo::commonOprModel('member')->getUserInfo($attack['toUid']);
  746. // $attackAssetsInfo = oo::commonOprModel('member')->getUserAssetsInfo($attack['toUid']);
  747. // $attack['nick'] = oo::commonOprModel('member')->getUserFirstName($userInfo['nick']);
  748. // $attack['s_picture'] = $userInfo['s_picture'];
  749. // $attack['vip'] = $userInfo['vip'];
  750. // $attack['vipLv'] = $userInfo['vipLv'];
  751. // $attack['u_flag'] = $userInfo['u_flag'];
  752. // $attack['avatar'] = intval($userInfo['avatar']);
  753. // $attack['shield'] = intval($attackAssetsInfo['shield']);
  754. // $attack['isRevenge']= in_array($attack['toUid'],oo::commonOprModel('member')->getMyEnemyList($uid)??[]);
  755. // $res['attackInfo']= $attack;
  756. // if($attack['shield'] == 0){
  757. // $lockFlag = oo::commonOprRedis('common')->get(okeys::AttackLock($attack['toUid']));
  758. // if(intval($lockFlag)){
  759. // $res['attackInfo']['shield'] = intval($attackAssetsInfo['shield']) + 1;
  760. // }
  761. // }
  762. // oo::commonOprRedis('common')->setex(okeys::slotLock($uid),$attack['toUid'],3600);
  763. //
  764. // $userPetSkill = oo::commonOprModel('pet')->usePetSkill($uid,3); //攻击技能
  765. // $userPetSkill&& oo::commonOprRedis('usercache')->setex(okeys::PetSkill($uid, 3),1,5*60);
  766. // $toUserPetSkill = oo::commonOprModel('pet')->usePetSkill($attack['toUid'], 2); //防御技能
  767. // $toUserPetSkill && oo::commonOprRedis('usercache')->setex(okeys::PetSkill($attack['toUid'], 2),1,5*60);
  768. // $res['attackInfo']['userPetSkill'] = intval(oo::commonOprModel('pet')->usePetSkill($uid,3,10000)) > 0 ? 1 : 0;
  769. // $res['attackInfo']['toUserPetSkill'] = intval($toUserPetSkill);
  770. //
  771. // $attackAwardCfg = oo::commonOprModel("config")->getAttackCoinConfig($levelId);
  772. // $res['attackInfo']['defenseCoins'] = intval($attackAwardCfg['shield'])*$multiple;
  773. // $res['attackInfo']['attackCoins'] = intval($attackAwardCfg['no_shield'])*$multiple;
  774. // oo::commonOprRedis('usercache')->incrBy(okeys::slotTypeLimit($res['type'],$uid),1);//记录本次转到打,用于完成打验证
  775. // oo::commonOprModel('currency')->log($uid,"slot_attack","+",1,0,1,"转到打:{$attack['toUid']}");//转到打流水
  776. // }
  777. */
  778. }