<?phprequire_once __DIR__ . '/vendor/autoload.php';require_once __DIR__ . '/vendor/mysql-master/src/Connection.php';require_once __DIR__ . '/func_game.php';require_once __DIR__ . '/channel/Server.php';require_once __DIR__ . '/channel/Client.php';use Clue\React\Redis\Factory;use Clue\React\Redis\Client;use Workerman\Worker;use Workerman\Lib\Timer;$s=new Worker('tcp://0.0.0.0:1234'); // workerman对象$s->count = 1; // 启动1个进程对外提供服务$css = []; // 连接数组$roomusers = []; // 房间的用户$uconn = []; // 用户id和连接的kv$tconn = []; // 用户id和连接时间戳kv$temp_css = []; // 连接上放入临时数组,注册验证过后,再放入正式数组 $css$db = false; // 数据库对象$roundinfo = []; // 所有局游戏的信息// $key is our base64 encoded 256bit key that we created earlier. You will probably store and define this// key in a config file.$publickey = 'bRuD5WYw5wd0rdHR9yLlM6wt2vteuiniQBqE70nAuhU=';// workerman 开启$s->onWorkerStart = function($worker){ global $db; $db=new \Workerman\MySQL\Connection(C['dbhost'],C['dbport'],C['dbuname'],C['dbpwd'],C['dbname']); pay_callback(); // 支付成功后的回调 // 检测超时的正式连接 Timer::add(120, function(){ close_timeout_official_connection(120); }); // 检查超时的临时连接 Timer::add(10, function(){ close_timeout_temp_connection(10); }); // 每隔5秒去检查加入房间的用户数组 Timer::add(5, function(){ global $roomusers; // 剔除重复的玩家 $_data = []; foreach ($roomusers as $key => $roomuser) { if (count($roomuser) == 0) { continue; } foreach ($roomuser as $k=>$v) { if (isset($_data[$key][$v['userid']])) { // found duplicate continue; } // remember unique item $_data[$key][$v['userid']] = ($v); } $_data[$key] = array_values($_data[$key]); $roomusers = $_data; } logs("----房间里面的玩家----".json_encode($roomusers)); match_allroom_players($roomusers, 15); // 匹配玩家 等待15秒就超时 }); // 每2秒检查心跳 Timer::add(2, function(){ check_matchplayers_heart(2); }); // 每秒检查roundinfo是否开启游戏 Timer::add(1, function(){// global $roundinfo;// $r = red();// logs("*****redset******");// var_dump($roundinfo);// $r->set("roundinfo", json_encode($roundinfo)); game_control(); });};// 控制游戏开始结束function game_control(){ global $roundinfo, $uconn; logs("-------roundinfo--------".json_encode($roundinfo)); foreach ($roundinfo as $key => $value) { $userid = $value['userid']; // 发起玩家id $orders = $value['orders']; // 场次 $touserid = $value['touserid']; // 匹配玩家id $roomid = $value['roomid']; // 房间id $lev = $value['lev']; // 玩家级别 $tolev = $value['tolev']; // 对手级别 $user_rounds = $value['userrounds']; // 玩家总局数 $touser_rounds = $value['touserrounds']; // 对手总局数 $timeinterval = $value['endtimestamp'] - time(); // 游戏结束时间戳和当期时间的差值 $reward_user = $value['reward_user_' . $userid]; // 游戏的奖励分数 $reward_touser = $value['reward_user_' . $touserid]; $reward_user_coinlist = $value['reward_user_coinlist_' . $userid]; // 游戏的奖励各种币的累加分数 $reward_touser_coinlist = $value['reward_user_coinlist_' . $touserid]; $reward_room = $value["reward_room"]; // 房间的奖励分数 $coin_reward_room = $value['coin_reward_room']; // 房间奖励币种 $roundmodelid = $value["roundmodelid"]; // 游戏模型id $roundsid = $key; // 游戏局id $c = $uconn[$userid]; // 发起者连接 $c1 = $uconn[$touserid]; // 匹配者连接 // 检测到 0 < 开始时间 <= 当前时间 才发送游戏信息 // 开始时间多加5秒保证前台渲染顺利 if ($value['starttimestamp'] + 5 <= time() && $value['starttimestamp'] > 0) {// if ($value['starttimestamp'] <= time() && $value['starttimestamp'] > 0) { $roundinfo[$key]['starttimestamp'] = 0; // 开始时间戳置空 wd($c, suc('thisroomgamemodel', $value['gameinfo'])); // 发送游戏渲染信息给发起人 wd($c1, suc('thisroomgamemodel', $value['gameinfo'])); // 发送游戏渲染信息给匹配人 unset($roundinfo[$key]['gameinfo']); } // 结束游戏,显示一局结果 if ($timeinterval <= 0) { // 给赢的玩家加币种 if ($reward_user > $reward_touser) { $winneruuid = $value['uuid']; // 只在第一场才奖励 if ($orders == 1) { // 房间奖励 $tips = "房间胜利奖励{$coin_reward_room}+{$reward_room}"; add_user_coin_notice($userid, $coin_reward_room, $reward_room, $tips, $roundsid); } // 更新玩家战绩 $sql = "update users set countwin=countwin+1 where userid='$userid'"; $updateid = query($sql); if ($updateid === false) { err("更新胜利场次失败", "update_countwin"); } $sql = "update users set countfail=countfail+1 where userid='$touserid'"; $updateid = query($sql); if ($updateid === false) { err("更新失败场次失败", "update_countfail"); } } elseif ($reward_user < $reward_touser) { $winneruuid = $value['touuid']; // 只在第一场才奖励 if ($orders == 1) { // 房间胜利奖励 $tips = "房间胜利奖励{$coin_reward_room}+{$reward_room}"; add_user_coin_notice( $touserid, $coin_reward_room, $reward_room, $tips, $roundsid ); } // 更新玩家战绩 $sql = "update users set countwin=countwin+1 where userid='$touserid'"; $updateid = query($sql); if ($updateid === false) { err("更新胜利场次失败", "update_countwin"); } $sql = "update users set countfail=countfail+1 where userid='$userid'"; $updateid = query($sql); if ($updateid === false) { err("更新失败场次失败", "update_countfail"); } } else { $winneruuid = ""; // 更新玩家战绩 $sql = "update users set countdraw=countdraw+1 where userid='$touserid'"; $updateid = query($sql); if ($updateid === false) { err("更新平局场次失败", "update_countdraw"); } $sql = "update users set countdraw=countdraw+1 where userid='$userid'"; $updateid = query($sql); if ($updateid === false) { err("更新平局场次失败", "update_countdraw"); } } // 通知游戏结果, 有下一局返回结果加上广告链接,没有的话直接返回游戏结束。 $row = get_next_round($roomid, $roundmodelid); // 获取下一局的游戏模型 $adurl = isset($row['adurl']) ? $row['adurl'] : ""; // 下一局的广告地址 $gameresult = "next"; // 还有下一局 if (!count($row)) { $gameresult = "over"; // 没有下一局了 } logs("---------------1111----------------"); // 返回给前台本局游戏结果 wd($c, suc("syncgamestatus", compact('reward_user', 'reward_touser', "winneruuid", "gameresult", "adurl", "next_round_projectcoins", "reward_user_coinlist", "reward_touser_coinlist"))); wd($c1, suc("syncgamestatus", [ 'reward_user' => $reward_touser, 'reward_touser' => $reward_user, "winneruuid" => $winneruuid, "gameresult" => $gameresult, "adurl" => $adurl, "reward_user_coinlist" => $reward_touser_coinlist, "reward_touser_coinlist" => $reward_user_coinlist, ] )); logs("---------------121212----------------"); // 更新本轮游戏奖励到游戏局表round $flag = update_player_reward($roundsid, $reward_user, $reward_touser); if (!$flag) { return err("syncgamestatus", "更新本轮奖励失败"); } // 更新币奖励到用户资产并发通知 // 给玩家加币 logs("-----游戏结束给玩家加币----".json_encode($reward_user_coinlist)); foreach ($reward_user_coinlist as $k=>$v) { $tips = "玩家抓币奖励" . $k . "+" . $v; add_user_coin_notice($userid, $k, $v, $tips, $roundsid); } // 给对手加币 logs("-----游戏结束给对手加币----".json_encode($reward_touser_coinlist)); foreach ($reward_touser_coinlist as $k=>$v) { $tips = "玩家抓币奖励" . $k . "+" . $v; add_user_coin_notice($touserid, $k, $v, $tips, $roundsid); } logs("---------前台的局情况------------"); $rounds = cal_rounds($lev); // 当前级别需要的局数 $torounds = cal_rounds($tolev); // 对手当前级别需要的局数 $lev2 = $lev; logs("-----{$userid}要升到的级别$lev2------" ); logs("----需要的局数----".$rounds); logs("----玩了多少局----".$user_rounds); // 当前总局数和需要达到的局数相等 添加升级信息 $upgradeconfigs = ''; $toupgradeconfigs = ''; if ($rounds <= $user_rounds) { // 生成升级信息 $upgradeconfigs = $value['upgradeconfigs']; // 升级信息 $roundinfo[$key]['upgrade'] = $upgradeconfigs; logs("----生成升级信息----". json_encode($upgradeconfigs)); } if ($torounds <= $touser_rounds) { $toupgradeconfigs = $value['toupgradeconfigs']; // 对手升级信息 // 生成升级信息 $roundinfo[$key]['toupgrade'] = $toupgradeconfigs; logs("----对手生成升级信息----". json_encode($toupgradeconfigs)); } logs("---------------2222----------------"); $next_round_projectcoins = []; // 下一轮投放的币 // 开始新一局 if ($gameresult == 'next') { // 如果还有下一局,删掉当前局的升级信息,放到下一局的升级信息 $result = get_one_room($roomid); $row['fee'] = $result['fee']; // 房间费用 $row['backpercent'] = $result['backpercent']; // 比率 $row['projectcoinid'] = $result['projectcoinid']; // 项目币id logs("---新的一局".json_encode($row)); $models = get_room_gamemodel( $roomid, $userid, $touserid, $row, $lev, $tolev, $upgradeconfigs, $toupgradeconfigs, $roundinfo[$key]['orders']); logs("---models". json_encode($models)); if (isset($roundinfo[$key]['upgrade'])) { unset($roundinfo[$key]['upgrade']); } if (isset($roundinfo[$key]['toupgrade'])) { unset($roundinfo[$key]['toupgrade']); } if (is_string($models) && in_array($models, ['no_model', 'no_items', 'no_roomid', 'no_userid', 'no_insertid', "not_enough_coins", "upgrade_fail"])) { logs("models error msg"); wd($c, err('thisroomgamemodel', "游戏渲染出错,错误原因" . $models)); wd($c1, err('thisroomgamemodel', "游戏渲染出错,错误原因" . $models)); return false; } $next_round_projectcoins = array_map("get_coinname", $models); } // 发送下一次的币种的信息 wd($c, suc("next_round_projectcoins", $next_round_projectcoins)); wd($c1, suc("next_round_projectcoins", $next_round_projectcoins)); // 发送升级信息 if (isset($roundinfo[$roundsid]['upgrade'])) { logs("----发送升级消息----"); var_dump($roundinfo[$roundsid]['upgrade']); wd($c, suc("send_upgrademsg", $roundinfo[$roundsid]['upgrade'])); } if (isset($roundinfo[$roundsid]['toupgrade'])) { logs("----发送升级消息----"); var_dump($roundinfo[$roundsid]['toupgrade']); wd($c1, suc("send_upgrademsg", $roundinfo[$roundsid]['toupgrade'])); } logs("---------------3333----------------"); // 只在第一场才奖励 // 分成 if ($orders == 1) { divided_into( $reward_room * 0.1, $userid, $touserid, $coin_reward_room ); } // 销毁roundinfo变量 logs("销毁的roundsid-场次:" . $roundsid . "-" . $orders); unset ($roundinfo[$roundsid]); } }}// 发送升级信息//function send_upgrademsg($c, $msg){// var_dump($msg);// $timer_id = Timer::add(5, function()use($c, $msg){// logs("-----升级信息------".json_encode($msg));// wd($c, suc('upgrademsg', $msg));// });// Timer::del($timer_id); // 删除定时器//}// 检查是否有下一局 $roundmodelid 上一局的modelidfunction get_next_round($roomid, $roundmodelid){ $sql = "select roundorder from roundmodel where roomid='$roomid' and roundmodelid='$roundmodelid'"; $row = query($sql); $roundorder = $row[0]['roundorder']; // 上一局的 order // order比上一局大的 $sql = "select * from roundmodel where roundorder>'$roundorder' and roomid='$roomid' ORDER BY roundorder, RAND() LIMIT 0,1"; $row = query($sql); // 大于上一局的order $data = isset($row[0]) ? $row[0] : []; return $data;}// 连接上$s->onConnect=function($connection){ global $temp_css; $temp_css[] = [ 'c' => $connection, 'timestamp' => time(), 'userid' => 0, ];};// 当客户端发送消息过来时,转发$s->onMessage=function($c,$data){// logs("@@@@@@@@@@@@@@@" . $data); // 客户端的请求必须是 h开头 或者一个 json字符串 if (substr($data, 0, 1) != 'h' && substr($data, 0, 1) != '{') { $c->close(); // 关闭连接 return; } // 处理 h{...的数据 if ($data[0] == "h" && strpos($data, '{') === false) { $data = "h"; } // 打印消息 if ($data != "h") { logs("-----onmessage-----"); echo $data . "\n"; } if($data==''){ $c->close(); }else if($data=='h'){ global $css, $tconn; $find = 0; // 匹配到当前连接 foreach ($css as $key => $v) { if ($c == $v['c']) { $c->send('h');// logs('----更新当前连接的时间戳----'); $css[$key]['timestamp'] = time(); $tconn[$css[$key]['userid']] = time(); $find = 1; break; } } if (!$find) { logs("------关掉了!!"); $c->close(); } }else{ $odata = $data; $data = trim($odata, "h"); // 遇到 h{a:2,....} 或者 {a:2,....}h 多发一条心跳 if (strlen($data) != strlen($odata)) { wd($c, "h"); } $d=trim($odata,'h'); $str = ""; $str=$str.$d; $str=str_replace('}h{','}{',$str); $str=str_replace('}hh{','}{',$str); //logs('get msg : '.json_encode(json_decode($str),JSON_UNESCAPED_UNICODE)); if(strpos($str,'}{')!==false){ $str=str_replace('}{','}###{',$str); $dataarr=explode('###',$str); $str=str_replace('###','',$str); foreach($dataarr as $k=>$v){ $obj=json_decode($v,true); if($obj){ $str=str_replace($v,'',$str); $d=getd($obj,$c); wd($c,$d); }else{ logs(' wrong json format : '.$str); } } }else{ $obj=json_decode($str,true); if($obj){ $d=getd($obj,$c); wd($c,$d); }else{ logs('decode data error : data = '.$data); } }// // 如果遇到两个json连在一起 {"ac":"getmapadv"}{"ac":"getrooms"}// if (strpos($data, "}{") !== false) {//// }// $obj=json_decode($data,true);// if($obj){// $d=getd($obj,$c);// wd($c,$d);// }else{// logs('decode data error : data = '.$data);// } }};// 关闭连接$s->onClose=function($connection){ global $css; foreach($css as $k=>$v){ if($connection==$v['c']){ unset($css[$k]); logs('----服务器端关闭连接----'); } }};// 关闭超时的正式连接function close_timeout_official_connection($timeout){ global $css; logs("------关闭超时的连接---"); foreach ($css as $k => $v) { // 如果超过两分钟就关闭连接 if (time() - $v['timestamp'] > $timeout) { logs('----关闭超过'.$timeout.'秒的正式socket连接----'); $v['c']->close(); unset($css[$k]); } }}// 关闭超时的临时连接function close_timeout_temp_connection($timeout){ global $temp_css; logs("------关闭超时的连接---"); foreach ($temp_css as $k => $v) { if (time() - $v['timestamp'] > $timeout) { logs('----关闭超过'.$timeout.'秒的临时socket连接----'); $v['c']->close(); unset($timeout[$k]); } }}// 关闭超时的roundinfo//function unset_timeout_roundsinfo(){// global $roundinfo;// if (!count($roundinfo)) {// return false;// }// foreach ($roundinfo as $key=>$value) {// if ($value['endtimestamp'] < time()) {// unset($roundinfo[$key]);// }// }// return true;//}// 更新连接数function updateconnectionnumber($r){ global $css; $clen=[]; $clen['allcount']=count($css); $clen['uidcount']=0; $clen['regcount']=0; $clen['emptycount']=0; global $css; foreach($css as $k=>$v){ if(!empty($v['userid'])){ $clen['uidcount']++; }else if(!empty($v['timestamp'])){ $clen['regcount']++; }else{ $clen['emptycount']++; } } $r->set('socket', json_encode($clen));}// 给客户端发送消息function wd($c,$d){ if ($d) { if(is_array($d))$d=json_encode($d); logs("-------给客户端发送消息:".$d); $c->send($d); }}// 获取玩家的胜负情况//function get_user_rounds_condition($userid){// $condition = [];// // 胜// $sql = "select count(*) win from rounds where (userid={$userid} and award>toaward) or (touserid={$userid} and award<toaward)";// $row = query($sql);// $condition['win'] = $row[0]["win"];// // 平// $sql = "select count(*) draw from rounds where (userid={$userid} and award=toaward)";// $row = query($sql);// $condition['draw'] = $row[0]["draw"];// // 总局数// $sql = "select count(*) counts from rounds where userid={$userid} or touserid={$userid}";// $row = query($sql);// $condition['lost'] = $row[0]["counts"] - $condition['win'] - $condition['draw'];//// return $condition;//}function getd($d, $c){ global $publickey, $css, $uconn, $roomusers, $roundinfo; $data = []; switch($d['ac']){ case 'socketreg': //socket注册 初始化 if (check_violation_request()) { delete_connection_from_temp_css($c); // 从临时连接数组删除 } // 放入到正式连接数组 $css[] = [ 'c' => $c, 'timestamp' => time(), 'userid' => 0, ]; break; case 'login': // 登录 $phone = $d['phone']; $pwd = $d['pwd']; $sql = "select userid, pwd pwdhash from users where phone='$phone'"; $row = query($sql); if (!isset($row['0']['pwdhash']) || !password_verify($pwd, $row['0']['pwdhash'])){ return err("login", "用户名或密码有误,请核对后重试"); } $userid = $row['0']['userid']; $uid_encrypted = my_encrypt($userid, $publickey); $data = ['uuid' => $uid_encrypted, 'phone' => $phone]; // 返回加密后的uid // @todo 要加登录限制 同一个号只能登录在一个设备// if (isset($uconn[$userid])) {// wd($uconn[$userid], err("login_limit","您的账号已经在其他设备登录,"));// $uconn[$userid]->close();// unset($uconn[$userid]);// } $uconn[$userid] = $c; // 创建用户id和连接的kv // 修改socket数组信息 foreach ($css as $key=>$value) { if ($c == $value['c']) { $css[$key]['timestamp'] = time(); $css[$key]['userid'] = $userid; } } logs("---login---"); break; case 'getuserinfo': // 获取用户信息 // 获取用户基本信息 if (!$d['uuid']) { return err( "getuserinfo", "缺少关键信息" ); } $userid = my_decrypt($d['uuid'], $publickey); logs("------userid=".$userid); if (!$userid) { return err( "getuserinfo", "您还没登录哦" ); } $sql = "SELECT countwin win, countdraw draw, countfail lost, phone,nickname,faceimage,lev,power,invitecode, levp, isverify, isworking, canbuyparterner, ispartner, sex FROM users WHERE userid ='$userid'"; $row = query($sql); $user = isset($row[0]) && count($row[0])>0 ? $row[0] : []; if (0 == count($user)) { return err( "userneedremove", "用户不存在" ); } $user['faceimage'] = !empty($user['faceimage']) ? $user['faceimage'] : '/assets/img/defaultface.png'; // 统计该用户邀请的人数 $invitecode = isset($user['invitecode']) ? $user['invitecode'] : ''; $invitecounts = getinvitecounts($invitecode); // 获取该用户的资产 $projectcoinid = get_pojectcoinid('GMC'); $sql = "SELECT amount FROM asset WHERE userid = '$userid' AND projectcoinid = '$projectcoinid'"; // gmc的数量 logs("-----用户资产sql----".$sql); $assets = query($sql); $assets = isset($assets[0]) ? shownum($assets[0]['amount']) : 0; // 数字显示 // 获取用户的未读通知 $sql = "select count(*) counts from notice where isview='0' and userid='$userid'"; $row = query($sql); $newmsgcounts = $row['0']['counts'] ? $row['0']['counts'] : 0; $giftreceivestatus = '0'; // 认证礼包标识 // 查看用是否领取了礼包 $sql = "select truename_gift from userverify where userid='$userid'"; $row = query($sql); if (isset($row[0]['truename_gift']) && !empty($row[0]['truename_gift'])) { $giftreceivestatus = 1; } $configsid = get_machine($userid); // 矿机 $plate = get_machine_plate($userid); // 车牌 // 拼装数组 $invitecodeurl = "/admin/game/users/invitepage/invitecode/$invitecode"; // 邀请链接 $rows = array_merge($user, compact('configsid', 'invitecounts', 'newmsgcounts','assets', 'giftreceivestatus', 'invitecodeurl')); $rows['plate'] = $plate; $data = ['rows' => $rows]; logs("---getuserinfo---"); $uconn[$userid] = $c; // 创建用户id和连接的kv break; case 'edituserinfo': // 编辑用户信息 $nickname = isset($d['nickname']) ? $d['nickname'] : ''; $userid = my_decrypt($d['uuid'], $publickey); $faceimage = isset($d['faceimage']) ? $d['faceimage'] : ''; if (!$userid) { return err("edituserinfo", "您还没登录哦"); } $sql = "update users set nickname='$nickname', faceimage='$faceimage' where userid='$userid'"; $updateid = query($sql); if (false === $updateid) { return err( "edituserinfo", "编辑用户信息失败" ); } break; case 'getrooms': // 获取房间配置 if (!isset($d['uuid'])) { return err("getrooms", "缺少关键信息"); } $userid = my_decrypt($d['uuid'], $publickey); if (!$userid) { return err("getrooms", "您还没登录哦"); } // @TODO 只给初级以上的合伙人开放竞技(不包含初级) $user_info = get_playerinfo($userid); $partner = $user_info['ispartner']; // 合伙人等级 $partner_levs = ['否' => 0, '初级' => 0, '中级' => 1, '高级'=>2, '特级'=>3, '至尊' => 4]; $plev = $partner_levs[$partner]; if (!isset($partner_levs[$partner])) { $plev = 0; } if ($plev <= 0) {// return err("getrooms", "此功能正在开发中"); } $sql = "SELECT R.*, P.coinname FROM room R LEFT JOIN projectcoin P ON R.projectcoinid = P.projectcoinid"; $rows = query($sql); if (!$rows) { return err("getrooms", "没有获取到房间哦"); } foreach ($rows as $key=>$row) { if (isset($roomusers[$row['roomid']])) { $rows[$key]['usercounts'] = count($roomusers[$row['roomid']]); // 该房间里的玩家总数 } else { $rows[$key]['usercounts'] = 0; } if (isset($row['iconpicid'])) { $rows[$key]['pathimage'] = get_iconpic_path($row['iconpicid']); } unset($rows[$key]['iconpicid']); } $data = ['rows' => $rows]; break; case 'matchsync': // 匹配用户 ['roomid' => 2, 'player'=>['uuid'=>'2l3k4j9dfa8wei833upw', 'lev'=>2] $t = $d['playerinfo']; $userid = my_decrypt($t['player']['uuid'], $publickey); $roomid = $t['roomid']; $result = query("select projectcoinid from room where roomid='$roomid'"); $projectcoinid = 0; if ($result) { $projectcoinid = $result[0]['projectcoinid']; } if (!$projectcoinid) { return err($d['ac'], "该房间的入门币种不存在"); } // 检查玩家是不是已经处于某一局 $round = get_player_roundsid($userid); if ($round['roundsid']) { // {$round['interval']} 还差多少秒结束// return err($d['ac'], "您还有未结束的游戏,请稍后重新进入"); $data = get_reconnect_round($userid, $c); // 返回重连游戏的信息 return suc($d['ac'], $data); } // 匹配前要检查玩家的资产金额是否大于房间的入门费 if (!isset($t['roomid'])) { return err($d['ac'], "未查询到到当前房间id"); } if (!check_player_asset_is_higher_for_roomfee($t['roomid'], $userid, $projectcoinid)) { return err($d['ac'], "入场费不够哦"); } logs("----matchsync-----" . $userid); $roomusers[$t['roomid']][] = ['userid' => $userid, 'lev' => $t['player']['lev'], 'timestamp' => time()]; return suc($d['ac'], [], '已接收到玩家信息,开始匹配……'); break; case 'leaveroom': // 玩家离开房间 $uid_encrypted = $d['uuid']; $userid = my_decrypt($uid_encrypted, $publickey); $flag = kick_out_player($userid); if (!$flag) { return err($d['ac'], "缺少关键信息"); } return suc($d['ac'], [], '玩家已经离开房间'); break; case 'syncgamestatus': // 同步游戏状态 ['ac' => 'catchcoin', 'angle' => 50, 'uuid' => 'xxxxxxxxxx', 'throw': 0]; $userid = my_decrypt($d['uuid'], $publickey); $touserid = my_decrypt($d['touuid'], $publickey); logs("+++++++++++++++++" . $userid); logs("+++++++++++++++++" . $touserid); $roundsid = $d['roundsid']; if (!$userid || !$touserid || !$roundsid) { return err($d['ac'], "缺失关键信息"); } $c1 = $uconn[$touserid]; // 对手的连接 // 把自己的钩子角度发给对方玩家 logs('---发送钩子角度---'); $endtimestamp = isset($roundinfo[$roundsid]['endtimestamp']) ? $roundinfo[$roundsid]['endtimestamp'] : 0; // 游戏结束时间 $remainsecond = $endtimestamp - time(); if ($remainsecond < 0) { $remainsecond = 0; } wd($c1, suc($d['ac'], ['uuid' => $d['uuid'], 'angle' => $d['angle'], 'throw' => $d['throw'], "remainsecond" => $remainsecond, ])); break; case 'caughtcoin': // 抓到币 ['ac' => 'caughtcoin', 'itemid' => 50, 'userid' => 'xxxxxxxxxx']; // 看一下这个道具有没有被人抓住,没有的话再更新rounditem表 $userid = my_decrypt($d['uuid'], $publickey); $itemid = $d['itemid']; $touserid = my_decrypt($d['touuid'], $publickey); $roundsid = $d['roundsid']; if (!$userid || !$touserid || !$roundsid) { return err($d['ac'], "缺失关键信息"); } // 检查道具合法性 $flag = false; $round = isset($roundinfo[$roundsid]) ? $roundinfo[$roundsid] : []; if (!count($round)) {// return err($d['ac'], "当前场次不存在"); return; } foreach ($round as $key=>$value) { if (strpos($key, "item_") === false) { continue; } if (strpos($key, "$itemid") === false) { continue; } $flag = true; break; } if (!$flag) { return err($d['ac'], "当前游戏场次不存在此道具"); } $sql = "select userid,projectcoinid,amount from roundsitem where roundsitemid='$itemid' and roundsid='$roundsid'"; $row = query($sql); if ($row[0]['userid']) { return err($d['ac'], "该道具已被对手抓走了"); } // 两次抓到币的时间间隔不能小于2秒 if (time() - $roundinfo[$roundsid]["caughtcointimestamp" . $userid] < 2) {// $c->close(); } $roundinfo[$roundsid]["caughtcointimestamp" . $userid] = time();// try {// beginTrans(); // 开启事务// $now_time = time();// $sql = "update roundsitem set userid='$userid', obtiantime='$now_time' where roundsitemid = '$itemid'";// $updateid = query($sql);// if ($updateid === false) {// rollBackTrans();// return err($d['ac'], '更新道具信息失败');// } $projectcoinid = $row[0]['projectcoinid']; // 项目方币id $amount = shownum($row[0]['amount']); // 增加的金额// // 项目方总币数减 给玩家加币// $sql = "select last from projectcoin where projectcoinid='$projectcoinid'";// $row = query($sql);// $last = 0;// if ($row) {// $last = $row[0]['last'];// }// if ($last - $amount < 0 ) {//// rollBackTrans();//// return err($d['ac'], '项目方币的数量不够');// }// $sql = "update projectcoin set last=last-'$amount' where projectcoinid='$projectcoinid'";// $updateid = query($sql);// if ($updateid === false) {// rollBackTrans();// return err($d['ac'], '项目方币的数量更新失败');// }// $sql = "update asset set amount=amount+'$amount' where projectcoinid='$projectcoinid' and userid='$userid'";//// $updateid = query($sql);//// if ($updateid === false){// rollBackTrans();// return err($d['ac'], '用户资产更新失败');// } // 添加金币增加记录// $sql = "insert into notice (`roundsid`, `projectcoinid`, `isview`, `number`, `userid`, `tips`, `createtime`)// values ('$roundsid', '$projectcoinid', '1', '$amount', '$userid', '抓币奖励', '$now_time')";// $insertid = query($sql);// if (false === $insertid) {// rollBackTrans();// return err($d['ac'], '用户通知记录更新失败');// } $coinname = get_coinname($projectcoinid); // 币名称 logs("--------coinname"); var_dump($coinname); // 统计各种币累加的结果 if (isset($roundinfo[$roundsid]['reward_user_coinlist_' . $userid])) { if (isset($roundinfo[$roundsid]['reward_user_coinlist_' . $userid][$coinname])) { $roundinfo[$roundsid]['reward_user_coinlist_' . $userid][$coinname] += $amount; } else { $roundinfo[$roundsid]['reward_user_coinlist_' . $userid][$coinname] = $amount; } } if (isset($roundinfo[$roundsid]['reward_user_' . $userid])) { $roundinfo[$roundsid]['reward_user_' . $userid] += $amount; }// commitTrans();// } catch (Exception $e) {// logs("-----事务错误-----" . $e->getMessage());// } $c1 = $uconn[$touserid]; wd($c1, suc($d['ac'], ['uuid' => $d['uuid'], "itemid" => $d['itemid'], "amount" => $roundinfo[$roundsid]['reward_user_' . $userid]])); // 给对手发消息 wd($c, suc($d['ac'], ['uuid' => $d['uuid'], "itemid" => $d['itemid'], "amount" => $roundinfo[$roundsid]['reward_user_' . $userid]])); // 给自己发消息 return; break; case 'reconnectround': // 重连当前局 if (!$d['uuid']) { return err($d['ac'], "缺少关键信息"); } $userid = my_decrypt($d['uuid'], $publickey); $data = get_reconnect_round($userid, $c); // 获取用户当前的局数据 break; case 'getuserasset': // 获取用户资产 $userid = my_decrypt($d['uuid'], $publickey); // 用户id $where = " A.userid = '$userid' and P.coinname != 'GMS'"; if ($d['assettype']) { $where .= " and A.amount>0 "; } $sql = "SELECT A.amount, P.coinname, P.cnyrate, I.pathimage FROM asset A LEFT JOIN projectcoin P ON A.projectcoinid = P.projectcoinid LEFT JOIN iconpic I ON I.iconpicid = P.iconpicid WHERE {$where} "; $rows = query($sql); foreach ($rows as $k => $row) { $rows[$k]['amount'] = shownum($row['amount']); // 数字显示 } $data = $rows; break; case 'getusergms': // 获取用户积分(gms) $userid = my_decrypt($d['uuid'], $publickey); // 用户id $coin_id = get_pojectcoinid('GMS'); $sql = "select amount from asset where projectcoinid ='$coin_id' and userid='$userid'"; $row = query($sql); $all_amounts = 0; if ($row) { $all_amounts = $row[0]['amount']; } // 按积分类别统计 $sql = "SELECT sum(number) amounts, tips FROM notice WHERE projectcoinid = (select projectcoinid from projectcoin where coinname='GMS') and userid={$userid} GROUP BY tips"; $rows = query($sql); if (!$rows) { $data = []; } else { foreach ($rows as $key=>$row) { $rows[$key]['amounts'] = shownum($row['amounts']); $rows[$key]['tips'] = mb_substr($row['tips'], 0, 6); // 取前6个字符 $rows[$key]['all_amounts'] = shownum($all_amounts); // 总的积分 } $data = $rows; } break; case 'getroomusers': // 获取房间的用户 $data = array_map(function($roomuser){ return array_values($roomuser); },$roomusers); return suc($d['ac'], $data, "success", 1); break; case 'getuseritems': // 获取用户道具列表 if (!isset($d['uuid'])) { return err($d['ac'], "缺少关键信息"); } $userid = my_decrypt($d['uuid'], $publickey); // 用户id if (!$userid) { return err($d['ac'], "用户尚未登录"); } $rows = get_user_items($userid); return suc($d['ac'], $rows); break; case 'gettouseritems': // 获取对手用户道具列表 $userid = my_decrypt($d['uuid'], $publickey); // 用户的id $touserid = my_decrypt($d['touuid'], $publickey); // 对手用户的id if (!$userid || !$touserid) { return err($d['ac'], "用户尚未登录"); } $rows = get_user_items($userid); $rows2 = get_user_items($touserid); return suc($d['ac'], ['user'=>$rows, 'touser'=>$rows2]); break; case 'itemused': // 道具使用 $roundsid = $d['roundsid']; // 使用的局id $configsid = $d['configsid']; // 道具的id $userid = my_decrypt($d['uuid'], $publickey); // 用户id $touserid = my_decrypt($d['touuid'], $publickey); // 用户id $c1 = $uconn[$touserid]; // 对手连接 if (!$roundsid || !$configsid || !$userid) { return err($d['ac'], "缺少关键信息"); } $sql = "select remain from user_items where configsid = '$configsid' AND userid = '$userid'"; $res = query($sql); if (!$res) { return err($d['ac'], "道具不足"); } if ($res[0]['remain'] < 1) { return err($d['ac'], "道具不足"); } $sql = "UPDATE user_items SET remain = remain-1, roundsid = '$roundsid' WHERE configsid = '$configsid' AND userid = '$userid'"; $updateid = query($sql); if (false === $updateid) { return err($d['ac'], "道具使用失败"); } wd($c1, suc($d['ac'], ['configsid' => $configsid])); // 发给对手道具id break; case 'submituserverify': // 提交身份认证信息 $userid = my_decrypt($d['uuid'], $publickey); $truename = $d['truename']; // 真实姓名 $cardnumber = $d['cardnumber']; // 身份证 $pic1 = $d['pic1']; // 正面 $pic2 = $d['pic2']; // 反面 $pic3 = $d['pic3']; // 手持 if (!$userid || !$truename || !$cardnumber || !$pic1 || !$pic2 || !$pic3) { return err($d['ac'], '提交认证信息缺失,请核对后重试'); } $pattern = "/(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}$)/"; if (!preg_match($pattern, $cardnumber, $matches)) { return err($d['ac'], '您提交的身份证号码有误,请核对后重试'); } // 检查是否已经提交 $isexist = check_exist_verifyinfo($cardnumber); if ($isexist) { return err($d['ac'], '您提交的身份证已被使用'); } // 判断是否领取过新人礼包 $sql = "select count(*) counts from user_items where userid='$userid' and configsid in (8,9,10,11,12,13)"; $row = query($sql); if (!$row[0]['counts']) { return err($d['ac'], "您需要先取过新人大礼包"); } beginTrans(); // 开启事务 // 插入身份认证信息 $sql = "insert into userverify (`userid`, `truename`, `cardnumber`, `pic1`, `pic2`, `pic3`) values ({$userid}, '{$truename}', '{$cardnumber}', '{$pic1}', '{$pic2}', '{$pic3}') "; $flag = query($sql); if ($flag === false) { rollBackTrans(); return err($d['ac'], '提交认证信息失败'); } // 更改认证状态为 处理中 $sql = "update users set isverify='处理中' where userid='$userid'"; query($sql); if ($flag === false) { rollBackTrans(); return err($d['ac'], '认证状态更新失败'); } // 设置性别 $sex = get_sex_by_cardnumber($cardnumber); $sql = "update users set sex='$sex' where userid='$userid'"; $flag = query($sql); if ($flag === false) { rollBackTrans(); return err($d['ac'], '性别更改失败'); } commitTrans(); break; case 'getuserverify': // 获取用户认证信息 $userid = my_decrypt($d['uuid'], $publickey); $sql = "select V.truename, V.cardnumber, V.pic1, V.pic2, V.pic3, U.verifyinfo, U.userid from userverify V right join users U on U.userid=V.userid where U.userid='$userid'"; $row = query($sql); $data = []; if (isset($row[0])) { $data = $row[0]; $data['truename'] = isset($data['truename']) ? substr_cut($data['truename']) : ''; } break; case 'generateplate': // 生成车牌 $userid = my_decrypt($d['uuid'], $publickey); $cardnumber = get_cardnumber($userid); if (!$cardnumber) { return err($d['ac'], "您还未实名认证哦"); } $city = get_province_city($cardnumber); $plate = get_plate_by_city($city); if (!$plate) { return err($d['ac'], "当前身份证所在地区车牌已分配完"); } $data = ['plate' => $plate]; break; case 'workswitch': // 挖矿开关 $userid = my_decrypt($d['uuid'], $publickey); $isworking = $d['isworking']; $sql = "update users set isworking='{$isworking}' where userid={$userid}"; $updateid = query($sql); if ($updateid === false) { return err($d['ac'], "更新失败"); } // 插入开关记录 $sql = "insert into userdigrecord (`userid`, `isworking`) values ('$userid', '$isworking')"; $insertid = query($sql); if ($insertid === false) { return err($d['ac'], "插入开关记录失败"); } $data = ['isworking' => $isworking]; break; case 'machines': // 矿机列表 $sql = "select * from configs where configsid in (8,9,10,11,12,13)"; $rows = query($sql); $data = $rows; break; case 'refine': // 提炼 $userid = my_decrypt($d['uuid'], $publickey); // 修改金块的状态,更新用户的gmc资产 $sql = "select amount, id from cointmp where userid='$userid' and isburn=0 limit 0, 1"; $row = query($sql); if (!isset($row[0]) || !count($row[0])) { return err($d['ac'], "未查询到您的金块"); } $amount = $row[0]['amount']; $id = $row[0]['id']; $time = time(); // 提炼时间 $sql = "update cointmp set isburn=1, burntime='$time' where id='$id'"; $updateid = query($sql); if (false === $updateid) { return err($d['ac'], "提炼失败"); } $amount = shownum($amount); add_user_coin_notice($userid, 'GMC', $amount, "提炼奖励GMC+{$amount}"); // 更新用户gmc数量 // 修改缓存 curl_get("http://manage.gmc.ink/index/index/remotecall?userid=$userid&type=1"); $projectcoinid = get_pojectcoinid('GMC'); $sql = "select amount from asset where userid='$userid' and projectcoinid='$projectcoinid'"; $row = query($sql); $amount = !empty($row[0]['amount']) ? $row[0]['amount'] : 0; // GMC 用户此刻的gmc数量 $data = ['amount' => $amount]; break; case 'warehouse': // 仓库 $userid = my_decrypt($d['uuid'], $publickey); $machine_cost=['8'=>0.0875,'9'=>0.075,'10'=>0.05,'11'=>0.025,'12'=>0.0125,'13'=>0];//油耗 // 未提炼的金块 $sql = "select count(*) counts from cointmp where isburn=0 and userid='$userid'"; $row = query($sql); $not_refineds = isset($row[0]['counts']) ? $row[0]['counts'] : 0; // 未提炼的金块 // 汽油剩余量 $sql = "select remain from user_items where userid='$userid' and configsid=14"; $row = query($sql); $gasoline_remain = isset($row[0]['remain']) ? shownum($row[0]['remain']) : 0; // 汽油剩余量 // 仓位 $sql = "select remain from user_items where userid='$userid' and configsid=15"; $row = query($sql); $positions = isset($row[0]['remain']) ? shownum($row[0]['remain']) : 0; // 总仓位 $position_remain = $positions - $not_refineds; // 仓位剩余量 // 查出矿机 $sql = "select configsid from user_items where userid='$userid' and configsid BETWEEN 8 and 13"; // 查出矿机 $row = query($sql); $configsid = isset($row[0]['configsid']) ? $row[0]['configsid'] : 0; // 矿机型号id $machine_cost[$configsid] = isset($machine_cost[$configsid]) ? $machine_cost[$configsid] : 0; // 计算紧急状态等级 1 汽油 2 仓位 3 矿机 if ($gasoline_remain < $machine_cost[$configsid]) { $gasoline_danger = 2; } elseif ($gasoline_remain < 0.1 && $gasoline_remain >= $machine_cost[$configsid]) { $gasoline_danger = 1; } else { $gasoline_danger = 0; } if ($position_remain == 0) { $position_danger = 2; } elseif ($position_remain < 2 && $position_remain > 0) { $position_danger = 1; } else { $position_danger = 0; } if ($gasoline_danger == 0 && $position_danger == 0) { $machine_danger = 0; } elseif ($position_danger == 2 || $gasoline_danger == 2) { $machine_danger = 2; } else { $machine_danger = 1; } // 查矿机描述 $sql = "select description from configs where configsid='$configsid'"; $row = query($sql); $description = isset($row[0]['description']) ? $row[0]['description'] : ''; // 矿机描述 // 查出矿机车牌 $sql = "select plate from user_items where userid='$userid' and configsid=16"; // 查出车牌 $row = query($sql); $plate = isset($row[0]['plate']) ? $row[0]['plate'] : ""; // 车牌 if (!$description) { $fuel_consume = 0; $output = 0; } else { list($fuel_consume, $output) = explode('|', $description); } $data = [ 'not_refineds'=>$not_refineds, 'gasoline_remain' => shownum($gasoline_remain), 'position_remain' => $positions, // 总仓位 'plate' => $plate, 'configsid' => $configsid, 'fuel_consume' => $fuel_consume, 'output' => $output, 'gasoline_danger' => $gasoline_danger, 'position_danger' => $position_danger, 'machine_danger' => $machine_danger, ]; break; case 'getmapadv': // 地图和广告 $sql = "select image, ismap from mappic where offline=0"; $rows = query($sql); foreach ($rows as $k=>$v) { if ($v['ismap']) { $data['map'.($k+1)] = $v['image']; } else { $data['adv'.($k+1)] = $v['image']; } }// $data = ['adv1' => '/assets/adv/adv1.png', 'adv2' => "/assets/adv/adv2.png"]; break; case 'getgoods': // 商店商品列表 $userid = my_decrypt($d['uuid'], $publickey); $sql = "SELECT S.title, S.shopid,S.pic, S.configsid, S.price, S.value, S.sort, C.itemname FROM shop S LEFT JOIN configs C ON C.configsid=S.configsid WHERE offline = '0'"; $rows = query($sql); if (!count($rows)) { return err('getgoods', "获取商品列表失败"); } $position = get_positions($userid); // 仓位数 $configsid = get_machine($userid); // 获取用户的矿机 $new = []; foreach ($rows as $key=>$value) { if (($value['configsid'] == 15 && $value['value'] <= $position) || $value['configsid'] <= $configsid) { $value['canbuy'] = 0; } else { $value['canbuy'] = 1; } $catname = $value['itemname']; if (strpos($catname,'矿机') !== false) { $catname = "machine"; } if (strpos( $catname, '仓位') !== false) { $catname = "position"; } if (strpos( $catname, '汽油') !== false) { $catname = "gasoline"; } $new[$catname][] = $value; } $data = $new; break; case 'createorderon': // 创建订单号 $userid = my_decrypt($d['uuid'], $publickey); if (!$d['shopid'] || !$userid) { return err('createorderon', "缺少关键信息,订单提交失败"); }; $shopid = $d['shopid']; // 商品id $amount = 1; $user = get_playerinfo($userid); $lev = $user['lev']; $invitecode = $user['invitecode']; $sql = "select * from shop where shopid='$shopid'"; $row = query($sql); if (!count($row)) { return err('createorderon', "商品id有错"); } $configsid = $row[0]['configsid']; // 商品类别 // 如果是矿机 [8, 9, 10, 11, 12, 13] // 等级 [0, 5, 10, 20, 30, 50] 邀请人数 [0, 5, 20, 30, 50, 500] // 才能购买 $invitecount = getinvitecounts($invitecode); $matcheids = [8, 9, 10, 11, 12, 13]; $check = [ 8 => [ 'lev' => 0, 'invitecounts' => 0, ], 9 => [ 'lev' => 5, 'invitecounts' => 5, ], 10 => [ 'lev' => 10, 'invitecounts' => 20, ], 11 => [ 'lev' => 20, 'invitecounts' => 30, ], 12 => [ 'lev' => 30, 'invitecounts' => 50, ], 13 => [ 'lev' => 50, 'invitecounts' => 500, ], ]; if (in_array($configsid, $matcheids)) { if ($check[$configsid]['lev'] > $lev || !$check[$configsid]['invitecounts'] > $invitecount) { return err('createorderon', "您的等级未达到" . $check[$configsid]['lev'] . "级或者" . "邀请人数未达到" . $check[$configsid]['invitecounts'] . "人"); } } $price = $row[0]['price']; $today = date("Ymd"); $rand = strtoupper(substr(uniqid(sha1(time())),0,4)); $no = $today . $rand; // 订单编号 $payamount = $amount * $price; // 支付金额 // 购买合伙人 $partners = [100=>'初级', 101=>'中级', 102=>'高级', 103=>'特级', 104=>'至尊']; // 合伙人 $plevs = ['否'=>0, '初级'=>1, '中级'=>2, '高级'=>3, '特级'=>4, '至尊'=>5]; $user = get_playerinfo($userid); $now_partner_lev = $user['ispartner']; $now_partner_configsid = array_search($now_partner_lev, $partners); if (isset($partners[$configsid]) && '初级' != $partners[$configsid]) { if ($plevs[$now_partner_lev] >= $plevs[$partners[$configsid]]) { return err(__FUNCTION__, "要升级的合伙人等级必须大于您当前的等级"); } // 查出当前拥有的合伙人价格 $sql = "select price from shop where configsid='$now_partner_configsid'"; logs("---当前partner configsid---".$now_partner_configsid); $res = query($sql); $now_payamount = isset($res[0]['price']) ? $res[0]['price'] : 0; $payamount = $payamount - $now_payamount; // 差价 if ($payamount < 1) { $payamount = 1; } } $createtime = time(); // 订单创建时间 $status = 0; // 订单状态 $sql = "insert into `order` (`no`, `userid`, `shopid`, `amount`, `price`, `payamount`, `createtime`, `status`) values ('$no', '$userid', '$shopid', '$amount', '$price', '$payamount', '$createtime', '$status')"; $insertid = query($sql); if (null == $insertid) { return err('createorderon', "创建订单失败"); } $data = compact('no'); break; case 'getnewversion': // 获取新版本 $sql = "select version_number, version_name, tips, download_url from `version` ORDER BY id desc limit 0, 1"; $row = query($sql); $data = isset($row[0]) ? $row[0] : []; break; } return suc($d['ac'], $data);}// 错误信息输出function err($ac,$msg){ return ['error'=>1,'msg'=>$msg,'ac'=>$ac,'data'=>[]];}// 成功信息输出function suc($ac, $data, $message = 'success', $timestamp=0){ $data = ['error'=>0,'msg'=>$message,'ac'=>$ac,'data'=>$data, ]; if ($timestamp) { $data['timestamp'] = time(); } return $data;}// 获取性别function get_sex_by_cardnumber($cardnumber){ // 15位身份证号码 第15位代表性别,奇数为男,偶数为女; // 18位身份证号码 第17位代表性别,奇数为男,偶数为女。 $c_number = 1; if (15 == strlen($cardnumber)) { $c_number = substr($cardnumber, -1); } if (18 == strlen($cardnumber)) { $c_number = substr($cardnumber, -2, 1); } if ($c_number % 2 == 0) { $sex = 1; } else { $sex = 0; } return $sex;}// 获取重连局数function get_reconnect_round($userid, $c){ global $roundinfo, $uconn; $temp = []; $res = get_player_roundsid($userid); $roundsid = $res['roundsid']; // 获取玩家局id $interval = $res['interval']; // 剩余秒数 // 正常情况下(也就是玩家不存在正在进行的游戏场次)请求重连接口直接返回空数组 if (!$roundsid) { return []; } unset($uconn[$userid]); $uconn[$userid] = $c; // 更新 userid - 连接 kv结构 $userid1 = $roundinfo[$roundsid]['userid']; $touserid1 = $roundinfo[$roundsid]['touserid']; $lev = $roundinfo[$roundsid]['lev']; $tolev = $roundinfo[$roundsid]['tolev']; $uuid = $roundinfo[$roundsid]['uuid']; $touuid = $roundinfo[$roundsid]['touuid']; $roomid = $roundinfo[$roundsid]['roomid']; $reward_user = $roundinfo[$roundsid]["reward_user_" . $userid1]; $reward_touser = $roundinfo[$roundsid]["reward_user_" . $touserid1]; if ($userid == $userid1) { // 玩家 $temp['uuid'] = $uuid; $temp['touuid'] = $touuid; $temp['lev'] = $lev; $temp['tolev'] = $tolev; $temp['reward_user'] = $reward_user; $temp['reward_touser'] = $reward_touser; $temp['position'] = 'left'; $info = get_playerinfo($userid1); $configsid = get_machine($userid1); $plate = get_machine_plate($userid1); // 车牌 $temp['phone'] = $info['phone']; $temp['nickname'] = $info['nickname']; $temp['faceimage'] = $info['faceimage']; $temp['isrobot'] = $info['isrobot']; $temp['sex'] = $info['sex']; $temp['configsid'] = $configsid; $temp['plate'] = $plate; if ($temp['isrobot']) { $temp['configsid'] = 8; } $info = get_playerinfo($touserid1); $toconfigsid = get_machine($touserid1); $toplate = get_machine_plate($touserid1); // 车牌 $temp['tophone'] = $info['phone']; $temp['tonickname'] = $info['nickname']; $temp['tofaceimage'] = $info['faceimage']; $temp['toisrobot'] = $info['isrobot']; $temp['tosex'] = $info['sex']; $temp['toplate'] = $toplate; if ($temp['toisrobot']) { $temp['configsid'] = 8; } $temp['toconfigsid'] = $toconfigsid; // 查出两人未使用的游戏道具 $data['user_items'] = get_user_items($userid1); $data['touser_items'] = get_user_items($touserid1); } elseif ($userid == $touserid1) { // 对手 $temp['uuid'] = $touuid; $temp['touuid'] = $uuid; $temp['lev'] = $tolev; $temp['tolev'] = $lev; $temp['reward_user'] = $reward_touser; $temp['reward_touser'] = $reward_user; $temp['position'] = 'right'; $info = get_playerinfo($touserid1); $configsid = get_machine($touserid1); $plate = get_machine_plate($touserid1); // 车牌 $temp['phone'] = $info['phone']; $temp['nickname'] = $info['nickname']; $temp['faceimage'] = $info['faceimage']; $temp['isrobot'] = $info['isrobot']; $temp['sex'] = $info['sex']; $temp['configsid'] = $configsid; $temp['plate'] = $plate; if ($temp['isrobot']) { $temp['configsid'] = 8; // 如果是机器人就默认是木矿机 } $info = get_playerinfo($userid1); $toconfigsid = get_machine($userid1); $toplate = get_machine_plate($userid1); // 车牌 $temp['tophone'] = $info['phone']; $temp['tonickname'] = $info['nickname']; $temp['tofaceimage'] = $info['faceimage']; $temp['toisrobot'] = $info['isrobot']; $temp['tosex'] = $info['sex']; $temp['toconfigsid'] = $toconfigsid; $temp['toplate'] = $toplate; if ($temp['toisrobot']) { $temp['configsid'] = 8; // 如果是机器人就默认是木矿机 } // 查出两人未使用的游戏道具 $data['user_items'] = get_user_items($touserid1); $data['touser_items'] = get_user_items($userid1); } $temp['roomid'] = $roomid; $temp['roundsid'] = $roundsid; $temp['interval'] = $interval; $sql = "select roundsecond, roundsid, bgimg_iconpicid, bgsound_iconpicid from rounds where roundsid={$roundsid}"; $row = query($sql); $data['bgimg_path'] = get_iconpic_path($row[0]['bgimg_iconpicid']); $data['bgsound_path'] = get_iconpic_path($row[0]['bgsound_iconpicid']); $data['roundsecond'] = $row[0]['roundsecond']; $data['roundsid'] = $row[0]['roundsid']; unset($row[0]['bgimg_iconpicid']); unset($row[0]['bgsound_iconpicid']); // 查出还未被抓的场景道具列表 $sql = "select roundsitemid roundmodelitemid, amount, x, y, gravity, moveable, angle, projectcoinid, iconpicid from roundsitem where roundsid={$roundsid} and userid=0"; $rows = query($sql); foreach ($rows as $key=>$value) { $rows[$key]['coinname'] = get_coinname($value['projectcoinid']); $info = get_iconpic_info($value['iconpicid']); $rows[$key]['pathimage'] = $info['pathimage']; $rows[$key]['h'] = $info['h']; $rows[$key]['w'] = $info['w']; unset($rows[$key]['iconpicid']); unset($rows[$key]['projectcoinid']); } $data['items'] = $rows; $data['orders'] = $roundinfo[$roundsid]['orders']; // 次序 第几场游戏 return array_merge($data, $temp);}// 获取矿机牌照function get_machine_plate($userid = 0){ $sql = "select plate from user_items where userid='$userid' and plate != ''"; $row = query($sql); return isset($row[0]['plate']) ? $row[0]['plate'] : '';}// 隐藏名字中间字function substr_cut($user_name){ $strlen = mb_strlen($user_name, 'utf-8'); $firstStr = mb_substr($user_name, 0, 1, 'utf-8'); $lastStr = mb_substr($user_name, -1, 1, 'utf-8'); return $strlen == 2 ? $firstStr . str_repeat('*', mb_strlen($user_name, 'utf-8') - 1) : $firstStr . str_repeat("*", $strlen - 2) . $lastStr;}// 事务方法function beginTrans(){ global $db; $db->beginTrans();}function commitTrans(){ global $db; $db->commitTrans();}function rollBackTrans(){ global $db; $db->rollBackTrans();}// 给买家增加道具function update_game_items($no, $payamount, $shopid, $userid, $configsid, $value, $title, $plus){ $liquids = [1, 2, 3, 4, 5, 6, 7]; // 液体道具 $machines = [8,9,10,11,12,13]; // 矿机 $partners = [100=>'初级', 101=>'中级', 102=>'高级', 103=>'特级', 104=>'至尊']; // 合伙人 $machineids = implode(",", $machines); beginTrans(); if (in_array($configsid, $liquids)) { } else { // 增加游戏道具,减少库存 if ($plus) { // 累加 $sql = "update user_items set remain=remain+'$value' where userid='$userid' and configsid='$configsid'"; // 汽油 // 修改缓存 curl_get("http://manage.gmc.ink/index/index/remotecall?userid=$userid&type=2"); } else { // 直接修改 $sql = "update user_items set remain='$value' where userid='$userid' and configsid='$configsid'"; // 仓位 // 修改缓存 curl_get("http://manage.gmc.ink/index/index/remotecall?userid=$userid&type=3"); // 矿机 if (in_array($configsid, $machines)) { $sql = "select useritemsid from user_items where userid='$userid' and configsid in ({$machineids})"; $row = query($sql); $useritemsid = $row[0]['useritemsid']; $sql = "update user_items set configsid='$configsid' where useritemsid='$useritemsid'"; // 矿机 } // 合伙人 if (in_array($configsid, array_keys($partners))) { $up_partner = $partners[$configsid]; $sql = "update users set canbuyparterner='3', ispartner='$up_partner' where userid='$userid'"; // 合伙人 } } $updateid = query($sql); if ($updateid === false) { rollBackTrans(); return err(__FUNCTION__, "更新游戏道具出错"); } } $sql = "update shop set last=last-1 where shopid='$shopid'"; $updateid = query($sql); if ($updateid === false) { rollBackTrans(); return err(__FUNCTION__, "更新商店库存出错"); } $sql = "update `order` set status=1 where no='$no'"; $updateid = query($sql); if ($updateid === false) { rollBackTrans(); return err(__FUNCTION__, "更新订单失败"); } // 新增通知记录 $time = time(); // 商品是油的话,就多加 汽油 俩字 if (strpos($title, 'L') !== false) { $title .= "汽油"; } $sql = "insert into notice (`userid`, `number`, `tips`, `createtime`) values ('$userid', '$payamount', '购买{$title}成功', '$time')"; $insertid = query($sql); if ($insertid === false) { rollBackTrans(); return err(__FUNCTION__, "插入通知失败"); } commitTrans(); return true;}// 获取用户的仓位function get_positions($userid){ if (!$userid) { err("getgoods", "缺少用户id"); } $sql = "select remain from user_items where userid='$userid' and configsid=15"; $row = query($sql); return isset($row[0]['remain']) ? $row[0]['remain'] : 0;}// 获取用户的矿机型号function get_machine($userid){ if (!$userid) { err("getgoods", "缺少用户id"); } $sql = "select userid from users where userid=$userid and isrobot='1'"; // 机器人直接返回木质矿机 $row = query($sql); if (isset($row[0]['userid']) && $row[0]['userid']) { return 8; } $sql = "select configsid from user_items where userid='$userid' and configsid between 8 and 13"; $row = query($sql); return isset($row[0]['configsid']) ? $row[0]['configsid'] : 0;}// 获取玩家的游戏道具function get_user_items($userid){ $sql = "SELECT C.configsid, C.itemname, C.description, U.remain itemcounts FROM user_items U LEFT JOIN configs C ON C.configsid = U.configsid WHERE U.configsid in (1, 2, 3, 4, 5, 6, 7) and U.userid = '$userid'"; $rows = query($sql); foreach ($rows as $key=>$row) { if (isset($row['itemcounts']) && !empty($row['itemcounts'])) { $rows[$key]['itemcounts'] = intval($rows[$key]['itemcounts']); } } return $rows;}// 统计该用户邀请的人数 必须是实名认证过的用户才可以计入function getinvitecounts($invitecode){ $sql = "select count(*) counts from users where parent_userid=(select userid from users where invitecode='$invitecode') and isverify='已认证';"; $row = query($sql); return $row['0']['counts'] ? $row['0']['counts'] : 0;}// 获取身份证号function get_cardnumber($userid){ global $db; $sql = "select cardnumber from userverify where userid='$userid'"; $row = query($sql); $cardnumber = isset($row[0]['cardnumber']) ? $row[0]['cardnumber'] : 0; if (!$cardnumber) { return false; } return $cardnumber;}// 是否提交过验证信息function check_exist_verifyinfo($cardnumber){ $sql = "select count(*) counts from userverify where cardnumber='$cardnumber'"; $row = query($sql); $isexist = isset($row[0]['counts']) && !empty($row[0]['counts']) ? true : false; return $isexist;}// 获取币的名字function get_coinname($projectcoinid){ $sql = "select coinname from projectcoin where projectcoinid='$projectcoinid'"; $row = query($sql); return isset($row[0]['coinname']) ? $row[0]['coinname'] : '';}// 新增通知消息(和币变化有关的通知消息)function add_user_coin_notice($userid, $coinname, $amount, $tips, $roundsid=0, $partner_room_reward_lev=0, $fromuserid=0){ if (!$userid) { return false; } if (!$amount) { return false; } $d['ac'] = __FUNCTION__; try { beginTrans(); // 开启事务 $now_time = time(); $coinname = strtoupper($coinname); // 币名称 // 项目方总币数减 给玩家加币 $sql = "select last, projectcoinid from projectcoin where coinname='$coinname'"; $row = query($sql); if (!$row) { return err($d['ac'], '项目方币的数量不够'); } $last = $row[0]['last']; $projectcoinid = $row[0]['projectcoinid']; if ($last - $amount < 0 ) { rollBackTrans(); return err($d['ac'], '项目方币的数量不够'); } $sql = "update projectcoin set last=last-'$amount' where projectcoinid='$projectcoinid'"; $updateid = query($sql); if ($updateid === false) { rollBackTrans(); return err($d['ac'], '项目方币的数量更新失败'); } $sql = "select amount from asset where projectcoinid='$projectcoinid' and userid='$userid'"; $res = query($sql); if (!$res) { rollBackTrans(); return err($d['ac'], '用户资产不足'); } $oamount = $res[0]['amount']; $namount = $oamount + $amount; // 改变后的金额 $sql = "update asset set amount=amount+'$amount' where projectcoinid='$projectcoinid' and userid='$userid'"; $updateid = query($sql); if ($updateid === false){ rollBackTrans(); return err($d['ac'], '用户资产更新失败'); } // 添加金币增加记录 $sql = "insert into notice (`projectcoinid`, `number`, `userid`, `tips`, `createtime`, `roundsid`, `award1type`, `fromuserid`, `oldval`, `newval`) values ('$projectcoinid', '$amount', '$userid', '$tips', '$now_time', '$roundsid', '$partner_room_reward_lev', '$fromuserid', '$oamount', '$namount')"; $insertid = query($sql); if (false === $insertid) { rollBackTrans(); return err($d['ac'], '用户通知记录更新失败'); } commitTrans(); } catch (Exception $e) { logs("-----事务错误-----" . $e->getMessage()); } return true;}// 新增通知消息(一般性的通知消息)function add_normal_notice($userid, $amount, $tips, $partnerlev=0, $fromuserid=0){ $now_time = time(); $sql = "insert into notice ( `number`, `userid`, `tips`, `createtime`, `award1type`, `fromuserid`) values ('$amount', '$userid', '$tips', '$now_time', '$partnerlev', '$fromuserid')"; $insertid = query($sql); if (false === $insertid) { return false; } return true;}// 获取玩家所在的局信息function get_player_roundsid($userid){ global $roundinfo; foreach ($roundinfo as $key=>$round) { if ($round['userid'] == $userid || $round['touserid'] == $userid) { return ['roundsid' => $key, 'interval' => $round['endtimestamp'] - time()]; } } return false;}// 加密方法function my_encrypt($data, $key) { // Remove the base64 encoding from our key $encryption_key = base64_decode($key); // Generate an initialization vector// $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc')); $iv = "{SE<X<L@2+mP=Gms"; // Encrypt the data using AES 256 encryption in CBC mode using our encryption key and initialization vector. $encrypted = openssl_encrypt($data, 'aes-256-cbc', $encryption_key, 0, $iv); // The $iv is just as important as the key for decrypting, so save it with our encrypted data using a unique separator (::) return base64_encode($encrypted . '::' . $iv);}// 解密方法function my_decrypt($data, $key) { // Remove the base64 encoding from our key $encryption_key = base64_decode($key); // To decrypt, split the encrypted data from our IV - our unique separator used was "::" list($encrypted_data, $iv) = explode('::', base64_decode($data), 2); return openssl_decrypt($encrypted_data, 'aes-256-cbc', $encryption_key, 0, $iv);}// 检查用户是否登录function check_user_login($uid_encrypted){ global $publickey, $db; if (!$uid_encrypted) { return false; } $uid = my_decrypt($uid_encrypted, $publickey); if (!$uid) { return false; } $row = query("select count(*) counts from users where userid='$uid'"); if (!isset($row['0']['counts']) && $row[0]['counts'] > 0) { return false; } return true;}// 生成邀请码function generate_invite_code($length = 5, $test=false){ $chars = str_shuffle("ABCDEFGHJKMNPQRSTUVWXYZ23456789"); if ($test) { $chars = str_shuffle("ABCDEFGHJKMNPQRSTUVWXYZ"); } $randomString = substr($chars, 0, $length); return $randomString;}// 匹配所有玩家function match_allroom_players($roomusers, $timeout = 10) { global $uconn; // 用户id和连接的kv数组 global $roomusers; // 循环所有房间,匹配每个房间的用户 if (!count($roomusers)) { return false; } foreach ($roomusers as $kk=>&$roomuser) { // 房间只有一个玩家 if (count($roomuser) == 1) { $userid = $roomuser[0]['userid']; $c = $uconn[$userid]; $timestamp = $roomuser[0]['timestamp']; if (time() - $timestamp > $timeout) { // 时间超过10秒就删除这个玩家,发送匹配失败的消息 logs("----玩家等待超时,匹配失败----"); unset($roomusers[$kk][0]); wd($c, err('matchsync', "未找到对手,请稍后再试")); } } while (count($roomuser) > 1 ) { $r = match_oneroom_players($roomuser); foreach ($roomuser as $key => $user) { if ( $user['userid'] == $r['userid'] || $user['userid'] == $r['touserid'] ) { unset( $roomusers[$kk][ $key ] ); // 从数组中删除匹配成功的玩家 } } $roomusers[$kk] = array_values( $roomuser ); // 重置索引 // 给玩家发送匹配者的信息,给匹配者发送玩家的信息 $userid = $r['userid']; $player = get_playerinfo($userid); $player['position'] = 'left'; $touserid = $r['touserid']; $toplayer = get_playerinfo($touserid); $toplayer['position'] = 'right'; $c = isset($uconn[$userid]) ? $uconn[$userid] : null; $c2 = isset($uconn[$touserid]) ? $uconn[$touserid] : null; if (!$c) { return err('matchsync', "玩家连接不存在"); } if (!$c2) { return err('matchsync', "对手连接不存在"); } if (!$player) { wd($c2, err('matchsync', "发起玩家不存在")); return false; } if (!$toplayer) { wd($c, err('matchsync', "匹配玩家不存在")); return false; } $roomid = $kk; $roomconfigs = prepare_room_game_configs($roomid, $userid, $touserid); // 给当前房间创建游戏配置 logs("--------游戏房间配置" . json_encode($roomconfigs)); if (is_string($roomconfigs)) { wd($c, err('matchsync', $roomconfigs)); // 房间创建游戏配置失败 return false; } // 广告链接 $player['adurl'] = $roomconfigs['adurl']; $toplayer['adurl'] = $roomconfigs['adurl']; // 游戏矿车分类id $configsid = get_machine($userid); $toconfigsid = get_machine($touserid); $player['configsid'] = $configsid; $toplayer['configsid'] = $toconfigsid; // 机器人固定木质矿机 if ($player['isrobot']) { $player['configsid'] = 8; } if ($toplayer['isrobot']) { $toplayer['configsid'] = 8; } $plate = get_machine_plate($userid); // 车牌 $toplate = get_machine_plate($touserid); // 车牌 $player['plate'] = $plate; $toplayer['plate'] = $toplate; wd($c, suc('matchsync', $toplayer)); // 发送给客户端匹配玩家信息 wd($c2, suc('matchsync', $player)); // 发送给客户端发起玩家信息 $lev = $player['lev']; // 级别 $tolev = $toplayer['lev']; // 对手级别 $models = get_room_gamemodel($roomid, $userid, $touserid, $roomconfigs, $lev, $tolev); if (is_string($models) && in_array($models, ['no_model', 'no_items', 'no_roomid', 'no_userid', 'no_insertid', "not_enough_coins", "upgrade_fail"])) { logs("models error msg"); wd($c, err('thisroomgamemodel', "游戏渲染出错,错误原因:" . $models)); wd($c2, err('thisroomgamemodel', "游戏渲染出错,错误原因:" . $models)); return false; } } } logs("---匹配后房间还有谁---" . json_encode($roomusers));}// 创建房间游戏配置function prepare_room_game_configs($roomid, $userid, $touserid){ // 随机取最小的order中的一条 $sql = "select * from roundmodel where roomid='$roomid' order BY roundorder, RAND() LIMIT 0, 1 "; $row = query($sql); $row = isset($row[0]) ? $row[0] : []; if (!count($row)) { return "该房间未设置游戏模型"; } $result = get_one_room($roomid); $row['fee'] = $result['fee']; // 房间费用 $row['backpercent'] = $result['backpercent']; // 比率 $row['projectcoinid'] = $result['projectcoinid']; // 项目币id // 第一局才扣除玩家的入门费 $updateid1 = takeoff_player_roomfee($roomid, $userid, $row['projectcoinid']); $updateid2 = takeoff_player_roomfee($roomid, $touserid, $row['projectcoinid']); if ($updateid1 === false || false === $updateid2) { return "玩家入场费扣除失败"; } return $row;}// 获取房间信息function get_one_room($roomid){ $row = query("select * from room where roomid='$roomid'"); return isset($row[0]) ? $row[0] : [];}// 匹配某个房间的玩家function match_oneroom_players($thisroomusers) { $length = count($thisroomusers); $result = ['userid' => 0, 'touserid' => 0, 'diff' => PHP_INT_MAX]; for ($i=0; $i<$length; ++$i) { for ($j=$i+1; $j<$length; ++$j) { $diff = abs($thisroomusers[$i]['lev'] - $thisroomusers[$j]['lev']); if ($diff < $result['diff']) { $result['userid'] = $thisroomusers[$i]['userid']; $result['touserid'] = $thisroomusers[$j]['userid']; $result['diff'] = $diff; } } } return $result;}// 获取该房间的游戏模型function get_room_gamemodel($roomid, $userid, $touserid, $row, $lev, $tolev, $upgradeconfigs='', $toupgradeconfigs='', $orders=0 ){ logs("房间id" . $roomid); logs("userid-lev" . $userid. "-" . $lev); global $db, $roundinfo, $publickey; if (!$roomid) { return "no_roomid"; } if (!$userid || !$touserid) { return "no_userid"; } $roundmodelid = $row['roundmodelid']; $roundsecond = $row['roundsecond']; $bgimg_iconpicid = $row['bgimg_iconpicid']; $bgsound_iconpicid = $row['bgsound_iconpicid']; $fee = $row['fee']; // 房间费用 $backpercent = $row['backpercent']; // 比率 $reward = $fee * 2 * $backpercent * 0.01; // 这个房间的游戏奖励 logs("-------房间的配置信息---------"); $reward_coin = get_coinname($row['projectcoinid']); // 币种名字 $sql = "SELECT I.*, P.coinname, C.w, C.h, C.pathimage FROM roundmodelitem I LEFT JOIN roundmodel M ON I.roundmodelid = M.roundmodelid LEFT JOIN projectcoin P ON P.projectcoinid = I.projectcoinid LEFT JOIN iconpic C ON C.iconpicid = I.iconpicid WHERE I.roundmodelid = '$roundmodelid'"; $row['items'] = query($sql); if (!$row['items']) { return "no_items"; } $amounts = []; // 币id和amount kv结构 $amount_arr = []; // 计算随机的币的数量 foreach ($row['items'] as $k => $item) { $arr = [$item['amountmin'], $item['amountmax']]; sort($arr); $amount = mt_rand($arr[0]*10000, $arr[1]*10000) / 10000; $roundmodelitemid = $item['roundmodelitemid']; $amount_arr[$roundmodelitemid] = $amount; $projectcoinid = $item['projectcoinid']; // 计算每种币对应的数量 if (isset($amounts[$projectcoinid])) { $amounts[$projectcoinid] += $amount; } else { $amounts[$projectcoinid] = $amount; } } // 检查项目方的币是否够抓 logs("---项目方币---"); var_dump($amounts); $projectcoinids_not_enough = []; foreach ($amounts as $key=>$amount) { $projectcoinid = $key; $sql = "select last from projectcoin where projectcoinid='$projectcoinid'"; $one = query($sql); if (!$one) { $last = 0; } else { $last = $one[0]['last']; } if (floatval($last) < $amount) { // 这种币不够抓,把它从场景道具里面删掉 $projectcoinids_not_enough[] = $key; } } $_projectcoinids = []; // 删除项目方币数不够的场景道具 foreach ($row['items'] as $k => $item) { $projectcoinid = $item['projectcoinid']; if (in_array($projectcoinid, $projectcoinids_not_enough)) {// unset($row['items'][$k]); } else { $_projectcoinids[$projectcoinid] = $projectcoinid; } } $info['coin_round'] = ""; // 当前局的币名字 // 只有一种币 if (count($_projectcoinids) == 1) { $info['coin_round'] = get_coinname(current($_projectcoinids)); } elseif (count($_projectcoinids) == 0) { return "not_enough_coins"; } $createtime = time(); // 写入 rounds beginTrans(); $sql = "insert into rounds (`userid`, `touserid`, `roundsecond`, `createtime`, `roundmodelid`, `bgimg_iconpicid`, `bgsound_iconpicid`) values ('$userid', '$touserid', '$roundsecond', '$createtime', '$roundmodelid', '$bgimg_iconpicid', '$bgsound_iconpicid')"; $roundsid = query($sql); // 局id $endtimestamp = $createtime + $roundsecond; // 游戏结束时间 $starttimestamp = $createtime + $row['delay']; // 创建时间加延迟时间==游戏开始时间 // 写入userid 对道具的 kv $roundinfo[$roundsid] = [ "reward_user_" . $userid => 0, // 玩家的奖励 "reward_user_" . $touserid => 0, // 对象的奖励 "reward_user_coinlist_" . $userid => [], // 玩家的奖励 "reward_user_coinlist_" . $touserid => [], // 对象的奖励 "userid" => $userid, "touserid" => $touserid, "uuid" => my_encrypt($userid, $publickey), "touuid" => my_encrypt($touserid, $publickey), "roomid" => $roomid, 'endtimestamp' => $endtimestamp, // 游戏结束时间戳 "starttimestamp" => $starttimestamp, "roundmodelid" => $roundmodelid, "caughtcointimestamp" . $userid => 0, "caughtcointimestamp" . $touserid => 0, "orders" => $orders+1, // 第几场 "reward_room" => $reward, "coin_reward_room" => $reward_coin ]; // 批量插入道具 $items_sql = "insert into roundsitem (`roundsid`, `projectcoinid`, `gravity`, `amount`, `x`, `y`, `angle`, `iconpicid`) values "; foreach ($row['items'] as $k => $item) { $projectcoinid = $item['projectcoinid']; $gravity = $item['gravity']; $roundmodelitemid = $item['roundmodelitemid']; $amount = $amount_arr[$roundmodelitemid]; $x = $item['x']; $y = $item['y']; $angle = $item['angle']; $iconpicid = $item['iconpicid']; // 写入 roundsitem $items_sql .= " ('$roundsid', '$projectcoinid', '$gravity', '$amount', '$x', '$y', '$angle', $iconpicid),"; $row['items'][$k]['amount'] = $amount; unset($row['items'][$k]['amountmin']); unset($row['items'][$k]['amountmax']); unset($row['items'][$k]['projectcoinid']); unset($row['items'][$k]['roundmodelid']); unset($row['items'][$k]['showodds']); unset($row['items'][$k]['iconpicid']); } // 拼insert语句 $sql = substr($items_sql, 0, -1); $flag = query($sql); // 是否全部写入 if ($roundsid && $flag) { logs("---全部写入---"); commitTrans(); } else { logs("---插入失败---"); rollBackTrans(); return "no_insertid"; } // 查出当前局的道具列表 $sql = "select roundsitemid, amount from roundsitem where roundsid='$roundsid'"; $list = query($sql); foreach ($list as $k => $value) { $k2 = "item_" . $value['roundsitemid']; // 道具的id $roundinfo[$roundsid][$k2] = $value['amount']; $row['items'][$k]['roundmodelitemid'] = $value['roundsitemid']; } $info['title'] = $row['title']; // 模型标题 $info['roundsid'] = $roundsid; // 局 id $info['roundsecond'] = $row['roundsecond']; $info['bgimg_path'] = get_iconpic_path($row['bgimg_iconpicid']); // 背景图片 $info['bgsound_path'] = get_iconpic_path($row['bgsound_iconpicid']); // 背景音乐 $info['items'] = array_values($row['items']); // 道具集合 $info['reward_room'] = $reward; // 房间的奖金 $info['coin_reward_room'] = $reward_coin; // 房间的奖金币种 unset($row['delay']); unset($row['adurl']); logs("----thisroommodel----".json_encode($info)); $roundinfo[$roundsid]["gameinfo"] = $info; // 游戏信息 $user_rounds = get_user_rounds($userid); // 玩家当前真实局总数 $touser_rounds = get_user_rounds($touserid); // 玩家当前真实局总数 $roundinfo[$roundsid]['lev'] = $lev + 1; $roundinfo[$roundsid]['tolev'] = $tolev + 1; $roundinfo[$roundsid]["userrounds"] = $user_rounds; // 玩家当前局总数 $roundinfo[$roundsid]["touserrounds"] = $touser_rounds; // 玩家当前局总数 if ($upgradeconfigs) { logs("wowowowowwowowowowow"); $roundinfo[$roundsid]["upgrade"] = $upgradeconfigs; } if ($toupgradeconfigs) { logs("wowowowowwowowowowow"); $roundinfo[$roundsid]["toupgrade"] = $toupgradeconfigs; } logs("---------后台的局情况------------"); $rounds = cal_rounds($lev+1); // 当前级别升级需要的局数 $torounds = cal_rounds($tolev+1); // 对手当前级别升级需要的局数 $lev2 = $lev+1; logs("-----{$userid}要升到的级别$lev2------" ); logs("----需要的局数----".$rounds); logs("----玩了多少局----".$user_rounds); if ($rounds <= $user_rounds) { // 升级 $result = upgrade_lev($userid, $lev); logs("----触发升级---"); if ($result === false) { return "upgrade_fail"; } $roundinfo[$roundsid]["upgradeconfigs"] = $result; } if ($torounds <= $touser_rounds) { // 升级 $result = upgrade_lev($touserid, $tolev); logs("----触发升级---"); if ($result === false) { return "upgrade_fail"; } $roundinfo[$roundsid]["toupgradeconfigs"] = $result; }// logs("------生成游戏模型" . json_encode($roundinfo)); return array_values($_projectcoinids);}// 升级 送道具 加积分 算力function upgrade_lev($userid, $lev){ $lev = intval($lev); if (!$userid) { return false; } $rounds = cal_rounds($lev+1); // 升级需要的局数 $next_rounds = cal_rounds($lev+2); // 下次升级需要的局数 $levp = ($next_rounds-$rounds) / $next_rounds; // 距离下次升级的百分比 // 更新后的等级 $lev = $lev + 1; $tool_nums = ceil($lev/10); $powers = ceil($lev/10); $gms = $lev * 10; $oil = ceil($lev/10) * 10; $sql = "update users set lev=lev+1, power=power+'$powers', levp='$levp' where userid='$userid'"; $flag = query($sql); if ($flag === false) { return false; } // 更新积分 +10 * lev(gms就是积分) add_user_coin_notice($userid, "GMS", $gms, "升级奖励GMS{$gms}"); // 加油 $sql = "update user_items set remain=remain+'$oil' where userid='$userid' and configsid=14"; // 汽油 $flag = query($sql); if ($flag === false) { return false; } add_normal_notice($userid, $oil, "升级奖励汽油+{$oil}"); gain_configs($userid, $tool_nums, "升级奖励"); logs("**************升级!!!!*************"); return compact('lev', 'tool_nums', 'gms', 'powers', 'oil'); // 送道具}// 送道具function gain_configs($userid, $num, $tips=''){ // 送随机道具 只有1-7 xx液 $time = time(); $tools = [1=>0, 2=>0, 3=>0, 4=>0, 5=>0, 6=>0, 7=>0]; for ($i=0; $i<$num; ++$i) { $random = rand(1, 7); $tools[$random] = ++$tools[$random]; } foreach ($tools as $k=>$v) { if (!$v) { continue; } $sql = "select count(*) counts from user_items where configsid='$k' and userid='$userid'"; $row = query($sql); if ($row[0]['counts']) { $sql = "update user_items set remain=remain+'$v' where configsid='$k' and userid='$userid'"; query($sql); } else { $sql = "insert into user_items (`userid`, `configsid`, `obtaintime`, `obtainway`, `remain`) values ('$userid', '$k', '$time', '$tips', '$v')"; query($sql); } } $tips = $tips . "道具+{$num}个"; add_normal_notice($userid, $num, $tips); $tips = $tips . "道具+{$num}个"; add_normal_notice($userid, $num, $tips); return 1;}// 获取玩家局总数function get_user_rounds($userid){ if (!$userid) { return false; } $sql = "select count(*) counts from rounds where userid={$userid} or touserid={$userid}"; $row = query($sql); return isset($row[0]['counts']) ? $row[0]['counts'] : 0;}// 获取素材路径function get_iconpic_path($iconpicid){ global $db; if (!$iconpicid) { return null; } $sql = "select pathimage from iconpic where iconpicid={$iconpicid}"; $row = query($sql); return isset($row[0]['pathimage']) ? $row[0]['pathimage'] : null;}// 获取素材路径function get_iconpic_info($iconpicid){ global $db; if (!$iconpicid) { return null; } $sql = "select pathimage, w, h from iconpic where iconpicid={$iconpicid}"; $row = query($sql); return isset($row[0]) ? $row[0] : null;}// 打印日志function logs($msg){ echo date('Y-m-d H:i:s').' '.$msg.PHP_EOL;}// 从临时连接数组删除当前连接function delete_connection_from_temp_css($c){ global $temp_css; foreach ($temp_css as $key => $v) { if ($c == $v['c']) { logs('----从临时连接数组删除----'); unset($temp_css[$key]); } }}// 检查请求是否违规function check_violation_request() { return true;}// 获取ipfunction get_ip(){ $ipaddress = ''; if (getenv('HTTP_CLIENT_IP')) $ipaddress = getenv('HTTP_CLIENT_IP'); else if(getenv('HTTP_X_FORWARDED_FOR')) $ipaddress = getenv('HTTP_X_FORWARDED_FOR'); else if(getenv('HTTP_X_FORWARDED')) $ipaddress = getenv('HTTP_X_FORWARDED'); else if(getenv('HTTP_FORWARDED_FOR')) $ipaddress = getenv('HTTP_FORWARDED_FOR'); else if(getenv('HTTP_FORWARDED')) $ipaddress = getenv('HTTP_FORWARDED'); else if(getenv('REMOTE_ADDR')) $ipaddress = getenv('REMOTE_ADDR'); else $ipaddress = 'UNKNOWN'; return $ipaddress;}// 如果超过两秒就剔除房间的用户function check_matchplayers_heart($timeout = 2){ global $tconn, $roomusers;// $roomusers = [// '3'=>[// ['userid' => 100, 'lev' => 0],// ['userid' => 55, 'lev' => 10],// ['userid' => 83, 'lev' => 1],// ['userid' => 22, 'lev' => 17],// ['userid' => 52, 'lev' => 18],// ['userid' => 53, 'lev' => 18],// ], // 二号房间的玩家// '4'=>[// ['userid' => 12, 'lev' => 0],// ['userid' => 13, 'lev' => 10],// ['userid' => 14, 'lev' => 1],// ['userid' => 15, 'lev' => 17],// ['userid' => 18, 'lev' => 18],// ['userid' => 20, 'lev' => 18],// ],// ]; if (!count($roomusers)) { return; } foreach ($roomusers as $key => $roomuser) { if (count($roomuser) == 0) { continue; } foreach ($roomuser as $kk => $user) { $timestamp = isset($tconn[$user['userid']]) ? $tconn[$user['userid']] : PHP_INT_MAX; logs("-------加入房间的时间戳----" . date("Y-m-d H:i:s", $timestamp)); // 如果超过两秒就剔除房间的用户 if (time() - $timestamp > $timeout) { logs('----删除超过'. $timeout .'秒的玩家----'); unset($roomusers[$key][$kk]); } $roomusers[$key] = array_values( $roomuser ); // 重置索引 } }}// 剔除房间的玩家function kick_out_player($userid){ global $roomusers; if (!$userid) { return false; } foreach ($roomusers as $key => $roomuser) { foreach ($roomuser as $kk => $user) { if ($user['userid'] == $userid) { logs('----剔除玩家----'. $userid); unset($roomusers[$key][$kk]); } } } $roomusers = array_values( $roomusers ); // 重置索引 return true;}// 获取玩家信息function get_playerinfo($playerid){ global $publickey; $sql = "select userid, phone, nickname, sex, faceimage, isrobot, levp, lev, invitecode, ispartner from users where userid='$playerid'"; $row = query($sql); if (!isset($row[0]) || !count($row[0])) { return 0; } $row[0]['uuid'] = my_encrypt($row[0]['userid'], $publickey); unset($row[0]['userid']); return $row[0];}// 匹配前要检查玩家的资产金额是否大于房间的入门费function check_player_asset_is_higher_for_roomfee($roomid, $playerid, $projectcoinid='0') { // 入门费 $sql = "select fee from room where roomid='$roomid'"; $row = query($sql); $fee = $row[0]['fee']; // 用户资产 $sql = "select amount from asset where userid='$playerid' and projectcoinid='$projectcoinid'"; $row = query($sql); $amount = isset($row[0]['amount']) ? $row[0]['amount'] : 0; if ($amount < $fee) { return false; } return true;};// 扣除玩家的房间的入场费function takeoff_player_roomfee($roomid, $playerid, $projectcoinid='0'){ // 入门费 $sql = "select fee from room where roomid='$roomid'"; $row = query($sql); $fee = $row[0]['fee']; $sql = "update asset set amount=amount-'$fee' where userid='$playerid' and projectcoinid='$projectcoinid' and amount>0"; $flag = query($sql); if ($flag === false) { return false; } return true;}// 给玩家添加房间奖励币function add_user_room_reward($userid, $reward, $coinname) { global $db; $projectcoinid = get_pojectcoinid($coinname); $sql = "update asset set amount=amount+'$reward' where userid='$userid' and projectcoinid='$projectcoinid'"; $insertid = query($sql); if (!$insertid) { return false; } return true;}// 获取coin idfunction get_pojectcoinid($coinname){ $sql = "select projectcoinid from projectcoin where coinname='$coinname'"; $row = query($sql); return isset($row[0]['projectcoinid']) ? $row[0]['projectcoinid'] : 0;}// 把各自的奖励写入这一轮的 award 和 toaward 字段function update_player_reward($roundsid, $reward_user=0, $reward_touser=0) { $sql = "update rounds set award='$reward_user', toaward='$reward_touser' where roundsid='$roundsid'"; $updateid = query($sql); if ($updateid === false) { return false; } return true;}// 注册成功后,给每一个用户创建一套项目方的币种function init_user_projectcoin($userid){ // 查出项目方的币 global $db; $sql = "select projectcoinid from projectcoin"; $rows = query($sql); foreach ($rows as $key=>$row) { $projectcoinid = $row['projectcoinid']; $sql = "select count(*) counts from asset where userid='$userid' and projectcoinid = '$projectcoinid'"; $row = query($sql); if (isset($row[0]['counts']) && $row[0]['counts']) { continue; } $sql = "insert into asset (`userid`, `projectcoinid`, `amount`) values ('$userid', '$projectcoinid', '0')"; query($sql); }}// 批量生成用户function generate_robot_user(){ $db=new \Workerman\MySQL\Connection(C['dbhost'],C['dbport'],C['dbuname'],C['dbpwd'],C['dbname']); $phone = 15600000003; $arr = []; for ($i=0; $i<100; ++$i) { // 执行注册 $pwd = generate_invite_code(6); $arr[] = ['phone' => $phone, 'pwd' => $pwd]; $pwd = password_hash($pwd, PASSWORD_DEFAULT); $invitecode = generate_invite_code(5); // 生成自己的邀请码 $sql = "insert into users (`phone`, `pwd`, `invitecode`, `parent_userid`) values ('$phone', '$pwd', '$invitecode', '0')"; $id = query($sql); ++ $phone; } file_put_contents("abc.txt", json_encode($arr));}// 计算这个等级需要的局数function cal_rounds($level){ $level = intval($level); if ($level == 1) { return 1; } return 10 * ( ($level+1) * $level / 2 - 1 ) + 1;}// 抽成function divided_into($money, $userid, $touserid, $coinname='GMC'){ // 合伙人的等级 $lev = get_partner_lev($userid); $tolev = get_partner_lev($touserid); // 合伙人分成 if ($lev) { distribute_benefits($lev, $coinname, $money, $userid); } if ($tolev) { distribute_benefits($tolev, $coinname, $money, $touserid); }}// 找合伙人的分级function get_partner_lev($userid){ $sql = "select ispartner from users where userid='$userid'"; $row = query($sql); $partner_lev = isset($row[0]['ispartner']) ? $row[0]['ispartner'] : ''; return $partner_lev;}// 分配三级收益function distribute_benefits($lev, $coinname, $money, $userid){ $rate = [ '初级' => [0.02, 0.005, 0.0025], '中级' => [0.03038, 0.006, 0.003], '高级' => [0.0491, 0.0078, 0.0039], '特级' => [0.08425, 0.0109, 0.00545], '至尊' => [0.15275, 0.0164, 0.000082], ]; switch ($lev) { case '初级': add_coin_triple($userid, $coinname, $money, $rate[$lev]); break; case '中级': add_coin_triple($userid, $coinname, $money, $rate[$lev]); break; case '高级': add_coin_triple($userid, $coinname, $money, $rate[$lev]); break; case '特级': add_coin_triple($userid, $coinname, $money, $rate[$lev]); break; case '至尊': add_coin_triple($userid, $coinname, $money, $rate[$lev]); break; }}// 增加三个层级的用户的币function add_coin_triple($userid, $coinname, $money, $rates){ // 一层 $sql = "select userid from users where parent_userid='$userid'"; $row = query($sql); $userid1 = isset($row[0]['userid']) ? $row[0]['userid'] : 0; add_user_coin_notice($userid1, $coinname, $money*$rates[0], "合伙人房间奖励", 1, $userid); // 二层 $sql = "select userid from users where parent_userid='$userid1'"; $row = query($sql); $userid2 = isset($row[0]['userid']) ? $row[0]['userid'] : 0; add_user_coin_notice($userid2, $coinname, $money*$rates[1], "合伙人房间奖励", 2, $userid1); // 三层 $sql = "select userid from users where parent_userid='$userid2'"; $row = query($sql); $userid3 = isset($row[0]['userid']) ? $row[0]['userid'] : 0; add_user_coin_notice($userid3, $coinname, $money*$rates[2], "合伙人房间奖励", 3, $userid2); return;}// sql查询function query($sql) { global $db; return $db->query($sql);}// curl getfunction curl_get($url){ $agent= 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)'; $ch = curl_init(); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_VERBOSE, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_USERAGENT, $agent); curl_setopt($ch, CURLOPT_URL,$url); curl_exec($ch);}// 支付回调function pay_callback(){ $s2=new Worker('http://0.0.0.0:8888'); $s2->count=1; $s2->onWorkerStart = function ($worker) { global $db; $db=new \Workerman\MySQL\Connection(C['dbhost'],C['dbport'],C['dbuname'],C['dbpwd'],C['dbname']); }; $s2->onMessage=function($c,$d){ global $uconn; if (empty($d['get']['ac']) || "callback" != $d['get']['ac']) { $c->send('缺少关键信息'); return; } if ("120.78.91.214" != get_ip()) {// $c->send('非法ip');// return; } if (isset($d['get']['no']) && $d['get']['no']) { // 执行购买道具 // 直接返回支付成功的消息给客户端 $no = $d['get']['no']; // 订单号 $sql = "select shopid,userid,status,payamount from `order` where no='$no'"; $row = query($sql); $shopid = isset($row[0]['shopid']) ? $row[0]['shopid'] : 0; $userid = isset($row[0]['userid']) ? $row[0]['userid'] : 0; $status = isset($row[0]['status']) ? $row[0]['status'] : 0; $payamount = isset($row[0]['payamount']) ? $row[0]['payamount'] : 0; if (!$shopid || !$userid) { $c->send('缺少关键信息'); return; } if ($status) { $c->send('该订单已处理过'); return; } $sql = "select title, pic, configsid, value, amount, plus from shop where shopid='$shopid'"; $row = query($sql); $configsid = isset($row[0]['configsid']) ? $row[0]['configsid'] : 0; $value = isset($row[0]['value']) ? $row[0]['value'] : 0; $amount = isset($row[0]['amount']) ? $row[0]['amount'] : 0; $plus = isset($row[0]['plus']) ? $row[0]['plus'] : 0; $title = isset($row[0]['title']) ? $row[0]['title'] : 0; $price = isset($row[0]['price']) ? $row[0]['price'] : 0; $pic = isset($row[0]['pic']) ? $row[0]['pic'] : 0; // 获取分类名称 $sql = "select itemname from configs where configsid='$configsid'"; $row = query($sql); $catname = $row[0]['itemname']; $arr = [$no, $payamount, $shopid, $userid, $configsid, $value, $amount, $plus]; logs("---arr---". json_encode($arr)); $status = update_game_items($no, $payamount, $shopid, $userid, $configsid, $value, $title, $plus); // 增加游戏道具 if (!$status) { $c->send('购买失败'); return; } if (isset($uconn[$userid]) && $uconn[$userid]) { wd($uconn[$userid], suc('payover', compact('catname', 'title', 'pic', 'price', 'amount', 'value', 'status'))); $c->send('支付成功'); return; } else { $c->send('---' .json_encode($row)); return; } } else { $c->send('缺少关键信息2'); return; } }; $s2->listen();}Worker::runAll();