Вход Регистрация
Файл: silawar.ru/protected/models/Users.php
Строк: 980
<?php

class Users extends CActiveRecord {
    
/* http://www.elisdn.ru/blog/9/bezopasnoe-hranenie-parolia-v-modeli-yii */

    
const isUser 0;
    const 
isBot 5;
    const 
isBeast 6;

    public 
$value_role;
    public 
$id_cat_role;
    public 
$new_mail;
    public 
$result;
    public 
$sum;
    public 
$users;
    public 
$period;
    public 
$logins;
    public 
$id_dialog;
    
//for stats
    
public $totalEnergy;
    public 
$totalStrength;
    public 
$totalHealth;
    public 
$totalRegeneration;
    public 
$totalArmor;
    public 
$totalSummary;

    
/**
     * @return string the associated database table name
     */
    
public function tableName() {
        return 
'users';
    }

    
/**
     * @return array validation rules for model attributes.
     */
    
public function rules() {
        
// NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        
return array(
            array(
'totalEnergy, totalStrength, totalHealth, totalRegeneration, totalArmor, totalSummary''numerical''integerOnly' => true),
            array(
'id_ref, sex, class, side, battle_type, backpack_destroy, diplomat, avatar''numerical''integerOnly' => true),
            array(
'id_role, level, xp, money, strength, health, energy, regeneration, armor, health_now, energy_now, iron, bottles, guild_id, guild_rank, battle_id, battle_target, battle_income, battle_output, battle_time_in, battle_time_out, participation, backpack, store, premium_time, mute_time, id_ban, created, last_visit''length''max' => 11),
            array(
'login, email, password, ip''length''max' => 50),
            array(
'ua''length''max' => 500),
            array(
'summary, dungeon_id, logins, pumpit_id, login, email, email_remind, email_remind_time, password, class, xp, money, iron, bottles, guild_id, guild_rank, guild_invite, battle_type, battle_id, battle_target, battle_income, battle_output, battle_time_in, battle_time_out, participation, backpack_destroy, diplomat, premium_time, mute_time, id_ban, created, last_visit, ua, avatar''safe'),
        );
    }

    
/**
     * @return array relational rules.
     */
    
public function relations() {
        
// NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        
return array(
            
'idRole' => array(self::BELONGS_TO'Roles''id_role'),
            
'idMail' => array(self::HAS_MANY'UserMail''id_user'),
            
'idItem' => array(self::HAS_MANY'UserItems''id_user'),
            
'idGuild' => array(self::BELONGS_TO'Guilds''guild_id'),
            
'idBan' => array(self::BELONGS_TO'UserBan''id_ban'),
            
'idTheme' => array(self::HAS_MANY'ForumThemes''id_user'),
            
'idMessage' => array(self::HAS_MANY'ForumMessages''id_user'),
            
'idLocation' => array(self::BELONGS_TO'BattlesLocations''battle_id'),
            
'idDungeon' => array(self::BELONGS_TO'BattlesDungeons''battle_id'),
            
'idTarget' => array(self::BELONGS_TO'Users''battle_target'),
            
'idRef' => array(self::BELONGS_TO'Users''id_ref'),
            
'dungeons' => array(self::MANY_MANY'DungeonsList''dungeons_waiters(id_user, id_dungeon)'),
            
'logs' => array(self::MANY_MANY'BattleLog''log_for_users(id_user, id_log)''order' => 'logs.id_log DESC'),
            
'forum_themes' => array(self::MANY_MANY'ForumThemes''forum_themes_for_users(id_user, id_theme)'),
            
'dialogs' => array(self::MANY_MANY'UsersDialogs''users_dialogs_for_users(id_user, id_dialog)'),
            
'messages' => array(self::MANY_MANY'UsersMessages''users_messages_for_users(id_user, id_messages)'),
            
'items' => array(self::HAS_MANY'UserItems''id_user'),
            
'buffs' => array(self::HAS_MANY'UsersBuffs''id_user'),
        );
    }

    
/**
     * @return array customized attribute labels (name=>label)
     */
    
public function attributeLabels() {
        return array(
            
'id_user' => Yii::t('layout''Пользователь'),
            
'id_role' => Yii::t('layout''Роль'),
            
'ip' => Yii::t('layout''IP'),
            
'logins' => Yii::t('layout''Список пользователей'),
        );
    }

    public function 
behaviors() {
        return array(
'CAdvancedArBehavior' => array(
                
'class' => 'application.extensions.CAdvancedArBehavior.CAdvancedArBehavior'));
    }

    
/**
     * UPD: Не выводить зверей
     * Вывод юзера, тот же findByPk, мб потом улучшаться будет
     * @param type $id
     * @return type
     */
    
public static function findUser($id null) {
        if (
$id == null)
            
$id Yii::app()->user->id;
        
$user self::model()->findByPk($id);
        if (!
$user || $user->id_role == 6) {
            throw new 
CHttpException(404'Данный пользователь не существует');
        } else
            return 
$user;
    }

    
/**
     * Поиск юзера по ID с партнерок, может будут ещё и уже будет готовый велосипед для поиска
     * Если не находит пользователя то создает пустой объект
     * @param type $id ID юзера в партнерке
     * @param type $type поле в users в котором храниться ID
     * @return type 
     * @throws CHttpException
     */
    
public static function findPartnerUser($id$column 'pumpit_id') {
        
$user self::model()->findByAttributes(array($column => $id));
        if (!
$user) {
            return new 
Users;
        } else
            return 
$user;
    }

    
/**
     * Считает ко-во игроков
     * @param type $side
     * @param type $class
     * @return boolean
     */
    
public static function countUsers($side 1$class 1) {
        
$criteria = new CDbCriteria;
        
$criteria->addCondition('id_role != 5');
        
$criteria->addCondition('id_role != 6');
        
$criteria->compare('side'$side);
        
$criteria->compare('class'$class);
        return 
self::model()->count($criteria);
    }

    
/**
     * Считает ко-во игроков и ботов
     * @param type $side
     * @param type $class
     * @return boolean
     */
    
public static function countUsersWithBots($side 1$class 1) {
        
$criteria = new CDbCriteria;
        
$criteria->compare('side'$side);
        
$criteria->compare('class'$class);
        return 
self::model()->count($criteria);
    }

    
/**
     * Проверяет есть ли у пользователя активный бан
     * @param int $id
     * @return int
     */
    
public static function checkForBan($id) {
        
$criteria = new CDbCriteria;
        
$criteria->with = array('idBan');
        
$criteria->together true;
        
$criteria->condition 'idBan.time >= ' time() . ' OR idBan.time = 0';
        
$criteria->compare('t.id_user'$id);
        return 
Users::model()->count($criteria);
    }

    
/**
     * Проверяет пользователь в битве или нет
     * @return int
     */
    
public static function checkForBattle($battle false) {
        if (!
Yii::app()->user->isGuest) {
            
$criteria = new CDbCriteria;
            
$criteria->select = array('battle_type');
            
$criteria->addCondition('battle_type > 0');
            
$criteria->compare('t.id_user'Yii::app()->user->id);
            
$user Users::model()->find($criteria);
            if (isset(
$user->battle_type)) {
                return 
$user->battle_type;
            }
        }
        return 
false;
    }

    
/**
     * Проверяет пользователь в битве или нет для футера
     * @param int $id
     * @return int
     */
    
public static function checkForBattleToFooter() {
        
$in_battle strpos(Yii::App()->request->requestUri'/battles/');
        
$in_dungeon strpos(Yii::App()->request->requestUri'/dungeons/');
        
$in_trainig strpos(Yii::App()->request->requestUri'/training/');
        if (!
Yii::app()->user->isGuest && ($in_dungeon === false || $in_battle === false || $in_trainig === false)) {
            
$criteria = new CDbCriteria;
            
$criteria->select = array('battle_type');
            
$criteria->addCondition('battle_id > 0');
            
$criteria->compare('t.id_user'Yii::app()->user->id);
            
$user Users::model()->find($criteria);
            if (
$user) {
                return 
true;
            }
        }
        return 
false;
    }

    
/**
     * Проверяет есть ли у пользователя клан
     * @param int $id
     * @return int
     */
    
public static function checkForGuild() {
        if (!
Yii::app()->user->isGuest) {
            
$criteria = new CDbCriteria;
            
$criteria->select = array('guild_id');
            
$criteria->addCondition('guild_id > 0');
            
$criteria->compare('id_user'Yii::app()->user->id);
            return 
self::model()->find($criteria);
        }
        return 
false;
    }

    
/**
     * Проверяет есть ли у пользователя приглашение в клан
     * @param int $id
     * @return int
     */
    
public static function checkForGuildInvite() {
        if (!
Yii::app()->user->isGuest) {
            
$criteria = new CDbCriteria;
            
$criteria->select = array('guild_invite');
            
$criteria->addCondition('guild_invite > 0');
            
$criteria->compare('id_user'Yii::app()->user->id);
            return 
self::model()->find($criteria);
        }
        return 
false;
    }

    
/**
     * Проверяет модер или админ
     * @param int $id
     * @return int
     */
    
public static function checkForPanel() {
        if (!
Yii::app()->user->isGuest) {
            
$criteria = new CDbCriteria;
            
$criteria->with = array('idRole');
            
$criteria->together true;
            
$criteria->addInCondition('idRole.id_cat_role', array(2311));
            
$criteria->compare('t.id_user'Yii::app()->user->id);
            return 
Users::model()->count($criteria);
        }
        return 
false;
    }

    
/**
     * Проверяем существует ли диалог между игроками, если нет - создаем и возвращаем id
     * @param type $id_user
     * @return type
     * @throws CHttpException
     */
    
public static function checkDialog($id_user$user null) {
        if (!
$user) {
            
$user Yii::app()->user->id;
        }
        
$criteria = new CDbCriteria();
        
$criteria->with = array('dialogs''dialogs.users');
        
$criteria->together true;
        
$criteria->compare('t.id_user'$user);
        
$criteria->compare('users.id_user'$id_user);
        
$criteria->select 'dialogs.id_dialog as id_dialog';
        
$result Users::model()->find($criteria);
        if (!
$result) {
            
$result = new UsersDialogs();
            
$result->time time();
            
$result->users = array($user$id_user);
            if (!
$result->save(false)) {
                throw new 
CHttpException(500Yii::t('layout''Ошибка при сохранении истории боя!'));
            }
        }
        return 
$result->id_dialog;
    }

    
/**
     * Выбирает юзеров для регена
     * @return type
     */
    
public static function findUsersForRegeneration() {
        
$criteria = new CDbCriteria();
        
$criteria->select = array('t.id_user''t.health_now''t.energy_now',
            
'IF (t.premium_time > unix_timestamp(NOW()), 50, 0) + IF (t.guild_buff_time > unix_timestamp(NOW()), 
        ROUND(SUM(items.health+items.enchant_health)*(100+t.guild_buff)/100)+t.health, 
        SUM(items.health+items.enchant_health)+t.health
        ) as totalHealth'
,
            
'IF (t.premium_time > unix_timestamp(NOW()), 50, 0) + IF (t.guild_buff_time > unix_timestamp(NOW()), 
        ROUND(SUM(items.energy+items.enchant_energy)*(100+t.guild_buff)/100)+t.energy, 
        SUM(items.energy+items.enchant_energy)+t.energy
        ) as totalEnergy'
,
            
'IF (t.premium_time > unix_timestamp(NOW()), 50, 0) + IF (t.guild_buff_time > unix_timestamp(NOW()), 
        ROUND(SUM(items.regeneration+items.enchant_regeneration)*(100+t.guild_buff)/100)+t.regeneration, 
        SUM(items.regeneration+items.enchant_regeneration)+t.regeneration
        ) as totalRegeneration'
        
);
        
$criteria->with = array('items');
        
$criteria->together true;
        
$criteria->addNotInCondition('t.id_role', array(56));
        
$criteria->addCondition('t.health_now > 0 AND t.last_visit > (UNIX_TIMESTAMP(NOW())-120)');
        
$criteria->addCondition('items.status = 0 AND items.hardness > 0');
        
$criteria->group 't.id_user';
        
$result Users::model()->findAll($criteria);
        return 
$result;
    }

    
/**
     * Считаем онлайн
     * @return type
     */
    
public static function countOnline() {
        
$criteria = new CDbCriteria();
        
$criteria->condition 't.last_visit > ' . (time() - 60 60);
        
$criteria->addCondition('t.id_role != 5');
        
$criteria->addCondition('t.id_role != 6');
        
$criteria->order 't.last_visit DESC';
        return 
Users::model()->count($criteria);
    }

    
/**
     * Проверяет поле юзера на доступность
     * @param string $field поле в таблице юзера
     * @param int $number число, которое проверяем
     * @return int результат
     */
    
public static function checkForAvailable($field$number) {
        
$criteria = new CDbCriteria;
        
$criteria->condition $field ' >= ' . (int) $number;
        
$criteria->compare('id_user'Yii::app()->user->id);
        return 
Users::model()->count($criteria);
    }

    
/**
     * Проверяет есть ли у юзера премиум
     * @param type $id_user ид юзера
     * @return int результат
     */
    
public static function checkForPremium($id_user) {
        
$criteria = new CDbCriteria;
        
$criteria->condition 'premium_time >= ' time();
        
$criteria->compare('id_user'$id_user);
        return 
Users::model()->count($criteria);
    }

    
/**
     * Если есть совпадение по IP - выводим каптчу
     * @return boolean
     */
    
public function registrationCheck() {
        
$criteria = new CDbCriteria;
        
$criteria->compare('ip'CHttpRequest::getUserHostAddress());
        
//$criteria->compare('ua', CHttpRequest::getUserAgent());
        
$user self::model()->count($criteria);

        if (
$user)
            return 
true;
        else
            return 
false;
    }

    
/**
     * Выводим только логин
     * @param type $id_user
     * @return null
     */
    
public static function getLogin($id_user) {
        
$user self::model()->findByPk($id_user);
        if (
$id_user == '-1')
            
$login 'Аукцион';
        elseif (
$id_user == 0)
            
$login 'Система';
        
//Если ID не существует, то имя будет такое
        
elseif (!$user->login)
            
$login 'Странник';
        elseif (
$user->id_role == self::isBeast)
            
$login '<img src="/images/icons/dragon.png" alt="*"/> ' $user->login;
        else
            
$login $user->login;
        return 
$login;
    }

    
/**
     * Выводим логин, класс, рассу пользователя
     * @param type $id_user
     * @return type
     */
    
public static function getFullLogin($id_user) {
        
$criteria = new CDbCriteria;
        
$criteria->select = array('id_role''login''side''class''last_visit');
        
$criteria->compare('id_user'$id_user);
        
$user self::model()->find($criteria);
        if (!
$user || $user->id_role == self::isBeast)
            return 
self::getLogin($id_user);
        else {
            if (
$user->last_visit time() - 60 60 && $user->idRole->id_cat_role != self::isBot && $user->idRole->id_cat_role != self::isBeast)
                
$off '_offline';
            else
                
$off '';
            return 
'<img src="/images/icons/' $user->side '_' $user->class '' $off '.png" alt="' . ($user->class '/' '+') . '"/> ' $user->login;
        }
    }

    
/**
     * Выводим всю информацию о пользователе и ссылку на него
     * @param type $id_user
     * @return type
     */
    
public static function getLoginWithLink($id_user$new_window false) {
        
$criteria = new CDbCriteria;
        
$criteria->select = array('t.id_role');
        
$criteria->compare('id_user'$id_user);
        
$user self::model()->find($criteria);
        
$info self::getFullLogin($id_user);
        if (!
$user) {
            return 
$info;
        } elseif (
$user->id_role == || $user->id_role == 9)
            return 
$info;
        else {
            if (
$new_window) {
                return 
CHtml::link($info, array('/user/''id' => $id_user), array('target' => '_blank'));
            } else {
                return 
CHtml::link($info, array('/user/''id' => $id_user));
            }
        }
    }

    
/**
     * Возвращает подсчитанный шанс блока
     * @param type $value значение защиты
     * @return int
     */
    
public static function getUserBlockValue($value) {
        
$result round((0.95 / (pow(2.718, -0.002 $value)) - 0.2) * 100);
        if (
$result 1)
            return 
1;
        return 
$result;
    }

    
/**
     * Возвращает подсчитанный шанс крита
     * @param type $value значение энергии
     * @return int
     */
    
public static function getUserCritValue($value) {
        
$result round((0.385 / (10 pow(2.718, -0.0011 $value)) - 0.035) * 100);
        if (
$result 1)
            return 
1;
        return 
$result;
    }

    public function 
getUserClassName() {
        return (
$this->class 'Воин' 'Медик');
    }

    public function 
getUserSideName() {
        return (
$this->side 'Краллы' 'Элийцы');
    }

    
/**
     * Подсчитывает определенный стат у юзера
     * @param string $param название стата
     * @param int $id_user ид юзера
     * @return int знчение
     */
    
public static function calcParam($id_user$key null) {
        
$params = array(
            
'strength' => 'IF (t.premium_time > unix_timestamp(NOW()), 50, 0) + IF (t.guild_buff_time > unix_timestamp(NOW()), 
            ROUND(SUM(items.strength+items.enchant_strength)*(100+t.guild_buff)/100)+t.strength, 
            SUM(items.strength+items.enchant_strength)+t.strength
            ) as totalStrength'
,
            
'health' => 'IF (t.premium_time > unix_timestamp(NOW()), 50, 0) + IF (t.guild_buff_time > unix_timestamp(NOW()), 
            ROUND(SUM(items.health+items.enchant_health)*(100+t.guild_buff)/100)+t.health, 
            SUM(items.health+items.enchant_health)+t.health
        ) as totalHealth'
,
            
'energy' => 'IF (t.premium_time > unix_timestamp(NOW()), 50, 0) + IF (t.guild_buff_time > unix_timestamp(NOW()), 
            ROUND(SUM(items.energy+items.enchant_energy)*(100+t.guild_buff)/100)+t.energy, 
            SUM(items.energy+items.enchant_energy)+t.energy
        ) as totalEnergy'
,
            
'regeneration' => 'IF (t.premium_time > unix_timestamp(NOW()), 50, 0) + IF (t.guild_buff_time > unix_timestamp(NOW()), 
            ROUND(SUM(items.regeneration+items.enchant_regeneration)*(100+t.guild_buff)/100)+t.regeneration, 
            SUM(items.regeneration+items.enchant_regeneration)+t.regeneration
        ) as totalRegeneration'
,
            
'armor' => 'IF (t.premium_time > unix_timestamp(NOW()), 50, 0) + IF (t.guild_buff_time > unix_timestamp(NOW()), 
            ROUND(SUM(items.armor+items.enchant_armor)*(100+t.guild_buff)/100)+t.armor, 
            SUM(items.armor+items.enchant_armor)+t.armor
        ) as totalArmor'
,
            
'summary' => 'IF (t.premium_time > unix_timestamp(NOW()), 50, 0) + IF (t.guild_buff_time > unix_timestamp(NOW()), 
            ROUND(SUM(items.strength+items.enchant_strength)*(100+t.guild_buff)/100)+t.strength, 
            SUM(items.strength+items.enchant_strength)+t.strength) + 
            IF (t.premium_time > unix_timestamp(NOW()), 50, 0) + IF (t.guild_buff_time > unix_timestamp(NOW()), 
            ROUND(SUM(items.health+items.enchant_health)*(100+t.guild_buff)/100)+t.health, 
            SUM(items.health+items.enchant_health)+t.health) + 
            IF (t.premium_time > unix_timestamp(NOW()), 50, 0) + IF (t.guild_buff_time > unix_timestamp(NOW()), 
            ROUND(SUM(items.energy+items.enchant_energy)*(100+t.guild_buff)/100)+t.energy, 
            SUM(items.energy+items.enchant_energy)+t.energy) + 
            IF (t.premium_time > unix_timestamp(NOW()), 50, 0) + IF (t.guild_buff_time > unix_timestamp(NOW()), 
            ROUND(SUM(items.regeneration+items.enchant_regeneration)*(100+t.guild_buff)/100)+t.regeneration, 
            SUM(items.regeneration+items.enchant_regeneration)+t.regeneration) + 
            IF (t.premium_time > unix_timestamp(NOW()), 50, 0) + IF (t.guild_buff_time > unix_timestamp(NOW()), 
            ROUND(SUM(items.armor+items.enchant_armor)*(100+t.guild_buff)/100)+t.armor, 
            SUM(items.armor+items.enchant_armor)+t.armor) as totalSummary'
        
);
        
$select = array('t.id_user''t.health_now''t.energy_now');
        if (
$key)
            
array_push($select$params[$key]);
        else
            
$select array_merge($select$params);
        
$criteria = new CDbCriteria();
        
$criteria->select $select;
        
$criteria->with = array('items');
        
$criteria->together true;
        
$criteria->compare('t.id_user'$id_user);
        
$criteria->addCondition('items.status = 0 AND items.hardness > 0');
        
$result Users::model()->find($criteria);
        if (!empty(
$result) && $key) {
            
$values = array(
                
'strength' => 'totalStrength',
                
'health' => 'totalHealth',
                
'energy' => 'totalEnergy',
                
'regeneration' => 'totalRegeneration',
                
'armor' => 'totalArmor',
                
'summary' => 'totalSummary',
            );
            
$field $values[$key];
            return 
$result->$field;
        }
        return 
$result;
    }

    
/**
     * Возвращает текущое кол-во ХП в процентах
     * @param type $user
     * @return type
     */
    
public static function getHealthInPercents($user) {
        if (
$user->id_role == 6)
            return 
ceil(($user->health_now 200) / ($user->health 2));
        else
            return 
ceil(($user->health_now 200) / (Users::calcParam($user->id_user'health') * 2));
    }

    
/**
     * Возвращает текущое кол-во энергии в процентах
     * @param type $user
     * @return type
     */
    
public static function getEnergyInPercents($user) {
        if (
$user->id_role == 6)
            return 
ceil(($user->energy_now 200) / ($user->energy 2));
        else
            return 
round(($user->energy_now 200) / (Users::calcParam($user->id_user'energy') * 2));
    }

    
/**
     * Подсчитываем кол-во юзеров на локации
     * @param int $side сторона, которую считаем
     * @param int $side класс, который считаем
     * @param int $id_location ид локации
     * @return int 
     */
    
public static function getUsersInLocation($id_location$side null$class null) {
        
$criteria = new CDbCriteria();
        
$criteria->addCondition('health_now > 0');
        
$criteria->compare('side'$side);
        
$criteria->compare('class'$class);
        
$criteria->compare('battle_type'1);
        
$criteria->compare('battle_id'$id_location);
        return 
self::model()->count($criteria);
    }

    
/**
     * Подсчитываем кол-во ботов на локации
     * @param int $side сторона, которую считаем
     * @param int $side класс, который считаем
     * @param int $id_location ид локации
     * @return int 
     */
    
public static function getBotsInLocation($id_location$side null$class null) {
        
$criteria = new CDbCriteria();
        
$criteria->addCondition('health_now > 0');
        
$criteria->addInCondition('id_role', array(56));
        
$criteria->compare('side'$side);
        
$criteria->compare('class'$class);
        
$criteria->compare('battle_type'1);
        
$criteria->compare('battle_id'$id_location);
        return 
self::model()->count($criteria);
    }

    
/**
     * Выводит случайных ботов для удара в Битвах
     * @param type $id_location локация
     * @param type $side сторона игрока, если не указана выводит 2х ботов
     * @return type
     */
    
public static function getRandomBotsInLocationForAttack($id_location$side null) {
        
$criteria = new CDbCriteria();
        
$criteria->addCondition('id_role = 5');
        
$criteria->addCondition('health_now > 0');
        
$criteria->compare('battle_type'1);
        
$criteria->compare('battle_id'$id_location);
        if (
$side) {
            
$criteria->addCondition('side <>' $side);
            return 
self::model()->find($criteria);
        } else {
            
$criteria->order 'RAND()';
            
$criteria->limit 1;
            
$criteria->compare('side'1);
            
$side1 self::model()->findAll($criteria);
            unset(
$criteria);
            
$criteria = new CDbCriteria();
            
$criteria->addCondition('id_role = 5');
            
$criteria->addCondition('health_now > 0');
            
$criteria->compare('battle_type'1);
            
$criteria->compare('battle_id'$id_location);
            
$criteria->compare('side'2);
            
$criteria->order 'RAND()';
            
$criteria->limit 1;
            
$side2 self::model()->findAll($criteria);
            
$bots array_merge($side1$side2);
            return 
$bots;
        }
    }

    
/**
     * Отнимает здоровье у случайного бота, делается для союзных  медиков, чтоб было кого лечить
     * @param type $id_location локация
     * @param type $side сторона игрока, если не указана выводит 2х ботов
     * @return type
     */
    
public static function getRandomBotsInLocationForDamage($id_location$side null) {
        
$criteria = new CDbCriteria();
        
$criteria->select = array('t.id_user''t.health_now''SUM(items.health)+t.health as totalHealth');
        
$criteria->with = array('items');
        
$criteria->together true;
        
$criteria->compare('t.battle_type'1);
        
$criteria->compare('t.id_role'5);
        
$criteria->compare('t.battle_id'$id_location);
        
$criteria->compare('t.side'$side $side 0);
        
$criteria->addCondition('t.health_now > 100 AND items.status = 0');
        
$criteria->group 't.id_user';
        
$criteria->order 'RAND()';
        
$criteria->limit 1;
        
$bot Users::model()->find($criteria);

        if (!empty(
$bot)) {
            
$bot->health_now -= round($bot->totalHealth 20);
            if (
$bot->health_now 100)
                
$bot->health_now rand(75125);
            
$bot->save(false);
        }
        return 
true;
    }

    
/**
     * Выводит случайного соперника для боев в Битвах
     * @param type $id_location локация
     * @param type $side сторона игрока
     * @param type $is_bot если это бот, значит ему выбираем только игроков
     * @param type $id_heal если это медик, значит ему выбираем еще тех у кого есть энергия
     * @return type
     */
    
public static function getRandomEnemyForBattles($id_location$side$is_bot false$id_heal false) {
        
$criteria = new CDbCriteria();
        
$criteria->addCondition('health_now > 0 AND side <>' $side);
        if (
$id_heal) {
            
$criteria->addCondition('energy_now > 0');
        }
        if (
$is_bot) {
            
$criteria->addCondition('id_role != 5');
        }
        
$criteria->compare('battle_type'1);
        
$criteria->compare('battle_id'$id_location);
        
$criteria->order 'RAND()';
        
$criteria->limit 1;
        return 
self::model()->find($criteria);
    }

    
/**
     * Выводит того кто в таргете для боев в Битвах
     * @param type $user игрок
     * @param type $id_heal если это медик, значит ему выбираем еще тех у кого есть энергия
     * @return type
     */
    
public static function getLastTargetForBattles($user$is_heal false) {
        
$criteria = new CDbCriteria();
        
$criteria->addCondition('health_now > 0');
        
$criteria->addCondition('battle_id = ' $user->battle_id);
        if (
$is_heal) {
            
$criteria->addCondition('energy_now > 0');
        }
        
$criteria->compare('battle_type'1);
        
$criteria->compare('id_user'$user->battle_target);
        return 
self::model()->find($criteria);
    }

    
/**
     * Выводит того, кто в таргете для лечения
     * @param type $user
     * @return type
     */
    
public static function getLastHealTargetForBattles($user) {
        
$criteria = new CDbCriteria();
        
$criteria->addCondition('health_now > 0');
        
$criteria->addCondition('battle_id = ' $user->battle_id);
        
$criteria->compare('battle_type'1);
        
$criteria->compare('id_user'$user->battle_target);
        return 
self::model()->find($criteria);
    }

    
/**
     * Выводит случайного соперника для боев в Пещерах
     * @param type $id_battle локация
     * @return type
     */
    
public static function getRandomBeastInDungeons($id_battle) {
        
$criteria = new CDbCriteria();
        
$criteria->addCondition('health_now > 0');
        
$criteria->compare('id_role'6);
        
$criteria->compare('battle_type'2);
        
$criteria->compare('battle_id'$id_battle);
        
$criteria->order 'RAND()';
        
$criteria->limit 1;
        return 
self::model()->find($criteria);
    }

    
/**
     * Выдает всем мертвым ботам по 200% ХП и энергии
     * @param type $id_location локация
     * @return type
     */
    
public static function setFullParamsForBotsInLocation($id_location) {
        
$criteria = new CDbCriteria();
        
$criteria->addCondition('t.health_now < 1');
        
$criteria->addCondition('t.id_role = 5');
        
$criteria->addCondition('t.battle_id = ' $id_location);
        
$bots self::model()->findAll($criteria);
        foreach (
$bots as $bot) {
            
$params Users::calcParam($bot->id_user);
            
$bot->health_now round($params->totalHealth 1.45);
            
$bot->energy_now round($params->totalEnergy 1.95);
            if (!
$bot->save(false)) {
                throw new 
CHttpException(500Yii::t('layout''Ошибка при сохранении бота!'));
            }
        }
        return 
true;
    }

    
/**
     * Выводит случайного союзника для боев в битвах
     * @param type $id_location локация
     * @param type $side сторона игрока
     * @return type
     */
    
public static function getRandomFriendForBattles($id_location$side) {
        
$criteria = new CDbCriteria();
        
$criteria->with = array('items');
        
$criteria->together true;
        
$criteria->select = array('id_user''health_now');
        
$criteria->compare('battle_type'1);
        
$criteria->compare('side'$side);
        
$criteria->compare('battle_id'$id_location);
        
$criteria->addCondition('t.health_now > 0 AND items.status = 0 AND items.hardness > 0');
        
$criteria->order 'RAND()';
        
$users self::model()->findAll($criteria);
        
$id null;
        
$ids = array();
        if (!empty(
$users)) {
            foreach (
$users as $user) {
                if (
$user->health_now Users::calcParam($user->id_user'health')*2) {
                    
$ids[] = $user->id_user;
                }
            }
            if (!empty(
$ids)) {
                
$key array_rand($ids);
                
$id $ids[$key];
            }
        }
        return 
self::model()->findByPk($id);
    }

    
/**
     * Выводит случайного союзника для боев в Пещерах
     * @param type $id_battle локация
     * @return type
     */
    
public static function getRandomFriendForDungeons($id_battle) {
        
$criteria = new CDbCriteria();
        
$criteria->with = array('items');
        
$criteria->together true;
        
$criteria->select = array('id_user''health_now');
        
$criteria->compare('battle_type'2);
        
$criteria->compare('battle_id'$id_battle);
        
$criteria->addCondition('t.id_role != 6 AND t.health_now > 0 AND items.status = 0 AND items.hardness > 0');
        
$criteria->order 'RAND()';
        
$users self::model()->findAll($criteria);
        
$id null;
        
$ids = array();
        if (!empty(
$users)) {
            foreach (
$users as $user) {
                if (
$user->health_now Users::calcParam($user->id_user'health')*2) {
                    
$ids[] = $user->id_user;
                }
            }
            if (!empty(
$ids)) {
                
$key array_rand($ids);
                
$id $ids[$key];
            }
        }
        return 
self::model()->findByPk($id);
    }

    
/**
     * Возвращает пользователей, которым пишутся в лог действия относительно данного пользователя
     * @param type $id_user
     * @return type
     */
    
public static function getUsersForLog($id_user$battle_id null$type null) {
        
$criteria = new CDbCriteria();
        if (
$battle_id) {
            
$criteria->addCondition('id_role <> 5 AND health_now > 0 AND battle_id = ' $battle_id);
        } else
            
$criteria->addCondition('id_role <> 5 AND health_now > 0 AND (id_user = ' $id_user ' OR battle_target = ' $id_user ')');
        
$users CHtml::listData(self::model()->findAll($criteria), 'id_user''id_user');
        return 
$users;
    }

    
/**
     * Выводит лидера по участию для выдачи вещи в башнях
     * @param type $id_location локация
     * @return type
     */
    
public static function getParticipationLeaderForBattles($id_location) {
        
$criteria = new CDbCriteria();
        
$criteria->condition 'health_now > 0';
        
$criteria->compare('battle_type'1);
        
$criteria->compare('battle_id'$id_location);
        
$criteria->order 'participation DESC';
        
$criteria->limit 1;
        return 
self::model()->find($criteria);
    }

    
/**
     * Выводит случайного зверя для удара в Пещерах
     * @param type $id_battle ид боя
     * @return type
     */
    
public static function getRandomBotInDungeonForAttack($id_battle) {
        
$criteria = new CDbCriteria();
        
$criteria->condition 'id_role = 6';
        
$criteria->addCondition('health_now > 0');
        
$criteria->compare('battle_type'2);
        
$criteria->compare('battle_id'$id_battle);
        
$criteria->order 'RAND()';
        return 
self::model()->find($criteria);
    }

    public function 
online() {
        
$criteria = new CDbCriteria;
        
$criteria->condition 't.last_visit > ' . (time() - 60 60);
        
$criteria->addCondition('t.id_role != 5');
        
$criteria->addCondition('t.id_role != 6');

        return new 
CActiveDataProvider($this, array(
            
'criteria' => $criteria,
            
'sort' => array(
                
'defaultOrder' => 'xp DESC',
            ),
            
'pagination' => array(
                
'route' => '/online/',
                
'params' => array(),
                
'pageVar' => 'page',
                
'pageSize' => '10',
            ),
        ));
    }

    public function 
searchByIp($pagination true) {
        
$criteria = new CDbCriteria;
        
$criteria->select '*, GROUP_CONCAT(login SEPARATOR "//") as logins';
        
$criteria->addCondition('ip > 0 AND id_ban < 1');
        
$criteria->addNotInCondition('id_role', array(5678));
        
$criteria->group 'ip';
        
$criteria->order 'count(login) DESC, ip ASC';

        
$criteria->compare('INET_NTOA(ip)'$this->iptrue);
        
$criteria->compare('login'$this->loginstrue);

        return new 
CActiveDataProvider($this, array(
            
'criteria' => $criteria,
            
'pagination' => FuncHelper::pagination($pagination),
        ));
    }

    public function 
search($pagination true) {
        
$criteria = new CDbCriteria;
        
$criteria->together true;

        
$criteria->compare('id_user'$this->id_user);

        return new 
CActiveDataProvider($this, array(
            
'criteria' => $criteria,
            
'sort' => array(
//                'defaultOrder' => 'created DESC',
//                'attributes' => array(
//                    'city_id' => array('asc' => 'idEnt.city_id', 'desc' => 'idEnt.city_id DESC'),
//                    'region_id' => array('asc' => 'city.region_id', 'desc' => 'city.region_id DESC'),
//                    'country_id' => array('asc' => 'region.country_id', 'desc' => 'region.country_id DESC'),
//                    'login' => array('asc' => 't.login', 'desc' => 't.username DESC'),
//                    'email' => array('asc' => 't.email', 'desc' => 't.email DESC'),
//                    'password' => array('asc' => 't.password', 'desc' => 't.password DESC'),
//                    'created' => array('asc' => 't.created', 'desc' => 't.created DESC'),
//                    'last_visit' => array('asc' => 't.last_visit', 'desc' => 't.last_visit DESC'),
//                ),
            
),
            
'pagination' => FuncHelper::pagination($pagination),
        ));
    }

    protected function 
beforeSave() {
        if (
$this->isNewRecord) {
            if (
$this->id_role != 6) {
                
$this->password md5(md5($this->password));
            }
            
$this->created time();
        }
        return 
parent::beforeSave();
    }

    public static function 
model($className __CLASS__) {
        return 
parent::model($className);
    }

    public function 
getColumns() {
        return array(
            array(
                
'name' => 'ip',
                
'type' => 'raw',
                
'value' => 'long2ip($data->ip)',
                
'filter' => FuncHelper::getSearchFilter($this'ip'),
                
'headerHtmlOptions' => array('class' => 'w_10p'),
            ),
            array(
                
'name' => 'logins',
                
'type' => 'raw',
                
'value' => '$data->getComparedLogins()',
                
'filter' => FuncHelper::getSearchFilter($this'logins'),
                
'headerHtmlOptions' => array('class' => 'w_90p'),
            ),
        );
    }

    public function 
getComparedLogins() {
        if (!empty(
$this->logins)) {
            
$result = array();
            
$logins explode('//'$this->logins);
            foreach (
$logins as $login) {
                
$user Users::model()->findByAttributes(array('login' => $login));
                if (
$user) {
                    
$result[] = '<div class="col-sm-2">' Users::getLoginWithLink($user->id_usertrue) . '</div><div class="col-sm-1">[' $user->level ' ур.]</div> <div class="col-sm-9">UA: ' $user->ua '</div>';
                } else {
                    
$result[] = '<div class="col-sm-12">' $login '</div>';
                }
            }
            
$result implode('<div class="col-sm-12"><hr></div>'$result);
            return 
$result;
        }
    }

}
Онлайн: 1
Реклама