257 lines
8.6 KiB
PHP
257 lines
8.6 KiB
PHP
<?php
|
|
/**
|
|
* Created by PhpStorm.
|
|
* User: zn
|
|
* Date: 2017/8/9
|
|
* Time: 11:51
|
|
*/
|
|
|
|
namespace common\modules\dailytask;
|
|
|
|
|
|
use common\modules\achievement\AchievementUtil;
|
|
use common\modules\dailytask\vo\DailyTask;
|
|
use common\modules\safe\SafeUtil;
|
|
use common\modules\systemlog\SystemLogUtil;
|
|
use common\services\GameConfigServices;
|
|
use common\services\ResultStatusServices;
|
|
use common\services\StatusException;
|
|
use common\utils\CommUtil;
|
|
use common\utils\MoneyUtil;
|
|
use common\utils\RedisKeyUtil;
|
|
use Yii;
|
|
|
|
/**
|
|
* 日常任务
|
|
* Class
|
|
*/
|
|
class DailyTaskUtil
|
|
{
|
|
const GIFT_NOT_GET = 0;//未领取奖励
|
|
const GIFT_GET = 1;//已领取奖励
|
|
const GIFT_GET_LIST = [
|
|
self::GIFT_NOT_GET,
|
|
self::GIFT_GET,
|
|
];
|
|
|
|
const TYPE_SIGN = 1;//每天签到?次
|
|
const TYPE_LOTTERY_DRAW = 2;//开启?次大转盘,进行抽奖
|
|
const TYPE_PLEASURE_GROUND = 3;//进入?次游乐场
|
|
const TYPE_GET_ONLINE_GIFT = 4;//领取?次在线礼包
|
|
const TYPE_ENTER_GYMKHANA = 5;//挑战?次竞技场玩家
|
|
const TYPE_SOW_SEEDS = 6;//勤劳播种,每天进行?次播种
|
|
const TYPE_GET_DAY_OR_WEEK_CARD_GIFT = 7;//领取?次周卡或月卡奖励
|
|
const TYPE_STEAL = 8;//掠夺?次玩家资源
|
|
const TYPE_FEED_PET = 9;//喂养?次宠物
|
|
const TYPE_EXPEND_GEM = 10;//消耗?钻石
|
|
const TYPE_BUY = 12;//购买?次?
|
|
const TYPE_COMPOSE = 13;//合成?物品
|
|
const TYPE_SELL_FRUIT = 14;//出售?次果实
|
|
const TYPE_UPGRADE_FACTORY = 15;//升级?次加工厂
|
|
const TYPE_PAY_GOLD = 18;//充值?次金币
|
|
const TYPE_MAKE = 19;//加工?次?
|
|
const TYPE_TRAIN_PET_ATTACK = 20;//提升?次战宠攻击力
|
|
const TYPE_TRAIN_PET_ANTI = 21;//提升?次战宠防御力
|
|
const TYPE_TRAIN_PET_BLOOD = 22;//提升?次战宠血量
|
|
const TYPE_TRAIN_PET_DODGE = 23;//提升?次战宠闪避
|
|
const TYPE_TRAIN_PET_CRIT = 24;//提升?次战宠暴击
|
|
const TYPE_LAND_WATER = 25;//勤劳农作,每天进行?次浇水
|
|
const TYPE_LAND_BUG = 26;//勤劳农作,每天进行?次杀虫
|
|
const TYPE_LAND_FER = 27;//勤劳农作,每天进行?次施肥
|
|
const TYPE_LAND_GRASS = 28;//勤劳农作,每天进行?次除草
|
|
const TYPE_LAND_GATHER = 29;//勤劳农作,每天进行?次收割
|
|
const TYPE_PAY_GEM = 30;//充值?次钻石
|
|
const TYPE_STEAL_SUCCESS = 31;//掠夺玩家并成功偷取?次果实。
|
|
const TYPE_ENTER_GYMKHANA_SUCCESS = 32;//战胜?次竞技场玩家
|
|
const TYPE_LIST = [
|
|
self::TYPE_SIGN,
|
|
self::TYPE_LOTTERY_DRAW,
|
|
self::TYPE_PLEASURE_GROUND,
|
|
self::TYPE_GET_ONLINE_GIFT,
|
|
self::TYPE_ENTER_GYMKHANA,
|
|
self::TYPE_SOW_SEEDS,
|
|
self::TYPE_GET_DAY_OR_WEEK_CARD_GIFT,
|
|
self::TYPE_STEAL,
|
|
self::TYPE_FEED_PET,
|
|
self::TYPE_EXPEND_GEM,
|
|
self::TYPE_BUY,
|
|
self::TYPE_COMPOSE,
|
|
self::TYPE_SELL_FRUIT,
|
|
self::TYPE_UPGRADE_FACTORY,
|
|
self::TYPE_PAY_GOLD,
|
|
self::TYPE_MAKE,
|
|
self::TYPE_TRAIN_PET_ATTACK,
|
|
self::TYPE_TRAIN_PET_ANTI,
|
|
self::TYPE_TRAIN_PET_BLOOD,
|
|
self::TYPE_TRAIN_PET_DODGE,
|
|
self::TYPE_TRAIN_PET_CRIT,
|
|
self::TYPE_LAND_WATER,
|
|
self::TYPE_LAND_BUG,
|
|
self::TYPE_LAND_FER,
|
|
self::TYPE_LAND_GRASS,
|
|
self::TYPE_LAND_GATHER,
|
|
self::TYPE_PAY_GEM,
|
|
self::TYPE_STEAL_SUCCESS
|
|
];
|
|
|
|
|
|
public static function createTask($userID, $config, $expireTime)
|
|
{
|
|
$task = new DailyTask();
|
|
$task->user_id = $userID;
|
|
$task->config_id = $config['id'];
|
|
$task->name = $config['content'];
|
|
$task->type = $config['type'];
|
|
|
|
if (isset($config['item_id'])) $task->item_id = $config['item_id'];
|
|
|
|
$task->max_item_num = (int)$config['item_num'];
|
|
|
|
$task->expire_time = $expireTime;
|
|
|
|
return $task;
|
|
}
|
|
|
|
public static function oddsTask($index)
|
|
{
|
|
$configList = GameConfigServices::getParamByPath('daily_list');
|
|
|
|
$list = [];
|
|
foreach ($configList as $config) {
|
|
if (intval($config['daily_type']) == $index) {
|
|
array_push($list, $config);
|
|
}
|
|
}
|
|
|
|
$config = CommUtil::oddsOne($list, 'odds');
|
|
return $config;
|
|
}
|
|
|
|
/**
|
|
* 重置每日任务
|
|
* @param $userID
|
|
* @throws StatusException
|
|
*/
|
|
private static function resetTask($userID)
|
|
{
|
|
$lastCreateTaskDay = Yii::$app->redis->get(RedisKeyUtil::lastCreateTaskDay($userID));
|
|
$dayStr = CommUtil::dayStr(time());
|
|
if ($lastCreateTaskDay == $dayStr) return;
|
|
|
|
//清理任务
|
|
$dayTime = CommUtil::getDayTime(time());
|
|
DailyTask::cleanExpireByUserID($userID, $dayTime);
|
|
|
|
$expireTime = CommUtil::getDayTime(time() + 3600 * 24);
|
|
|
|
//创建固定任务
|
|
$configList = GameConfigServices::getParamByPath('daily_list');
|
|
foreach ($configList as $config) {
|
|
if (intval($config['daily_type']) == 0) {
|
|
$task = self::createTask($userID, $config, $expireTime);
|
|
if (!$task->save()) throw new StatusException(ResultStatusServices::RS_SAVE_DB_ERROR);
|
|
}
|
|
}
|
|
|
|
//创建随机任务
|
|
$index = 1;
|
|
while (true) {
|
|
$config = self::oddsTask($index);
|
|
if (empty($config)) break;
|
|
|
|
$task = self::createTask($userID, $config, $expireTime);
|
|
// \Yii::warning($task->geterrors());
|
|
// if (!$task->save()) throw new StatusException(ResultStatusServices::RS_SAVE_DB_ERROR);
|
|
|
|
$index++;
|
|
}
|
|
|
|
Yii::$app->redis->set(RedisKeyUtil::lastCreateTaskDay($userID), $dayStr, 3600 * 24);
|
|
|
|
}
|
|
|
|
public static function getTaskList($userID)
|
|
{
|
|
return SafeUtil::dbOperate(function ($userID) {
|
|
return SafeUtil::redisLockOperate(function ($userID) {
|
|
|
|
self::resetTask($userID);
|
|
|
|
$dbList = DailyTask::findAllByUserID($userID);
|
|
$list = [];
|
|
foreach ($dbList as $item) {
|
|
array_push($list, $item->toArray());
|
|
}
|
|
|
|
return $list;
|
|
|
|
}, [$userID], RedisKeyUtil::lockDailyTask($userID));
|
|
}, [$userID]);
|
|
}
|
|
|
|
/**增加完成次数
|
|
* @param $userID
|
|
* @param $type
|
|
* @param $itemID
|
|
* @param $addCount
|
|
*/
|
|
public static function addTaskCount($userID, $type, $itemID, $addCount)
|
|
{
|
|
SafeUtil::dbOperate(function ($userID, $type, $itemID, $addCount) {
|
|
// SafeUtil::redisLockOperate(function ($userID, $type, $itemID, $addCount) {
|
|
|
|
self::resetTask($userID);
|
|
|
|
$addCount = (int)$addCount;
|
|
if ($addCount <= 0) throw new StatusException(ResultStatusServices::RS_PARAM_ERROR);
|
|
|
|
$taskList = DailyTask::findAllByUserIDAndParam($userID, $type, $itemID);
|
|
|
|
foreach ($taskList as $task) {
|
|
$task->item_num += $addCount;
|
|
if ($task->item_num > $task->max_item_num) {
|
|
$task->item_num = $task->max_item_num;
|
|
|
|
//成就
|
|
if ($type == self::TYPE_SOW_SEEDS) AchievementUtil::addCount($userID, AchievementUtil::ID_SOW_SEEDS, 1);
|
|
}
|
|
|
|
if (!$task->save(true, ['item_num', 'updated_at'])) throw new StatusException(ResultStatusServices::RS_SAVE_DB_ERROR);
|
|
}
|
|
|
|
// }, [$userID, $type, $itemID, $addCount], RedisKeyUtil::lockDailyTask($userID));
|
|
}, [$userID, $type, $itemID, $addCount]);
|
|
|
|
|
|
}
|
|
|
|
/**
|
|
* 获取任务奖励
|
|
* @param $userID
|
|
* @param $taskID
|
|
*/
|
|
public static function getTaskGift($userID, $taskID)
|
|
{
|
|
SafeUtil::dbOperate(function ($userID, $taskID) {
|
|
SafeUtil::redisLockOperate(function ($userID, $taskID) {
|
|
|
|
self::resetTask($userID);
|
|
|
|
$task = DailyTask::findByID($taskID);
|
|
if (empty($task) || $task->is_get_gift == self::GIFT_GET || $task->user_id != $userID) throw new StatusException(ResultStatusServices::RS_PARAM_ERROR);
|
|
|
|
$config = GameConfigServices::getParamByPath('daily_list.' . $task->config_id);
|
|
if (empty($config)) throw new StatusException(ResultStatusServices::RS_PARAM_ERROR);
|
|
|
|
MoneyUtil::parseItem($config['goldcurrency_id'], 1, true, $userID, SystemLogUtil::FROM_TYPE_TASK_GIFT, ['config' => $config]);
|
|
|
|
MoneyUtil::addUserExp($userID, $config['experience']);
|
|
|
|
$task->is_get_gift = self::GIFT_GET;
|
|
if (!$task->save(true, ['is_get_gift', 'updated_at'])) throw new StatusException(ResultStatusServices::RS_SAVE_DB_ERROR);
|
|
|
|
}, [$userID, $taskID], RedisKeyUtil::lockDailyTask($userID));
|
|
}, [$userID, $taskID]);
|
|
}
|
|
}
|