root/dev/common/kill_related.php @ 233

Revision 233, 13.7 KB (checked in by ralle030583, 15 years ago)

- changed summarytable format to 5 rows each cause of cap. industrial
- bugfix in autoupgrade of navigation table (Kills were linked to Home :-/)
- added chk_cap_industrial to autoupgrade
- added Capital Industrial to sql install files

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