function sn_ube_combat_result_apply(&$combat_data)
{
    // TODO: Поменять все отладки на запросы
    $destination_user_id = $combat_data[UBE_FLEETS][0][UBE_OWNER];
    $outcome =& $combat_data[UBE_OUTCOME];
    $planet_info =& $outcome[UBE_PLANET];
    $planet_id = $planet_info[PLANET_ID];
    // Обновляем поле обломков на планете
    if (!$combat_data[UBE_OPTIONS][UBE_COMBAT_ADMIN] && !empty($outcome[UBE_DEBRIS])) {
        db_planet_set_by_gspt($planet_info[PLANET_GALAXY], $planet_info[PLANET_SYSTEM], $planet_info[PLANET_PLANET], PT_PLANET, "`debris_metal` = `debris_metal` + " . floor($outcome[UBE_DEBRIS][RES_METAL]) . ", `debris_crystal` = `debris_crystal` + " . floor($outcome[UBE_DEBRIS][RES_CRYSTAL]));
    }
    $db_save = array(UBE_FLEET_GROUP => array());
    $fleets_outcome =& $outcome[UBE_FLEETS];
    foreach ($combat_data[UBE_FLEETS] as $fleet_id => &$fleet_info) {
        if ($fleet_info[UBE_FLEET_GROUP]) {
            $db_save[UBE_FLEET_GROUP][$fleet_info[UBE_FLEET_GROUP]] = $fleet_info[UBE_FLEET_GROUP];
        }
        $fleet_info[UBE_COUNT] = $fleet_info[UBE_COUNT] ? $fleet_info[UBE_COUNT] : array();
        $fleets_outcome[$fleet_id][UBE_UNITS_LOST] = $fleets_outcome[$fleet_id][UBE_UNITS_LOST] ? $fleets_outcome[$fleet_id][UBE_UNITS_LOST] : array();
        $fleet_query = array();
        $db_changeset = array();
        $old_fleet_count = array_sum($fleet_info[UBE_COUNT]);
        $new_fleet_count = $old_fleet_count - array_sum($fleets_outcome[$fleet_id][UBE_UNITS_LOST]);
        // Перебираем юниты если во время боя количество юнитов изменилось и при этом во флоту остались юниты или это планета
        if ($new_fleet_count != $old_fleet_count && (!$fleet_id || $new_fleet_count)) {
            // Просматриваем результаты изменения флотов
            foreach ($fleet_info[UBE_COUNT] as $unit_id => $unit_count) {
                // Перебираем аутком на случай восстановления юнитов
                $units_lost = (double) $fleets_outcome[$fleet_id][UBE_UNITS_LOST][$unit_id];
                $units_left = $unit_count - $units_lost;
                if ($fleet_id) {
                    // Не планета - всегда сразу записываем строку итогов флота
                    $fleet_query[$unit_id] = "{$unit_id},{$units_left}";
                } elseif ($units_lost) {
                    // Планета - записываем в ИД юнита его потери только если есть потери
                    // $unit_db_name = get_unit_param($unit_id, P_NAME);
                    // $fleet_query[$unit_id] = "`{$unit_db_name}` = `{$unit_db_name}` - {$units_lost}";
                    // pdump($fleet_info);
                    // die();
                    $db_changeset['unit'][] = sn_db_unit_changeset_prepare($unit_id, -$units_lost, $combat_data[UBE_PLAYERS][$destination_user_id][UBE_PLAYER_DATA], $planet_id);
                }
            }
            if ($fleet_id) {
                // Для флотов перегенерируем массив как одно вхождение в SET SQL-запроса
                $fleet_query = implode(';', $fleet_query);
                $fleet_query = array("`fleet_array` = '{$fleet_query}'");
            }
        }
        // Если во флоте остались юниты или это планета - генерируем изменение ресурсов
        if ($new_fleet_count || !$fleet_id) {
            foreach (sn_get_groups('resources_loot') as $resource_id) {
                $resource_change = (double) $fleets_outcome[$fleet_id][UBE_RESOURCES_LOOTED][$resource_id] + (double) $fleets_outcome[$fleet_id][UBE_CARGO_DROPPED][$resource_id];
                if ($resource_change) {
                    $resource_db_name = ($fleet_id ? 'fleet_resource_' : '') . pname_resource_name($resource_id);
                    $fleet_query[] = "`{$resource_db_name}` = `{$resource_db_name}` - ({$resource_change})";
                }
            }
        }
        /*
            if(empty($fleet_query))
            {
              continue;
            }
        */
        if ($fleet_id && $new_fleet_count) {
            // Если защитник и не РМФ - отправляем флот назад
            if ($fleet_info[UBE_FLEET_TYPE] == UBE_DEFENDERS && !$outcome[UBE_SFR] || $fleet_info[UBE_FLEET_TYPE] == UBE_ATTACKERS) {
                $fleet_query[] = '`fleet_mess` = 1';
            }
            // Если флот в группе - помечаем нулем
            //      if($fleet_info[UBE_FLEET_GROUP])
            //      {
            //        $fleet_query[] = '`fleet_group` = 0';
            //      }
        }
        //global $debug;
        $fleet_query = implode(',', $fleet_query);
        if ($fleet_id) {
            if ($fleet_info[UBE_FLEET_TYPE] == UBE_ATTACKERS && $outcome[UBE_MOON_REAPERS] == UBE_MOON_REAPERS_DIED) {
                $new_fleet_count = 0;
            }
            if ($new_fleet_count) {
                if ($fleet_query) {
                    doquery("UPDATE {{fleets}} SET {$fleet_query}, `fleet_amount` = '{$new_fleet_count}' WHERE `fleet_id` = {$fleet_id} LIMIT 1");
                }
            } else {
                // Удаляем пустые флоты
                doquery("DELETE FROM {{fleets}} WHERE `fleet_id` = {$fleet_id} LIMIT 1");
                db_unit_list_delete(0, LOC_FLEET, $fleet_id, 0);
            }
        } else {
            // Сохраняем изменения ресурсов - если они есть
            if ($fleet_query) {
                db_planet_set_by_id($planet_id, $fleet_query);
            }
            if (!empty($db_changeset)) {
                db_changeset_apply($db_changeset);
            }
        }
    }
    // TODO: Связать сабы с флотами констраинтами ON DELETE SET NULL
    // $db_save[UBE_FLEET_GROUP][$fleet_info[UBE_FLEET_GROUP]] = $fleet_info[UBE_FLEET_GROUP];
    if (!empty($db_save[UBE_FLEET_GROUP])) {
        $db_save[UBE_FLEET_GROUP] = implode(',', $db_save[UBE_FLEET_GROUP]);
        doquery("DELETE FROM {{aks}} WHERE `id` IN ({$db_save[UBE_FLEET_GROUP]})");
    }
    if ($outcome[UBE_MOON] == UBE_MOON_CREATE_SUCCESS) {
        $moon_row = uni_create_moon($planet_info[PLANET_GALAXY], $planet_info[PLANET_SYSTEM], $planet_info[PLANET_PLANET], $destination_user_id, $outcome[UBE_MOON_SIZE], '', false);
        $outcome[UBE_MOON_NAME] = $moon_row['name'];
        unset($moon_row);
    } elseif ($outcome[UBE_MOON] == UBE_MOON_DESTROY_SUCCESS) {
        db_planet_delete_by_id($planet_id);
    }
    $bashing_list = array();
    foreach ($combat_data[UBE_PLAYERS] as $player_id => $player_info) {
        if ($player_info[UBE_ATTACKER]) {
            if ($outcome[UBE_MOON] != UBE_MOON_DESTROY_SUCCESS) {
                $bashing_list[] = "({$player_id}, {$planet_id}, {$combat_data[UBE_TIME]})";
            }
            if ($combat_data[UBE_OPTIONS][UBE_MISSION_TYPE] == MT_ATTACK && $combat_data[UBE_OPTIONS][UBE_DEFENDER_ACTIVE]) {
                $str_loose_or_win = $outcome[UBE_COMBAT_RESULT] == UBE_COMBAT_RESULT_WIN ? 'raidswin' : 'raidsloose';
                db_user_set_by_id($player_id, "`xpraid` = `xpraid` + 1, `raids` = `raids` + 1, `{$str_loose_or_win}` = `{$str_loose_or_win}` + 1");
            }
        }
    }
    $bashing_list = implode(',', $bashing_list);
    if ($bashing_list) {
        doquery("INSERT INTO {{bashing}} (bashing_user_id, bashing_planet_id, bashing_time) VALUES {$bashing_list};");
    }
}
Exemple #2
0
function CheckAbandonPlanetState(&$planet)
{
    if ($planet['destruyed'] && $planet['destruyed'] <= SN_TIME_NOW) {
        db_planet_delete_by_id($planet['id']);
    }
}