function sn_user_birthday_celebrate() { global $config, $lang; sn_db_transaction_start(); $query = db_user_list_to_celebrate($config->user_birthday_range); while ($row = db_fetch($query)) { $row['username'] = db_escape($row['username']); rpg_points_change($row['id'], RPG_BIRTHDAY, $config->user_birthday_gift, "Birthday gift for user {$row['username']} ID {$row['id']} on his birthday on {$row['user_birthday']}. Gift last gaved at {$row['user_birthday_celebrated']}"); db_user_set_by_id($row['id'], "`user_birthday_celebrated` = '{$row['current_birthday']}'"); msg_send_simple_message($row['id'], 0, SN_TIME_NOW, MSG_TYPE_ADMIN, $lang['sys_administration'], $lang['sys_birthday'], sprintf($lang['sys_birthday_message'], $row['username'], $row['current_birthday'], $config->user_birthday_gift, $lang['sys_dark_matter_sh']), true, true); } $config->db_saveItem('user_birthday_celebrate', SN_TIME_NOW); sn_db_transaction_commit(); }
function que_build($user, $planet, $build_mode = BUILD_CREATE, $redirect = true) { global $lang, $config; $is_autoconvert = false; if ($build_mode == BUILD_AUTOCONVERT || sys_get_param_int('auto_convert')) { $build_mode = BUILD_CREATE; $is_autoconvert = true; } $unit_amount_qued = 0; try { if (!$user['id']) { throw new exception('{Нет идентификатора пользователя - сообщите Администрации}', ERR_ERROR); // TODO EXCEPTION } $unit_id = sys_get_param_int('unit_id'); /* if(!$unit_id && is_array($unit_list = sys_get_param('fmenge'))) { foreach($unit_list as $unit_id => $unit_amount) if($unit_amount) break; } */ if (!$unit_id) { throw new exception('{Нет идентификатора юнита - сообщите Администрации}', ERR_ERROR); // TODO EXCEPTION } $que_id = que_get_unit_que($unit_id); if (!$que_id) { throw new exception('{Неправильный тип очереди - сообщите Администрации}', ERR_ERROR); // TODO EXCEPTION } if ($build_mode == BUILD_DESTROY && $que_id != QUE_STRUCTURES) { throw new exception('{Уничтожать можно только здания на планете}', ERR_ERROR); // TODO EXCEPTION } $que_data = sn_get_groups('ques'); $que_data = $que_data[$que_id]; // TODO Переделать под подочереди if ($que_id == QUE_STRUCTURES) { $sn_groups_build_allow = sn_get_groups('build_allow'); $que_data['unit_list'] = $sn_groups_build_allow[$planet['planet_type']]; if (!isset($que_data['unit_list'][$unit_id])) { throw new exception('{Это здание нельзя строить на ' . ($planet['planet_type'] == PT_PLANET ? 'планете' : 'луне'), ERR_ERROR); // TODO EXCEPTION } } /* // TODO Разделить очереди для Верфи и Обороны elseif($que_id == QUE_HANGAR) { $que_data['mercenary'] = in_array($unit_id, sn_get_groups('defense')) ? MRC_FORTIFIER : MRC_ENGINEER; } elseif($que_id == QUE_HANGAR) { $que_data['mercenary'] = in_array($unit_id, sn_get_groups('defense')) ? MRC_FORTIFIER : MRC_ENGINEER; } */ sn_db_transaction_start(); // Это нужно, что бы заблокировать пользователя и работу с очередями $user = db_user_by_id($user['id']); // Это нужно, что бы заблокировать планету от списания ресурсов if (isset($planet['id']) && $planet['id']) { $planet = db_planet_by_id($planet['id'], true); } else { $planet['id'] = 0; } $planet_id = $que_id == QUE_RESEARCH ? 0 : intval($planet['id']); $que = que_get($user['id'], $planet['id'], $que_id, true); $in_que =& $que['in_que'][$que_id][$user['id']][$planet_id]; $que_max_length = que_get_max_que_length($user, $planet, $que_id, $que_data); // TODO Добавить вызовы функций проверок текущей и максимальной длин очередей if (count($in_que) >= $que_max_length) { throw new exception('{Все слоты очереди заняты}', ERR_ERROR); // TODO EXCEPTION } // TODO Отдельно посмотреть на уничтожение зданий - что бы можно было уничтожать их без планов switch (eco_can_build_unit($user, $planet, $unit_id)) { case BUILD_ALLOWED: break; case BUILD_UNIT_BUSY: throw new exception('{Строение занято}', ERR_ERROR); break; // TODO EXCEPTION eco_bld_msg_err_laboratory_upgrading // case BUILD_REQUIRE_NOT_MEET: // TODO EXCEPTION eco_bld_msg_err_laboratory_upgrading // case BUILD_REQUIRE_NOT_MEET: default: if ($build_mode == BUILD_CREATE) { throw new exception('{Требования не удовлетворены}', ERR_ERROR); } break; // TODO EXCEPTION eco_bld_msg_err_requirements_not_meet } $unit_amount = floor(sys_get_param_float('unit_amount', 1)); $unit_amount_qued = $unit_amount; $units_qued = isset($in_que[$unit_id]) ? $in_que[$unit_id] : 0; $unit_level = mrc_get_level($user, $planet, $unit_id, true, true) + $units_qued; if ($unit_max = get_unit_param($unit_id, P_MAX_STACK)) { if ($unit_level >= $unit_max) { throw new exception('{Максимальное количество юнитов данного типа уже достигнуто или будет достигнуто по окончанию очереди}', ERR_ERROR); // TODO EXCEPTION } $unit_amount = max(0, min($unit_amount, $unit_max - $unit_level)); } if ($unit_amount < 1) { throw new exception('{Неправильное количество юнитов - сообщите Администрации}', ERR_ERROR); // TODO EXCEPTION } /* if($unit_max && $unit_level + $unit_amount > $unit_max) { throw new exception("Постройка {$unit_amount} {$lang['tech'][$unit_id]} приведет к привышению максимально возможного количества юнитов данного типа", ERR_ERROR); // TODO EXCEPTION } */ // TODO Переделать eco_unit_busy для всех типов зданий // if(eco_unit_busy($user, $planet, $que, $unit_id)) // { // die('Unit busy'); // TODO EXCEPTION // } if (get_unit_param($unit_id, P_STACKABLE)) { // TODO Поле 'max_Lot_size' для ограничения размера стэка в очереди - то ли в юниты, то ли в очередь if (in_array($unit_id, $group_missile = sn_get_groups('missile'))) { // TODO Поле 'container' - указывает на родительску структуру, в которой хранится данный юнит и по вместительности которой нужно применять размер юнита $used_silo = 0; foreach ($group_missile as $missile_id) { $missile_qued = isset($in_que[$missile_id]) ? $in_que[$missile_id] : 0; $used_silo += (mrc_get_level($user, $planet, $missile_id, true, true) + $missile_qued) * get_unit_param($missile_id, P_UNIT_SIZE); } $free_silo = mrc_get_level($user, $planet, STRUC_SILO) * get_unit_param(STRUC_SILO, P_CAPACITY) - $used_silo; if ($free_silo <= 0) { throw new exception('{Ракетная шахта уже заполнена или будет заполнена по окончанию очереди}', ERR_ERROR); // TODO EXCEPTION } $unit_size = get_unit_param($unit_id, P_UNIT_SIZE); if ($free_silo < $unit_size) { throw new exception("{В ракетной шахте нет места для {$lang['tech'][$unit_id]}}", ERR_ERROR); // TODO EXCEPTION } $unit_amount = max(0, min($unit_amount, floor($free_silo / $unit_size))); } $unit_level = $new_unit_level = 0; } else { $unit_amount = 1; if ($que_id == QUE_STRUCTURES) { // if($build_mode == BUILD_CREATE && eco_planet_fields_max($planet) - $planet['field_current'] - $que['sectors'][$planet['id']] <= 0) $sectors_qued = is_array($in_que) ? array_sum($in_que) : 0; if ($build_mode == BUILD_CREATE && eco_planet_fields_max($planet) - $planet['field_current'] - $sectors_qued <= 0) { throw new exception('{Не хватает секторов на планете}', ERR_ERROR); // TODO EXCEPTION } // И что это я такое написал? Зачем? //if($build_mode == BUILD_DESTROY && $planet['field_current'] <= $que['amounts'][$que_id]) //{ // die('Too much buildings'); // TODO EXCEPTION //} } $build_multiplier = $build_mode == BUILD_CREATE ? 1 : -1; $new_unit_level = $unit_level + $unit_amount * $build_multiplier; } $build_data = eco_get_build_data($user, $planet, $unit_id, $unit_level); $exchange = array(); $market_get_autoconvert_cost = market_get_autoconvert_cost(); if ($is_autoconvert && $build_data[BUILD_AUTOCONVERT]) { $dark_matter = mrc_get_level($user, null, RES_DARK_MATTER); if (mrc_get_level($user, null, RES_DARK_MATTER) < $market_get_autoconvert_cost) { throw new exception("{Нет хватает " . ($market_get_autoconvert_cost - $dark_matter) . "ТМ на постройки с автоконвертацией ресурсов}", ERR_ERROR); // TODO EXCEPTION } !get_unit_param($unit_id, P_STACKABLE) ? $unit_amount = 1 : false; $resources_loot = sn_get_groups('resources_loot'); $resource_got = array(); $resource_exchange_rates = array(); $resource_diff = array(); $all_positive = true; foreach ($resources_loot as $resource_id) { $resource_db_name = pname_resource_name($resource_id); $resource_got[$resource_id] = floor(mrc_get_level($user, $planet, $resource_id)); $resource_exchange_rates[$resource_id] = $config->__get("rpg_exchange_{$resource_db_name}"); $resource_diff[$resource_id] = $resource_got[$resource_id] - $build_data[BUILD_CREATE][$resource_id] * $unit_amount; $all_positive = $all_positive && $resource_diff[$resource_id] > 0; } // Нужна автоконвертация if ($all_positive) { $is_autoconvert = false; } else { foreach ($resource_diff as $resource_diff_id => &$resource_diff_amount) { if ($resource_diff_amount >= 0) { continue; } foreach ($resource_diff as $resource_got_id => &$resource_got_amount) { if ($resource_got_amount <= 0) { continue; } $current_exchange = $resource_exchange_rates[$resource_got_id] / $resource_exchange_rates[$resource_diff_id]; $will_exchage_to = min(-$resource_diff_amount, floor($resource_got_amount * $current_exchange)); $will_exchage_from = $will_exchage_to / $current_exchange; $resource_diff_amount += $will_exchage_to; $resource_got_amount -= $will_exchage_from; $exchange[$resource_diff_id] += $will_exchage_to; $exchange[$resource_got_id] -= $will_exchage_from; } } $is_autoconvert_ok = true; foreach ($resource_diff as $resource_diff_amount2) { if ($resource_diff_amount2 < 0) { $is_autoconvert_ok = false; break; } } if ($is_autoconvert_ok) { $build_data['RESULT'][$build_mode] = BUILD_ALLOWED; $build_data['CAN'][$build_mode] = $unit_amount; } else { $unit_amount = 0; } } } $unit_amount = min($build_data['CAN'][$build_mode], $unit_amount); if ($unit_amount <= 0) { throw new exception('{Не хватает ресурсов}', ERR_ERROR); // TODO EXCEPTION } if ($new_unit_level < 0) { throw new exception('{Нельзя уничтожить больше юнитов, чем есть}', ERR_ERROR); // TODO EXCEPTION } if ($build_data['RESULT'][$build_mode] != BUILD_ALLOWED) { throw new exception('{Строительство блокировано}', ERR_ERROR); // TODO EXCEPTION } if ($is_autoconvert) { ksort($exchange); ksort($resource_got); db_change_units($user, $planet, array(RES_METAL => !empty($exchange[RES_METAL]) ? $exchange[RES_METAL] : 0, RES_CRYSTAL => !empty($exchange[RES_CRYSTAL]) ? $exchange[RES_CRYSTAL] : 0, RES_DEUTERIUM => !empty($exchange[RES_DEUTERIUM]) ? $exchange[RES_DEUTERIUM] : 0)); rpg_points_change($user['id'], RPG_BUILD_AUTOCONVERT, -$market_get_autoconvert_cost, sprintf($lang['bld_autoconvert'], $unit_id, $unit_amount, uni_render_planet_full($planet, '', false, true), $lang['tech'][$unit_id], sys_unit_arr2str($build_data[BUILD_CREATE]), sys_unit_arr2str($resource_got), sys_unit_arr2str($exchange))); } $unit_amount_qued = 0; while ($unit_amount > 0 && count($que['ques'][$que_id][$user['id']][$planet_id]) < $que_max_length) { $place = min($unit_amount, MAX_FLEET_OR_DEFS_PER_ROW); que_add_unit($unit_id, $user, $planet, $build_data, $new_unit_level, $place, $build_mode); $unit_amount -= $place; $que = que_get($user['id'], $planet['id'], $que_id, true); $unit_amount_qued += $place; } sn_db_transaction_commit(); if ($redirect) { sys_redirect("{$_SERVER['PHP_SELF']}?mode=" . sys_get_param_str('mode') . "&ally_id=" . sys_get_param_id('ally_id')); die; } $operation_result = array('STATUS' => ERR_NONE, 'MESSAGE' => '{Строительство начато}'); } catch (exception $e) { sn_db_transaction_rollback(); $operation_result = array('STATUS' => in_array($e->getCode(), array(ERR_NONE, ERR_WARNING, ERR_ERROR)) ? $e->getCode() : ERR_ERROR, 'MESSAGE' => $e->getMessage()); } if (!empty($operation_result['MESSAGE'])) { $operation_result['MESSAGE'] .= ' ' . ($unit_amount_qued ? $unit_amount_qued : $unit_amount) . 'x[' . $lang['tech'][$unit_id] . ']'; } return $operation_result; }
*/ if (sys_get_param_str('prize_calculate') && $blitz_prize_players_active && ($blitz_prize_dark_matter_actual = sys_get_param_int('blitz_prize_dark_matter'))) { // $blitz_prize_dark_matter_actual = sys_get_param_int('blitz_prize_dark_matter'); $blitz_prize_places_actual = sys_get_param_int('blitz_prize_places'); sn_db_transaction_start(); $query = doquery("SELECT * FROM {{blitz_registrations}} WHERE `round_number` = {$current_round} ORDER BY `blitz_place` FOR UPDATE;"); while ($row = db_fetch($query)) { if (!$row['blitz_place']) { continue; } $blitz_prize_dark_matter_actual = round($blitz_prize_dark_matter_actual / 2); $blitz_prize_places_actual--; $reward = $blitz_prize_dark_matter_actual - $row['blitz_reward_dark_matter']; pdump("{{$row['id']}} {$row['blitz_name']}, Place {$row['blitz_place']}, Prize places {$blitz_prize_places_actual}, Prize {$reward}", $row['id']); if ($reward) { rpg_points_change($row['user_id'], RPG_BLITZ, $reward, sprintf($lang['sys_blitz_reward_log_message'], $row['blitz_place'], $row['blitz_name'])); doquery("UPDATE {{blitz_registrations}} SET blitz_reward_dark_matter = blitz_reward_dark_matter + ({$reward}) WHERE id = {$row['id']} AND `round_number` = {$current_round};"); } if (!$blitz_prize_places_actual || $blitz_prize_dark_matter_actual < 1000) { break; } } sn_db_transaction_commit(); } } } $template = gettemplate('blitz_register', true); $player_registered = false; $query = doquery("SELECT u.*, br.blitz_name, br.blitz_password, br.blitz_place, br.blitz_status, br.blitz_points, br.blitz_reward_dark_matter\n FROM {{blitz_registrations}} AS br\n JOIN {{users}} AS u ON u.id = br.user_id\n WHERE br.`round_number` = {$current_round}\n order by `blitz_place`, `timestamp`;"); while ($row = db_fetch($query)) { $tpl_player_data = array('NAME' => player_nick_render_to_html($row, array('icons' => true, 'color' => true, 'ally' => true)));
} $uni_row = doquery("select * from `{{universe}}` where `universe_galaxy` = {$uni_galaxy} and `universe_system` = {$uni_system} limit 1;", '', true); $uni_row['universe_price'] += $uni_system ? $config->uni_price_system : $config->uni_price_galaxy; $uni_row['universe_name'] = strip_tags($uni_row['universe_name'] ? $uni_row['universe_name'] : ($uni_system ? "{$lang['sys_system']} [{$uni_galaxy}:{$uni_system}]" : "{$lang['sys_galaxy']} {$uni_galaxy}")); if (sys_get_param_str('uni_name_submit')) { $uni_row['universe_name'] = strip_tags(sys_get_param_str('uni_name')); $uni_price = sys_get_param_float('uni_price'); if ($uni_price < $uni_row['universe_price']) { throw new exception($lang['uni_msg_error_low_price'], ERR_ERROR); } $uni_row['universe_price'] = $uni_price; sn_db_transaction_start(); $user = db_user_by_id($user['id'], true); // if($user[get_unit_param(RES_DARK_MATTER, P_NAME)] < $uni_price) if (mrc_get_level($user, null, RES_DARK_MATTER) < $uni_price) { throw new exception($lang['uni_msg_error_no_dm'], ERR_ERROR); } if (!rpg_points_change($user['id'], RPG_RENAME, -$uni_price, "Renaming [{$uni_galaxy}:{$uni_system}] to " . sys_get_param_str_unsafe('uni_name'))) { throw new exception($lang['sys_msg_err_update_dm'], ERR_ERROR); } doquery("replace {{universe}} set `universe_galaxy` = {$uni_galaxy}, `universe_system` = {$uni_system}, `universe_name` = '{$uni_row['universe_name']}', `universe_price` = {$uni_row['universe_price']};"); $debug->warning(sprintf($lang['uni_msg_admin_rename'], $user['id'], $user['username'], $uni_price, $uni_system ? $lang['uni_system_of'] : $lang['uni_galaxy_of'], $uni_galaxy, $uni_system ? ":{$uni_system}" : '', strip_tags(sys_get_param_str_unsafe('uni_name'))), $lang['uni_naming'], LOG_INFO_UNI_RENAME); sn_db_transaction_commit(); sys_redirect("galaxy.php?mode=name&galaxy={$uni_galaxy}&system={$uni_system}"); } } catch (exception $e) { sn_db_transaction_rollback(); $template->assign_block_vars('result', array('STATUS' => in_array($e->getCode(), array(ERR_NONE, ERR_WARNING, ERR_ERROR)) ? $e->getCode() : ERR_ERROR, 'MESSAGE' => $e->getMessage())); } $template->assign_vars(array('GALAXY' => $uni_galaxy, 'SYSTEM' => $uni_system, 'NAME' => sys_safe_output($uni_row['universe_name']), 'PRICE' => $uni_row['universe_price'], 'PAGE_HINT' => $lang['uni_name_page_hint'])); display($template, $lang['sys_universe'] . ' - ' . $lang['uni_naming'], true, '', false);
// Конвертация ММ в ТМ if (sys_get_param('mm_convert_do')) { try { if (!($mm_convert = sys_get_param_id('mm_convert'))) { throw new exception($lang['pay_msg_mm_convert_wrong_amount'], ERR_ERROR); } sn_db_transaction_start(); $user = db_user_by_id($user['id'], true); if ($mm_convert > mrc_get_level($user, null, RES_METAMATTER)) { throw new exception($lang['pay_msg_mm_convert_not_enough'], ERR_ERROR); } $payment_comment = sprintf("Игрок сконвертировал %d Метаматерии в Тёмную Материю", $mm_convert); if (!mm_points_change($user['id'], RPG_CONVERT_MM, -$mm_convert, $payment_comment)) { throw new exception($lang['pay_msg_mm_convert_mm_error'], ERR_ERROR); } if (!rpg_points_change($user['id'], RPG_CONVERT_MM, $mm_convert, $payment_comment)) { throw new exception($lang['pay_msg_mm_convert_dm_error'], ERR_ERROR); } $template->assign_block_vars('result', array('STATUS' => ERR_NONE, 'MESSAGE' => sprintf('Конвертация %1$s единиц Метаматерии в %1$s единиц Тёмной Материи успешно произведена', pretty_number($mm_convert)))); sn_db_transaction_commit(); } catch (exception $e) { sn_db_transaction_rollback(); $template->assign_block_vars('result', $response = array('STATUS' => $e->getCode(), 'MESSAGE' => $e->getMessage())); } } // Таблица скидок $prev_discount = 0; if (isset(sn_module_payment::$bonus_table) && is_array(sn_module_payment::$bonus_table)) { foreach (sn_module_payment::$bonus_table as $sum => $discount) { if ($discount && $discount != $prev_discount) { $template->assign_block_vars('discount', array('SUM' => $sum, 'DISCOUNT' => $discount * 100, 'DISCOUNT_ONE' => 1 + $discount, 'TEXT' => sprintf($lang['pay_mm_bonus_each'], pretty_number($sum), round($discount * 100))));
} 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(); } sn_db_transaction_commit(); sys_redirect('overview.php?mode=manage'); die; } lng_include('mrc_mercenary'); int_planet_pretemplate($planetrow, $template); foreach (sn_get_groups('governors') as $governor_id) { if ($planetrow['planet_type'] == PT_MOON && $governor_id == MRC_TECHNOLOGIST) { continue; } $governor_level = $planetrow['PLANET_GOVERNOR_ID'] == $governor_id ? $planetrow['PLANET_GOVERNOR_LEVEL'] : 0; $build_data = eco_get_build_data($user, $planetrow, $governor_id, $governor_level);
if ($user['authlevel'] < 3) { AdminMessage($lang['adm_err_denied']); } $template = gettemplate("admin/admin_darkmatter", true); $message = ''; $message_status = ERR_ERROR; if ($points = sys_get_param_float('points')) { // If points not empty... if ($username = sys_get_param_str_unsafe('id_user')) { $row = db_user_by_id($username, false, 'id, username', true, true); if (!isset($row['id'])) { $row = db_user_by_username($username, false, 'id, username', true, true); } if (is_array($row) && isset($row['id'])) { // Does anything post to DB? if (rpg_points_change($row['id'], RPG_ADMIN, $points, sprintf($lang['adm_matter_change_log_record'], $row['id'], db_escape($row['username']), $user['id'], db_escape($user['username']), db_escape(sys_get_param_str('reason'))))) { $message = sprintf($lang['adm_dm_user_added'], $row['username'], $row['id'], $points); $isNoError = true; $message_status = ERR_NONE; } else { // No? We will say it to user... $message = $lang['adm_dm_add_err']; } } } else { // Points not empty but destination is not set - this means error $message = $lang['adm_dm_no_dest']; } } elseif ($id_user) { // Points is empty but destination is set - this again means error $message = $lang['adm_dm_no_quant'];
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; }
function rpg_level_up(&$user, $type, $xp_to_add = 0) { $q = 1.03; switch ($type) { case RPG_STRUCTURE: $field_level = 'lvl_minier'; $field_xp = 'xpminier'; $xp =& $user['xpminier']; $b1 = 50; $comment = 'Level Up For Structure Building'; break; case RPG_RAID: $field_level = 'lvl_raid'; $field_xp = 'xpraid'; $xp =& $user['xpraid']; $b1 = 10; $comment = 'Level Up For Raiding'; break; } if ($xp_to_add) { $xp += $xp_to_add; doquery("UPDATE `{{users}}` SET `{$field_xp}` = `{$field_xp}` + '{$xp_to_add}' WHERE `id` = '{$user['id']}' LIMIT 1;"); } $level = $user[$field_level]; while ($xp >= rpg_xp_for_level($level, $b1, $q)) { $level++; } $level -= $user[$field_level]; if ($level > 0) { doquery("UPDATE `{{users}}` SET `{$field_level}` = `{$field_level}` + '{$level}' WHERE `id` = '{$user['id']}' LIMIT 1;"); rpg_points_change($user['id'], $type, $level, $comment); $user[$field_level] += $level; $user[$sn_data_dark_matter_db_name] += $level; } }
$sn_group_artifacts = sn_get_groups('artifacts'); if (($action = sys_get_param_int('action')) && in_array($unit_id = sys_get_param_int('unit_id'), $sn_group_artifacts)) { switch ($action) { case ACTION_BUY: sn_db_transaction_start(); $user = db_user_by_id($user['id'], true); $artifact_level = mrc_get_level($user, array(), $unit_id, true); $build_data = eco_get_build_data($user, $planetrow, $unit_id, $artifact_level, true); $darkmater_cost = $build_data[BUILD_CREATE][RES_DARK_MATTER]; // TODO: more correct check - with "FOR UPDATE" if (mrc_get_level($user, null, RES_DARK_MATTER) >= $darkmater_cost) { $unit_max_stack = get_unit_param($unit_id, P_MAX_STACK); if (!isset($unit_max_stack) || $unit_max_stack > mrc_get_level($user, $planetrow, $unit_id)) { $db_changeset['unit'][] = sn_db_unit_changeset_prepare($unit_id, 1, $user); db_changeset_apply($db_changeset); rpg_points_change($user['id'], RPG_ARTIFACT, -$darkmater_cost, "Spent for artifact {$lang['tech'][$unit_id]} ID {$unit_id}"); sn_db_transaction_commit(); header("Location: artifacts.php#{$unit_id}"); ob_end_flush(); die; } else { $Message = $lang['off_maxed_out']; } } else { $Message = $lang['sys_no_points']; } sn_db_transaction_rollback(); break; case ACTION_USE: art_use($user, $planetrow, $unit_id); header("Location: artifacts.php#{$unit_id}");
function mrc_mercenary_hire($mode, $user, $mercenary_id) { global $config, $lang, $sn_powerup_buy_discounts; try { $is_permanent = $mode == UNIT_PLANS || !$config->empire_mercenary_temporary; $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; if (!in_array($mercenary_id, sn_get_groups($mode == UNIT_PLANS ? 'plans' : 'mercenaries'))) { throw new Exception($lang['mrc_msg_error_wrong_mercenary'], ERR_ERROR); } if (!mrc_officer_accessible($user, $mercenary_id)) { throw new Exception($lang['mrc_msg_error_requirements'], ERR_ERROR); } $mercenary_level = sys_get_param_int('mercenary_level'); if ($mercenary_level < 0 || $mercenary_level > get_unit_param($mercenary_id, P_MAX_STACK)) { throw new Exception($lang['mrc_msg_error_wrong_level'], ERR_ERROR); } if ($mercenary_level && !array_key_exists($mercenary_period = sys_get_param_int('mercenary_period'), $sn_powerup_buy_discounts)) { throw new Exception($lang['mrc_msg_error_wrong_period'], ERR_ERROR); } sn_db_transaction_start(); $mercenary_level_old = mrc_get_level($user, $planetrow, $mercenary_id, true, true); if ($config->empire_mercenary_temporary && $mercenary_level_old && $mercenary_level) { throw new Exception($lang['mrc_msg_error_already_hired'], ERR_ERROR); // Can't hire already hired temp mercenary - dismiss first } elseif ($config->empire_mercenary_temporary && !$mercenary_level_old && !$mercenary_level) { throw new Exception('', ERR_NONE); // Can't dismiss (!$mercenary_level) not hired (!$mercenary_level_old) temp mercenary. But no error } if ($mercenary_level) { $darkmater_cost = eco_get_total_cost($mercenary_id, $mercenary_level); if (!$config->empire_mercenary_temporary && $mercenary_level_old) { $darkmater_cost_old = eco_get_total_cost($mercenary_id, $mercenary_level_old); $darkmater_cost[BUILD_CREATE][RES_DARK_MATTER] -= $darkmater_cost_old[BUILD_CREATE][RES_DARK_MATTER]; } $darkmater_cost = ceil($darkmater_cost[BUILD_CREATE][RES_DARK_MATTER] * $mercenary_period * $sn_powerup_buy_discounts[$mercenary_period] / $config->empire_mercenary_base_period); } else { $darkmater_cost = 0; } $darkmater_cost *= $cost_alliance_multiplyer; if (mrc_get_level($user, null, RES_DARK_MATTER) < $darkmater_cost) { throw new Exception($lang['mrc_msg_error_no_resource'], ERR_ERROR); } if ($darkmater_cost && $mercenary_level || !$is_permanent) { $unit_row = db_unit_by_location($user['id'], LOC_USER, $user['id'], $mercenary_id); if (is_array($unit_row) && ($dismiss_left_days = floor((strtotime($unit_row['unit_time_finish']) - SN_TIME_NOW) / PERIOD_DAY))) { $dismiss_full_cost = eco_get_total_cost($mercenary_id, $unit_row['unit_level']); $dismiss_full_cost = $dismiss_full_cost[BUILD_CREATE][RES_DARK_MATTER]; $dismiss_full_days = round((strtotime($unit_row['unit_time_finish']) - strtotime($unit_row['unit_time_start'])) / PERIOD_DAY); /* print(sprintf($lang['mrc_mercenary_dismissed_log'], $lang['tech'][$mercenary_id], $mercenary_id, $dismiss_full_cost, $dismiss_full_days, $unit_row['unit_time_start'], $unit_row['unit_time_finish'], $dismiss_left_days, floor($dismiss_full_cost * $dismiss_left_days / $dismiss_full_days) )); */ rpg_points_change($user['id'], RPG_MERCENARY_DISMISSED, 0, sprintf($lang['mrc_mercenary_dismissed_log'], $lang['tech'][$mercenary_id], $mercenary_id, $dismiss_full_cost, $dismiss_full_days, $unit_row['unit_time_start'], $unit_row['unit_time_finish'], $dismiss_left_days, floor($dismiss_full_cost * $dismiss_left_days / $dismiss_full_days))); } db_unit_list_delete($user['id'], LOC_USER, $user['id'], $mercenary_id); } if ($darkmater_cost && $mercenary_level) { db_unit_set_insert("unit_player_id = {$user['id']},\n unit_location_type = " . LOC_USER . ",\n unit_location_id = {$user['id']},\n unit_type = {$mode},\n unit_snid = {$mercenary_id},\n unit_level = {$mercenary_level},\n unit_time_start = " . (!$is_permanent ? 'FROM_UNIXTIME(' . SN_TIME_NOW . ')' : 'null') . ",\n unit_time_finish = " . (!$is_permanent ? 'FROM_UNIXTIME(' . (SN_TIME_NOW + $mercenary_period) . ')' : 'null')); rpg_points_change($user['id'], $mode == UNIT_PLANS ? RPG_PLANS : RPG_MERCENARY, -$darkmater_cost, sprintf($lang[$mode == UNIT_PLANS ? 'mrc_plan_bought_log' : 'mrc_mercenary_hired_log'], $lang['tech'][$mercenary_id], $mercenary_id, $darkmater_cost, round($mercenary_period / PERIOD_DAY))); } sn_db_transaction_commit(); sys_redirect($_SERVER['REQUEST_URI']); } catch (Exception $e) { sn_db_transaction_rollback(); $operation_result = array('STATUS' => in_array($e->getCode(), array(ERR_NONE, ERR_WARNING, ERR_ERROR)) ? $e->getCode() : ERR_ERROR, 'MESSAGE' => $e->getMessage()); } return $operation_result; }
function flt_mission_explore(&$mission_data) { if (!isset($mission_data['fleet_event']) || $mission_data['fleet_event'] != EVENT_FLT_ACOMPLISH) { return CACHE_NONE; } global $lang, $config; static $ship_data, $rates; $result = array('$mission_data' => $mission_data, '$outcome_list' => array(), '$mission_outcome' => FLT_EXPEDITION_OUTCOME_NONE, '$outcome_value' => 0, '$outcome_percent' => 0, '$outcome_mission_sub' => -1, '$fleet' => array(), '$fleet_lost' => array(), '$found_dark_matter' => 0, '$fleet_metal_points' => 0); $fleet =& $result['$fleet']; // $fleet_left = &$result['$fleet_left']; $fleet_lost =& $result['$fleet_lost']; $outcome_mission_sub =& $result['$outcome_mission_sub']; $outcome_percent =& $result['$outcome_percent']; $found_dark_matter =& $result['$found_dark_matter']; $mission_outcome =& $result['$mission_outcome']; $outcome_value =& $result['$outcome_value']; $outcome_list =& $result['$outcome_list']; $fleet_metal_points =& $result['$fleet_metal_points']; if (!$ship_data) { foreach (sn_get_groups('fleet') as $unit_id) { $unit_info = get_unit_param($unit_id); if ($unit_info[P_UNIT_TYPE] != UNIT_SHIPS || !isset($unit_info['engine'][0]['speed']) || !$unit_info['engine'][0]['speed']) { continue; } $ship_data[$unit_id][P_COST_METAL] = get_unit_cost_in($unit_info[P_COST]); } $rates = get_resource_exchange(); } $fleet_row = $mission_data['fleet']; $fleet = sys_unit_str2arr($fleet_row['fleet_array']); $fleet_capacity = 0; $fleet_metal_points = 0; foreach ($fleet as $ship_id => $ship_amount) { $unit_info = get_unit_param($ship_id); $fleet_capacity += $ship_amount * $unit_info[P_CAPACITY]; $fleet_metal_points += $ship_amount * $ship_data[$ship_id][P_COST_METAL]; } $fleet_capacity = max(0, $fleet_capacity - $fleet_row['fleet_resource_metal'] + $fleet_row['fleet_resource_crystal'] + $fleet_row['fleet_resource_deuterium']); $flt_stay_hours = ($fleet_row['fleet_end_stay'] - $fleet_row['fleet_start_time']) / 3600 * ($config->game_speed_expedition ? $config->game_speed_expedition : 1); $outcome_list = sn_get_groups('mission_explore_outcome_list'); $outcome_list[FLT_EXPEDITION_OUTCOME_NONE]['chance'] = ceil(200 / pow($flt_stay_hours, 1 / 1.7)); $chance_max = 0; foreach ($outcome_list as $key => &$value) { if (!$value['chance']) { unset($outcome_list[$key]); continue; } $value['value'] = $chance_max = $value['chance'] + $chance_max; } $outcome_value = mt_rand(0, $chance_max); // $outcome_value = 409; $outcome_description =& $outcome_list[$mission_outcome = FLT_EXPEDITION_OUTCOME_NONE]; foreach ($outcome_list as $key => &$value) { if (!$value['chance']) { continue; } $mission_outcome = $key; $outcome_description = $value; if ($outcome_value <= $outcome_description['value']) { break; } } // Вычисляем вероятность выпадения данного числа в общем пуле $msg_sender = $lang['flt_mission_expedition']['msg_sender']; $msg_title = $lang['flt_mission_expedition']['msg_title']; $outcome_percent = ($outcome_description['value'] - $outcome_value) / $outcome_description['chance']; $msg_text = ''; $msg_text_addon = ''; $found_dark_matter = 0; // $outcome_mission_sub = -1; switch ($mission_outcome) { // switch(FLT_EXPEDITION_OUTCOME_LOST_FLEET) { // TODO DEBUG! case FLT_EXPEDITION_OUTCOME_LOST_FLEET: flt_mission_explore_outcome_lost_fleet($result); // // $fleet_left = 1 - mt_rand(1, 3) * 0.25;// * 0.25; // $fleet_left = 1 - mt_rand(1, 3) * mt_rand(200000, 300000) / 1000000; // $fleet_lost = array(); // foreach($fleet as $unit_id => &$unit_amount) { // $ships_left = floor($unit_amount * $fleet_left); // $fleet_lost[$unit_id] = $unit_amount - $ships_left; // $unit_amount = $ships_left; // if(!$unit_amount) { // unset($fleet[$unit_id]); // } // } break; case FLT_EXPEDITION_OUTCOME_LOST_FLEET_ALL: flt_mission_explore_outcome_lost_fleet_all($result); // $fleet_lost = $fleet; // $fleet = array(); break; case FLT_EXPEDITION_OUTCOME_FOUND_FLEET: $outcome_mission_sub = $outcome_percent >= 0.99 ? 0 : ($outcome_percent >= 0.9 ? 1 : 2); $outcome_percent = $outcome_description['percent'][$outcome_mission_sub]; // Рассчитываем эквивалент найденного флота в метале // $found_in_metal = min($outcome_percent * $fleet_metal_points, $config->resource_multiplier * 10000000); // game_speed $found_in_metal = min($outcome_percent * $fleet_metal_points, game_resource_multiplier(true) * 10000000); // game_speed // 13 243 754 000 g x1 // 60 762 247 000 a x10 // 308 389 499 488 000 b x500 // Рассчитываем стоимость самого дорого корабля в металле $max_metal_cost = 0; foreach ($fleet as $ship_id => $ship_amount) { $max_metal_cost = max($max_metal_cost, $ship_data[$ship_id]['metal_cost']); } // Ограничиваем корабли только теми, чья стоимость в металле меньше или равно стоимости самого дорогого корабля $can_be_found = array(); foreach ($ship_data as $ship_id => $ship_info) { if ($ship_info['metal_cost'] < $max_metal_cost) { $can_be_found[$ship_id] = $ship_info['metal_cost']; } } // Убираем колонизаторы и шпионов - миллиарды шпионов и колонизаторов нам не нужны unset($can_be_found[SHIP_COLONIZER]); unset($can_be_found[SHIP_SPY]); $fleet_found = array(); while (count($can_be_found) && $found_in_metal >= max($can_be_found)) { $found_index = mt_rand(1, count($can_be_found)) - 1; $found_ship = array_slice($can_be_found, $found_index, 1, true); $found_ship_cost = reset($found_ship); $found_ship_id = key($found_ship); if ($found_ship_cost > $found_in_metal) { unset($can_be_found[$found_ship_id]); } else { $found_ship_count = mt_rand(1, floor($found_in_metal / $found_ship_cost)); $fleet_found[$found_ship_id] += $found_ship_count; $found_in_metal -= $found_ship_count * $found_ship_cost; } } if (empty($fleet_found)) { $msg_text_addon = $lang['flt_mission_expedition']['outcomes'][$mission_outcome]['no_result']; } else { foreach ($fleet_found as $unit_id => $unit_amount) { $fleet[$unit_id] += $unit_amount; } } break; case FLT_EXPEDITION_OUTCOME_FOUND_RESOURCES: $outcome_mission_sub = $outcome_percent >= 0.99 ? 0 : ($outcome_percent >= 0.9 ? 1 : 2); $outcome_percent = $outcome_description['percent'][$outcome_mission_sub]; // Рассчитываем количество найденных ресурсов $found_in_metal = ceil(min($outcome_percent * $fleet_metal_points, game_resource_multiplier(true) * 10000000, $fleet_capacity) * mt_rand(950000, 1050000) / 1000000); // game_speed $resources_found[RES_METAL] = floor(mt_rand(300000, 700000) / 1000000 * $found_in_metal); $found_in_metal -= $resources_found[RES_METAL]; $found_in_metal = floor($found_in_metal * $rates[RES_METAL] / $rates[RES_CRYSTAL]); $resources_found[RES_CRYSTAL] = floor(mt_rand(500000, 1000000) / 1000000 * $found_in_metal); $found_in_metal -= $resources_found[RES_CRYSTAL]; $found_in_metal = floor($found_in_metal * $rates[RES_CRYSTAL] / $rates[RES_DEUTERIUM]); $resources_found[RES_DEUTERIUM] = $found_in_metal; $fleet_row['fleet_resource_metal'] += $resources_found[RES_METAL]; $fleet_row['fleet_resource_crystal'] += $resources_found[RES_CRYSTAL]; $fleet_row['fleet_resource_deuterium'] += $resources_found[RES_DEUTERIUM]; if (array_sum($resources_found) == 0) { $msg_text_addon = $lang['flt_mission_expedition']['outcomes'][$mission_outcome]['no_result']; } break; case FLT_EXPEDITION_OUTCOME_FOUND_DM: $outcome_mission_sub = $outcome_percent >= 0.99 ? 0 : ($outcome_percent >= 0.9 ? 1 : 2); $outcome_percent = $outcome_description['percent'][$outcome_mission_sub]; // Рассчитываем количество найденной ТМ $found_dark_matter = floor(min($outcome_percent * $fleet_metal_points / $rates[RES_DARK_MATTER], 10000) * mt_rand(750000, 1000000) / 1000000); if (!$found_dark_matter) { $msg_text_addon = $lang['flt_mission_expedition']['outcomes'][$mission_outcome]['no_result']; } break; case FLT_EXPEDITION_OUTCOME_FOUND_ARTIFACT: break; default: break; } flt_mission_explore_addon($result); $query_data = array(); if ($found_dark_matter) { rpg_points_change($fleet_row['fleet_owner'], RPG_EXPEDITION, $found_dark_matter, 'Expedition Bonus'); $msg_text_addon = sprintf($lang['flt_mission_expedition']['found_dark_matter'], $found_dark_matter); } if (!empty($fleet_lost)) { $msg_text_addon = $lang['flt_mission_expedition']['lost_fleet']; foreach ($fleet_lost as $ship_id => $ship_amount) { $msg_text_addon .= $lang['tech'][$ship_id] . ' - ' . $ship_amount . "\r\n"; } } $fleet_row['fleet_amount'] = array_sum($fleet); if (!empty($fleet) && $fleet_row['fleet_amount']) { if (!empty($fleet_found)) { $msg_text_addon = $lang['flt_mission_expedition']['found_fleet']; foreach ($fleet_found as $ship_id => $ship_amount) { $msg_text_addon .= $lang['tech'][$ship_id] . ' - ' . $ship_amount . "\r\n"; } } if (!empty($resources_found) && array_sum($resources_found) > 0) { $msg_text_addon = $lang['flt_mission_expedition']['found_resources']; foreach ($resources_found as $ship_id => $ship_amount) { $msg_text_addon .= $lang['tech'][$ship_id] . ' - ' . $ship_amount . "\r\n"; } $query_data[] = "`fleet_resource_metal` = `fleet_resource_metal` + {$resources_found[RES_METAL]}"; $query_data[] = "`fleet_resource_crystal` = `fleet_resource_crystal` + {$resources_found[RES_CRYSTAL]}"; $query_data[] = "`fleet_resource_deuterium` = `fleet_resource_deuterium` + {$resources_found[RES_DEUTERIUM]}"; } if (!empty($fleet_lost) || !empty($fleet_found)) { $fleet_row['fleet_array'] = sys_unit_arr2str($fleet); $query_data[] = "`fleet_amount` = {$fleet_row['fleet_amount']}"; $query_data[] = "`fleet_array` = '{$fleet_row['fleet_array']}'"; } $query_data[] = '`fleet_mess` = 1'; $query_data = "UPDATE {{fleets}} SET " . implode(',', $query_data); } else { // Удалить флот $query_data = "DELETE FROM {{fleets}}"; } $query_data .= " WHERE `fleet_id` = {$fleet_row['fleet_id']} LIMIT 1"; doquery($query_data); db_user_set_by_id($fleet_row['fleet_owner'], "`player_rpg_explore_xp` = `player_rpg_explore_xp` + 1"); if (!$msg_text) { $messages =& $lang['flt_mission_expedition']['outcomes'][$mission_outcome]['messages']; if ($outcome_mission_sub >= 0 && is_array($messages)) { $messages =& $messages[$outcome_mission_sub]; } $msg_text = is_string($messages) ? $messages : (is_array($messages) ? $messages[mt_rand(0, count($messages) - 1)] : ''); } $msg_text = sprintf($msg_text, $fleet_row['fleet_id'], uni_render_coordinates($fleet_row, 'fleet_end_')) . ($msg_text_addon ? "\r\n" . $msg_text_addon : ''); msg_send_simple_message($fleet_row['fleet_owner'], '', $fleet_row['fleet_end_stay'], MSG_TYPE_EXPLORE, $msg_sender, $msg_title, $msg_text); return CACHE_FLEET | CACHE_USER_SRC; }
public function metamatter_change($change_type, $metamatter, $comment = false, $already_changed = false) { global $debug, $mm_change_legit, $config; if (!$this->is_exists || !($metamatter = round(floatval($metamatter)))) { $debug->error('Ошибка при попытке манипуляции с ММ'); return false; } $account_id_safe = $this->db->db_escape($this->account_id); $mm_change_legit = true; // $sn_data_metamatter_db_name = pname_resource_name(RES_METAMATTER); if ($already_changed) { $metamatter_total_delta = 0; $result = -1; } else { $metamatter_total_delta = $metamatter > 0 ? $metamatter : 0; $result = $this->db->doquery("UPDATE {{account}}\n SET\n `account_metamatter` = `account_metamatter` + '{$metamatter}'" . ($metamatter_total_delta ? ", `account_immortal` = IF(`account_metamatter_total` + '{$metamatter_total_delta}' >= {$config->player_metamatter_immortal}, NOW(), `account_immortal`), `account_metamatter_total` = `account_metamatter_total` + '{$metamatter_total_delta}'" : '') . " WHERE `account_id` = {$account_id_safe}"); if (!$result) { $debug->error("Error adjusting Metamatter for player ID {$this->account_id} (Player Not Found?) with {$metamatter}. Reason: {$comment}", 'Metamatter Change', 402); } $result = classSupernova::$db->db_affected_rows(); } if (empty(core_auth::$user['id'])) { $user_list = PlayerToAccountTranslate::db_translate_get_users_from_account_list(core_auth::$main_provider->provider_id, $this->account_id); reset($user_list); $user_id_unsafe = key($user_list); } else { $user_id_unsafe = core_auth::$user['id']; } $user_id_safe = $this->db->db_escape($user_id_unsafe); if (!$result) { $debug->error("Error adjusting Metamatter for player ID {$this->account_id} (Player Not Found?) with {$metamatter}. Reason: {$comment}", 'Metamatter Change', 402); } if (!$already_changed) { $this->account_metamatter += $metamatter; $this->account_metamatter_total += $metamatter_total_delta; } if (is_array($comment)) { $comment = call_user_func_array('sprintf', $comment); } $result = $this->db_mm_log_insert($comment, $change_type, $metamatter, $user_id_unsafe); if ($metamatter > 0 && !empty($user_id_safe)) { $old_referral = doquery("SELECT * FROM {{referrals}} WHERE `id` = {$user_id_safe} LIMIT 1 FOR UPDATE;", '', true); if ($old_referral['id']) { $dark_matter_from_metamatter = $metamatter * AFFILIATE_MM_TO_REFERRAL_DM; doquery("UPDATE {{referrals}} SET dark_matter = dark_matter + '{$dark_matter_from_metamatter}' WHERE `id` = {$user_id_safe} LIMIT 1;"); $new_referral = doquery("SELECT * FROM {{referrals}} WHERE `id` = {$user_id_safe} 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_BOUGHT_MM, $partner_bonus, "Incoming MM From Referral ID {$user_id_safe}"); } } } $mm_change_legit = false; return $result; }
function qst_reward(&$user, &$planet, &$rewards, &$quest_list) { global $lang, $sn_data; foreach ($rewards as $quest_id => $rewards_list_string) { $comment_reward = array(); $planet_reward = array(); $user_reward = array(); $user_reward_dm = 0; $comment = sprintf($lang['qst_msg_complete_body'], $quest_list[$quest_id]['quest_name']); $rewards_list_array = explode(';', $rewards_list_string); foreach ($rewards_list_array as $reward_string) { list($reward_id, $reward_amount) = explode(',', $reward_string); $reward_db_name = $sn_data[$reward_id]['name']; $reward_db_string = "`{$reward_db_name}` = `{$reward_db_name}` + {$reward_amount}"; if ($reward_id == RES_DARK_MATTER) { $user_reward_dm = $reward_amount; } if ($sn_data[$reward_id]['location'] == LOC_USER) { $user[$reward_db_name] += $reward_amount; $user_reward[] = $reward_db_string; } elseif ($sn_data[$reward_id]['location'] == LOC_PLANET) { $planet[$reward_db_name] += $reward_amount; $planet_reward[] = $reward_db_string; } else { continue; } $comment_reward[] = $reward_amount . ' ' . $lang['tech'][$reward_id]; } if (!empty($comment_reward)) { $comment .= " {$lang['qst_msg_your_reward']} " . implode(',', $comment_reward); if (!empty($user_reward)) { $user_reward = implode(',', $user_reward); doquery("UPDATE {{users}} SET {$user_reward} WHERE `id` = {$user['id']} LIMIT 1;"); if ($user_reward_dm) { rpg_points_change($user['id'], RPG_QUEST, $user_reward_dm, $comment, true); } } if (!empty($planet_reward)) { $planet_reward = implode(',', $planet_reward); doquery("UPDATE {{planets}} SET {$planet_reward} WHERE `id` = {$planet['id']} LIMIT 1;"); } } sn_db_perform('{{quest_status}}', array('quest_status_quest_id' => $quest_id, 'quest_status_user_id' => $user['id'], 'quest_status_status' => QUEST_STATUS_COMPLETE)); msg_send_simple_message($user['id'], 0, $time_now, MSG_TYPE_ADMIN, $lang['msg_from_admin'], $lang['qst_msg_complete_subject'], $comment); } }
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); }
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); } }
/** * MissionCaseExpedition.php * * version 2.0 returns results for new fleet handler * @version 1.0 * @copyright 2008 By Chlorel for XNova */ function flt_mission_explore($mission_data) { global $lang, $sn_data; $fleet_row = $mission_data['fleet']; $FleetOwner = $fleet_row['fleet_owner']; $MessSender = $lang['sys_mess_qg']; $MessTitle = $lang['sys_expe_report']; // La Flotte vient de finir son exploration // Table de ratio de points par type de vaisseau $PointsFlotte = array(SHIP_CARGO_SMALL => 1.0, SHIP_CARGO_BIG => 1.5, SHIP_CARGO_SUPER => 1.0, SHIP_FIGHTER_LIGHT => 0.5, SHIP_FIGHTER_HEAVY => 1.5, SHIP_FIGHTER_ASSAULT => 3.0, SHIP_DESTROYER => 2.0, SHIP_CRUISER => 2.5, SHIP_COLONIZER => 0.5, SHIP_RECYCLER => 1.0, SHIP_SPY => 0.0, SHIP_BOMBER => 3.0, SHIP_SATTELITE_SOLAR => 0.0, SHIP_DESTRUCTOR => 3.5, SHIP_DEATH_STAR => 5.0, SHIP_BATTLESHIP => 3.2, SHIP_SUPERNOVA => 9.9); // Table de ratio de gains en nombre par type de vaisseau $RatioGain = array(SHIP_CARGO_SMALL => 0.1, SHIP_CARGO_BIG => 0.1, SHIP_FIGHTER_LIGHT => 0.1, SHIP_FIGHTER_HEAVY => 0.05, SHIP_FIGHTER_ASSAULT => 0.0125, SHIP_DESTROYER => 0.25, SHIP_CRUISER => 0.125, SHIP_COLONIZER => 0.05, SHIP_CARGO_SUPER => 0.05, SHIP_RECYCLER => 0.1, SHIP_SPY => 0.1, SHIP_BOMBER => 0.0625, SHIP_SATTELITE_SOLAR => 0.0, SHIP_DESTRUCTOR => 0.0625, SHIP_DEATH_STAR => 0.03125, SHIP_BATTLESHIP => 0.0625, SHIP_SUPERNOVA => 0.00125); $FleetStayDuration = ($fleet_row['fleet_end_stay'] - $fleet_row['fleet_start_time']) / 3600; // Initialisation du contenu de la Flotte $farray = explode(';', $fleet_row['fleet_array']); foreach ($farray as $Item => $Group) { if ($Group != '') { $Class = explode(',', $Group); $TypeVaisseau = $Class[0]; $NbreVaisseau = $Class[1]; $LaFlotte[$TypeVaisseau] = $NbreVaisseau; //On calcul les ressources maximum qui peuvent être récupéré $FleetCapacity += $sn_data[$TypeVaisseau]['capacity']; // Maintenant on calcul en points toute la flotte $FleetPoints += $NbreVaisseau * $PointsFlotte[$TypeVaisseau]; } } // Espace deja occupé dans les soutes si ce devait etre le cas $FleetUsedCapacity = $fleet_row['fleet_resource_metal'] + $fleet_row['fleet_resource_crystal'] + $fleet_row['fleet_resource_deuterium']; $FleetCapacity -= $FleetUsedCapacity; //On récupère le nombre total de vaisseaux $FleetCount = $fleet_row['fleet_amount']; // Bon on les mange comment ces explorateurs ??? $Hasard = mt_rand(0, 10); $MessSender = "{$lang['sys_mess_qg']} ({$Hasard})"; if ($Hasard < 3) { // Pas de bol, on les mange tout crus $Hasard += 1; $LostAmount = ($Hasard * 33 + 1) / 100; // Message pour annoncer la bonne mauvaise nouvelle if ($LostAmount == 100) { // Supprimer effectivement la flotte msg_send_simple_message($FleetOwner, '', $fleet_row['fleet_end_stay'], MSG_TYPE_EXPLORE, $MessSender, $MessTitle, $lang['sys_expe_blackholl_2']); doquery("DELETE FROM {{fleets}} WHERE `fleet_id` = {$fleet_row['fleet_id']}"); } else { foreach ($LaFlotte as $Ship => $Count) { $LostShips[$Ship] = intval($Count * $LostAmount); $NewFleetArray .= $Ship . ',' . ($Count - $LostShips[$Ship]) . ';'; } doquery("UPDATE {{fleets}} SET `fleet_array` = '{$NewFleetArray}', `fleet_mess` = '1' WHERE `fleet_id` = '{$fleet_row['fleet_id']}';"); msg_send_simple_message($FleetOwner, '', $fleet_row['fleet_end_stay'], MSG_TYPE_EXPLORE, $MessSender, $MessTitle, $lang['sys_expe_blackholl_1']); } } elseif ($Hasard == 3) { // Ah un tour pour rien doquery("UPDATE {{fleets}} SET `fleet_mess` = '1' WHERE `fleet_id` = {$fleet_row['fleet_id']}"); rpg_points_change($fleet_row['fleet_owner'], RPG_EXPEDITION, 1, 'Expedition Bonus'); msg_send_simple_message($FleetOwner, '', $fleet_row['fleet_end_stay'], MSG_TYPE_EXPLORE, $MessSender, $MessTitle, $lang['sys_expe_nothing_1']); } elseif ($Hasard >= 4 && $Hasard < 7) { // Gains de ressources if ($FleetCapacity > 5000) { $MinCapacity = $FleetCapacity - 5000; $MaxCapacity = $FleetCapacity; $FoundGoods = rand($MinCapacity, $MaxCapacity); $FoundMetal = intval($FoundGoods / 2); $FoundCrist = intval($FoundGoods / 4); $FoundDeute = intval($FoundGoods / 6); $QryUpdateFleet = "UPDATE {{fleets}} SET "; $QryUpdateFleet .= "`fleet_resource_metal` = `fleet_resource_metal` + '{$FoundMetal}', "; $QryUpdateFleet .= "`fleet_resource_crystal` = `fleet_resource_crystal` + '{$FoundCrist}', "; $QryUpdateFleet .= "`fleet_resource_deuterium` = `fleet_resource_deuterium` + '{$FoundDeute}', "; $QryUpdateFleet .= "`fleet_mess` = '1' "; $QryUpdateFleet .= "WHERE `fleet_id` = '{$fleet_row['fleet_id']}';"; doquery($QryUpdateFleet); $Message = sprintf($lang['sys_expe_found_goods'], pretty_number($FoundMetal), $lang['Metal'], pretty_number($FoundCrist), $lang['Crystal'], pretty_number($FoundDeute), $lang['Deuterium']); msg_send_simple_message($FleetOwner, '', $fleet_row['fleet_end_stay'], MSG_TYPE_EXPLORE, $MessSender, $MessTitle, $Message); } } elseif ($Hasard == 7) { // Ah un tour pour rien doquery("UPDATE {{fleets}} SET `fleet_mess` = '1' WHERE `fleet_id` = {$fleet_row['fleet_id']}"); msg_send_simple_message($FleetOwner, '', $fleet_row['fleet_end_stay'], MSG_TYPE_EXPLORE, $MessSender, $MessTitle, $lang['sys_expe_nothing_2']); } elseif ($Hasard >= 8 && $Hasard < 11) { // Gain de vaisseaux $FoundChance = $FleetPoints / $FleetCount; foreach ($sn_data['groups']['fleet'] as $Ship) { if ($LaFlotte[$Ship] != 0) { $FoundShip[$Ship] = round($LaFlotte[$Ship] * $RatioGain[$Ship]); if ($FoundShip[$Ship] > 0) { $LaFlotte[$Ship] += $FoundShip[$Ship]; } } } $NewFleetArray = ''; $FoundShipMess = ''; foreach ($LaFlotte as $Ship => $Count) { if ($Count > 0) { $NewFleetArray .= "{$Ship},{$Count};"; } } if ($FoundShip) { foreach ($FoundShip as $Ship => $Count) { if ($Count != 0) { $FoundShipMess .= "{$Count} {$lang['tech'][$Ship]},"; } } } doquery("UPDATE {{fleets}} SET `fleet_array` = '{$NewFleetArray}', `fleet_mess` = '1' WHERE `fleet_id` = '{$fleet_row['fleet_id']}' LIMIT 1;"); $Message = "{$lang['sys_expe_found_ships']}{$FoundShipMess}"; msg_send_simple_message($FleetOwner, '', $fleet_row['fleet_end_stay'], MSG_TYPE_EXPLORE, $MessSender, $MessTitle, $Message); } return CACHE_FLEET | CACHE_USER_SRC; }
$error_id = 'adm_dm_planet_conflict_id'; } if (preg_match(PLANET_COORD_PREG, $id_planet, $preg)) { $queryPart = " or (`galaxy` = {$preg[1]} and `system` = {$preg[2]} and `planet` = {$preg[3]} and `planet_type` = 1)"; $error_id = 'adm_dm_planet_conflict_coords'; } $query = doquery("SELECT id, name, id_owner, galaxy, system, planet FROM {{planets}} WHERE `name` like '{$id_planet}'" . $queryPart); switch (mysql_num_rows($query)) { case 0: // Error - no such planet ID or name or coordinates $message = sprintf($lang['adm_dm_planet_none'], $id_planet); break; case 1: // Proceeding normal - only one user exists $row = mysql_fetch_assoc($query); if (rpg_points_change($row['id_owner'], RPG_ADMIN, $points, "Through admin interface to planet '{$row['name']} ID: {$row['id']} for user ID: {$row['id_owner']} " . $reason)) { $message = sprintf($lang['adm_dm_planet_added'], $row['id_owner'], $row['name'], $row['id'], uni_render_coordinates($row), $points); $isNoError = true; } else { $message = $lang['adm_dm_add_err']; } break; default: // There too much results - can't apply $message = $lang['adm_dm_planet_conflict'] . sprintf($lang[$error_id], mb_strtoupper($id_planet)); break; } } else { $message = $lang['adm_dm_no_dest']; } } elseif ($id_user || $id_planet) {
function rpg_level_up(&$user, $type, $xp_to_add = 0) { $q = 1.03; switch ($type) { case RPG_STRUCTURE: $field_level = 'lvl_minier'; $field_xp = 'xpminier'; $b1 = 50; $comment = 'Level Up For Structure Building'; break; case RPG_RAID: $field_level = 'lvl_raid'; $field_xp = 'xpraid'; $b1 = 10; $comment = 'Level Up For Raiding'; break; case RPG_TECH: $field_level = 'player_rpg_tech_level'; $field_xp = 'player_rpg_tech_xp'; $b1 = 50; $comment = 'Level Up For Research'; break; case RPG_EXPLORE: $field_level = 'player_rpg_explore_level'; $field_xp = 'player_rpg_explore_xp'; $b1 = 10; $comment = 'Level Up For Exploration'; $q = 1.05; break; default: break; } $xp =& $user[$field_xp]; if ($xp_to_add) { $xp += $xp_to_add; db_user_set_by_id($user['id'], "`{$field_xp}` = `{$field_xp}` + '{$xp_to_add}'"); } $level = $user[$field_level]; while ($xp > rpg_xp_for_level($level + 1, $b1, $q)) { $level++; } $level -= $user[$field_level]; if ($level > 0) { db_user_set_by_id($user['id'], "`{$field_level}` = `{$field_level}` + '{$level}'"); rpg_points_change($user['id'], $type, $level * 1000, $comment); $user[$field_level] += $level; } }
lng_include('infos'); //darkmater constant $darkmater_cost = $config->rpg_officer; $sn_data_dark_matter_db_name = $sn_data[RES_DARK_MATTER]['name']; // Si recrutement d'un officier if ($mode == 2) { if ($user[$sn_data_dark_matter_db_name] >= $darkmater_cost) { $Selected = $offi; if (in_array($Selected, $sn_data['groups']['mercenaries'])) { $Result = IsOfficierAccessible($user, $Selected); if ($Result == 1) { $selected_db_name = $sn_data[$Selected]['name']; $user[$selected_db_name] += 1; $user[$sn_data_dark_matter_db_name] -= $darkmater_cost; doquery("UPDATE {{users}} SET `{$selected_db_name}` = `{$selected_db_name}` + 1 WHERE `id` = '{$user['id']}';"); rpg_points_change($user['id'], RPG_MERCENARY, -$darkmater_cost, "Spent for officer {$lang['tech'][$Selected]} ID {$Selected}"); $Message = $lang['off_recruited']; header("Location: officer.php"); ob_end_flush(); die; } elseif ($Result == -1) { $Message = $lang['off_maxed_out']; } elseif ($Result == 0) { $Message = $lang['off_not_available']; } } } else { $Message = $lang['off_no_points']; } message($Message, $lang['tech'][600], 'officer.' . PHP_EX, 5); } else {