Вход Регистрация
Файл: silawar.ru/protected/controllers/DungeonsController.php
Строк: 615
<?php
class DungeonsController extends Controller {
    public function 
accessRules() {
        return array(
            array(
'deny',
                
'roles' => array('banned'),
                
'deniedCallback' => array(Yii::app()->controller'redirectToHome'),
            ),
            array(
'allow',
                
'actions' => array('index''battle''damageLastTarget''damageRandomEnemy''healLastTarget''healRandomFriend''healSelf''usePotion''order''startCombat''view''useAbility'),
                
'users' => array('@'),
            ),
            array(
'deny',
                
'users' => array('*'),
                
'deniedCallback' => array(Yii::app()->controller'redirectToHome'),
            )
        );
    }
    
    public function 
actionIndex($type null) {
        
$user Users::findUser();
        if (!
$user->battle_id) {
            if (!
$type) {
                
$dungeons DungeonsList::model()->findAllByAttributes(['type'=>1], ['condition' => 'id_dungeon < 3']);
                
$this->render('index', array(
                    
'dungeons' => $dungeons,
                    
'user' => $user,
                )); 
            }
            else {
                
$dungeons DungeonsList::model()->findAllByAttributes(['type'=>2], ['condition' => 'id_dungeon < 7']);
                
$this->render('guild_index', array(
                    
'dungeons' => $dungeons,
                    
'user' => $user,
                ));
            }
        } elseif (
$user->battle_type == && isset($user->idDungeon)) {
            
$id $user->idDungeon->id_dungeon;
            if (
$user->idDungeon->time_end 0) {
                
$user->battle_id null;
                
$user->battle_type null;
                
$user->battle_target null;
                if (!
$user->save(false)) {
                    throw new 
CHttpException(500Yii::t('layout''Ошибка при сохранении данных пользователя!'));
                }
                
$this->redirect($this->createUrl('dungeons/view', array('id'=>$id)));
                
Yii::app()->end();
            }
            else {
                
$this->redirect($this->createUrl('dungeons/battle'));
                
Yii::app()->end();
            }
        } else {
            
$user->battle_id null;
            
$user->battle_type null;
            
$user->battle_target null;
            if (!
$user->save(false)) {
                throw new 
CHttpException(500Yii::t('layout''Ошибка при сохранении данных пользователя!'));
            }
            
$this->redirect($this->createUrl('dungeons/index'));
            
Yii::app()->end();
        }
    }

    public function 
actionBattle() {
        
$user Users::findUser();
        if (
$user->battle_type == && isset($user->idDungeon)) {
            
$id $user->idDungeon->id_dungeon;
            if (
$user->idDungeon->time_end 0) {
                
Users::model()->updateByPk($user->id_user, ['battle_type' => null'battle_id' => null'battle_target' => null]);
                
$this->redirect($this->createUrl('dungeons/view', array('id'=>$id)));
                
Yii::app()->end();
            }
            else {
                if (
$user->dungeon_id 5) {
                    
$criteria = new CDbCriteria;
                    
$criteria->compare('type'$user->guild_id);
                    
$criteria->addCondition('`time` > '.(time()-60*60*5));
                    
$criteria->order '`time` DESC';
                    
$criteria->limit 2;
                    
$chat Chat::model()->findAll($criteria);
                    
$message = new Chat();
                    if (isset(
$_POST['Chat']) && $user->guild_id) {
                        
$message->message $_POST['Chat']['message'];
                        if (
$message->validate()) {
                            
$message->type $user->guild_id;
                            
$message->save(false);
                            
$this->redirect($this->createUrl('dungeons/view', array('id'=>$id)));
                            
Yii::app()->end();
                         }
                    }
                }
                else {
                    
$chat = array();
                    
$message = array();
                }
                
$abilities UsersAbilities::model()->findAllByAttributes(['id_user' => Yii::app()->user->id], ['condition' => 'chosen > 0']);
                
$this->render('battle', array(
                    
'battle' => $user->idDungeon,
                    
'user' => $user,
                    
'chat' => $chat,
                    
'message' => $message,
                    
'abilities' => $abilities
                
));
            }
        } else {
            
Users::model()->updateByPk($user->id_user, ['battle_type' => null'battle_id' => null'battle_target' => null]);
            
$this->redirect($this->createUrl('dungeons/index'));
            
Yii::app()->end();
        }
    }
    
    public function 
actionView($id) {
        
$user Users::findUser();
        if (
$user->battle_type == && isset($user->idDungeon)) {
            if (
$user->idDungeon->time_end == 0) {
                
$this->redirect($this->createUrl('dungeons/battle'));
                
Yii::app()->end();
            }
            else {
                
$user->battle_id null;
                
$user->battle_type null;
                
$user->battle_target null;
                
Users::model()->updateByPk($user->id_user, ['battle_type' => null'battle_id' => null'battle_target' => null]);
            }
        }
        
$model DungeonsList::model()->findByPk($id);
        if (
$id && !$user->guild_id || ($id>&& $id<6)) {
            
Yii::app()->user->setFlash('error''Вы не состоите в гильдии');
            
$this->redirect($this->createUrl('dungeons/index'));
            
Yii::app()->end();
        }
        if (!
$model || $model->level > ($id Yii::app()->user->level $user->idGuild->level)) {
            throw new 
CHttpException(404Yii::t('layout''Страница не найдена!'));
        }
        
$history = array();
        
$history UserDungeons::model()->findByPk(array('id_user'=>Yii::app()->user->id'id_dungeon'=>$id));
        if (
$model->type == 1) {
            
$users_array CHtml::listData($model->users'id_user''id_user');
            
$this->render('view', array(
                
'model' => $model,
                
'user' => $user,
                
'users_array' => $users_array,
                
'history' => $history
            
)); 
        }
        else {
            
$user->dungeons $id;
            if (!
$user->save(false)) {
                throw new 
CHttpException(500Yii::t('layout''Ошибка при сохранении данных пользователя!'));
            }
            
$criteria = new CDbCriteria;
            
$criteria->compare('type'$user->guild_id);
            
$criteria->addCondition('`time` > '.(time()-60*60*5));
            
$criteria->order '`time` DESC';
            
$criteria->limit 5;
            
$chat Chat::model()->findAll($criteria);
            
$message = new Chat();
            if (isset(
$_POST['Chat']) && $user->guild_id) {
                
$message->message $_POST['Chat']['message'];
                if (
$message->validate()) {
                    
$message->type $user->guild_id;
                    
$message->save(false);
                    
$this->redirect($this->createUrl('dungeons/view', array('id'=>$id)));
                    
Yii::app()->end();
                 }
            }
            
$members DungeonsWaiters::findUsersInDungeon($idnull$user->guild_id);
            
$users_count['warriors'] = $users_count['healers'] = 0;
            foreach (
$members as $member) {
                if (
$member->class == 1)
                    
$users_count['warriors']++;
                else
                    
$users_count['healers']++;
            }
            
$this->render('guildview', array(
                
'model' => $model,
                
'user' => $user,
                
'members' => $members,
                
'users_count' => $users_count,
                
'history' => $history,
                
'chat' => $chat,
                
'message' => $message,
            )); 
        }
    }

    public function 
actionOrder($id) {
        
$user Users::findUser();
        if (!
$user->dungeon_id) {
            
$model DungeonsList::model()->findByPk($id);
            
$history UserDungeons::model()->findByPk(array('id_user'=>Yii::app()->user->id'id_dungeon'=>$id));
            if (!
$model || $model->level Yii::app()->user->level || ($history && $history->time_last>time())) {
                throw new 
CHttpException(404Yii::t('layout''Страница не найдена!'));
            }
            
$users_array CHtml::listData($model->users'id_user''id_user');

            if (
in_array(Yii::app()->user->id$users_array)) {
                
$user->dungeons null;
                if (!
$user->save(false)) {
                    throw new 
CHttpException(500Yii::t('layout''Ошибка при сохранении данных пользователя!'));
                }
                
$this->redirect($this->createUrl('dungeons/view', array('id'=>$id)));
                
Yii::app()->end();
            } else {
                
$user->dungeons $id;
                if (!
$user->save(false)) {
                    throw new 
CHttpException(500Yii::t('layout''Ошибка при сохранении данных пользователя!'));
                }
                
$model DungeonsList::model()->findByPk($id);
                
$warriors count($model->warriors);
                
$healers count($model->healers);
                if (
$warriors >= $model->warriors_need && $healers >= $model->healers_need || $warriors >= $model->all_need) {
                    
//Если игроки набрались сохраняем все и вызываем новую модель
                    
$battle = new BattlesDungeons();
                    
$battle->id_dungeon $id;
                    if (!
$battle->save(false)) {
                        throw new 
CHttpException(500Yii::t('layout''Ошибка при создании боя!'));
                    }
                    
//началось
                    
if ($warriors >= $model->warriors_need && $healers >= $model->healers_need) {
                        
//Сначала отбираем воинов
                        
$criteria = new CDbCriteria();
                        
$criteria->with = array('dungeons');
                        
$criteria->together true;
                        
$criteria->condition 't.last_visit > ' . (time() - 60 5);
                        
$criteria->compare('dungeons.id_dungeon'$id);
                        
$criteria->order 'RAND()';
                        
$criteria->compare('class'1);
                        
$criteria->limit $model->warriors_need;
                        
$warriors Users::model()->findAll($criteria);
                        foreach (
$warriors as $warrior) {
                            
$warrior->participation 0;
                            
$warrior->battle_type 2;
                            
$warrior->dungeon_id $id;
                            
$warrior->battle_id $battle->id_battle;
                            
$params Users::calcParam($warrior->id_user);
                            if (
$warrior->health_now $params->totalHealth)
                                
$warrior->health_now $params->totalHealth;
                            if (
$warrior->energy_now $params->totalEnergy)
                                
$warrior->energy_now $params->totalEnergy;
                            
$warrior->logs null;
                            
$warrior->dungeons null;
                            if (!
$warrior->save(false)) {
                                throw new 
CHttpException(500Yii::t('layout''Ошибка при создании бота!'));
                            }
                        }
                        
$criteria = new CDbCriteria();
                        
$criteria->with = array('dungeons');
                        
$criteria->together true;
                        
$criteria->condition 't.last_visit > ' . (time() - 60 5);
                        
$criteria->compare('dungeons.id_dungeon'$id);
                        
$criteria->order 'RAND()';
                        
$criteria->compare('class'2);
                        
$criteria->limit $model->healers_need;
                        
$healers Users::model()->findAll($criteria);
                        foreach (
$healers as $healer) {
                            
$healer->participation 0;
                            
$healer->battle_type 2;
                            
$healer->dungeon_id $id;
                            
$healer->battle_id $battle->id_battle;
                            
$params Users::calcParam($healer->id_user);
                            if (
$healer->health_now $params->totalHealth)
                                
$healer->health_now $params->totalHealth;
                            if (
$healer->energy_now $params->totalEnergy)
                                
$healer->energy_now $params->totalEnergy;
                            
$healer->logs null;
                            
$healer->dungeons null;
                            if (!
$healer->save(false)) {
                                throw new 
CHttpException(500Yii::t('layout''Ошибка при создании бота!'));
                            }
                        }
                    } else {
                        
$criteria = new CDbCriteria();
                        
$criteria->with = array('dungeons');
                        
$criteria->together true;
                        
$criteria->condition 't.last_visit > ' . (time() - 60 5);
                        
$criteria->compare('dungeons.id_dungeon'$id);
                        
$criteria->order 'RAND()';
                        
$criteria->compare('class'1);
                        
$criteria->limit $model->all_need;
                        
$warriors Users::model()->findAll($criteria);
                        foreach (
$warriors as $warrior) {
                            
$warrior->participation 0;
                            
$warrior->battle_type 2;
                            
$warrior->dungeon_id $id;
                            
$warrior->battle_id $battle->id_battle;
                            
$params Users::calcParam($warrior->id_user);
                            if (
$warrior->health_now $params->totalHealth)
                                
$warrior->health_now $params->totalHealth;
                            if (
$warrior->energy_now $params->totalEnergy)
                                
$warrior->energy_now $params->totalEnergy;
                            
$warrior->logs null;
                            
$warrior->dungeons null;
                            if (!
$warrior->save(false)) {
                                throw new 
CHttpException(500Yii::t('layout''Ошибка при создании бота!'));
                            }
                        }
                    }
                    
//Теперь запускаем зверей
                    
$bots DungeonsBots::findByDangeon($id);
                    foreach (
$bots as $bot) {
                        
$new_bot = new Users();
                        
$new_bot->attributes $bot->attributes;
                        
$new_bot->health_now $new_bot->health;
                        
$new_bot->energy_now $new_bot->energy;
                        
$new_bot->password 1;
                        
$new_bot->battle_type 2;
                        
$new_bot->battle_id $battle->id_battle;
                        
$new_bot->id_role 6;
                        if (!
$new_bot->save(false)) {
                            throw new 
CHttpException(500Yii::t('layout''Ошибка при создании бота!'));
                        }
                        
ShopItems::getNewItem(21$new_bot->id_userfalsetrue);
                    }
                    
$this->redirect($this->createUrl('dungeons/battle'));
                    
Yii::app()->end();
                }
                
$this->redirect($this->createUrl('dungeons/view', array('id'=>$id)));
                
Yii::app()->end();
            }
        }
        
$this->redirect($this->createUrl('dungeons/index'));
        
Yii::app()->end();
    }
    
    public function 
actionStartCombat($id) {
        
$user Users::findUser();
        if (!
$user->battle_type) {
            
$history UserDungeons::model()->findByPk(array('id_user'=>Yii::app()->user->id'id_dungeon'=>$id));
            
$model DungeonsList::model()->findByPk($id);
            if (!
$model || $model->level $user->idGuild->level || ($history && $history->time_last>time())) {
                throw new 
CHttpException(404Yii::t('layout''Страница не найдена!'));
            }
            
$battle = new BattlesDungeons();
            
$battle->id_dungeon $id;
            if (!
$battle->save(false)) {
                throw new 
CHttpException(500Yii::t('layout''Ошибка при создании боя!'));
            }
            
$members DungeonsWaiters::findUsersInDungeon($idnull$user->guild_id);
            foreach (
$members as $member) {
                
$member->participation 0;
                
$member->battle_type 2;
                
$member->dungeon_id $id;
                
$member->battle_id $battle->id_battle;
                
$params Users::calcParam($member->id_user);
                if (
$member->health_now $params->totalHealth)
                        
$member->health_now $params->totalHealth;
                if (
$member->energy_now $params->totalEnergy)
                        
$member->energy_now $params->totalEnergy;
                
$member->logs null;
                
$member->dungeons null;
                if (!
$member->save(false)) {
                    throw new 
CHttpException(500Yii::t('layout''Ошибка при создании бота!'));
                }
            }
            
//Теперь запускаем зверей
            
$bots DungeonsBots::findByDangeon($id);
            foreach (
$bots as $bot) {
                
$new_bot = new Users();
                
$new_bot->attributes $bot->attributes;
                
$params Users::calcParam($bot->id_bot);
                
$new_bot->health_now $new_bot->health;
                
$new_bot->energy_now $new_bot->energy;
                
$new_bot->password 2;
                
$new_bot->battle_type 2;
                
$new_bot->battle_id $battle->id_battle;
                
$new_bot->id_role 6;
                if (!
$new_bot->save(false)) {
                    throw new 
CHttpException(500Yii::t('layout''Ошибка при создании бота!'));
                }
                
ShopItems::getNewItem(21$new_bot->id_userfalsetrue);
            }
        }
        
$this->redirect($this->createUrl('dungeons/battle'));
        
Yii::app()->end();
    }

    public function 
actionUsePotion() {
        
$user Users::findUser();
        if (
$user->battle_type == && isset($user->idDungeon) && $user->idDungeon->time_end == && $user->health_now 0) {
            
BattleHelper::usePotion($user);
            if (
$user->class == 1) {
                
$this->actionDamageRandomEnemy();
            }
            else {
                
$this->actionHealRandomFriend();
            }
            
Yii::app()->end();
        }
        
$this->redirect('/dungeons/battle');
        
Yii::app()->end();
    }
    
    public function 
actionUseAbility($chosen) {
        
$user Users::findUser();
        if (
$user->battle_type != 2) {
            
$this->redirect(Yii::app()->user->returnUrl);
            
Yii::app()->end();
        }
        if (
$user->health_now 0) {
            if (
$chosen 0) {
                
$ability UsersAbilities::model()->findByAttributes(['id_user' => Yii::app()->user->id], ['condition' => 'chosen = '.(int)$chosen.' AND `time_cooldown` < unix_timestamp(NOW())']);
                if (!empty(
$ability)) {
                    
$ability->time_active time() + $ability->idType->time_active;
                    
$ability->time_cooldown time() + $ability->idType->time_cooldown;
                    
$ability->save(false);
                    
                    
/* Проверяем на навык Уворот */
                    
if ($ability->id_ability == 2) {
                        
Users::model()->updateAll(['battle_target' => null], 'battle_target = '.$user->id_user);
                    }
                    
                    
$log = new BattleLog();
                    
$log->battle_type $user->battle_type;
                    
$log->battle_id $user->battle_id;
                    
$log->id_user $user->id_user;
                    
$log->type 7;
                    
$log->info $ability->idAbility->name_ability;
                    
$log->users Users::getUsersForLog($user->id_user);
                    
$log->save(false);
                    
                    if (
$user->class == 1) {
                        
$this->actionDamageRandomEnemy();
                    } else {
                        
$this->actionHealRandomFriend();
                    }
                    
Yii::app()->end();
                }
                
Yii::app()->user->setFlash('error''Навык ещё не готов');
            }
        }
        
$this->redirect('/dungeons/battle');
        
Yii::app()->end();
    }
    
    public function 
actionDamageRandomEnemy() {
        
$user Users::findUser();
        if (
$user->battle_type == && isset($user->idDungeon) && $user->idDungeon->time_end == && $user->health_now 0) {
            
$enemy Users::getRandomBeastInDungeons($user->battle_id);
            
/* Если есть кого бить - бьем */
            
if ($enemy) {
                
$result BattleHelper::damageUser($user$enemy);
                if (
$result) {
                    
$log = new BattleLog();
                    
$log->battle_type $user->battle_type;
                    
$log->battle_id $user->battle_id;
                    
$log->id_user $user->id_user;
                    
$log->id_target $enemy->id_user;
                    
$log->type $user->class;
                    
$log->value $result['damage'];
                    
$log->info = ($result['isCritical'] ? 'крит' '');
                    
$log->users Users::getUsersForLog($enemy->id_user);
                    
$log->save(false);
                }
            } else {
                
$log = new BattleLog();
                
$log->battle_type $user->battle_type;
                
$log->battle_id $user->battle_id;
                
$log->id_user $user->id_user;
                
$log->type 8;
                
$log->info 'Бить некого';
                
$log->users $user->id_user;
                
$log->save(false);
            }
        }
        
$this->redirect($this->createUrl('dungeons/battle'));
        
Yii::app()->end();
    }

    public function 
actionDamageLastTarget() {
        
$user Users::findUser();
        if (
$user->battle_type == && isset($user->idDungeon) && $user->idDungeon->time_end == && $user->health_now 0) {
            
$enemy Users::model()->findByPk($user->battle_target);
            
/* Если есть кого бить - бьем */
            
if ($enemy && $enemy->health_now 0) {
                
$result BattleHelper::damageUser($user$enemy);
                if (
$result) {
                    
$log = new BattleLog();
                    
$log->battle_type $user->battle_type;
                    
$log->battle_id $user->battle_id;
                    
$log->id_user $user->id_user;
                    
$log->id_target $enemy->id_user;
                    
$log->type $user->class;
                    
$log->value $result['damage'];
                    
$log->info = ($result['isCritical'] ? 'крит' '');
                    
$log->users Users::getUsersForLog($enemy->id_user);
                    
$log->save(false);
                }
            } else {
                
$log = new BattleLog();
                
$log->battle_type $user->battle_type;
                
$log->battle_id $user->battle_id;
                
$log->id_user $user->id_user;
                
$log->type 8;
                
$log->info 'Бить некого';
                
$log->users $user->id_user;
                
$log->save(false);
            }
        }
        
$this->redirect($this->createUrl('dungeons/battle'));
        
Yii::app()->end();
    }

    public function 
actionHealRandomFriend() {
        
$user Users::findUser();
        if (
$user->battle_type == && isset($user->idDungeon) && $user->idDungeon->time_end == && $user->health_now 0) {
            
$friend Users::getRandomFriendForDungeons($user->battle_id);
            
/* Если есть кого лечить - лечим */
            
if ($friend && $friend->health_now && $friend->health_now Users::calcParam($friend->id_user'health') * 2) {
                
$result BattleHelper::healUser($user$friend);
                if (
$result) {
                    
$log = new BattleLog();
                    
$log->battle_type $user->battle_type;
                    
$log->battle_id $user->battle_id;
                    
$log->id_user $user->id_user;
                    
$log->id_target $friend->id_user;
                    
$log->type $user->class;
                    
$log->value $result['value'];
                    
$log->info = ($result['isCritical'] ? 'крит' '');
                    
$log->users Users::getUsersForLog($friend->id_user);
                    
$log->save(false);
                }
            } else {
                
$log = new BattleLog();
                
$log->battle_type $user->battle_type;
                
$log->battle_id $user->battle_id;
                
$log->id_user $user->id_user;
                
$log->type 8;
                
$log->info 'Лечить некого';
                
$log->users $user->id_user;
                
$log->save(false);
            }
        }
        
$this->redirect($this->createUrl('dungeons/battle'));
        
Yii::app()->end();
    }

    public function 
actionHealSelf() {
        
$user Users::findUser();
        if (
$user->battle_type == && isset($user->idDungeon) && $user->idDungeon->time_end == && $user->health_now 0) {
            if (
$user->battle_target == Yii::app()->user->id && $user->health_now Users::calcParam($user->id_user'health')*|| $user->health_now Users::calcParam($user->id_user'health')) {
                
$result BattleHelper::healUser($user$user);
                if (
$result) {
                    
$log = new BattleLog();
                    
$log->battle_type $user->battle_type;
                    
$log->battle_id $user->battle_id;
                    
$log->id_user $user->id_user;
                    
$log->id_target $user->id_user;
                    
$log->type $user->class;
                    
$log->value $result['value'];
                    
$log->info = ($result['isCritical'] ? 'крит' '');
                    
$log->users Users::getUsersForLog($user->id_user);
                    
$log->save(false);
                }
            } else {
                
$log = new BattleLog();
                
$log->battle_type $user->battle_type;
                
$log->battle_id $user->battle_id;
                
$log->id_user $user->id_user;
                
$log->type 8;
                
$log->info 'Лечить некого';
                
$log->users $user->id_user;
                
$log->save(false);
            }
        }
        
$this->redirect($this->createUrl('dungeons/battle'));
        
Yii::app()->end();
    }

    public function 
actionHealLastTarget() {
        
$user Users::findUser();
        if (
$user->battle_type == && isset($user->idDungeon) && $user->idDungeon->time_end == && $user->health_now 0) {
            
$friend Users::model()->findByPk($user->battle_target);
            
/* Если есть кого лечить - лечим */
            
if ($friend && $friend->health_now && $friend->health_now Users::calcParam($friend->id_user'health') * 2) {
                
$result BattleHelper::healUser($user$friend);
                if (
$result) {
                    
$log = new BattleLog();
                    
$log->battle_type $user->battle_type;
                    
$log->battle_id $user->battle_id;
                    
$log->id_user $user->id_user;
                    
$log->id_target $friend->id_user;
                    
$log->type $user->class;
                    
$log->value $result['value'];
                    
$log->info = ($result['isCritical'] ? 'крит' '');
                    
$log->users Users::getUsersForLog($friend->id_user);
                    
$log->save(false);
                }
            } else {
                
$log = new BattleLog();
                
$log->battle_type $user->battle_type;
                
$log->battle_id $user->battle_id;
                
$log->id_user $user->id_user;
                
$log->type 8;
                
$log->info 'Лечить некого';
                
$log->users $user->id_user;
                
$log->save(false);
            }
        }
        
$this->redirect($this->createUrl('dungeons/battle'));
        
Yii::app()->end();
    }

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