request->get('user_id'); $beUserID = Yii::$app->request->get('be_user_id'); if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录 if (!$beUserID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARAM_ERROR); //获取其他用户数据 $userDbData = User::findById($beUserID); if (!$userDbData) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_DISABLE_OR_NOT_FIND); $farmDbData = Farm::findRedis($beUserID); $returnData = $userDbData->genClientData(); foreach ($returnData['landList'] as $key => $landData) { $landDbData = Land::findRedis($farmDbData->id, $landData['position']); $typeList = LandService::getLandInteractionType($userID, $beUserID, $landDbData); $returnData['landList'][$key]['interaction_type_list'] = $typeList; } return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $returnData); } /** * 偷菜等交互操作 */ public function actionInteraction() { $userID = Yii::$app->request->get('user_id'); $type = Yii::$app->request->get('type');//交互操作类型 $beUserID = Yii::$app->request->get('be_user_id');//被操作用户ID $position = Yii::$app->request->get('position');//要操作的农田位置 if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录 //验证操作类型 if (!in_array($type, EnumUtil::INTERACTION_TYPE_LIST) || !$beUserID || $beUserID == $userID || $position === null || $position < 0 || $position > EnumUtil::LAND_MAX_POSITION ) return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARAM_ERROR); //验证要操作的用户 $beUserDbData = User::findById($beUserID); if (!$beUserDbData) return ClientMessageServices::sendMessage(ResultStatusServices::RS_NOT_FIND_USER); $farmDbData = Farm::findOne(['user_id' => $beUserID]); //更新农田状态 $rs = LandService::updateCropStatus($beUserID, $farmDbData->id, $position, $farmDbData->level); if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs); $lock = new RedisLock(Yii::$app->redis, RedisKeyUtil::lockLandInteraction($userID, $beUserID, $position), RedisLock::FLAG_CATCH_EXCEPTIONS); if (!$lock->acquire(10)) return ResultStatusServices::RS_SAME_TIME_OPERATION; //更新操作状态 $stealCount = 0;//偷到的果实数量 $deductGold = 0;//被抓扣除的金币 try { //检查操作状态是否正确 $landDbData = Land::findRedis($farmDbData->id, $position); $canTypeList = LandService::getLandInteractionType($userID, $beUserID, $landDbData); \Yii::warning('a'); \Yii::warning($canTypeList); if (!in_array($type, $canTypeList)) { return ClientMessageServices::sendMessage(EnumUtil::INTERACTION_OPERATE_TYPE_ERROR_TO_RS_LIST[$type]); } $isCatch = false;//是否被抓 //判断偷菜是否被抓 if ($type == EnumUtil::INTERACTION_TYPE_STEAL) { $deductGold = RandServices::getDogCatchDeductGold($beUserDbData); if ($deductGold > 0) { //扣除金币 $log = SystemLogUtil::get($userID, SystemLogUtil::TYPE_GOLD, -$deductGold, 0, SystemLogUtil::FROM_TYPE_CATCH_PAY, []); $rs = UserService::checkAndModifyMoney($userID, false, -$deductGold, 0, $log); if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs); //把金币给主人 $log = SystemLogUtil::get($beUserID, SystemLogUtil::TYPE_GOLD, $deductGold, 0, SystemLogUtil::FROM_TYPE_CATCH_GET, []); $rs = UserService::checkAndModifyMoney($beUserID, true, $deductGold, 0, $log); if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs); //记录日志 UserLogService::addUserLog($userID, EnumUtil::USER_LOG_TYPE_BE_CATCH, 0, 0, $beUserID); UserLogService::addUserLog($beUserID, EnumUtil::USER_LOG_TYPE_CATCH, 0, 0, $userID); $isCatch = true; } } if (!$isCatch) { //没有被抓才执行下面操作 $success = false; $change = false; $dbTrans = Yii::$app->db->beginTransaction(); try { if ($type == EnumUtil::INTERACTION_TYPE_STEAL) { //偷菜 //偷取农田 $rs = LandService::steal($farmDbData->id, $position, $stealCount, $userID, $beUserID); if ($rs != ResultStatusServices::RS_OPERATION_SUCCESS) return ClientMessageServices::sendMessage($rs); //修改仓库数量 $cropConfig = GameConfigServices::getParamByPath('crop_list.' . $landDbData->crop_id); $itemID = $cropConfig['item_id']; $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 ($type == EnumUtil::INTERACTION_TYPE_BUG) { $landDbData->has_bug = true; if (!$landDbData->save(true, ['has_bug', 'updated_at'])) return ClientMessageServices::sendMessage(ResultStatusServices::RS_SAVE_DB_ERROR); //记录日志 UserLogService::addUserLog($userID, EnumUtil::USER_LOG_TYPE_BUG, 0, 0, $beUserID); UserLogService::addUserLog($beUserID, EnumUtil::USER_LOG_TYPE_BE_BUG, 0, 0, $userID); $change = true; } //放草 if ($type == EnumUtil::INTERACTION_TYPE_GRASS) { $landDbData->has_grass = 1; if (!$landDbData->save(true, ['has_grass', 'updated_at'])) return ClientMessageServices::sendMessage(ResultStatusServices::RS_SAVE_DB_ERROR); //记录日志 UserLogService::addUserLog($userID, EnumUtil::USER_LOG_TYPE_GRASS, 0, 0, $beUserID); UserLogService::addUserLog($beUserID, EnumUtil::USER_LOG_TYPE_BE_GRASS, 0, 0, $userID); $change = true; } // //浇水 // if ($type == EnumUtil::INTERACTION_TYPE_WATERING) { // $landDbData->has_dry = false; // if (!$landDbData->save(true, ['has_dry', 'updated_at'])) // return ClientMessageServices::sendMessage(ResultStatusServices::RS_SAVE_DB_ERROR); // // //记录日志 // UserLogService::addLog($userID, EnumUtil::USER_LOG_TYPE_WATERING, 0, 0, $beUserID); // UserLogService::addLog($beUserID, EnumUtil::USER_LOG_TYPE_BE_WATERING, 0, 0, $userID); // // $change = true; // } // // //除虫 // if ($type == EnumUtil::INTERACTION_TYPE_DISINSECTION) { // $landDbData->has_bug = false; // if (!$landDbData->save(true, ['has_bug', 'updated_at'])) // return ClientMessageServices::sendMessage(ResultStatusServices::RS_SAVE_DB_ERROR); // // //记录日志 // UserLogService::addLog($userID, EnumUtil::USER_LOG_TYPE_DISINSECTION, 0, 0, $beUserID); // UserLogService::addLog($beUserID, EnumUtil::USER_LOG_TYPE_BE_DISINSECTION, 0, 0, $userID); // // $change = true; // } // // //除草 // if ($type == EnumUtil::INTERACTION_TYPE_WEEDING) { // $landDbData->has_grass = false; // if (!$landDbData->save(true, ['has_grass', 'updated_at'])) // return ClientMessageServices::sendMessage(ResultStatusServices::RS_SAVE_DB_ERROR); // // //记录日志 // UserLogService::addLog($userID, EnumUtil::USER_LOG_TYPE_WEEDING, 0, 0, $beUserID); // UserLogService::addLog($beUserID, EnumUtil::USER_LOG_TYPE_BE_WEEDING, 0, 0, $userID); // // $change = true; // } if ($change) { //记录交互 $interactionDbData = new Interaction(); $interactionDbData->from_user_id = $userID; $interactionDbData->be_user_id = $beUserID; $interactionDbData->land_create_time = $landDbData->crop_start_time; $interactionDbData->position = $landDbData->position; $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['position'] = $position; $returnData['type'] = $type; $returnData['steal_count'] = $stealCount; $returnData['deduct_gold'] = $deductGold; $landDbData = Land::findRedis($farmDbData->id, $position); $returnData['land'] = $landDbData->genClientData(); //ClientMessageServices::sendDebugInfo($landDbData->genClientData()); return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $returnData); } }