Пример #1
0
/**
 * 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);
}
Пример #2
0
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);
Пример #3
0
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);
}