} } unset($ts); asort($times); // we got 2 resulting timestamps $firstts = array_shift($times); $lastts = array_pop($times); $kslist = new KillList(); $kslist->setOrdered(true); $kslist->addSystem($system); $kslist->setStartDate($firstts); $kslist->setEndDate($lastts); involved::load($kslist, 'kill'); $lslist = new KillList(); $lslist->setOrdered(true); $lslist->addSystem($system); $lslist->setStartDate($firstts); $lslist->setEndDate($lastts); involved::load($lslist, 'loss'); $killsummary = new KillSummaryTable($kslist, $lslist); $killsummary->setBreak(6); $name = $system->getName() . " " . substr($firstts, 0, 16) . " " . substr($lastts, -8, 5); } ?> <form> <table class="popup-table" height="100%" width="355px"> <tr> <td align="center"><strong>Forum Post</strong></td> </tr> <tr> <td align="center"><input type="button" value="Close" onClick="ReverseContentDisplay('popup');"></td>
$_GET['corpname'] = '"' . str_replace(',', '","', $qry->escape(urldecode($_GET['pilotname']))) . '"'; $qry->execute("SELECT plt_id FROM kb3_pilots WHERE plt_name IN (" . $_GET['corpname'] . ")"); if (!$qry->recordCount()) { show($sxe); } while ($row = $qry->getRow()) { $list->addCombinedPilot($row['plt_id']); } } if (isset($_GET['system'])) { $qry->execute("SELECT sys_id FROM kb3_systems WHERE sys_id = " . intval($_GET['system']) . " LIMIT 1"); if (!$qry->recordCount()) { show($sxe); } $row = $qry->getRow(); $list->addSystem($row['sys_id']); } else { if (isset($_GET['region'])) { $qry->execute("SELECT reg_id FROM kb3_regions WHERE reg_id = " . intval($_GET['region']) . " LIMIT 1"); if (!$qry->recordCount()) { show($sxe); } $row = $qry->getRow(); $list->addRegion($row['reg_id']); } } if (isset($_GET['lastID']) && isset($_GET['allkills']) && $_GET['allkills'] == 0) { $list->setMinExtID(intval($_GET['lastID'])); if (isset($_GET['range'])) { $list->setMaxExtID(intval($_GET['lastID'] + $_GET['range'])); }
public function buildStats() { // this is a fast query to get the system and timestamp $rqry = DBFactory::getDBQuery(); if ($this->adjacent) { $rsql = 'SELECT kll_timestamp, sjp_to as sys_id from kb3_kills join kb3_systems a ON (a.sys_id = kll_system_id) join kb3_system_jumps on (sjp_from = a.sys_id) where kll_id = ' . $this->kll_id . ' UNION SELECT kll_timestamp, kll_system_id as sys_id from kb3_kills where kll_id = ' . $this->kll_id; } else { $rsql = 'SELECT kll_timestamp, kll_system_id as sys_id from kb3_kills where kll_id = ' . $this->kll_id; } $rqry->execute($rsql); while ($rrow = $rqry->getRow()) { $this->systems[] = $rrow['sys_id']; $basetime = $rrow['kll_timestamp']; } // now we get all kills in that system for +-4 hours $query = 'SELECT kll.kll_timestamp AS ts FROM kb3_kills kll WHERE kll.kll_system_id IN (' . implode(',', $this->systems) . ') AND kll.kll_timestamp <= "' . date('Y-m-d H:i:s', strtotime($basetime) + config::get('fleet_battles_mod_maxtime') * 60 * 60) . '"' . ' AND kll.kll_timestamp >= "' . date('Y-m-d H:i:s', strtotime($basetime) - config::get('fleet_battles_mod_maxtime') * 60 * 60) . '"' . ' ORDER BY kll.kll_timestamp ASC'; $qry = DBFactory::getDBQuery(); $qry->execute($query); $ts = array(); $timestampsRaw = array(); while ($row = $qry->getRow()) { $time = strtotime($row['ts']); $ts[intval(date('H', $time))][] = $row['ts']; $timestampsRaw[] = $row["ts"]; } // only for non-battles if (!$this->displayingBattle) { // this tricky thing looks for gaps of more than 1 hour and creates an intersection $baseh = date('H', strtotime($basetime)); $maxc = count($ts); $times = array(); for ($i = 0; $i < $maxc; $i++) { $h = ($baseh + $i) % 24; if (!isset($ts[$h])) { break; } foreach ($ts[$h] as $timestamp) { $times[] = $timestamp; } } for ($i = 0; $i < $maxc; $i++) { $h = ($baseh - $i) % 24; if ($h < 0) { $h += 24; } if (!isset($ts[$h])) { break; } foreach ($ts[$h] as $timestamp) { $times[] = $timestamp; } } unset($ts); asort($times); // we got 2 resulting timestamps $this->firstts = array_shift($times); $this->lastts = array_pop($times); } else { // take the first and last timestamp from our original query $this->firstts = array_shift($timestampsRaw); $this->lastts = array_pop($timestampsRaw); } // get parameters for overriding start and end times // dirty hook for the enlightened circle ;) $overrideStartTime = str_replace('%20', ' ', edkURI::getArg('starttime')); $overrideEndTime = str_replace('%20', ' ', edkURI::getArg('endtime')); if ($overrideStartTime && strtotime($overrideStartTime)) { $this->firstts = $overrideStartTime; } if ($overrideEndTime && strtotime($overrideEndTime)) { $this->lastts = $overrideEndTime; } // unfiltered kill list (no ship class filter applied) $this->kslist = new KillList(); $this->kslist->setOrdered(true); foreach ($this->systems as $system) { $this->kslist->addSystem($system); } $this->kslist->setStartDate($this->firstts); $this->kslist->setEndDate($this->lastts); involved::load($this->kslist, 'kill'); // unfiltered loss list (no ship class filter applied) $this->lslist = new KillList(); $this->lslist->setOrdered(true); foreach ($this->systems as $system) { $this->lslist->addSystem($system); } $this->lslist->setStartDate($this->firstts); $this->lslist->setEndDate($this->lastts); involved::load($this->lslist, 'loss'); // filtered kill list (shipclass filter applied) $this->klist = new KillList(); $this->klist->setOrdered(true); $this->klist->setCountComments(true); $this->klist->setCountInvolved(true); foreach ($this->systems as $system) { $this->klist->addSystem($system); } $this->klist->setStartDate($this->firstts); $this->klist->setEndDate($this->lastts); involved::load($this->klist, 'kill'); // filtered loss list (ship class filter applied) $this->llist = new KillList(); $this->llist->setOrdered(true); $this->llist->setCountComments(true); $this->llist->setCountInvolved(true); foreach ($this->systems as $system) { $this->llist->addSystem($system); } $this->llist->setStartDate($this->firstts); $this->llist->setEndDate($this->lastts); involved::load($this->llist, 'loss'); // apply ship class filters if ($this->scl_id) { $this->klist->addVictimShipClass($this->scl_id); $this->llist->addVictimShipClass($this->scl_id); } // if manual side assignment is enabled if (config::get("fleet_battles_mod_sideassign")) { // get possible side assignments $sideAssignments = getSideAssignments($this->systems[0], $this->firstts, $this->lastts); $sideAssignmentMap = array(); // apply foreach ($sideAssignments as $sideAssignment) { $this->isFixed = TRUE; $sideAssignmentMap[$sideAssignment["entity_type"]][$sideAssignment["entity_id"]] = $sideAssignment["side"]; // entity is an alliance if ($sideAssignment["entity_type"] == "alliance") { // alliance is an enemy if ($sideAssignment["side"] == "e") { $this->kslist->addVictimAlliance($sideAssignment["entity_id"]); $this->lslist->addInvolvedAlliance($sideAssignment["entity_id"]); $this->klist->addVictimAlliance($sideAssignment["entity_id"]); $this->llist->addInvolvedAlliance($sideAssignment["entity_id"]); } else { $this->kslist->addInvolvedAlliance($sideAssignment["entity_id"]); $this->lslist->addVictimAlliance($sideAssignment["entity_id"]); // also add as involved alliance for blue-on-blue kills $this->lslist->addInvolvedAlliance($sideAssignment["entity_id"]); $this->klist->addInvolvedAlliance($sideAssignment["entity_id"]); $this->llist->addVictimAlliance($sideAssignment["entity_id"]); // also add as involved alliance for blue-on-blue kills $this->llist->addInvolvedAlliance($sideAssignment["entity_id"]); } } else { // alliance is an enemy if ($sideAssignment["side"] == "e") { $this->kslist->addVictimCorp($sideAssignment["entity_id"]); $this->lslist->addInvolvedCorp($sideAssignment["entity_id"]); $this->klist->addVictimCorp($sideAssignment["entity_id"]); $this->llist->addInvolvedCorp($sideAssignment["entity_id"]); } else { $this->kslist->addInvolvedCorp($sideAssignment["entity_id"]); $this->lslist->addVictimCorp($sideAssignment["entity_id"]); // also add as involved alliance for blue-on-blue kills $this->lslist->addInvolvedCorp($sideAssignment["entity_id"]); $this->klist->addInvolvedCorp($sideAssignment["entity_id"]); $this->llist->addVictimCorp($sideAssignment["entity_id"]); // also add as involved alliance for blue-on-blue kills $this->llist->addInvolvedCorp($sideAssignment["entity_id"]); } } } } // we need a summary table first $this->summaryTable = new KillSummaryTable($this->kslist, $this->lslist); $this->summaryTable->generate(); $this->destroyed = array(); $this->lossValues = array(); $this->killValues = array(); $this->pilots = array('a' => array(), 'e' => array()); $this->klist->rewind(); $this->damageOverview = array('a' => array(), 'e' => array()); $totalKillIsk = $this->summaryTable->getTotalKillISK(); while ($kill = $this->klist->getKill()) { handle_involved($kill, 'a', $this->pilots, $sideAssignmentMap, TRUE); handle_destroyed($kill, 'e', $this->destroyed, $this->pilots, $sideAssignmentMap, TRUE); // gather data for battle timeline and loss value lists // for better performance we use this loop so we won't have to loop over the same data again // --------------------------------------------------------------------------------------- // gathering kill values // --------------------------------------------------------------------------------------- // we dont want our own people on the enemy's side! if (in_array($kill->getVictimAllianceID(), config::get('cfg_allianceid')) || in_array($kill->getVictimCorpID(), config::get('cfg_corpid')) || in_array($kill->getVictimID(), config::get('cfg_pilotid'))) { continue; } $lossValueRaw = $kill->getISKLoss(); $lossValue = self::formatIskValue($lossValueRaw); if ($totalKillIsk != 0) { $percentualLossValue = number_format($lossValueRaw / $totalKillIsk * 100, 2); } else { $percentualLossValue = 0.0; } if ($lossValueRaw > 0) { $this->killValues[] = array("victimName" => $kill->getVictimName(), "victimID" => $kill->getVictimID(), "victimUrl" => edkURI::page("pilot_detail", $kill->getVictimID(), "plt_id"), "victimShipName" => $kill->getVictimShipName(), "victimShipImage" => imageUrl::getURL("Ship", $kill->getVictimShipID(), 32), "victimShipClass" => $kill->getVictimShipClassName(), "victimCorpName" => $kill->getVictimCorpName(), "victimCorpID" => $kill->getVictimCorpID(), "victimCorpUrl" => edkURI::page("corp_detail", $kill->getVictimCorpID(), "crp_id"), "victimAllianceName" => $kill->getVictimAllianceName(), "victimAllianceID" => $kill->getVictimAllianceID(), "victimAllianceUrl" => edkURI::page("alliance_detail", $kill->getVictimAllianceID(), "all_id"), "killId" => $kill->getID(), "killUrl" => edkURI::page("kill_detail", $kill->getID(), "kll_id"), "lossValueRaw" => $lossValueRaw, "lossValue" => $lossValue, "lossValuePercentage" => $percentualLossValue); } // --------------------------------------------------------------------------------------- // gathering timeline data // --------------------------------------------------------------------------------------- $killTimestamp = strtotime($kill->getTimeStamp()); // increase killtimestamp for pods so they appear AFTER the ship kill in the timeline $shipClassId = $kill->getVictimShip()->getClass()->getID(); if ($shipClassId == 18 || $shipClassId == 2) { $killTimestamp += 1; } $this->timeLine[] = array("timestamp" => $killTimestamp, "loss" => NULL, "kill" => array("victimName" => $kill->getVictimName(), "victimID" => $kill->getVictimID(), "victimUrl" => edkURI::page("pilot_detail", $kill->getVictimID(), "plt_id"), "victimShipName" => $kill->getVictimShipName(), "victimShipImage" => imageUrl::getURL("Ship", $kill->getVictimShipID(), 32), "victimShipClass" => $kill->getVictimShipClassName(), "victimCorpName" => $kill->getVictimCorpName(), "victimCorpID" => $kill->getVictimCorpID(), "victimCorpUrl" => edkURI::page("corp_detail", $kill->getVictimCorpID(), "crp_id"), "victimAllianceName" => $kill->getVictimAllianceName(), "victimAllianceID" => $kill->getVictimAllianceID(), "victimAllianceUrl" => edkURI::page("alliance_detail", $kill->getVictimAllianceID(), "all_id"), "killId" => $kill->getID(), "killUrl" => edkURI::page("kill_detail", $kill->getID(), "kll_id"))); // --------------------------------------------------------------------------------------- // gathering damage overview data // --------------------------------------------------------------------------------------- $this->damageOverview["a"][] = array("victimName" => $kill->getVictimName(), "victimID" => $kill->getVictimID(), "victimUrl" => edkURI::page("pilot_detail", $kill->getVictimID(), "plt_id"), "victimShipName" => $kill->getVictimShipName(), "victimShipImage" => imageUrl::getURL("Ship", $kill->getVictimShipID(), 32), "victimShipClass" => $kill->getVictimShipClassName(), "victimCorpName" => $kill->getVictimCorpName(), "victimCorpID" => $kill->getVictimCorpID(), "victimCorpUrl" => edkURI::page("corp_detail", $kill->getVictimCorpID(), "crp_id"), "victimAllianceName" => $kill->getVictimAllianceName(), "victimAllianceID" => $kill->getVictimAllianceID(), "victimAllianceUrl" => edkURI::page("alliance_detail", $kill->getVictimAllianceID(), "all_id"), "killId" => $kill->getID(), "killUrl" => edkURI::page("kill_detail", $kill->getID(), "kll_id"), "lossValueRaw" => $lossValueRaw, "lossValue" => $lossValue, "lossValuePercentage" => $percentualLossValue); } $this->llist->rewind(); $totalLossIsk = $this->summaryTable->getTotalLossISK(); while ($kill = $this->llist->getKill()) { handle_involved($kill, 'e', $this->pilots, $sideAssignmentMap, TRUE); handle_destroyed($kill, 'a', $this->destroyed, $this->pilots, $sideAssignmentMap, TRUE); // gather data for battle timeline and loss value lists // for better performance we use this loop so we won't have to loop over the same data again // --------------------------------------------------------------------------------------- // gathering loss values // --------------------------------------------------------------------------------------- $lossValueRaw = $kill->getISKLoss(); $lossValue = self::formatIskValue($lossValueRaw); if ($totalLossIsk != 0) { $percentualLossValue = number_format($lossValueRaw / $totalLossIsk * 100, 2); } else { $percentualLossValue = 0.0; } if ($lossValueRaw > 0) { $this->lossValues[] = array("victimName" => $kill->getVictimName(), "victimID" => $kill->getVictimID(), "victimUrl" => edkURI::page("pilot_detail", $kill->getVictimID(), "plt_id"), "victimShipName" => $kill->getVictimShipName(), "victimShipImage" => imageUrl::getURL("Ship", $kill->getVictimShipID(), 32), "victimShipClass" => $kill->getVictimShipClassName(), "victimCorpName" => $kill->getVictimCorpName(), "victimCorpID" => $kill->getVictimCorpID(), "victimCorpUrl" => edkURI::page("corp_detail", $kill->getVictimCorpID(), "crp_id"), "victimAllianceName" => $kill->getVictimAllianceName(), "victimAllianceID" => $kill->getVictimAllianceID(), "victimAllianceUrl" => edkURI::page("alliance_detail", $kill->getVictimAllianceID(), "all_id"), "killId" => $kill->getID(), "killUrl" => edkURI::page("kill_detail", $kill->getID(), "kll_id"), "lossValueRaw" => $lossValueRaw, "lossValue" => $lossValue, "lossValuePercentage" => $percentualLossValue); } // --------------------------------------------------------------------------------------- // gathering timeline data // --------------------------------------------------------------------------------------- $killTimestamp = strtotime($kill->getTimeStamp()); $shipClassId = $kill->getVictimShip()->getClass()->getID(); $this->timeLine[] = array("timestamp" => strtotime($kill->getTimeStamp()), "loss" => array("victimName" => $kill->getVictimName(), "victimID" => $kill->getVictimID(), "victimUrl" => edkURI::page("pilot_detail", $kill->getVictimID(), "plt_id"), "victimShipName" => $kill->getVictimShipName(), "victimShipImage" => imageUrl::getURL("Ship", $kill->getVictimShipID(), 32), "victimShipClass" => $kill->getVictimShipClassName(), "victimCorpName" => $kill->getVictimCorpName(), "victimCorpID" => $kill->getVictimCorpID(), "victimCorpUrl" => edkURI::page("corp_detail", $kill->getVictimCorpID(), "crp_id"), "victimAllianceName" => $kill->getVictimAllianceName(), "victimAllianceID" => $kill->getVictimAllianceID(), "victimAllianceUrl" => edkURI::page("alliance_detail", $kill->getVictimAllianceID(), "all_id"), "killId" => $kill->getID(), "killUrl" => edkURI::page("kill_detail", $kill->getID(), "kll_id")), "kill" => NULL); } //echo "<pre>"; var_dump($this->pilots); echo "</pre>"; // sort pilot ships, order pods after ships foreach ($this->pilots as $side => $pilot) { foreach ($pilot as $id => $kll) { usort($this->pilots[$side][$id], array($this, 'cmp_ts_func')); } } // sort arrays, ships with high points first uasort($this->pilots['a'], array($this, 'cmp_func')); uasort($this->pilots['e'], array($this, 'cmp_func')); // now get the pods out and mark the ships the've flown as podded foreach ($this->pilots as $side => $pilot) { foreach ($pilot as $id => $kll) { $max = count($kll); for ($i = 0; $i < $max; $i++) { // add up total damage for each side if ($side == "a") { if (isset($kll[$i]["damage"])) { $this->damageTotalFriendly += $kll[$i]["damage"]; } } else { if (isset($kll[$i]["damage"])) { $this->damageTotalHostile += $kll[$i]["damage"]; } } // this kill has a pod as ship if ($kll[$i]['shipClass'] == 'Capsule') { // this pilot made previous kills in another ship if (isset($kll[$i - 1]['sid'])) { // this kill is a pod loss if (isset($kll[$i]['destroyed'])) { $this->pilots[$side][$id][$i - 1]['podded'] = true; $this->pilots[$side][$id][$i - 1]['podid'] = $kll[$i]['kll_id']; $this->pilots[$side][$id][$i - 1]['pod_url'] = edkURI::page("kill_detail", $kll[$i]['kll_id'], "kll_id"); unset($this->pilots[$side][$id][$i]); } else { // update stats for previously used ship $this->pilots[$side][$id][$i - 1]['times'] += $this->pilots[$side][$id][$i]['times']; $this->pilots[$side][$id][$i - 1]['damage'] += $this->pilots[$side][$id][$i]['damage']; unset($this->pilots[$side][$id][$i]); } } } } } } // update battles with current stats $this->updateBattles(); }