source: trunk/inc/player.php

Last change on this file was 699, checked in by george, 15 years ago
  • Opraveno: Zobrazení postav na účtu.
File size: 12.8 KB
Line 
1<?php
2
3class Player
4{
5 var $SessionTimeout = 30;
6
7 private $db;
8
9 function __construct($db)
10 {
11 $this->db = &$db;
12 }
13
14 private function Msg($text, $err)
15 {
16 global $html;
17
18 if($err == 0) echo('<img src="'.$html->Link('/imgs/inc/on.gif').'">&nbsp;<font color="#234303" size="4">'.$text.'</font><br />');
19 else echo('<img src="'.$html->Link('/imgs/inc/off.gif').'">&nbsp;<font color="#990000" size="4\">'.$text.'</font><br />');
20 }
21
22 public function Register($acc_name, $pass, $email, $tbc)
23 {
24 global $Config;
25
26 $this->db->select_db($Config['Mangos']['DatabaseRealmd']);
27
28 $find = $this->db->query('SELECT `id` FROM `account` WHERE `username` = "'.$acc_name.'"');
29 if($find->num_rows == 0)
30 {
31 $sha_pass = sha1(strtoupper($acc_name).':'.strtoupper($pass));
32 $sql = $this->db->query('INSERT INTO `account` ( `id` , `username` , `sha_pass_hash` , `gmlevel` , `sessionkey` , `v` , `s` , `email` , `joindate` , `last_ip` , `failed_logins` , `locked` , `last_login` , `online` , `tbc` , `mutetime` , `locale` ) '.
33 ' VALUES (NULL , "'.$acc_name.'", "'.$sha_pass.'", 0, NULL , NULL , NULL , "'.$email.'", CURRENT_TIMESTAMP , "'.$_SERVER['REMOTE_ADDR'].'", 0, 0, "0000-00-00 00:00:00", 0, "'.$tbc.'", 0, 0)');
34 $this->Msg('Účet založen úspěšně', 0);
35 echo('<meta http-equiv="refresh" content="0;'.$html->Link('/ucet/').'">');
36 } else
37 {
38 $this->Msg('Zadané jmnéno účtu již existuje', 1);
39 }
40 }
41
42 public function Login($username, $pass)
43 {
44 global $Config;
45
46 $this->db->select_db($Config['Mangos']['DatabaseRealmd']);
47
48 $sha_pass = sha1(strtoupper($username).':'.strtoupper($pass));
49 $sql = $this->db->query('SELECT `id` FROM `account` WHERE `username`="'.$username.'" AND `sha_pass_hash`="'.$sha_pass.'"');
50 if($sql->num_rows == 1)
51 {
52 $row = $sql->fetch_assoc();
53 $_SESSION['UserId'] = $row['id'];
54 $_SESSION['UserName'] = $username;
55 $this->Msg('Přihlášení úspěšné', 0);
56 } else
57 {
58 $this->Msg('Přihlášení neúspěšné', 1);
59 }
60 }
61
62 public function Logout()
63 {
64 $_SESSION['UserId'] = 0;
65 $_SESSION['UserName'] = '';
66 $this->Msg('Odhlášení úspěšné', 0);
67 }
68
69 public function Check()
70 {
71 if(!array_key_exists('Time', $_SESSION)) $_SESSION['Time'] = time();
72 if(!array_key_exists('UserId', $_SESSION)) $_SESSION['UserId'] = 0;
73 if($_SESSION['Time'] < (time() - 60 * $this->SessionTimeout)) $this->Logout();
74 $_SESSION['Time'] = time();
75 return($_SESSION['UserId'] != 0);
76 }
77
78 public function LoginForm()
79 {
80 global $html;
81
82 echo('<form method="post" action="'.$html->Link('/ucet/').'">'.
83 '<table>'.
84 '<tr>'.
85 '<td><b>Jméno : </b></td><td><input type="text" name="user" class="textinput"></td>
86 </tr>
87 <tr>
88 <td><b>Heslo : </b></td><td><input type="password" name="pass" autocomplete="off" class="textinput"></td>
89 </tr>
90 <tr>
91 <td colspan="2" align="right"><input type="submit" value="Příhlásit" name="login"></td>
92 </tr>
93 </table>
94 </form>
95 <div align="left">
96 <a href="'.$html->Link('/registrace/').'">Registrace</a><br />'. //<a href="'.$html->Link('/ucet/obnova-hesla/').'">Obnova hesla</a>
97 '</div>');
98 }
99
100 public function GetPlayerLvl($guid, $RealmId)
101 {
102 global $Config, $System;
103
104 $Realm = new Realm($System, $RealmId);
105 $DbResult = $Realm->CharactersDatabase->query('SELECT CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, " ", '.($Config['Mangos']['CharacterDataOffset']['Level'] + 1).'), " ", -1) AS UNSIGNED) AS `level` FROM `characters` WHERE `guid` = "'.$guid.'" LIMIT 1;');
106 $row = $DbResult->fetch_assoc();
107 return($row['level']);
108 }
109
110 public function GetGmLvl()
111 {
112 global $Config;
113
114 $this->db->select_db($Config['Mangos']['DatabaseRealmd']);
115 $row = $this->db->query('SELECT `gmlevel` FROM `account` WHERE `id` = "'.$_SESSION['UserId'].'" LIMIT 1;')->fetch_assoc();
116 return($row['gmlevel']);
117 }
118
119 public function GetPlayerClass($Id)
120 {
121 $Class = array(1 => 'warrior', 2 => 'paladin', 3 => 'hunter', 4 => 'rogue', 5 => 'priest', 6 => 'death knight', 7 => 'shaman', 8 => 'mage', 9 => 'warlock', 11 => 'druid');
122 if(array_key_exists($Id, $Class)) $Result = $Class[$Id];
123 else $Result = 'unknown';
124 return($Result);
125 }
126
127 public function GetPlayerRace($Id)
128 {
129 $Race = array(1 => 'human', 2 => 'orc', 4 => 'dwarf', 4 => 'nightelf', 5 => 'undead', 6 => 'tauren', 7 => 'gnome', 8 => 'troll', 9 => 'goblin', 10 => 'bloodelf', 11 => 'draenei');
130 if(array_key_exists($Id, $Race)) $Result = $Race[$Id];
131 else $Result = 'unknown';
132 return($Result);
133 }
134
135 public function ResetXP($guid)
136 {
137 global $System, $Config;
138
139 if($this->CharInAcc($guid, 0))
140 {
141 if(!$this->IsOnline($guid))
142 {
143 $Realm = new Realm($System, $_COOKIE['RealmIndex']);
144 $row = $Realm->CharactersDatabase->query('SELECT `data` FROM `characters` WHERE `guid` = "'.$guid.'" LIMIT 1')->fetch_assoc();
145 $data = explode(' ', $row['data']);
146 $data[$Config['Mangos']['CharacterDataOffset']['Exp']] = 0;
147 $data = implode(' ', $data);
148 $Realm->CharactersDatabase->query('UPDATE `characters` SET `data` = "'.$data.'" WHERE `guid` ="'.$guid.'" LIMIT 1');
149 $this->Msg('Postavě resetováno XP.', 0);
150 } else $this->Msg('Postava musí být offline.', 1);
151 } else $this->Msg('Tato postava není vaše.', 1);
152 }
153
154 public function ResetPosition($guid)
155 {
156 global $System, $Config;
157
158 $Realm = new Realm($System, $_COOKIE['RealmIndex']);
159 if($this->CharInAcc($guid, 0))
160 {
161 if(!$this->IsOnline($guid))
162 {
163 $row = $Realm->CharactersDatabase->query('SELECT * FROM `character_homebind` WHERE `guid` = "'.$guid.'" LIMIT 1;')->fetch_array();
164 $home_char_map = $row['map'];
165 $home_char_position_x = $row['position_x'];
166 $home_char_position_y = $row['position_y'];
167 $home_char_position_z = $row['position_z'];
168 if(isset($home_char_map) and isset($home_char_position_x) and isset($home_char_position_y) and isset($home_char_position_z))
169 {
170 $Realm->CharactersDatabase->query('UPDATE `characters` SET '.
171 '`map` = "'.$home_char_map.'" , '.
172 '`position_x` ="'.$home_char_position_x.'" , '.
173 '`position_y` = "'.$home_char_position_y.'" , '.
174 '`position_z` = "'.$home_char_position_z.'" '.
175 ' WHERE `guid` ='.$guid.' LIMIT 1;');
176 $this->Msg('Postava teleportována.', 0);
177 }
178 } else $this->Msg('Postava musí být offline.', 1);
179 } else $this->Msg('Tato postava není vaše.', 1);
180 }
181
182 public function PlayerJail($guid)
183 {
184 global $System, $Config;
185
186 $Realm = new Realm($System, $_COOKIE['RealmIndex']);
187 // .go xyz -90.54 41.35 -31.71
188 // .go xyz -91.01 100.46 -31.71
189 // .go xyz -119.16 71.82 -31.71
190 $defined_positions = array
191 (
192 'x1' => '-90.54',
193 'y1' => '41.35',
194 'z1' => '-31.71',
195 'o1' => '1.4623',
196
197 'x2' => '-91.01',
198 'y2' => '100.46',
199 'z2' => '-31.71',
200 'o3' => '4.6282',
201
202 'x3' => '-119.16',
203 'y3' => '71.82',
204 'z3' => '-31.71',
205 'o3' => '6.2116',
206 );
207 $rand_place = rand(1, 3);
208 if(!$this->IsOnline($guid))
209 {
210 $Realm->CharactersDatabase->query('UPDATE `characters` SET `map` = 35 ,'.
211 '`orientation` = "'.$defined_positions['o'.$rand_place].'" ,'.
212 '`position_x` ="'.$defined_positions['x'.$rand_place].'" ,'.
213 '`position_y` = "'.$defined_positions['y'.$rand_place].'" ,'.
214 '`position_z` = "'.$defined_positions['z'.$rand_place].'"'.
215 ' WHERE `guid` ="'.$guid.'" LIMIT 1;');
216 $Realm->CharactersDatabase->query('INSERT INTO `character_aura` (`guid`, `caster_guid`, `spell`, `effect_index`, `amount`, `maxduration`, `remaintime`, `remaincharges`) VALUES '.
217 '('.$guid.', '.$guid.', 23775, 0, 1, -1, -1, -1), '.
218 '('.$guid.', '.$guid.', 36558, 0, 1, -1, -1, -1);');
219 $this->Msg('Postava ve vězení.', 0);
220 } else $this->Msg('Postava musí být offline.', 1);
221 }
222
223 public function IsOnline($guid)
224 {
225 global $System, $Config;
226
227 $Realm = new Realm($System, $_COOKIE['RealmIndex']);
228 $row = $Realm->CharactersDatabase->query('SELECT `online` FROM `characters` WHERE `guid` = "'.$guid.'" LIMIT 1;')->fetch_assoc();
229 if($row['online'] == 1) return(true);
230 else return(false);
231 }
232
233 public function CharInAcc($char, $acc)
234 {
235 global $Config, $System;
236
237 if($this->Check())
238 {
239 if($acc == 0)
240 {
241 $acc = $_SESSION['UserId'];
242 }
243 $Realm = new Realm($System, $_COOKIE['RealmIndex']);
244 if($Realm->CharactersDatabase->query('SELECT `guid` FROM `characters` WHERE `characters`.`guid`="'.$char.'" AND `account`="'.$acc.'" LIMIT 1;')->num_rows == 1)
245 {
246 return(true);
247 } else
248 {
249 return false;
250 }
251 } else
252 {
253 $this->Msg('Nejste přihlášen', 1);
254 die;
255 }
256 }
257
258 public function CharNameToGuid($name)
259 {
260 global $System, $Config;
261
262 $Realm = new Realm($System, $_COOKIE['RealmIndex']);
263 $row = $Realm->CharactersDatabase->query('SELECT `guid` FROM `characters` WHERE `name` LIKE "'.$name.'" LIMIT 1;')->fetch_assoc();
264 if($row['guid'] != '')
265 {
266 return($row['guid']);
267 } else
268 {
269 return('Nenalezen');
270 }
271 }
272
273 public function GuidToCharName($guid)
274 {
275 global $Config;
276
277 $Realm = new Realm($System, $_COOKIE['RealmIndex']);
278 $row = $Realm->CharactersDatabase->query('SELECT `name` FROM `characters` WHERE `guid` = "'.$guid.'" LIMIT 1;')->fetch_assoc();
279 if($row['name'] != '')
280 {
281 return($row['name']);
282 } else
283 {
284 return('Nenalezen');
285 }
286 }
287
288 public function AccNameToGuid($name)
289 {
290 global $Config;
291
292 $this->db->select_db($Config['Mangos']['DatabaseRealmd']);
293 $row = $this->db->query('SELECT `id` FROM `account` WHERE `username` LIKE "'.$name.'" LIMIT 1;')->fetch_assoc();
294 //return($row['id']);
295 if($row['id'] != '')
296 {
297 return($row['id']);
298 } else
299 {
300 return('Nenalezen');
301 }
302 }
303
304 public function MoveChar($acc1_name, $acc1_pass, $acc2_name, $char_name)
305 {
306 global $Config;
307
308 $this->db->select_db($Config['Mangos']['DatabaseRealmd']);
309 $sha_pass = sha1(strtoupper($acc1_name).':'.strtoupper($acc1_pass));
310 $sql = $this->db->query('SELECT `id` FROM `account` WHERE `username`="'.$acc1_name.'" AND `sha_pass_hash`="'.$sha_pass.'"');
311 if($sql->num_rows == 1)
312 {
313 $acc1_guid = $this->AccNameToGuid($acc1_name);
314 $acc2_guid = $this->AccNameToGuid($acc2_name);
315 $char_guid = $this->CharNameToGuid($char_name);
316 if($this->CharInAcc($char_guid, $acc1_guid))
317 {
318 $this->db->query('UPDATE `characters` SET `account` = "'.$acc2_guid.'" WHERE `guid` ="'.$char_guid.'" LIMIT 1');
319 $this->Msg('Postava přemístěna.', 0);
320 } else
321 {
322 $this->Msg('Tato postava není vaše.', 1);
323 }
324 }
325 }
326
327 public function CharsOnAcc($accid)
328 {
329 global $Config, $System, $html;
330
331 $DbResult = $System->Database->query('SELECT Name,Id FROM Realm WHERE Enabled=1');
332 while($DbRealm = $DbResult->fetch_array())
333 {
334 echo('<div>'.$DbRealm['Name'].'</div>');
335 echo('<table class="BaseTable">
336 <tr>
337 <th>Jméno</th>
338 <th>Úroveň</th>
339 <th>Rasa</th>
340 <th>Třída</th>
341 <th>Nahráno</th>
342 </tr>');
343 $Realm = new Realm($System, $DbRealm['Id']);
344 $sql = $Realm->CharactersDatabase->query('SELECT `guid`,`name`,`race`,`totaltime`,`class`, mid(lpad( hex( CAST(substring_index(substring_index(data, " ", '.($Config['Mangos']['CharacterDataOffset']['Gender'] + 1).'), " ",-1) AS unsigned) ), 8, 0), 4, 1) AS gender FROM `characters` WHERE `account`='.$accid.' ORDER BY `totaltime` DESC LIMIT 0, 10');
345 while($row = $sql->fetch_array())
346 {
347 $gender = ($row['gender'] == 0) ? '0' : '1';
348 echo('<tr>'.
349 '<td>'.$row['name'].'</td>'.
350 '<td>'.$this->GetPlayerLvl($row['guid'], $DbRealm['Id']).'</td>'.
351 '<td><img src="'.$html->Link('/imgs/icons/'.$row['race'].'-'.$gender.'.gif').'" alt="rasa" /></td>'.
352 '<td><img src="'.$html->Link('/imgs/icons/'.$row['class'].'.gif').'" alt="trida" /></td>'.
353 '<td>'.round($row['totaltime'] / 3600).' h</td>'.
354 '</tr>');
355 }
356 echo('</table>');
357 }
358 }
359}
360
361?>
Note: See TracBrowser for help on using the repository browser.