Esempio n. 1
0
 public function start()
 {
     $r = Yii::app()->db->createCommand('SELECT aid, name, type, tx, d_rq  FROM dc_animal ORDER BY d_rq DESC')->queryAll();
     $prev_rank = Yii::app()->cache->get('d_rq_rank_report');
     if (isset($prev_rank)) {
         foreach ($r as $k => $v) {
             $rank[$v['aid']] = $k;
             if (isset($prev_rank[$v['aid']]) && $prev_rank[$v['aid']] > $k) {
                 $r[$k]['change'] = 1;
             } else {
                 if (isset($prev_rank[$v['aid']]) && $prev_rank[$v['aid']] < $k) {
                     $r[$k]['change'] = -1;
                 } else {
                     $r[$k]['change'] = 0;
                 }
             }
         }
     } else {
         foreach ($r as $k => $v) {
             $rank[$v['aid']] = $k;
             $r[$k]['change'] = 0;
         }
     }
     //奖励计算
     $total_member = Yii::app()->db->createCommand('SELECT COUNT(*) FROM dc_user')->queryScalar();
     $total_a = Yii::app()->db->createCommand('SELECT COUNT(aid), SUM(d_rq) FROM dc_animal')->queryRow();
     $all_gold = $total_member * RANK_REWARD_E;
     $total_popularity = $total_a['SUM(d_rq)'];
     $reward_count = round($total_a['COUNT(aid)'] * 30 / 100);
     for ($i = 0; $i < $reward_count; $i++) {
         $aid = $r[$i]['aid'];
         $single_popularity = $r[$i]['d_rq'];
         $total_gold = $all_gold * $single_popularity / $total_popularity;
         if ($total_gold != 0) {
             $circles = Circle::model()->findAllByAttributes(array('aid' => $aid));
             foreach ($circles as $circle) {
                 $result_money = round($total_gold * $circle->d_contri / $single_popularity);
                 $user = User::model()->findByPk($circle->usr_id);
                 $user->gold += $result_money;
                 $user->saveAttributes(array('gold'));
                 $self_rank = $i + 1;
                 $msg = "您的王国/家族在人气日排行榜中获得第" . $self_rank . "名,您获得" . $result_money . "金币奖励";
                 Talk::model()->sendMsg(NPC_SYSTEM_USRID, $user->usr_id, $msg);
             }
         }
     }
     Yii::app()->cache->set('d_rq_rank_report', $rank, 3600 * 24);
     Yii::app()->cache->set('d_rq_rank', $r, 3600 * 24);
 }
Esempio n. 2
0
 public function actionSendGiftApi($item_id, $aid, $img_id = NULL, $is_shake = FALSE)
 {
     $itemList = Util::loadConfig('items');
     $item = $itemList[$item_id];
     if (isset($item)) {
         $transaction = Yii::app()->db->beginTransaction();
         try {
             $user = User::model()->findByPk($this->usr_id);
             $ex_gold = $user->gold;
             $ex_exp = $user->exp;
             $ex_lv = $user->lv;
             if (!$is_shake) {
                 $items = unserialize($user->items);
                 if (isset($items[$item_id]) && $items[$item_id] > 0) {
                     $items[$item_id]--;
                     $user->items = serialize($items);
                     $user->saveAttributes(array('items'));
                 } else {
                     throw new PException('礼物数量不足');
                 }
             }
             $user->sendGift($is_shake);
             $circle = Circle::model()->findByPk(array('aid' => $aid, 'usr_id' => $this->usr_id));
             if (isset($circle)) {
                 $ex_rank = $circle->rank;
                 $circle->t_contri += $item['rq'];
                 $circle->m_contri += $item['rq'];
                 $circle->w_contri += $item['rq'];
                 $circle->d_contri += $item['rq'];
                 $user->contributionChange($circle);
                 $circle->saveAttributes(array('t_contri', 'm_contri', 'w_contri', 'd_contri'));
             }
             $animal = Animal::model()->findByPk($aid);
             $animal->d_rq += $item['rq'];
             $animal->m_rq += $item['rq'];
             $animal->w_rq += $item['rq'];
             $animal->t_rq += $item['rq'];
             if ($animal->d_rq < 0) {
                 $animal->d_rq = 0;
             }
             if ($animal->m_rq < 0) {
                 $animal->m_rq = 0;
             }
             if ($animal->w_rq < 0) {
                 $animal->w_rq = 0;
             }
             if ($animal->t_rq < 0) {
                 $animal->t_rq = 0;
             }
             $a_items = unserialize($animal->items);
             if (isset($a_items[$item_id])) {
                 $a_items[$item_id]++;
             } else {
                 $a_items[$item_id] = 1;
             }
             $animal->items = serialize($a_items);
             $animal->saveAttributes(array('d_rq', 'm_rq', 'w_rq', 't_rq', 'items'));
             if (isset($img_id)) {
                 $image = Image::model()->findByPk($img_id);
                 $image->gifts++;
                 if (isset($image->senders) && $image->senders != '') {
                     $image->senders = $this->usr_id . ',' . $image->senders;
                 } else {
                     $image->senders = $this->usr_id;
                 }
                 $image->saveAttributes(array('gifts', 'senders'));
             }
             if ($is_shake) {
                 $session = Yii::app()->session;
                 if (isset($session[$aid . '_shake_count'])) {
                     $session[$aid . '_shake_count'] -= 1;
                 } else {
                     $session[$aid . '_shake_count'] = 3;
                 }
             }
             $news = new News();
             $news->aid = $aid;
             $news->type = $item['rq'] >= 0 ? 4 : 7;
             $news->create_time = time();
             $news->content = serialize(array('usr_id' => $user->usr_id, 'u_name' => $user->name, 'rank' => isset($circle) ? $circle->rank : -1, 'item_id' => $item_id, 'rq' => $item['rq']));
             $news->save();
             $transaction->commit();
             $this->echoJsonData(array('exp' => $user->exp - $ex_exp, 'gold' => $user->gold - $ex_gold, 'lv' => $user->lv - $ex_lv, 'rank' => isset($circle) ? $circle->rank - $ex_rank : -1));
         } catch (Exception $e) {
             $transaction->rollback();
             throw $e;
         }
     } else {
         throw new PException('礼物不存在');
     }
 }