/** * PlanetResourceUpdate.php * * 2.1 - copyright (c) 2010 by Gorlum for http://supernova.ws * [+] Bit more optimization * 2.0 - copyright (c) 2009-2010 by Gorlum for http://supernova.ws * [+] Full rewrote and optimization * 1.1 - @copyright 2008 By Chlorel for XNova * [*] Mise a jour automatique mines / silos / energie ... * 1.0 - @copyright 2008 By Chlorel for XNova * [*] Mise en module initiale */ function sys_o_get_updated($user, $planet, $UpdateTime, $simulation = false) { global $time_now, $sn_data, $lang; $no_data = array('user' => false, 'planet' => false, 'que' => false); if (!$planet) { return $no_data; } $suffix = $simulation ? '' : 'FOR UPDATE'; if (is_array($planet)) { if (!(isset($planet['id']) && $planet['id']) || !$simulation) { $planet = doquery("SELECT * FROM `{{planets}}` WHERE `galaxy` = '{$planet['galaxy']}' AND `system` = '{$planet['system']}' AND `planet` = '{$planet['planet']}' and `planet_type` = '{$planet['planet_type']}' LIMIT 1 {$suffix};", '', true); } } else { $planet = doquery("SELECT * FROM `{{planets}}` WHERE `id` = '{$planet}' LIMIT 1 {$suffix};", '', true); } if (!($planet && isset($planet['id']) && $planet['id'])) { return $no_data; } if (!$user || !is_array($user) || !isset($user['id'])) { $user = doquery("SELECT * FROM `{{users}}` WHERE `id` = {$planet['id_owner']} LIMIT 1 {$suffix};", '', true); if (!$user) { return $no_data; } } $ProductionTime = max(0, $UpdateTime - $planet['last_update']); $planet['last_update'] += $ProductionTime; $Caps = ECO_getPlanetCaps($user, $planet); $incRes = array('metal' => 0, 'crystal' => 0, 'deuterium' => 0); switch ($planet['planet_type']) { case PT_PLANET: foreach ($incRes as $resName => &$incCount) { // $Caps['planet'][$resName] = max(0, $Caps['planet'][$resName]); $incCount = ($Caps[$resName . '_perhour'][0] + $Caps['planet'][$resName . '_perhour'] * $Caps['production']) * $ProductionTime / 3600; $store_free = $Caps['planet'][$resName . '_max'] - $Caps['planet'][$resName]; // $incCount = max(0, min($incCount, max(0, $store_free))); $incCount = min($incCount, max(0, $store_free)); if ($planet[$resName] + $incCount < 0) { $GLOBALS['debug']->warning("Player ID {$user['id']} have negative resources on ID {$planet['id']}.{$planet['planet_type']} [{$planet['galaxy']}:{$planet['system']}:{$planet['planet']}]. Difference {$planet[$resName]} of {$resName}", 'Negative Resources', 501); } $Caps['planet'][$resName] += $incCount; $Caps['planet'][$resName . '_perhour'] = $Caps['real'][$resName . '_perhour']; } break; case PT_MOON: default: $planet['metal_perhour'] = 0; $planet['crystal_perhour'] = 0; $planet['deuterium_perhour'] = 0; $planet['energy_used'] = 0; $planet['energy_max'] = 0; break; } $planet = array_merge($planet, $Caps['planet']); $que = eco_que_process($user, $planet, $ProductionTime); if ($simulation) { return array('user' => $user, 'planet' => $planet, 'que' => $que); } $QryUpdatePlanet = "UPDATE {{planets}} SET `last_update` = '{$planet['last_update']}', "; $QryUpdatePlanet .= "`metal` = `metal` + '{$incRes['metal']}', `crystal` = `crystal` + '{$incRes['crystal']}', `deuterium` = `deuterium` + '{$incRes['deuterium']}', "; $QryUpdatePlanet .= "`metal_perhour` = '{$planet['metal_perhour']}', `crystal_perhour` = '{$planet['crystal_perhour']}', `deuterium_perhour` = '{$planet['deuterium_perhour']}', "; $QryUpdatePlanet .= "`energy_used` = '{$planet['energy_used']}', `energy_max` = '{$planet['energy_max']}', "; $built = eco_bld_handle_que($user, $planet, $ProductionTime); if ($built['built']) { foreach ($built['built'] as $Element => $Count) { $Element = intval($Element); $Count = intval($Count); if ($Element) { $QryUpdatePlanet .= "`{$sn_data[$Element]['name']}` = `{$sn_data[$Element]['name']}` + '{$Count}', "; } } if (!$planet['b_hangar']) { msg_send_simple_message($user['id'], 0, $time_now, MSG_TYPE_QUE, $lang['msg_que_planet_from'], $lang['msg_que_hangar_subject'], sprintf($lang['msg_que_hangar_message'], uni_render_planet($planet))); } } $QryUpdatePlanet .= "`b_hangar_id` = '{$planet['b_hangar_id']}', "; $QryUpdatePlanet .= "`b_hangar` = '{$planet['b_hangar']}' "; $QryUpdatePlanet .= $que['query'] != $planet['que'] ? ",{$que['query']} " : ''; if (!empty($que['built'])) { $message = array(); foreach ($que['built'] as $unit_id => $built_count) { if ($built_count > 0) { $message[] = sprintf($lang['msg_que_built_message'], uni_render_planet($planet), $lang['tech'][$unit_id], $built_count); } else { $message[] = sprintf($lang['msg_que_destroy_message'], uni_render_planet($planet), $lang['tech'][$unit_id], -$built_count); } } msg_send_simple_message($user['id'], 0, $time_now, MSG_TYPE_QUE, $lang['msg_que_planet_from'], $lang['msg_que_built_subject'], implode('<br />', $message)); } $QryUpdatePlanet .= "WHERE `id` = '{$planet['id']}' LIMIT 1;"; doquery($QryUpdatePlanet); if (!empty($que['xp'])) { foreach ($que['xp'] as $xp_type => $xp_amount) { rpg_level_up($user, $xp_type, $xp_amount); } } // Can't use array_merge here - it will broke numeric array indexes those broke quest_id // TODO: Make own function for this foreach ($built['rewards'] as $quest_id => $quest_reward) { $que['rewards'][$quest_id] = $quest_reward; } qst_reward($user, $planet, $que['rewards'], $que['quests']); $planet['planet_caps'] = $Caps; return array('user' => $user, 'planet' => $planet, 'que' => $que); }
require '../common.' . substr(strrchr(__FILE__, '.'), 1); // if($user['authlevel'] < 2) if ($user['authlevel'] < 3) { AdminMessage($lang['adm_err_denied']); } AdminMessage('Временно не работает'); require "includes/admin_planet_edit.inc" . DOT_PHP_EX; $template = gettemplate('admin/admin_planet_edit', true); $mode = admin_planet_edit_mode($template, $admin_planet_edit_mode_list); $planet_id = sys_get_param_id('planet_id'); $unit_list = sys_get_param('unit_list'); if (sys_get_param('change_data') && !empty($unit_list)) { $query_string = array(); foreach ($unit_list as $unit_id => $unit_amount) { if ($unit_query_string = admin_planet_edit_query_string($unit_id, $unit_amount, $mode)) { $query_string[] = $unit_query_string; } } if (!empty($query_string)) { db_planet_set_by_id($planet_id, implode(', ', $query_string)); } } if ($planet_id) { $edit_planet_row = db_planet_by_id($planet_id); admin_planet_edit_template($template, $edit_planet_row, $mode); } foreach ($admin_planet_edit_mode_list as $page_mode => $mode_locale) { $template->assign_block_vars('page_menu', array('ID' => $page_mode, 'TEXT' => $mode_locale)); } $template->assign_vars(array('MODE' => $mode, 'PLANET_ID' => $planet_id, 'PLANET_NAME' => empty($edit_planet_row) ? '' : $lang['sys_planet_type'][$edit_planet_row['planet_type']] . ' ' . uni_render_planet($edit_planet_row), 'PAGE_HINT' => $lang['adm_planet_edit_hint'])); display($template, $lang['adm_am_ttle'], false, '', true);
function sn_sys_sector_buy($redirect = 'overview.php') { global $lang, $user, $planetrow; if (!sys_get_param_str('sector_buy') || $planetrow['planet_type'] != PT_PLANET) { return; } sn_db_transaction_start(); $user = db_user_by_id($user['id'], true, '*'); $planetrow = db_planet_by_id($planetrow['id'], true, '*'); // Тут не надо делать обсчет - ресурсы мы уже посчитали, очередь (и количество зданий) - тоже // $planetrow = sys_o_get_updated($user, $planetrow, SN_TIME_NOW); // $user = $planetrow['user']; // $planetrow = $planetrow['planet']; $sector_cost = eco_get_build_data($user, $planetrow, UNIT_SECTOR, mrc_get_level($user, $planetrow, UNIT_SECTOR), true); $sector_cost = $sector_cost[BUILD_CREATE][RES_DARK_MATTER]; if ($sector_cost <= $user[get_unit_param(RES_DARK_MATTER, P_NAME)]) { $planet_name_text = uni_render_planet($planetrow); if (rpg_points_change($user['id'], RPG_SECTOR, -$sector_cost, sprintf($lang['sys_sector_purchase_log'], $user['username'], $user['id'], $planet_name_text, $lang['sys_planet_type'][$planetrow['planet_type']], $planetrow['id'], $sector_cost))) { $sector_db_name = pname_resource_name(UNIT_SECTOR); db_planet_set_by_id($planetrow['id'], "{$sector_db_name} = {$sector_db_name} + 1"); } else { sn_db_transaction_rollback(); } } sn_db_transaction_commit(); sys_redirect($redirect); }