root/dev/common/kill_related.php @ 188

Revision 188, 11.9 KB (checked in by exi, 14 years ago)

Changed default td width for options to 160px.
Added the appropiate timeframe to the fast contractlisttable.
Events now can also return a reference to a variable containing additional information.
Killlists now return a non formatted isk-value for losses/kills, please report any errors on other pages.
Added a custom user menu, able to be shownon every page.
Added some code for user logins, please ignore it for now.
Added a small battle statistics frame to the battle overview.
To login as admin now just leave user blank and use the admin password.

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