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

Revision 281, 13.3 KB (checked in by ralle030583, 15 years ago)

- redesign of public mode, so only choosen summarytables are changed not all
- rowcount summarytables increased setBreak(5)-> setBreak(6)

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