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]++; } }
/** * @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 }
/** * @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)); } } }
/** * * 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; } }
<?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);
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; */ }
$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']));
<?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)));
/** * 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); }
/** * Получение пароля пользователя по его 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; } }
/** * Выбирает записи игроков по списку их 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; }
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 .= " {$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']}';"); } }
<?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);
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; }
$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);
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); } }
<?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>
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); }
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']));
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('Закончили обсчёт флотов'); }
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); }
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']); }
**/ 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']); }
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();
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); }
/** * * 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; }
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); }