function flt_t_send_fleet($user, &$from, $to, $fleet, $mission, $options = array()) { //ini_set('error_reporting', E_ALL); //doquery('SET autocommit = 0;'); //doquery('LOCK TABLES {{users}} READ, {{planets}} WRITE, {{fleet}} WRITE, {{aks}} WRITE, {{statpoints}} READ;'); doquery('START TRANSACTION;'); $from = sys_o_get_updated($user, $from['id'], $GLOBALS['time_now']); $from = $from['planet']; $speed_factor = get_fleet_speed(); $distance = GetTargetDistance($from['galaxy'], $to['galaxy'], $from['system'], $to['system'], $from['planet'], $to['planet']); $fleet_speed = min(GetFleetMaxSpeed($fleet, 0, $user)); $duration = GetMissionDuration(10, $fleet_speed, $distance, $speed_factor); $consumption = GetFleetConsumption($fleet, $speed_factor, $duration, $distance, $fleet_speed, $user); //!! $fleet_group = 0; //!! $options = array(); $can_attack = flt_can_attack($from, $to, $fleet, $mission, $options); if ($can_attack != ATTACK_ALLOWED) { doquery('ROLLBACK'); return $can_attack; } global $time_now, $sn_data; $fleet_start_time = $time_now + $duration; if ($mission == MT_EXPLORE or $mission == MT_HOLD) { $stay_duration = $options['stay_time'] * 3600; $stay_time = $fleet_start_time + $stay_duration; } else { $stay_duration = 0; $stay_time = 0; } $fleet_end_time = $fleet_start_time + $duration + $stay_duration; $fleet_ship_count = 0; $fleet_string = ''; $planet_sub_query = ''; foreach ($fleet as $unit_id => $amount) { if (!$amount || !$unit_id) { continue; } if (in_array($unit_id, $sn_data['groups']['fleet'])) { $fleet_ship_count += $amount; $fleet_string .= "{$unit_id},{$amount};"; } $planet_sub_query .= "`{$sn_data[$unit_id]['name']}` = `{$sn_data[$unit_id]['name']}` - {$amount},"; } $to['id_owner'] = intval($to['id_owner']); $QryInsertFleet = "INSERT INTO {{fleets}} SET "; $QryInsertFleet .= "`fleet_owner` = '{$user['id']}', "; $QryInsertFleet .= "`fleet_mission` = '{$mission}', "; $QryInsertFleet .= "`fleet_amount` = '{$fleet_ship_count}', "; $QryInsertFleet .= "`fleet_array` = '{$fleet_string}', "; $QryInsertFleet .= "`fleet_start_time` = '{$fleet_start_time}', "; $QryInsertFleet .= "`fleet_start_galaxy` = '{$from['galaxy']}', "; $QryInsertFleet .= "`fleet_start_system` = '{$from['system']}', "; $QryInsertFleet .= "`fleet_start_planet` = '{$from['planet']}', "; $QryInsertFleet .= "`fleet_start_type` = '{$from['planet_type']}', "; $QryInsertFleet .= "`fleet_end_time` = '{$fleet_end_time}', "; $QryInsertFleet .= "`fleet_end_stay` = '{$stay_time}', "; $QryInsertFleet .= "`fleet_end_galaxy` = '{$to['galaxy']}', "; $QryInsertFleet .= "`fleet_end_system` = '{$to['system']}', "; $QryInsertFleet .= "`fleet_end_planet` = '{$to['planet']}', "; $QryInsertFleet .= "`fleet_end_type` = '{$to['planet_type']}', "; $QryInsertFleet .= "`fleet_resource_metal` = '{$fleet[RES_METAL]}', "; $QryInsertFleet .= "`fleet_resource_crystal` = '{$fleet[RES_CRYSTAL]}', "; $QryInsertFleet .= "`fleet_resource_deuterium` = '{$fleet[RES_DEUTERIUM]}', "; $QryInsertFleet .= "`fleet_target_owner` = '{$to['id_owner']}', "; $QryInsertFleet .= "`fleet_group` = '{$fleet_group}', "; $QryInsertFleet .= "`start_time` = '{$time_now}';"; doquery($QryInsertFleet); $QryUpdatePlanet = "UPDATE {{planets}} SET {$planet_sub_query} `deuterium` = `deuterium` - '{$consumption}' WHERE `id` = '{$from['id']}' LIMIT 1;"; doquery($QryUpdatePlanet); if (BE_DEBUG) { debug($QryInsertFleet); debug($QryUpdatePlanet); } doquery("COMMIT;"); // doquery('SET autocommit = 1;'); $from = doquery("SELECT * FROM {{planets}} WHERE `id` = '{$from['id']}' LIMIT 1;", '', true); return ATTACK_ALLOWED; //ini_set('error_reporting', E_ALL ^ E_NOTICE); }
function flt_can_attack($planet_src, $planet_dst, $fleet = array(), $mission, $options = false) { global $config, $sn_data, $user, $time_now; if ($user['vacation']) { return ATTACK_OWN_VACATION; } if (empty($fleet) || !is_array($fleet)) { return ATTACK_NO_FLEET; } foreach ($fleet as $ship_id => $ship_count) { if ($ship_count > $planet_src[$sn_data[$ship_id]['name']]) { return ATTACK_NO_SHIPS; } } $speed = $options['speed']; if ($speed && ($speed != intval($speed) || $speed < 1 || $speed > 10)) { return ATTACK_WRONG_SPEED; } $speed_factor = get_fleet_speed(); $distance = GetTargetDistance($planet_src['galaxy'], $planet_dst['galaxy'], $planet_src['system'], $planet_dst['system'], $planet_src['planet'], $planet_dst['planet']); $fleet_speed = min(GetFleetMaxSpeed($fleet, 0, $user)); $fleet_speed_percent = $options['fleet_speed_percent'] ? $options['fleet_speed_percent'] : 10; $duration = GetMissionDuration($fleet_speed_percent, $fleet_speed, $distance, $speed_factor); $consumption = GetFleetConsumption($fleet, $speed_factor, $duration, $distance, $fleet_speed, $user, $fleet_speed_percent); if ($planet_src[$sn_data[RES_DEUTERIUM]['name']] < $fleet[RES_DEUTERIUM] + $consumption) { return ATTACK_NO_FUEL; } $fleet_start_time = $time_now + $duration; $fleet_group = $options['fleet_group']; if ($fleet_group) { if ($mission != MT_AKS) { return ATTACK_WRONG_MISSION; } $acs = doquery("SELECT * FROM {{aks}} WHERE id = '{$fleet_group}' LIMIT 1;", '', true); if (!$acs['id']) { return ATTACK_NO_ACS; } if ($planet_dst['galaxy'] != $acs['galaxy'] || $planet_dst['system'] != $acs['system'] || $planet_dst['planet'] != $acs['planet'] || $planet_dst['planet_type'] != $acs['planet_type']) { return ATTACK_ACS_WRONG_TARGET; } if ($fleet_start_time > $acs['ankunft']) { return ATTACK_ACS_TOO_LATE; } } $flying_fleets = $options['flying_fleets']; if (!$flying_fleets) { $flying_fleets = doquery("SELECT COUNT(fleet_id) AS `flying_fleets` FROM {{fleets}} WHERE `fleet_owner` = '{$user['id']}';", '', true); $flying_fleets = $flying_fleets['flying_fleets']; } if (GetMaxFleets($user) <= $flying_fleets && $mission != MT_MISSILE) { return ATTACK_NO_SLOTS; } // Checking for no planet if (!$planet_dst['id_owner']) { if ($mission == MT_COLONIZE && !$fleet[SHIP_COLONIZER]) { return ATTACK_NO_COLONIZER; } if ($mission == MT_EXPLORE || $mission == MT_COLONIZE) { return ATTACK_ALLOWED; } return ATTACK_NO_TARGET; } if ($mission == MT_RECYCLE) { if ($planet_dst['debris_metal'] + $planet_dst['debris_crystal'] <= 0) { return ATTACK_NO_DEBRIS; } if ($fleet[SHIP_RECYCLER] <= 0) { return ATTACK_NO_RECYCLERS; } return ATTACK_ALLOWED; } // Got planet. Checking if it is ours if ($planet_dst['id_owner'] == $user['id']) { if ($mission == MT_TRANSPORT || $mission == MT_RELOCATE) { return ATTACK_ALLOWED; } return ATTACK_OWN; } // No, planet not ours. Cutting mission that can't be send to not-ours planet if ($mission == MT_RELOCATE || $mission == MT_COLONIZE || $mission == MT_EXPLORE) { return ATTACK_WRONG_MISSION; } $enemy = doquery("SELECT * FROM {{users}} WHERE `id` = '{$planet_dst['id_owner']}' LIMIT 1;", '', true); // We cannot attack or send resource to users in VACATION mode if ($enemy['vacation'] && $target_mission != MT_RECYCLE) { return ATTACK_VACATION; } // Multi IP protection. Here we need a procedure to check proxies if (sys_is_multiaccount($user, $enemy)) { return ATTACK_SAME_IP; } $user_points = doquery("SELECT total_points FROM {{statpoints}} WHERE `stat_type` = '1' AND `stat_code` = '1' AND `id_owner` = '{$user['id']}';", '', true); $user_points = $user_points['total_points']; $enemy_points = doquery("SELECT total_points FROM {{statpoints}} WHERE `stat_type` = '1' AND `stat_code` = '1' AND `id_owner` = '{$enemy['id']}';", '', true); $enemy_points = $enemy_points['total_points']; // Is it transport? If yes - checking for buffing to prevent mega-alliance destroyer if ($mission == MT_TRANSPORT) { if ($user_points >= $enemy_points || $config->allow_buffing) { return ATTACK_ALLOWED; } else { return ATTACK_BUFFING; } } // Only aggresive missions passed to this point. HOLD counts as passive but aggresive // Is it admin with planet protection? if ($planet_dst['id_level'] > $user['authlevel']) { return ATTACK_ADMIN; } // Okay. Now skipping protection checks for inactive longer then 1 week if (!$enemy['onlinetime'] || $enemy['onlinetime'] >= $time_now - 60 * 60 * 24 * 7) { if ($enemy_points <= $config->game_noob_points && $user_points > $config->game_noob_points || $config->game_noob_factor && $user_points > $enemy_points * $config->game_noob_factor) { if ($mission != MT_HOLD) { return ATTACK_NOOB; } if ($mission == MT_HOLD && !($user['ally_id'] && $user['ally_id'] == $enemy['ally_id'] && $config->ally_help_weak)) { return ATTACK_NOOB; } } } // Is it HOLD mission? If yes - there should be ally deposit if ($mission == MT_HOLD) { if ($planet_dst[$sn_data[34]['name']]) { return ATTACK_ALLOWED; } return ATTACK_NO_ALLY_DEPOSIT; } if ($mission == MT_SPY) { if ($fleet[SHIP_SPY] >= 1) { return ATTACK_ALLOWED; } return ATTACK_NO_SPIES; } // Is it MISSILE mission? if ($mission == MT_MISSILE) { if ($planet_src[$sn_data[44]['name']] < $sn_data[503]['require'][44]) { return ATTACK_NO_SILO; } if (!$fleet[503]) { return ATTACK_NO_MISSILE; } $distance = abs($planet_dst['system'] - $planet_src['system']); $mip_range = get_missile_range(); if ($distance > $mip_range || $planet_dst['galaxy'] != $planet_src['galaxy']) { return ATTACK_MISSILE_TOO_FAR; } } if ($mission == MT_DESTROY && $planet_dst['planet_type'] != PT_MOON) { return ATTACK_WRONG_MISSION; } if ($mission == MT_ATTACK || $mission == MT_AKS || $mission == MT_DESTROY) { return flt_bashing_check($user, $enemy, $planet_dst, $mission, $duration, $fleet_group); } return ATTACK_ALLOWED; }
<?php $allow_anonymous = true; include 'common.' . substr(strrchr(__FILE__, '.'), 1); lng_include('admin'); $template = gettemplate('server_info', true); $template->assign_vars(array('game_speed' => get_game_speed(), 'fleet_speed' => get_fleet_speed(), 'game_build_and_research' => $config->BuildLabWhileRun, 'USER_VACATION_DISABLE' => $config->user_vacation_disable, 'ALLOW_BUFFING' => $config->allow_buffing, 'ALLY_HELP_WEAK' => $config->ally_help_weak, 'DB_VERSION' => DB_VERSION, 'SN_VERSION' => SN_VERSION, 'FLEET_BASHING_ATTACKS' => $config->fleet_bashing_attacks, 'fleet_bashing_interval' => sys_time_human($config->fleet_bashing_interval), 'fleet_bashing_scope' => sys_time_human($config->fleet_bashing_scope), 'fleet_bashing_war_delay' => sys_time_human($config->fleet_bashing_war_delay))); display(parsetemplate($template));
$distance = abs($target_system - $planetrow['system']); $mipRange = $user['impulse_motor_tech'] * 5 - 1; $arrival = $time_now + round((30 + 60 * $distance) / get_fleet_speed()); doquery("INSERT INTO `{{iraks}}` SET\r\n `zielid` = '{$TargetRow['id_owner']}', `galaxy` = '{$target_galaxy}', `system` = '{$target_system}', `planet` = '{$target_planet}',\r\n `owner` = '{$user['id']}', `galaxy_angreifer` = '{$planetrow['galaxy']}', `system_angreifer` = '{$planetrow['system']}', `planet_angreifer` = '{$planetrow['planet']}',\r\n `zeit` = '{$arrival}', `anzahl` = '{$mips_sent}', `primaer` = '{$target_structure}';"); $FleetSubQRY = "`{$sn_data[503]['name']}` = `{$sn_data[503]['name']}` - '{$mips_sent}', "; $Ship = 503; //doquery("UPDATE `{{planets}}` SET WHERE `id` = '{$user['current_planet']}' LIMIT 1;"); } else { $Distance = GetTargetDistance($planetrow['galaxy'], $target_galaxy, $planetrow['system'], $target_system, $planetrow['planet'], $target_planet); $speedall = GetFleetMaxSpeed($fleet_array, 0, $user); $SpeedAllMin = min($speedall); $Duration = GetMissionDuration(10, $SpeedAllMin, $Distance, get_fleet_speed()); $fleet_start_time = $Duration + time(); $fleet_end_time = $Duration * 2 + time(); $consumption = 0; $SpeedFactor = get_fleet_speed(); foreach ($fleet_array as $Ship => $Count) { $ShipSpeed = $sn_data[$Ship]["speed"]; $spd = 35000 / ($Duration * $SpeedFactor - 10) * sqrt($Distance * 10 / $ShipSpeed); $basicConsumption = $sn_data[$Ship]["consumption"] * $Count; $consumption += $basicConsumption * $Distance / 35000 * ($spd / 10 + 1) * ($spd / 10 + 1); } $consumption = round($consumption) + 1; if ($UserDeuterium < $consumption) { $ResultMessage = "13|{$lang['gs_c13']}|{$CurrentFlyingFleets}|{$UserSpyProbes}|{$UserRecycles}|{$UserMissiles}"; die($ResultMessage); } $QryInsertFleet = "INSERT INTO {{fleets}} SET "; $QryInsertFleet .= "`fleet_owner` = '{$user['id']}', "; $QryInsertFleet .= "`fleet_mission` = '{$target_mission}', "; $QryInsertFleet .= "`fleet_amount` = '{$fleet_ship_count}', ";