hy-farm/muchang/home/controllers/InteractionController.php
2026-05-29 19:54:56 +08:00

282 lines
12 KiB
PHP

<?php
/**
* Created by PhpStorm.
* User: zn
* Date: 2017/5/31
* Time: 15:46
*/
namespace app\controllers;
use common\models\Farm;
use common\models\Interaction;
use common\models\Land;
use common\models\User;
use common\modules\achievement\AchievementUtil;
use common\modules\dailytask\DailyTaskUtil;
use common\modules\systemlog\SystemLogUtil;
use common\services\ClientMessageServices;
use common\services\GameConfigServices;
use common\services\ItemServices;
use common\services\LandService;
use common\services\RandServices;
use common\services\ResultStatusServices;
use common\services\UserLogService;
use common\services\UserService;
use common\utils\EnumUtil;
use common\utils\RedisKeyUtil;
use RedisLock\RedisLock;
use Yii;
use yii\rest\Controller;
/**
* 玩家之间的互动
* Class InteractionController
* @package app\controllers
*/
class InteractionController extends Controller
{
/**
* 获取其他用户信息
*/
public function actionGetOtherUserInfo()
{
$userID = Yii::$app->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);
}
}