root/dev/common/kill_related.php @ 185

Revision 185, 10.2 KB (checked in by exi, 16 years ago)

Added stripslashes to the mail_forward eventhandler.
Changed db.php to check for strict type of define.
Reworked large chunks of the battle overview to reflect the actual count of lost/killed ships which was really mind numbing.

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        {continue;
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        $pilots[$side][$row['ind_plt_id']][] = array('name' => $pilot->getName(), 'sid' => $ship->getID(),
158               'spic' => $ship->getImage(32), 'aid' => $row['ind_all_id'], 'ts' => strtotime($kill->getTimeStamp()),
159               'corp' => $corp->getName(), 'alliance' => $alliance->getName(), 'scl' => $shipc->getPoints(),
160               'ship' => $ship->getName(), 'weapon' => $weapon->getName(), 'cid' => $row['ind_crp_id']);
161    }
162}
163
164function handle_destroyed($kill, $side)
165{
166    global $destroyed, $pilots;
167
168    $destroyed[$kill->getID()] = $kill->getVictimID();
169
170    $ship = new Ship();
171    $ship->lookup($kill->getVictimShipName());
172    $shipc = $ship->getClass();
173
174    $ts = strtotime($kill->getTimeStamp());
175
176    // mark the pilot as podded
177    if ($shipc->getID() == 18 || $shipc->getID() == 2)
178    {
179        // increase the timestamp of a podkill by 1 so its for sure after the shipkill
180        $ts++;
181        global $pods;
182        $pods[$kill->getID()] = $kill->getVictimID();
183
184        // return when we've added him already
185        if (isset($pilots[$side][$kill->getVictimId()]))
186        {
187            #return;
188        }
189    }
190
191    // search for ships with the same id
192    if (isset($pilots[$side][$kill->getVictimId()]))
193    {
194        foreach ($pilots[$side][$kill->getVictimId()] as $id => $_ship)
195        {
196            if ($shipc->getID() == $_ship['sid'])
197            {
198                $pilots[$side][$kill->getVictimId()][$id]['destroyed'] = true;
199                return;
200            }
201        }
202    }
203
204    $pilots[$side][$kill->getVictimId()][] = array('name' => $kill->getVictimName(), 'kll_id' => $kill->getID(),
205           'spic' => $ship->getImage(32), 'scl' => $shipc->getPoints(), 'destroyed' => true,
206           'corp' => $kill->getVictimCorpName(), 'alliance' => $kill->getVictimAllianceName(), 'aid' => $kill->getVictimAllianceID(),
207           'ship' => $kill->getVictimShipname(), 'sid' => $ship->getID(), 'cid' => $kill->getVictimCorpID(), 'ts' => $ts);
208}
209
210$destroyed = $pods = array();
211$pilots = array('a' => array(), 'e' => array());
212$kslist->rewind();
213while ($kill = $kslist->getKill())
214{
215    handle_involved($kill, 'a');
216    handle_destroyed($kill, 'e');
217}
218$lslist->rewind();
219while ($kill = $lslist->getKill())
220{
221    handle_involved($kill, 'e');
222    handle_destroyed($kill, 'a');
223}
224function cmp_func($a, $b)
225{
226    // select the biggest fish of that pilot
227    $t_scl = 0;
228    foreach ($a as $i => $ai)
229    {
230        if ($ai['scl'] > $t_scl)
231        {
232            $t_scl = $ai['scl'];
233            $cur_i = $i;
234        }
235    }
236    $a = $a[$cur_i];
237
238    $t_scl = 0;
239    foreach ($b as $i => $bi)
240    {
241        if ($bi['scl'] > $t_scl)
242        {
243            $t_scl = $bi['scl'];
244            $cur_i = $i;
245        }
246    }
247    $b = $b[$cur_i];
248
249    if ($a['scl'] > $b['scl'])
250    {
251        return -1;
252    }
253    // sort after points, shipname, pilotname
254    elseif ($a['scl'] == $b['scl'])
255    {
256        if ($a['ship'] == $b['ship'])
257        {
258            if ($a['name'] > $b['name'])
259            {
260                return 1;
261            }
262            return -1;
263        }
264        elseif ($a['ship'] > $b['ship'])
265        {
266            return 1;
267        }
268        return -1;
269    }
270    return 1;
271}
272
273function is_destroyed($pilot)
274{
275    global $destroyed;
276
277    if ($result = array_search((string)$pilot, $destroyed))
278    {
279        global $smarty;
280
281        $smarty->assign('kll_id', $result);
282        return true;
283    }
284    return false;
285}
286
287function podded($pilot)
288{
289    global $pods;
290
291    if ($result = array_search((string)$pilot, $pods))
292    {
293        global $smarty;
294
295        $smarty->assign('pod_kll_id', $result);
296        return true;
297    }
298    return false;
299}
300
301function cmp_ts_func($a, $b)
302{
303    if ($a['ts'] < $b['ts'])
304    {
305        return -1;
306    }
307    return 1;
308}
309
310// sort pilot ships, order pods after ships
311foreach ($pilots as $side => $pilot)
312{
313    foreach ($pilot as $id => $kll)
314    {
315        uasort($pilots[$side][$id], 'cmp_ts_func');
316    }
317}
318
319// sort arrays, ships with high points first
320uasort($pilots['a'], 'cmp_func');
321uasort($pilots['e'], 'cmp_func');
322
323// now get the pods out and mark the ships the've flown as podded
324foreach ($pilots as $side => $pilot)
325{
326    foreach ($pilot as $id => $kll)
327    {
328        $max = count($kll);
329        for ($i = 0; $i < $max; $i++)
330        {
331            if ($kll[$i]['ship'] == 'Capsule')
332            {
333                if (isset($kll[$i-1]['sid']))
334                {
335                    $pilots[$side][$id][$i-1]['podded'] = true;
336                    $pilots[$side][$id][$i-1]['podid'] = $kll[$i]['kll_id'];
337                    unset($pilots[$side][$id][$i]);
338                }
339            }
340        }
341    }
342}
343
344$smarty->assign_by_ref('pilots_a', $pilots['a']);
345$smarty->assign_by_ref('pilots_e', $pilots['e']);
346
347$pod = new Ship(6);
348$smarty->assign('podpic', $pod->getImage(32));
349$smarty->assign('friendlycnt', count($pilots['a']));
350$smarty->assign('hostilecnt', count($pilots['e']));
351$smarty->assign('system', $system->getName());
352$smarty->assign('firstts', $firstts);
353$smarty->assign('lastts', $lastts);
354
355$html .= $smarty->fetch(get_tpl('battle_overview'));
356
357$html .= "<div class=kb-kills-header>Related kills</div>";
358
359$ktable = new KillListTable($klist);
360$html .= $ktable->generate();
361
362$html .= "<div class=kb-losses-header>Related losses</div>";
363
364$ltable = new KillListTable($llist);
365$html .= $ltable->generate();
366
367$menubox = new Box("Menu");
368$menubox->setIcon("menu-item.gif");
369$menubox->addOption("caption", "View");
370$menubox->addOption("link", "Kills & losses", "?a=kill_related&kll_id=".$_GET['kll_id']);
371$page->addContext($menubox->generate());
372
373$page->setContent($html);
374$page->generate();
375?>
Note: See TracBrowser for help on using the browser.