root/dev/mods/forum_post/kill_related.php @ 227

Revision 207, 13.7 KB (checked in by ralle030583, 14 years ago)

- added system search
- added 12 new ship Signatures (thx to Arthur Ffrub)
- removed again some not needed includes

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(6);
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                return;
225            }
226        }
227    }
228
229    $pilots[$side][$kill->getVictimId()][] = array('name' => $kill->getVictimName(), 'kll_id' => $kill->getID(),
230           'spic' => $ship->getImage(32), 'scl' => $shipc->getPoints(), 'destroyed' => true,
231           'corp' => $kill->getVictimCorpName(), 'alliance' => $kill->getVictimAllianceName(), 'aid' => $kill->getVictimAllianceID(),
232           'ship' => $kill->getVictimShipname(), 'sid' => $ship->getID(), 'cid' => $kill->getVictimCorpID(), 'ts' => $ts);
233}
234
235$destroyed = $pods = array();
236$pilots = array('a' => array(), 'e' => array());
237$kslist->rewind();
238$classified = false;
239while ($kill = $kslist->getKill())
240{
241    handle_involved($kill, 'a');
242    handle_destroyed($kill, 'e');
243    if ($kill->isClassified())
244    {
245        $classified = true;
246    }
247}
248$lslist->rewind();
249while ($kill = $lslist->getKill())
250{
251    handle_involved($kill, 'e');
252    handle_destroyed($kill, 'a');
253    if ($kill->isClassified())
254    {
255        $classified = true;
256    }
257}
258function cmp_func($a, $b)
259{
260    // select the biggest fish of that pilot
261    $t_scl = 0;
262    foreach ($a as $i => $ai)
263    {
264        if ($ai['scl'] > $t_scl)
265        {
266            $t_scl = $ai['scl'];
267            $cur_i = $i;
268        }
269    }
270    $a = $a[$cur_i];
271
272    $t_scl = 0;
273    foreach ($b as $i => $bi)
274    {
275        if ($bi['scl'] > $t_scl)
276        {
277            $t_scl = $bi['scl'];
278            $cur_i = $i;
279        }
280    }
281    $b = $b[$cur_i];
282
283    if ($a['scl'] > $b['scl'])
284    {
285        return -1;
286    }
287    // sort after points, shipname, pilotname
288    elseif ($a['scl'] == $b['scl'])
289    {
290        if ($a['ship'] == $b['ship'])
291        {
292            if ($a['name'] > $b['name'])
293            {
294                return 1;
295            }
296            return -1;
297        }
298        elseif ($a['ship'] > $b['ship'])
299        {
300            return 1;
301        }
302        return -1;
303    }
304    return 1;
305}
306
307function is_destroyed($pilot)
308{
309    global $destroyed;
310
311    if ($result = array_search((string)$pilot, $destroyed))
312    {
313        global $smarty;
314
315        $smarty->assign('kll_id', $result);
316        return true;
317    }
318    return false;
319}
320
321function podded($pilot)
322{
323    global $pods;
324
325    if ($result = array_search((string)$pilot, $pods))
326    {
327        global $smarty;
328
329        $smarty->assign('pod_kll_id', $result);
330        return true;
331    }
332    return false;
333}
334
335function cmp_ts_func($a, $b)
336{
337    if ($a['ts'] < $b['ts'])
338    {
339        return -1;
340    }
341    return 1;
342}
343
344// sort pilot ships, order pods after ships
345foreach ($pilots as $side => $pilot)
346{
347    foreach ($pilot as $id => $kll)
348    {
349        usort($pilots[$side][$id], 'cmp_ts_func');
350    }
351}
352
353// sort arrays, ships with high points first
354uasort($pilots['a'], 'cmp_func');
355uasort($pilots['e'], 'cmp_func');
356
357// now get the pods out and mark the ships the've flown as podded
358foreach ($pilots as $side => $pilot)
359{
360    foreach ($pilot as $id => $kll)
361    {
362        $max = count($kll);
363        for ($i = 0; $i < $max; $i++)
364        {
365            if ($kll[$i]['ship'] == 'Capsule')
366            {
367                if (isset($kll[$i-1]['sid']) && isset($kll[$i]['destroyed']))
368                {
369                    $pilots[$side][$id][$i-1]['podded'] = true;
370                    $pilots[$side][$id][$i-1]['podid'] = $kll[$i]['kll_id'];
371                    unset($pilots[$side][$id][$i]);
372                }
373                else
374                {
375                    // now sort out all pods from pilots who previously flown a real ship
376                    $valid_ship = false;
377                    foreach ($kll as $ship)
378                    {
379                        if ($ship['ship'] != 'Capsule')
380                        {
381                            $valid_ship = true;
382                            break;
383                        }
384                    }
385                    if ($valid_ship)
386                    {
387                        unset($pilots[$side][$id][$i]);
388                    }
389                }
390            }
391        }
392    }
393}
394
395$smarty->assign_by_ref('pilots_a', $pilots['a']);
396$smarty->assign_by_ref('pilots_e', $pilots['e']);
397
398$pod = new Ship(6);
399$smarty->assign('podpic', $pod->getImage(32));
400$smarty->assign('friendlycnt', count($pilots['a']));
401$smarty->assign('hostilecnt', count($pilots['e']));
402if ($classified)
403{
404    $smarty->assign('system', 'Classified System');
405}
406else
407{
408    $smarty->assign('system', $system->getName());
409}
410$smarty->assign('firstts', $firstts);
411$smarty->assign('lastts', $lastts);
412
413$html .= $smarty->fetch(get_tpl('battle_overview'));
414
415$html .= '<div class="kb-kills-header">Battle Statistics</div>';
416$html .= "<table class=kb-table width=\"100%\" border=\"0\" cellspacing=1><tr class=kb-table-row-even>";
417
418$kill_summary = new KillSummaryTable($klist, $llist);
419$summary_html = $kill_summary->generate();
420
421$html .= "<td class=kb-table-cell width=180><b>Kills:</b></td><td class=kl-kill>".$kill_summary->getTotalKills()."</td></tr>";
422$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>";
423$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>";
424$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>";
425if ($kill_summary->getTotalKillISK())
426{
427    $efficiency = round($kill_summary->getTotalKillISK() / ($kill_summary->getTotalKillISK() + $kill_summary->getTotalLossISK()) * 100, 2);
428}
429else
430{
431    $efficiency = 0;
432}
433
434$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>";
435
436$html .= "</table>";
437$html .= "<br/>";
438
439
440$html .= "<div class=\"kb-kills-header\">Related kills</div>";
441
442$ktable = new KillListTable($klist);
443$html .= $ktable->generate();
444
445$html .= "<div class=\"kb-losses-header\">Related losses</div>";
446
447$ltable = new KillListTable($llist);
448$html .= $ltable->generate();
449
450$menubox = new Box("Menu");
451$menubox->setIcon("menu-item.gif");
452$menubox->addOption("caption", "View");
453$menubox->addOption("link", "Back to Killmail", "?a=kill_detail&kll_id=".$_GET['kll_id']);
454$menubox->addOption("link", "Kills & losses", "?a=kill_related&kll_id=".$_GET['kll_id']);
455
456if($page->isAdmin()){
457$menubox->addOption("caption","Admin");
458$menubox->addOption("link", "Forum Summary", "javascript:sndReq('index.php?a=forum_post&kll_id=".$_GET['kll_id']."');ReverseContentDisplay('popup')");
459}
460$page->addContext($menubox->generate());
461
462$page->setContent($html);
463$page->generate();
464?>
Note: See TracBrowser for help on using the browser.