/** * index是默认的程序入口 * 判断客户端的请求是哪种消息类型,取出农场的id(fid),实例化farm * @param $fid 当客户端传来的消息又fid时将它付给$fid,否则将-1赋值给$fid * @param stripslsshes($message)是对客户端传来的json内容进行数组化 true不能没有 */ public function index() { /* * CodeIgniter 有3个 helper方法可以让用户取得POST, COOKIE 或 SERVER 的内容。用这些方法比直接使用php方法($_POST['something'])的好处是不用先检查此项目是不是存在。 直接使用php方法,必须先做如下检验: * if ( ! isset($_POST['something'])) * { * $something = FALSE; * }else{ * $something = $_POST['something']; * } * 用CodeIgniter内建的方法,你可以这样:$something = $this->input->post('something'); * 第一个参数是所要取得的post中的数据:$this->input->post('some_data');如果数据不存在,方法将返回 FALSE (布尔值)。 * 第二个参数是可选的,如果想让取得的数据经过跨站脚本过滤(XSS Filtering),把第二个参数设为TRUE。$this->input->post('some_data', TRUE); * 不设置任何参数,该方法将以一个数组的形式返回全部POST过来的数据。 * 把第一个参数设置为NULL,第二个参数设置为 TRUE (boolean),该方法将经过跨站脚本过滤,返回一个包含全部POST数据的数组。 * 如果POST没有传递任何数据,该方法将返回 FALSE (boolean) * $this->input->post(NULL, TRUE); // 经过跨站脚本过滤 返回全部 POST 数据 * $this->input->post(); // 不经过跨站脚本过滤 返回全部 POST 数据 * */ $unityPost = $this->input->post(); /* * reset() 将 array 的内部指针倒回到第一个单元并返回第一个数组单元的值。 * key() 函数返回数组中内部指针指向的当前单元的键名。 但它不会移动指针。如果内部指针超过了元素列表尾部,或者数组是空的,key() 会返回 NULL。 * 相关: * current() - 返回数组中的当前单元 * next() - 将数组中的内部指针向前移动一位 * */ reset($unityPost); $key = key($unityPost); $msg = $unityPost[$key]; /* * 客户端传来的数组每一项都是一个字符串,转义/",所以首先处理接收的数据 * addslashes函数主要是在字符串中添加反斜杠对特殊字符进行转义,stripslashes则是去掉转义后字符串中的反斜杠\, * 比如当你提交一段json数据到PHP端的时候可能会遇到json字符串中有\导致json_decode函数无法将json数据转换成数组的情况,这时你就需要stripslashes函数。 * 该函数用于清理从数据库或 HTML 表单中取回的数据。 * * */ stripslashes($msg); $info = json_decode($msg, TRUE); /* * 在下面的解析消息info域的时候,会保守的使用intval(*)进行类型转换。 * 因为传来的Form消息有可能来自于html表单(测试时),是以string类型传来的。 * intval — 获取变量的整数值 * 成功时返回 var 的 integer 值,失败时返回 0。 空的 array 返回 0,非空的 array 返回 1。 * 最大的值取决于操作系统。 32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647。 * 举例,在这样的系统上, intval('1000000000000') 会返回 2147483647。64 位系统上,最大带符号的 integer 值是 9223372036854775807。 * * */ switch ($key) { /** * 根据user_name获得这个玩家所在的农场,如果没有农场那么申请一个返回 * 先根据user_name查看luda数据库有没有这个用户,如果有这个用户, * 再查看player表看有没有用这个玩家,如果有才认为这个农场存在 * 申请农场的逻辑: * apply_farm用来给第一次登陆这个游戏的账户分配一个初始化的农场 初始化的农场一共有几种风格, * 保存在farmlayout.php中,include 'farmlayout'后即 可引入其中的信息,分配农场过后, * 需要将玩家的user_id与分配到的farm_id插入到关联表player中,player表用来判断用户是否登陆过游戏(根据user_id能否查到记录) */ case "GET_FARM": $user_name = $info['user_name']; $this->mongo_db->switch_db("luda"); $user_data = $this->mongo_db->where(array("user_name" => $user_name))->get("user"); $this->mongo_db->switch_db("fof"); if (!$user_data) { Utility::echoMsg('APP_SYNC_FAIL', 'user_name' . $user_name . ' doent exist in luda db'); exit(0); } else { $user_id = $user_data[0]['_id']; $player_data = $this->mongo_db->where(array("user_id" => $user_id))->get("player"); if (!$player_data) { $newfarm = FarmLayout::$farmlayout[0]; $farm_id_exist = true; /* while($farm_id_exist) { //$fid = rand(1,100000); $fid = 1; $farm_id_exist = $this->mongo_db->where(array("fid"=>$fid))->get('farm'); } */ $fid = 1; $newfarm['fid'] = $fid; $day_long = FarmConfig::getWorldConfig('DayLong'); //此处一定要把它整数化,否则客户端会解析Json出错 $newfarm['days_gone'] = intval(time() / $day_long); //mongoDB在插入的时候会把key="_id"的key-value pair插入到newfarm中。所以此处要去掉这个key $this->mongo_db->insert('farm', $newfarm); $this->mongo_db->insert('player', array("user_id" => $user_id, "fid" => $fid)); unset($newfarm['_id']); Utility::echoMsg('GET_FARM_ACK', $new_farm); } else { //该用户已经登陆过该游戏,数据库中有他的农场信息 直接返回给客户端 $fid = $player_data[0]['fid']; $farm = new Farm($fid); $farm_data = $farm->snapActivity(); Utility::echoMsg('GET_FARM_ACK', $farm_data); } } break; /* * FIXME: * GET_CONFIG应该发送客户端本地的版本号,如果版本号和服务器的不一致,那么就要返回服务器的CONFIG文件, * * */ /* * FIXME: * GET_CONFIG应该发送客户端本地的版本号,如果版本号和服务器的不一致,那么就要返回服务器的CONFIG文件, * * */ case "GET_CONFIG": $config_data = FarmConfig::toArray(); Utility::echoMsg('GET_CONFIG_ACK', $config_data); break; /* * 对Activity[tid].Q[qid]增加一个Job Queue Element. 这个JQE的名字是name.之所以是“增加”而不是“设置”是因为。这个动作明显是增加了Q. * name可能是"any",表达这是一个万能JQE(可以容纳任何job).对于猪圈,增加了一头猪。对于磨坊,增加了一个工作槽。 * * */ /* * 对Activity[tid].Q[qid]增加一个Job Queue Element. 这个JQE的名字是name.之所以是“增加”而不是“设置”是因为。这个动作明显是增加了Q. * name可能是"any",表达这是一个万能JQE(可以容纳任何job).对于猪圈,增加了一头猪。对于磨坊,增加了一个工作槽。 * * */ case "ADD_JQE": $fid = $info['fid']; $farm = new farm($fid); $name = $info['name']; $tid = intval($info['tid']); $qid = intval($info['qid']); $ret = $farm->addJqe($name, $tid, $qid); if ($ret['flag'] == 'ok') { Utility::echoMsg('ADD_JQE_ACK', 'ok'); } else { Utility::echoMsg('ADD_JQE_FAIL', $ret['text']); exit(0); } break; case "ADD_JOB": $fid = $info['fid']; $name = $info['name']; $tid = intval($info['tid']); $qid = intval($info['qid']); $count = intval($info['count']); $farm = new farm($fid); $ret = $farm->addJob($name, $tid, $qid, $count); if ($ret['flag'] == 'ok') { Utility::echoMsg('ADD_JOB_ACK', 'ok'); } else { Utility::echoMsg('ADD_JOB_FAIL', $ret['text']); exit(0); } break; case "INC_JOB": $fid = $info['fid']; $name = $info['name']; $tid = intval($info['tid']); $qid = intval($info['qid']); $count = intval($info['count']); $farm = new farm($fid); $ret = $farm->incJob($tid, $qid, $count); if ($ret['flag'] == 'ok') { Utility::echoMsg('INC_JOB_ACK', 'ok'); } else { Utility::echoMsg('INC_JOB_FAIL', $ret['text']); exit(0); } break; case "DEC_JOB": $fid = $info['fid']; $farm = new farm($fid); $farm->decJob($info); break; case "DEL_JOB": $fid = $info['fid']; $farm = new farm($fid); $farm->delJob($info); break; case "SPD_JOB": $fid = $info['fid']; $name = $info['name']; $tid = intval($info['tid']); $qid = intval($info['qid']); $secs = intval($info['secs']); $prog = intval($info['prog']); $farm = new farm($fid); $farm->spdJob($tid, $qid, $secs, $prog); break; case "LIT_JOB": $fid = $info['fid']; $farm = new farm($fid); $farm->litJob($info); break; case "DOA_JOB": $fid = $info['fid']; $farm = new farm($fid); $ret = $farm->doaJob($info); Utility::echoMsg('DOA_JOB_ACK', $ret); break; case "CREATE_FARM": //$farm->create_farm($unityPost); break; case "ADD_BUILDING": $fid = $info['fid']; $farm = new farm($fid); $farm->add_building($info); break; case "DEL_BUILDING": $fid = $info['fid']; $farm = new farm($fid); $farm->del_building($unityPost); break; case "MOV_BUILDING": $fid = $info['fid']; $farm = new farm($fid); $name = $info['name']; $bid = $info['b_id']; $newr = $info['r']; $newc = $info['c']; $ret = $farm->moveBuilding($name, $bid, $newr, $newc); if ($ret == 'ok') { Utility::echoMsg('MOV_BUILDING_ACK', 'ok'); } else { Utility::echoMsg('APP_SYNC_FAIL', $ret); exit(0); } break; case "UPG_BUILDING": $fid = $info['fid']; $farm = new farm($fid); $name = $info['name']; $bid = $info['b_id']; $ret = $farm->upgradeBuilding($name, $bid); if ($ret == 'ok') { Utility::echoMsg('UPG_BUILDING_ACK', 'ok'); } else { Utility::echoMsg('APP_SYNC_FAIL', $ret); exit(0); } break; case "UPG_BOVER": $fid = $info['fid']; $farm = new farm($fid); $name = $info['name']; $bid = $info['b_id']; $ret = $farm->upgradeBuildingOver($name, $bid); if ($ret == 'ok') { Utility::echoMsg('UPG_BOVER_ACK', 'ok'); } else { Utility::echoMsg('APP_SYNC_FAIL', $ret); exit(0); } break; case "RCL_BUILDING": $fid = $info['fid']; $farm = new farm($fid); $name = $info['name']; $bid = $info['b_id']; $ret = $farm->recycleBuilding($name, $bid); if ($ret == 'ok') { Utility::echoMsg('RCL_BUILDING_ACK', 'ok'); } else { Utility::echoMsg('APP_SYNC_FAIL', $ret); exit(0); } break; case "RCL_BOVER": $fid = $info['fid']; $farm = new farm($fid); $name = $info['name']; $bid = $info['b_id']; $ret = $farm->recycleBuildingOver($name, $bid); if ($ret == 'ok') { Utility::echoMsg('RCL_BUILDINGOVER_ACK', 'ok'); } else { Utility::echoMsg('APP_SYNC_FAIL', $ret); exit(0); } break; case "DWG_BUILDING": $fid = $info['fid']; $farm = new farm($fid); $farm->dwg_building($unityPost); break; case "CLEAN_BUILDING": //$farm->clean_building($unityPost); break; case "BST_BUILDING": $fid = $info['fid']; $farm = new farm($fid); $name = $info['name']; $bid = $info['b_id']; $ret = $farm->boostBuilding($name, $bid); if ($ret == 'ok') { Utility::echoMsg('BST_BUILDING_ACK', 'ok'); } else { Utility::echoMsg('APP_SYNC_FAIL', $ret); exit(0); } break; case "BST_BOVER": $fid = $info['fid']; $farm = new farm($fid); $name = $info['name']; $bid = $info['b_id']; $ret = $farm->boostBuildingOver($name, $bid); if ($ret == 'ok') { Utility::echoMsg('BST_BOVER_ACK', 'ok'); } else { Utility::echoMsg('APP_SYNC_FAIL', $ret); exit(0); } break; case "CAL_BUILDING": $fid = $info['fid']; $farm = new farm($fid); $name = $info['name']; $bid = $info['b_id']; $ret = $farm->cancelBuilding($name, $bid); if ($ret == 'ok') { Utility::echoMsg('CAL_BUILDING_ACK', 'ok'); } else { Utility::echoMsg('APP_SYNC_FAIL', $ret); exit(0); } break; case "FNS_BUILDING": $fid = $info['fid']; $farm = new farm($fid); $name = $info['name']; $bid = $info['b_id']; $ret = $farm->finishBuilding($name, $bid); if ($ret == 'ok') { Utility::echoMsg('FNS_BUILDING_ACK', 'ok'); } else { Utility::echoMsg('APP_SYNC_FAIL', $ret); exit(0); } break; default: echo "The opration is wrong!"; } }