Example #1
0
 function compact_backtrace($backtrace, $long_comment = false)
 {
     static $exclude_functions = array('doquery', 'db_query', 'db_get_record_list', 'db_user_by_id', 'db_get_user_by_id');
     $result = array();
     $transaction_id = classSupernova::db_transaction_check(false) ? classSupernova::$transaction_id : classSupernova::$transaction_id++;
     $result[] = "tID {$transaction_id}";
     foreach ($backtrace as $a_trace) {
         if (in_array($a_trace['function'], $exclude_functions)) {
             continue;
         }
         $function = ($a_trace['type'] ? ($a_trace['type'] == '->' ? "({$a_trace['class']})" . get_class($a_trace['object']) : $a_trace['class']) . $a_trace['type'] : '') . $a_trace['function'] . '()';
         $file = str_replace(SN_ROOT_PHYSICAL, '', str_replace('\\', '/', $a_trace['file']));
         // $result[] = "{$function} ({$a_trace['line']})'{$file}'";
         $result[] = "{$function} - '{$file}' Line {$a_trace['line']}";
         if (!$long_comment) {
             break;
         }
     }
     // $result = implode(',', $result);
     return $result;
 }
Example #2
0
function player_create($username_unsafe, $password_raw, $email_unsafe, $options)
{
    global $config, $lang;
    static $player_options_string = 'opt_mnl_spy^1|opt_email_mnl_spy^0|opt_email_mnl_joueur^0|opt_email_mnl_alliance^0|opt_mnl_attaque^1|opt_email_mnl_attaque^0|opt_mnl_exploit^1|opt_email_mnl_exploit^0|opt_mnl_transport^1|opt_email_mnl_transport^0|opt_email_msg_admin^1|opt_mnl_expedition^1|opt_email_mnl_expedition^0|opt_mnl_buildlist^1|opt_email_mnl_buildlist^0|opt_int_navbar_resource_force^1|';
    empty($options['planet_options']) ? $options['planet_options'] = array() : false;
    $field_set = array('server_name' => SN_ROOT_VIRTUAL, 'register_time' => SN_TIME_NOW, 'user_bot' => $options['user_bot'] = empty($options['user_bot']) ? USER_BOT_PLAYER : $options['total_points'], 'username' => $username_unsafe, 'email' => $email_unsafe, 'email_2' => $email_unsafe, 'lang' => $options['language_iso'] ? $options['language_iso'] : DEFAULT_LANG, 'dpath' => DEFAULT_SKINPATH, 'total_points' => $options['total_points'] = empty($options['total_points']) ? 0 : $options['total_points'], 'options' => (empty($options['options']) ? $player_options_string : $options['options']) . (empty($options['options_extra']) ? '' : $options['options_extra']), 'galaxy' => $options['galaxy'] = intval($options['galaxy'] ? $options['galaxy'] : 0), 'system' => $options['system'] = intval($options['system'] ? $options['system'] : 0), 'planet' => $options['planet'] = intval($options['planet'] ? $options['planet'] : 0));
    $user_new = classSupernova::db_ins_field_set(LOC_USER, $field_set);
    sec_password_change($user_new, $password_raw, false, $options['remember_me'] = intval(!empty($options['remember_me'])));
    $username_safe = db_escape($username_unsafe);
    //  $options['language_iso'] = db_escape($options['language_iso'] ? $options['language_iso'] : DEFAULT_LANG);
    //  $options['remember_me'] = intval(!empty($options['remember_me']));
    //
    //  $skin_safe = db_escape(DEFAULT_SKINPATH);
    //  $email_safe = db_escape($email_unsafe);
    //
    //  // sn_db_field_set_make_safe($field_set, $serialize = false)
    //
    //  $user_new = classSupernova::db_ins_record(LOC_USER, "`username` = '{$username_safe}', `email` = '{$email_safe}', `email_2` = '{$email_safe}', `dpath` = '{$skin_safe}',
    //      `lang` = '{$options['language_iso']}', `register_time` = " . SN_TIME_NOW . ", `server_name` = '" . db_escape(SN_ROOT_VIRTUAL) . "',
    //      `options` = 'opt_mnl_spy^1|opt_email_mnl_spy^0|opt_email_mnl_joueur^0|opt_email_mnl_alliance^0|opt_mnl_attaque^1|opt_email_mnl_attaque^0|opt_mnl_exploit^1|opt_email_mnl_exploit^0|opt_mnl_transport^1|opt_email_mnl_transport^0|opt_email_msg_admin^1|opt_mnl_expedition^1|opt_email_mnl_expedition^0|opt_mnl_buildlist^1|opt_email_mnl_buildlist^0|opt_int_navbar_resource_force^1|';");
    doquery("REPLACE INTO {{player_name_history}} SET `player_id` = {$user_new['id']}, `player_name` = '{$username_safe}'");
    if (!empty($options['partner_id']) && ($referral_row = db_user_by_id($options['partner_id'], true))) {
        doquery("INSERT INTO {{referrals}} SET `id` = {$user_new['id']}, `id_partner` = {$options['partner_id']}");
    }
    if (!($options['galaxy'] && $options['system'] && $options['planet'])) {
        $options['galaxy'] = $config->LastSettedGalaxyPos;
        $options['system'] = $config->LastSettedSystemPos;
        $segment_size = floor($config->game_maxPlanet / 3);
        $segment = floor($config->LastSettedPlanetPos / $segment_size);
        $segment++;
        $options['planet'] = mt_rand(1 + $segment * $segment_size, ($segment + 1) * $segment_size);
        // $new_planet_id = 0;
        while (true) {
            if ($options['planet'] > $config->game_maxPlanet) {
                $options['planet'] = mt_rand(0, $segment_size - 1) + 1;
                $options['system']++;
            }
            if ($options['system'] > $config->game_maxSystem) {
                $options['system'] = 1;
                $options['galaxy']++;
            }
            $options['galaxy'] > $config->game_maxGalaxy ? $options['galaxy'] = 1 : false;
            $galaxy_row = db_planet_by_gspt($options['galaxy'], $options['system'], $options['planet'], PT_PLANET, true, 'id');
            if (!$galaxy_row['id']) {
                $config->db_saveItem(array('LastSettedGalaxyPos' => $options['galaxy'], 'LastSettedSystemPos' => $options['system'], 'LastSettedPlanetPos' => $options['planet']));
                // $new_planet_id = uni_create_planet($options['galaxy'], $options['system'], $options['planet'], $user_new['id'], $username_unsafe . ' ' . $lang['sys_capital'], true, $options['planet_options']);
                break;
            }
            $options['planet'] += 3;
        }
    }
    $new_planet_id = uni_create_planet($options['galaxy'], $options['system'], $options['planet'], $user_new['id'], $username_unsafe . ' ' . $lang['sys_capital'], true, $options['planet_options']);
    sys_player_new_adjust($user_new['id'], $new_planet_id);
    db_user_set_by_id($user_new['id'], "`id_planet` = '{$new_planet_id}', `current_planet` = '{$new_planet_id}', `galaxy` = '{$options['galaxy']}', `system` = '{$options['$system']}', `planet` = '{$options['$planet']}'");
    $config->db_saveItem('users_amount', $config->users_amount + 1);
    return db_user_by_id($user_new['id']);
}
Example #3
0
function sn_options_model()
{
    global $user, $user_option_list, $lang, $template_result, $config;
    $language_new = sys_get_param_str('langer', $user['lang']);
    if ($language_new != $user['lang']) {
        $lang->lng_switch($language_new);
    }
    lng_include('options');
    lng_include('messages');
    $FMT_DATE = preg_replace(array('/d/', '/m/', '/Y/'), array('DD', 'MM', 'YYYY'), FMT_DATE);
    if (sys_get_param_str('mode') == 'change') {
        if ($user['authlevel'] > 0) {
            $planet_protection = sys_get_param_int('adm_pl_prot') ? $user['authlevel'] : 0;
            db_planet_set_by_owner($user['id'], "`id_level` = '{$planet_protection}'");
            db_user_set_by_id($user['id'], "`admin_protection` = '{$planet_protection}'");
            $user['admin_protection'] = $planet_protection;
        }
        if (sys_get_param_int('vacation') && !$config->user_vacation_disable) {
            sn_db_transaction_start();
            if ($user['authlevel'] < 3) {
                if ($user['vacation_next'] > SN_TIME_NOW) {
                    message($lang['opt_vacation_err_timeout'], $lang['Error'], 'index.php?page=options', 5);
                    die;
                }
                $is_building = doquery("SELECT * FROM `{{fleets}}` WHERE `fleet_owner` = '{$user['id']}' LIMIT 1;", true);
                if ($is_building) {
                    message($lang['opt_vacation_err_your_fleet'], $lang['Error'], 'index.php?page=options', 5);
                    die;
                }
                $que = que_get($user['id'], false);
                if (!empty($que)) {
                    message($lang['opt_vacation_err_que'], $lang['Error'], 'index.php?page=options', 5);
                    die;
                }
                $query = classSupernova::db_get_record_list(LOC_PLANET, "`id_owner` = {$user['id']}");
                foreach ($query as $planet) {
                    // $planet = sys_o_get_updated($user, $planet, SN_TIME_NOW);
                    // $planet = $planet['planet'];
                    db_planet_set_by_id($planet['id'], "last_update = " . SN_TIME_NOW . ", energy_used = '0', energy_max = '0',\n            metal_perhour = '{$config->metal_basic_income}', crystal_perhour = '{$config->crystal_basic_income}', deuterium_perhour = '{$config->deuterium_basic_income}',\n            metal_mine_porcent = '0', crystal_mine_porcent = '0', deuterium_sintetizer_porcent = '0', solar_plant_porcent = '0',\n            fusion_plant_porcent = '0', solar_satelit_porcent = '0', ship_sattelite_sloth_porcent = 0");
                }
                $user['vacation'] = SN_TIME_NOW + $config->player_vacation_time;
            } else {
                $user['vacation'] = SN_TIME_NOW;
            }
            sn_db_transaction_commit();
        }
        foreach ($user_option_list as $option_group_id => $option_group) {
            foreach ($option_group as $option_name => $option_value) {
                if ($user[$option_name] !== null) {
                    $user[$option_name] = sys_get_param_str($option_name);
                } else {
                    $user[$option_name] = $option_value;
                }
            }
        }
        $options = sys_user_options_pack($user);
        $player_options = sys_get_param('options');
        if (!empty($player_options)) {
            array_walk($player_options, function (&$value) {
                // TODO - Когда будет больше параметров - сделать больше проверок
                $value = intval($value);
            });
            classSupernova::$user_options->offsetSet($player_options);
            // pdump($player_options);die();
            //      player_save_option_array($user, $player_options);
        }
        $username = substr(sys_get_param_str_unsafe('username'), 0, 32);
        $username_safe = db_escape($username);
        if ($username && $user['username'] != $username && $config->game_user_changename != SERVER_PLAYER_NAME_CHANGE_NONE && sys_get_param_int('username_confirm') && !strpbrk($username, LOGIN_REGISTER_CHARACTERS_PROHIBITED)) {
            // проверка на корректность
            sn_db_transaction_start();
            $name_check = doquery("SELECT * FROM {{player_name_history}} WHERE `player_name` LIKE \"{$username_safe}\" LIMIT 1 FOR UPDATE;", true);
            if (!$name_check || $name_check['player_id'] == $user['id']) {
                $user = db_user_by_id($user['id'], true);
                switch ($config->game_user_changename) {
                    case SERVER_PLAYER_NAME_CHANGE_PAY:
                        if (mrc_get_level($user, $planetrow, RES_DARK_MATTER) < $config->game_user_changename_cost) {
                            $template_result['.']['result'][] = array('STATUS' => ERR_ERROR, 'MESSAGE' => $lang['opt_msg_name_change_err_no_dm']);
                            break;
                        }
                        rpg_points_change($user['id'], RPG_NAME_CHANGE, -$config->game_user_changename_cost, sprintf('Пользователь ID %d сменил имя с "%s" на "%s"', $user['id'], $user['username'], $username));
                    case SERVER_PLAYER_NAME_CHANGE_FREE:
                        db_user_set_by_id($user['id'], "`username` = '{$username_safe}'");
                        doquery("REPLACE INTO {{player_name_history}} SET `player_id` = {$user['id']}, `player_name` = '{$username_safe}'");
                        // TODO: Change cookie to not force user relogin
                        // sn_setcookie(SN_COOKIE, '', time() - PERIOD_WEEK, SN_ROOT_RELATIVE);
                        $template_result['.']['result'][] = array('STATUS' => ERR_NONE, 'MESSAGE' => $lang['opt_msg_name_changed']);
                        $user['username'] = $username;
                        break;
                }
            } else {
                $template_result['.']['result'][] = array('STATUS' => ERR_ERROR, 'MESSAGE' => $lang['opt_msg_name_change_err_used_name']);
            }
            sn_db_transaction_commit();
        }
        if ($new_password = sys_get_param('newpass1')) {
            try {
                if ($new_password != sys_get_param('newpass2')) {
                    throw new Exception($lang['opt_err_pass_unmatched'], ERR_WARNING);
                }
                if (!classSupernova::$auth->password_change(sys_get_param('db_password'), $new_password)) {
                    throw new Exception($lang['opt_err_pass_wrong'], ERR_WARNING);
                }
                throw new Exception($lang['opt_msg_pass_changed'], ERR_NONE);
            } catch (Exception $e) {
                $template_result['.']['result'][] = array('STATUS' => in_array($e->getCode(), array(ERR_NONE, ERR_WARNING, ERR_ERROR)) ? $e->getCode() : ERR_ERROR, 'MESSAGE' => $e->getMessage());
            }
        }
        $user['email'] = sys_get_param_str('db_email');
        //    if(!$template_result[F_ACCOUNT]['account_email'] && ($email_2 = sys_get_param_str('db_email2'))) {
        //      core_auth::email_set($email_2);
        //    }
        $user['dpath'] = sys_get_param_str('dpath');
        $user['lang'] = sys_get_param_str('langer', $user['lang']);
        //    if($lang->lng_switch($user['lang'])) {
        //      lng_include('options');
        //      lng_include('messages');
        //    }
        $user['design'] = sys_get_param_int('design');
        $user['noipcheck'] = sys_get_param_int('noipcheck');
        // $user['spio_anz'] = sys_get_param_int('spio_anz');
        // $user['settings_fleetactions'] = sys_get_param_int('settings_fleetactions', 1);
        // $user['settings_tooltiptime'] = sys_get_param_int('settings_tooltiptime');
        // $user['settings_esp'] = sys_get_param_int('settings_esp');
        // $user['settings_wri'] = sys_get_param_int('settings_wri');
        // $user['settings_bud'] = sys_get_param_int('settings_bud');
        // $user['settings_mis'] = sys_get_param_int('settings_mis');
        // $user['settings_statistics'] = sys_get_param_int('settings_statistics');
        // $user['settings_info'] = sys_get_param_int('settings_info');
        // $user['settings_rep'] = sys_get_param_int('settings_rep');
        // $user['planet_sort']  = sys_get_param_int('settings_sort');
        // $user['planet_sort_order'] = sys_get_param_int('settings_order');
        $user['deltime'] = !sys_get_param_int('deltime') ? 0 : ($user['deltime'] ? $user['deltime'] : SN_TIME_NOW + $config->player_delete_time);
        $gender = sys_get_param_int('gender', $user['gender']);
        !isset($lang['sys_gender_list'][$gender]) ? $gender = $user['gender'] : false;
        $user['gender'] = $user['gender'] == GENDER_UNKNOWN ? $gender : $user['gender'];
        try {
            if ($user['birthday']) {
                throw new exception();
            }
            $user_birthday = sys_get_param_str_unsafe('user_birthday');
            if (!$user_birthday || $user_birthday == $FMT_DATE) {
                throw new exception();
            }
            // Some black magic to parse any valid date format - those that contains all three "d", "m" and "Y" and any of the delimeters "\", "/", ".", "-"
            $pos['d'] = strpos(FMT_DATE, 'd');
            $pos['m'] = strpos(FMT_DATE, 'm');
            $pos['Y'] = strpos(FMT_DATE, 'Y');
            asort($pos);
            $i = 0;
            foreach ($pos as &$position) {
                $position = ++$i;
            }
            $regexp = "/" . preg_replace(array('/\\\\/', '/\\//', '/\\./', '/\\-/', '/d/', '/m/', '/Y/'), array('\\\\\\', '\\/', '\\.', '\\-', '(\\d?\\d)', '(\\d?\\d)', '(\\d{4})'), FMT_DATE) . "/";
            if (!preg_match($regexp, $user_birthday, $match)) {
                throw new exception();
            }
            if (!checkdate($match[$pos['m']], $match[$pos['d']], $match[$pos['Y']])) {
                throw new exception();
            }
            $user['user_birthday'] = db_escape("{$match[$pos['Y']]}-{$match[$pos['m']]}-{$match[$pos['d']]}");
            // EOF black magic! Now we have valid SQL date in $user['user_birthday'] - independent of date format
            $year = date('Y', SN_TIME_NOW);
            if (mktime(0, 0, 0, $match[$pos['m']], $match[$pos['d']], $year) > SN_TIME_NOW) {
                $year--;
            }
            $user['user_birthday_celebrated'] = db_escape("{$year}-{$match[$pos['m']]}-{$match[$pos['d']]}");
            $user_birthday = ", `user_birthday` = '{$user['user_birthday']}', `user_birthday_celebrated` = '{$user['user_birthday_celebrated']}'";
        } catch (exception $e) {
            $user_birthday = '';
        }
        require_once 'includes/includes/sys_avatar.php';
        $avatar_upload_result = sys_avatar_upload($user['id'], $user['avatar']);
        $template_result['.']['result'][] = $avatar_upload_result;
        $user_time_diff = playerTimeDiff::user_time_diff_get();
        if (sys_get_param_int('PLAYER_OPTION_TIME_DIFF_FORCED')) {
            playerTimeDiff::user_time_diff_set(array(PLAYER_OPTION_TIME_DIFF => sys_get_param_int('PLAYER_OPTION_TIME_DIFF'), PLAYER_OPTION_TIME_DIFF_UTC_OFFSET => 0, PLAYER_OPTION_TIME_DIFF_FORCED => 1, PLAYER_OPTION_TIME_DIFF_MEASURE_TIME => SN_TIME_SQL));
        } elseif (sys_get_param_int('opt_time_diff_clear') || $user_time_diff[PLAYER_OPTION_TIME_DIFF_FORCED]) {
            playerTimeDiff::user_time_diff_set(array(PLAYER_OPTION_TIME_DIFF => '', PLAYER_OPTION_TIME_DIFF_UTC_OFFSET => 0, PLAYER_OPTION_TIME_DIFF_FORCED => 0, PLAYER_OPTION_TIME_DIFF_MEASURE_TIME => SN_TIME_SQL));
        }
        $user_options_safe = db_escape($user['options']);
        db_user_set_by_id($user['id'], "`email` = '{$user['email']}', `lang` = '{$user['lang']}', `avatar` = '{$user['avatar']}',\n      `dpath` = '{$user['dpath']}', `design` = '{$user['design']}', `noipcheck` = '{$user['noipcheck']}',\n      `deltime` = '{$user['deltime']}', `vacation` = '{$user['vacation']}', `options` = '{$user_options_safe}', `gender` = {$user['gender']}\n      {$user_birthday}");
        $template_result['.']['result'][] = array('STATUS' => ERR_NONE, 'MESSAGE' => $lang['opt_msg_saved']);
    } elseif (sys_get_param_str('result') == 'ok') {
        $template_result['.']['result'][] = array('STATUS' => ERR_NONE, 'MESSAGE' => $lang['opt_msg_saved']);
    }
    $user = db_user_by_id($user['id']);
    $options = sys_user_options_unpack($user);
}
Example #4
0
/**
 * @param        $pos_galaxy
 * @param        $pos_system
 * @param        $pos_planet
 * @param        $user_id
 * @param int    $moon_chance
 * <p><b>0</b> случайный размер луны</p>
 * <p>1..100 Шанс выпадения луны</p>
 * <p>> 100 Размер луны</p>
 * @param string $moon_name
 * @param bool   $update_debris
 * @param array  $options
 *
 * @return array|false|resource
 */
function uni_create_moon($pos_galaxy, $pos_system, $pos_planet, $user_id, $moon_chance = 0, $moon_name = '', $update_debris = true, $options = array())
{
    global $lang;
    $moon_name = '';
    $moon_row = array();
    $moon = db_planet_by_gspt($pos_galaxy, $pos_system, $pos_planet, PT_MOON, false, 'id');
    if (!$moon['id']) {
        $moon_planet = db_planet_by_gspt($pos_galaxy, $pos_system, $pos_planet, PT_PLANET, true, '`id`, `temp_min`, `temp_max`, `name`, `debris_metal`, `debris_crystal`');
        if ($moon_planet['id']) {
            $base_storage_size = BASE_STORAGE_SIZE;
            if (!$moon_chance) {
                $size = mt_rand(1100, 8999);
            } elseif ($moon_chance <= 100) {
                $size = mt_rand($moon_chance * 100 + 1000, $moon_chance * 200 + 2999);
            } else {
                $size = $moon_chance;
            }
            $moon_chance = min(30, ceil($size / 1000));
            $temp_min = $moon_planet['temp_min'] - rand(10, 45);
            $temp_max = $temp_min + 40;
            $moon_name = $moon_name ? $moon_name : "{$moon_planet['name']} {$lang['sys_moon']}";
            $moon_name_safe = db_escape($moon_name);
            $field_max = ceil($size / 1000);
            if (isset($options['image']) && $options['image']) {
                $moon_image = $options['image'];
            } else {
                $moon_image = 'mond';
            }
            $moon_row = classSupernova::db_ins_record(LOC_PLANET, "`id_owner` = '{$user_id}', `parent_planet` = '{$moon_planet['id']}', `name` = '{$moon_name_safe}', `last_update` = " . SN_TIME_NOW . ", `image` = '{$moon_image}',\n          `galaxy` = '{$pos_galaxy}', `system` = '{$pos_system}', `planet` = '{$pos_planet}', `planet_type` = " . PT_MOON . ",\n          `diameter` = '{$size}', `field_max` = '{$field_max}', `density` = 2500, `density_index` = 2, `temp_min` = '{$temp_min}', `temp_max` = '{$temp_max}',\n          `metal` = '0', `metal_perhour` = '0', `metal_max` = '{$base_storage_size}',\n          `crystal` = '0', `crystal_perhour` = '0', `crystal_max` = '{$base_storage_size}',\n          `deuterium` = '0', `deuterium_perhour` = '0', `deuterium_max` = '{$base_storage_size}'");
            if ($update_debris) {
                $debris_spent = $moon_chance * 1000000;
                $metal_spent = round(min($moon_planet['debris_metal'], $debris_spent * mt_rand(50, 75) / 100));
                $crystal_spent = min($moon_planet['debris_crystal'], $debris_spent - $metal_spent);
                $metal_spent = min($moon_planet['debris_metal'], $debris_spent - $crystal_spent);
                // Need if crystal less then their part
                db_planet_set_by_id($moon_planet['id'], "`debris_metal` = GREATEST(0, `debris_metal` - {$metal_spent}), `debris_crystal` = GREATEST(0, `debris_crystal` - {$crystal_spent})");
            }
        }
    }
    return $moon_row;
}
Example #5
0
function que_process(&$user, $planet = null, $on_time = SN_TIME_NOW)
{
    sn_db_transaction_check(true);
    $que = array();
    // Блокируем пользователя. Собственно, запись о нём нам не нужна - будем использовать старую
    $user = db_user_by_id($user['id'], true);
    $time_left[$user['id']][0] = max(0, $on_time - $user['que_processed']);
    if ($planet === null && !$time_left[$user['id']][0]) {
        // TODO
        return $que;
    }
    // Определяем, какие очереди нам нужны и получаем их
    $que_type_id = $planet === null ? QUE_RESEARCH : false;
    $planet = intval(is_array($planet) ? $planet['id'] : $planet);
    // В $planet у нас теперь только её ID или шаблон null/0/false
    $que = que_get($user['id'], $planet, $que_type_id, true);
    //pdump($que);
    if (empty($que['items'])) {
        return $que;
    }
    $planet_list = array();
    if ($planet !== null) {
        // Если нужно изменять данные на планетах - блокируем планеты и получаем данные о них
        // TODO - от них не надо ничего, кроме ID и que_processed
        // $planet_query = db_planet_list_by_user_or_planet($user['id'], $planet);
        // foreach($planet_query as $planet_row)
        $planet_row = db_planet_list_by_user_or_planet($user['id'], $planet);
        $planet_list[$planet_row['id']] = $planet_row;
        $time_left[$planet_row['id_owner']][$planet_row['id']] = max(0, $on_time - $planet_row['que_processed']);
    }
    // pdump($time_left);
    // Теперь в $time_left лежит время обсчета всех очередей по каждой из планеты
    if (array_sum($time_left[$user['id']]) == 0) {
        return $que;
    }
    // pdump($que);
    $db_changeset = array();
    $unit_changes = array();
    foreach ($que['items'] as &$que_item) {
        $que_player_id =& $que_item['que_player_id'];
        $que_planet_id = intval($que_item['que_planet_id']);
        // $que_type = &$que_item['que_type'];
        $que_time_left =& $que['time_left'][$que_player_id][$que_planet_id][$que_item['que_type']];
        if (!isset($que_time_left)) {
            $que_time_left = $time_left[$que_player_id][$que_planet_id];
        }
        if ($que_time_left <= 0 || $que_item['que_unit_amount'] <= 0) {
            continue;
        }
        // Дальше мы идем, если только осталось время в очереди И юниты к постройке
        // Вычисляем, сколько целых юнитов будет построено - от 0 до количества юнитов в очереди
        $unit_processed = min($que_item['que_unit_amount'] - 1, floor($que_time_left / $que_item['que_unit_time']));
        // Вычитаем это время из остатков
        $que_time_left -= $unit_processed * $que_item['que_unit_time'];
        // Теперь работаем с остатком времени на юните. Оно не может быть равно или меньше нуля
        // Если времени в очереди осталось не меньше, чем время текущего юнита - значит мы достроили юнит
        if ($que_time_left >= $que_item['que_time_left']) {
            // Увеличиваем количество отстроенных юнитов
            $unit_processed++;
            // Вычитаем из времени очереди потраченное на постройку время
            $que_time_left -= $que_item['que_time_left'];
            // Полное время юнита равно времени нового юнита
            $que_item['que_time_left'] = $que_item['que_unit_time'];
            // Тут у нас может остатся время очереди - если постройка была не последняя
        }
        // Изменяем количество оставшихся юнитов
        $que_item['que_unit_amount'] -= $unit_processed;
        // Если еще остались юниты - значит ВСЁ оставшееся время приходится на достройку следующего юнита
        if ($que_item['que_unit_amount'] > 0) {
            $que_item['que_time_left'] = $que_item['que_time_left'] - $que_time_left;
            $que_time_left = 0;
        }
        if ($que_item['que_unit_amount'] <= 0) {
            $db_changeset['que'][] = array('action' => SQL_OP_DELETE, P_VERSION => 1, 'where' => array("que_id" => $que_item['que_id']));
        } else {
            $db_changeset['que'][] = array('action' => SQL_OP_UPDATE, P_VERSION => 1, 'where' => array("que_id" => $que_item['que_id']), 'fields' => array('que_unit_amount' => array('delta' => -$unit_processed), 'que_time_left' => array('set' => $que_item['que_time_left'])));
        }
        if ($unit_processed) {
            $unit_processed_delta = $unit_processed * ($que_item['que_unit_mode'] == BUILD_CREATE ? 1 : -1);
            $unit_changes[$que_player_id][$que_planet_id][$que_item['que_unit_id']] += $unit_processed_delta;
        }
    }
    foreach ($time_left as $player_id => $planet_data) {
        foreach ($planet_data as $planet_id => $time_on_planet) {
            $table = $planet_id ? 'planets' : 'users';
            $id = $planet_id ? $planet_id : $player_id;
            $db_changeset[$table][] = array('action' => SQL_OP_UPDATE, P_VERSION => 1, 'where' => array("id" => $id), 'fields' => array('que_processed' => array('set' => $on_time)));
            if (is_array($unit_changes[$player_id][$planet_id])) {
                foreach ($unit_changes[$player_id][$planet_id] as $unit_id => $unit_amount) {
                    $db_changeset['unit'][] = sn_db_unit_changeset_prepare($unit_id, $unit_amount, $user, $planet_id ? $planet_id : null);
                }
            }
        }
    }
    //pdump($db_changeset, '$db_changeset');
    $que = que_recalculate($que);
    //pdump($que, '$que');
    // TODO: Re-enable quests for Alliances
    if (!empty($unit_changes) && !$user['user_as_ally']) {
        $quest_list = qst_get_quests($user['id']);
        $quest_triggers = qst_active_triggers($quest_list);
        $quest_rewards = array();
        $xp_incoming = array();
        foreach ($unit_changes as $user_id => $planet_changes) {
            foreach ($planet_changes as $planet_id => $changes) {
                $planet_this = $planet_id ? classSupernova::db_get_record_by_id(LOC_PLANET, $planet_id) : array();
                foreach ($changes as $unit_id => $unit_value) {
                    $que_id = que_get_unit_que($unit_id);
                    $unit_level_new = mrc_get_level($user, $planet_this, $unit_id, false, true) + $unit_value;
                    if ($que_id == QUE_STRUCTURES || $que_id == QUE_RESEARCH) {
                        $build_data = eco_get_build_data($user, $planet_this, $unit_id, $unit_level_new - 1);
                        $build_data = $build_data[BUILD_CREATE];
                        foreach (sn_get_groups('resources_loot') as $resource_id) {
                            $xp_incoming[$que_id] += $build_data[$resource_id];
                            // TODO - добавить конверсию рейтов обмена
                        }
                    }
                    if (is_array($quest_triggers)) {
                        // TODO: Check mutiply condition quests
                        $quest_trigger_list = array_keys($quest_triggers, $unit_id);
                        if (is_array($quest_trigger_list)) {
                            foreach ($quest_trigger_list as $quest_id) {
                                if ($quest_list[$quest_id]['quest_status_status'] != QUEST_STATUS_COMPLETE && $quest_list[$quest_id]['quest_unit_amount'] <= $unit_level_new) {
                                    $quest_rewards[$quest_id][$user_id][$planet_id] = $quest_list[$quest_id]['quest_rewards_list'];
                                    $quest_list[$quest_id]['quest_status_status'] = QUEST_STATUS_COMPLETE;
                                }
                            }
                        }
                    }
                }
            }
        }
        // TODO: Изменить начисление награды за квесты на ту планету, на которой происходил ресеч
        qst_reward($user, $quest_rewards, $quest_list);
        foreach ($xp_incoming as $que_id => $xp) {
            rpg_level_up($user, $que_id == QUE_RESEARCH ? RPG_TECH : RPG_STRUCTURE, $xp / 1000);
        }
    }
    db_changeset_apply($db_changeset);
    // TODO Сообщения о постройке
    // $user = db_user_by_id($user['id'], true);
    return $que;
    /*
    
    
    
      // $local_que['time_left'][QUE_RESEARCH][0] = $time_left[QUE_RESEARCH][0];
    
    //pdump($user_time_left, '$user_time_left');
    
      print('1');
      //foreach($local_que as $que_id => &$que_data)
      //{
      //  if(!intval($que_id))continue;
      foreach(sn_get_groups('que') as $que_id => $que_info)
      {
        if(!isset($que['ques'][$que_id]))continue;
    
        foreach($que_data as $owner_id => &$que_items)
        {
          foreach($que_items as &$que_item)
          {
            // Вычисляем, сколько целых юнитов будет построено - от 0 до количества юнитов в очереди
            $unit_processed = min($que_item['que_unit_amount'] - 1, floor($local_que['time_left'][$que_id][$owner_id] / $que_item['que_unit_time']));
            // Вычитаем это время из остатков
            $local_que['time_left'][$que_id][$owner_id] -= $unit_processed * $que_item['que_unit_time'];
    
            // Теперь работаем с остатком времени на юните. Оно не может быть равно или меньше нуля
    
            // Вычитаем остаток времени работы очереди с времени постройки юнита
            if($que_item['que_time_left'] <= $local_que['time_left'][$que_id][$owner_id])
            {
              // Если время постройки - неположительное, значит мы достроили юнит
              // Увеличиваем количество отстроенных юнитов
              $unit_processed++;
              // Вычитаем из времени очереди потраченное на постройку время
              $local_que['time_left'][$que_id][$owner_id] -= $que_item['que_time_left'];
              $que_item['que_time_left'] = $que_item['que_unit_time'];
              // Тут у нас может остатся время очереди - если постройка была не последняя
            }
    
            // Изменяем количество оставшихся юнитов
            $que_item['que_unit_amount'] -= $unit_processed;
    
            if($que_item['que_unit_amount'])
            {
              $que_item['que_time_left'] = $que_item['que_time_left'] - $local_que['time_left'][$que_id][$owner_id];
              $local_que['time_left'][$que_id][$owner_id] = 0;
            }
    
            if(!$que_item['que_unit_amount'])
            {
              $db_changeset['que'][$que_item['que_id']] = array(
                'action' => SQL_OP_DELETE,
                'where' => array(
                  "`que_id` = {$que_item['que_id']}",
                ),
              );
            }
            else
            {
              $db_changeset['que'][$que_item['que_id']] = array(
                'action' => SQL_OP_UPDATE,
                'where' => array(
                  "`que_id` = {$que_item['que_id']}",
                ),
                'fields' => array(
                  'que_unit_amount' => array(
                    'delta' => -$unit_processed
                  ),
                  'que_time_left' => array(
                    'set' => $que_item['que_time_left']
                  ),
                ),
              );
            }
    
            if($unit_processed)
            {
              $unit_processed_delta = $unit_processed * ($que_item['que_unit_mode'] == BUILD_CREATE ? 1 : -1);
              $unit_changes[$owner_id][$que_item['que_unit_id']] += $unit_processed_delta;
            }
            // Если на очереди времени не осталось - выходим
            if(!$local_que['time_left'][$que_id][$owner_id])
            {
              break;
            }
          }
        }
      }
    
      die();
    
    
      // TODO: Re-enable quests for Alliances
      if(!empty($unit_changes) && !$user['user_as_ally'] && $user['id_planet'])
      {
        $planet = db_planet_by_id($user['id_planet'], true);
        $quest_list = qst_get_quests($user['id']);
        $quest_triggers = qst_active_triggers($quest_list);
      }
      else
      {
        $planet = array();
      }
    
      $quest_rewards = array();
      $xp_incoming = 0;
      foreach($unit_changes as $owner_id => $changes)
      {
        // $user_id_sql = $owner_id ? $owner_id : $user['id'];
        $planet_id_sql = $owner_id ? $owner_id : null;
        foreach($changes as $unit_id => $unit_value)
        {
    
          $db_changeset['unit'][] = sn_db_unit_changeset_prepare($unit_id, $unit_value, $user, $planet_id_sql);
    
          // TODO: Изменить согласно типу очереди
          $unit_level_new = mrc_get_level($user, array(), $unit_id, false, true) + $unit_value;
          $build_data = eco_get_build_data($user, array(), $unit_id, $unit_level_new - 1);
          $build_data = $build_data[BUILD_CREATE];
          foreach(sn_get_groups('resources_loot') as $resource_id)
          {
            $xp_incoming += $build_data[$resource_id];
          }
    
          if($planet['id'])
          {
            // TODO: Check mutiply condition quests
            $quest_trigger_list = array_keys($quest_triggers, $unit_id);
            foreach($quest_trigger_list as $quest_id)
            {
              if($quest_list[$quest_id]['quest_status_status'] != QUEST_STATUS_COMPLETE && $quest_list[$quest_id]['quest_unit_amount'] <= $unit_level_new)
              {
                $quest_rewards[$quest_id] = $quest_list[$quest_id]['quest_rewards'];
                $quest_list[$quest_id]['quest_status_status'] = QUEST_STATUS_COMPLETE;
              }
            }
          }
    
        }
      }
    
      // TODO: Изменить согласно типу очереди
      rpg_level_up($user, RPG_TECH, $xp_incoming / 1000);
      // TODO: Изменить начисление награды за квесты на ту планету, на которой происходил ресеч
      qst_reward($user, $planet, $quest_rewards, $quest_list);
    
      db_changeset_apply($db_changeset);
    
      // Сообщения о постройке
      $user = db_user_by_id($user['id'], true);
      // TODO Так же пересчитывать планеты
    
      // sn_db_transaction_commit();
    
      // TODO поменять que_processed у планеты и юзера
    
    
      return $local_que;
    */
}
Example #6
0
function db_unit_list_delete($user_id = 0, $unit_location_type, $unit_location_id, $unit_snid = 0)
{
    return classSupernova::db_del_record_list(LOC_UNIT, "`unit_location_type` = {$unit_location_type} AND `unit_location_id` = {$unit_location_id}" . ($user_id = idval($user_id) ? " AND `unit_player_id` = {$user_id}" : '') . ($unit_snid = idval($unit_snid) ? " AND `unit_snid` = {$unit_snid}" : ''));
}
Example #7
0
function db_unit_list_delete($user_id = 0, $unit_location_type, $unit_location_id, $unit_snid = 0)
{
    return classSupernova::db_del_record_list(LOC_UNIT, "`unit_location_type` = {$unit_location_type} AND `unit_location_id` = {$unit_location_id}" . ($user_id = idval($user_id) ? " AND `unit_player_id` = {$user_id}" : '') . ($unit_snid = idval($unit_snid) ? " AND `unit_snid` = {$unit_snid}" : ''));
    return doquery("DELETE FROM {{unit}}\n    WHERE unit_location_type = {$unit_location_type} AND unit_location_id = {$unit_location_id}" . ($user_id = idval($user_id) ? " AND unit_player_id = {$user_id}" : '') . ($unit_snid = idval($unit_snid) ? " AND unit_snid = {$unit_snid}" : ''));
}
Example #8
0
 public static function db_changeset_apply($db_changeset, $flush_delayed = false)
 {
     $result = true;
     if (!is_array($db_changeset) || empty($db_changeset)) {
         return $result;
     }
     foreach ($db_changeset as $table_name => &$table_data) {
         // TODO - delayed changeset
         /*
         if(static::db_transaction_check(false) && !$flush_delayed && ($table_name == 'users' || $table_name == 'planets' || $table_name == 'unit'))
         {
           static::db_changeset_delay($table_name, $table_data);
           continue;
         }
         */
         foreach ($table_data as $record_id => &$conditions) {
             static::db_changeset_condition_compile($conditions, $table_name);
             if ($conditions['action'] != SQL_OP_DELETE && !$conditions[P_FIELDS_STR]) {
                 continue;
             }
             if ($conditions['action'] == SQL_OP_DELETE && !$conditions[P_WHERE_STR]) {
                 continue;
             }
             // Защита от случайного удаления всех данных в таблице
             if ($conditions[P_LOCATION] != LOC_NONE) {
                 //die('spec ops supernova.php line 928 Добавить работу с кэшем юнитов итд');
                 switch ($conditions['action']) {
                     case SQL_OP_DELETE:
                         $result = classSupernova::db_del_record_list($conditions[P_LOCATION], $conditions[P_WHERE_STR]) && $result;
                         break;
                     case SQL_OP_UPDATE:
                         $result = classSupernova::db_upd_record_list($conditions[P_LOCATION], $conditions[P_WHERE_STR], $conditions[P_FIELDS_STR]) && $result;
                         break;
                     case SQL_OP_INSERT:
                         $result = classSupernova::db_ins_record($conditions[P_LOCATION], $conditions[P_FIELDS_STR]) && $result;
                         break;
                     default:
                         die('Неподдерживаемая операция в classSupernova::db_changeset_apply');
                         // case SQL_OP_REPLACE: $result = $result && doquery("REPLACE INTO {{{$table_name}}} SET {$fields}"); break;
                 }
             } else {
                 $result = doquery($conditions[P_QUERY_STR]) && $result;
             }
         }
     }
     return $result;
 }
Example #9
0
function qst_reward(&$user, &$rewards, &$quest_list)
{
    if (empty($rewards)) {
        return;
    }
    global $lang;
    $db_changeset = array();
    $total_rewards = array();
    $comment_dm = '';
    foreach ($rewards as $quest_id => $user_data) {
        foreach ($user_data as $user_id => $planet_data) {
            foreach ($planet_data as $planet_id => $reward_list) {
                $comment = sprintf($lang['qst_msg_complete_body'], $quest_list[$quest_id]['quest_name']);
                $comment_dm .= isset($reward_list[RES_DARK_MATTER]) ? $comment : '';
                $comment_reward = array();
                foreach ($reward_list as $unit_id => $unit_amount) {
                    $comment_reward[] = $unit_amount . ' ' . $lang['tech'][$unit_id];
                    $total_rewards[$user_id][$planet_id][$unit_id] += $unit_amount;
                }
                $comment .= " {$lang['qst_msg_your_reward']} " . implode(',', $comment_reward);
                msg_send_simple_message($user['id'], 0, SN_TIME_NOW, MSG_TYPE_ADMIN, $lang['msg_from_admin'], $lang['qst_msg_complete_subject'], $comment);
                sn_db_perform('{{quest_status}}', array('quest_status_quest_id' => $quest_id, 'quest_status_user_id' => $user_id, 'quest_status_status' => QUEST_STATUS_COMPLETE));
            }
        }
    }
    $group_resources = sn_get_groups('resources_loot');
    $quest_rewards_allowed = sn_get_groups('quest_rewards');
    if (!empty($total_rewards)) {
        foreach ($total_rewards as $user_id => $planet_data) {
            $user_row = classSupernova::db_get_record_by_id(LOC_USER, $user_id);
            foreach ($planet_data as $planet_id => $unit_data) {
                $local_changeset = array();
                foreach ($unit_data as $unit_id => $unit_amount) {
                    if (!isset($quest_rewards_allowed[$unit_id])) {
                        continue;
                    }
                    if ($unit_id == RES_DARK_MATTER) {
                        rpg_points_change($user['id'], RPG_QUEST, $unit_amount, $comment_dm);
                    } elseif (isset($group_resources[$unit_id])) {
                        $local_changeset[pname_resource_name($unit_id)] = array('delta' => $unit_amount);
                    } else {
                        $db_changeset['unit'][] = sn_db_unit_changeset_prepare($unit_id, $unit_amount, $user_row, $planet_id);
                    }
                    // unit
                }
                if (!empty($local_changeset)) {
                    $planet_id = $planet_id == 0 && isset($user_row['id_planet']) ? $user_row['id_planet'] : $planet_id;
                    $db_changeset[$planet_id ? 'planets' : 'users'][] = array('action' => SQL_OP_UPDATE, P_VERSION => 1, 'where' => array("id" => $planet_id ? $planet_id : $user_id), 'fields' => $local_changeset);
                }
            }
        }
        classSupernova::db_changeset_apply($db_changeset);
    }
}
Example #10
0
function mrc_mercenary_render($user)
{
    global $config, $lang, $sn_powerup_buy_discounts;
    $mode = sys_get_param_int('mode', UNIT_MERCENARIES);
    $mode = in_array($mode, array(UNIT_MERCENARIES, UNIT_PLANS)) ? $mode : UNIT_MERCENARIES;
    $is_permanent = $mode == UNIT_PLANS || !$config->empire_mercenary_temporary;
    if ($mercenary_id = sys_get_param_int('mercenary_id')) {
        $operation_result = mrc_mercenary_hire($mode, $user, $mercenary_id);
    }
    lng_include('infos');
    $template = gettemplate('mrc_mercenary_hire', true);
    if (!empty($operation_result)) {
        $template->assign_block_vars('result', $operation_result);
    }
    foreach ($sn_powerup_buy_discounts as $hire_period => $hire_discount) {
        $template->assign_block_vars('period', array('LENGTH' => $hire_period, 'TEXT' => $lang['mrc_period_list'][$hire_period], 'DISCOUNT' => $hire_period / $config->empire_mercenary_base_period * $hire_discount, 'SELECTED' => $hire_period == $config->empire_mercenary_base_period));
    }
    $user_dark_matter = mrc_get_level($user, '', RES_DARK_MATTER);
    $cost_alliance_multiplyer = SN_IN_ALLY === true && $mode == UNIT_PLANS ? $config->ali_bonus_members : 1;
    $cost_alliance_multiplyer = $cost_alliance_multiplyer >= 1 ? $cost_alliance_multiplyer : 1;
    foreach (sn_get_groups($mode == UNIT_PLANS ? 'plans' : 'mercenaries') as $mercenary_id) {
        $mercenary = get_unit_param($mercenary_id);
        $mercenary_bonus = $mercenary['bonus'];
        $mercenary_bonus = $mercenary_bonus >= 0 ? "+{$mercenary_bonus}" : "{$mercenary_bonus}";
        switch ($mercenary['bonus_type']) {
            case BONUS_PERCENT:
                $mercenary_bonus = "{$mercenary_bonus}% ";
                break;
            case BONUS_ABILITY:
                $mercenary_bonus = '';
                break;
            case BONUS_ADD:
            default:
                break;
        }
        $mercenary_level = mrc_get_level($user, null, $mercenary_id, false, true);
        $mercenary_level_bonus = max(0, mrc_get_level($user, null, $mercenary_id) - $mercenary_level);
        $total_cost_old = 0;
        if ($is_permanent) {
            $total_cost_old = eco_get_total_cost($mercenary_id, $mercenary_level);
            $total_cost_old = $total_cost_old[BUILD_CREATE][RES_DARK_MATTER] * $cost_alliance_multiplyer;
        }
        $total_cost = eco_get_total_cost($mercenary_id, $mercenary_level + 1);
        $total_cost[BUILD_CREATE][RES_DARK_MATTER] *= $cost_alliance_multiplyer;
        $mercenary_unit = classSupernova::db_get_unit_by_location($user['id'], LOC_USER, $user['id'], $mercenary_id);
        $mercenary_time_finish = strtotime($mercenary_unit['unit_time_finish']);
        $template->assign_block_vars('officer', array('ID' => $mercenary_id, 'NAME' => $lang['tech'][$mercenary_id], 'DESCRIPTION' => $lang['info'][$mercenary_id]['description'], 'EFFECT' => $lang['info'][$mercenary_id]['effect'], 'COST' => $total_cost[BUILD_CREATE][RES_DARK_MATTER] - $total_cost_old, 'COST_TEXT' => pretty_number($total_cost[BUILD_CREATE][RES_DARK_MATTER] - $total_cost_old, 0, $user_dark_matter), 'LEVEL' => $mercenary_level, 'LEVEL_BONUS' => $mercenary_level_bonus, 'LEVEL_MAX' => $mercenary['max'], 'BONUS' => $mercenary_bonus, 'BONUS_TYPE' => $mercenary['bonus_type'], 'HIRE_END' => $mercenary_time_finish && $mercenary_time_finish >= SN_TIME_NOW ? date(FMT_DATE_TIME, $mercenary_time_finish) : '', 'CAN_BUY' => mrc_officer_accessible($user, $mercenary_id)));
        $upgrade_cost = 1;
        for ($i = $config->empire_mercenary_temporary ? 1 : $mercenary_level + 1; $mercenary['max'] ? $i <= $mercenary['max'] : $upgrade_cost <= $user_dark_matter; $i++) {
            $total_cost = eco_get_total_cost($mercenary_id, $i);
            $total_cost[BUILD_CREATE][RES_DARK_MATTER] *= $cost_alliance_multiplyer;
            $upgrade_cost = $total_cost[BUILD_CREATE][RES_DARK_MATTER] - $total_cost_old;
            $template->assign_block_vars('officer.level', array('VALUE' => $i, 'PRICE' => $upgrade_cost));
        }
    }
    $template->assign_vars(array('PAGE_HEADER' => $lang['tech'][$mode], 'MODE' => $mode, 'IS_PERMANENT' => intval($is_permanent), 'EMPIRE_MERCENARY_TEMPORARY' => $config->empire_mercenary_temporary, 'DARK_MATTER' => $user_dark_matter));
    display(parsetemplate($template), $lang['tech'][$mode]);
}
Example #11
0
function sn_mrc_get_level(&$user, $planet = array(), $unit_id, $for_update = false, $plain = false, &$result)
{
    $mercenary_level = 0;
    $unit_db_name = pname_resource_name($unit_id);
    if (in_array($unit_id, sn_get_groups(array('plans', 'mercenaries', 'tech', 'artifacts')))) {
        /*
        $context = array(
          'location' => LOC_USER,
          'user' => &$user,
        );
        $mercenary_level = unit_get_level($unit_id, $context, array('for_update' => $for_update));
        */
        $unit = classSupernova::db_get_unit_by_location($user['id'], LOC_USER, $user['id'], $unit_id);
        $mercenary_level = is_array($unit) && $unit['unit_level'] ? $unit['unit_level'] : 0;
    } elseif (in_array($unit_id, sn_get_groups(array('structures', 'fleet', 'defense')))) {
        /*
        $context = array(
          'location' => LOC_PLANET,
          'planet' => &$planet,
        );
        $mercenary_level = unit_get_level($unit_id, $context, array('for_update' => $for_update));
        */
        $unit = classSupernova::db_get_unit_by_location(is_array($user) ? $user['id'] : $planet['id_owner'], LOC_PLANET, $planet['id'], $unit_id);
        $mercenary_level = is_array($unit) && $unit['unit_level'] ? $unit['unit_level'] : 0;
    } elseif (in_array($unit_id, sn_get_groups('governors'))) {
        $mercenary_level = $unit_id == $planet['PLANET_GOVERNOR_ID'] ? $planet['PLANET_GOVERNOR_LEVEL'] : 0;
    } elseif ($unit_id == RES_DARK_MATTER || $unit_id == RES_METAMATTER) {
        $mercenary_level = $user[$unit_db_name];
    } elseif (in_array($unit_id, sn_get_groups(array('resources_loot'))) || $unit_id == UNIT_SECTOR) {
        $mercenary_level = !empty($planet) ? $planet[$unit_db_name] : $user[$unit_db_name];
    }
    return $result = $mercenary_level;
}
Example #12
0
 public function lng_switch($language_new)
 {
     global $language, $user, $sn_mvc;
     classSupernova::log_file("locale.switch: Request for switch to '{$language_new}'", 1);
     $language_new = str_replace(array('?', '&', 'lang='), '', $language_new);
     $language_new = $language_new ? $language_new : (!empty($user['lang']) ? $user['lang'] : DEFAULT_LANG);
     classSupernova::log_file("locale.switch: Trying to switch language to '{$language_new}'");
     if ($language_new == $this->active) {
         classSupernova::log_file("locale.switch: New language '{$language_new}' is equal to current language '{$this->active}' - EXIT", -1);
         return false;
     }
     $this->active = $language = $language_new;
     $this->cache_prefix_lang = $this->cache_prefix . $this->active . '_';
     $this['LANG_INFO'] = $this->lng_get_info($this->active);
     $this->make_fallback($this->active);
     if ($this->cache) {
         $cache_lang_init_status = $this->cache->__get($this->cache_prefix_lang . '__INIT');
         classSupernova::log_file("locale.switch: Cache for '{$this->active}' prefixed '{$this->cache_prefix_lang}' is " . ($cache_lang_init_status ? 'already loaded. Doing nothing - EXIT' : 'EMPTY'), $cache_lang_init_status ? -1 : 0);
         if ($cache_lang_init_status) {
             return false;
         }
         // Чистим текущие локализации из кэша. Достаточно почистить только флаги инициализации языкового кэша и загрузки файлов - они начинаются с '__'
         classSupernova::log_file("locale.switch: Cache - invalidating data");
         $this->cache->unset_by_prefix($this->cache_prefix_lang . '__');
     }
     $this->lng_include('system');
     //    $this->lng_include('menu');
     $this->lng_include('tech');
     $this->lng_include('payment');
     // Loading global language files
     $this->lng_load_i18n($sn_mvc['i18n']['']);
     if ($this->cache) {
         classSupernova::log_file("locale.switch: Cache - setting flag " . $this->cache_prefix_lang . '__INIT');
         $this->cache->__set($this->cache_prefix_lang . '__INIT', true);
     }
     classSupernova::log_file("locale.switch: Complete - EXIT");
     return true;
 }
Example #13
0
 public static function init_global_objects()
 {
     /**
      * @var classSupernova $supernova
      */
     global $supernova, $sn_cache, $config;
     self::$user_options = new userOptions(0);
     /**
      * @var classSupernova $supernova
      */
     $supernova = new classSupernova();
     // Initializing global 'cacher' object
     static::$cache = new classCache(classSupernova::$cache_prefix);
     $sn_cache = static::$cache;
     empty($sn_cache->tables) && sys_refresh_tablelist();
     empty($sn_cache->tables) && die('DB error - cannot find any table. Halting...');
     // Initializing global "config" object
     static::$config = new classConfig(classSupernova::$cache_prefix);
     $config = static::$config;
     //$config->db_prefix = classSupernova::$db_prefix;
     //$config->secret_word = classSupernova::$sn_secret_word;
     //$config->db_saveItem('secret_word', classSupernova::$sn_secret_word);
     //$config->db_saveItem('db_prefix', classSupernova::$db_prefix);
     //$config->db_saveItem('cache_prefix', classSupernova::$cache_prefix);
 }
Example #14
0
function db_user_last_registered_username()
{
    return classSupernova::db_get_user_player_username_last_registered();
}
Example #15
0
function db_que_delete_by_id($que_id)
{
    return classSupernova::db_del_record_by_id(LOC_QUE, $que_id);
    // return doquery("DELETE FROM {{que}} WHERE que_id = {$que_id} LIMIT 1");
}
Example #16
0
 protected function flog($message, $die = false)
 {
     if (!defined('DEBUG_AUTH') || !DEBUG_AUTH) {
         return;
     }
     list($called, $caller) = debug_backtrace(false);
     $caller_name = (get_called_class() ? get_called_class() : (!empty($caller['class']) ? $caller['class'] : '')) . (!empty($caller['type']) ? $caller['type'] : '') . (!empty($caller['function']) ? $caller['function'] : '') . (!empty($called['line']) ? ':' . $called['line'] : '');
     //     $real_caller_class = get_called_class();
     $_SERVER['SERVER_NAME'] == 'localhost' ? print "<div class='debug'>{$message} - {$caller_name}\r\n</div>" : false;
     classSupernova::log_file("{$message} - {$caller_name}");
     if ($die) {
         // pdump($caller);
         // pdump(debug_backtrace(false));
         $die && die("<div class='negative'>СТОП! Функция {$caller_name} при вызове в " . get_called_class() . " (располагается в " . get_class() . "). СООБЩИТЕ АДМИНИСТРАЦИИ!</div>");
     }
 }
Example #17
0
function sys_stat_calculate()
{
    global $config, $sta_update_step;
    ini_set('memory_limit', $config->stats_php_memory ? $config->stats_php_memory : '1024M');
    $user_skip_list = sys_stat_get_user_skip_list();
    // $sn_groups_resources_loot = sn_get_groups('resources_loot');
    $rate[RES_METAL] = $config->rpg_exchange_metal;
    $rate[RES_CRYSTAL] = $config->rpg_exchange_crystal / $config->rpg_exchange_metal;
    $rate[RES_DEUTERIUM] = $config->rpg_exchange_deuterium / $config->rpg_exchange_metal;
    $rate[RES_DARK_MATTER] = $config->rpg_exchange_darkMatter / $config->rpg_exchange_metal;
    $sta_update_step = -1;
    sta_set_time_limit('starting update');
    $counts = $points = $unit_cost_cache = $user_allies = array();
    sn_db_transaction_start();
    sta_set_time_limit('calculating players stats');
    $i = 0;
    // Блокируем всех пользователей
    classSupernova::db_lock_tables('users');
    $user_list = db_user_list('', true, 'id, dark_matter, metal, crystal, deuterium, user_as_ally, ally_id');
    $row_num = count($user_list);
    // while($player = db_fetch($query))
    foreach ($user_list as $player) {
        if ($i++ % 100 == 0) {
            sta_set_time_limit("calculating players stats (player {$i}/{$row_num})", false);
        }
        if (array_key_exists($user_id = $player['id'], $user_skip_list)) {
            continue;
        }
        $resources = $player['metal'] * $rate[RES_METAL] + $player['crystal'] * $rate[RES_CRYSTAL] + $player['deuterium'] * $rate[RES_DEUTERIUM] + $player['dark_matter'] * $rate[RES_DARK_MATTER];
        $counts[$user_id][UNIT_RESOURCES] += $resources;
        // $points[$user_id][UNIT_RESOURCES] += $resources;
        // А здесь мы фильтруем пользователей по $user_skip_list - далее не нужно этого делать, потому что
        if (!isset($user_skip_list[$user_id])) {
            $user_allies[$user_id] = $player['ally_id'];
        }
    }
    unset($user_list);
    classSupernova::cache_clear(LOC_USER, true);
    //pdump(classSupernova::$data[LOC_USER]);
    //pdump(classSupernova::$locks[LOC_USER]);
    sta_set_time_limit('calculating planets stats');
    $i = 0;
    $query = db_planet_list_resources_by_owner();
    $row_num = db_num_rows($query);
    while ($planet = db_fetch($query)) {
        if ($i++ % 100 == 0) {
            sta_set_time_limit("calculating planets stats (planet {$i}/{$row_num})", false);
        }
        if (array_key_exists($user_id = $planet['id_owner'], $user_skip_list)) {
            continue;
        }
        $resources = $planet['metal'] * $rate[RES_METAL] + $planet['crystal'] * $rate[RES_CRYSTAL] + $planet['deuterium'] * $rate[RES_DEUTERIUM];
        $counts[$user_id][UNIT_RESOURCES] += $resources;
        // $points[$user_id][UNIT_RESOURCES] += $resources;
    }
    // Calculation of Fleet-In-Flight
    sta_set_time_limit('calculating flying fleets stats');
    $i = 0;
    $query = doquery("SELECT fleet_owner, fleet_array, fleet_resource_metal, fleet_resource_crystal, fleet_resource_deuterium FROM {{fleets}};");
    $row_num = db_num_rows($query);
    while ($fleet_row = db_fetch($query)) {
        if ($i++ % 100 == 0) {
            sta_set_time_limit("calculating flying fleets stats (fleet {$i}/{$row_num})", false);
        }
        if (array_key_exists($user_id = $fleet_row['fleet_owner'], $user_skip_list)) {
            continue;
        }
        $fleet = sys_unit_str2arr($fleet_row['fleet_array']);
        foreach ($fleet as $unit_id => $unit_amount) {
            $counts[$user_id][UNIT_SHIPS] += $unit_amount;
            if (!isset($unit_cost_cache[$unit_id][0])) {
                $unit_cost_cache[$unit_id][0] = get_unit_param($unit_id, P_COST);
            }
            $unit_cost_data =& $unit_cost_cache[$unit_id][0];
            $points[$user_id][UNIT_SHIPS] += ($unit_cost_data[RES_METAL] * $rate[RES_METAL] + $unit_cost_data[RES_CRYSTAL] * $rate[RES_CRYSTAL] + $unit_cost_data[RES_DEUTERIUM] * $rate[RES_DEUTERIUM]) * $unit_amount;
        }
        $resources = $fleet_row['fleet_resource_metal'] * $rate[RES_METAL] + $fleet_row['fleet_resource_crystal'] * $rate[RES_CRYSTAL] + $fleet_row['fleet_resource_deuterium'] * $rate[RES_DEUTERIUM];
        $counts[$user_id][UNIT_RESOURCES] += $resources;
        // $points[$user_id][UNIT_RESOURCES] += $resources;
    }
    sta_set_time_limit('calculating unit stats');
    $i = 0;
    $query = db_unit_list_stat_calculate();
    $row_num = db_num_rows($query);
    while ($unit = db_fetch($query)) {
        if ($i++ % 100 == 0) {
            sta_set_time_limit("calculating unit stats (unit {$i}/{$row_num})", false);
        }
        if (array_key_exists($user_id = $unit['unit_player_id'], $user_skip_list)) {
            continue;
        }
        $counts[$user_id][$unit['unit_type']] += $unit['unit_level'] * $unit['unit_amount'];
        $total_cost = eco_get_total_cost($unit['unit_snid'], $unit['unit_level']);
        $points[$user_id][$unit['unit_type']] += (isset($total_cost['total']) ? $total_cost['total'] : 0) * $unit['unit_amount'];
    }
    sta_set_time_limit('calculating ques stats');
    $i = 0;
    $query = db_que_list_stat();
    $row_num = db_num_rows($query);
    while ($que_item = db_fetch($query)) {
        if ($i++ % 100 == 0) {
            sta_set_time_limit("calculating ques stats (que item {$i}/{$row_num})", false);
        }
        if (array_key_exists($user_id = $que_item['que_player_id'], $user_skip_list)) {
            continue;
        }
        $que_unit_amount = $que_item['que_unit_amount'];
        $que_item = sys_unit_str2arr($que_item['que_unit_price']);
        $resources = ($que_item[RES_METAL] * $rate[RES_METAL] + $que_item[RES_CRYSTAL] * $rate[RES_CRYSTAL] + $que_item[RES_DEUTERIUM] * $rate[RES_DEUTERIUM]) * $que_unit_amount;
        $counts[$user_id][UNIT_RESOURCES] += $resources;
        // $points[$user_id][UNIT_RESOURCES] += $resources;
    }
    sta_set_time_limit('archiving old statistic');
    // Statistic rotation
    // doquery("DELETE FROM {{statpoints}} WHERE `stat_code` >= 14;");
    doquery("DELETE FROM {{statpoints}} WHERE `stat_date` < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL {$config->stats_history_days} DAY));");
    doquery("UPDATE {{statpoints}} SET `stat_code` = `stat_code` + 1;");
    sta_set_time_limit('posting new user stats to DB');
    $data = array();
    foreach ($user_allies as $user_id => $ally_id) {
        // $counts[UNIT_RESOURCES] дублирует $points[UNIT_RESOURCES], поэтому $points не заполняем, а берем $counts и делим на 1000
        $points[$user_id][UNIT_RESOURCES] = $counts[$user_id][UNIT_RESOURCES] / 1000;
        $points[$user_id] = array_map('floor', $points[$user_id]);
        $counts[$user_id] = array_map('floor', $counts[$user_id]);
        $ally_id = $ally_id ? $ally_id : 'NULL';
        $user_defence_points = $points[$user_id][UNIT_DEFENCE] + $points[$user_id][UNIT_DEF_MISSILES];
        $user_defence_counts = $counts[$user_id][UNIT_DEFENCE] + $counts[$user_id][UNIT_DEF_MISSILES];
        $user_points = array_sum($points[$user_id]);
        $user_counts = array_sum($counts[$user_id]);
        $data[] = $q = "({$user_id},{$ally_id},1,1,'{$points[$user_id][UNIT_TECHNOLOGIES]}','{$counts[$user_id][UNIT_TECHNOLOGIES]}'," . "'{$points[$user_id][UNIT_STRUCTURES]}','{$counts[$user_id][UNIT_STRUCTURES]}','{$user_defence_points}','{$user_defence_counts}'," . "'{$points[$user_id][UNIT_SHIPS]}','{$counts[$user_id][UNIT_SHIPS]}','{$points[$user_id][UNIT_RESOURCES]}','{$counts[$user_id][UNIT_RESOURCES]}'," . "{$user_points},{$user_counts}," . SN_TIME_NOW . ")";
        sys_stat_calculate_flush($data);
    }
    sys_stat_calculate_flush($data, true);
    // Updating Allie's stats
    sta_set_time_limit('posting new Alliance stats to DB');
    doquery("INSERT INTO {{statpoints}}\n      (`tech_points`, `tech_count`, `build_points`, `build_count`, `defs_points`, `defs_count`,\n        `fleet_points`, `fleet_count`, `res_points`, `res_count`, `total_points`, `total_count`,\n        `stat_date`, `id_owner`, `id_ally`, `stat_type`, `stat_code`,\n        `tech_old_rank`, `build_old_rank`, `defs_old_rank`, `fleet_old_rank`, `res_old_rank`, `total_old_rank`\n      )\n      SELECT\n        SUM(u.`tech_points`)+aus.`tech_points`, SUM(u.`tech_count`)+aus.`tech_count`, SUM(u.`build_points`)+aus.`build_points`, SUM(u.`build_count`)+aus.`build_count`,\n        SUM(u.`defs_points`)+aus.`defs_points`, SUM(u.`defs_count`)+aus.`defs_count`, SUM(u.`fleet_points`)+aus.`fleet_points`, SUM(u.`fleet_count`)+aus.`fleet_count`,\n        SUM(u.`res_points`)+aus.`res_points`, SUM(u.`res_count`)+aus.`res_count`, SUM(u.`total_points`)+aus.`total_points`, SUM(u.`total_count`)+aus.`total_count`,\n        " . SN_TIME_NOW . ", NULL, u.`id_ally`, 2, 1,\n        a.tech_rank, a.build_rank, a.defs_rank, a.fleet_rank, a.res_rank, a.total_rank\n      FROM {{statpoints}} as u\n        join {{alliance}} as al on al.id = u.id_ally\n        left join {{statpoints}} as aus on aus.id_owner = al.ally_user_id and aus.stat_type = 1 AND aus.stat_code = 1\n        LEFT JOIN {{statpoints}} as a ON a.id_ally = u.id_ally AND a.stat_code = 2 AND a.stat_type = 2\n      WHERE u.`stat_type` = 1 AND u.stat_code = 1 AND u.id_ally<>0\n      GROUP BY u.`id_ally`");
    // Удаляем больше не нужные записи о достижении игрока-альянса
    db_stat_list_delete_ally_player();
    // Some variables we need to update ranks
    $qryResetRowNum = 'SET @rownum=0;';
    $qryFormat = 'UPDATE {{statpoints}} SET `%1$s_rank` = (SELECT @rownum:=@rownum+1) WHERE `stat_type` = %2$d AND `stat_code` = 1 ORDER BY `%1$s_points` DESC, `id_owner` ASC, `id_ally` ASC;';
    $rankNames = array('tech', 'build', 'defs', 'fleet', 'res', 'total');
    // Updating player's ranks
    sta_set_time_limit("updating ranks for players");
    foreach ($rankNames as $rankName) {
        sta_set_time_limit("updating player rank '{$rankName}'", false);
        doquery($qryResetRowNum);
        doquery(sprintf($qryFormat, $rankName, 1));
    }
    sta_set_time_limit("updating ranks for Alliances");
    // --- Updating Allie's ranks
    foreach ($rankNames as $rankName) {
        sta_set_time_limit("updating Alliances rank '{$rankName}'", false);
        doquery($qryResetRowNum);
        doquery(sprintf($qryFormat, $rankName, 2));
    }
    sta_set_time_limit('setting previous user stats from archive');
    doquery("UPDATE {{statpoints}} as new\n      LEFT JOIN {{statpoints}} as old ON old.id_owner = new.id_owner AND old.stat_code = 2 AND old.stat_type = new.stat_type\n    SET\n      new.tech_old_rank = old.tech_rank,\n      new.build_old_rank = old.build_rank,\n      new.defs_old_rank  = old.defs_rank ,\n      new.fleet_old_rank = old.fleet_rank,\n      new.res_old_rank = old.res_rank,\n      new.total_old_rank = old.total_rank\n    WHERE\n      new.stat_type = 1 AND new.stat_code = 1;");
    sta_set_time_limit('setting previous allies stats from archive');
    doquery("UPDATE {{statpoints}} as new\n      LEFT JOIN {{statpoints}} as old ON old.id_ally = new.id_ally AND old.stat_code = 2 AND old.stat_type = new.stat_type\n    SET\n      new.tech_old_rank = old.tech_rank,\n      new.build_old_rank = old.build_rank,\n      new.defs_old_rank  = old.defs_rank ,\n      new.fleet_old_rank = old.fleet_rank,\n      new.res_old_rank = old.res_rank,\n      new.total_old_rank = old.total_rank\n    WHERE\n      new.stat_type = 2 AND new.stat_code = 1;");
    sta_set_time_limit('updating players current rank and points');
    db_stat_list_update_user_stats();
    sta_set_time_limit('updating Allys current rank and points');
    db_stat_list_update_ally_stats();
    // Counting real user count and updating values
    $config->db_saveItem('users_amount', db_user_count());
    sn_db_transaction_commit();
}
Example #18
0
function sn_db_transaction_rollback()
{
    return classSupernova::db_transaction_rollback();
}
Example #19
0
function db_planet_count_by_type($ui_user_id, $ui_planet_type = PT_PLANET)
{
    // $si_user_id = intval($ui_user_id);
    $si_user_id = idval($ui_user_id);
    $si_planet_type = intval($ui_planet_type);
    // Лочим запись-родителя - если она есть и еще не залочена
    $record_list = classSupernova::db_get_record_list(LOC_PLANET, "`id_owner` = {$si_user_id} AND `planet_type` = {$si_planet_type}");
    return is_array($record_list) ? count($record_list) : 0;
    // $planets = doquery("SELECT COUNT(*) AS planet_count FROM {{planets}} WHERE `id_owner` = {$si_user_id} AND `planet_type` = {$si_planet_type}", true);
    // return isset($planets['planet_count']) ? $planets['planet_count'] : 0;
}
Example #20
0
define('DEFAULT_SKINPATH', $config->game_default_skin ? $config->game_default_skin : 'skins/EpicBlue/');
define('DEFAULT_LANG', $config->game_default_language ? $config->game_default_language : 'ru');
define('FMT_DATE', $config->int_format_date ? $config->int_format_date : 'd.m.Y');
define('FMT_TIME', $config->int_format_time ? $config->int_format_time : 'H:i:s');
define('FMT_DATE_TIME', FMT_DATE . ' ' . FMT_TIME);
$HTTP_ACCEPT_LANGUAGE = DEFAULT_LANG;
require_once SN_ROOT_PHYSICAL . "includes/template" . DOT_PHP_EX;
$template_result = array('.' => array('result' => array()));
sn_sys_load_php_files(SN_ROOT_PHYSICAL . "includes/functions/", PHP_EX);
// Подключаем все модули
// По нормальным делам тут надо подключать манифесты
// И читать конфиги - вдруг модуль отключен?
// Конфиг - часть манифеста?
$sn_module = array();
$sn_module_list = array();
classSupernova::$auth = new core_auth();
sn_sys_load_php_files(SN_ROOT_PHYSICAL . "modules/", PHP_EX, true);
// Здесь - потому что core_auth модуль лежит в другом каталоге и его нужно инициализировать отдельно
// TODO - переработать этот костыль
// new auth_local();
// pdump($sn_module);
// Подключаем дефолтную страницу
// По нормальным делам её надо подключать в порядке загрузки обработчиков
// Сейчас мы делаем это здесь только для того, что бы содержание дефолтной страницы оказалось вверху. Что не факт, что нужно всегда
// Но нужно, пока у нас есть не MVC-страницы
$sn_page_data = $sn_data['pages'][$sn_page_name];
$sn_page_name_file = 'includes/pages/' . $sn_page_data['filename'] . DOT_PHP_EX;
if ($sn_page_name && isset($sn_page_data) && file_exists($sn_page_name_file)) {
    require_once $sn_page_name_file;
    if (is_array($sn_page_data['options'])) {
        $supernova->options = array_merge($supernova->options, $sn_page_data['options']);