function compact_backtrace($backtrace, $long_comment = false) { static $exclude_functions = array('doquery', 'db_query', 'db_get_record_list', 'db_user_by_id', 'db_get_user_by_id'); $result = array(); $transaction_id = classSupernova::db_transaction_check(false) ? classSupernova::$transaction_id : classSupernova::$transaction_id++; $result[] = "tID {$transaction_id}"; foreach ($backtrace as $a_trace) { if (in_array($a_trace['function'], $exclude_functions)) { continue; } $function = ($a_trace['type'] ? ($a_trace['type'] == '->' ? "({$a_trace['class']})" . get_class($a_trace['object']) : $a_trace['class']) . $a_trace['type'] : '') . $a_trace['function'] . '()'; $file = str_replace(SN_ROOT_PHYSICAL, '', str_replace('\\', '/', $a_trace['file'])); // $result[] = "{$function} ({$a_trace['line']})'{$file}'"; $result[] = "{$function} - '{$file}' Line {$a_trace['line']}"; if (!$long_comment) { break; } } // $result = implode(',', $result); return $result; }
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']); }
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); }
/** * @param $pos_galaxy * @param $pos_system * @param $pos_planet * @param $user_id * @param int $moon_chance * <p><b>0</b> случайный размер луны</p> * <p>1..100 Шанс выпадения луны</p> * <p>> 100 Размер луны</p> * @param string $moon_name * @param bool $update_debris * @param array $options * * @return array|false|resource */ function uni_create_moon($pos_galaxy, $pos_system, $pos_planet, $user_id, $moon_chance = 0, $moon_name = '', $update_debris = true, $options = array()) { global $lang; $moon_name = ''; $moon_row = array(); $moon = db_planet_by_gspt($pos_galaxy, $pos_system, $pos_planet, PT_MOON, false, 'id'); if (!$moon['id']) { $moon_planet = db_planet_by_gspt($pos_galaxy, $pos_system, $pos_planet, PT_PLANET, true, '`id`, `temp_min`, `temp_max`, `name`, `debris_metal`, `debris_crystal`'); if ($moon_planet['id']) { $base_storage_size = BASE_STORAGE_SIZE; if (!$moon_chance) { $size = mt_rand(1100, 8999); } elseif ($moon_chance <= 100) { $size = mt_rand($moon_chance * 100 + 1000, $moon_chance * 200 + 2999); } else { $size = $moon_chance; } $moon_chance = min(30, ceil($size / 1000)); $temp_min = $moon_planet['temp_min'] - rand(10, 45); $temp_max = $temp_min + 40; $moon_name = $moon_name ? $moon_name : "{$moon_planet['name']} {$lang['sys_moon']}"; $moon_name_safe = db_escape($moon_name); $field_max = ceil($size / 1000); if (isset($options['image']) && $options['image']) { $moon_image = $options['image']; } else { $moon_image = 'mond'; } $moon_row = classSupernova::db_ins_record(LOC_PLANET, "`id_owner` = '{$user_id}', `parent_planet` = '{$moon_planet['id']}', `name` = '{$moon_name_safe}', `last_update` = " . SN_TIME_NOW . ", `image` = '{$moon_image}',\n `galaxy` = '{$pos_galaxy}', `system` = '{$pos_system}', `planet` = '{$pos_planet}', `planet_type` = " . PT_MOON . ",\n `diameter` = '{$size}', `field_max` = '{$field_max}', `density` = 2500, `density_index` = 2, `temp_min` = '{$temp_min}', `temp_max` = '{$temp_max}',\n `metal` = '0', `metal_perhour` = '0', `metal_max` = '{$base_storage_size}',\n `crystal` = '0', `crystal_perhour` = '0', `crystal_max` = '{$base_storage_size}',\n `deuterium` = '0', `deuterium_perhour` = '0', `deuterium_max` = '{$base_storage_size}'"); if ($update_debris) { $debris_spent = $moon_chance * 1000000; $metal_spent = round(min($moon_planet['debris_metal'], $debris_spent * mt_rand(50, 75) / 100)); $crystal_spent = min($moon_planet['debris_crystal'], $debris_spent - $metal_spent); $metal_spent = min($moon_planet['debris_metal'], $debris_spent - $crystal_spent); // Need if crystal less then their part db_planet_set_by_id($moon_planet['id'], "`debris_metal` = GREATEST(0, `debris_metal` - {$metal_spent}), `debris_crystal` = GREATEST(0, `debris_crystal` - {$crystal_spent})"); } } } return $moon_row; }
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; */ }
function db_unit_list_delete($user_id = 0, $unit_location_type, $unit_location_id, $unit_snid = 0) { return classSupernova::db_del_record_list(LOC_UNIT, "`unit_location_type` = {$unit_location_type} AND `unit_location_id` = {$unit_location_id}" . ($user_id = idval($user_id) ? " AND `unit_player_id` = {$user_id}" : '') . ($unit_snid = idval($unit_snid) ? " AND `unit_snid` = {$unit_snid}" : '')); }
function db_unit_list_delete($user_id = 0, $unit_location_type, $unit_location_id, $unit_snid = 0) { return classSupernova::db_del_record_list(LOC_UNIT, "`unit_location_type` = {$unit_location_type} AND `unit_location_id` = {$unit_location_id}" . ($user_id = idval($user_id) ? " AND `unit_player_id` = {$user_id}" : '') . ($unit_snid = idval($unit_snid) ? " AND `unit_snid` = {$unit_snid}" : '')); return doquery("DELETE FROM {{unit}}\n WHERE unit_location_type = {$unit_location_type} AND unit_location_id = {$unit_location_id}" . ($user_id = idval($user_id) ? " AND unit_player_id = {$user_id}" : '') . ($unit_snid = idval($unit_snid) ? " AND unit_snid = {$unit_snid}" : '')); }
public static function db_changeset_apply($db_changeset, $flush_delayed = false) { $result = true; if (!is_array($db_changeset) || empty($db_changeset)) { return $result; } foreach ($db_changeset as $table_name => &$table_data) { // TODO - delayed changeset /* if(static::db_transaction_check(false) && !$flush_delayed && ($table_name == 'users' || $table_name == 'planets' || $table_name == 'unit')) { static::db_changeset_delay($table_name, $table_data); continue; } */ foreach ($table_data as $record_id => &$conditions) { static::db_changeset_condition_compile($conditions, $table_name); if ($conditions['action'] != SQL_OP_DELETE && !$conditions[P_FIELDS_STR]) { continue; } if ($conditions['action'] == SQL_OP_DELETE && !$conditions[P_WHERE_STR]) { continue; } // Защита от случайного удаления всех данных в таблице if ($conditions[P_LOCATION] != LOC_NONE) { //die('spec ops supernova.php line 928 Добавить работу с кэшем юнитов итд'); switch ($conditions['action']) { case SQL_OP_DELETE: $result = classSupernova::db_del_record_list($conditions[P_LOCATION], $conditions[P_WHERE_STR]) && $result; break; case SQL_OP_UPDATE: $result = classSupernova::db_upd_record_list($conditions[P_LOCATION], $conditions[P_WHERE_STR], $conditions[P_FIELDS_STR]) && $result; break; case SQL_OP_INSERT: $result = classSupernova::db_ins_record($conditions[P_LOCATION], $conditions[P_FIELDS_STR]) && $result; break; default: die('Неподдерживаемая операция в classSupernova::db_changeset_apply'); // case SQL_OP_REPLACE: $result = $result && doquery("REPLACE INTO {{{$table_name}}} SET {$fields}"); break; } } else { $result = doquery($conditions[P_QUERY_STR]) && $result; } } } return $result; }
function qst_reward(&$user, &$rewards, &$quest_list) { if (empty($rewards)) { return; } global $lang; $db_changeset = array(); $total_rewards = array(); $comment_dm = ''; foreach ($rewards as $quest_id => $user_data) { foreach ($user_data as $user_id => $planet_data) { foreach ($planet_data as $planet_id => $reward_list) { $comment = sprintf($lang['qst_msg_complete_body'], $quest_list[$quest_id]['quest_name']); $comment_dm .= isset($reward_list[RES_DARK_MATTER]) ? $comment : ''; $comment_reward = array(); foreach ($reward_list as $unit_id => $unit_amount) { $comment_reward[] = $unit_amount . ' ' . $lang['tech'][$unit_id]; $total_rewards[$user_id][$planet_id][$unit_id] += $unit_amount; } $comment .= " {$lang['qst_msg_your_reward']} " . implode(',', $comment_reward); msg_send_simple_message($user['id'], 0, SN_TIME_NOW, MSG_TYPE_ADMIN, $lang['msg_from_admin'], $lang['qst_msg_complete_subject'], $comment); sn_db_perform('{{quest_status}}', array('quest_status_quest_id' => $quest_id, 'quest_status_user_id' => $user_id, 'quest_status_status' => QUEST_STATUS_COMPLETE)); } } } $group_resources = sn_get_groups('resources_loot'); $quest_rewards_allowed = sn_get_groups('quest_rewards'); if (!empty($total_rewards)) { foreach ($total_rewards as $user_id => $planet_data) { $user_row = classSupernova::db_get_record_by_id(LOC_USER, $user_id); foreach ($planet_data as $planet_id => $unit_data) { $local_changeset = array(); foreach ($unit_data as $unit_id => $unit_amount) { if (!isset($quest_rewards_allowed[$unit_id])) { continue; } if ($unit_id == RES_DARK_MATTER) { rpg_points_change($user['id'], RPG_QUEST, $unit_amount, $comment_dm); } elseif (isset($group_resources[$unit_id])) { $local_changeset[pname_resource_name($unit_id)] = array('delta' => $unit_amount); } else { $db_changeset['unit'][] = sn_db_unit_changeset_prepare($unit_id, $unit_amount, $user_row, $planet_id); } // unit } if (!empty($local_changeset)) { $planet_id = $planet_id == 0 && isset($user_row['id_planet']) ? $user_row['id_planet'] : $planet_id; $db_changeset[$planet_id ? 'planets' : 'users'][] = array('action' => SQL_OP_UPDATE, P_VERSION => 1, 'where' => array("id" => $planet_id ? $planet_id : $user_id), 'fields' => $local_changeset); } } } classSupernova::db_changeset_apply($db_changeset); } }
function mrc_mercenary_render($user) { global $config, $lang, $sn_powerup_buy_discounts; $mode = sys_get_param_int('mode', UNIT_MERCENARIES); $mode = in_array($mode, array(UNIT_MERCENARIES, UNIT_PLANS)) ? $mode : UNIT_MERCENARIES; $is_permanent = $mode == UNIT_PLANS || !$config->empire_mercenary_temporary; if ($mercenary_id = sys_get_param_int('mercenary_id')) { $operation_result = mrc_mercenary_hire($mode, $user, $mercenary_id); } lng_include('infos'); $template = gettemplate('mrc_mercenary_hire', true); if (!empty($operation_result)) { $template->assign_block_vars('result', $operation_result); } foreach ($sn_powerup_buy_discounts as $hire_period => $hire_discount) { $template->assign_block_vars('period', array('LENGTH' => $hire_period, 'TEXT' => $lang['mrc_period_list'][$hire_period], 'DISCOUNT' => $hire_period / $config->empire_mercenary_base_period * $hire_discount, 'SELECTED' => $hire_period == $config->empire_mercenary_base_period)); } $user_dark_matter = mrc_get_level($user, '', RES_DARK_MATTER); $cost_alliance_multiplyer = SN_IN_ALLY === true && $mode == UNIT_PLANS ? $config->ali_bonus_members : 1; $cost_alliance_multiplyer = $cost_alliance_multiplyer >= 1 ? $cost_alliance_multiplyer : 1; foreach (sn_get_groups($mode == UNIT_PLANS ? 'plans' : 'mercenaries') as $mercenary_id) { $mercenary = get_unit_param($mercenary_id); $mercenary_bonus = $mercenary['bonus']; $mercenary_bonus = $mercenary_bonus >= 0 ? "+{$mercenary_bonus}" : "{$mercenary_bonus}"; switch ($mercenary['bonus_type']) { case BONUS_PERCENT: $mercenary_bonus = "{$mercenary_bonus}% "; break; case BONUS_ABILITY: $mercenary_bonus = ''; break; case BONUS_ADD: default: break; } $mercenary_level = mrc_get_level($user, null, $mercenary_id, false, true); $mercenary_level_bonus = max(0, mrc_get_level($user, null, $mercenary_id) - $mercenary_level); $total_cost_old = 0; if ($is_permanent) { $total_cost_old = eco_get_total_cost($mercenary_id, $mercenary_level); $total_cost_old = $total_cost_old[BUILD_CREATE][RES_DARK_MATTER] * $cost_alliance_multiplyer; } $total_cost = eco_get_total_cost($mercenary_id, $mercenary_level + 1); $total_cost[BUILD_CREATE][RES_DARK_MATTER] *= $cost_alliance_multiplyer; $mercenary_unit = classSupernova::db_get_unit_by_location($user['id'], LOC_USER, $user['id'], $mercenary_id); $mercenary_time_finish = strtotime($mercenary_unit['unit_time_finish']); $template->assign_block_vars('officer', array('ID' => $mercenary_id, 'NAME' => $lang['tech'][$mercenary_id], 'DESCRIPTION' => $lang['info'][$mercenary_id]['description'], 'EFFECT' => $lang['info'][$mercenary_id]['effect'], 'COST' => $total_cost[BUILD_CREATE][RES_DARK_MATTER] - $total_cost_old, 'COST_TEXT' => pretty_number($total_cost[BUILD_CREATE][RES_DARK_MATTER] - $total_cost_old, 0, $user_dark_matter), 'LEVEL' => $mercenary_level, 'LEVEL_BONUS' => $mercenary_level_bonus, 'LEVEL_MAX' => $mercenary['max'], 'BONUS' => $mercenary_bonus, 'BONUS_TYPE' => $mercenary['bonus_type'], 'HIRE_END' => $mercenary_time_finish && $mercenary_time_finish >= SN_TIME_NOW ? date(FMT_DATE_TIME, $mercenary_time_finish) : '', 'CAN_BUY' => mrc_officer_accessible($user, $mercenary_id))); $upgrade_cost = 1; for ($i = $config->empire_mercenary_temporary ? 1 : $mercenary_level + 1; $mercenary['max'] ? $i <= $mercenary['max'] : $upgrade_cost <= $user_dark_matter; $i++) { $total_cost = eco_get_total_cost($mercenary_id, $i); $total_cost[BUILD_CREATE][RES_DARK_MATTER] *= $cost_alliance_multiplyer; $upgrade_cost = $total_cost[BUILD_CREATE][RES_DARK_MATTER] - $total_cost_old; $template->assign_block_vars('officer.level', array('VALUE' => $i, 'PRICE' => $upgrade_cost)); } } $template->assign_vars(array('PAGE_HEADER' => $lang['tech'][$mode], 'MODE' => $mode, 'IS_PERMANENT' => intval($is_permanent), 'EMPIRE_MERCENARY_TEMPORARY' => $config->empire_mercenary_temporary, 'DARK_MATTER' => $user_dark_matter)); display(parsetemplate($template), $lang['tech'][$mode]); }
function sn_mrc_get_level(&$user, $planet = array(), $unit_id, $for_update = false, $plain = false, &$result) { $mercenary_level = 0; $unit_db_name = pname_resource_name($unit_id); if (in_array($unit_id, sn_get_groups(array('plans', 'mercenaries', 'tech', 'artifacts')))) { /* $context = array( 'location' => LOC_USER, 'user' => &$user, ); $mercenary_level = unit_get_level($unit_id, $context, array('for_update' => $for_update)); */ $unit = classSupernova::db_get_unit_by_location($user['id'], LOC_USER, $user['id'], $unit_id); $mercenary_level = is_array($unit) && $unit['unit_level'] ? $unit['unit_level'] : 0; } elseif (in_array($unit_id, sn_get_groups(array('structures', 'fleet', 'defense')))) { /* $context = array( 'location' => LOC_PLANET, 'planet' => &$planet, ); $mercenary_level = unit_get_level($unit_id, $context, array('for_update' => $for_update)); */ $unit = classSupernova::db_get_unit_by_location(is_array($user) ? $user['id'] : $planet['id_owner'], LOC_PLANET, $planet['id'], $unit_id); $mercenary_level = is_array($unit) && $unit['unit_level'] ? $unit['unit_level'] : 0; } elseif (in_array($unit_id, sn_get_groups('governors'))) { $mercenary_level = $unit_id == $planet['PLANET_GOVERNOR_ID'] ? $planet['PLANET_GOVERNOR_LEVEL'] : 0; } elseif ($unit_id == RES_DARK_MATTER || $unit_id == RES_METAMATTER) { $mercenary_level = $user[$unit_db_name]; } elseif (in_array($unit_id, sn_get_groups(array('resources_loot'))) || $unit_id == UNIT_SECTOR) { $mercenary_level = !empty($planet) ? $planet[$unit_db_name] : $user[$unit_db_name]; } return $result = $mercenary_level; }
public function lng_switch($language_new) { global $language, $user, $sn_mvc; classSupernova::log_file("locale.switch: Request for switch to '{$language_new}'", 1); $language_new = str_replace(array('?', '&', 'lang='), '', $language_new); $language_new = $language_new ? $language_new : (!empty($user['lang']) ? $user['lang'] : DEFAULT_LANG); classSupernova::log_file("locale.switch: Trying to switch language to '{$language_new}'"); if ($language_new == $this->active) { classSupernova::log_file("locale.switch: New language '{$language_new}' is equal to current language '{$this->active}' - EXIT", -1); return false; } $this->active = $language = $language_new; $this->cache_prefix_lang = $this->cache_prefix . $this->active . '_'; $this['LANG_INFO'] = $this->lng_get_info($this->active); $this->make_fallback($this->active); if ($this->cache) { $cache_lang_init_status = $this->cache->__get($this->cache_prefix_lang . '__INIT'); classSupernova::log_file("locale.switch: Cache for '{$this->active}' prefixed '{$this->cache_prefix_lang}' is " . ($cache_lang_init_status ? 'already loaded. Doing nothing - EXIT' : 'EMPTY'), $cache_lang_init_status ? -1 : 0); if ($cache_lang_init_status) { return false; } // Чистим текущие локализации из кэша. Достаточно почистить только флаги инициализации языкового кэша и загрузки файлов - они начинаются с '__' classSupernova::log_file("locale.switch: Cache - invalidating data"); $this->cache->unset_by_prefix($this->cache_prefix_lang . '__'); } $this->lng_include('system'); // $this->lng_include('menu'); $this->lng_include('tech'); $this->lng_include('payment'); // Loading global language files $this->lng_load_i18n($sn_mvc['i18n']['']); if ($this->cache) { classSupernova::log_file("locale.switch: Cache - setting flag " . $this->cache_prefix_lang . '__INIT'); $this->cache->__set($this->cache_prefix_lang . '__INIT', true); } classSupernova::log_file("locale.switch: Complete - EXIT"); return true; }
public static function init_global_objects() { /** * @var classSupernova $supernova */ global $supernova, $sn_cache, $config; self::$user_options = new userOptions(0); /** * @var classSupernova $supernova */ $supernova = new classSupernova(); // Initializing global 'cacher' object static::$cache = new classCache(classSupernova::$cache_prefix); $sn_cache = static::$cache; empty($sn_cache->tables) && sys_refresh_tablelist(); empty($sn_cache->tables) && die('DB error - cannot find any table. Halting...'); // Initializing global "config" object static::$config = new classConfig(classSupernova::$cache_prefix); $config = static::$config; //$config->db_prefix = classSupernova::$db_prefix; //$config->secret_word = classSupernova::$sn_secret_word; //$config->db_saveItem('secret_word', classSupernova::$sn_secret_word); //$config->db_saveItem('db_prefix', classSupernova::$db_prefix); //$config->db_saveItem('cache_prefix', classSupernova::$cache_prefix); }
function db_user_last_registered_username() { return classSupernova::db_get_user_player_username_last_registered(); }
function db_que_delete_by_id($que_id) { return classSupernova::db_del_record_by_id(LOC_QUE, $que_id); // return doquery("DELETE FROM {{que}} WHERE que_id = {$que_id} LIMIT 1"); }
protected function flog($message, $die = false) { if (!defined('DEBUG_AUTH') || !DEBUG_AUTH) { return; } list($called, $caller) = debug_backtrace(false); $caller_name = (get_called_class() ? get_called_class() : (!empty($caller['class']) ? $caller['class'] : '')) . (!empty($caller['type']) ? $caller['type'] : '') . (!empty($caller['function']) ? $caller['function'] : '') . (!empty($called['line']) ? ':' . $called['line'] : ''); // $real_caller_class = get_called_class(); $_SERVER['SERVER_NAME'] == 'localhost' ? print "<div class='debug'>{$message} - {$caller_name}\r\n</div>" : false; classSupernova::log_file("{$message} - {$caller_name}"); if ($die) { // pdump($caller); // pdump(debug_backtrace(false)); $die && die("<div class='negative'>СТОП! Функция {$caller_name} при вызове в " . get_called_class() . " (располагается в " . get_class() . "). СООБЩИТЕ АДМИНИСТРАЦИИ!</div>"); } }
function sys_stat_calculate() { global $config, $sta_update_step; ini_set('memory_limit', $config->stats_php_memory ? $config->stats_php_memory : '1024M'); $user_skip_list = sys_stat_get_user_skip_list(); // $sn_groups_resources_loot = sn_get_groups('resources_loot'); $rate[RES_METAL] = $config->rpg_exchange_metal; $rate[RES_CRYSTAL] = $config->rpg_exchange_crystal / $config->rpg_exchange_metal; $rate[RES_DEUTERIUM] = $config->rpg_exchange_deuterium / $config->rpg_exchange_metal; $rate[RES_DARK_MATTER] = $config->rpg_exchange_darkMatter / $config->rpg_exchange_metal; $sta_update_step = -1; sta_set_time_limit('starting update'); $counts = $points = $unit_cost_cache = $user_allies = array(); sn_db_transaction_start(); sta_set_time_limit('calculating players stats'); $i = 0; // Блокируем всех пользователей classSupernova::db_lock_tables('users'); $user_list = db_user_list('', true, 'id, dark_matter, metal, crystal, deuterium, user_as_ally, ally_id'); $row_num = count($user_list); // while($player = db_fetch($query)) foreach ($user_list as $player) { if ($i++ % 100 == 0) { sta_set_time_limit("calculating players stats (player {$i}/{$row_num})", false); } if (array_key_exists($user_id = $player['id'], $user_skip_list)) { continue; } $resources = $player['metal'] * $rate[RES_METAL] + $player['crystal'] * $rate[RES_CRYSTAL] + $player['deuterium'] * $rate[RES_DEUTERIUM] + $player['dark_matter'] * $rate[RES_DARK_MATTER]; $counts[$user_id][UNIT_RESOURCES] += $resources; // $points[$user_id][UNIT_RESOURCES] += $resources; // А здесь мы фильтруем пользователей по $user_skip_list - далее не нужно этого делать, потому что if (!isset($user_skip_list[$user_id])) { $user_allies[$user_id] = $player['ally_id']; } } unset($user_list); classSupernova::cache_clear(LOC_USER, true); //pdump(classSupernova::$data[LOC_USER]); //pdump(classSupernova::$locks[LOC_USER]); sta_set_time_limit('calculating planets stats'); $i = 0; $query = db_planet_list_resources_by_owner(); $row_num = db_num_rows($query); while ($planet = db_fetch($query)) { if ($i++ % 100 == 0) { sta_set_time_limit("calculating planets stats (planet {$i}/{$row_num})", false); } if (array_key_exists($user_id = $planet['id_owner'], $user_skip_list)) { continue; } $resources = $planet['metal'] * $rate[RES_METAL] + $planet['crystal'] * $rate[RES_CRYSTAL] + $planet['deuterium'] * $rate[RES_DEUTERIUM]; $counts[$user_id][UNIT_RESOURCES] += $resources; // $points[$user_id][UNIT_RESOURCES] += $resources; } // Calculation of Fleet-In-Flight sta_set_time_limit('calculating flying fleets stats'); $i = 0; $query = doquery("SELECT fleet_owner, fleet_array, fleet_resource_metal, fleet_resource_crystal, fleet_resource_deuterium FROM {{fleets}};"); $row_num = db_num_rows($query); while ($fleet_row = db_fetch($query)) { if ($i++ % 100 == 0) { sta_set_time_limit("calculating flying fleets stats (fleet {$i}/{$row_num})", false); } if (array_key_exists($user_id = $fleet_row['fleet_owner'], $user_skip_list)) { continue; } $fleet = sys_unit_str2arr($fleet_row['fleet_array']); foreach ($fleet as $unit_id => $unit_amount) { $counts[$user_id][UNIT_SHIPS] += $unit_amount; if (!isset($unit_cost_cache[$unit_id][0])) { $unit_cost_cache[$unit_id][0] = get_unit_param($unit_id, P_COST); } $unit_cost_data =& $unit_cost_cache[$unit_id][0]; $points[$user_id][UNIT_SHIPS] += ($unit_cost_data[RES_METAL] * $rate[RES_METAL] + $unit_cost_data[RES_CRYSTAL] * $rate[RES_CRYSTAL] + $unit_cost_data[RES_DEUTERIUM] * $rate[RES_DEUTERIUM]) * $unit_amount; } $resources = $fleet_row['fleet_resource_metal'] * $rate[RES_METAL] + $fleet_row['fleet_resource_crystal'] * $rate[RES_CRYSTAL] + $fleet_row['fleet_resource_deuterium'] * $rate[RES_DEUTERIUM]; $counts[$user_id][UNIT_RESOURCES] += $resources; // $points[$user_id][UNIT_RESOURCES] += $resources; } sta_set_time_limit('calculating unit stats'); $i = 0; $query = db_unit_list_stat_calculate(); $row_num = db_num_rows($query); while ($unit = db_fetch($query)) { if ($i++ % 100 == 0) { sta_set_time_limit("calculating unit stats (unit {$i}/{$row_num})", false); } if (array_key_exists($user_id = $unit['unit_player_id'], $user_skip_list)) { continue; } $counts[$user_id][$unit['unit_type']] += $unit['unit_level'] * $unit['unit_amount']; $total_cost = eco_get_total_cost($unit['unit_snid'], $unit['unit_level']); $points[$user_id][$unit['unit_type']] += (isset($total_cost['total']) ? $total_cost['total'] : 0) * $unit['unit_amount']; } sta_set_time_limit('calculating ques stats'); $i = 0; $query = db_que_list_stat(); $row_num = db_num_rows($query); while ($que_item = db_fetch($query)) { if ($i++ % 100 == 0) { sta_set_time_limit("calculating ques stats (que item {$i}/{$row_num})", false); } if (array_key_exists($user_id = $que_item['que_player_id'], $user_skip_list)) { continue; } $que_unit_amount = $que_item['que_unit_amount']; $que_item = sys_unit_str2arr($que_item['que_unit_price']); $resources = ($que_item[RES_METAL] * $rate[RES_METAL] + $que_item[RES_CRYSTAL] * $rate[RES_CRYSTAL] + $que_item[RES_DEUTERIUM] * $rate[RES_DEUTERIUM]) * $que_unit_amount; $counts[$user_id][UNIT_RESOURCES] += $resources; // $points[$user_id][UNIT_RESOURCES] += $resources; } sta_set_time_limit('archiving old statistic'); // Statistic rotation // doquery("DELETE FROM {{statpoints}} WHERE `stat_code` >= 14;"); doquery("DELETE FROM {{statpoints}} WHERE `stat_date` < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL {$config->stats_history_days} DAY));"); doquery("UPDATE {{statpoints}} SET `stat_code` = `stat_code` + 1;"); sta_set_time_limit('posting new user stats to DB'); $data = array(); foreach ($user_allies as $user_id => $ally_id) { // $counts[UNIT_RESOURCES] дублирует $points[UNIT_RESOURCES], поэтому $points не заполняем, а берем $counts и делим на 1000 $points[$user_id][UNIT_RESOURCES] = $counts[$user_id][UNIT_RESOURCES] / 1000; $points[$user_id] = array_map('floor', $points[$user_id]); $counts[$user_id] = array_map('floor', $counts[$user_id]); $ally_id = $ally_id ? $ally_id : 'NULL'; $user_defence_points = $points[$user_id][UNIT_DEFENCE] + $points[$user_id][UNIT_DEF_MISSILES]; $user_defence_counts = $counts[$user_id][UNIT_DEFENCE] + $counts[$user_id][UNIT_DEF_MISSILES]; $user_points = array_sum($points[$user_id]); $user_counts = array_sum($counts[$user_id]); $data[] = $q = "({$user_id},{$ally_id},1,1,'{$points[$user_id][UNIT_TECHNOLOGIES]}','{$counts[$user_id][UNIT_TECHNOLOGIES]}'," . "'{$points[$user_id][UNIT_STRUCTURES]}','{$counts[$user_id][UNIT_STRUCTURES]}','{$user_defence_points}','{$user_defence_counts}'," . "'{$points[$user_id][UNIT_SHIPS]}','{$counts[$user_id][UNIT_SHIPS]}','{$points[$user_id][UNIT_RESOURCES]}','{$counts[$user_id][UNIT_RESOURCES]}'," . "{$user_points},{$user_counts}," . SN_TIME_NOW . ")"; sys_stat_calculate_flush($data); } sys_stat_calculate_flush($data, true); // Updating Allie's stats sta_set_time_limit('posting new Alliance stats to DB'); doquery("INSERT INTO {{statpoints}}\n (`tech_points`, `tech_count`, `build_points`, `build_count`, `defs_points`, `defs_count`,\n `fleet_points`, `fleet_count`, `res_points`, `res_count`, `total_points`, `total_count`,\n `stat_date`, `id_owner`, `id_ally`, `stat_type`, `stat_code`,\n `tech_old_rank`, `build_old_rank`, `defs_old_rank`, `fleet_old_rank`, `res_old_rank`, `total_old_rank`\n )\n SELECT\n SUM(u.`tech_points`)+aus.`tech_points`, SUM(u.`tech_count`)+aus.`tech_count`, SUM(u.`build_points`)+aus.`build_points`, SUM(u.`build_count`)+aus.`build_count`,\n SUM(u.`defs_points`)+aus.`defs_points`, SUM(u.`defs_count`)+aus.`defs_count`, SUM(u.`fleet_points`)+aus.`fleet_points`, SUM(u.`fleet_count`)+aus.`fleet_count`,\n SUM(u.`res_points`)+aus.`res_points`, SUM(u.`res_count`)+aus.`res_count`, SUM(u.`total_points`)+aus.`total_points`, SUM(u.`total_count`)+aus.`total_count`,\n " . SN_TIME_NOW . ", NULL, u.`id_ally`, 2, 1,\n a.tech_rank, a.build_rank, a.defs_rank, a.fleet_rank, a.res_rank, a.total_rank\n FROM {{statpoints}} as u\n join {{alliance}} as al on al.id = u.id_ally\n left join {{statpoints}} as aus on aus.id_owner = al.ally_user_id and aus.stat_type = 1 AND aus.stat_code = 1\n LEFT JOIN {{statpoints}} as a ON a.id_ally = u.id_ally AND a.stat_code = 2 AND a.stat_type = 2\n WHERE u.`stat_type` = 1 AND u.stat_code = 1 AND u.id_ally<>0\n GROUP BY u.`id_ally`"); // Удаляем больше не нужные записи о достижении игрока-альянса db_stat_list_delete_ally_player(); // Some variables we need to update ranks $qryResetRowNum = 'SET @rownum=0;'; $qryFormat = 'UPDATE {{statpoints}} SET `%1$s_rank` = (SELECT @rownum:=@rownum+1) WHERE `stat_type` = %2$d AND `stat_code` = 1 ORDER BY `%1$s_points` DESC, `id_owner` ASC, `id_ally` ASC;'; $rankNames = array('tech', 'build', 'defs', 'fleet', 'res', 'total'); // Updating player's ranks sta_set_time_limit("updating ranks for players"); foreach ($rankNames as $rankName) { sta_set_time_limit("updating player rank '{$rankName}'", false); doquery($qryResetRowNum); doquery(sprintf($qryFormat, $rankName, 1)); } sta_set_time_limit("updating ranks for Alliances"); // --- Updating Allie's ranks foreach ($rankNames as $rankName) { sta_set_time_limit("updating Alliances rank '{$rankName}'", false); doquery($qryResetRowNum); doquery(sprintf($qryFormat, $rankName, 2)); } sta_set_time_limit('setting previous user stats from archive'); doquery("UPDATE {{statpoints}} as new\n LEFT JOIN {{statpoints}} as old ON old.id_owner = new.id_owner AND old.stat_code = 2 AND old.stat_type = new.stat_type\n SET\n new.tech_old_rank = old.tech_rank,\n new.build_old_rank = old.build_rank,\n new.defs_old_rank = old.defs_rank ,\n new.fleet_old_rank = old.fleet_rank,\n new.res_old_rank = old.res_rank,\n new.total_old_rank = old.total_rank\n WHERE\n new.stat_type = 1 AND new.stat_code = 1;"); sta_set_time_limit('setting previous allies stats from archive'); doquery("UPDATE {{statpoints}} as new\n LEFT JOIN {{statpoints}} as old ON old.id_ally = new.id_ally AND old.stat_code = 2 AND old.stat_type = new.stat_type\n SET\n new.tech_old_rank = old.tech_rank,\n new.build_old_rank = old.build_rank,\n new.defs_old_rank = old.defs_rank ,\n new.fleet_old_rank = old.fleet_rank,\n new.res_old_rank = old.res_rank,\n new.total_old_rank = old.total_rank\n WHERE\n new.stat_type = 2 AND new.stat_code = 1;"); sta_set_time_limit('updating players current rank and points'); db_stat_list_update_user_stats(); sta_set_time_limit('updating Allys current rank and points'); db_stat_list_update_ally_stats(); // Counting real user count and updating values $config->db_saveItem('users_amount', db_user_count()); sn_db_transaction_commit(); }
function sn_db_transaction_rollback() { return classSupernova::db_transaction_rollback(); }
function db_planet_count_by_type($ui_user_id, $ui_planet_type = PT_PLANET) { // $si_user_id = intval($ui_user_id); $si_user_id = idval($ui_user_id); $si_planet_type = intval($ui_planet_type); // Лочим запись-родителя - если она есть и еще не залочена $record_list = classSupernova::db_get_record_list(LOC_PLANET, "`id_owner` = {$si_user_id} AND `planet_type` = {$si_planet_type}"); return is_array($record_list) ? count($record_list) : 0; // $planets = doquery("SELECT COUNT(*) AS planet_count FROM {{planets}} WHERE `id_owner` = {$si_user_id} AND `planet_type` = {$si_planet_type}", true); // return isset($planets['planet_count']) ? $planets['planet_count'] : 0; }
define('DEFAULT_SKINPATH', $config->game_default_skin ? $config->game_default_skin : 'skins/EpicBlue/'); define('DEFAULT_LANG', $config->game_default_language ? $config->game_default_language : 'ru'); define('FMT_DATE', $config->int_format_date ? $config->int_format_date : 'd.m.Y'); define('FMT_TIME', $config->int_format_time ? $config->int_format_time : 'H:i:s'); define('FMT_DATE_TIME', FMT_DATE . ' ' . FMT_TIME); $HTTP_ACCEPT_LANGUAGE = DEFAULT_LANG; require_once SN_ROOT_PHYSICAL . "includes/template" . DOT_PHP_EX; $template_result = array('.' => array('result' => array())); sn_sys_load_php_files(SN_ROOT_PHYSICAL . "includes/functions/", PHP_EX); // Подключаем все модули // По нормальным делам тут надо подключать манифесты // И читать конфиги - вдруг модуль отключен? // Конфиг - часть манифеста? $sn_module = array(); $sn_module_list = array(); classSupernova::$auth = new core_auth(); sn_sys_load_php_files(SN_ROOT_PHYSICAL . "modules/", PHP_EX, true); // Здесь - потому что core_auth модуль лежит в другом каталоге и его нужно инициализировать отдельно // TODO - переработать этот костыль // new auth_local(); // pdump($sn_module); // Подключаем дефолтную страницу // По нормальным делам её надо подключать в порядке загрузки обработчиков // Сейчас мы делаем это здесь только для того, что бы содержание дефолтной страницы оказалось вверху. Что не факт, что нужно всегда // Но нужно, пока у нас есть не MVC-страницы $sn_page_data = $sn_data['pages'][$sn_page_name]; $sn_page_name_file = 'includes/pages/' . $sn_page_data['filename'] . DOT_PHP_EX; if ($sn_page_name && isset($sn_page_data) && file_exists($sn_page_name_file)) { require_once $sn_page_name_file; if (is_array($sn_page_data['options'])) { $supernova->options = array_merge($supernova->options, $sn_page_data['options']);