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

Revision 465, 13.5 KB (checked in by kovell, 11 years ago)

Refactoring mod input to match core

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