request->get('user_id'); if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录 $grantRs = NewbieGuideService::grantSeedIfNeeded($userID); if ($grantRs != ResultStatusServices::RS_OPERATION_SUCCESS) { return ClientMessageServices::sendMessage($grantRs); } //更新农场状态 $farmDbData = Farm::findOne(['user_id' => $userID]); LandService::updateAllCropStatus($userID, $farmDbData->id, $farmDbData->level); MuchangService::updateAllCropStatus($userID); //获取信息 $user = User::findById($userID); $user->token = Yii::$app->request->get('token'); //返回数据 return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $user->genClientData()); } /** *更改背景 */ public function actionChangeBg() { //获取数据 $userID = Yii::$app->request->get('user_id'); $itemID = Yii::$app->request->get('item_id');//要切换的背景物品ID if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录 if (!$itemID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARAM_ERROR); //检查物品是否为背景 $itemConfig = GameConfigServices::getParamByPath('item_list.' . $itemID); //if (!$itemConfig) return ClientMessageServices::sendMessage(ResultStatusServices::RS_NOT_FIND_IN_CONFIG); //if ($itemConfig['type2'] != ItemServices::ITEM_TYPE2_BG) return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARAM_ERROR); //查询数据库中是否有这个商品 $itemDbData = Item::findOne(['user_id' => $userID, 'item_id' => $itemID]); if (!$itemDbData) return ClientMessageServices::sendMessage(ResultStatusServices::RS_NOT_FIND_IN_DB); //更改农场背景 $farmDbData = Farm::findOne(['user_id' => $userID]); $farmDbData->bg_image_id = $itemID; if (!$farmDbData->save(true, ['bg_image_id', 'updated_at'])) return ClientMessageServices::sendMessage(ResultStatusServices::RS_SAVE_DB_ERROR); //记录日志 UserLogService::addUserLog($userID, EnumUtil::USER_LOG_TYPE_CHANGE_FARM_STYLE, 0, 0); return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS); } /** * 农场升级 */ public function actionUpgrade() { $userID = Yii::$app->request->get('user_id'); if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录 $farmDbData = Farm::findOne(['user_id' => $userID]); $farmConfig = GameConfigServices::getParamByPath('farm_level.' . ($farmDbData->level + 1)); if (!$farmConfig) return ClientMessageServices::sendMessage(ResultStatusServices::RS_NOT_FIND_IN_CONFIG);//已经达到最高级 $userDbData = User::findById($userID); if ($farmConfig['player_level'] > $userDbData->level) return ClientMessageServices::sendMessage(ResultStatusServices::RS_LEVEL_LIMIT);//等级不够 //升级 $dbTrans = Yii::$app->db->beginTransaction(); try { //扣除费用 MoneyUtil::parseAllItem($farmConfig['item_id'], 1, false, $userID, SystemLogUtil::FROM_TYPE_UPGRADE_FARM, ['config' => $farmConfig]); $farmDbData->level++; if (!$farmDbData->save(true, ['level', 'updated_at'])) return ClientMessageServices::sendMessage(ResultStatusServices::RS_SAVE_DB_ERROR); //记录日志 UserLogService::addUserLog($userID, EnumUtil::USER_LOG_TYPE_UPGRADE_FARM, 0, 0); AchievementUtil::addCount($userID, AchievementUtil::ID_FARM_UPGRADE, $farmDbData->level, true); $success = true; } finally { if (isset($success)) $dbTrans->commit(); else { $dbTrans->rollBack(); Yii::$app->redis->clearDirtyKey();//清除脏缓存数据 } } return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS); } /** * 农田扩建 */ public function actionExtendLand() { $userID = Yii::$app->request->get('user_id'); if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录 $farmDbData = Farm::findOne(['user_id' => $userID]); //查找索引最大的农田 $maxLandPosition = Land::find() ->where(['farm_id' => $farmDbData->id]) ->max('position'); //获取可扩建的农田配置 $nextLandGameConfig = GameConfigServices::getParamByPath('land_extend.' . ($maxLandPosition + 2));//数据库索引从0开始,配置表从1开始的,所以要加2才能获取下一个配置表中的索引 if (!$nextLandGameConfig) return ClientMessageServices::sendMessage(ResultStatusServices::RS_NOT_FIND_IN_CONFIG);//已经扩建完了所有农田 //判断等级是个满足 $userDbData = User::findById($userID); if ($nextLandGameConfig['player_level'] > $userDbData->level) return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARAM_ERROR);//等级不够 //修改数据 $landDbData = new Land(); $dbTrans = Yii::$app->db->beginTransaction(); try { //修改金钱 $gold = $nextLandGameConfig['gold']; $log = SystemLogUtil::get($userID, SystemLogUtil::TYPE_GOLD, -$gold, 0, SystemLogUtil::FROM_TYPE_EXTEND_LAND, ['config' => $nextLandGameConfig]); $rs = UserService::checkAndModifyMoney($userID, false, -$gold, 0, $log); if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs); $landDbData->farm_id = $farmDbData->id; $landDbData->position = $maxLandPosition + 1; if (!$landDbData->save()) return ClientMessageServices::sendMessage(ResultStatusServices::RS_SAVE_DB_ERROR); //记录日志 UserLogService::addUserLog($userID, EnumUtil::USER_LOG_TYPE_EXPAND_LAND, 0, 0); $success = true; } finally { if (isset($success)) $dbTrans->commit(); else { $dbTrans->rollBack(); Yii::$app->redis->clearDirtyKey();//清除脏缓存数据 } } return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $landDbData->toArray()); } /** * 农田升级 */ public function actionUpgradeLand() { $userID = Yii::$app->request->get('user_id'); $level = Yii::$app->request->get('level');//要升级哪一级 if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录 if (!$level || $level < 1 || $level > EnumUtil::LAND_MAX_LEVEL) return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARAM_ERROR); $farmDbData = Farm::findOne(['user_id' => $userID]); $landDbDataList = Land::findAll(['farm_id' => $farmDbData->id]); //查找当前等级中可升级的农田 $landDbData = LandService::findLandUpgradeItemByLevel($landDbDataList, $level); if (!$landDbData) return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARAM_ERROR); //更改可升级的等级 $level = $landDbData['level'] + 1; //获取升级配置表 $landUpgradeConfig = GameConfigServices::getLandUpgradeByLevelAndPosition($level, $landDbData['position']); if (!$landUpgradeConfig) return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARAM_ERROR); //判断等级 $userDbData = User::findById($userID); if ($landUpgradeConfig['player_level'] > $userDbData->level) return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARAM_ERROR); //修改数据 $dbTrans = Yii::$app->db->beginTransaction(); try { //扣除费用 MoneyUtil::parseAllItem($landUpgradeConfig['item_id'], 1, false, $userID, SystemLogUtil::FROM_TYPE_UPGRADE_LAND, ['config' => $landUpgradeConfig]); //升级 $landDbData->level = $level; if (!$landDbData->save(true, ['level', 'updated_at'])) return ClientMessageServices::sendMessage(ResultStatusServices::RS_SAVE_DB_ERROR); //记录日志 UserLogService::addUserLog($userID, EnumUtil::USER_LOG_TYPE_UPGRADE_LAND, 0, 0); $success = true; } finally { if (isset($success)) $dbTrans->commit(); else { $dbTrans->rollBack(); Yii::$app->redis->clearDirtyKey();//清除脏缓存数据 } } $returnData = $landDbData->toArray(); return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $returnData); } /** * 播种 */ public function actionSowSeeds() { $userID = Yii::$app->request->get('user_id'); $itemID = Yii::$app->request->get('item_id');//要播种的种子 $position = Yii::$app->request->get('position');//要播种的土地位置 if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录 if (!$itemID || $position === null || $position < 0 || $position > EnumUtil::LAND_MAX_POSITION) return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARAM_ERROR); //获取配置 $itemConfig = GameConfigServices::getParamByPath('item_list.' . $itemID); if (!$itemConfig) return ClientMessageServices::sendMessage(ResultStatusServices::RS_NOT_FIND_IN_CONFIG); //神秘种子 if ($itemConfig['type2'] == ItemServices::ITEM_TYPE2_MYSTERY_SEED) { $mysterySeedItemID = $itemID; //$itemID = GameConfigServices::getCommonNumByID(GameConfigServices::COMMON_MYSTERY_SEED); $cropConfigItem = RandServices::getMySterySeedOddsItem(); $itemID = GameConfigServices::getSeedItemIDByCropID($cropConfigItem['id']); $itemConfig = GameConfigServices::getParamByPath('item_list.' . $itemID); if (!$itemConfig) return ClientMessageServices::sendMessage(ResultStatusServices::RS_NOT_FIND_IN_CONFIG); } //检查类型 if ($itemConfig['type2'] != ItemServices::ITEM_TYPE2_SEEDS) return ClientMessageServices::sendMessage(ResultStatusServices::RS_ITEM_TYPE_ERROR); //检查播种等级 $userDbData = User::findById($userID); if (empty($mysterySeedItemID) && $itemConfig['player_level'] > $userDbData->level) return ClientMessageServices::sendMessage(ResultStatusServices::RS_LEVEL_LIMIT); //查找数据 $farmDbData = Farm::findOne(['user_id' => $userID]); //修改数据 $dbTrans = Yii::$app->db->beginTransaction(); try { if (isset($mysterySeedItemID)) { $log = SystemLogUtil::get($userID, SystemLogUtil::TYPE_ITEM, $mysterySeedItemID, -1, SystemLogUtil::FROM_TYPE_SOW_SEEDS, []); $rs = ItemServices::checkAndModifyNum($userID, $mysterySeedItemID, false, -1, $log); //扣除神秘种子数据 } else { $log = SystemLogUtil::get($userID, SystemLogUtil::TYPE_ITEM, $itemID, -1, SystemLogUtil::FROM_TYPE_SOW_SEEDS, []); $rs = ItemServices::checkAndModifyNum($userID, $itemID, false, -1, $log);//扣除物品数据 } if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs); //播种 $isMysterySeed = isset($mysterySeedItemID) ? 1 : 0; $rs = LandService::sowSeeds($farmDbData->id, $position, $itemID, $isMysterySeed); if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs); //记录日志 UserLogService::addUserLog($userID, EnumUtil::USER_LOG_TYPE_SOW_SEED, $itemID, 1); //任务记录 DailyTaskUtil::addTaskCount($userID, DailyTaskUtil::TYPE_SOW_SEEDS, null, 1); $success = true; } finally { if (isset($success)) $dbTrans->commit(); else { $dbTrans->rollBack(); Yii::$app->redis->clearDirtyKey();//清除脏缓存数据 } } $landDbData = Land::findOne(['farm_id' => $farmDbData->id, 'position' => $position]); return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $landDbData->toArray()); } /** * 添加幼崽 */ public function actionMeadowCulture() { $userID = Yii::$app->request->get('user_id'); $itemID = Yii::$app->request->get('item_id');//要播种的种子 $itemConfig = GameConfigServices::getParamByPath('item_list.' . $itemID); if (empty($itemConfig)) return ResultStatusServices::RS_NOT_FIND_IN_CONFIG; $cropConfig = GameConfigServices::getParamByPath('crop_list.' . $itemConfig['effect_id']); if (empty($cropConfig)) return ResultStatusServices::RS_NOT_FIND_IN_CONFIG; // var_dump( $cropConfig); //exit; if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录 if (!$itemID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARAM_ERROR); //获取配置 $itemConfig = GameConfigServices::getParamByPath('item_list.' . $itemID); if (!$itemConfig) return ClientMessageServices::sendMessage(ResultStatusServices::RS_NOT_FIND_IN_CONFIG); //检查投放等级 $userDbData = User::findById($userID); // if ($itemConfig['player_level'] > $userDbData->level) // return ClientMessageServices::sendMessage(ResultStatusServices::RS_LEVEL_LIMIT); $lock = new RedisLock(Yii::$app->redis, RedisKeyUtil::lockLandInteraction($userID, $itemID, $itemDbData->num), RedisLock::FLAG_CATCH_EXCEPTIONS); if (!$lock->acquire(10)) return ClientMessageServices::sendMessage(ResultStatusServices::RS_SAME_TIME_OPERATION); //修改数据 $dbTrans = Yii::$app->db->beginTransaction(); try { $log = SystemLogUtil::get($userID, SystemLogUtil::TYPE_ITEM, $itemID, -1, SystemLogUtil::FROM_TYPE_SOW_SEEDS, []); $rs = ItemServices::checkAndModifyNum($userID, $itemID, false, -1, $log);//扣除物品数据 if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs); $Muchang=new Muchang(); $Muchang->created_at=time(); $Muchang->crop_config_id=$itemConfig['effect_id']; $Muchang->gather_time= time() + intval($cropConfig['seedling_time']) + intval($cropConfig['grow_time']) + intval($cropConfig['ripe_time']); $Muchang->start_time=time(); $Muchang->type=$itemConfig['type2']; $Muchang->updated_at=time(); $Muchang->die_time=time()+intval($cropConfig['seedling_time']) + intval($cropConfig['grow_time']) + intval($cropConfig['life_time']*86400); $Muchang->user_id=$userID; $Muchang->has_gather=0; $Muchang->save(); //记录日志 UserLogService::addUserLog($userID, EnumUtil::USER_LOG_TYPE_SOW_SEED, $itemID, 1); //任务记录 DailyTaskUtil::addTaskCount($userID, DailyTaskUtil::TYPE_SOW_SEEDS, null, 1); $success = true; } finally { if (isset($success)) $dbTrans->commit(); else { $dbTrans->rollBack(); Yii::$app->redis->clearDirtyKey();//清除脏缓存数据 } } // $landDbData = Land::findOne(['farm_id' => $farmDbData->id, 'position' => $position]); return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $Muchang->toArray()); } /** * 收获农田作物 */ public function actionGatherCrop() { $userID = Yii::$app->request->get('user_id'); $position = Yii::$app->request->get('position');//土地位置 if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录 if ($position === null || $position < 0 || $position > EnumUtil::LAND_MAX_POSITION) return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARAM_ERROR); //查找数据 $farmDbData = Farm::findOne(['user_id' => $userID]); //更新收获状态 $rs = LandService::updateCropStatus($userID, $farmDbData->id, $position, $farmDbData->level); if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs); //修改数据 $dbTrans = Yii::$app->db->beginTransaction(); $addExp = 0; $rewardText = ''; try { //收获 $output = 0; $itemID = null; $rs = LandService::gatherCrop($farmDbData->id, $position, $output, $itemID); if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs); $itemConfig = GameConfigServices::getParamByPath('item_list.' . $itemID); if (!$itemConfig) return ClientMessageServices::sendMessage(ResultStatusServices::RS_NOT_FIND_IN_CONFIG); $rewardText = sprintf('%s:%d', $itemID, $output); if ((int)$itemConfig['type2'] == ItemServices::ITEM_TYPE2_GOLD) { $log = SystemLogUtil::get($userID, SystemLogUtil::TYPE_GOLD, $output, 0, SystemLogUtil::FROM_TYPE_GATHER_CROP, []); $rs = UserService::checkAndModifyMoney($userID, true, $output, 0, $log); } else { //添加到仓库 $log = SystemLogUtil::get($userID, SystemLogUtil::TYPE_ITEM, $itemID, $output, SystemLogUtil::FROM_TYPE_GATHER_CROP, []); $rs = ItemServices::checkAndModifyNum($userID, $itemID, true, $output, $log); } if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs); //增加玩家经验 if ($output > 0) { $landDbData = Land::findByFarmIDAndPosition($farmDbData->id, $position); $landConfig = GameConfigServices::getLandUpgradeByLevelAndPosition($landDbData->level, $landDbData->position); $farmConfig = GameConfigServices::getParamByPath('farm_level.' . $farmDbData->level); $cropConfig = GameConfigServices::getParamByPath('crop_list.' . $landDbData->crop_id); $percent = floatval(intval($farmConfig['add_exp']) + intval($landConfig['add_exp'])) / 100; $addExp = round(intval($cropConfig['exp']) * (1 + $percent)); if ($addExp > 0) { MoneyUtil::addUserExp($userID, $addExp); } if ((int)$itemConfig['type2'] != ItemServices::ITEM_TYPE2_GOLD) { $zhongzi = GameConfigServices::getParamByPath('store_list.' . ($cropConfig['item_id']-102000)); if (!empty($zhongzi) && isset($zhongzi['gold'])) { //分销返点 RebateUtil::addRebate($userID, $zhongzi['gold'], RebateUtil::TYPE_BUY); } } } //记录日志 UserLogService::addUserLog($userID, EnumUtil::USER_LOG_TYPE_GATHER, $itemID, $output); //任务记录 DailyTaskUtil::addTaskCount($userID, DailyTaskUtil::TYPE_LAND_GATHER, null, 1); AchievementUtil::addCount($userID, AchievementUtil::ID_GET_FRUIT, 1); $success = true; } finally { if (isset($success)) $dbTrans->commit(); else { $dbTrans->rollBack(); Yii::$app->redis->clearDirtyKey();//清除脏缓存数据 } } $landDbData = Land::findOne(['farm_id' => $farmDbData->id, 'position' => $position]); $returnData = $landDbData->toArray(); $returnData['item_id'] = $itemID; $returnData['item_add_num'] = $output; $returnData['add_exp'] = $addExp; $returnData['reward_text'] = $rewardText; return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $returnData); } /** * 喂养 */ public function actionMeadowFeed() { $userID = Yii::$app->request->get('user_id'); $itemID = Yii::$app->request->get('item_id');//物品ID $id = Yii::$app->request->get('id');//物品ID if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录 if (!$itemID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARAM_ERROR); //配置表 $itemConfig = GameConfigServices::getParamByPath('item_list.' . $itemID); if (!$itemConfig) return ClientMessageServices::sendMessage(ResultStatusServices::RS_NOT_FIND_IN_CONFIG); //修改数据 $dbTrans = Yii::$app->db->beginTransaction(); try { //修改仓库物品 $log = SystemLogUtil::get($userID, SystemLogUtil::TYPE_ITEM, $itemID, -1, SystemLogUtil::FROM_TYPE_FERTILIZE, []); $rs = ItemServices::checkAndModifyNum($userID, $itemID, false, -1, $log); if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs); //修改牧场数据 $muDbData = Muchang::findOne(['id' => $id]); if (!$muDbData) return ClientMessageServices::sendMessage(ResultStatusServices::RS_NOT_FIND_IN_DB); //农作物已经成熟 if (time() > $muDbData->gather_time) return ClientMessageServices::sendMessage(ResultStatusServices::RS_CROP_RIPE); //安阶段施肥,每次施肥不能超过一个阶段,采用减去播种时间来提升成长时间 $cropConfig = GameConfigServices::getParamByPath('crop_list.' . $muDbData->crop_config_id); //配置表生长周期是单个周期的时间差,为了方便计算,把生长周期变成从播种开始的时间 $growPhaseTime1 = $muDbData->start_time + $cropConfig['seedling_time']; $growPhaseTime2 = $growPhaseTime1 + $cropConfig['grow_time']; $growPhaseTime3 = $growPhaseTime2 + $cropConfig['ripe_time']; $needTime = 0; //每个阶段还需要的时间 if (time() < $growPhaseTime1) $needTime = $growPhaseTime1 - time(); elseif (time() < $growPhaseTime2) $needTime = $growPhaseTime2 - time(); elseif (time() < $growPhaseTime3) $needTime = $growPhaseTime3 - time(); //修改时间 $fertilizeTime = $itemConfig['effect_id'];//肥料时间 if ($fertilizeTime > $needTime) { $muDbData->start_time -= $needTime; $muDbData->gather_time -= $needTime; } else { $muDbData->start_time -= $fertilizeTime; $muDbData->gather_time -= $fertilizeTime; } if (!$muDbData->save(true, ['start_time', 'gather_time', 'updated_at'])) return ClientMessageServices::sendMessage(ResultStatusServices::RS_SAVE_DB_ERROR); //更新农田状态 $rs = MuchangService::updateAllCropStatus($userID); if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs); //记录日志 UserLogService::addUserLog($userID, EnumUtil::USER_LOG_TYPE_FERTILIZATION, $id, 0); //任务记录 DailyTaskUtil::addTaskCount($userID, DailyTaskUtil::TYPE_LAND_FER, null, 1); $success = true; } finally { if (isset($success)) $dbTrans->commit(); else { $dbTrans->rollBack(); Yii::$app->redis->clearDirtyKey();//清除脏缓存数据 } } $muDbData = Muchang::findOne(['id' => $id]); return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $muDbData->genClientData()); } /** * 收货农场 */ public function actionMeadowGather() { $userID = Yii::$app->request->get('user_id'); $id = Yii::$app->request->get('id');//选中的ID if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录 if ($id === null || $id < 0 ) return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARAM_ERROR); //查找数据 $farmDbData = Muchang::findOne(['id' => $id]); //判断时间,农作物是否可收获 if ($farmDbData->is_ripe != 1) return ClientMessageServices::sendMessage(ResultStatusServices::RS_CROP_NOT_RIPE); //检查是否已收获过 if ($farmDbData->has_gather != 0) return ClientMessageServices::sendMessage(ResultStatusServices::RS_CROP_HAD_GATHER); //获取配置 $cropConfig = GameConfigServices::getParamByPath('crop_list.' . $farmDbData->crop_config_id); if (empty($cropConfig)) return ClientMessageServices::sendMessage(ResultStatusServices::RS_NOT_FIND_IN_CONFIG); //设置收获的物品羊牛鸡肉 $itemID = $cropConfig['item_id']; //收获产量 $output = $farmDbData->output; if($farmDbData->steal_count>0){ $output=$output-$farmDbData->steal_count; } //设置收获的物品羊牛鸡肉(副产品蛋奶) $itemID1 = $cropConfig['item_id_1']; //收获产量 $output1 = $farmDbData->num; if(time()>=$farmDbData->die_time){ $farmDbData->has_gather=1; //更新收获状态 $farmDbData->save(true, ['has_gather']); }else{ $output1=0; $farmDbData->is_ripe=0; $farmDbData->is_output=0; $farmDbData->num=0; $farmDbData->steal_count=0; $farmDbData->output=0; $farmDbData->start_time=time()-$cropConfig['seedling_time']-$cropConfig['grow_time']; $farmDbData->gather_time=time()+$cropConfig['ripe_time']; $farmDbData->updated_at=time(); //更新收获状态 $farmDbData->save(true, ['is_output','is_ripe','num','output','start_time','gather_time','updated_at','steal_count']); } //修改数据 $dbTrans = Yii::$app->db->beginTransaction(); $addExp = 0; try { if(time()>=$farmDbData->die_time){ $log1 = SystemLogUtil::get($userID, SystemLogUtil::TYPE_ITEM, $itemID1, $output1, SystemLogUtil::FROM_TYPE_GATHER_CROP, []); $rs1 = ItemServices::checkAndModifyNum($userID, $itemID1, true, $output1, $log1); } //添加到仓库 $log = SystemLogUtil::get($userID, SystemLogUtil::TYPE_ITEM, $itemID, $output, SystemLogUtil::FROM_TYPE_GATHER_CROP, []); $rs = ItemServices::checkAndModifyNum($userID, $itemID, true, $output, $log); if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs); if($cropConfig['id']==15){ $item_id=12; }elseif($cropConfig['id']==16){ $item_id=13; }else{ $item_id=11; } $zhongzi = GameConfigServices::getParamByPath('store_list.' . $item_id); //分销返点 RebateUtil::addRebate($userID, $zhongzi['gold'], RebateUtil::TYPE_BUY); //增加玩家经验 if ($output > 0) { $cropConfig = GameConfigServices::getParamByPath('crop_list.' . $farmDbData->crop_config_id); $addExp = round(intval($cropConfig['exp'])); MoneyUtil::addUserExp($userID, $addExp); } if(time()>=$farmDbData->die_time){ //记录日志 UserLogService::addUserLog($userID, EnumUtil::USER_LOG_TYPE_GATHER, $itemID1, $output1); } //记录日志 UserLogService::addUserLog($userID, EnumUtil::USER_LOG_TYPE_GATHER, $itemID, $output); //任务记录 DailyTaskUtil::addTaskCount($userID, DailyTaskUtil::TYPE_LAND_GATHER, null, 1); AchievementUtil::addCount($userID, AchievementUtil::ID_GET_FRUIT, 1); $success = true; } finally { if (isset($success)) $dbTrans->commit(); else { $dbTrans->rollBack(); Yii::$app->redis->clearDirtyKey();//清除脏缓存数据 } } $returnData['meat_item_id'] = $itemID; $returnData['meat_num'] = $output; $returnData['output_item_id'] = $itemID1; $returnData['output_num'] = $output1; $returnData['add_exp'] = $addExp; $muDbData = Muchang::findOne(['id' => $id]); $returnData['muchang'] = $muDbData->genClientData(); return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $returnData); } /** * 清理农田 */ public function actionClearLand() { $userID = Yii::$app->request->get('user_id'); $position = Yii::$app->request->get('position');//土地位置 if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录 if ($position === null || $position < 0 || $position > EnumUtil::LAND_MAX_POSITION) return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARAM_ERROR); //查找数据 $farmDbData = Farm::findOne(['user_id' => $userID]); //更新收获状态 $rs = LandService::clearLand($farmDbData->id, $position); if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs); //记录日志 UserLogService::addUserLog($userID, EnumUtil::USER_LOG_TYPE_CLEAN_LAND, 0, 0); $landDbData = Land::findOne(['farm_id' => $farmDbData->id, 'position' => $position]); return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $landDbData->toArray()); } /** * 施肥 */ public function actionFertilize() { $userID = Yii::$app->request->get('user_id'); $position = Yii::$app->request->get('position');//土地位置 $itemID = Yii::$app->request->get('item_id');//物品ID if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录 if (!$itemID || $position === null || $position < 0 || $position > EnumUtil::LAND_MAX_POSITION) return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARAM_ERROR); //配置表 $itemConfig = GameConfigServices::getParamByPath('item_list.' . $itemID); if (!$itemConfig) return ClientMessageServices::sendMessage(ResultStatusServices::RS_NOT_FIND_IN_CONFIG); //检查物品类型 if ($itemConfig['type2'] != 108) return ClientMessageServices::sendMessage(ResultStatusServices::RS_ITEM_TYPE_ERROR); //查找数据 $farmDbData = Farm::findOne(['user_id' => $userID]); //修改数据 $dbTrans = Yii::$app->db->beginTransaction(); try { //修改仓库物品 $log = SystemLogUtil::get($userID, SystemLogUtil::TYPE_ITEM, $itemID, -1, SystemLogUtil::FROM_TYPE_FERTILIZE, []); $rs = ItemServices::checkAndModifyNum($userID, $itemID, false, -1, $log); if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs); //修改农田数据 $landDbData = Land::findOne(['farm_id' => $farmDbData->id, 'position' => $position]); if (!$landDbData) return ClientMessageServices::sendMessage(ResultStatusServices::RS_NOT_FIND_IN_DB); //检查农田是否有作物 if ($landDbData->crop_id == 0) return ClientMessageServices::sendMessage(ResultStatusServices::RS_LAND_NOT_CROP); //农作物已经成熟 if (time() > $landDbData->crop_gather_time) return ClientMessageServices::sendMessage(ResultStatusServices::RS_CROP_RIPE); //安阶段施肥,每次施肥不能超过一个阶段,采用减去播种时间来提升成长时间 $cropConfig = GameConfigServices::getParamByPath('crop_list.' . $landDbData->crop_id); //配置表生长周期是单个周期的时间差,为了方便计算,把生长周期变成从播种开始的时间 $growPhaseTime1 = $landDbData->crop_start_time + $cropConfig['seedling_time']; $growPhaseTime2 = $growPhaseTime1 + $cropConfig['grow_time']; $growPhaseTime3 = $growPhaseTime2 + $cropConfig['ripe_time']; $needTime = 0; //每个阶段还需要的时间 if (time() < $growPhaseTime1) $needTime = $growPhaseTime1 - time(); elseif (time() < $growPhaseTime2) $needTime = $growPhaseTime2 - time(); elseif (time() < $growPhaseTime3) $needTime = $growPhaseTime3 - time(); //修改时间 $fertilizeTime = $itemConfig['effect_id'];//肥料时间 if ($fertilizeTime > $needTime) { $landDbData->crop_start_time -= $needTime; $landDbData->crop_gather_time -= $needTime; } else { $landDbData->crop_start_time -= $fertilizeTime; $landDbData->crop_gather_time -= $fertilizeTime; } if (!$landDbData->save(true, ['crop_start_time', 'crop_gather_time', 'updated_at'])) return ClientMessageServices::sendMessage(ResultStatusServices::RS_SAVE_DB_ERROR); //更新农田状态 $rs = LandService::updateCropStatus($userID, $farmDbData->id, $position, $farmDbData->level); if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs); //记录日志 UserLogService::addUserLog($userID, EnumUtil::USER_LOG_TYPE_FERTILIZATION, $itemID, 0); //任务记录 DailyTaskUtil::addTaskCount($userID, DailyTaskUtil::TYPE_LAND_FER, null, 1); $success = true; } finally { if (isset($success)) $dbTrans->commit(); else { $dbTrans->rollBack(); Yii::$app->redis->clearDirtyKey();//清除脏缓存数据 } } $landDbData = Land::findOne(['farm_id' => $farmDbData->id, 'position' => $position]); return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $landDbData->genClientData()); } /** * 除病害 */ public function actionDisease() { $userID = Yii::$app->request->get('user_id'); $position = Yii::$app->request->get('position');//土地位置 $type = Yii::$app->request->get('type');//操作类型 if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录 if ($position === null || $position < 0 || $position > EnumUtil::LAND_MAX_POSITION) return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARAM_ERROR); //判断病虫害类型 if (!in_array($type, EnumUtil::LAND_DISEASE_TYPE_LIST)) return ClientMessageServices::sendMessage(ResultStatusServices::RS_LAND_DISEASE_TYPE_ERROR); $dbTrans = Yii::$app->db->beginTransaction(); try { //查找数据 $farmDbData = Farm::findOne(['user_id' => $userID]); $landDbData = Land::findOne(['farm_id' => $farmDbData->id, 'position' => $position]); if (!$landDbData) return ClientMessageServices::sendMessage(ResultStatusServices::RS_NOT_FIND_IN_DB); //修改数据 $hasChange = false; if ($type == EnumUtil::LAND_DISEASE_TYPE_DRY && $landDbData->has_dry == 1) { $landDbData->has_dry = 0; $hasChange = true; //任务记录 DailyTaskUtil::addTaskCount($userID, DailyTaskUtil::TYPE_LAND_WATER, null, 1); } if ($type == EnumUtil::LAND_DISEASE_TYPE_BUG && $landDbData->has_bug == 1) { //扣除除虫剂 $itemID = GameConfigServices::getItemIDByType2(ItemServices::ITEM_TYPE2_DISINSECTION); if (empty($itemID)) return ClientMessageServices::sendMessage(ResultStatusServices::RS_NOT_FIND_IN_CONFIG); $log = SystemLogUtil::get($userID, SystemLogUtil::TYPE_ITEM, $itemID, -1, SystemLogUtil::FROM_TYPE_DISEASE, []); $rs = ItemServices::checkAndModifyNum($userID, $itemID, false, -1, $log); if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs); $landDbData->has_bug = 0; $hasChange = true; //任务记录 DailyTaskUtil::addTaskCount($userID, DailyTaskUtil::TYPE_LAND_BUG, null, 1); } if ($type == EnumUtil::LAND_DISEASE_TYPE_GRASS && $landDbData->has_grass == 1) { //扣除除草剂 $itemID = GameConfigServices::getItemIDByType2(ItemServices::ITEM_TYPE2_WEEDING); if (empty($itemID)) return ClientMessageServices::sendMessage(ResultStatusServices::RS_NOT_FIND_IN_CONFIG); $log = SystemLogUtil::get($userID, SystemLogUtil::TYPE_ITEM, $itemID, -1, SystemLogUtil::FROM_TYPE_DISEASE, []); $rs = ItemServices::checkAndModifyNum($userID, $itemID, false, -1, $log); if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs); $landDbData->has_grass = 0; $hasChange = true; //任务记录 DailyTaskUtil::addTaskCount($userID, DailyTaskUtil::TYPE_LAND_GRASS, null, 1); } if ($hasChange && !$landDbData->save(true, ['has_dry', 'has_bug', 'has_grass', 'updated_at'])) return ClientMessageServices::sendMessage(ResultStatusServices::RS_SAVE_DB_ERROR); //更新农田状态 $rs = LandService::updateCropStatus($userID, $farmDbData->id, $position, $farmDbData->level); if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs); $success = true; } finally { if (isset($success)) $dbTrans->commit(); else { $dbTrans->rollBack(); Yii::$app->redis->clearDirtyKey();//清除脏缓存数据 } } $landDbData = Land::findOne(['farm_id' => $farmDbData->id, 'position' => $position]); return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $landDbData->toArray()); } /** * 获取养殖的动物列表 */ public function actionGetMeadowList() { $userID = Yii::$app->request->get('user_id'); $type = Yii::$app->request->get('type');//动物类型 养103 鸡 104 牛105 if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录 $find = Muchang::find()->where(['user_id' => $userID, 'type' => $type,'has_gather'=>0])->all(); $json = []; $i = 0; foreach ($find as $key => $value) { $json[$i]['id'] = $value->id; $json[$i]['user_id'] = $value->user_id; $json[$i]['created_at'] = $value->created_at; $json[$i]['crop_config_id'] = $value->crop_config_id; $json[$i]['gather_time'] = $value->gather_time; $json[$i]['is_ripe'] = $value->is_ripe; $json[$i]['created_at'] = $value->created_at; $json[$i]['updated_at'] = $value->updated_at; $json[$i]['is_output'] = $value->is_output; $json[$i]['item_config_id'] = $value->item_config_id; $json[$i]['min_output'] = $value->min_output; $json[$i]['num'] = $value->num; $json[$i]['output'] = $value->output; $json[$i]['start_time'] = $value->start_time; $json[$i]['type'] = $value->type; $i++; } return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $json); } /** * 获取养殖的动物列表 */ public function actionGetOtherMeadowList() { $userID = Yii::$app->request->get('be_user_id'); $type = Yii::$app->request->get('type');//动物类型 养103 鸡 104 牛105 if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录 $find = Muchang::find()->where(['user_id' => $userID, 'type' => $type,'has_gather'=>0])->all(); $json = []; $i = 0; foreach ($find as $key => $value) { $json[$i]['id'] = $value->id; $json[$i]['user_id'] = $value->user_id; $json[$i]['created_at'] = $value->created_at; $json[$i]['crop_config_id'] = $value->crop_config_id; $json[$i]['gather_time'] = $value->gather_time; $json[$i]['is_ripe'] = $value->is_ripe; $json[$i]['created_at'] = $value->created_at; $json[$i]['updated_at'] = $value->updated_at; $json[$i]['is_output'] = $value->is_output; $json[$i]['item_config_id'] = $value->item_config_id; $json[$i]['min_output'] = $value->min_output; $json[$i]['num'] = $value->num; $json[$i]['output'] = $value->output; $json[$i]['start_time'] = $value->start_time; $json[$i]['type'] = $value->type; $i++; } return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $json); } //偷牧场 /** * 偷肉等交互操作 */ public function actionMeadowSteal() { $userID = Yii::$app->request->get('user_id'); $beUserID = Yii::$app->request->get('be_user_id');//被操作用户ID $id = Yii::$app->request->get('id');//要操作的动物ID if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录 //验证要操作的用户 $beUserDbData = User::findById($beUserID); if (!$beUserDbData) return ClientMessageServices::sendMessage(ResultStatusServices::RS_NOT_FIND_USER); //$farmDbData = Farm::findOne(['user_id' => $beUserID]); $muchangDbData = Muchang::findOne(['id' => $id]); //更新农田状态 $rs = MuchangService::updateAllCropStatus($beUserID); if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs); if($muchangDbData['steal_count']>0){ return ClientMessageServices::sendMessage(1026); } $muchangDbData = Muchang::findOne(['id' => $id]); if($muchangDbData['gather_time']redis, RedisKeyUtil::lockLandInteraction($userID, $beUserID, $id), RedisLock::FLAG_CATCH_EXCEPTIONS); if (!$lock->acquire(10)) return ResultStatusServices::RS_SAME_TIME_OPERATION; //更新操作状态 $stealCount = 0;//偷到的果实数量 $deductGold = 0;//旧抓捕兼容字段,宠物战斗制度下固定为0 try { $success = false; $change = false; $dbTrans = Yii::$app->db->beginTransaction(); try { //偷菜 //偷取农田 $rs = MuchangService::steal($id,$stealCount); if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs); //修改仓库数量 $cropConfig = GameConfigServices::getParamByPath('crop_list.' . $muchangDbData->crop_config_id); $itemID = $cropConfig['item_id']; // die("11111111"); $log = SystemLogUtil::get($userID, SystemLogUtil::TYPE_ITEM, $itemID, $stealCount, SystemLogUtil::FROM_TYPE_STEAL_GET, []); $rs = ItemServices::checkAndModifyNum($userID, $itemID, true, $stealCount, $log); if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs); //记录日志 UserLogService::addUserLog($userID, EnumUtil::USER_LOG_TYPE_STEAL, $itemID, $stealCount, $beUserID); UserLogService::addUserLog($beUserID, EnumUtil::USER_LOG_TYPE_BE_STEAL, $itemID, $stealCount, $userID); //任务记录 DailyTaskUtil::addTaskCount($userID, DailyTaskUtil::TYPE_STEAL_SUCCESS, null, 1); //成就 AchievementUtil::addCount($userID, AchievementUtil::ID_STEAL, 1); AchievementUtil::addCount($userID, AchievementUtil::ID_STEAL_SUCCESS, 1); $change = true; /*if ($change) { //记录交互 $interactionDbData = new Interaction(); $interactionDbData->from_user_id = $userID; $interactionDbData->be_user_id = $beUserID; $interactionDbData->land_create_time = $muchangDbData->start_time; $interactionDbData->position = $muchangDbData->id; $interactionDbData->type = $type; $interactionDbData->num = $stealCount; if (!$interactionDbData->save()) return ClientMessageServices::sendMessage(ResultStatusServices::RS_SAVE_DB_ERROR, $interactionDbData->getErrors()); }*/ $success = true; } finally { if ($success) $dbTrans->commit(); else { $dbTrans->rollBack(); Yii::$app->redis->clearDirtyKey();//清除脏缓存数据 } } } finally { $lock->release(); } //返回数据 $returnData['id'] = $id; $returnData['steal_count'] = $stealCount; $returnData['deduct_gold'] = $deductGold; $muchangDbData = Muchang::findOne(['id' => $id]); $returnData['meadow'] = $muchangDbData->genClientData(); //ClientMessageServices::sendDebugInfo($landDbData->genClientData()); return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $returnData); } }