root/dev/common/kill_related.php @ 194

Revision 194, 12.3 KB (checked in by ralle030583, 14 years ago)

- Bugfix: Active campaigns on home are now displayed even if they have an end date
- Missing link in battleoverview readded

Line 
1<?php
2require_once('common/includes/class.page.php');
3require_once('common/includes/class.corp.php');
4require_once('common/includes/class.alliance.php');
5require_once('common/includes/class.killlist.php');
6require_once('common/includes/class.killlisttable.php');
7require_once('common/includes/class.killsummarytable.php');
8
9if (!$kll_id = intval($_GET['kll_id']))
10{
11    echo 'No valid kill id specified';
12    exit;
13}
14
15$page = new Page('Related kills & losses');
16
17// this is a fast query to get the system and timestamp
18$rqry = new DBQuery();
19$rsql = 'SELECT kll_timestamp, kll_system_id from kb3_kills where kll_id = '.$kll_id;
20$rqry->execute($rsql);
21$rrow = $rqry->getRow();
22$system = new SolarSystem($rrow['kll_system_id']);
23
24// now we get all kills in that system for +-12 hours
25$query = 'SELECT kll.kll_timestamp AS ts FROM kb3_kills kll WHERE kll.kll_system_id='.$rrow['kll_system_id'].'
26            AND kll.kll_timestamp <= date_add( \''.$rrow['kll_timestamp'].'\', INTERVAL \'12\' HOUR )
27            AND kll.kll_timestamp >= date_sub( \''.$rrow['kll_timestamp'].'\', INTERVAL \'12\' HOUR )
28            ORDER BY kll.kll_timestamp ASC';
29$qry = new DBQuery();
30$qry->execute($query);
31$ts = array();
32while ($row = $qry->getRow())
33{
34    $time = strtotime($row['ts']);
35    $ts[intval(date('H', $time))][] = $row['ts'];
36}
37
38// this tricky thing looks for gaps of more than 1 hour and creates an intersection
39$baseh = date('H', strtotime($rrow['kll_timestamp']));
40$maxc = count($ts);
41$times = array();
42for ($i = 0; $i < $maxc; $i++)
43{
44    $h = ($baseh+$i) % 24;
45    if (!isset($ts[$h]))
46    {
47        break;
48    }
49    foreach ($ts[$h] as $timestamp)
50    {
51        $times[] = $timestamp;
52    }
53}
54for ($i = 0; $i < $maxc; $i++)
55{
56    $h = ($baseh-$i) % 24;
57    if ($h < 0)
58    {
59        $h += 24;
60    }
61    if (!isset($ts[$h]))
62    {
63        break;
64    }
65    foreach ($ts[$h] as $timestamp)
66    {
67        $times[] = $timestamp;
68    }
69}
70unset($ts);
71asort($times);
72
73// we got 2 resulting timestamps
74$firstts = array_shift($times);
75$lastts = array_pop($times);
76
77$kslist = new KillList();
78$kslist->setOrdered(true);
79$kslist->addSystem($system);
80$kslist->setStartDate($firstts);
81$kslist->setEndDate($lastts);
82if (CORP_ID)
83    $kslist->addInvolvedCorp(new Corporation(CORP_ID));
84if (ALLIANCE_ID)
85    $kslist->addInvolvedAlliance(new Alliance(ALLIANCE_ID));
86
87$lslist = new KillList();
88$lslist->setOrdered(true);
89$lslist->addSystem($system);
90$lslist->setStartDate($firstts);
91$lslist->setEndDate($lastts);
92if (CORP_ID)
93    $lslist->addVictimCorp(new Corporation(CORP_ID));
94if (ALLIANCE_ID)
95    $lslist->addVictimAlliance(new Alliance(ALLIANCE_ID));
96
97$summarytable = new KillSummaryTable($kslist, $lslist);
98$summarytable->setBreak(6);
99$html .= $summarytable->generate();
100
101$klist = new KillList();
102$klist->setOrdered(true);
103$klist->addSystem($system);
104$klist->setStartDate($firstts);
105$klist->setEndDate($lastts);
106if (CORP_ID)
107    $klist->addInvolvedCorp(new Corporation(CORP_ID));
108if (ALLIANCE_ID)
109    $klist->addInvolvedAlliance(new Alliance(ALLIANCE_ID));
110
111$llist = new KillList();
112$llist->setOrdered(true);
113$llist->addSystem($system);
114$llist->setStartDate($firstts);
115$llist->setEndDate($lastts);
116if (CORP_ID)
117    $llist->addVictimCorp(new Corporation(CORP_ID));
118if (ALLIANCE_ID)
119    $llist->addVictimAlliance(new Alliance(ALLIANCE_ID));
120
121if ($_GET['scl_id'])
122{
123    $klist->addVictimShipClass(new ShipClass($_GET['scl_id']));
124    $llist->addVictimShipClass(new ShipClass($_GET['scl_id']));
125}
126
127function handle_involved($kill, $side)
128{
129    global $pilots;
130    $qry = new DBQuery();
131    $sql = "select ind_plt_id, ind_crp_id, ind_all_id, ind_sec_status,
132            ind_shp_id, ind_wep_id
133            from kb3_inv_detail
134            where ind_kll_id = ".$kill->getID()."
135            order by ind_order";
136
137    $qry->execute($sql);
138    while ($row = $qry->getRow())
139    {
140        $ship = new Ship($row['ind_shp_id']);
141        $shipc = $ship->getClass();
142
143        // dont set pods as ships for pilots we already have
144        if (isset($pilots[$side][$row['ind_plt_id']]))
145        {
146            if ($shipc->getID() == 18 || $shipc->getID() == 2)
147            {
148                continue;
149            }
150        }
151        $weapon = new Item($row['ind_wep_id']);
152        $pilot = new Pilot($row['ind_plt_id']);
153        $corp = new Corporation($row['ind_crp_id']);
154        $alliance = new Alliance($row['ind_all_id']);
155
156        // search for ships with the same id
157        if (isset($pilots[$side][$row['ind_plt_id']]))
158        {
159            foreach ($pilots[$side][$row['ind_plt_id']] as $id => $_ship)
160            {
161                if ($ship->getID() == $_ship['sid'])
162                {
163                    // we already got that pilot in this ship, continue
164                    continue 2;
165                }
166            }
167        }
168        $pilots[$side][$row['ind_plt_id']][] = array('name' => $pilot->getName(), 'sid' => $ship->getID(),
169               'spic' => $ship->getImage(32), 'aid' => $row['ind_all_id'], 'ts' => strtotime($kill->getTimeStamp()),
170               'corp' => $corp->getName(), 'alliance' => $alliance->getName(), 'scl' => $shipc->getPoints(),
171               'ship' => $ship->getName(), 'weapon' => $weapon->getName(), 'cid' => $row['ind_crp_id']);
172    }
173}
174
175function handle_destroyed($kill, $side)
176{
177    global $destroyed, $pilots;
178
179    $destroyed[$kill->getID()] = $kill->getVictimID();
180
181    $ship = new Ship();
182    $ship->lookup($kill->getVictimShipName());
183    $shipc = $ship->getClass();
184
185    $ts = strtotime($kill->getTimeStamp());
186
187    // mark the pilot as podded
188    if ($shipc->getID() == 18 || $shipc->getID() == 2)
189    {
190        // increase the timestamp of a podkill by 1 so its for sure after the shipkill
191        $ts++;
192        global $pods;
193        $pods[$kill->getID()] = $kill->getVictimID();
194
195        // return when we've added him already
196        if (isset($pilots[$side][$kill->getVictimId()]))
197        {
198            #return;
199        }
200    }
201
202    // search for ships with the same id
203    if (isset($pilots[$side][$kill->getVictimId()]))
204    {
205        foreach ($pilots[$side][$kill->getVictimId()] as $id => $_ship)
206        {
207            if ($ship->getID() == $_ship['sid'])
208            {
209                $pilots[$side][$kill->getVictimId()][$id]['destroyed'] = true;
210                return;
211            }
212        }
213    }
214
215    $pilots[$side][$kill->getVictimId()][] = array('name' => $kill->getVictimName(), 'kll_id' => $kill->getID(),
216           'spic' => $ship->getImage(32), 'scl' => $shipc->getPoints(), 'destroyed' => true,
217           'corp' => $kill->getVictimCorpName(), 'alliance' => $kill->getVictimAllianceName(), 'aid' => $kill->getVictimAllianceID(),
218           'ship' => $kill->getVictimShipname(), 'sid' => $ship->getID(), 'cid' => $kill->getVictimCorpID(), 'ts' => $ts);
219}
220
221$destroyed = $pods = array();
222$pilots = array('a' => array(), 'e' => array());
223$kslist->rewind();
224$classified = false;
225while ($kill = $kslist->getKill())
226{
227    handle_involved($kill, 'a');
228    handle_destroyed($kill, 'e');
229    if ($kill->isClassified())
230    {
231        $classified = true;
232    }
233}
234$lslist->rewind();
235while ($kill = $lslist->getKill())
236{
237    handle_involved($kill, 'e');
238    handle_destroyed($kill, 'a');
239    if ($kill->isClassified())
240    {
241        $classified = true;
242    }
243}
244function cmp_func($a, $b)
245{
246    // select the biggest fish of that pilot
247    $t_scl = 0;
248    foreach ($a as $i => $ai)
249    {
250        if ($ai['scl'] > $t_scl)
251        {
252            $t_scl = $ai['scl'];
253            $cur_i = $i;
254        }
255    }
256    $a = $a[$cur_i];
257
258    $t_scl = 0;
259    foreach ($b as $i => $bi)
260    {
261        if ($bi['scl'] > $t_scl)
262        {
263            $t_scl = $bi['scl'];
264            $cur_i = $i;
265        }
266    }
267    $b = $b[$cur_i];
268
269    if ($a['scl'] > $b['scl'])
270    {
271        return -1;
272    }
273    // sort after points, shipname, pilotname
274    elseif ($a['scl'] == $b['scl'])
275    {
276        if ($a['ship'] == $b['ship'])
277        {
278            if ($a['name'] > $b['name'])
279            {
280                return 1;
281            }
282            return -1;
283        }
284        elseif ($a['ship'] > $b['ship'])
285        {
286            return 1;
287        }
288        return -1;
289    }
290    return 1;
291}
292
293function is_destroyed($pilot)
294{
295    global $destroyed;
296
297    if ($result = array_search((string)$pilot, $destroyed))
298    {
299        global $smarty;
300
301        $smarty->assign('kll_id', $result);
302        return true;
303    }
304    return false;
305}
306
307function podded($pilot)
308{
309    global $pods;
310
311    if ($result = array_search((string)$pilot, $pods))
312    {
313        global $smarty;
314
315        $smarty->assign('pod_kll_id', $result);
316        return true;
317    }
318    return false;
319}
320
321function cmp_ts_func($a, $b)
322{
323    if ($a['ts'] < $b['ts'])
324    {
325        return -1;
326    }
327    return 1;
328}
329
330// sort pilot ships, order pods after ships
331foreach ($pilots as $side => $pilot)
332{
333    foreach ($pilot as $id => $kll)
334    {
335        uasort($pilots[$side][$id], 'cmp_ts_func');
336    }
337}
338
339// sort arrays, ships with high points first
340uasort($pilots['a'], 'cmp_func');
341uasort($pilots['e'], 'cmp_func');
342
343// now get the pods out and mark the ships the've flown as podded
344foreach ($pilots as $side => $pilot)
345{
346    foreach ($pilot as $id => $kll)
347    {
348        $max = count($kll);
349        for ($i = 0; $i < $max; $i++)
350        {
351            if ($kll[$i]['ship'] == 'Capsule')
352            {
353                if (isset($kll[$i-1]['sid']))
354                {
355                    $pilots[$side][$id][$i-1]['podded'] = true;
356                    $pilots[$side][$id][$i-1]['podid'] = $kll[$i]['kll_id'];
357                    unset($pilots[$side][$id][$i]);
358                }
359            }
360        }
361    }
362}
363
364$smarty->assign_by_ref('pilots_a', $pilots['a']);
365$smarty->assign_by_ref('pilots_e', $pilots['e']);
366
367$pod = new Ship(6);
368$smarty->assign('podpic', $pod->getImage(32));
369$smarty->assign('friendlycnt', count($pilots['a']));
370$smarty->assign('hostilecnt', count($pilots['e']));
371if ($classified)
372{
373    $smarty->assign('system', 'Classified System');
374}
375else
376{
377    $smarty->assign('system', $system->getName());
378}
379$smarty->assign('firstts', $firstts);
380$smarty->assign('lastts', $lastts);
381
382$html .= $smarty->fetch(get_tpl('battle_overview'));
383
384$html .= '<div class="kb-kills-header">Battle Statistics</div>';
385$html .= "<table class=kb-table width=\"100%\" border=\"0\" cellspacing=1><tr class=kb-table-row-even>";
386
387$kill_summary = new KillSummaryTable($klist, $llist);
388$summary_html = $kill_summary->generate();
389
390$html .= "<td class=kb-table-cell width=180><b>Kills:</b></td><td class=kl-kill>".$kill_summary->getTotalKills()."</td></tr>";
391$html .= "<tr class=kb-table-row-even><td class=kb-table-cell><b>Losses:</b></td><td class=kl-loss>".$kill_summary->getTotalLosses()."</td></tr>";
392$html .= "<tr class=kb-table-row-even><td class=kb-table-cell><b>Damage done (ISK):</b></td><td class=kl-kill>".round($kill_summary->getTotalKillISK()/1000000, 2)."M</td></tr>";
393$html .= "<tr class=kb-table-row-even><td class=kb-table-cell><b>Damage received (ISK):</b></td><td class=kl-loss>".round($kill_summary->getTotalLossISK()/1000000, 2)."M</td></tr>";
394if ($kill_summary->getTotalKillISK())
395{
396    $efficiency = round($kill_summary->getTotalKillISK() / ($kill_summary->getTotalKillISK() + $kill_summary->getTotalLossISK()) * 100, 2);
397}
398else
399{
400    $efficiency = 0;
401}
402
403$html .= "<tr class=kb-table-row-even><td class=kb-table-cell><b>Efficiency:</b></td><td class=kb-table-cell><b>" . $efficiency . "%</b></td></tr>";
404
405$html .= "</table>";
406$html .= "<br/>";
407
408
409$html .= "<div class=\"kb-kills-header\">Related kills</div>";
410
411$ktable = new KillListTable($klist);
412$html .= $ktable->generate();
413
414$html .= "<div class=\"kb-losses-header\">Related losses</div>";
415
416$ltable = new KillListTable($llist);
417$html .= $ltable->generate();
418
419$menubox = new Box("Menu");
420$menubox->setIcon("menu-item.gif");
421$menubox->addOption("caption", "View");
422$menubox->addOption("link", "Back to Killmail", "?a=kill_detail&kll_id=".$_GET['kll_id']);
423$menubox->addOption("link", "Kills & losses", "?a=kill_related&kll_id=".$_GET['kll_id']);
424$page->addContext($menubox->generate());
425
426$page->setContent($html);
427$page->generate();
428?>
Note: See TracBrowser for help on using the browser.