function msg_send_simple_message($owners, $sender, $timestamp, $message_type, $from, $subject, $text, $escaped = false, $force = false)
{
    global $config, $user, $sn_message_class_list;
    if (!$owners) {
        return;
    }
    $timestamp = $timestamp ? $timestamp : SN_TIME_NOW;
    $sender = intval($sender);
    if (!is_array($owners)) {
        $owners = array($owners);
    }
    if (!$escaped) {
        $from = db_escape($from);
        $subject = db_escape($subject);
        $text = db_escape($text);
    }
    $text_unescaped = stripslashes(str_replace(array('\\r\\n', "\r\n"), "<br />", $text));
    $message_class = $sn_message_class_list[$message_type];
    $message_class_email = $message_class['email'];
    $message_class_switchable = $message_class['switchable'];
    $message_class_name = $message_class['name'];
    $message_class_name_total = $sn_message_class_list[MSG_TYPE_NEW]['name'];
    if ($owners[0] == '*') {
        if ($user['authlevel'] < 3) {
            return false;
        }
        // TODO Добавить $timestamp - рассылка может быть и отсроченной
        // TODO Добавить $sender - рассылка может быть и от кого-то
        db_message_insert_all($message_type, $from, $subject, $text);
        $owners = array();
    } else {
        $insert_values = array();
        $insert_template = "('%u'," . str_replace('%', '%%', " '{$sender}', '{$timestamp}', '{$message_type}', '{$from}', '{$subject}', '{$text}')");
        foreach ($owners as $owner) {
            if ($user['id'] != $owner) {
                $owner_row = db_user_by_id($owner);
            } else {
                $owner_row = $user;
            }
            sys_user_options_unpack($owner_row);
            if ($force || !$message_class_switchable || $owner_row["opt_{$message_class_name}"]) {
                $insert_values[] = sprintf($insert_template, $owner);
            }
            if ($message_class_email && $config->game_email_pm && $owner_row["opt_email_{$message_class_name}"]) {
                @($result = mymail($owner_row['email'], $subject, $text_unescaped, '', true));
            }
        }
        if (empty($insert_values)) {
            return;
        }
        doquery($QryInsertMessage = 'INSERT INTO {{messages}} (`message_owner`, `message_sender`, `message_time`, `message_type`, `message_from`, `message_subject`, `message_text`) ' . 'VALUES ' . implode(',', $insert_values));
    }
    db_user_list_set_mass_mail($owners, "`{$message_class_name}` = `{$message_class_name}` + 1, `{$message_class_name_total}` = `{$message_class_name_total}` + 1");
    if (in_array($user['id'], $owners) || $owners[0] == '*') {
        $user[$message_class_name]++;
        $user[$message_class_name_total]++;
    }
}
Example #2
0
/**
 * @param int        $Galaxy
 * @param int        $System
 * @param int        $Position
 * @param int        $PlanetOwnerID
 * @param string     $planet_name_unsafe
 * @param bool|false $HomeWorld
 * @param array      $options
 *
 * @return bool
 */
function uni_create_planet($Galaxy, $System, $Position, $PlanetOwnerID, $planet_name_unsafe = '', $HomeWorld = false, $options = array())
{
    global $lang, $config;
    $Position = intval($Position);
    if (!isset($options['skip_check']) && db_planet_by_gspt($Galaxy, $System, $Position, PT_PLANET, true, '`id`')) {
        return false;
    }
    $user_row = !empty($options['user_row']) && is_array($options['user_row']) ? $options['user_row'] : db_user_by_id($PlanetOwnerID);
    $planet_generator = sn_get_groups('planet_generator');
    if ($HomeWorld) {
        $position_data = $planet_generator[0];
    } else {
        $position_data = $planet_generator[$Position >= UNIVERSE_RANDOM_PLANET_START || $Position < 1 ? UNIVERSE_RANDOM_PLANET_START : $Position];
        if ($Position >= UNIVERSE_RANDOM_PLANET_START) {
            // Корректируем температуру для планеты-странника
            $position_data['t_max_max'] -= UNIVERSE_RANDOM_PLANET_TEMPERATURE_DECREASE * ($Position - UNIVERSE_RANDOM_PLANET_START);
        }
    }
    $planet_images = sn_get_groups('planet_images');
    $planet_image = $position_data['planet_images'][mt_rand(0, count($position_data['planet_images']) - 1)];
    $planet_image .= 'planet' . $planet_images[$planet_image][mt_rand(0, count($planet_images[$planet_image]) - 1)];
    $t_max = sn_rand_gauss_range($position_data['t_max_min'], $position_data['t_max_max'], true, 1.3, true);
    $t_min = $t_max - sn_rand_gauss_range($position_data['t_delta_min'], $position_data['t_delta_max'], true, 1.3, true);
    $planet_sectors = sn_rand_gauss_range($position_data['size_min'], $position_data['size_max'], true, 1.7, true);
    //  $planet_diameter = round(pow($planet_sectors, 2) * 1000);
    $planet_diameter = round(sqrt($planet_sectors) * 1000);
    $core_info = uni_create_planet_get_density($position_data, $user_row, $planet_sectors);
    $planet_name_unsafe = $user_row['username'] . ' ' . ($planet_name_unsafe ? $planet_name_unsafe : $lang['sys_colo_defaultname']);
    $planet['name'] = db_escape(strip_tags(trim($planet_name_unsafe)));
    $planet['id_owner'] = $PlanetOwnerID;
    $planet['last_update'] = SN_TIME_NOW;
    $planet['image'] = $planet_image;
    $planet['galaxy'] = $Galaxy;
    $planet['system'] = $System;
    $planet['planet'] = $planet['position_original'] = $Position;
    $planet['planet_type'] = PT_PLANET;
    $planet['diameter'] = $planet_diameter;
    $planet['field_max'] = $planet['field_max_original'] = $planet_sectors;
    $planet['density'] = $core_info[UNIT_PLANET_DENSITY];
    $planet['density_index'] = $core_info[UNIT_PLANET_DENSITY_INDEX];
    $planet['temp_min'] = $planet['temp_min_original'] = $t_min;
    $planet['temp_max'] = $planet['temp_max_original'] = $t_max;
    $planet['metal'] = $config->eco_planet_starting_metal;
    $planet['crystal'] = $config->eco_planet_starting_crystal;
    $planet['deuterium'] = $config->eco_planet_starting_deuterium;
    $planet['metal_max'] = $config->eco_planet_storage_metal;
    $planet['crystal_max'] = $config->eco_planet_storage_crystal;
    $planet['deuterium_max'] = $config->eco_planet_storage_deuterium;
    $density_info_resources =& $density_list[$core_info[UNIT_PLANET_DENSITY_INDEX]][UNIT_RESOURCES];
    $planet['metal_perhour'] = $config->metal_basic_income * $density_info_resources[RES_METAL];
    $planet['crystal_perhour'] = $config->crystal_basic_income * $density_info_resources[RES_CRYSTAL];
    $planet['deuterium_perhour'] = $config->deuterium_basic_income * $density_info_resources[RES_DEUTERIUM];
    $RetValue = classSupernova::db_ins_record(LOC_PLANET, "`name` = '{$planet['name']}', `id_owner` = '{$planet['id_owner']}', `last_update` = '{$planet['last_update']}', `image` = '{$planet['image']}',\n      `galaxy` = '{$planet['galaxy']}', `system` = '{$planet['system']}', `planet` = '{$planet['planet']}', `planet_type` = '{$planet['planet_type']}', `position_original` = '{$planet['position_original']}',\n      `diameter` = '{$planet['diameter']}', `field_max` = '{$planet['field_max']}', `field_max_original` = '{$planet['field_max_original']}',\n      `density` = '{$planet['density']}', `density_index` = '{$planet['density_index']}',\n      `temp_min` = '{$planet['temp_min']}', `temp_max` = '{$planet['temp_max']}', `temp_min_original` = '{$planet['temp_min_original']}', `temp_max_original` = '{$planet['temp_max_original']}',\n      `metal` = '{$planet['metal']}', `metal_perhour` = '{$planet['metal_perhour']}', `metal_max` = '{$planet['metal_max']}',\n      `crystal` = '{$planet['crystal']}', `crystal_perhour` = '{$planet['crystal_perhour']}', `crystal_max` = '{$planet['crystal_max']}',\n      `deuterium` = '{$planet['deuterium']}', `deuterium_perhour` = '{$planet['deuterium_perhour']}', `deuterium_max` = '{$planet['deuterium_max']}'");
    return is_array($RetValue) ? $RetValue['id'] : false;
    // OK
}
Example #3
0
/**
 * @param template $template
 * @param string $query_where
 * @param int    $query_limit
 */
function nws_render(&$template, $query_where = '', $query_limit = 20)
{
    global $config, $user;
    $announce_list = doquery("SELECT a.*, UNIX_TIMESTAMP(`tsTimeStamp`) AS unix_time, u.authlevel, s.*\n    FROM\n      {{announce}} AS a\n      LEFT JOIN {{survey}} AS s ON s.survey_announce_id = a.idAnnounce\n      LEFT JOIN {{users}} AS u ON u.id = a.user_id\n    {$query_where}\n    ORDER BY `tsTimeStamp` DESC, idAnnounce" . ($query_limit ? " LIMIT {$query_limit}" : ''));
    $template->assign_var('NEWS_COUNT', db_num_rows($announce_list));
    $users = array();
    while ($announce = db_fetch($announce_list)) {
        if ($announce['user_id'] && !isset($users[$announce['user_id']])) {
            $users[$announce['user_id']] = db_user_by_id($announce['user_id']);
        }
        $survey_vote = array('survey_vote_id' => 1);
        $survey_complete = strtotime($announce['survey_until']) < SN_TIME_NOW;
        if ($announce['survey_id'] && !empty($user['id'])) {
            $survey_vote = !$survey_complete ? $survey_vote = doquery("SELECT `survey_vote_id` FROM `{{survey_votes}}` WHERE survey_parent_id = {$announce['survey_id']} AND survey_vote_user_id = {$user['id']} LIMIT 1;", true) : array();
        }
        $announce_exploded = explode("<br /><br />", cht_message_parse($announce['strAnnounce'], false, intval($announce['authlevel'])));
        $template->assign_block_vars('announces', array('ID' => $announce['idAnnounce'], 'TIME' => date(FMT_DATE_TIME, $announce['unix_time'] + SN_CLIENT_TIME_DIFF), 'ANNOUNCE' => cht_message_parse($announce['strAnnounce'], false, intval($announce['authlevel'])), 'DETAIL_URL' => $announce['detail_url'], 'USER_NAME' => isset($users[$announce['user_id']]) && $users[$announce['user_id']] ? player_nick_render_to_html($users[$announce['user_id']], array('color' => true)) : js_safe_string($announce['user_name']), 'NEW' => $announce['unix_time'] + $config->game_news_actual >= SN_TIME_NOW, 'FUTURE' => $announce['unix_time'] > SN_TIME_NOW, 'SURVEY_ID' => $announce['survey_id'], 'SURVEY_TEXT' => $announce['survey_question'], 'SURVEY_CAN_VOTE' => empty($survey_vote) && !$survey_complete, 'SURVEY_COMPLETE' => $survey_complete, 'SURVEY_UNTIL' => $announce['survey_until']));
        foreach ($announce_exploded as $announce_paragraph) {
            $template->assign_block_vars('announces.paragraph', array('TEXT' => $announce_paragraph));
        }
        if ($announce['survey_id']) {
            $survey_query = doquery("SELECT survey_answer_text AS `TEXT`, count(DISTINCT survey_vote_id) AS `VOTES`\n          FROM `{{survey_answers}}` AS sa\n            LEFT JOIN `{{survey_votes}}` AS sv ON sv.survey_parent_answer_id = sa.survey_answer_id\n          WHERE sa.survey_parent_id = {$announce['survey_id']}\n          GROUP BY survey_answer_id\n          ORDER BY survey_answer_id;");
            $survey_vote_result = array();
            $total_votes = 0;
            while ($row = db_fetch($survey_query)) {
                $survey_vote_result[] = $row;
                $total_votes += $row['VOTES'];
            }
            if (empty($survey_vote) && !$survey_complete) {
                // Can vote
                $survey_query = doquery("SELECT * FROM {{survey_answers}} WHERE survey_parent_id  = {$announce['survey_id']} ORDER BY survey_answer_id;");
                while ($row = db_fetch($survey_query)) {
                    $template->assign_block_vars('announces.survey_answers', array('ID' => $row['survey_answer_id'], 'TEXT' => $row['survey_answer_text']));
                }
            } else {
                // Show result
                foreach ($survey_vote_result as &$vote_result) {
                    $vote_percent = $total_votes ? $vote_result['VOTES'] / $total_votes * 100 : 0;
                    $vote_result['PERCENT'] = $vote_percent;
                    $vote_result['PERCENT_TEXT'] = round($vote_percent, 1);
                    $vote_result['VOTES'] = pretty_number($vote_result['VOTES']);
                    $template->assign_block_vars('announces.survey_votes', $vote_result);
                }
            }
            // Dirty hack
            $template->assign_block_vars('announces.total_votes', array('TOTAL_VOTES' => $total_votes));
        }
    }
}
Example #4
0
/**
*
* This function changes rpg_points for user
* You should ALWAYS use this function and NEVER directly change rpg_points by yourself
* Otherwise refferal system wouldn't work and no logs would be made
* "No logs" means you can never check if the user cheating with DM
*
* @package rpg
*
*/
function rpg_points_change($user_id, $change_type, $dark_matter, $comment = false, $already_changed = false)
{
    global $debug, $config, $dm_change_legit, $user;
    if (!$user_id) {
        return false;
    }
    $dm_change_legit = true;
    $sn_data_dark_matter_db_name = pname_resource_name(RES_DARK_MATTER);
    if ($already_changed) {
        $rows_affected = 1;
    } else {
        $dark_matter_total = $dark_matter > 0 ? $dark_matter : 0;
        db_user_set_by_id($user_id, "`{$sn_data_dark_matter_db_name}` = `{$sn_data_dark_matter_db_name}` + '{$dark_matter}', `dark_matter_total` = `dark_matter_total` + '{$dark_matter_total}'");
        $rows_affected = db_affected_rows();
    }
    if ($rows_affected || !$dark_matter) {
        $page_url = db_escape($_SERVER['SCRIPT_NAME']);
        if (is_array($comment)) {
            $comment = call_user_func_array('sprintf', $comment);
        }
        $comment = db_escape($comment);
        $row = db_user_by_id($user_id, false, 'username');
        $row['username'] = db_escape($row['username']);
        doquery("INSERT INTO {{log_dark_matter}} (`log_dark_matter_username`, `log_dark_matter_reason`,\n        `log_dark_matter_amount`, `log_dark_matter_comment`, `log_dark_matter_page`, `log_dark_matter_sender`)\n      VALUES (\n        '{$row['username']}', {$change_type},\n        {$dark_matter}, '{$comment}', '{$page_url}', {$user_id}\n      );");
        if ($user['id'] == $user_id) {
            $user['dark_matter'] += $dark_matter;
        }
        if ($dark_matter > 0) {
            $old_referral = doquery("SELECT * FROM {{referrals}} WHERE `id` = {$user_id} LIMIT 1 FOR UPDATE;", '', true);
            if ($old_referral['id']) {
                doquery("UPDATE {{referrals}} SET dark_matter = dark_matter + '{$dark_matter}' WHERE `id` = {$user_id} LIMIT 1;");
                $new_referral = doquery("SELECT * FROM {{referrals}} WHERE `id` = {$user_id} LIMIT 1;", '', true);
                $partner_bonus = floor($new_referral['dark_matter'] / $config->rpg_bonus_divisor) - ($old_referral['dark_matter'] >= $config->rpg_bonus_minimum ? floor($old_referral['dark_matter'] / $config->rpg_bonus_divisor) : 0);
                if ($partner_bonus > 0 && $new_referral['dark_matter'] >= $config->rpg_bonus_minimum) {
                    rpg_points_change($new_referral['id_partner'], RPG_REFERRAL, $partner_bonus, "Incoming From Referral ID {$user_id}");
                }
            }
        }
    } else {
        $debug->warning("Error adjusting Dark Matter for player ID {$user_id} (Player Not Found?) with {$dark_matter}. Reason: {$comment}", 'Dark Matter Change', 402);
    }
    $dm_change_legit = false;
    return $rows_affected;
}
function ube_attack_prepare_player(&$combat_data, $player_id, $is_attacker)
{
    global $ube_convert_techs;
    if (!isset($combat_data[UBE_PLAYERS][$player_id])) {
        $combat_data[UBE_PLAYERS][$player_id] = array(UBE_ATTACKER => $is_attacker);
        $player_info =& $combat_data[UBE_PLAYERS][$player_id];
        $player_data = db_user_by_id($player_id, true);
        $player_info[UBE_NAME] = $player_data['username'];
        $player_info[UBE_AUTH_LEVEL] = $player_data['authlevel'];
        $combat_data[UBE_OPTIONS][UBE_COMBAT_ADMIN] = $combat_data[UBE_OPTIONS][UBE_COMBAT_ADMIN] || $player_data['authlevel'];
        // Участвует ли админ в бою?
        $player_info[UBE_PLAYER_DATA] = $player_data;
        $admiral_bonus = mrc_get_level($player_data, false, MRC_ADMIRAL) * get_unit_param(MRC_ADMIRAL, P_BONUS_VALUE) / 100;
        foreach ($ube_convert_techs as $unit_id => $ube_id) {
            $player_info[UBE_BONUSES][$ube_id] += mrc_get_level($player_data, false, $unit_id) * get_unit_param($unit_id, P_BONUS_VALUE) / 100 + $admiral_bonus;
        }
    } else {
        $combat_data[UBE_PLAYERS][$player_id][UBE_ATTACKER] = $combat_data[UBE_PLAYERS][$player_id][UBE_ATTACKER] || $is_attacker;
    }
}
Example #6
0
<?php

define('INSIDE', true);
define('INSTALL', false);
define('IN_ADMIN', true);
require '../common.' . substr(strrchr(__FILE__, '.'), 1);
if ($user['authlevel'] < 3) {
    AdminMessage($lang['adm_err_denied']);
}
lng_include('admin');
$user_id = sys_get_param_id('uid');
if (!($user_row = db_user_by_id($user_id))) {
    AdminMessage(sprintf($lang['adm_dm_user_none'], $user_id));
}
$template = gettemplate('admin/admin_user', true);
if (!empty($user_row['user_last_browser_id'])) {
    $temp = doquery("SELECT browser_user_agent FROM {{security_browser}} WHERE `browser_id` = {$user_row['user_last_browser_id']}", true);
    $user_row['browser_user_agent'] = $temp['browser_user_agent'];
}
$formats = array('sys_time_human_system' => array('register_time', 'onlinetime', 'ally_register_time', 'news_lastread', 'banaday', 'vacation', 'vacation_next', 'deltime', 'que_processed'), 'pretty_number' => array('metal', 'crystal', 'deuterium', 'dark_matter_total', 'metamatter', 'metamatter_total', 'player_rpg_explore_xp', 'player_rpg_explore_level', 'lvl_minier', 'xpminier', 'player_rpg_tech_xp', 'player_rpg_tech_level', 'lvl_raid', 'xpraid', 'raids', 'raidsloose', 'raidswin', 'total_rank', 'total_points'));
foreach ($formats as $callable => $field_list) {
    foreach ($field_list as $field_name) {
        $user_row[$field_name] = call_user_func($callable, $user_row[$field_name]);
    }
}
$template->assign_vars($user_row);
display($template, htmlentities("[{$user_row['id']}] {$user_row['username']}", ENT_QUOTES, 'UTF-8'), false, '', true);
Example #7
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 #8
0
$current_class = sys_get_param_int('message_class');
if (!isset($sn_message_class_list[$current_class])) {
    $current_class = 0;
    $mode = '';
}
switch ($mode) {
    case 'write':
        $error_list = array();
        $template = gettemplate('msg_message_compose', true);
        $recipient_name = sys_get_param_str_unsafe('recipient_name');
        if ($recipient_name) {
            $recipient_row = db_user_by_username($recipient_name);
        }
        if (!$recipient_row) {
            $recipient_id = sys_get_param_id('id');
            $recipient_row = db_user_by_id($recipient_id);
            if (!$recipient_row) {
                $recipient_id = 0;
            }
        }
        if ($recipient_row) {
            $recipient_id = $recipient_row['id'];
            $recipient_name = $recipient_row['username'];
        }
        if ($recipient_id == $user['id']) {
            $error_list[] = array('MESSAGE' => $lang['msg_err_self_send'], 'STATUS' => ERR_ERROR);
        }
        $re = 0;
        $subject = sys_get_param_str('subject');
        while (strpos($subject, $lang['msg_answer_prefix']) !== false) {
            $subject = substr($subject, strlen($lang['msg_answer_prefix']));
Example #9
0
<?php

/**
 * jumpgate.php
 *
 * Jump Gate interface, I presume
 *
 * @version 1.0st Security checks & tests by Gorlum for http://supernova.ws
 * @version 1
 * @copyright 2008 By Chlorel for XNova
 */
include 'common.' . substr(strrchr(__FILE__, '.'), 1);
lng_include('fleet');
if ($TargetPlanet = sys_get_param_id('jmpto')) {
    sn_db_transaction_start();
    db_user_by_id($user['id'], true, 'id');
    $planetrow = db_planet_by_id($planetrow['id'], true);
    if (!($NextJumpTime = uni_get_time_to_jump($planetrow))) {
        $TargetGate = db_planet_by_id($TargetPlanet, true, '`id`, `last_jump_time`');
        if (mrc_get_level($user, $TargetGate, STRUC_MOON_GATE) > 0) {
            $NextDestTime = uni_get_time_to_jump($TargetGate);
            if (!$NextDestTime) {
                // $SubQueryOri = "";
                // $SubQueryDes = "";
                $ship_list = sys_get_param('ships');
                $db_changeset = array();
                foreach ($ship_list as $ship_id => $ship_count) {
                    if (!in_array($ship_id, sn_get_groups('fleet'))) {
                        continue;
                    }
                    $ship_count = max(0, min(floor($ship_count), mrc_get_level($user, $planetrow, $ship_id)));
Example #10
0
/**
* int_banner_create.php
* @version 2.0
* @copyright 2010 Gorlum for http://supernova.ws
*
* heavily based on
*   CreateBanner.php
*   @version 1.2 by Ihor
*   @version 1.0 copyright 2008 By e-Zobar for XNova
*/
function int_banner_create($id, $type = 'userbar', $format = 'png')
{
    // banner.php?id=<userid>&type=<banner|userbar>&format=<png>
    global $config, $lang;
    $id = intval($id);
    switch ($type) {
        case 'banner':
            $img_name = $config->int_banner_background;
            break;
        default:
            $img_name = $config->int_userbar_background;
            break;
    }
    $size = getimagesize(SN_ROOT_PHYSICAL . $img_name);
    $im = imagecreatefrompng(SN_ROOT_PHYSICAL . $img_name);
    $image = imagecreatetruecolor($size[0], $size[1]);
    imagecopy($image, $im, 0, 0, 0, 0, $size[0], $size[1]);
    imagedestroy($im);
    // Colors
    $color = "FFFFFF";
    $red = hexdec(substr($color, 0, 2));
    $green = hexdec(substr($color, 2, 4));
    $blue = hexdec(substr($color, 4, 6));
    $select = imagecolorallocate($image, $red, $green, $blue);
    $txt_shadow = imagecolorallocatealpha($image, 255, 255, 255, 255);
    $txt_color = imagecolorallocatealpha($image, 255, 255, 255, 2);
    $txt_shadow2 = imagecolorallocatealpha($image, 255, 255, 255, 255);
    $txt_color2 = imagecolorallocatealpha($image, 255, 255, 255, 40);
    $fonts = array('userbar' => SN_ROOT_PHYSICAL . "design/fonts/" . $config->int_userbar_font, 'universe' => SN_ROOT_PHYSICAL . "design/fonts/" . $config->int_banner_fontUniverse, 'raids' => SN_ROOT_PHYSICAL . "design/fonts/" . $config->int_banner_fontRaids, 'info' => SN_ROOT_PHYSICAL . "design/fonts/" . $config->int_banner_fontInfo);
    if ($id) {
        // Querys
        $user = db_user_by_id($id);
        $planet_row = db_planet_by_id($user['id_planet']);
        // Variables
        $b_user = $user['username'];
        $b_ally = $user['ally_name'];
        $b_planet = $planet_row['name'];
        $b_xyz = "[" . $planet_row['galaxy'] . ":" . $planet_row['system'] . ":" . $planet_row['planet'] . "]";
        $b_lvl = ($user['total_rank'] ? $user['total_rank'] : $config->users_amount) . "/{$config->users_amount}";
    } else {
        $b_user = $lang['ov_banner_empty_id'];
    }
    $b_univ = $config->game_name;
    switch ($type) {
        case 'banner':
            // Banner size 416 x 58
            $fsize = 15;
            $is = imagettfbbox($fsize, 0, $fonts['universe'], $b_univ);
            imagettftext($image, $fsize, 0, $size[0] - 4 - $is[2], $size[1] - 2, $txt_shadow, $fonts['universe'], $b_univ);
            imagettftext($image, $fsize, 0, $size[0] - 6 - $is[2], $size[1] - 4, $txt_color, $fonts['universe'], $b_univ);
            // Player name
            imagettftext($image, 11, 0, 8, 26, $txt_shadow, $fonts['info'], $b_user);
            imagettftext($image, 11, 0, 6, 23, $txt_color, $fonts['info'], $b_user);
            if ($id) {
                // Player level - right-alligned
                $is = imagettfbbox(11, 0, $fonts['info'], $b_lvl);
                imagettftext($image, 11, 0, $size[0] - 4 - $is[2], 25, $txt_shadow, $fonts['info'], $b_lvl);
                imagettftext($image, 11, 0, $size[0] - 6 - $is[2], 23, $txt_color, $fonts['info'], $b_lvl);
                // Ally name
                $is = imagettfbbox(9, 0, $fonts['info'], $b_ally);
                imagettftext($image, 9, 0, 412 - $is[2], 37, $txt_shadow, $fonts['info'], $b_ally);
                imagettftext($image, 9, 0, 410 - $is[2], 35, $txt_color, $fonts['info'], $b_ally);
                // Player b_planet
                imagettftext($image, 6, 0, 8, 10, $txt_shadow2, $fonts['raids'], $b_planet . " " . $b_xyz);
                imagettftext($image, 6, 0, 6, 9, $txt_color2, $fonts['raids'], $b_planet . " " . $b_xyz);
                //StatPoint
                $b_points = $lang['ov_points'] . ": " . pretty_number($user['total_points']);
                $is = imagettfbbox(8, 0, $fonts['info'], $b_points);
                imagettftext($image, 8, 0, 412 - $is[2], 11, $txt_shadow, $fonts['info'], $b_points);
                imagettftext($image, 8, 0, 410 - $is[2], 9, $txt_color, $fonts['info'], $b_points);
                //Raids Total
                imagettftext($image, 6, 0, 8, 37, $txt_shadow2, $fonts['raids'], $lang['NumberOfRaids']);
                imagettftext($image, 6, 0, 6, 35, $txt_color2, $fonts['raids'], $lang['NumberOfRaids']);
                $b_points = ": " . pretty_number($user['raids']);
                imagettftext($image, 6, 0, 61, 37, $txt_shadow2, $fonts['raids'], $b_points);
                imagettftext($image, 6, 0, 59, 35, $txt_color2, $fonts['raids'], $b_points);
                //Raids Won
                imagettftext($image, 6, 0, 8, 47, $txt_shadow2, $fonts['raids'], $lang['RaidsWin']);
                imagettftext($image, 6, 0, 6, 45, $txt_color2, $fonts['raids'], $lang['RaidsWin']);
                $b_points = ": " . pretty_number($user['raidswin']);
                imagettftext($image, 6, 0, 61, 47, $txt_shadow2, $fonts['raids'], $b_points);
                imagettftext($image, 6, 0, 59, 45, $txt_color2, $fonts['raids'], $b_points);
                //Raids Lost
                imagettftext($image, 6, 0, 8, 57, $txt_shadow2, $fonts['raids'], $lang['RaidsLoose']);
                imagettftext($image, 6, 0, 6, 55, $txt_color2, $fonts['raids'], $lang['RaidsLoose']);
                $b_points = ": " . pretty_number($user['raidsloose']);
                imagettftext($image, 6, 0, 61, 57, $txt_shadow2, $fonts['raids'], $b_points);
                imagettftext($image, 6, 0, 59, 55, $txt_color2, $fonts['raids'], $b_points);
            }
            break;
        default:
            // Userbar 350 x 19
            $b_univ = strtoupper($b_univ);
            $is = imagettfbbox(9, 0, $fonts['userbar'], $b_univ);
            $is = $size[0] - $is[2] - 2;
            imagettftext($image, 9, 0, $is, $size[1] - 3, $txt_shadow, $fonts['userbar'], $b_univ);
            imagettftext($image, 9, 0, $is - 1, $size[1] - 5, $txt_color, $fonts['userbar'], $b_univ);
            imagettftext($image, 22, 0, $is - 8, $size[1], $txt_color, $fonts['userbar'], '/');
            // Player name
            imagettftext($image, 9, 0, 4, $size[1] - 4, $txt_shadow, $fonts['userbar'], $b_user);
            imagettftext($image, 9, 0, 2, $size[1] - 6, $txt_color, $fonts['userbar'], $b_user);
            if ($id) {
                // Player level - right-alligned
                $isp = imagettfbbox(9, 0, $fonts['userbar'], $b_lvl);
                imagettftext($image, 9, 0, $is - $isp[2] - 10, $size[1] - 4, $txt_shadow, $fonts['userbar'], $b_lvl);
                imagettftext($image, 9, 0, $is - $isp[2] - 10 - 1, $size[1] - 4 - 1, $txt_color, $fonts['userbar'], $b_lvl);
            }
    }
    //And now convert it back to PNG-8
    $im_result = imagecreate($size[0], $size[1]);
    imagecopy($im_result, $image, 0, 0, 0, 0, $size[0], $size[1]);
    imagedestroy($image);
    //And save it
    $imagetypes = imagetypes();
    // TODO: Add support to different image types
    header("Content-type: image/png");
    imagepng($im_result);
    imagedestroy($im_result);
}
Example #11
0
/**
 * Получение пароля пользователя по его ID или записи
 *
 * @param int|array $user ID или запись пользователя
 *
 * @return array|bool Массив [password, salt] или FALSE в случае неудачи
 */
function sec_password_get($user)
{
    if (!is_array($user) && ($user = intval($user))) {
        // Это ID
        $user = db_user_by_id($user);
    }
    if (is_array($user) && !empty($user['password'])) {
        return array('password' => $user['password'], 'salt' => $user['salt']);
    } else {
        return false;
    }
}
Example #12
0
/**
 * Выбирает записи игроков по списку их ID
 *
 * @param $user_id_list
 *
 * @return array
 */
function db_user_list_by_id($user_id_list)
{
    !is_array($user_id_list) ? $user_id_list = array($user_id_list) : false;
    $user_list = array();
    foreach ($user_id_list as $user_id_unsafe) {
        $user = db_user_by_id($user_id_unsafe);
        !empty($user) ? $user_list[$user_id_unsafe] = $user : false;
    }
    return $user_list;
}
Example #13
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);
}
/**
 * Copyright (c) 2009-2010 by Gorlum for http://supernova.ws
 *       OpenSource as long as you don't remove this Copyright
 * V3 2009-11-13
 * V2 2009-10-10
 */
function coe_o_missile_calculate()
{
    sn_db_transaction_check(true);
    global $lang;
    $iraks = doquery("SELECT * FROM {{iraks}} WHERE `fleet_end_time` <= " . SN_TIME_NOW . " FOR UPDATE;");
    while ($fleetRow = db_fetch($iraks)) {
        set_time_limit(15);
        $db_changeset = array();
        $targetUser = db_user_by_id($fleetRow['fleet_target_owner'], true);
        $target_planet_row = sys_o_get_updated($targetUser, array('galaxy' => $fleetRow['fleet_end_galaxy'], 'system' => $fleetRow['fleet_end_system'], 'planet' => $fleetRow['fleet_end_planet'], 'planet_type' => PT_PLANET), SN_TIME_NOW);
        $target_planet_row = $target_planet_row['planet'];
        $rowAttacker = db_user_by_id($fleetRow['fleet_owner'], true);
        if ($target_planet_row['id']) {
            $planetDefense = array();
            foreach (sn_get_groups('defense_active') as $unit_id) {
                $planetDefense[$unit_id] = array(mrc_get_level($targetUser, $target_planet_row, $unit_id, true, true));
            }
            $message = '';
            $interceptors = mrc_get_level($targetUser, $target_planet_row, UNIT_DEF_MISSILE_INTERCEPTOR, true, true);
            //$target_planet_row[$interceptor_db_name]; // Number of interceptors
            $missiles = $fleetRow['fleet_amount'];
            // Number of MIP
            if ($interceptors >= $missiles) {
                $message = $lang['mip_all_destroyed'];
                $db_changeset['unit'][] = sn_db_unit_changeset_prepare(UNIT_DEF_MISSILE_INTERCEPTOR, -$missiles, $targetUser, $target_planet_row['id']);
            } else {
                if ($interceptors) {
                    $message = sprintf($lang['mip_destroyed'], $interceptors);
                    $db_changeset['unit'][] = sn_db_unit_changeset_prepare(UNIT_DEF_MISSILE_INTERCEPTOR, -$interceptors, $targetUser, $target_planet_row['id']);
                }
                //        $message .= $lang['mip_defense_destroyed'];
                $attackResult = COE_missileAttack($targetUser, $rowAttacker, $missiles - $interceptors, $planetDefense, $fleetRow['primaer']);
                foreach ($attackResult['structures'] as $key => $structure) {
                    $destroyed = $planetDefense[$key][0] - $structure[0];
                    if ($destroyed) {
                        $db_changeset['unit'][] = sn_db_unit_changeset_prepare($key, -$destroyed, $targetUser, $target_planet_row['id']);
                        $message .= "&nbsp;&nbsp;{$lang['tech'][$key]} - {$destroyed} {$lang['quantity']}<br>";
                    }
                }
                if (!empty($message)) {
                    $message = $lang['mip_defense_destroyed'] . $message . "{$lang['mip_recycled']}{$lang['Metal']}: {$attackResult['metal']}, {$lang['Crystal']}: {$attackResult['crystal']}<br>";
                    db_planet_set_by_id($target_planet_row['id'], "`metal` = `metal` + {$attackResult['metal']}, `crystal` = `crystal` + {$attackResult['crystal']}");
                }
                //        $message .= "{$lang['mip_recycled']}{$lang['Metal']}: {$attackResult['metal']}, {$lang['Crystal']}: {$attackResult['crystal']}<br>";
            }
            db_changeset_apply($db_changeset);
            $fleetRow['fleet_start_type'] = PT_PLANET;
            $sourcePlanet = db_planet_by_vector($fleetRow, 'fleet_start_', false, 'name');
            $message_vorlage = sprintf($lang['mip_body_attack'], $fleetRow['fleet_amount'], addslashes($sourcePlanet['name']), $fleetRow['fleet_start_galaxy'], $fleetRow['fleet_start_system'], $fleetRow['fleet_start_planet'], addslashes($target_planet_row['name']), $fleetRow['fleet_end_galaxy'], $fleetRow['fleet_end_system'], $fleetRow['fleet_end_planet']);
            empty($message) ? $message = $lang['mip_no_defense'] : false;
            // empty($message) && ($message = $lang['mip_no_defense']);
            msg_send_simple_message($fleetRow['fleet_owner'], '', SN_TIME_NOW, MSG_TYPE_SPY, $lang['mip_sender_amd'], $lang['mip_subject_amd'], $message_vorlage . $message);
            msg_send_simple_message($fleetRow['fleet_target_owner'], '', SN_TIME_NOW, MSG_TYPE_SPY, $lang['mip_sender_amd'], $lang['mip_subject_amd'], $message_vorlage . $message);
        }
        doquery("DELETE FROM {{iraks}} WHERE id = '{$fleetRow['id']}';");
    }
}
Example #15
0
<?php

/**
 * adm_flying_fleets.php
 *
 * @copyright 2014 by Gorlum for http://supernova.ws/
 */
define('INSIDE', true);
define('INSTALL', false);
define('IN_ADMIN', true);
require '../common.' . substr(strrchr(__FILE__, '.'), 1);
// if ($user['authlevel'] < 2)
if ($user['authlevel'] < 3) {
    AdminMessage($lang['adm_err_denied']);
}
$template = gettemplate('admin/adm_flying_fleets', true);
$FlyingFleets = db_fleet_list_with_usernames();
while ($CurrentFleet = db_fetch($FlyingFleets)) {
    $FleetOwner = db_user_by_id($CurrentFleet['fleet_owner']);
    $fleet_data = tpl_parse_fleet_db($CurrentFleet, ++$i, $FleetOwner);
    $fleet_data['fleet']['OWNER_NAME'] = htmlentities($FleetOwner['username'], ENT_COMPAT, 'UTF-8');
    $fleet_data['fleet']['TARGET_OWNER_NAME'] = htmlentities($CurrentFleet['username'], ENT_COMPAT, 'UTF-8');
    $fleet_data['fleet']['STAY_TIME_INT'] = $CurrentFleet['fleet_end_stay'];
    $template->assign_block_vars('fleets', $fleet_data['fleet']);
    foreach ($fleet_data['ships'] as $ship_data) {
        $template->assign_block_vars('fleets.ships', $ship_data);
    }
}
display($template, $lang['flt_title'], false, '', true);
Example #16
0
function sn_sys_planet_core_transmute(&$user, &$planetrow)
{
    if (!sys_get_param_str('transmute')) {
        return array();
    }
    global $lang;
    try {
        if ($planetrow['planet_type'] != PT_PLANET) {
            throw new exception($lang['ov_core_err_not_a_planet'], ERR_ERROR);
        }
        if ($planetrow['density_index'] == ($new_density_index = sys_get_param_id('density_type'))) {
            throw new exception($lang['ov_core_err_same_density'], ERR_WARNING);
        }
        sn_db_transaction_start();
        $user = db_user_by_id($user['id'], true, '*');
        $planetrow = db_planet_by_id($planetrow['id'], true, '*');
        //    $global_data = sys_o_get_updated($user, $planetrow['id'], SN_TIME_NOW);
        //    $user = $global_data['user'];
        //    $planetrow = $global_data['planet'];
        $planet_density_index = $planetrow['density_index'];
        $density_price_chart = planet_density_price_chart($planet_density_index);
        if (!isset($density_price_chart[$new_density_index])) {
            // Hack attempt
            throw new exception($lang['ov_core_err_denisty_type_wrong'], ERR_ERROR);
        }
        $user_dark_matter = mrc_get_level($user, false, RES_DARK_MATTER);
        $transmute_cost = get_unit_param(UNIT_PLANET_DENSITY, 'cost');
        $transmute_cost = $transmute_cost[RES_DARK_MATTER] * $density_price_chart[$new_density_index];
        if ($user_dark_matter < $transmute_cost) {
            throw new exception($lang['ov_core_err_no_dark_matter'], ERR_ERROR);
        }
        $sn_data_planet_density = sn_get_groups('planet_density');
        foreach ($sn_data_planet_density as $key => $value) {
            if ($key == $new_density_index) {
                break;
            }
            $prev_density_index = $key;
        }
        $new_density = round(($sn_data_planet_density[$new_density_index][UNIT_PLANET_DENSITY] + $sn_data_planet_density[$prev_density_index][UNIT_PLANET_DENSITY]) / 2);
        rpg_points_change($user['id'], RPG_PLANET_DENSITY_CHANGE, -$transmute_cost, array('Planet %1$s ID %2$d at coordinates %3$s changed density type from %4$d "%5$s" to %6$d "%7$s". New density is %8$d kg/m3', $planetrow['name'], $planetrow['id'], uni_render_coordinates($planetrow), $planet_density_index, $lang['uni_planet_density_types'][$planet_density_index], $new_density_index, $lang['uni_planet_density_types'][$new_density_index], $new_density));
        db_planet_set_by_id($planetrow['id'], "`density` = {$new_density}, `density_index` = {$new_density_index}");
        sn_db_transaction_commit();
        $planetrow['density'] = $new_density;
        $planetrow['density_index'] = $new_density_index;
        $result = array('STATUS' => ERR_NONE, 'MESSAGE' => sprintf($lang['ov_core_err_none'], $lang['uni_planet_density_types'][$planet_density_index], $lang['uni_planet_density_types'][$new_density_index], $new_density));
    } catch (exception $e) {
        sn_db_transaction_rollback();
        $result = array('STATUS' => $e->getCode(), 'MESSAGE' => $e->getMessage());
    }
    return $result;
}
Example #17
0
$config_game_max_planet = $config->game_maxPlanet + 1;
for ($Planet = 1; $Planet < $config_game_max_planet; $Planet++) {
    unset($uni_galaxyRowPlanet);
    unset($uni_galaxyRowMoon);
    unset($uni_galaxyRowUser);
    unset($uni_galaxyRowAlly);
    unset($allyquery);
    $uni_galaxyRowPlanet = $planet_list[$Planet][PT_PLANET];
    $planet_fleet_id = 0;
    if ($uni_galaxyRowPlanet['destruyed']) {
        CheckAbandonPlanetState($uni_galaxyRowPlanet);
    } elseif ($uni_galaxyRowPlanet['id']) {
        if ($cached['users'][$uni_galaxyRowPlanet['id_owner']]) {
            $uni_galaxyRowUser = $cached['users'][$uni_galaxyRowPlanet['id_owner']];
        } else {
            $uni_galaxyRowUser = db_user_by_id($uni_galaxyRowPlanet['id_owner']);
            $cached['users'][$uni_galaxyRowUser['id']] = $uni_galaxyRowUser;
        }
        if (!$uni_galaxyRowUser['id']) {
            $debug->warning("Planet '{$uni_galaxyRowPlanet['name']}' [{$uni_galaxy}:{$uni_system}:{$Planet}] has no owner!", 'Userless planet', 503);
            $uni_galaxyRowPlanet['destruyed'] = SN_TIME_NOW + 60 * 60 * 24;
            $uni_galaxyRowPlanet['id_owner'] = 0;
            db_planet_set_by_id($uni_galaxyRowPlanet['id'], "id_owner = 0, destruyed = {$uni_galaxyRowPlanet['destruyed']}");
        }
        if ($uni_galaxyRowUser['id']) {
            $planetcount++;
            if ($uni_galaxyRowUser['ally_id']) {
                if ($cached['allies'][$uni_galaxyRowUser['ally_id']]) {
                    $allyquery = $cached['allies'][$uni_galaxyRowUser['ally_id']];
                } else {
                    $allyquery = doquery("SELECT * FROM `{{alliance}}` WHERE `id` = '{$uni_galaxyRowUser['ally_id']}';", '', true);
Example #18
0
 protected function get_active_user()
 {
     // Проверяем куку "текущего игрока" из браузера
     if (($_COOKIE[SN_COOKIE_U] = trim($_COOKIE[SN_COOKIE_U])) && !empty($_COOKIE[SN_COOKIE_U]) && is_id($_COOKIE[SN_COOKIE_U]) && (!empty($this->accessible_user_row_list[$_COOKIE[SN_COOKIE_U]]) || $this->auth_level_max_local >= AUTH_LEVEL_ADMINISTRATOR && $this->accessible_user_row_list[$_COOKIE[SN_COOKIE_U]]['authlevel'] < $this->auth_level_max_local)) {
         // Берем текущим юзером юзера с ИД из куки
         //      $this->is_impersonating = empty($this->accessible_user_row_list[$_COOKIE[SN_COOKIE_U]]);
         // self::$user = self::$accessible_user_row_list[$_COOKIE[SN_COOKIE_U]];
         self::$user = db_user_by_id($_COOKIE[SN_COOKIE_U]);
     }
     // В куке нет валидного ИД записи игрока, доступной с текущих аккаунтов
     if (empty(self::$user['id'])) {
         // Берем первого из доступных
         // TODO - default_user
         self::$user = reset($this->accessible_user_row_list);
     }
 }
Example #19
0
<?php

/**
* annonce.php
*
* Announces for trading between players
*
* @version 1.0s - Security checked for SQL-injection by Gorlum for http://supernova.ws
* @version 1.0
* @copyright 2008 by ??????? for XNova
*/
include 'common.' . substr(strrchr(__FILE__, '.'), 1);
$users = db_user_by_id($user['id'], false, '`username`,`galaxy`,`system`');
$action = sys_get_param_int('action');
$GET_id = sys_get_param_int('id');
lng_include('announce');
switch ($action) {
    case 1:
        //on veut poster une annonce
        $page .= '<HTML>
    <center>
    <br>
    <table width="600">
    <td class="c" colspan="10" align="center"><b><font color="white">' . $lang['Classifieds'] . '</font></b></td></tr>
    <form action="annonce.php?action=2" method="post">
    <td class="c" colspan="10" align="center"><b>' . $lang['Resources_to_be_sold'] . '</font></b></td>
    <tr><th colspan="5">' . $lang['metal'] . '</th><th colspan="5"><input type="texte" value="0" name="metalvendre" /></th></tr>
    <tr><th colspan="5">' . $lang['crystal'] . '</th><th colspan="5"><input type="texte" value="0" name="cristalvendre" /></th></tr>
    <tr><th colspan="5">' . $lang['deuterium'] . '</th><th colspan="5"><input type="texte" value="0" name="deutvendre" /></th></tr>

    <td class="c" colspan="10" align="center"><b>' . $lang['Desired_resources'] . '</font></b></td></tr>
Example #20
0
function flt_register_fleet_event($fleet, $ov_label, $planet_end_type)
{
    global $user, $planetrow, $fleet_number;
    switch ($fleet['ov_label'] = $ov_label) {
        case 0:
            $fleet['event_time'] = $fleet['fleet_start_time'];
            $is_this_planet = ($planetrow['galaxy'] == $fleet['fleet_end_galaxy'] and $planetrow['system'] == $fleet['fleet_end_system'] and $planetrow['planet'] == $fleet['fleet_end_planet'] and $planetrow['planet_type'] == $planet_end_type);
            break;
        case 1:
            $fleet['event_time'] = $fleet['fleet_end_stay'];
            $is_this_planet = ($planetrow['galaxy'] == $fleet['fleet_end_galaxy'] and $planetrow['system'] == $fleet['fleet_end_system'] and $planetrow['planet'] == $fleet['fleet_end_planet'] and $planetrow['planet_type'] == $planet_end_type);
            break;
        case 2:
        case 3:
            $fleet['event_time'] = $fleet['fleet_end_time'];
            $is_this_planet = ($planetrow['galaxy'] == $fleet['fleet_start_galaxy'] and $planetrow['system'] == $fleet['fleet_start_system'] and $planetrow['planet'] == $fleet['fleet_start_planet'] and $planetrow['planet_type'] == $fleet['fleet_start_type']);
            break;
    }
    $fleet['ov_this_planet'] = $is_this_planet;
    // || $planet_scanned != false;
    if ($fleet['fleet_owner'] == $user['id']) {
        $user_data = $user;
    } else {
        $user_data = db_user_by_id($fleet['fleet_owner']);
    }
    return tpl_parse_fleet_db($fleet, ++$fleet_number, $user_data);
}
Example #21
0
                 doquery("DELETE FROM {{buddy}} WHERE `BUDDY_ID` = {$buddy_id} LIMIT 1;");
                 sn_db_transaction_commit();
                 throw new exception('buddy_err_delete_own', ERR_NONE);
             } elseif ($buddy_row['BUDDY_STATUS'] == BUDDY_REQUEST_WAITING) {
                 msg_send_simple_message($buddy_row['BUDDY_SENDER_ID'], $user['id'], SN_TIME_NOW, MSG_TYPE_PLAYER, $user['username'], $lang['buddy_msg_deny_title'], sprintf($lang['buddy_msg_deny_text'], $user['username']));
                 doquery("UPDATE {{buddy}} SET `BUDDY_STATUS` = " . BUDDY_REQUEST_DENIED . " WHERE `BUDDY_ID` = {$buddy_id} LIMIT 1;");
                 sn_db_transaction_commit();
                 throw new exception('buddy_err_deny_none', ERR_NONE);
             }
             break;
     }
 }
 // New request?
 // Checking for user ID - in case if it was request from outside buddy system
 if ($new_friend_id = sys_get_param_id('request_user_id')) {
     $new_friend_row = db_user_by_id($new_friend_id, true, '`id`, `username`');
 } elseif ($new_friend_name = sys_get_param_str_unsafe('request_user_name')) {
     $new_friend_row = db_user_by_username($new_friend_name, true, '`id`, `username`');
     $new_friend_name = db_escape($new_friend_name);
 }
 if ($new_friend_row['id'] == $user['id']) {
     unset($new_friend_row);
     throw new exception('buddy_err_adding_self', ERR_ERROR);
 }
 // Checking for user name & request text - in case if it was request to adding new request
 if (isset($new_friend_row['id']) && ($new_request_text = sys_get_param_str('request_text'))) {
     $check_relation = doquery("SELECT `BUDDY_ID` FROM {{buddy}} WHERE\n      (`BUDDY_SENDER_ID` = {$user['id']} AND `BUDDY_OWNER_ID` = {$new_friend_row['id']})\n      OR\n      (`BUDDY_SENDER_ID` = {$new_friend_row['id']} AND `BUDDY_OWNER_ID` = {$user['id']})\n      LIMIT 1 FOR UPDATE;", true);
     if (isset($check_relation['BUDDY_ID'])) {
         throw new exception('buddy_err_adding_exists', ERR_WARNING);
     }
     msg_send_simple_message($new_friend_row['id'], $user['id'], SN_TIME_NOW, MSG_TYPE_PLAYER, $user['username'], $lang['buddy_msg_adding_title'], sprintf($lang['buddy_msg_adding_text'], $user['username']));
Example #22
0
function uni_create_planet($Galaxy, $System, $Position, $PlanetOwnerID, $planet_name_unsafe = '', $HomeWorld = false, $options = array())
{
    global $lang, $config;
    /*
     Типы планет по плотности (г/см^3) - добыча при средней температуре:
    1. <2 - Лёд (метановый, водный, водородный итд) + Газ (местами водород). Металл 0 Кристалл -- Дейтерий++
    2. 2-3.5 Силикат (кремний) + Водяной лёд + Газ (водород, метан). Метал --. Кристалл норма. Дейтерий +
    3. 3.5-5 - Камень. Металл - Кристалл+ Дейтерий норма
    4. 5-6 - Руда. Металл норма. Кристалл норма. Дейтерий норма
    5. 6-7 - Металл. Металл +. Кристалл -. Дейтерий -
    6. >7 - тяжелый металл. Металл ++ Кристалл -- Дейтерий --
    
    sn_rand_gauss_range($range_start, $range_end, $round = true, $strict = 4)
    
    1-2-3 0..100
    4-5-6 -25..75
    7-8-9 -50..50
    10-11-12 -75..25
    13-14-15 -100..10
    16+ -120..10
    
    
    Типы планеты по средней температуре:
    1. Замороженная - меньше -183 градусов Цельсия. Метановый лёд
    2. Холодная - от -183 до -161 градусов. Жидкий метан, водный лёд
    3. Ледяная - от -161 до -20. Газообразный метан, водный лёд
    4. Земного типа - от -20 до +40 градусов
    5. Горячая - от +40 до +80 градусов
    6. Инферно - выше +80 градусов
    */
    /*
    $density = array(0,0,0,0,0,0,0,);
    
    for($i = 0;$i<10000;$i++)
    {
      $q = sn_rand_gauss_range(850, 9250, true, 3);
      if($q < 2000)
      {
        $density[0]++;
      }
      elseif($q < 3250)
      {
        $density[1]++;
      }
      elseif($q < 4500)
      {
        $density[2]++;
      }
      elseif($q < 5750)
      {
        $density[3]++;
      }
      elseif($q < 7000)
      {
        $density[4]++;
      }
      elseif($q < 8250)
      {
        $density[5]++;
      }
      else
      {
        $density[6]++;
      }
    //  pdump($q);
    }
    
    foreach($density as $key => $value)
    {
      echo $key,' ', $value, ' ',  str_repeat('*', $value/30), '<br />';
    0. 0.75-2 - Лёд (метановый, водный, водородный итд) + Газ (местами водород).    Металл  25%  Кристалл  25%  Дейтерий 175%  225%+
    1. 2-3.25 Силикат (кремний) + Водяной лёд + Газ (водород, метан).               Метал   25%  Кристалл 150%  Дейтерий  75%  250%+
    2. 3.25-4.5 - Камень.                                                           Металл  50%  Кристалл 125%  Дейтерий 100%  275%+
    3. 4.5-5.75 - Стандарт                                                          Металл 100%. Кристалл 100%  Дейтерий 100%  300%+
    4. 5.25-6.50 - Руда                                                             Металл 125%  Кристалл  50%  Дейтерий 100%  275%+
    5  6.50-7.75   Металл                                                           Металл 150%  Кристалл  25%  Дейтерий  75%  250%+
    6. >7.75-9 - тяжелый металл.                                                    Металл 175%  Кристалл  25%  Дейтерий  25%  225%+
    
    Лёд
    Силикат
    Камень
    Стандарт
    Руда
    Металл
    Тяжмет
    
    
    }
    
    /*
    */
    /*
    $planet_density = array(
      2000 => array(RES_METAL => 0.25, RES_CRYSTAL => 0.25, RES_DEUTERIUM => 1.75),
      3250 => array(RES_METAL => 0.25, RES_CRYSTAL => 1.50, RES_DEUTERIUM => 0.75),
      4500 => array(RES_METAL => 0.50, RES_CRYSTAL => 1.25, RES_DEUTERIUM => 1.00),
      5750 => array(RES_METAL => 1.00, RES_CRYSTAL => 1.00, RES_DEUTERIUM => 1.00),
      7000 => array(RES_METAL => 1.25, RES_CRYSTAL => 0.50, RES_DEUTERIUM => 1.00),
      8250 => array(RES_METAL => 1.50, RES_CRYSTAL => 0.25, RES_DEUTERIUM => 0.75),
      9250 => array(RES_METAL => 1.75, RES_CRYSTAL => 0.25, RES_DEUTERIUM => 0.25),
    );
    $planet_density = array(
       850 => array(RES_METAL => 0.10, RES_CRYSTAL => 0.10, RES_DEUTERIUM => 1.30),
      2000 => array(RES_METAL => 0.30, RES_CRYSTAL => 0.20, RES_DEUTERIUM => 1.20),  // Лёд
      3250 => array(RES_METAL => 0.40, RES_CRYSTAL => 1.40, RES_DEUTERIUM => 0.90),  // Силикат
      4500 => array(RES_METAL => 0.80, RES_CRYSTAL => 1.25, RES_DEUTERIUM => 0.80),  // Камень
      5750 => array(RES_METAL => 1.00, RES_CRYSTAL => 1.00, RES_DEUTERIUM => 1.00),  // Норма
      7000 => array(RES_METAL => 2.00, RES_CRYSTAL => 0.75, RES_DEUTERIUM => 0.75),  // Руда
      8250 => array(RES_METAL => 3.00, RES_CRYSTAL => 0.50, RES_DEUTERIUM => 0.50),  // Металл
      9250 => array(RES_METAL => 4.00, RES_CRYSTAL => 0.25, RES_DEUTERIUM => 0.25),  // Тяжмет
    );
    */
    $planet_density = sn_get_groups('planet_density');
    $density_min = reset($planet_density);
    $density_min = $density_min[UNIT_PLANET_DENSITY];
    $density_max = end($planet_density);
    $density_max = $density_max[UNIT_PLANET_DENSITY];
    $density = sn_rand_gauss_range($density_min, $density_max, true, 3);
    // Avant tout, on verifie s'il existe deja une planete a cet endroit
    $PlanetExist = db_planet_by_gspt($Galaxy, $System, $Position, PT_PLANET, true, '`id`');
    // Si $PlanetExist est autre chose que false ... c'est qu'il y a quelque chose la bas ...
    // C'est donc aussi que je ne peux pas m'y poser !!
    if (!$PlanetExist) {
        $planet = PlanetSizeRandomiser($Position, $HomeWorld);
        $planet['diameter'] = ($planet['field_max'] ^ 14 / 1.5) * 75;
        $planet['metal'] = BUILD_METAL;
        $planet['crystal'] = BUILD_CRISTAL;
        $planet['deuterium'] = BUILD_DEUTERIUM;
        $planet['metal_max'] = BASE_STORAGE_SIZE;
        $planet['crystal_max'] = BASE_STORAGE_SIZE;
        $planet['deuterium_max'] = BASE_STORAGE_SIZE;
        // Posistion  1 -  3: 80% entre  40 et  70 Cases (  55+ / -15 )
        // Posistion  4 -  6: 80% entre 120 et 310 Cases ( 215+ / -95 )
        // Posistion  7 -  9: 80% entre 105 et 195 Cases ( 150+ / -45 )
        // Posistion 10 - 12: 80% entre  75 et 125 Cases ( 100+ / -25 )
        // Posistion 13 - 15: 80% entre  60 et 190 Cases ( 125+ / -65 )
        $planet['galaxy'] = $Galaxy;
        $planet['system'] = $System;
        $planet['planet'] = $Position;
        if ($Position == 1 || $Position == 2 || $Position == 3) {
            $PlanetType = array('trocken');
            $PlanetClass = array('planet');
            //      $PlanetDesign       = array('01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20');
            $PlanetDesign = array('01', '02', '03', '04', '05', '06', '07', '08', '09', '10');
            $planet['temp_min'] = rand(0, 100);
            $planet['temp_max'] = $planet['temp_min'] + 40;
        } elseif ($Position == 4 || $Position == 5 || $Position == 6) {
            $PlanetType = array('dschjungel');
            $PlanetClass = array('planet');
            //      $PlanetDesign       = array('01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20');
            $PlanetDesign = array('01', '02', '03', '04', '05', '06', '07', '08', '09', '10');
            $planet['temp_min'] = rand(-25, 75);
            $planet['temp_max'] = $planet['temp_min'] + 40;
        } elseif ($Position == 7 || $Position == 8 || $Position == 9) {
            $PlanetType = array('normaltemp');
            $PlanetClass = array('planet');
            //      $PlanetDesign       = array('01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20');
            $PlanetDesign = array('01', '02', '03', '04', '05', '06', '07');
            $planet['temp_min'] = rand(-50, 50);
            $planet['temp_max'] = $planet['temp_min'] + 40;
        } elseif ($Position == 10 || $Position == 11 || $Position == 12) {
            $PlanetType = array('wasser');
            $PlanetClass = array('planet');
            //      $PlanetDesign       = array('01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20');
            $PlanetDesign = array('01', '02', '03', '04', '05', '06', '07', '08', '09');
            $planet['temp_min'] = rand(-75, 25);
            $planet['temp_max'] = $planet['temp_min'] + 40;
        } elseif ($Position == 13 || $Position == 14 || $Position == 15) {
            $PlanetType = array('eis');
            $PlanetClass = array('planet');
            //      $PlanetDesign       = array('01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20');
            $PlanetDesign = array('01', '02', '03', '04', '05', '06', '07', '08', '09', '10');
            $planet['temp_min'] = rand(-100, 10);
            $planet['temp_max'] = $planet['temp_min'] + 40;
        } else {
            $PlanetType = array('dschjungel', 'gas', 'normaltemp', 'trocken', 'wasser', 'wuesten', 'eis');
            $PlanetClass = array('planet');
            $PlanetDesign = array('01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '00');
            $planet['temp_min'] = rand(-140, 10);
            $planet['temp_max'] = $planet['temp_min'] + 40;
        }
        if ($HomeWorld) {
            $planet['temp_min'] = 0;
            $planet['temp_max'] = $planet['temp_min'] + 40;
            $planet['density'] = 5500;
        } else {
            $planet['density'] = $density;
        }
        foreach ($planet_density as $planet['density_index'] => $value) {
            if ($planet['density'] < $value[UNIT_PLANET_DENSITY]) {
                break;
            }
        }
        $density_info_resources =& $planet_density[$planet['density_index']][UNIT_RESOURCES];
        $planet['metal_perhour'] = $config->metal_basic_income * $density_info_resources[RES_METAL];
        $planet['crystal_perhour'] = $config->crystal_basic_income * $density_info_resources[RES_CRYSTAL];
        $planet['deuterium_perhour'] = $config->deuterium_basic_income * $density_info_resources[RES_DEUTERIUM];
        if (isset($options['image']) && $options['image']) {
            $planet['image'] = $options['image'];
        } else {
            $planet['image'] = $PlanetType[rand(0, count($PlanetType) - 1)];
            $planet['image'] .= $PlanetClass[rand(0, count($PlanetClass) - 1)];
            $planet['image'] .= $PlanetDesign[rand(0, count($PlanetDesign) - 1)];
        }
        $planet['planet_type'] = 1;
        $planet['id_owner'] = $PlanetOwnerID;
        $planet['last_update'] = time();
        $planet['name'] = $planet_name_unsafe ? $planet_name_unsafe : $lang['sys_colo_defaultname'];
        if (!$HomeWorld) {
            $OwnerName = db_user_by_id($PlanetOwnerID, false, 'username');
            $planet['name'] = "{$OwnerName['username']} {$planet['name']}";
        }
        $planet['name'] = db_escape(strip_tags(trim($planet['name'])));
        $RetValue = classSupernova::db_ins_record(LOC_PLANET, "`name` = '{$planet['name']}', `id_owner` = '{$planet['id_owner']}', `last_update` = '{$planet['last_update']}', `image` = '{$planet['image']}',\n      `galaxy` = '{$planet['galaxy']}', `system` = '{$planet['system']}', `planet` = '{$planet['planet']}', `planet_type` = '{$planet['planet_type']}',\n      `diameter` = '{$planet['diameter']}', `field_max` = '{$planet['field_max']}', `density` = '{$planet['density']}', `density_index` = '{$planet['density_index']}',\n      `temp_min` = '{$planet['temp_min']}', `temp_max` = '{$planet['temp_max']}',\n      `metal` = '{$planet['metal']}', `metal_perhour` = '{$planet['metal_perhour']}', `metal_max` = '{$planet['metal_max']}',\n      `crystal` = '{$planet['crystal']}', `crystal_perhour` = '{$planet['crystal_perhour']}', `crystal_max` = '{$planet['crystal_max']}',\n      `deuterium` = '{$planet['deuterium']}', `deuterium_perhour` = '{$planet['deuterium_perhour']}', `deuterium_max` = '{$planet['deuterium_max']}'");
        // $RetValue = db_insert_id();
        $RetValue = is_array($RetValue) ? $RetValue['id'] : false;
    } else {
        $RetValue = false;
    }
    return $RetValue;
}
function flt_flying_fleet_handler($skip_fleet_update = false)
{
    /*
    [*] Нужно ли заворачивать ВСЕ в одну транзакцию?
          С одной стороны - да, что бы данные были гарантированно на момент снапшота
          С другой стороны - нет, потому что при большой активности это все будет блокировать слишком много рядов, да и таймаут будет большой для ожидания всего разлоченного
          Стоит завернуть каждую миссию отдельно? Это сильно увеличит количество запросов, зато так же сильно снизит количество блокировок.
        Resume: НЕТ! Надо оставить все в одной транзакции! Так можно будет поддерживать consistency кэша. Там буквально сантисекунды блокировки
    [*] Убрать кэшированние данных о пользователях и планета. Офигенно освободит память - проследить!
          НЕТ! Считать, скольким флотам нужна будет инфа и кэшировать только то, что используется больше раза!
          Заодно можно будет исключить перересчет очередей/ресурсов - сильно ускорит дело!
          Особенно будет актуально, когда все бонусы будут в одной таблице
          Ну и никто не заставляет как сейчас брать ВСЕ из таблицы - только по полям. Гемор, но не сильный - сделать запрос по группам sn_data
          И писать в БД только один раз результат
    [*] Нужно ли на этом этапе знать полную информацию о флотах?
          Заблокировать флоты можно и неполным запросом. Блокировка флотов - это не страшно. Ну, не пройдет одна-две отмены - так никто и не гарантировал реалтайма!
          С одной стороны - да, уменьшит количество запросов
          С другой стооны - расход памяти
          Все равно надо будет знать полную инфу о флоте в момент обработки
    [*] Сделать тестовую БД для расчетов
    [*] Но не раньше, чем переписать все миссии
    */
    global $config, $debug;
    if ($config->game_disable != GAME_DISABLE_NONE || $skip_fleet_update) {
        return;
    }
    sn_db_transaction_start();
    if ($config->db_loadItem('game_disable') != GAME_DISABLE_NONE || SN_TIME_NOW - strtotime($config->db_loadItem('fleet_update_last')) <= $config->fleet_update_interval) {
        sn_db_transaction_rollback();
        return;
    }
    // Watchdog timer
    if ($config->db_loadItem('fleet_update_lock')) {
        if (SN_TIME_NOW - strtotime($config->fleet_update_lock) <= mt_rand(240, 300)) {
            sn_db_transaction_rollback();
            return;
        } else {
            $debug->warning('Flying fleet handler was locked too long - watchdog unlocked', 'FFH Error', 504);
        }
    }
    $config->db_saveItem('fleet_update_lock', SN_TIME_SQL);
    $config->db_saveItem('fleet_update_last', SN_TIME_SQL);
    sn_db_transaction_commit();
    //log_file('Начинаем обсчёт флотов');
    //log_file('Обсчёт ракет');
    sn_db_transaction_start();
    coe_o_missile_calculate();
    sn_db_transaction_commit();
    $fleet_list = array();
    $fleet_event_list = array();
    $missions_used = array();
    sn_db_transaction_start();
    //log_file('Запрос на флоты');
    $_fleets = doquery("SELECT * FROM `{{fleets}}` WHERE\n    (`fleet_start_time` <= " . SN_TIME_NOW . " AND `fleet_mess` = 0)\n    OR (`fleet_end_stay` <= " . SN_TIME_NOW . " AND fleet_end_stay > 0 AND `fleet_mess` = 0)\n    OR (`fleet_end_time` <= " . SN_TIME_NOW . ")\n  FOR UPDATE;");
    //log_file('Выборка флотов');
    while ($fleet_row = db_fetch($_fleets)) {
        set_time_limit(15);
        // Унифицировать код с темплейтным разбором эвентов на планете!
        $fleet_list[$fleet_row['fleet_id']] = $fleet_row;
        $missions_used[$fleet_row['fleet_mission']] = 1;
        if ($fleet_row['fleet_start_time'] <= SN_TIME_NOW && $fleet_row['fleet_mess'] == 0) {
            $fleet_event_list[] = array('fleet_row' => &$fleet_list[$fleet_row['fleet_id']], 'fleet_time' => $fleet_list[$fleet_row['fleet_id']]['fleet_start_time'], 'fleet_event' => EVENT_FLT_ARRIVE);
        }
        if ($fleet_row['fleet_end_stay'] > 0 && $fleet_row['fleet_end_stay'] <= SN_TIME_NOW && $fleet_row['fleet_mess'] == 0) {
            $fleet_event_list[] = array('fleet_row' => &$fleet_list[$fleet_row['fleet_id']], 'fleet_time' => $fleet_list[$fleet_row['fleet_id']]['fleet_end_stay'], 'fleet_event' => EVENT_FLT_ACOMPLISH);
        }
        if ($fleet_row['fleet_end_time'] <= SN_TIME_NOW) {
            $fleet_event_list[] = array('fleet_row' => &$fleet_list[$fleet_row['fleet_id']], 'fleet_time' => $fleet_list[$fleet_row['fleet_id']]['fleet_end_time'], 'fleet_event' => EVENT_FLT_RETURN);
        }
    }
    sn_db_transaction_commit();
    //log_file('Сортировка и подгрузка модулей');
    uasort($fleet_event_list, 'flt_flyingFleetsSort');
    unset($_fleets);
    // TODO: Грузить только используемые модули из $missions_used
    $mission_files = array(MT_ATTACK => 'flt_mission_attack', MT_AKS => 'flt_mission_attack', MT_DESTROY => 'flt_mission_attack', MT_TRANSPORT => 'flt_mission_transport', MT_RELOCATE => 'flt_mission_relocate', MT_HOLD => 'flt_mission_hold', MT_SPY => 'flt_mission_spy', MT_COLONIZE => 'flt_mission_colonize', MT_RECYCLE => 'flt_mission_recycle', MT_EXPLORE => 'flt_mission_explore');
    foreach ($missions_used as $mission_id => $cork) {
        require_once SN_ROOT_PHYSICAL . "includes/includes/{$mission_files[$mission_id]}" . DOT_PHP_EX;
    }
    //log_file('Обработка миссий');
    $sn_groups_mission = sn_get_groups('missions');
    foreach ($fleet_event_list as $fleet_event) {
        // TODO: Указатель тут потом сделать
        // TODO: СЕЙЧАС НАДО ПРОВЕРЯТЬ ПО БАЗЕ - А ЖИВОЙ ЛИ ФЛОТ?!
        $fleet_row = $fleet_event['fleet_row'];
        if (!$fleet_row) {
            // Fleet was destroyed in course of previous actions
            continue;
        }
        //log_file('Миссия');
        // TODO Обернуть всё в транзакции. Начинать надо заранее, блокируя все таблицы внутренним локом SELECT 1 FROM {{users}}
        sn_db_transaction_start();
        $config->db_saveItem('fleet_update_last', SN_TIME_SQL);
        $mission_data = $sn_groups_mission[$fleet_row['fleet_mission']];
        // Формируем запрос, блокирующий сразу все нужные записи
        db_flying_fleet_lock($mission_data, $fleet_row);
        $fleet_row = doquery("SELECT * FROM {{fleets}} WHERE fleet_id = {$fleet_row['fleet_id']} FOR UPDATE", true);
        if (!$fleet_row || empty($fleet_row)) {
            // Fleet was destroyed in course of previous actions
            sn_db_transaction_commit();
            continue;
        }
        if ($fleet_event['fleet_event'] == EVENT_FLT_RETURN) {
            // Fleet returns to planet
            RestoreFleetToPlanet($fleet_row, true, false, true);
            sn_db_transaction_commit();
            continue;
        }
        if ($fleet_event['fleet_event'] == EVENT_FLT_ARRIVE && $fleet_row['fleet_mess'] != 0) {
            // При событии EVENT_FLT_ARRIVE флот всегда должен иметь fleet_mess == 0
            // В противном случае это означает, что флот уже был обработан ранее - например, при САБе
            sn_db_transaction_commit();
            continue;
        }
        // TODO: Здесь тоже указатели
        // TODO: Кэширование
        // TODO: Выбирать только нужные поля
        // шпионаж не дает нормальный ID fleet_end_planet_id 'dst_planet'
        $mission_data = array('fleet' => &$fleet_row, 'dst_user' => $mission_data['dst_user'] || $mission_data['dst_planet'] ? db_user_by_id($fleet_row['fleet_target_owner'], true) : null, 'dst_planet' => $mission_data['dst_planet'] ? db_planet_by_vector($fleet_row, 'fleet_end_', true, '`id`, `id_owner`, `name`') : null, 'src_user' => $mission_data['src_user'] || $mission_data['src_planet'] ? db_user_by_id($fleet_row['fleet_owner'], true) : null, 'src_planet' => $mission_data['src_planet'] ? db_planet_by_vector($fleet_row, 'fleet_start_', true, '`id`, `id_owner`, `name`') : null, 'fleet_event' => $fleet_event['fleet_event']);
        if ($mission_data['dst_planet']) {
            // $mission_data['dst_planet'] = sys_o_get_updated($mission_data['dst_user'], $mission_data['dst_planet']['id'], $fleet_row['fleet_start_time']);
            if ($mission_data['dst_planet']['id_owner']) {
                $mission_data['dst_planet'] = sys_o_get_updated($mission_data['dst_planet']['id_owner'], $mission_data['dst_planet']['id'], $fleet_row['fleet_start_time']);
            }
            $mission_data['dst_user'] = $mission_data['dst_user'] ? $mission_data['dst_planet']['user'] : null;
            $mission_data['dst_planet'] = $mission_data['dst_planet']['planet'];
        }
        switch ($fleet_row['fleet_mission']) {
            // Для боевых атак нужно обновлять по САБу и по холду - таки надо возвращать данные из обработчика миссий!
            case MT_AKS:
            case MT_ATTACK:
            case MT_DESTROY:
                $attack_result = flt_mission_attack($mission_data);
                $mission_result = CACHE_COMBAT;
                break;
                /*
                case MT_DESTROY:
                  $attack_result = flt_mission_destroy($mission_data);
                  $mission_result = CACHE_COMBAT;
                break;
                */
            /*
            case MT_DESTROY:
              $attack_result = flt_mission_destroy($mission_data);
              $mission_result = CACHE_COMBAT;
            break;
            */
            case MT_TRANSPORT:
                $mission_result = flt_mission_transport($mission_data);
                break;
            case MT_HOLD:
                $mission_result = flt_mission_hold($mission_data);
                break;
            case MT_RELOCATE:
                $mission_result = flt_mission_relocate($mission_data);
                break;
            case MT_EXPLORE:
                $mission_result = flt_mission_explore($mission_data);
                break;
            case MT_RECYCLE:
                $mission_result = flt_mission_recycle($mission_data);
                break;
            case MT_COLONIZE:
                $mission_result = flt_mission_colonize($mission_data);
                break;
            case MT_SPY:
                $mission_result = flt_mission_spy($mission_data);
                break;
            case MT_MISSILE:
                // Missiles !!
                break;
                //      default:
                //        doquery("DELETE FROM `{{fleets}}` WHERE `fleet_id` = '{$fleet_row['fleet_id']}' LIMIT 1;");
                //      break;
        }
        sn_db_transaction_commit();
    }
    sn_db_transaction_start();
    $config->db_saveItem('fleet_update_last', SN_TIME_SQL);
    $config->db_saveItem('fleet_update_lock', '');
    sn_db_transaction_commit();
    //  log_file('Закончили обсчёт флотов');
}
Example #24
0
function sn_imperator_view($template = null)
{
    global $template_result, $config, $lang, $user;
    $stat_fields = array('stat_date' => 'STAT_DATE', 'total_rank' => 'TOTAL_RANK', 'total_points' => 'TOTAL_POINTS', 'tech_rank' => 'TECH_RANK', 'tech_points' => 'TECH_POINTS', 'build_rank' => 'BUILD_RANK', 'build_points' => 'BUILD_POINTS', 'defs_rank' => 'DEFS_RANK', 'defs_points' => 'DEFS_POINTS', 'fleet_rank' => 'FLEET_RANK', 'fleet_points' => 'FLEET_POINTS', 'res_rank' => 'RES_RANK', 'res_points' => 'RES_POINTS');
    $user_id = sys_get_param_id('int_user_id', $user['id']);
    $user_data = ($same_user = $user_id == $user['id']) ? $user : db_user_by_id($user_id);
    //  if($user_id == $user['id']) {
    //    $user_data = &$user;
    //    $same_user = true;
    //  } else {
    //    $user_data = db_user_by_id($user_id);
    //    $same_user = false;
    //  }
    if (!$user_data) {
        message($lang['imp_imperator_none'], $lang['sys_error'], 'index.php', 10);
        die;
    }
    $template = gettemplate('imperator', $template);
    $StatRecord = doquery("SELECT * FROM {{statpoints}} WHERE `stat_type` = 1 AND `stat_code` = 1 AND `id_owner` = {$user_id};", true);
    $stat_array = array();
    $query = doquery("SELECT * FROM {{statpoints}} WHERE `stat_type` = 1 AND `id_owner` = {$user_id} ORDER BY `stat_code` DESC;");
    global $link;
    $stat_count = db_affected_rows($link);
    while ($row = db_fetch($query)) {
        foreach ($stat_fields as $field_db_name => $field_template_name) {
            // $stat_count - $row['stat_code'] - для реверсирования ID статы в JS
            $stat_array[$field_template_name]['DATA'][$stat_count - $row['stat_code']] = $row[$field_db_name];
        }
    }
    $stat_array_date = $stat_array['STAT_DATE'];
    foreach ($stat_array_date['DATA'] as $key => $value) {
        $template->assign_block_vars('stat_date', array('ID' => $key, 'VALUE' => $value, 'TEXT' => date(FMT_DATE_TIME, $value)));
    }
    // $stat_count = count($stat_array_date['DATA']);
    // pdump($stat_array_date);
    unset($stat_array['STAT_DATE']);
    $template_data = array();
    foreach ($stat_array as $stat_type => &$stat_type_data) {
        $reverse_min_max = strpos($stat_type, '_RANK') !== false;
        $stat_type_data['MIN'] = $reverse_min_max ? max($stat_type_data['DATA']) : min($stat_type_data['DATA']);
        $stat_type_data['MAX'] = $reverse_min_max ? min($stat_type_data['DATA']) : max($stat_type_data['DATA']);
        $stat_type_data['AVG'] = average($stat_type_data['DATA']);
        foreach ($stat_type_data['DATA'] as $key => $value) {
            // $stat_type_data['PERCENT'][$key] = $stat_type_data['MAX'] - $value ? ($stat_type_data['MAX'] - $stat_type_data['MIN']) / ($stat_type_data['MAX'] - $value) : 100;
            $stat_type_data['PERCENT'][$key] = ($stat_type_data['MAX'] - $value ? ($value - $stat_type_data['MIN']) / ($stat_type_data['MAX'] - $stat_type_data['MIN']) : 1) * 100;
            $template_data[$stat_type][$key]['ID'] = $key;
            $template_data[$stat_type][$key]['VALUE'] = $value;
            $template_data[$stat_type][$key]['DELTA'] = $reverse_min_max ? $stat_type_data['MIN'] - $value : $value - $stat_type_data['MAX'];
            $template_data[$stat_type][$key]['PERCENT'] = $stat_type_data['PERCENT'][$key];
            //$template_data[$stat_type][$key]['PERCENT'] = $key ? $stat_type_data['PERCENT'][$key] : 50; // TODO DEBUG
        }
    }
    // pdump($stat_array['RES_POINTS']);
    foreach ($template_data as $stat_type => $stat_type_data) {
        $template->assign_block_vars('stat', array('TYPE' => $stat_type, 'TEXT' => $lang['imp_stat_types'][$stat_type], 'MIN' => $stat_array[$stat_type]['MIN'], 'MAX' => $stat_array[$stat_type]['MAX'], 'AVG' => $stat_array[$stat_type]['AVG']));
        foreach ($stat_type_data as $stat_entry) {
            $template->assign_block_vars('stat.entry', $stat_entry);
        }
    }
    // pdump($template_data);
    if ($same_user) {
        rpg_level_up($user, RPG_STRUCTURE);
        rpg_level_up($user, RPG_RAID);
        rpg_level_up($user, RPG_TECH);
        rpg_level_up($user, RPG_EXPLORE);
        /*
        // -----------------------------------------------------------------------------------------------
        // News Frame ...
        if ($config->game_news_overview)
        {
          nws_render($template, "WHERE UNIX_TIMESTAMP(`tsTimeStamp`)<=" . SN_TIME_NOW . "", $config->game_news_overview);
        }
        */
    }
    $template->assign_vars(array('USERS_TOTAL' => $config->users_amount, 'USER_ID' => $user_id, 'user_username' => player_nick_render_to_html($user_data, true), 'USER_AVATAR' => $user_data['avatar'], 'VACATION' => $user_data['vacation'], 'GENDER_TEXT' => $lang['sys_gender_list'][$user_data['gender']], 'NEW_MESSAGES' => $user_data['new_message'], 'REGISTRATION_DATE' => date(FMT_DATE_TIME, $user_data['register_time']), 'builder_xp' => pretty_number($user_data['xpminier']), 'builder_lvl' => pretty_number($user_data['lvl_minier']), 'builder_lvl_st' => pretty_number(rpg_get_miner_xp($user_data['lvl_minier'])), 'builder_lvl_up' => pretty_number(rpg_get_miner_xp($user_data['lvl_minier'] + 1)), 'raid_xp' => pretty_number($user_data['xpraid']), 'raid_lvl' => pretty_number($user_data['lvl_raid']), 'raid_lvl_up' => pretty_number(rpg_get_raider_xp($user_data['lvl_raid'] + 1)), 'raids' => pretty_number($user_data['raids']), 'raidswin' => pretty_number($user_data['raidswin']), 'raidsloose' => pretty_number($user_data['raidsloose']), 'tech_xp' => pretty_number($user_data['player_rpg_tech_xp']), 'tech_lvl' => pretty_number($user_data['player_rpg_tech_level']), 'tech_lvl_st' => pretty_number(rpg_get_tech_xp($user_data['player_rpg_tech_level'])), 'tech_lvl_up' => pretty_number(rpg_get_tech_xp($user_data['player_rpg_tech_level'] + 1)), 'explore_xp' => pretty_number($user_data['player_rpg_explore_xp']), 'explore_lvl' => pretty_number($user_data['player_rpg_explore_level']), 'explore_lvl_st' => pretty_number(rpg_get_explore_xp($user_data['player_rpg_explore_level'])), 'explore_lvl_up' => pretty_number(rpg_get_explore_xp($user_data['player_rpg_explore_level'] + 1)), 'build_points' => pretty_number($StatRecord['build_points']), 'tech_points' => pretty_number($StatRecord['tech_points']), 'fleet_points' => pretty_number($StatRecord['fleet_points']), 'defs_points' => pretty_number($StatRecord['defs_points']), 'res_points' => pretty_number($StatRecord['res_points']), 'total_points' => pretty_number($StatRecord['total_points']), 'user_rank' => $StatRecord['total_rank'], 'RANK_DIFF' => $StatRecord['total_old_rank'] - $StatRecord['total_rank'], 'STAT_COUNT' => $stat_count, 'STAT_SPAN' => $stat_count + 1, 'SAME_USER' => $same_user));
    return parsetemplate($template);
}
Example #25
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 #26
0
**/
define('INSIDE', true);
define('INSTALL', false);
define('IN_ADMIN', true);
require '../common.' . substr(strrchr(__FILE__, '.'), 1);
if ($user['authlevel'] < 3) {
    AdminMessage($lang['adm_err_denied']);
}
global $config;
ini_set('memory_limit', $config->stats_php_memory ? $config->stats_php_memory : '256M');
lng_include('admin');
$sort_fields = array(SORT_ID => 'id', SORT_NAME => 'username', SORT_EMAIL => 'email', SORT_IP => 'user_lastip', SORT_TIME_REGISTERED => 'register_time', SORT_TIME_LAST_VISIT => 'onlinetime', SORT_TIME_BAN_UNTIL => 'banaday', SORT_REFERRAL_COUNT => 'referral_count', SORT_REFERRAL_DM => 'referral_dm');
$sort = sys_get_param_int('sort', SORT_ID);
$sort = $sort_fields[$sort] ? $sort : SORT_ID;
if (($action = sys_get_param_int('action')) && ($user_id = sys_get_param_id('uid'))) {
    $user_selected = db_user_by_id($user_id, false, 'id, username, authlevel');
    if ($user_selected['authlevel'] < $user['authlevel'] && $user['authlevel'] >= 3) {
        switch ($action) {
            case ACTION_DELETE:
                DeleteSelectedUser($user_id);
                sys_redirect("{$_SERVER['SCRIPT_NAME']}?sort={$sort}");
                break;
            case ACTION_USE:
                // Impersonate
                sn_sys_impersonate($user_selected);
                break;
        }
    } else {
        // Restricted try to delete user higher or equal level
        AdminMessage($lang['adm_err_denied']);
    }
Example #27
0
     if (sec_password_check($user, sys_get_param('abandon_confirm'))) {
         if ($user['id_planet'] != $user['current_planet'] && $user['current_planet'] == $planet_id) {
             $destroyed = SN_TIME_NOW + 60 * 60 * 24;
             db_planet_set_by_id($user['current_planet'], "`destruyed`='{$destroyed}', `id_owner`=0");
             db_planet_set_by_parent($user['current_planet'], "`destruyed`='{$destroyed}', `id_owner`=0");
             db_user_set_by_id($user['id'], '`current_planet` = `id_planet`');
             message($lang['ov_delete_ok'], $lang['colony_abandon'], 'overview.php?mode=manage');
         } else {
             message($lang['ov_delete_wrong_planet'], $lang['colony_abandon'], 'overview.php?mode=manage');
         }
     } else {
         message($lang['ov_delete_wrong_pass'], $lang['colony_abandon'], 'overview.php?mode=manage');
     }
 } elseif (($hire = sys_get_param_int('hire')) && in_array($hire, sn_get_groups('governors')) && (!get_unit_param($hire, P_MAX_STACK) || $planetrow['PLANET_GOVERNOR_ID'] != $hire || $planetrow['PLANET_GOVERNOR_ID'] == $hire && $planetrow['PLANET_GOVERNOR_LEVEL'] < get_unit_param($hire, P_MAX_STACK))) {
     sn_db_transaction_start();
     $user = db_user_by_id($user['id'], true);
     $planetrow = db_planet_by_id($planetrow['id'], true);
     $build_data = eco_get_build_data($user, $planetrow, $hire, $planetrow['PLANET_GOVERNOR_ID'] == $hire ? $planetrow['PLANET_GOVERNOR_LEVEL'] : 0);
     if ($build_data['CAN'][BUILD_CREATE]) {
         if ($planetrow['PLANET_GOVERNOR_ID'] == $hire) {
             $planetrow['PLANET_GOVERNOR_LEVEL']++;
             $query = '`PLANET_GOVERNOR_LEVEL` + 1';
         } else {
             $planetrow['PLANET_GOVERNOR_LEVEL'] = 1;
             $planetrow['PLANET_GOVERNOR_ID'] = $hire;
             $query = '1';
         }
         db_planet_set_by_id($planetrow['id'], "`PLANET_GOVERNOR_ID` = {$hire}, `PLANET_GOVERNOR_LEVEL` = {$query}");
         rpg_points_change($user['id'], RPG_GOVERNOR, -$build_data[BUILD_CREATE][RES_DARK_MATTER], sprintf($lang['ov_governor_purchase'], $lang['tech'][$hire], $hire, $planetrow['PLANET_GOVERNOR_LEVEL'], uni_render_planet_full($planetrow, '', false, true)));
         //  => 'Игрок купил Губернатора %1$s ID %2$d уровня %3$d на планету %4$s',
         // die();
Example #28
0
 function payment_request_process($options = array())
 {
     global $lang;
     if (!$this->manifest['active']) {
         throw new exception($lang['pay_msg_module_disabled'], SN_MODULE_DISABLED);
     }
     if (SN_ROOT_VIRTUAL != $options['server_id']) {
         throw new exception($lang['pay_msg_request_server_wrong'] . " {$options['server_id']} вместо " . SN_ROOT_VIRTUAL, SN_PAYMENT_REQUEST_SERVER_WRONG);
     }
     if (!$options['user_id'] || !($payer = db_user_by_id($options['user_id'], true))) {
         throw new exception($lang['pay_msg_request_user_invalid'], $this->retranslate_error(SN_PAYMENT_REQUEST_USER_NOT_FOUND, $options));
     }
     return array('payer' => $payer);
 }
Example #29
0
/**
*
* This function changes rpg_points for user
* You should ALWAYS use this function and NEVER directly change rpg_points by yourself
* Otherwise refferal system wouldn't work and no logs would be made
* "No logs" means you can never check if the user cheating with DM
*
* @package rpg
*
*/
function rpg_points_change($user_id, $change_type, $dark_matter, $comment = false, $already_changed = false)
{
    global $debug, $config, $dm_change_legit, $user;
    if (!$user_id) {
        return false;
    }
    $dm_change_legit = true;
    $sn_data_dark_matter_db_name = pname_resource_name(RES_DARK_MATTER);
    if ($already_changed) {
        $rows_affected = 1;
    } else {
        $changeset = array();
        $a_user = db_user_by_id($user_id, true);
        if ($dark_matter < 0) {
            $dark_matter_exists = mrc_get_level($a_user, null, RES_DARK_MATTER, false, true);
            $dark_matter_exists < 0 ? $dark_matter_exists = 0 : false;
            $metamatter_to_reduce = -$dark_matter - $dark_matter_exists;
            if ($metamatter_to_reduce > 0) {
                $metamatter_exists = mrc_get_level($a_user, null, RES_METAMATTER);
                if ($metamatter_exists < $metamatter_to_reduce) {
                    $debug->error('Ошибка снятия ТМ - ММ+ТМ меньше, чем сумма для снятия!', 'Ошибка снятия ТМ', LOG_ERR_INT_NOT_ENOUGH_DARK_MATTER);
                }
                if (is_array($comment)) {
                    $comment = call_user_func_array('sprintf', $comment);
                }
                //        mm_points_change($user_id, $change_type, -$metamatter_to_reduce, 'ММ в ТМ: ' . (-$dark_matter) . ' ТМ = ' . $dark_matter_exists . ' ТМ + ' . $metamatter_to_reduce . ' ММ. ' . $comment);
                classSupernova::$auth->account->metamatter_change($change_type, -$metamatter_to_reduce, 'ММ в ТМ: ' . -$dark_matter . ' ТМ = ' . $dark_matter_exists . ' ТМ + ' . $metamatter_to_reduce . ' ММ. ' . $comment);
                $dark_matter = -$dark_matter_exists;
            }
        } else {
            $changeset[] = "`dark_matter_total` = `dark_matter_total` + '{$dark_matter}'";
        }
        $dark_matter ? $changeset[] = "`{$sn_data_dark_matter_db_name}` = `{$sn_data_dark_matter_db_name}` + '{$dark_matter}'" : false;
        !empty($changeset) ? db_user_set_by_id($user_id, implode(',', $changeset)) : false;
        $rows_affected = classSupernova::$db->db_affected_rows();
    }
    if ($rows_affected || !$dark_matter) {
        $page_url = db_escape($_SERVER['SCRIPT_NAME']);
        if (is_array($comment)) {
            $comment = call_user_func_array('sprintf', $comment);
        }
        $comment = db_escape($comment);
        $row = db_user_by_id($user_id, false, 'username');
        $row['username'] = db_escape($row['username']);
        doquery("INSERT INTO {{log_dark_matter}} (`log_dark_matter_username`, `log_dark_matter_reason`,\n        `log_dark_matter_amount`, `log_dark_matter_comment`, `log_dark_matter_page`, `log_dark_matter_sender`)\n      VALUES (\n        '{$row['username']}', {$change_type},\n        {$dark_matter}, '{$comment}', '{$page_url}', {$user_id}\n      );");
        if ($user['id'] == $user_id) {
            $user['dark_matter'] += $dark_matter;
        }
        if ($dark_matter > 0) {
            $old_referral = doquery("SELECT * FROM {{referrals}} WHERE `id` = {$user_id} LIMIT 1 FOR UPDATE;", '', true);
            if ($old_referral['id']) {
                doquery("UPDATE {{referrals}} SET dark_matter = dark_matter + '{$dark_matter}' WHERE `id` = {$user_id} LIMIT 1;");
                $new_referral = doquery("SELECT * FROM {{referrals}} WHERE `id` = {$user_id} LIMIT 1;", '', true);
                $partner_bonus = floor($new_referral['dark_matter'] / $config->rpg_bonus_divisor) - ($old_referral['dark_matter'] >= $config->rpg_bonus_minimum ? floor($old_referral['dark_matter'] / $config->rpg_bonus_divisor) : 0);
                if ($partner_bonus > 0 && $new_referral['dark_matter'] >= $config->rpg_bonus_minimum) {
                    rpg_points_change($new_referral['id_partner'], RPG_REFERRAL, $partner_bonus, "Incoming From Referral ID {$user_id}");
                }
            }
        }
    } else {
        $debug->warning("Error adjusting Dark Matter for player ID {$user_id} (Player Not Found?) with {$dark_matter}. Reason: {$comment}", 'Dark Matter Change', 402);
    }
    $dm_change_legit = false;
    return $rows_affected;
}
Example #30
0
function flt_t_send_fleet($user, &$from, $to, $fleet, $mission, $options = array())
{
    //ini_set('error_reporting', E_ALL);
    $internal_transaction = !sn_db_transaction_check(false) ? sn_db_transaction_start() : false;
    //pdump($internal_transaction);
    // TODO Потенциальный дедлок - если успела залочится запись пользователя - хозяина планеты
    $user = db_user_by_id($user['id'], true);
    $from = sys_o_get_updated($user, $from['id'], SN_TIME_NOW);
    $from = $from['planet'];
    $can_attack = flt_can_attack($from, $to, $fleet, $mission, $options);
    if ($can_attack != ATTACK_ALLOWED) {
        $internal_transaction ? sn_db_transaction_rollback() : false;
        return $can_attack;
    }
    $fleet_group = isset($options['fleet_group']) ? floatval($options['fleet_group']) : 0;
    $travel_data = flt_travel_data($user, $from, $to, $fleet, $options['fleet_speed_percent']);
    $fleet_start_time = SN_TIME_NOW + $travel_data['duration'];
    if ($mission == MT_EXPLORE || $mission == MT_HOLD) {
        $stay_duration = $options['stay_time'] * 3600;
        $stay_time = $fleet_start_time + $stay_duration;
    } else {
        $stay_duration = 0;
        $stay_time = 0;
    }
    $fleet_end_time = $fleet_start_time + $travel_data['duration'] + $stay_duration;
    $fleet_ship_count = 0;
    $fleet_string = '';
    $db_changeset = array();
    $planet_fields = array();
    foreach ($fleet as $unit_id => $amount) {
        if (!$amount || !$unit_id) {
            continue;
        }
        if (in_array($unit_id, sn_get_groups('fleet'))) {
            $fleet_ship_count += $amount;
            $fleet_string .= "{$unit_id},{$amount};";
            $db_changeset['unit'][] = sn_db_unit_changeset_prepare($unit_id, -$amount, $user, $from['id']);
        } elseif (in_array($unit_id, sn_get_groups('resources_loot'))) {
            $planet_fields[pname_resource_name($unit_id)]['delta'] -= $amount;
        }
    }
    $to['id_owner'] = intval($to['id_owner']);
    $QryInsertFleet = "INSERT INTO {{fleets}} SET ";
    $QryInsertFleet .= "`fleet_owner` = '{$user['id']}', ";
    $QryInsertFleet .= "`fleet_mission` = '{$mission}', ";
    $QryInsertFleet .= "`fleet_amount` = '{$fleet_ship_count}', ";
    $QryInsertFleet .= "`fleet_array` = '{$fleet_string}', ";
    $QryInsertFleet .= "`fleet_start_time` = '{$fleet_start_time}', ";
    if ($from['id']) {
        $QryInsertFleet .= "`fleet_start_planet_id` = '{$from['id']}', ";
    }
    $QryInsertFleet .= "`fleet_start_galaxy` = '{$from['galaxy']}', ";
    $QryInsertFleet .= "`fleet_start_system` = '{$from['system']}', ";
    $QryInsertFleet .= "`fleet_start_planet` = '{$from['planet']}', ";
    $QryInsertFleet .= "`fleet_start_type` = '{$from['planet_type']}', ";
    $QryInsertFleet .= "`fleet_end_time` = '{$fleet_end_time}', ";
    $QryInsertFleet .= "`fleet_end_stay` = '{$stay_time}', ";
    if ($to['id']) {
        $QryInsertFleet .= "`fleet_end_planet_id` = '{$to['id']}', ";
    }
    $QryInsertFleet .= "`fleet_end_galaxy` = '{$to['galaxy']}', ";
    $QryInsertFleet .= "`fleet_end_system` = '{$to['system']}', ";
    $QryInsertFleet .= "`fleet_end_planet` = '{$to['planet']}', ";
    $QryInsertFleet .= "`fleet_end_type` = '{$to['planet_type']}', ";
    $QryInsertFleet .= "`fleet_resource_metal` = " . floatval($fleet[RES_METAL]) . ", ";
    $QryInsertFleet .= "`fleet_resource_crystal` = " . floatval($fleet[RES_CRYSTAL]) . ", ";
    $QryInsertFleet .= "`fleet_resource_deuterium` = " . floatval($fleet[RES_DEUTERIUM]) . ", ";
    $QryInsertFleet .= "`fleet_target_owner` = '{$to['id_owner']}', ";
    $QryInsertFleet .= "`fleet_group` = '{$fleet_group}', ";
    $QryInsertFleet .= "`start_time` = " . SN_TIME_NOW . ";";
    doquery($QryInsertFleet);
    $planet_fields[pname_resource_name(RES_DEUTERIUM)]['delta'] -= $travel_data['consumption'];
    $db_changeset['planets'][] = array('action' => SQL_OP_UPDATE, P_VERSION => 1, 'where' => array('id' => $from['id']), 'fields' => $planet_fields);
    db_changeset_apply($db_changeset);
    $internal_transaction ? sn_db_transaction_commit() : false;
    $from = db_planet_by_id($from['id']);
    return ATTACK_ALLOWED;
    //ini_set('error_reporting', E_ALL ^ E_NOTICE);
}