· 5 years ago · Mar 18, 2020, 06:42 PM
1<?php
2// Settings file
3include 'settings.php';
4
5// System from here
6$errlvl = $sandbox ? E_ALL ^ E_DEPRECATED : 0;
7error_reporting($errlvl);
8
9$mobile = true;
10
11if(!isset($_GET["mobile"]) || $_GET["mobile"] != "laj44o7hg8")
12 $mobile = false;
13
14// Maintenance
15if(isset($serverMaintenance) && $serverMaintenance == true) {
16 exit('Error:server not available');
17}
18
19// Referer check anti-cheat
20//include "sf/anti/referer.php";
21
22
23// Functions
24include 'sf/misc.php';
25include 'sf/chat.php';
26include 'sf/album.php';
27include 'sf/entity.php';
28include 'sf/fortress.php';
29include 'sf/player.php';
30include 'sf/achievments.php';
31include 'sf/account.php';
32include 'sf/item.php';
33include 'sf/simulate.php';
34include 'sf/guild.php';
35include 'sf/pets.php';
36include 'sf/blacksmith.php';
37include 'sf/password.php';
38include 'sf/underworld.php';
39
40date_default_timezone_set($timezone);
41
42$ip = $_SERVER['REMOTE_ADDR'];
43
44if(!isset($_GET['req']))
45 exit("Error:wrong request");
46
47if(!isset($_SERVER['HTTP_USER_AGENT']))
48 exit("Error:no user agent");
49
50$req = substr( $_GET['req'], 16);
51//$req = base64_decode(str_pad(strtr($req, '-_', '+/'), strlen($req) % 4, '=', STR_PAD_RIGHT));
52$req = str_pad(strtr($req, '-_', '+/'), strlen($req) % 4, '=', STR_PAD_RIGHT);
53
54$key = '[_/$VV&*Qg&)r?~g';
55$iv = 'jXT#/vz]3]5X7Jl\\';
56$keyId = substr( $_GET['req'], 0, 16);
57if($keyId == "0-0K36aS2567C735")
58 $key = "5O4ddy4KZLs41n6W";
59else if($keyId != "0-00000000000000")
60 exit("Error:cryptoid not found&cryptoid:0-0K36aS2567C735&cryptokey:5O4ddy4KZLs41n6W");
61
62//$req = mcrypt_decrypt (MCRYPT_RIJNDAEL_128, $key, $req, MCRYPT_MODE_CBC, $iv);
63$req = openssl_decrypt($req, "AES-128-CBC", $key, OPENSSL_ZERO_PADDING, $iv);
64
65$req = rtrim ( $req, "\0");
66
67// EXPERIMENTAL injection-fix by Jessi
68$zeichen = array();
69$zeichen[] = "--";
70$zeichen[] = "*";
71$zeichen[] = "+";
72$zeichen[] = '"';
73$zeichen[] = "'";
74$zeichen[] = '\'';
75$rq = str_replace($zeichen,'',$req);
76
77// ctracker - Jessi
78$cracktrack = $req . $_GET["rnd"] . $_GET["c"];
79$checkworm = $cracktrack;
80$wormprotector = array('chr(', 'chr=', 'chr%20', '%20chr', 'wget%20', '%20wget', 'wget(',
81 'cmd=', 'rush=', '%20rush', 'rush%20',
82 'union%20', '%20union', 'union(', 'union=', 'echr(', '%20echr', 'echr%20', 'echr=',
83 'esystem(', 'esystem%20', 'cp%20', '%20cp', 'cp(', 'mdir%20', '%20mdir', 'mdir(',
84 'mcd%20', 'mrd%20', '%20mcd', '%20mrd',
85 'mcd(', 'mrd(', 'rm(', 'mcd=', 'mrd=', 'mv%20', 'rmdir%20', 'mv(', 'rmdir(',
86 'chmod(', 'chmod%20', '%20chmod', 'chmod(', 'chmod=', 'chown%20', 'chgrp%20', 'chown(', 'chgrp(',
87 'locate%20', 'grep%20', 'locate(', 'grep(', 'diff%20', 'kill%20', 'kill(', 'killall',
88 'passwd%20', '%20passwd', 'passwd(', 'telnet%20', 'vi(',
89 'insert%20into', 'select%20', 'nigga(', '%20nigga', 'nigga%20', 'fopen', 'fwrite',
90 '$_request', '$_get', '$request', '$get', '.system', 'HTTP_PHP', '&aim', '%20getenv', 'getenv%20',
91 'new_password', '&icq','/etc/password','/etc/shadow', '/etc/groups', '/etc/gshadow',
92 'HTTP_USER_AGENT', 'HTTP_HOST', '/bin/ps', 'wget%20', 'uname\x20-a', '/usr/bin/id',
93 '/bin/echo', '/bin/kill', '/bin/', '/chgrp', '/chown', '/usr/bin', 'g\+\+', 'bin/python',
94 'bin/tclsh', 'bin/nasm', 'perl%20', 'traceroute%20', 'ping%20', '/usr/X11R6/bin/xterm', 'lsof%20',
95 '/bin/mail', '.conf', 'motd%20', 'HTTP/1.', '.inc.php', 'config.php', 'cgi-', '.eml',
96 'file\://', 'window.open', '<SCRIPT>', 'javascript\://','img src', 'img%20src','.jsp','ftp.exe',
97 'xp_enumdsn', 'xp_availablemedia', 'xp_filelist', 'xp_cmdshell', 'nc.exe', '.htpasswd',
98 'servlet', '/etc/passwd', 'wwwacl', '~root', '~ftp', '.js', '.jsp', 'admin_', '.history',
99 'bash_history', '.bash_history', '~nobody', 'server-info', 'server-status', 'reboot%20', 'halt%20',
100 'powerdown%20', '/home/ftp', '/home/www', 'secure_site, ok', 'chunked', 'org.apache', '/servlet/con',
101 '<script', '/robot.txt' ,'/perl' ,'mod_gzip_status', 'db_mysql.inc', '.inc', 'select%20from',
102 'select from', 'drop%20', 'drop ', '.system', 'getenv', 'http_', '_php', 'php_', 'phpinfo()', '<?php', '?>', 'sql=',
103 '$mysql_', 'java script:');
104
105foreach($wormprotector as $worm)
106{
107 $checkworm = strtr($checkworm, [$worm => "*"]);
108 $checkworm = strtr($checkworm, [urldecode($worm) => "*"]);
109
110 if($cracktrack != $checkworm){
111 $cremotead = $_SERVER['REMOTE_ADDR'];
112 $cremotead .= ":" . $_SERVER['HTTP_USER_AGENT'];
113 $cremotead .= ":" . $cracktrack;
114 file_put_contents("att.dat", (file_get_contents("att.dat") . PHP_EOL . $cremotead));
115 exit("Error:bad word " . urldecode($worm));
116 }
117}
118
119// eof
120
121// Verify count and random by Greg
122
123$_GET["c"] = intval($_GET["c"]);
124
125if(!is_numeric(explode(".", $_GET["rnd"])[1]))
126 exit();
127
128$_GET["rnd"] = "0." . explode(".", $_GET["rnd"])[1];
129
130
131$db->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_TO_STRING);
132$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
133
134$db->exec("SET sql_mode=''");
135
136if($sandbox)
137 $orireq = $req;
138
139$req = explode("|", $req);
140
141if (!isset($req[1]))
142 $req = ["00000000000000000000000000000000", "accountcheck:Greg"];
143
144$ssid = $req[0];
145$req = explode(":", $req[1]);
146
147$act = $req[0];
148$args = explode("/", $req[1]);
149
150$badwords = [
151 "admin"
152];
153foreach($badwords as $bw)
154{
155 if(preg_match(("/" . $bw . "/i"), ($_SERVER["QUERY_STRING"] . $req[1])))
156 exit("Error:not allowed word $bw");
157}
158
159if(strlen($ssid) != 32)
160 exit("Error:invalid ssid length");
161$ret[] = "sf:1";
162if($ssid != "00000000000000000000000000000000"){
163 // Session modification check anti-cheat
164 include "sf/anti/lastsess.php";
165
166 if($act == "poll"){
167 $qry = $db->prepare("SELECT players.ID, players.highest, players.logs, players.perm, players.whisper, players.perm, players.banned, players.poll, players.guild, fortress.ut1, fortress.ut2, fortress.ut3, fortress.uttime1, fortress.uttime2, fortress.uttime3 FROM players LEFT JOIN fortress ON players.ID = fortress.owner WHERE ssid = :ssid");
168 }else{
169 $qry = $db->prepare("SELECT ID, highest, logs, poll, perm, guild, banned, perm FROM players WHERE ssid = :ssid");
170 }
171 $qry->bindParam(':ssid', $ssid);
172 $qry->execute();
173
174 if($qry->rowCount() == 0)
175 exit("Error:sessionid invalid");
176
177 $playerData = $qry->fetch(PDO::FETCH_ASSOC);
178 $playerID = $playerData['ID'];
179 $playerPoll = $playerData['poll'];
180 $playerGuild = $playerData['guild'];
181 $playerPerm = $playerData['perm'];
182
183 if($playerData['banned'] != 0) {
184 exit('Error:admin lock permanent');
185 }
186
187 // Anti-cheat against requesters
188 if($act != 'poll' && $playerPerm < 10) {
189 $rrr = intval($_GET["c"]);
190
191 $logs = $playerData["logs"];
192
193 if($logs == "")
194 $rz = [];
195 else
196 {
197 $rz = explode(",", $logs);
198 }
199
200 $antiact = 0;
201
202 if($rrr == $playerData["highest"])
203 $antiact = 2;
204 else if (($playerData["highest"] - $rrr) > 5)
205 $antiact = 1;
206 else
207 {
208 foreach($rz as $num)
209 {
210 if ($rrr == $num)
211 $antiact = 2;
212 }
213 }
214
215 if ($antiact > 0)
216 {
217 $db->exec("UPDATE players SET maycheat = maycheat + 1 WHERE ID = $playerID");
218
219 if($antiact == 2)
220 $db->exec("UPDATE players SET warned = 2 WHERE ID = $playerID");
221
222 exit("Error:fake request");
223 }
224
225 $rz[] = $rrr;
226
227 $rz = array_slice($rz, -10);
228
229 $logs = implode(",", $rz);
230
231 $sql = "UPDATE players SET logs = '$logs', highest = $rrr WHERE ID = '$playerID'";
232 $db->exec($sql);
233 }
234}
235
236switch($act){
237 case 'accountcreate':
238
239 //"00000000000000000000000000000000|accountcreate:sp/pass/ddask@ldpwqe.com/2/8/3/3,302,4,6,5,6,1,2,3/0/sfgame_new_flash/pl
240 //race/gender/class/face/
241
242 // Check IP block
243 if(Misc::isIpBlocked($ip))
244 exit("Error:your ip is blocked");
245
246 $name = $args[0];
247
248 //check if name allowed, if not exit like this
249 if(preg_match('/[^A-Za-z0-9 ]/', $name) || strlen($name) > 26)
250 exit('Error:name is not avaible');
251
252 //client reserved name
253 if(preg_match('/admin/', strtolower($name)) || preg_match('/tulaj/', strtolower($name)) || preg_match('/owner/', strtolower($name)))
254 exit('Error:name is not avaible');
255
256 //numeric numbers not allowed, compliactions with arena, clients fault...
257 if(is_numeric($name))
258 exit('Error:name is not avaible');
259
260 $pass = $args[1];
261 $mail = $args[2];
262
263 $gender = $args[3];
264 $race = $args[4];
265 $class = $args[5];
266
267 $face = $args[6];
268
269
270 $qry = $db->prepare("SELECT name FROM players WHERE name = :name");
271 $qry->bindParam(':name', $name);
272 $qry->execute();
273
274 if($qry->fetch( PDO::FETCH_ASSOC ))
275 exit("Error:character exists");
276
277 // No multiple e-mails
278 $qry = $db->prepare("SELECT email FROM players WHERE email = :email");
279 $qry->bindParam(':email', $mail);
280 $qry->execute();
281
282 if($qry->fetch( PDO::FETCH_ASSOC ))
283 exit("Error:mail not available");
284
285
286 // Password system v2
287 $passgen = new Password($pass, false);
288 $passgen->createKey($name);
289
290 $pass = $passgen->encrypt();
291
292 $startingGold *= 100;
293
294 $qry = $db->prepare("INSERT INTO players(name, password, email, face, race, gender, class, silver, mush)
295 VALUES(:name, :pass, :mail, :face, :race, :gender, :class, $startingGold, $startingMush)");
296
297 $qry->bindParam(':name', $name);
298 $qry->bindParam(':pass', $pass);
299 $qry->bindParam(':mail', $mail);
300 $qry->bindParam(':face', $face);
301 $qry->bindParam(':race', $race);
302 $qry->bindParam(':gender', $gender);
303 $qry->bindParam(':class', $class);
304 $qry->execute();
305
306 $qry = $db->prepare("SELECT ID FROM players WHERE name = :name");
307 $qry->bindParam(':name', $name);
308 $qry->execute();
309
310 $pid = $qry->fetch(PDO::FETCH_ASSOC)['ID'];
311
312 //insert a nice welcoming message :P
313 if(!$sandbox && $wmail_enable)
314 $db->exec("INSERT INTO messages(sender, reciver, time, topic, message) VALUES(0, $pid, ".$GLOBALS["CURRTIME"].", '$wmail_subject', '$wmail_body')");
315
316 //fortress
317 $db->exec("INSERT INTO fortress(owner, wood, stone) VALUES($pid, $fortStartingWood, $fortStartingStone)");
318
319 //copycats
320 $db->exec("INSERT INTO copycats(owner, class, str, dex, intel, wit) VALUES($pid, 1, 1046, 358, 531, 1065);
321 INSERT INTO copycats(owner, class, str, dex, intel, wit) VALUES($pid, 2, 358, 531, 1046, 799);
322 INSERT INTO copycats(owner, class, str, dex, intel, wit) VALUES($pid, 3, 358, 1046, 531, 799);");
323
324
325 //starting weapon
326 $weapon = Item::genItem(1000001, 1, $class);
327 $weapon['value_silver'] = 1;
328 $weapon['item_id'] = 1 + ($class - 1) * 1000;
329 if($class == 4) { // Assassin
330 $weapon['item_id'] = 1;
331 Account::addSecondWep($pid, $class);
332 }
333 if($class == 5){ // BM
334 $weapon['item_id'] = 1;
335 }
336 if($class == 6){ // BERSERKER
337 $weapon['item_id'] = 1;
338 }
339 $db->exec('INSERT INTO items(owner, slot, type, item_id, dmg_min, dmg_max, a1, a2, a3, a4, a5, a6, value_silver, value_mush) VALUES('.$pid.', 18, '.join(', ', $weapon).')');
340
341 //album
342 //Removed, album buyable in magic shop - Greg
343 //$db->exec('INSERT INTO items(owner, slot, type, item_id, value_silver) VALUES('.$pid.', 0, 13, 1, 1)');
344
345 //shops
346 for($i = 0; $i < 12; $i++){
347 $type = $i < 6 ? rand(1, 7) : rand(8, 10);
348 $item = Item::genItem($type, 1, $class);
349 $slot = 20 + $i;
350 $db->exec('INSERT INTO items(owner, slot, type, item_id, dmg_min, dmg_max, a1, a2, a3, a4, a5, a6, value_silver, value_mush) VALUES('.$pid.', '.$slot.', '.join(', ', $item).')');
351 }
352
353 $updateArgs = [];
354 //quests
355 for($i = 1; $i <= 3; $i++){
356 $quest = Account::generateQuest(1);
357 $updateArgs[] = "quest_exp$i = ".$quest['exp'];
358 $updateArgs[] = "quest_silver$i = ".$quest['silver'];
359 $updateArgs[] = "quest_dur$i = ".$quest['duration'];
360 }
361
362 // Dungs unlocked on default?
363 if(!$defAllDungUnlocked)
364 {
365 // Set dungeons to locked
366
367 for($i = 1; $i < 15; $i++){
368 $updateArgs[] = "d$i = 0";
369 $updateArgs[] = "dd$i = 0";
370 }
371
372 $updateArgs[] = "d16 = 0";
373 $updateArgs[] = "dd16 = 0";
374 }
375
376 // By Greg
377 // Lock/unlock other things if set in settings.php
378 if(!$defToiletUnlocked){
379 //Lock WC
380 $updateArgs[] = "wcaura = 0";
381 }
382
383 if($defUwUnlocked){
384 // UNDERWORLD
385 $db->exec("INSERT INTO underworld(owner, soul) VALUES($pid, $uwStartingSoul)");
386 }
387
388 if(!$tutorial) // check tutorial
389 $updateArgs[] = "tutorial = -1";
390
391
392 // Starting hourglass
393 $updateArgs[] = "hourglass = ".$startingHourglass;
394
395 $db->exec('UPDATE players SET '.join(', ', $updateArgs).' WHERE ID = '.$pid);
396
397 //resp
398 exit("skipallow:".$adventureMushSkip."×tamp:".$GLOBALS["CURRTIME"]."&playerid:$pid&tracking.s:signup&success:");
399
400 break;
401 case 'accountcheck':
402 //success if name avalible, error in case of login
403 //if keyid default, give out another keyset
404
405 // Check IP block
406 if(Misc::isIpBlocked($ip))
407 exit("Error:your ip is blocked");
408
409 $keyId = "0-0K36aS2567C735";
410 $key = "5O4ddy4KZLs41n6W";
411
412 $name = $args[0];
413
414 //check if name allowed, if not exit like this
415 if(preg_match('/[^A-Za-z0-9 ]/', $name) || strlen($name) > 26)
416 exit('Error:name is not avaible');
417
418 //client reserved name
419 if(preg_match('/admin/', strtolower($name)) || preg_match('/tulaj/', strtolower($name)) || preg_match('/owner/', strtolower($name)))
420 exit('Error:name is not avaible');
421
422 //numeric numbers not allowed, compliactions with arena, clients fault...
423 if(is_numeric($name))
424 exit('Error:name is not avaible');
425
426 $qry = $db->prepare("SELECT name FROM players WHERE name = :name");
427 $qry->bindParam(':name', $name);
428 $qry->execute();
429
430 //if character exists -> login
431 if($qry->fetch( PDO::FETCH_ASSOC ))
432 exit("Error:character exists&cryptoid:$keyId&cryptokey:$key");
433
434 //if name is free
435 exit("Success:&cryptoid:$keyId&cryptokey:$key");
436 break;
437 case 'accountlogin':
438
439 // Check IP block
440 if(Misc::isIpBlocked($ip))
441 exit("Error:your ip is blocked");
442
443 $qry = $db->prepare("SELECT players.*, fortress.*, guilds.portal AS guild_portal, guilds.instructor, guilds.treasure, guilds.dungeon AS raid FROM players LEFT JOIN fortress ON players.ID = fortress.owner LEFT JOIN guilds ON players.guild = guilds.ID WHERE players.name = :name");
444 $qry->bindParam(':name', $args[0]);
445 $qry->execute();
446
447 $playerData = $qry->fetch ( PDO::FETCH_ASSOC );
448
449 $playerID = $playerData["ID"];
450
451
452 if($qry->rowCount() == 0)
453 exit('Error:player not found');
454
455 //$ppp = sha1(sha1(strval($_GET["rnd"]) . "ahHoj2woo1eeChiech6ohphoB7Aithoh" . "@Gergoka1") . strval($args[2]));
456 //print_r($args);
457 //exit($args[2].";".$args[1].";".$ppp);
458
459 $H = explode('$S', $args[1]);
460
461 if(count($H) != 2)
462 exit("Error:wrong password sys");
463
464 $pass = substr($H[1], 0, (strlen($args[2]) * -1));
465 $pw = $H[0];
466
467 // Password system v2 - get decrypted password
468 $passgen = new Password($playerData['password'], true);
469 $passgen->createKey($playerData["name"]);
470 $userpass = $passgen->decrypt();
471
472 // Password check by Greg (working only with Greg's SWF)
473 if(sha1($pass) != sha1($userpass)) { // Normal password check
474 if($pass == $playerData['randpw']) { // Auto login/Face login (without real password)
475 // Logged in
476 }else{
477 exit("Error:wrong pass");
478 }
479 }
480
481 // Check ban
482 if($playerData['banned'] != 0) {
483 exit('Error:admin lock permanent');
484 }
485
486 $now = Misc::getNow();
487
488 if($playerData['newday'] != $now) {
489 $uw = new Underworld($playerID);
490
491 if($uw->haveIt) {
492 //Calculate hourly gold
493 $uw->newHourlyGold($playerData["lvl"]);
494
495 //Reset lured today
496 $uw->data["lured"] = 0;
497 $db->exec("UPDATE underworld SET lured = ".$uw->data["lured"]." WHERE owner = ".$uw->data["owner"]);
498
499 if($uw->data['time'] > 0) {
500 $thirst = $playerData['thirst'] / 60;
501
502 if($thirst > $uw->getTimeMachineThirst()[0]) {
503 $thirst = $uw->getTimeMachineThirst()[0];
504 }
505
506 $days = $now - $playerData['newday'];
507 $days --;
508
509 $thirst += $days * $uw->getTimeMachineThirst()[0];
510
511 $timebonus = floor($uw->getTimeMachineThirst()[0] / 4); // Bonus
512 $thirst += $timebonus;
513
514 $thirst += $days * $timebonus;
515
516 $uw->data["timeamount"] += $thirst;
517
518 if($uw->data["timeamount"] > $uw->getTimeMachineThirst()[1]) {
519 $uw->data["timeamount"] = $uw->getTimeMachineThirst()[1];
520 }
521
522 $db->exec("UPDATE underworld SET timeamount = ".$uw->data["timeamount"]." WHERE owner = ".$uw->data["owner"]);
523 }
524
525 }
526
527 $newday = $now;
528 $playerData['beers'] = 0;
529 $playerData['thirst'] = 6000;
530 $playerData['mush'] += 10000;
531 $mush = $playerData['mush'];
532 $db->exec("UPDATE players SET newday = '$newday', beers = '0', thirst = '6000', mush = '$mush' WHERE ID = '".$playerData['ID']."'");
533
534 }
535
536 //get items
537 $items = $db->query("SELECT * FROM items WHERE owner = ".$playerData['ID']." ORDER BY slot ASC");
538 $items = $items->fetchAll(PDO::FETCH_ASSOC);
539
540 // gen ssid and randpw (Fix by Greg)
541 // also whispers are empty cuz echoed it
542 // reset logs (anti-cheat)
543 $ssid = md5(microtime() . $playerID);
544 $loco = rand(1, 999);
545 $time = $GLOBALS["CURRTIME"];
546
547 // New IP system
548 if(strlen($playerData["ip"]) < 5)
549 $ips = [];
550 else
551 $ips = json_decode($playerData["ip"], true);
552
553 // Browser
554 if(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE)
555 $ip2 = 'IE';
556 else if(strpos($_SERVER['HTTP_USER_AGENT'], 'Trident') !== FALSE) //For Supporting IE 11
557 $ip2 = 'IE';
558 else if(strpos($_SERVER['HTTP_USER_AGENT'], 'Firefox') !== FALSE)
559 $ip2 = 'Firefox';
560 else if(strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome') !== FALSE)
561 $ip2 = 'Chrome';
562 else if(strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mini') !== FALSE)
563 $ip2 = "OperaM";
564 else if(strpos($_SERVER['HTTP_USER_AGENT'], 'Opera') !== FALSE)
565 $ip2 = "Opera";
566 else if(strpos($_SERVER['HTTP_USER_AGENT'], 'Safari') !== FALSE)
567 $ip2 = "Safari";
568 else if(strpos($_SERVER['HTTP_USER_AGENT'], 'Android') !== FALSE)
569 $ip2 = "Android";
570 else
571 $ip2 = base64_encode($_SERVER['HTTP_USER_AGENT']);
572
573 if(!in_array($ip, $ips))
574 $ips[] = $ip;
575
576 if (!in_array($ip2, $ips))
577 $ips[] = $ip2;
578
579 $ips = json_encode($ips);
580
581 if ($mobile)
582 $randpw = "";
583 else
584 $randpw = ", randpw = '$pw'";
585
586
587 $db->exec("UPDATE players SET highest = '-1', logs = '', whisper = '', ip = '$ips', ssid = '$ssid'{$randpw}, poll = $time WHERE ID = '".$playerData['ID']."'");
588
589 //Geoflag by Greg
590 if($geoflag) {
591 $geo = unserialize(file_get_contents($geoServer . $_SERVER['REMOTE_ADDR']));
592 $country = $geo['geoplugin_countryCode'];
593 $country = strtolower($country); // Lower case: HU -> hu
594
595 $sf_countrys = ['ar', 'cs', 'da', 'de', 'el', 'en', 'es', 'fi', 'fr', 'hr',
596 'hu', 'it', 'ja', 'ko', 'nl', 'pl', 'pt', 'pt-br', 'ro', 'sk', 'sv', 'tr', 'zh'];
597
598 foreach($sf_countrys as $sfcountry) {
599 if($sfcountry == $country) {
600 $db->exec("UPDATE players SET flag = '".$country."' WHERE ID = $playerID");
601 }
602 }
603
604 }
605
606 //By Greg
607 //Infinite beers
608 if($infiniteBeer) {
609 $playerData['beers'] = 0;
610 $db->exec("UPDATE players SET beers = 0 WHERE ID = '".$playerData['ID']."'");
611 }
612
613 //Infinite wheel spins
614 if($infiniteWheel) {
615 $playerData['wheelcounts'] = 0;
616 $db->exec("UPDATE players SET wheelcounts = 0 WHERE ID = '".$playerData['ID']."'");
617 }
618
619 //get copycats
620 $copycats = $db->query("SELECT * FROM copycats WHERE owner = ".$playerData['ID']." ORDER BY class ASC");
621 $copycats = $copycats->fetchAll();
622
623 //get messages
624 $messages = $db->query('SELECT messages.ID, players.name, messages.hasRead, messages.topic, messages.time
625 FROM messages LEFT JOIN players ON messages.sender = players.ID WHERE reciver = '.$playerData['ID'].' ORDER BY time DESC');
626 $messages = $messages->fetchAll(PDO::FETCH_ASSOC);
627
628 //create account obj
629 $acc = new Account($playerData, $items, $copycats, true);
630
631 $acc->data['new_msg'] = $db->query('SELECT Count(ID) AS c FROM messages WHERE reciver = '.$playerData['ID'].' AND hasRead = false')->fetch(PDO::FETCH_ASSOC)['c'];
632
633 //tutorial skip - 16777215
634 if(!$tutorial) {
635 if($acc->data['tutorial'] != -1 && $acc->data['tutorial'] != 16777215) // check tutorial
636 //$db->exec("UPDATE players SET tutorial = '16777215' WHERE ID = '".$playerData['ID']."'");
637 $db->exec("UPDATE players SET tutorial = -1 WHERE ID = '".$playerData['ID']."'");
638 $acc->data['tutorial'] = -1;
639 }
640
641 //tutorial set
642 if($tutorial && $acc->data['tutorial'] == -1) {
643 $db->exec("UPDATE players SET tutorial = 0 WHERE ID = '".$playerData['ID']."'");
644 $acc->data['tutorial'] = 0;
645 }
646
647
648 $ret[] = "login count:".$loco;
649 $ret[] = "sessionid:".$ssid;
650 $ret[] = "inboxcapacity:1000";
651 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
652 $ret[] = "owndescription.s:".$playerData['description'];
653 $ret[] = "ownplayername.r:".$acc->getName();
654 $acc->data['allplayer'] = $db->query("SELECT Count(*) AS c FROM players WHERE honor > -1")->fetch(PDO::FETCH_ASSOC)['c'];
655 $ret[] = "maxrank:".$acc->data['allplayer'];
656 //$ret[] = "skipallow:1";
657 $ret[] = "skipallow:".$adventureMushSkip;
658
659 $uw = new Underworld($acc->data["ID"]);
660
661 if($uw->haveIt){
662 $ret[] = "underworldprice.underworldPrice(10):".$uw->getUpgradePrice();
663 $ret[] = "underworldupgradeprice.underworldupgradePrice(3):".$uw->getUnitUpgradePrice();
664 $ret[] = "underworldmaxsouls:".$uw->getMaxSouls();
665 }
666
667 $ret[] = "fortresspricereroll:".$acc->fortressRerollPrice();
668 $ret[] = "fortressprice.fortressPrice(13):".$acc->getFortressPriceSave();
669 $ret[] = "fortressGroupPrice.fortressPrice:".$acc->getHallOfKnightsPriceSave();
670 $ret[] = "unitprice.fortressPrice(3):".$acc->getTrainUnitsPrice();
671 $ret[] = "upgradeprice.upgradePrice(3):".$acc->getUpgradeUnitsPrice();
672 $ret[] = "unitlevel(4):".$acc->getUnitLvls();
673 $ret[] = "coinsspecial:".$mushroom_special;
674 //$ret[] = "speedtimer:1521990000"; // Speed server timer
675 if($oktoberfest)
676 {
677 $ret[] = "oktoberfest:1";
678 }
679
680 // Fixed in PetsSave
681 // Blacksmith fix by Greg (4,999,999 bug)
682 /*if($acc->data["blacksmith"] != null) {
683 $blacksmith = $acc->data["blacksmith"];
684 }else{
685 $blacksmith = "0/0/0/0";
686 }*/
687
688 // Pets by Greg
689 $pD = new Pets($acc->data["pets"], $acc->data["petsFed"], $acc->data["petsDung"], $acc->data["petsPvP"], $acc->data["petsBest2"], null, $acc->data['blacksmith'], $acc->data["pethonor"]);
690 if($pD->havePets()) {
691 $ret[] = "petsdefensetype:" . $pD->pvpData[0][1];
692 $ret[] = "ownpets.petsSave:" . $pD->getPetsSave();
693 }
694
695 if(($fortressBackpackSize = $acc->getFortressBackpackSize()) > 0)
696 $ret[] = "fortresschest.item(".$fortressBackpackSize."):".$acc->getFortressBackpackSave();
697
698
699 $ret[] = "singleportalenemylevel:200";
700 if($acc->hasTower()){
701 $ret[] = "owntower.towerSave:".$acc->getTowerSave();
702 $ret[] = "owntowerlevel:0"; // Idk
703 }
704
705 //guild
706 if($acc->hasGuild()){
707 $guild = new Guild($acc->data['guild']);
708
709 $ret[] = 'owngroupsave.groupSave:'.$guild->getGroupSave();
710 $ret[] = "owngrouppotion.r:".$guild->getPotionData();
711 $ret[] = "owngroupknights.r:".$guild->getHokData();
712 $ret[] = "owngroupname.r:".$guild->data['name'];
713 $ret[] = "owngroupdescription.s:".$guild->data['descr'];
714 $ret[] = "owngroupmember.r:".$guild->getMemberList();
715 $ret[] = "owngrouprank:".$guild->getRank();
716 if(($oga = $guild->getOwnGroupAttack()) !== false)
717 $ret[] = $oga;
718 $cost_1 = Guild::getGuildBuildingCost($acc->data['skill_gold']);
719 $cost_2 = Guild::getGuildBuildingCost($acc->data['skill_xp']);
720 $ret[] = 'groupskillprice(6):'.$cost_1['silver'].'/'.$cost_1['mush'].'/'.$cost_2['silver'].'/'.$cost_2['mush'].'/250/0';
721
722 $chattime = $db->query("SELECT Max(chattime) as chattime FROM guildchat WHERE guildID = $playerData[guild]")->fetch(PDO::FETCH_ASSOC)['chattime'];
723 $chat = Chat::getChat($playerData['guild']);
724
725 $ret[] = 'chathistory.s(5):'.Chat::formatChat($chat);
726 $ret[] = "chattime:$chattime";
727 }
728
729 // Whispers by Greg
730 $whisper = Chat::formatWhispers($playerData['whisper']);
731 if($whisper != '') {
732 $ret[] = 'chatwhisper.s:'.$whisper;
733 }
734
735 // Witch by Greg
736 $ret[] = "witch.witchData:9/{$acc->getWitchData()}/1452384000/0/1402139157/9/6/51/1387968268/0/61/1389353441/5/31/1390907951/8/101/1392626428/1/71/1394196822/2/41/1396169319/4/81/1398237044/7/11/1400137421/3/91/1402139201/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/";
737
738 $ret[] = "tavernspecial:".Misc::getEvent()[0];
739 $ret[] = 'wagesperhour:'.Account::getWagesPerHour($playerData['lvl']);
740 $ret[] = "dragongoldbonus:13";
741 $ret[] = "toilettfull:".$acc->toiletFullToday();
742
743 $ret[] = 'messagelist.r:'.Chat::formatMessages($messages);
744
745 // Combatlog by Greg
746 $ret[] = "combatloglist.s:".$acc->getCombatLog();
747
748 // Friends by Greg - v2
749 $ret[] = "friendlist.r:".$acc->friendList();
750
751 if($acc->hasAlbum())
752 $ret[] = "scrapbook.r:".$acc->album->data;
753 //$ret[] = "skipallow:1";
754 $ret[] = "skipallow:".$adventureMushSkip;
755 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
756 //$ret[] = "serverversion:1245";
757 //$ret[] = "serverversion:1268";
758 $ret[] = "serverversion:".$gameVersion;
759
760 // Achievments by Greg
761 $achi = $acc->achievments->getText();
762
763 $ret[] = "achievement(100):" . implode("/", $achi);
764
765 // Boi I ran
766 //$ret[] = "fortresswalllevel:3";
767
768 $ret[] = "success:";
769
770
771 break;
772 case 'playerarenaenemy':
773 //act used to get new enemies for arena
774
775 $acc = new Account(null, null, false, false);
776
777
778
779 //set new enemies for arena if time is up or have no enemies
780 if($acc->data['arena_nme1'] == 0){
781 //alg: get rank, get 20 enemies around, select 3 at random
782 $rank = $db->query("SELECT Count(*) as rank FROM players WHERE ID <> {$acc->data['ID']} AND honor > ".$acc->data['honor']);
783 $rank = $rank->fetch(PDO::FETCH_ASSOC)['rank'];
784
785 if($rank < 10)
786 $rank = 0;
787 else
788 $rank -= 10;
789
790 $playerpool = $db->query("SELECT ID FROM players FORCE INDEX(honor) WHERE ID <> {$acc->data['ID']} AND honor >= 0 ORDER BY honor DESC, ID DESC LIMIT $rank, 20")->fetchAll(PDO::FETCH_ASSOC);
791
792 if(count($playerpool) < 4)
793 exit('Error:no player data');
794
795 //shuffle once
796 shuffle($playerpool);
797
798 //shuffle while play in first 3
799 while($playerpool[0] == $playerID || $playerpool[1] == $playerID || $playerpool[2] == $playerID)
800 shuffle($playerpool);
801
802
803 $acc->data['arena_nme1'] = $playerpool[0]['ID'];
804 $acc->data['arena_nme2'] = $playerpool[1]['ID'];
805 $acc->data['arena_nme3'] = $playerpool[2]['ID'];
806
807 $db->exec("UPDATE players SET arena_nme1 = ".$playerpool[0]['ID'].", arena_nme2 = ".$playerpool[1]['ID'].", arena_nme3 = ".$playerpool[2]['ID']." WHERE ID = $playerID");
808 }
809
810
811 $ret[] = 'Success:';
812 $ret[] = 'ownplayersave.playerSave:'.$acc->getPlayerSave();
813
814 break;
815 case 'playerdungeonopen':
816
817 $acc = new Account(null, null, false, false);
818
819 $hasKey = $acc->keyInInv();
820
821 if(!is_numeric($hasKey))
822 {
823 $db->exec("UPDATE players SET d" . $hasKey->id . " = 2 WHERE ID = " . $acc->data["ID"]);
824 $db->exec("DELETE FROM items WHERE id = {$hasKey->raw["ID"]} AND owner = " . $acc->data["ID"]);
825
826 $acc = new Account(null, null, false, false);
827
828 $ret[] = "dungeonopened:".$hasKey->id;
829 $ret[] = 'ownplayersave.playerSave:'.$acc->getPlayerSave();
830 }
831
832 $faces = [
833 [129, 112, 6, 84, 31, 74, 116, 114, 4, 166],
834 [131, 38, 112, 86, 51, 102, 23, 67, 92, 169],
835 [28, 3, 57, 94, 140, 78, 93, 162, 142, 170],
836 [124, 45, 94, 107, 46, 39, 141, 47, 137, 172],
837 [9, 150, 36, 153, 17, 151, 161, 118, 160, 171],
838 [128, 86, 77, 81, 89, 16, 88, 30, 87, 167],
839 [66, 97, 82, 52, 158, 135, 102, 52, 149, 168],
840 [38, 143, 147, 144, 99, 154, 146, 98, 156, 164],
841 [136, 125, 99, 37, 129, 138, 90, 42, 74, -1],
842 [101, 115, 159, 21, 61, 163, 161, 159, 158, 165],
843 [173, 174, 175, 176, 177, 178, 179, 180, 181, 182],
844 [183, 184, 185, 186, 187, 188, 189, 190, 191, 192],
845 [243, 244, 245, 246, 247, 248, 249, 250, 251, 252],
846 [600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620],
847 [0],
848 [1100, 1101, 1102, 1103, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119],
849 [1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219]];
850
851 $dungeonfaces = [];
852 for($i = 1; $i <= 17; $i++){
853
854 if($i != 15) {
855 $d = $acc->data['d'.$i];
856 if($d > 1)
857 $d -= 2;
858 if( ($d == 10 && $i < 14) || $d == 20 )
859 $d--;
860 } else {
861 $d = 0;
862 }
863
864 $dungeonfaces[] = $faces[$i-1][$d];
865 }
866
867 $ret[] = "dungeonfaces(17):".join("/", $dungeonfaces);
868 $ret[] = $acc->getShadowDungs();
869 $ret[] = "Success:";
870
871 break;
872 case 'playershadowbattle':
873
874 //args for query
875 $qryArgs = [];
876
877 $fightlog = []; // By Greg
878
879 $acc = new Account(null, null, true, true);
880
881
882 // if(dung complete)
883 $dung = $acc->data['dd'.$args[0]] - 1;
884 if($dung < 0)
885 exit("Error:");
886 if($args[0] != 14 && $args[0] != 16 && $dung > 10)
887 exit();
888 if($acc->data['dungeon_time'] > $GLOBALS["CURRTIME"]){ //if time not up
889 if($acc->data['mush'] <= 0)
890 exit("Error:need more coins");
891 $acc->data['mush']--;
892 $qryArgs[] = "mush = mush - 1";
893 $acc->data['dungeon_time'] = 0;
894 $qryArgs[] = "dungeon_time = ".$acc->data['dungeon_time'];
895 }else{
896 $acc->data['dungeon_time'] = $GLOBALS["CURRTIME"] + 3600;
897 $qryArgs[] = "dungeon_time = ".$acc->data['dungeon_time'];
898 }
899
900 if(($freeSlot = $acc->getFreeBackpackSlot()) === false)
901 exit("Error:need a free slot");
902
903
904 //if dung 9 boss, monster = acc, ID -1?
905 if($args[0] == 9 && $acc->data['d9'] == 11){
906 $monster = clone($acc);
907 $monster->exp = 10000000;
908 $monster->gold = 1000000;
909 $monster->ID = 0;
910 $monster->hp = round($monster->hp * 2.5);
911 $monster->maxHp = $monster->hp;
912 //fightheader takes id from here
913 $monster->data['ID'] = 0;
914 $mirrorFight = true;
915 }else{
916 $monster = Monster::getDungMonster($args[0], $dung);
917 $monster->buff();
918 $mirrorFight = true;
919 }
920
921 $playerGroup = $acc->copycats;
922 $playerGroup[] = $acc;
923
924 $simulation = new GroupSimulation($playerGroup, [$monster]);
925 $simulation->simulate();
926
927 $bg = $args[0] + 50;
928 for($i = 0; $i < count($simulation->simulations); $i++){
929 $fight = $i+1;
930 $fightlog[] = "fightheader".$fight.".fighters:4/0/0/".$bg."/1/".$simulation->fightHeaders[$i];
931 $fightlog[] = "fight".$fight.".r:".$simulation->simulations[$i]->fightLog;
932 $fightlog[] = "winnerid".$fight.".s:".$simulation->simulations[$i]->winnerID;
933 }
934
935 $fightlog[] = 'fightadditionalplayers.r:'.$simulation->getAdditionals();
936
937
938 $rewardLog = [];
939 for($i = 0; $i < 21; $i++)
940 $rewardLog[] = 0;
941
942 if($simulation->win){
943 //win true
944 $rewardLog[0] = 1;
945 //silver
946 // $rewardLog[2] = 1;
947 //exp
948 $rewardLog[3] = $monster->exp;
949
950 $acc->addExp($monster->exp);
951
952 $qryArgs[] = "exp = ".$acc->data['exp'];
953 $qryArgs[] = "lvl = ".$acc->data['lvl'];
954
955 $acc->data['dd'.$args[0]]++;
956
957 $dung += 2;
958 $qryArgs[] = "dd".$args[0]." = ".$acc->data['dd'.$args[0]];
959
960
961 //item reward, always epic, random class, no silver value, NEVER SHIELD
962 while(($itemid = mt_rand(1, 7)) == 2);
963 $item = Item::genItem($itemid, $acc->lvl, mt_rand(1, 3), 100, 0, 'tower');
964 $item['value_silver'] = 0;
965 $itemReward = $acc->insertItem($item, $freeSlot);
966
967 $i = 9;
968 foreach($item as $s){
969 $rewardLog[$i] = $s;
970 $i++;
971 }
972
973
974 //album
975 if($acc->hasAlbum() && !$mirrorFight){
976 $a1 = $acc->album->addMonster($monster->ID);
977 $a2 = $acc->album->addItem($itemReward);
978 if($a1 || $a2){
979 $acc->album->encode();
980
981 $ret[] = "scrapbook.r:".$acc->album->data;
982 $acc->data['album'] = $acc->album->count;
983
984 // $db->query("UPDATE players SET album = ".$acc->album->count.", album_data = '".$acc->album->data."' WHERE ID = ".$acc->data['ID']);
985 $qryArgs[] = "album = ".$acc->album->count;
986 $qryArgs[] = "album_data = '".$acc->album->data."'";
987 }
988 }
989 }
990
991 $db->exec("UPDATE players SET ".join(", ", $qryArgs)." WHERE ID = ".$acc->data['ID']);
992
993 $fightlog = join('&', $fightlog);
994 $ret[] = $fightlog;
995
996 $rewardLog = join("/", $rewardLog)."/";
997
998
999 //$ret[] = "fightresult.battlereward:".join("/", $rewardLog)."/";
1000 $ret[] = "fightresult.battlereward:".$rewardLog;
1001 $ret[] = "Success:";
1002 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
1003 $ret[] = "owntower.towerSave:".$acc->getTowerSave();
1004 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
1005
1006 break;
1007 case 'playertowerbattle':
1008 //arg 0 = tower lvl, fuck your input m8
1009
1010 //args for query
1011 $qryArgs = [];
1012
1013 //Tower logs by Greg
1014 $fightlog = [];
1015
1016 $acc = new Account(null, null, true, true);
1017
1018 if(($freeSlot = $acc->getFreeBackpackSlot()) === false)
1019 exit("Error:need a free slot");
1020 if($acc->data['dungeon_time'] > $GLOBALS["CURRTIME"]){ //if time not up
1021 if($acc->data['mush'] <= 0)
1022 exit("Error:need more coins");
1023 $acc->data['mush']--;
1024 $qryArgs[] = "mush = mush - 1";
1025 $acc->data['dungeon_time'] = 0;
1026 $qryArgs[] = "dungeon_time = ".$acc->data['dungeon_time'];
1027 }else{
1028 $acc->data['dungeon_time'] = $GLOBALS["CURRTIME"] + 3600;
1029 $qryArgs[] = "dungeon_time = ".$acc->data['dungeon_time'];
1030 }
1031
1032 $monster = Monster::getTowerMonster($acc->data['tower']);
1033
1034 if($monster === null)
1035 exit("Error:tower closed");
1036
1037 $playerGroup = $acc->copycats;
1038 $playerGroup[] = $acc;
1039
1040 $simulation = new GroupSimulation($playerGroup, [$monster]);
1041 $simulation->simulate();
1042
1043 for($i = 0; $i < count($simulation->simulations); $i++){
1044 $fight = $i+1;
1045 $fightlog[] = "fightheader".$fight.".fighters:5/0/0/0/1/".$simulation->fightHeaders[$i];
1046 $fightlog[] = "fight".$fight.".r:".$simulation->simulations[$i]->fightLog;
1047 $fightlog[] = "winnerid".$fight.".s:".$simulation->simulations[$i]->winnerID;
1048 }
1049
1050 $fightlog[] = 'fightadditionalplayers.r:'.$simulation->getAdditionals();
1051
1052 $rewardLog = [];
1053 for($i = 0; $i < 21; $i++)
1054 $rewardLog[] = 0;
1055
1056 if($simulation->win){
1057 //win true
1058 $rewardLog[0] = 1;
1059 //silver
1060 $rewardLog[2] = 1;
1061 //no exp for tower
1062 // $rewardLog[3] = $monster->exp;
1063
1064 $acc->data['tower']++;
1065 $qryArgs[] = "tower = tower + 1";
1066
1067
1068 //item reward, always epic for random claass, no silver value, NOT SHIELD
1069 while(($itemid = mt_rand(1, 7)) == 2);
1070 $item = Item::genItem($itemid, $acc->lvl, mt_rand(1, 3), 100, 0, 'tower');
1071 $item['value_silver'] = 0;
1072 $itemReward = $acc->insertItem($item, $freeSlot);
1073
1074 $i = 9;
1075 foreach($item as $s){
1076 $rewardLog[$i] = $s;
1077 $i++;
1078 }
1079
1080
1081 //album
1082 if($acc->hasAlbum()){
1083 $a1 = $acc->album->addMonster($monster->ID);
1084 $a2 = $acc->album->addItem($itemReward);
1085 if($a1 || $a2){
1086 $acc->album->encode();
1087
1088 $ret[] = "scrapbook.r:".$acc->album->data;
1089 $acc->data['album'] = $acc->album->count;
1090
1091 // $db->query("UPDATE players SET album = ".$acc->album->count.", album_data = '".$acc->album->data."' WHERE ID = ".$acc->data['ID']);
1092 $qryArgs[] = "album = ".$acc->album->count;
1093 $qryArgs[] = "album_data = '".$acc->album->data."'";
1094 }
1095 }
1096 }
1097
1098 $db->exec("UPDATE players SET ".join(", ", $qryArgs)." WHERE ID = ".$acc->data['ID']);
1099
1100 $fightlog = join('&', $fightlog);
1101 $ret[] = $fightlog;
1102
1103 $rewardLog = join("/", $rewardLog)."/";
1104
1105 //$ret[] = "fightresult.battlereward:".join("/", $rewardLog)."/";
1106 $ret[] = "fightresult.battlereward:".$rewardLog;
1107 $ret[] = "Success:";
1108 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
1109 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
1110
1111 break;
1112 case 'playerdungeonbattle':
1113
1114 //args for query
1115 $qryArgs = [];
1116
1117 $acc = new Account(null, null, true, true);
1118 //$acc = new Account(null, null, false, true);
1119
1120 $fightlog = [];
1121
1122 //error checking
1123 if(($freeSlot = $acc->getFreeBackpackSlot()) === false)
1124 exit("Error:need a free slot");
1125 //$dung = $acc->data['d'.$args[0]] - 1;
1126
1127 if($args[0] != 15)
1128 $dung = $acc->data['d'.$args[0]] - 1;
1129 else
1130 $dung = $acc->data['dd15'] - 1;
1131
1132 if($dung < 0)//if closed
1133 exit("Error:");
1134 if($args[0] != 14 && $args[0] != 15 && $args[0] != 16 && $dung > 10) // if complete
1135 exit();
1136 if($acc->data['dungeon_time'] > $GLOBALS["CURRTIME"]){ //if time not up
1137 if($acc->data['mush'] <= 0)
1138 exit("Error:need more coins");
1139 $acc->data['mush']--;
1140 $qryArgs[] = "mush = mush - 1";
1141 $acc->data['dungeon_time'] = 0;
1142 $qryArgs[] = "dungeon_time = ".$acc->data['dungeon_time'];
1143 }else{
1144 $acc->data['dungeon_time'] = $GLOBALS["CURRTIME"] + 3600;
1145 $qryArgs[] = "dungeon_time = ".$acc->data['dungeon_time'];
1146 }
1147
1148 //if dung 9 boss, monster = acc, ID -1?
1149 if($args[0] == 9 && $acc->data['d9'] == 11){
1150 $monster = clone($acc);
1151 $monster->exp = 10000000;
1152 $monster->gold = 1000000;
1153 $monster->ID = 0;
1154 //fightheader takes id from here
1155 $monster->data['ID'] = 0;
1156 $mirrorFight = true;
1157 }else{
1158 $monster = Monster::getDungMonster($args[0], $dung);
1159 $mirrorFight = false;
1160 }
1161
1162 if($monster === null)
1163 exit("Error:coming soon");
1164
1165 $bg = $args[0] + 50;
1166 $fightlog[] = "fightheader.fighters:4/0/0/".$bg."/2/".$acc->getFightHeader().$monster->getFightHeader();
1167
1168 $simulation = new Simulation($acc, $monster);
1169 $simulation->simulate();
1170
1171 $fightlog[] = "fight.r:".$simulation->fightLog;
1172 $fightlog[] = "winnerid:".$simulation->winnerID;
1173
1174 $rewardLog = [];
1175 for($i = 0; $i < 21; $i++)
1176 $rewardLog[] = 0;
1177
1178 //rewarding
1179 if($simulation->winnerID == $acc->data['ID']){
1180 // Unlock new dungeon?
1181 if($args[0] >= 9 && $args[0] < 14 && $dung == 10 && $acc->data["d".($args[0]+1)] < 2){
1182 // Unlock next dungeon
1183
1184 $acc->data["d".($args[0]+1)] = 2;
1185
1186 $qryArgs[] = "d".($args[0]+1) . " = 2";
1187 }
1188
1189 //win true
1190 $rewardLog[0] = 1;
1191 //silver
1192 $rewardLog[2] = 0;
1193 //exp
1194 $rewardLog[3] = $monster->exp;
1195
1196 $acc->addExp($monster->exp);
1197
1198 $qryArgs[] = "exp = ".$acc->data['exp'];
1199 $qryArgs[] = "lvl = ".$acc->data['lvl'];
1200
1201 //displaying of dung
1202 /*
1203 $acc->data['d'.$args[0]] ++;
1204
1205 $dung += 2;
1206 $qryArgs[] = "d".$args[0]." = ".$dung;
1207 */
1208
1209 $dung += 2;
1210
1211 if($args[0] != 15)
1212 {
1213 $acc->data['d'.$args[0]] ++;
1214
1215 $qryArgs[] = "d".$args[0]." = ".$dung;
1216 }else{
1217 $acc->data['dd15'] ++;
1218
1219 $qryArgs[] = "dd15 = ".$dung;
1220
1221 }
1222
1223 //item reward
1224 $itemChance = $dung == 12 ? 100 : 50;
1225 $epicChance = $dung == 12 ? 100 : 50;
1226 if($itemChance > rand(0, 99)){
1227 $item = Item::genItem(rand(1, 10), $acc->lvl, $acc->class, $epicChance, 0, 'dungeon');
1228 $itemReward = $acc->insertItem($item, $freeSlot);
1229
1230 $i = 9;
1231 foreach($item as $s){
1232 $rewardLog[$i] = $s;
1233 $i++;
1234 }
1235 }
1236
1237 //album
1238 if($acc->hasAlbum() && !$mirrorFight){
1239 $a1 = $acc->album->addMonster($monster->ID);
1240 $a2 = isset($itemReward) ? $acc->album->addItem($itemReward) : false;
1241 if($a1 || $a2){
1242 $acc->album->encode();
1243
1244 $ret[] = "scrapbook.r:".$acc->album->data;
1245 $acc->data['album'] = $acc->album->count;
1246
1247 // $db->query("UPDATE players SET album = ".$acc->album->count.", album_data = '".$acc->album->data."' WHERE ID = ".$acc->data['ID']);
1248 $qryArgs[] = "album = ".$acc->album->count;
1249 $qryArgs[] = "album_data = '".$acc->album->data."'";
1250 }
1251 }
1252 }
1253
1254 $db->exec("UPDATE players SET ".join(", ", $qryArgs)." WHERE ID = ".$acc->data['ID']);
1255
1256 $fightlog = join('&', $fightlog);
1257 $ret[] = $fightlog;
1258
1259 $rewardLog = join("/", $rewardLog)."/";
1260
1261 //$ret[] = "fightresult.battlereward:".join("/", $rewardLog)."/";
1262 $ret[] = "fightresult.battlereward:".$rewardLog;
1263 $ret[] = "Success:";
1264 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
1265 $ret[] = "owntower.towerSave:".$acc->getTowerSave();
1266 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
1267
1268 // Twister = get shadowfaces (this fixed the no face change at twister after win)
1269 if($args[0] == 15)
1270 {
1271 $dungs = [];
1272
1273 for($i = 1; $i <= 14; $i++)
1274 $dungs["dd".$i] = $acc->data["dd".$i];
1275
1276 $dungs["dd15"] = $acc->data["dd15"]; // Twister
1277 //$dungs["d15"] = $acc->data["d15"]; // Twister
1278 $dungs["dd16"] = $acc->data["dd16"]; // Magic school dungeon shit
1279
1280
1281 $ret[] = "shadowfaces(16):".join("/", dungeonFaces::getFaces($dungs, false, true)[1]);
1282 //$ret[] = "shadowfaces(15):".join("/", dungeonFaces::getFaces($dungs, false, true)[1]);
1283 }
1284
1285 break;
1286 case 'playerportalbattle':
1287
1288 //args for query
1289 $qryArgs = [];
1290
1291 $fightlog = []; // Logs by Greg
1292
1293 $acc = new Account(null, null, false, true);
1294
1295 //error checking | no need for a free slot here
1296 // if(($freeSlot = $acc->getFreeBackpackSlot()) === false)
1297 // exit("Error:need a free slot");
1298
1299 //if time not up | now = current day since start of the year
1300 if( ($now = Misc::getNow(false)) == $acc->data['portal_time'])
1301 exit("Error:portal cooldown notice");
1302
1303 //set new date and update db
1304 $acc->data['portal_time'] = $now;
1305 $qryArgs[] = 'portal_time = '.$acc->data['portal_time'];
1306
1307
1308 //set monster current hp to the hp from database
1309 $monster = Monster::getPortalMonster($acc->data['portal'] + 1);
1310 $monster->hp = $acc->data['portal_hp'];
1311
1312 $fightlog[] = "fightheader.fighters:6/0/0/1/2/".$acc->getFightHeader().$monster->getFightHeader();
1313
1314
1315 $simulation = new Simulation($acc, $monster);
1316 $simulation->simulate();
1317
1318 $fightlog[] = "fight.r:".$simulation->fightLog;
1319 $fightlog[] = "winnerid:".$simulation->winnerID;
1320
1321 $rewardLog = [];
1322 for($i = 0; $i < 21; $i++)
1323 $rewardLog[] = 0;
1324
1325 //rewarding
1326 if($simulation->winnerID == $acc->data['ID']){
1327 //win true
1328 $rewardLog[0] = 1;
1329
1330 $acc->data['portal']++;
1331 $qryArgs[] = 'portal = '.$acc->data['portal'];
1332
1333 //update mob hp in database
1334 if($acc->data['portal'] < 50){
1335 $acc->data['portal_hp'] = Monster::getPortalMonster($acc->data['portal'] + 1)->hp;
1336 $qryArgs[] = 'portal_hp = '.$acc->data['portal_hp'];
1337 }
1338
1339 //album
1340 if($acc->hasAlbum()){
1341 if($acc->album->addMonster($monster->ID)){
1342 $acc->album->encode();
1343
1344 $ret[] = "scrapbook.r:".$acc->album->data;
1345 $acc->data['album'] = $acc->album->count;
1346
1347 // $db->query("UPDATE players SET album = ".$acc->album->count.", album_data = '".$acc->album->data."' WHERE ID = ".$acc->data['ID']);
1348 $qryArgs[] = "album = ".$acc->album->count;
1349 $qryArgs[] = "album_data = '".$acc->album->data."'";
1350 }
1351 }
1352 }else{
1353 //if lost, update database with remaining hp of mob
1354
1355 $qryArgs[] = 'portal_hp = '.$monster->hp;
1356 $acc->data['portal_hp'] = $monster->hp;
1357
1358 }
1359
1360 $db->exec("UPDATE players SET ".join(", ", $qryArgs)." WHERE ID = ".$acc->data['ID']);
1361
1362 $fightlog = join('&', $fightlog);
1363 $ret[] = $fightlog;
1364
1365 $rewardLog = join("/", $rewardLog)."/";
1366
1367 //$ret[] = "fightresult.battlereward:".join("/", $rewardLog)."/";
1368 $ret[] = "fightresult.battlereward:".$rewardLog;
1369 $ret[] = "Success:";
1370 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
1371 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
1372 break;
1373 case 'groupportalbattle':
1374
1375 $qryArgs = [];
1376 $time = $GLOBALS["CURRTIME"];
1377
1378 $acc = new Account(null, null, false, true);
1379
1380
1381 $now = md5(date("Y-m-d", $time));
1382 $portal = md5(date("Y-m-d", $acc->data['gportal_time']));
1383
1384 $guild = new Guild($playerGuild);
1385
1386 // Check by Greg
1387 if($now == $portal)
1388 exit();
1389
1390 //set new date and update db
1391 $acc->data['gportal_time'] = $time;
1392 $guild->guildPortalCD($playerID);
1393
1394 if($guild->data['portal'] >= 50)
1395 exit('Error:');
1396
1397 $monster = Monster::getGuildPortalMonster($guild->data['portal']);
1398 $monster->hp = $guild->data['portal_hp'];
1399
1400 $ret[] = "fightheader.fighters:7/0/0/0/1/".$acc->getFightHeader().$monster->getFightHeader();
1401
1402 $simulation = new Simulation($acc, $monster);
1403 $simulation->simulate();
1404
1405 $ret[] = "fight.r:".$simulation->fightLog;
1406 $ret[] = "winnerid:".$simulation->winnerID;
1407
1408 $rewardLog = [];
1409 for($i = 0; $i < 21; $i++)
1410 $rewardLog[] = 0;
1411
1412 //rewarding
1413 if($simulation->winnerID == $acc->data['ID']){
1414 //win true
1415 $rewardLog[0] = 1;
1416
1417 //chat log
1418 $dmgdealt = $guild->data['portal_hp'] - $monster->hp;
1419 $log = "#pw#".$acc->data['name']."#".$guild->data['portal']."#$dmgdealt";
1420
1421 $guild->data['portal']++;
1422 $acc->data['guild_portal']++;
1423 $qryArgs[] = 'portal = '.$guild->data['portal'];
1424
1425 //update mob hp in database
1426 if($guild->data['portal'] < 50){
1427 $guild->data['portal_hp'] = Monster::getGuildPortalMonster($guild->data['portal'])->hp;
1428 $qryArgs[] = 'portal_hp = '.$guild->data['portal_hp'];
1429 }
1430
1431 //album for all members
1432 $guild->addAlbumMonster($monster->ID + 1);
1433
1434
1435 }else{
1436 //if lost, update database with remaining hp of mob
1437 $dmgdealt = $guild->data['portal_hp'] - $monster->hp;
1438
1439 $qryArgs[] = 'portal_hp = '.$monster->hp;
1440 $guild->data['portal_hp'] = $monster->hp;
1441
1442 $hpLeftPrc = round($guild->data['portal_hp'] / $monster->maxHp * 100);
1443 $log = "#po#".$acc->data['name']."#".$guild->data['portal']."#$dmgdealt#$hpLeftPrc";
1444 }
1445
1446
1447
1448 //insert log && update guilds
1449 // $db->exec("INSERT INTO guildchat(guildID, playerID, message, time) VALUES($playerGuild, $playerID, '$log', $time)");
1450 $db->exec("UPDATE guilds SET ".join(", ", $qryArgs)." WHERE ID = ".$guild->data['ID']);
1451
1452 //get guild chat
1453 // $chat = $db->query("SELECT players.name, guildchat.message, guildchat.time FROM guildchat LEFT JOIN players ON guildchat.playerID = players.ID
1454 // WHERE guildchat.guildID = $playerGuild AND guildchat.time > $playerPoll ORDER BY guildchat.time DESC LIMIT 5");
1455 // $chat = $chat->fetchAll();
1456
1457 $chattime = Chat::chatInsert($log, $playerGuild, $playerID);
1458 $chat = Chat::getChat($playerGuild);
1459
1460 //update player portal time and poll
1461 $db->exec("UPDATE players SET gportal_time = ".$acc->data['gportal_time'].", poll = $time WHERE ID = $playerID");
1462
1463
1464 $ret[] = 'chathistory.s(5):'.Chat::formatChat($chat);
1465 $ret[] = "chattime:$chattime";
1466 $ret[] = "fightresult.battlereward:".join("/", $rewardLog)."/";
1467 $ret[] = "owngroupsave.groupSave:".$guild->getGroupSave();
1468 $ret[] = "Success:";
1469 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
1470 $ret[] = "timestamp:$time";
1471
1472
1473 break;
1474 case 'playertowerbuylevel':
1475
1476 $acc = new Account(null, null, true, false);
1477
1478 $copycat = $acc->copycats[$args[0] - 1];
1479
1480 if(($cost = Copycat::getLvlCost($copycat->data['lvl'])) > $acc->data['silver'])
1481 exit('Error:need more gold');
1482
1483 $acc->data['silver'] -= $cost;
1484 $db->exec("UPDATE players SET silver = silver - $cost WHERE ID = ".$acc->data['ID']);
1485
1486 $copycat->lvlUp();
1487
1488 $ret[] = 'Success:';
1489 $ret[] = 'ownplayersave.playerSave:'.$acc->getPlayerSave();
1490 $ret[] = 'owntowerlevel:200';
1491 $ret[] = 'owntower.towerSave:'.$acc->getTowerSave();
1492 $ret[] = 'timestamp:'.$GLOBALS["CURRTIME"];
1493
1494 break;
1495 case 'playersetface':
1496
1497 $acc = new Account(null, null, false, false);
1498
1499 $acc->data["race"] = $args[0];
1500 $acc->data["gender"] = $args[1];
1501 $acc->data["face"] = $args[2];
1502 $acc->data["silver"] -= 100;
1503
1504 $db->exec("UPDATE players SET race = '{$args[0]}', gender = '{$args[1]}', face = '{$args[2]}', silver = silver - 100 WHERE ID = ".$playerID);
1505
1506 $ret[] = 'Success:';
1507 $ret[] = 'ownplayersave.playerSave:'.$acc->getPlayerSave();
1508
1509 break;
1510 case 'groupgethalloffame':
1511
1512 if(strlen($args[1]) > 2){
1513
1514 $qry = $db->prepare('SELECT ID, honor FROM guilds WHERE name = :name');
1515 $qry->bindParam(':name', $args[1]);
1516 $qry->execute();
1517
1518 if($qry->rowCount() == 0)
1519 exit('Error:group not found');
1520
1521 $p = $qry->fetch(PDO::FETCH_ASSOC);
1522
1523 $qry = $db->query('SELECT Count(*) AS rank FROM guilds WHERE honor > '.$p['honor'].' OR (honor = '.$p['honor'].' AND ID > '.$p['ID'].')');
1524
1525 $args[0] = $qry->fetch(PDO::FETCH_ASSOC)['rank'];
1526 // var_dump($args[0]);
1527 }
1528
1529 $args[0] -= $args[2] + 1;
1530 if($args[0] < 0)
1531 $args[0] = 0;
1532
1533 //SELECT guilds.*, count(players.guild) AS membercount FROM guilds LEFT JOIN players ON guilds.ID = players.guild GROUP BY guild ORDER BY membercount DESC LIMIT 15;
1534 $qry = $db->prepare("SELECT guilds.ID as gID, guilds.name, GROUP_CONCAT(players.name ORDER BY guild_rank) AS leader, Count(*) AS membercount, guilds.honor, '0' FROM guilds FORCE INDEX(honor) LEFT JOIN players ON guilds.ID = players.guild WHERE guilds.honor >= 0 GROUP BY players.guild
1535 ORDER BY guilds.honor DESC, guilds.ID DESC LIMIT :f, 30");
1536 $qry->bindParam(':f', $args[0], PDO::PARAM_INT);
1537 $qry->execute();
1538
1539 $guilds = $qry->fetchAll( PDO::FETCH_ASSOC );
1540
1541
1542 $list = [];
1543 $rank = $args[0] + 1;
1544 // for($i = 0; $i < count($guilds); $i++) {
1545 // var_dump($guilds[$i]);
1546 // // $list[] = "$rank,$guilds[$i]"
1547 // }
1548 foreach($guilds as $g){
1549 $g['leader'] = explode(',', $g['leader'])[0];
1550 $list[] = "$rank,$g[name],$g[leader],$g[membercount],$g[honor],0";
1551 $rank++;
1552 }
1553
1554 //rank, name, leader, memberc, honor, fightstatus
1555 // ranklistgroup.r:1,Asgard United,guzii,50,37728,0;
1556 $ret[] = 'ranklistgroup.r:'.join(';', $list);
1557 $ret[] = "Success:";
1558
1559
1560 break;
1561 case 'playergethalloffame':
1562
1563 if(strlen($args[1]) > 2){
1564
1565 $args[1] = Account::formatUser($args[1]);
1566
1567 $qry = $db->prepare('SELECT ID, honor FROM players WHERE name = :name');
1568 $qry->bindParam(':name', $args[1]);
1569 $qry->execute();
1570
1571 if($qry->rowCount() == 0)
1572 exit('Error:player not found');
1573
1574 $p = $qry->fetch(PDO::FETCH_ASSOC);
1575
1576 $qry = $db->query('SELECT Count(*) AS rank FROM players WHERE (honor > '.$p['honor'].' OR (honor = '.$p['honor'].' AND ID > '.$p['ID'].'))');
1577
1578 $args[0] = $qry->fetch(PDO::FETCH_ASSOC)['rank'];
1579 }
1580
1581 $args[0] -= $args[2] + 1;
1582 if($args[0] < 0)
1583 $args[0] = 0;
1584
1585
1586 $qry = $db->prepare("SELECT players.name, guilds.name AS gname, players.lvl, players.honor, players.class, players.flag FROM players FORCE INDEX(honor) LEFT JOIN guilds ON players.guild = guilds.ID
1587 WHERE players.honor >= 0 ORDER BY players.honor DESC, players.ID DESC LIMIT {$args[0]}, 30");
1588 $qry->execute();
1589
1590 $players = $qry->fetchAll( PDO::FETCH_ASSOC );
1591
1592 $list = [];
1593 for($i = 0; $i < count($players); $i++) {
1594 $rank = $args[0] + $i + 1;
1595 $list[] = $rank.','.join(',', $players[$i]);
1596 }
1597
1598 //rank, name, gname, lvl, honor, class
1599 $ret[] = "Ranklistplayer.r:".join(';', $list);
1600 $ret[] = "Success:";
1601
1602 break;
1603 case 'playerlookat':
1604
1605 $acc = new Account(null, null, false, false);
1606
1607 $args[0] = $acc::formatUser($args[0]);
1608
1609 // Other player data - Fortress data by Greg
1610
1611 if($args[0] == "?"){
1612 $qry = $db->query("SELECT players.*, guilds.portal AS guild_portal, guilds.name AS gname FROM players LEFT join guilds ON players.guild = guilds.ID WHERE players.ID = (SELECT enemyid FROM fortress WHERE owner = $playerID)");
1613 }else if(is_numeric($args[0])){
1614 $qry = $db->query("SELECT players.*, guilds.portal AS guild_portal, guilds.name AS gname FROM players LEFT join guilds ON players.guild = guilds.ID WHERE players.ID = $args[0]");
1615 }else{
1616 $qry = $db->prepare("SELECT players.*, guilds.portal AS guild_portal, guilds.name AS gname FROM players LEFT JOIN guilds ON players.guild = guilds.ID WHERE players.name = :name");
1617 $qry->bindParam(':name', $args[0]);
1618 $qry->execute();
1619 }
1620
1621 if($qry->rowCount() <= 0)
1622 exit('Error:player not found');
1623
1624 $playerData = $qry->fetch(PDO::FETCH_ASSOC);
1625
1626 $qry = $db->query("SELECT * FROM items WHERE owner = '{$playerData['ID']}' AND slot BETWEEN 10 AND 19");
1627 $items = $qry->fetchAll(PDO::FETCH_ASSOC);
1628 $player = new Player($playerData, $items);
1629
1630 $ret[] = "otherplayergroupname.r:".$playerData['gname'];
1631 $ret[] = "otherplayer.playerlookat:".$player->getLookatSave();
1632 $ret[] = "otherdescription.s:".$playerData['description'];
1633 $ret[] = "b"; // Hey Beter
1634 $ret[] = "otherplayername.r:".$player->data['name'];
1635 $ret[] = "otherplayerunitlevel(4):".$player->fortressAttackLevels();
1636
1637 // By Greg
1638 $ret[] = "otherplayerfriendstatus:".$acc->otherPlayerFriendStatus($playerData['ID']);
1639
1640 $ret[] = "otherplayerfortressrank:0"; // Fortress rank not working
1641 $ret[] = "soldieradvice:0"; // Removed it cuz it's hard to make
1642 $ret[] = "fortresspricereroll:".$acc->fortressRerollPrice(); // Reroll price
1643 $ret[] = "success:";
1644 break;
1645 case 'playerpollscrapbook':
1646 //dunno when this is called or why
1647
1648 exit('Error:scrapbook poll call');
1649
1650 $ret[] = "Success:";
1651 $albumData = $db->query("SELECT album_data FROM players WHERE ID = $playerID")->fetch(PDO::FETCH_ASSOC)['album_data'];
1652
1653 $ret[] = "scrapbook.r:$albumData";
1654
1655
1656 break;
1657 case 'playerscrapbookcorrupt':
1658 //if scrapbook count in player data and count from data don't match, client calls this
1659 //arg0 clients count from album data
1660 exit('Error:scrapbook corrupt call');
1661
1662 $ret[] = "Success:";
1663 $albumData = $db->query("SELECT album_data FROM players WHERE ID = $playerID")->fetch(PDO::FETCH_ASSOC)['album_data'];
1664
1665 $ret[] = "scrapbook.r:$albumData";
1666
1667 break;
1668 case 'playeradventurestart':
1669 //arg 0 = quest
1670
1671 $acc = new Account(null, null, false, false);
1672
1673 // Warn if inventory is full - Greg
1674 if(($freeSlot = $acc->getFreeBackpackSlot()) === false && $args[1] == 0)
1675 exit("Error:your backpack is full");
1676
1677 $acc->questStart($args[0]);
1678
1679
1680 $ret[] = "Success:";
1681 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
1682 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
1683
1684
1685 break;
1686 case 'playeradventurestop':
1687
1688 $acc = new Account(null, null, false, false);
1689
1690 $acc->questStop();
1691
1692
1693 $ret[] = "Success:";
1694 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
1695 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
1696
1697 break;
1698 case 'playeradventurefinished':
1699 $acc = new Account(null, null, false, true);
1700
1701 $fightlog = []; // Save quest fight by Greg
1702
1703 // Fix by Greg
1704 if($acc->data['status_extra'] == 0)
1705 exit("Error:no quest atm");
1706
1707 //see if skipped, take mushrooms
1708 if($acc->data['status_time'] > $GLOBALS["CURRTIME"] && (($acc->data['mush'] <= 0 && $args[0] != "2") || $acc->data['warned'] != 0))
1709 exit('Error:need more coins');
1710 else if($acc->data['status_time'] > $GLOBALS["CURRTIME"] && (($acc->data['hourglass'] <= 0 && $args[0] == "2") || $acc->data['warned'] != 0))
1711 exit("Error:malformed response");
1712
1713 $equipStats = $acc->getEquipStats();
1714
1715 $w = $acc->data['wit'] + $equipStats['wit'];
1716
1717 $dmg_min = round($w / 14);
1718 $dmg_max = round($w / 12);
1719 $hp = round(($w / 10) * 4 * ($acc->data['lvl'] + 1));
1720
1721 $mob_c = rand(1, 2);
1722 if ($mob_c == 2)
1723 $mob_c = 3;
1724
1725 $monsterID = ($acc->data['quest_exp'.$acc->data['status_extra']] % 163) + 1;
1726 $monster = new Monster($acc->data['lvl'], $mob_c, ($acc->data['str'] / 2), ($acc->data['dex'] / 2), ($acc->data['intel'] / 2), ($acc->data['wit'] / 2), ($acc->data['luck'] / 2), $dmg_min, $dmg_max, $hp, 1, -$monsterID, 1, 10);
1727
1728 $bg = $acc->questBackground($acc->data['quest_exp'.$acc->data['status_extra']]);
1729
1730 $fightlog[] = "fightheader.fighters:1/0/0/".$bg."/0/".$acc->getFightHeader().$monster->getFightHeader();
1731
1732 $simulation = new Simulation($acc, $monster);
1733 $simulation->simulate();
1734
1735 $win = $simulation->winnerID == $acc->data['ID'];
1736
1737 // Quests anti-cheat
1738 include "sf/anti/quests.php";
1739
1740 $fightlog[] = "fight.r:".$simulation->fightLog;
1741 $fightlog[] = "winnerid:".$simulation->winnerID;
1742
1743 $fightlog = join('&', $fightlog);
1744 $ret[] = $fightlog;
1745
1746 $battleReward = $acc->questFinish($win, $monsterID, $args[0]); // Finish quest
1747
1748
1749
1750 //$ret[] = "fightresult.battlereward:".$acc->questFinish($win, $monsterID, $args[0]);
1751 $ret[] = "fightresult.battlereward:".$battleReward;
1752 $ret[] = "Success:";
1753
1754 if(isset($RENEW))
1755 $acc = new Account(null, null, false, true);
1756
1757 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
1758 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
1759
1760 if(($fortressBackpackSize = $acc->getFortressBackpackSize()) > 0)
1761 $ret[] = "fortresschest.item(".$fortressBackpackSize."):".$acc->getFortressBackpackSave();
1762
1763 break;
1764 case 'playerworkstart':
1765
1766 $hours = $args[0];
1767
1768 $qry = $db->prepare('SELECT ID, status FROM players WHERE ssid = :ssid');
1769 $qry->bindParam(':ssid', $ssid);
1770 $qry->execute();
1771
1772 $playerData = $qry->fetch(PDO::FETCH_ASSOC);
1773
1774 if($playerData['status'] != 0)
1775 exit();
1776
1777 $statusTime = $GLOBALS["CURRTIME"]+ 3600 * $args[0];
1778
1779 $ret[] = 'Success:';
1780 $ret[] = '#ownplayersave.playerSave:45/1/47/'.$statusTime;
1781
1782 $db->exec("UPDATE players SET status = 1, status_time = $statusTime, status_extra = $hours WHERE ID = ".$playerData['ID']);
1783 break;
1784 case 'playerworkstop':
1785
1786 $ret[] = 'Success:';
1787 $ret[] = '#ownplayersave.playerSave:45/0/47/0';
1788
1789 $qry = $db->prepare('UPDATE players SET status = 0, status_extra = 0, status_time = 0 WHERE ssid = :ssid');
1790 $qry->bindParam(':ssid', $ssid);
1791 $qry->execute();
1792
1793 break;
1794 case 'playerworkfinished':
1795
1796 $qry = $db->prepare("SELECT ID, lvl, silver, status, status_extra, status_time FROM players WHERE ssid = :ssid");
1797 $qry->bindParam(':ssid', $ssid);
1798 $qry->execute();
1799 $playerData = $qry->fetch(PDO::FETCH_ASSOC);
1800
1801 $reward = Account::getWagesPerHour($playerData['lvl']) * $playerData['status_extra'];
1802
1803 $db->exec("UPDATE players SET workedhours = workedhours + ".$playerData['status_extra'].", status = 0, status_extra = 0, status_time = 0, silver = silver + $reward WHERE ID = ".$playerData['ID']);
1804
1805 $ret[] = 'Success:';
1806 $ret[] = "workreward:$reward";
1807
1808 $reward += $playerData['silver'];
1809
1810 $ret[] = "#ownplayersave.playerSave:13/$reward/45/0/47/0";
1811
1812 break;
1813 case 'playeritemmove':
1814
1815 $class = new Account(null, null, false, false);
1816 $class = $class->data['class'];
1817
1818 if($class != 4) {
1819 if($args[0] == 1 && $args[2] == 1)
1820 exit("Success:");
1821 }
1822
1823 if($args[0] == 4 && $args[2] == 4)
1824 exit("Success:");
1825
1826 if($args[0] == 3 && $args[2] == 3)
1827 exit("Success:");
1828
1829 // Assassin move equipped swords - Fix
1830 if($args[0] == 1 && $args[2] == 1 && $class == 4) {
1831 if($args[1] != 9 && $args[1] != 10 && $args[3] != 9 && $args[3] != 10)
1832 exit("Success:");
1833 }
1834
1835 if($args[0] == 1 && $args[2] == 12)
1836 exit('Error:you cannot sell from here');
1837
1838 if($args[2] == 3 || $args[2] == 4)
1839 if($args[0] == 1)
1840 exit('Error:you cannot sell from here');
1841
1842
1843 $itemBought = false;
1844
1845 //if source shops, load album
1846 if($args[0] == 3 || $args[0] == 4)
1847 $itemBought = true;
1848
1849
1850 $acc = new Account(null, null, true, $itemBought);
1851
1852 $acc->moveItem($args);
1853
1854 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
1855 if(($fortressBackpackSize = $acc->getFortressBackpackSize()) > 0)
1856 $ret[] = "fortresschest.item(".$fortressBackpackSize."):".$acc->getFortressBackpackSave();
1857 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
1858 $ret[] = "Success:";
1859
1860
1861
1862 break;
1863 case 'playertoilettflush':
1864
1865 $acc = new Account(null, null);
1866
1867 if($acc->toiletFull() != false)
1868 exit('Error:toilett is not full');
1869
1870 if(($freeSlot = $acc->getFreeBackpackSlot()) === false)
1871 exit('Error:need a free slot');
1872
1873 $db->exec("UPDATE players SET wcaura = wcaura + 1, wcexp = 0 WHERE ID = $playerID");
1874 $acc->data['wcaura']++;
1875 $acc->data['wcexp'] = 0;
1876
1877 //last arg - epic chance
1878 $item = Item::genItem(rand(1, 10), $acc->lvl, $acc->class, 100);
1879
1880 $acc->insertItem($item, $freeSlot);
1881
1882
1883 $freeSlot += $freeSlot >= 100 ? -94 : +1;
1884 $ret[] = 'Success:';
1885 $ret[] = 'toilettspawnslot:'.$freeSlot;
1886 $ret[] = 'ownplayersave.playerSave:'.$acc->getPlayerSave();
1887 if($freeSlot >= 100)
1888 $ret[] = "fortresschest.item(".$acc->getFortressBackpackSize()."):".$acc->getFortressBackpackSave();
1889
1890 break;
1891 case 'playerpotionkill':
1892
1893 $acc = new Account(null, null, false, false);
1894
1895 $acc->data['potion_dur'.$args[0]] = 0;
1896 $acc->data['potion_type'.$args[0]] = 0;
1897
1898 $db->exec("UPDATE players SET potion_dur$args[0] = 0 WHERE ID = ".$acc->data['ID']);
1899
1900 $ret[] = "Success:";
1901 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
1902 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
1903
1904 break;
1905 case 'playerattributincrease': // Statbuy
1906
1907
1908 // exit('Error:need more coins');
1909
1910 $args[0]--;
1911
1912 $stat = ['str', 'dex', 'intel', 'wit', 'luck'][$args[0]];
1913
1914 $qry = $db->prepare('SELECT ID, silver, '.$stat.' FROM players WHERE ssid = :ssid');
1915 $qry->bindParam(':ssid', $ssid);
1916 $qry->execute();
1917 $playerData = $qry->fetch(PDO::FETCH_ASSOC);
1918
1919 $price = Account::getStatPrice($playerData[$stat] - 10);
1920
1921 if($price > $playerData['silver'])
1922 exit("Error:need more gold");
1923
1924 $db->exec("UPDATE players SET silver = silver - $price, $stat = $stat + $statPlus WHERE ID = $playerData[ID]");
1925
1926 $ret[] = 'Success:';
1927 $ret[] = '#ownplayersave.playerSave:13/'.($playerData['silver'] - $price).'/'.($args[0] + 30).'/'.($playerData[$stat] + 25).'/'.($args[0] + 40).'/'.($playerData[$stat] - 9);
1928
1929
1930
1931 break;
1932 case 'playerbeerbuy':
1933
1934 $qry = $db->prepare('SELECT ID, thirst, beers, mush, class FROM players WHERE ssid = :ssid');
1935 $qry->bindParam(':ssid', $ssid);
1936 $qry->execute();
1937 $playerData = $qry->fetch(PDO::FETCH_ASSOC);
1938
1939
1940 if($playerData['thirst'] > 4800)
1941 exit("Error:2muchthirst");
1942
1943 /*if($playerData['mush'] <= 0)
1944 exit('Error:need more coins');*/
1945
1946 if($playerData['mush'] <= 0 && !$oktoberfest)
1947 exit('Error:cannot afford beer');
1948 //exit('Error:need more coins');
1949
1950 if($playerData['beers'] >= 11)
1951 exit("Error:max beers");
1952
1953 // Beer update by Greg
1954 if(!$infiniteBeer)
1955 {
1956 $playerData['beers']++;
1957 }
1958 $playerData['thirst'] += 1200;
1959
1960 if($oktoberfest == false)
1961 $playerData['mush']--;
1962
1963 //temporary for reseting portal timers, to revert, just switch out the comments and edit playersave
1964 //$db->exec('UPDATE players SET portal_time = 0, gportal_time = 0 WHERE ID = '.$playerData['ID']); // portals
1965
1966 $db->exec('UPDATE players SET thirst = thirst + 1200 WHERE ID = '.$playerData['ID']);
1967 if(!$infiniteBeer)
1968 $db->exec('UPDATE players SET beers = beers + 1 WHERE ID = '.$playerData['ID']);
1969 else
1970 $db->exec('UPDATE players SET beers = 0 WHERE ID = '.$playerData['ID']);
1971
1972 $db->exec('UPDATE players SET mush = '.$playerData['mush'].' WHERE ID = '.$playerData['ID']);
1973 //$db->exec("UPDATE players SET mush = mush - 1, thirst = thirst + 1200, beers = beers + 1, portal_time = 0, gportal_time = 0 WHERE ID = $playerID");
1974 $guild = new Guild($playerGuild);
1975 $ret[] = 'owngroupsave.groupSave:'.$guild->getGroupSave();
1976
1977 $ret[] = 'Success:';
1978 $ret[] = '#ownplayersave.playerSave:14/'.$playerData['mush'].'/456/'.$playerData['thirst'].'/457/'.$playerData['beers'].'/29/'.$playerData['class'];
1979
1980 break;
1981 case 'playernewwares':
1982
1983 $acc = new Account(null, null, false, false);
1984
1985 $acc->rerollShop($args[0]);
1986
1987 $ret[] = "Success:";
1988 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
1989 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
1990
1991 break;
1992 case 'playermountbuy':
1993
1994 $qry = $db->prepare('SELECT ID, silver, mush, mount, mount_time, tower, quest_dur1, quest_dur2, quest_dur3 FROM players WHERE ssid = :ssid');
1995 $qry->bindParam(':ssid', $ssid);
1996 $qry->execute();
1997 $playerData = $qry->fetch(PDO::FETCH_ASSOC);
1998
1999 //mush cost
2000 $costMush = [0, 0, 1, 25][$args[0] - 1];
2001 if($costMush > $playerData['mush'])
2002 exit('Error:need more coins');
2003
2004 //gold cost
2005 $costSilver = [100, 500, 1000, 0][$args[0] - 1];
2006 if($costSilver > $playerData['silver'])
2007 exit('Error:need more gold');
2008
2009 $playerData['mush'] -= $costMush;
2010 $playerData['silver'] -= $costSilver;
2011 $resp = [];
2012
2013 //if same mount, and time not expired, just inscrease the time
2014 if($playerData['mount'] == $args[0] && $playerData['mount_time'] > $GLOBALS["CURRTIME"]){
2015 $playerData['mount_time'] += 1209600;
2016 }else{
2017 $playerData['mount'] = $args[0];
2018 $playerData['mount_time'] = $GLOBALS["CURRTIME"] + 1209600;
2019
2020 $mountMultiplier = [0.9, 0.8, 0.7, 0.5][$args[0] - 1];
2021
2022 for($i = 1; $i <= 3; $i++){
2023 $resp[] = (240 + $i).'/'.ceil($playerData["quest_dur$i"] * $mountMultiplier);
2024 }
2025 }
2026
2027
2028 $resp[] = '13/'.$playerData['silver'].'/14/'.$playerData['mush'].'/286/'.($playerData['tower'] * 65536 + $args[0]).'/451/'.$playerData['mount_time'];
2029
2030 $db->exec("UPDATE players SET mush = mush - $costMush, silver = silver - $costSilver, mount = $args[0], mount_time = ".$playerData['mount_time'].' WHERE ID = '.$playerData['ID']);
2031
2032 $ret[] = 'Success:';
2033 $ret[] = '#ownplayersave.playerSave:'.join('/', $resp);
2034 $ret[] = 'timestamp:'.$GLOBALS["CURRTIME"];
2035
2036 break;
2037 case 'playerwitchenchantitem':
2038 //arg 0 = enchant id counted from left to right
2039
2040 //table of item types per enchant
2041 $itemType = [5, 6, 3, 10, 7, 4, 8, 1, 9][$args[0] - 1];
2042
2043 $acc = new Account(null, null, false, false);
2044
2045 $encd = false;
2046
2047 $allenc = true;
2048
2049 foreach($acc->equip as $item){
2050 if($item->type == $itemType && !$item->enchanted){
2051 $item->enchant();
2052 $encd = true;
2053 break;
2054 }
2055 else if (!$item->enchanted)
2056 $allenc = false;
2057 }
2058
2059 if($encd) {
2060 $sql = "UPDATE players SET silver = silver - {$acc->fortressRerollPrice()} WHERE ID = '{$acc->data['ID']}'";
2061 $db->exec($sql);
2062 $acc->data['silver'] -= $acc->fortressRerollPrice();
2063 }
2064
2065 $ret[] = 'Success:';
2066 $ret[] = 'ownplayersave.playerSave:'.$acc->getPlayerSave();
2067 $ret[] = 'timestamp'.$GLOBALS["CURRTIME"];
2068
2069 break;
2070 case 'playermessagesend':
2071
2072 //args: reciver/topic/message
2073
2074 //reserve single numeric topic for system, simplier solution
2075 if(strlen($args[1]) == 1 && is_numeric($args[1]))
2076 exit();
2077
2078 $qry = $db->prepare('SELECT ID, friends FROM players WHERE name = :name');
2079 $qry->bindParam(':name', $args[0]);
2080 $qry->execute();
2081 $fetch = $qry->fetch(PDO::FETCH_ASSOC);
2082
2083 if($qry->rowCount() == 0)
2084 exit('Error:recipient not found');
2085
2086 if(Account::isUserIgnored($fetch['friends'], $playerID))
2087 exit("Error:player not found"); // player is ignored
2088
2089 $reciver = $fetch['ID'];
2090 $time = $GLOBALS["CURRTIME"];
2091
2092 $qry = $db->prepare("INSERT INTO messages(sender, reciver, time, topic, message) VALUES($playerID, $reciver, $time, :topic, :message)");
2093 $qry->bindParam(':topic', $args[1]);
2094 $qry->bindParam(':message', $args[2]);
2095 $qry->execute();
2096
2097 exit('Success:');
2098
2099 break;
2100 case 'fortressbuildstart':
2101 //building id
2102 $args[0] --;
2103
2104 $acc = new Account(null, null, false, false);
2105
2106 $acc->fortressBuild($args[0]);
2107
2108
2109 $ret[] = "Success:";
2110 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
2111 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
2112
2113 break;
2114 case 'fortressbuildstop':
2115 //REMEMBER TO REDUCE RETURNED RESOURCES
2116 //arg building id, fuck yo input m89
2117
2118 $acc = new Account(null, null, false, false);
2119
2120 $acc->fortressBuildStop();
2121
2122 $ret[] = "Success:";
2123 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
2124 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
2125
2126 break;
2127 case 'fortressbuildfinished':
2128
2129 $acc = new Account(null, null, false, false);
2130
2131 $acc->fortressBuildFinish();
2132
2133 $ret[] = "Success:";
2134 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
2135 $ret[] = "fortressprice.fortressPrice(13):".$acc->getFortressPriceSave();
2136 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
2137
2138 //i guess if upgraded bank, mines or other shit that need update, include them
2139 $args[0]--;
2140 if($args[0] == 9){
2141 //fortress backpack
2142 $ret[] = "fortresschest.item(".$acc->getFortressBackpackSize()."):".$acc->getFortressBackpackSave();
2143 }
2144
2145 break;
2146 case 'fortressgemstonestart':
2147
2148 $acc = new Account(null, null, false, false);
2149
2150 $acc->fortressDigStart();
2151
2152 $ret[] = "Success:";
2153 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
2154 $ret[] = "fortressprice.fortressPrice(13):".$acc->getFortressPriceSave();
2155 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
2156
2157 break;
2158 case 'fortressgemstonestop':
2159
2160 $acc = new Account(null, null, false, false);
2161
2162 $acc->fortressDigStop();
2163
2164 $ret[] = "Success:";
2165 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
2166 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
2167
2168 break;
2169 case 'fortressgemstonefinished':
2170
2171 $acc = new Account(null, null, false, false);
2172
2173 //client check if there is a free slot, doesn't send the request if there is no space, but it's better to keep this here
2174 if(($freeSlot = $acc->getFreeBackpackSlot()) === false)
2175 exit("Error:need a free slot");
2176
2177 //checks if time's up, if enough mushrooms, resets db
2178 $acc->fortressDigFinish();
2179
2180 // allhok by Greg
2181 if($acc->hasGuild()) {
2182 $allhok = $acc::getAllHok($acc->data['guild']);
2183 }else{
2184 //$allhok = 0;
2185 $allhok = $acc->data['hok']; // v2 - No guild, but we keep the user's hok
2186 }
2187
2188 //class is not needed, but have it anyway in case i wanna have higher chance for class specific gems or whatever
2189 //send hall of knights level as epic chance, so bigger gem stat (by Greg)
2190 $gem = Item::genItem(15, $acc->lvl, $acc->class, $allhok, $acc->data['b4']);
2191
2192 if(!$defAllDungUnlocked && $acc->data['b4'] >= 10 && $acc->data['lvl'] >= 90 && $acc->data['pets'] != null) {
2193
2194 $qry = $db->prepare('SELECT * FROM underworld WHERE owner = :owner');
2195 $qry->bindParam(':owner', $acc->data['ID']);
2196 $qry->execute();
2197
2198 if($qry->rowCount() <= 0 && !$acc->heartInInv() && rand(1, 10) == 1) {
2199 $gem = Item::genItem(18, $acc->lvl, $acc->class, $allhok, $acc->data['b4']);
2200 }
2201
2202 }
2203
2204 $acc->insertItem($gem, $freeSlot);
2205
2206
2207 $freeSlot += $freeSlot >= 100 ? -94 : +1;
2208 $ret[] = "gemstonebackpackslot:".$freeSlot;
2209 $ret[] = "Success:";
2210 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
2211 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
2212
2213 break;
2214 case 'fortressgather':
2215
2216 $acc = new Account(null, null, false, false);
2217
2218 $acc->fortressGather($args[0]);
2219
2220 $ret[] = "Success:";
2221 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
2222 $ret[] = "fortressprice.fortressPrice(13):".$acc->getFortressPriceSave();
2223 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
2224
2225 break;
2226 case 'fortressenemy':
2227
2228 $acc = new Account(null, null, false, false);
2229
2230 if($args[0] == '1')
2231 $acc->newFortressEnemy(); // New enemy
2232
2233 if($acc->data["enemyid"] == 0)
2234 $acc->newFortressEnemy(false); // New enemy (required) - without money
2235
2236
2237 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
2238
2239 // Reusing playerlookat so we just need the id
2240 $ret[] = "otherplayer.playerlookat:{$acc->data['enemyid']}/0/65537/0/100/100/2/0/2/307/305/5/304/1/4/9/0/0/6/1/3/10/10/10/10/10/0/3/0/3/3/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/65537/2001/2/6/2/4/5/3/3/3/1/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/10005/0/0/0/0/0/2/6/0/0/0/123/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/";
2241 $ret[] = "Success:";
2242
2243
2244 break;
2245 case 'fortressattack':
2246 // Fortress Attack by Greg
2247
2248 $q = $args[0]; // How much soldiers
2249
2250 if($q < 1) {
2251 exit(); // Zero soldiers wtf
2252 }
2253
2254 $acc = new Account(null, null, false, false);
2255
2256 $ret[] = implode("&", $acc->fortressAttack($q));
2257 $ret[] = "Success:";
2258 $ret[] = 'ownplayersave.playerSave:'.$acc->getPlayerSave();
2259 $ret[] = "combatloglist.s:".$acc->getCombatLog(); // Update logs
2260
2261 break;
2262 case 'fortressupgrade':
2263
2264 $acc = new Account(null, null, false, false);
2265
2266 $acc->fortressUnitUpgrade($args[0]);
2267
2268 $ret[] = 'Success:';
2269 $ret[] = 'ownplayersave.playerSave:'.$acc->getPlayerSave();
2270 $ret[] = 'unitprice.fortressPrice(3):'.$acc->getTrainUnitsPrice();
2271 $ret[] = 'upgradeprice.upgradePrice(3):'.$acc->getUpgradeUnitsPrice();
2272 $ret[] = 'unitlevel(4):'.$acc->getUnitLvls();
2273
2274 break;
2275 case 'fortressbuildunitstart':
2276
2277 $acc = new Account(null, null, false, false);
2278
2279 $acc->fortressUnitTrain($args[0], $args[1]);
2280
2281 $ret[] = 'Success:';
2282 $ret[] = 'ownplayersave.playerSave:'.$acc->getPlayerSave();
2283
2284
2285 break;
2286 case 'fortressgroupbonusupgrade':
2287
2288 // Upgrading this fortress bonus shit
2289 // Aka hall of knights upgrade
2290 // By Greg
2291
2292 $acc = new Account(null, null, false, false);
2293 $guild = new Guild($playerGuild);
2294
2295 $hokp = Fortress::getHallOfKnightsPrice($acc->data['hok']);
2296
2297 if(!$hokp[4]) {
2298 exit("Success:");
2299 }
2300
2301 if($hokp[2] > $acc->data['wood'] || $hokp[3] > $acc->data['stone']) {
2302 exit();
2303 }
2304
2305 $acc->data['wood'] -= $hokp[2];
2306 $acc->data['stone'] -= $hokp[3];
2307 $acc->data['hok'] += 1;
2308
2309 // Update datas
2310 $db->exec("UPDATE fortress SET wood = '{$acc->data['wood']}', stone = '{$acc->data['stone']}', hok = '{$acc->data['hok']}' WHERE owner = '$playerID'");
2311
2312 $ret[] = 'Success:';
2313 $ret[] = 'ownplayersave.playerSave:'.$acc->getPlayerSave();
2314 $ret[] = 'othergroup.groupSave:'.$guild->getGroupSave();
2315 $ret[] = "fortressGroupPrice.fortressPrice:".$acc->getHallOfKnightsPriceSave();
2316
2317 break;
2318 case 'groupfound':
2319 //create guild
2320 //arg 0 name
2321
2322 if(preg_match('/[^A-Za-z0-9 ]/', $args[0]))
2323 exit('Error:groupname is not available');
2324 if(strlen($args[0]) > 17)
2325 exit('Error:groupname is not available');
2326 if(strlen($args[0]) < 4)
2327 exit('Error:groupname is not available');
2328 if(is_numeric($args[0]))
2329 exit('Error:groupname is not available');
2330
2331 $qry = $db->prepare('SELECT ID FROM guilds WHERE name = :name');
2332 $qry->bindParam(':name', $args[0]);
2333 $qry->execute();
2334
2335 if($qry->rowCount() > 0)
2336 exit('Error:groupname is not available');
2337
2338
2339 $db->exec("INSERT INTO guilds(name) VALUES('$args[0]')");
2340 $guildID = $db->lastInsertId();
2341
2342 $playerData = $db->query("SELECT name, lvl, silver FROM players WHERE ID = $playerID")->fetch(PDO::FETCH_ASSOC);
2343
2344 if($playerData['silver'] < 1000)
2345 exit('Error:need more gold');
2346 $playerData['silver'] -= 1000;
2347
2348 $db->exec("UPDATE players SET guild = $guildID, guild_rank = 1, silver = silver - 1000, event_trigger_count = 0, guild_fight = 0 WHERE ID = $playerID");
2349
2350 $time = $GLOBALS["CURRTIME"];
2351 $message = '#in#'.$playerData['name'];
2352
2353 $db->exec("INSERT INTO guildchat(guildID, playerID, message, time, chattime) VALUES($guildID, $playerID, '$message', $time, 1)");
2354
2355
2356 $ret[] = 'Success:';
2357 //443 = guild join date
2358 $ret[] = "#ownplayersave:2/$time/13/$playerData[silver]/435/$guildID/443/0";
2359 $ret[] = "timestamp:$time";
2360 $cost_1 = Guild::getGuildBuildingCost($acc->data['skill_gold']);
2361 $cost_2 = Guild::getGuildBuildingCost($acc->data['skill_xp']);
2362 $ret[] = 'groupskillprice(6):'.$cost_1['silver'].'/'.$cost_1['mush'].'/'.$cost_2['silver'].'/'.$cost_2['mush'].'/250/0';
2363 $ret[] = 'owngroupsave.groupSave:'.Guild::getCreateGroupSave($guildID, $playerID, $playerData['lvl']);
2364 $ret[] = 'owngrouppotion.r:0,0,0,0,0,0,';
2365 $ret[] = 'owngroupknights.r:0,';
2366 $ret[] = 'owngroupname.r:'.$args[0];
2367 $ret[] = 'owngroupdescription.s:';
2368 $ret[] = 'owngroupmember.r:'.$playerData['name'];
2369 $ret[] = 'owngrouprank:0';// rank = SELECT COUNT(ID) FROM guilds WHERE honor > 99
2370 $ret[] = "chathistory.s(5):$message////";
2371 $ret[] = "chattime:1";
2372
2373 break;
2374 case 'playerarenafight':
2375
2376 $qryArgs = [];
2377 $fightlog = []; // By Greg
2378
2379 //get opponent
2380 $qry = $db->prepare("SELECT players.*, guilds.portal AS guild_portal FROM players LEFT JOIN guilds ON players.guild = guilds.ID WHERE players.name = :name");
2381 $qry->bindParam(':name', $args[0]);
2382 $qry->execute();
2383
2384 //player not found
2385 if($qry->rowCount() == 0)
2386 exit("Error:player not found");
2387
2388 $opponentData = $qry->fetch(PDO::FETCH_ASSOC);
2389
2390 $items = $db->query("SELECT * FROM items WHERE owner = ".$opponentData['ID']." AND slot BETWEEN 10 AND 19");
2391 $items = $items->fetchAll(PDO::FETCH_ASSOC);
2392
2393 $opponent = new Player($opponentData, $items);
2394
2395 //init account
2396 $acc = new Account(null, null, false, true);
2397
2398 // Check if self fight
2399 if($acc->data['ID'] == $opponentData['ID'])
2400 exit('Error:');
2401
2402 if($acc->data['arena_time'] > $GLOBALS["CURRTIME"]){
2403 if($acc->data['mush'] < 0)
2404 exit('Error:need more coins');
2405 else{
2406 $acc->data['mush']--;
2407 $qryArgs[] = 'mush = mush - 1';
2408 }
2409 }else{
2410 $acc->data['arena_time'] = $GLOBALS["CURRTIME"] + 600;
2411 $qryArgs[] = 'arena_time = '.$acc->data['arena_time'];
2412 }
2413
2414 $fightlog[] = "fightheader.fighters:0/0/0/0/1/".$acc->getFightHeader().$opponent->getFightHeader();
2415
2416 $simulation = new Simulation($acc, $opponent);
2417 $simulation->simulate();
2418
2419 //max honor diff = 2k
2420 //formula: 100 + (opponent.honor - player.honor) / (max honor diff / 100)
2421 if($opponent->data['honor'] > $acc->data['honor'])
2422 $honor = min(200, 100 + round(($opponent->data['honor'] - $acc->data['honor']) / 20));
2423 else
2424 $honor = max(0, 100 + round(($opponent->data['honor'] - $acc->data['honor']) / 20));
2425
2426
2427 $rewardLog = [];
2428 for($i = 0; $i < 21; $i++)
2429 $rewardLog[] = 0;
2430
2431 //album items before player save
2432 if($simulation->winnerID == $acc->data['ID']){
2433
2434 // Set fights won + 1
2435 $acc->data['fightswon']++;
2436 $qryArgs[] = "fightswon = fightswon + 1";
2437
2438 $rewardLog[0] = 1;
2439
2440 $rewardLog[5] = $honor;
2441 $qryArgs[] = "honor = honor + $honor";
2442
2443 $db->exec("UPDATE players SET honor = GREATEST(0, honor - $honor) WHERE ID = ".$opponent->data['ID']);
2444
2445 if($acc->hasAlbum() && $acc->album->addItems($opponent->equip)){
2446 $acc->album->encode();
2447 // $db->exec("UPDATE players SET album_data = '".$acc->album->data."', album = ".$acc->album->count." WHERE ID = ".$acc->data['ID']);
2448 $qryArgs[] = 'album_data = "'.$acc->album->data.'", album = '.$acc->album->count;
2449 $ret[] = "scrapbook.r:".$acc->album->data;
2450 $acc->data['album'] = $acc->album->count;
2451 }
2452 }else{
2453 $honor = 200 - $honor;
2454
2455 $rewardLog[5] = '-'.$honor;
2456 $qryArgs[] = "honor = GREATEST(0, honor - $honor)";
2457
2458 $db->exec("UPDATE players SET honor = honor + $honor WHERE ID = ".$opponent->data['ID']);
2459 }
2460
2461 //reset arena enemies
2462 for($i = 1; $i <= 3; $i++){
2463 $acc->data["arena_nme$i"] = 0;
2464 $qryArgs[] = "arena_nme$i = 0";
2465 }
2466
2467
2468 $db->exec("UPDATE players SET ".join(',', $qryArgs)." WHERE ID = $playerID");
2469
2470
2471 $fightlog[] = "fight.r:".$simulation->fightLog;
2472 $fightlog[] = "winnerid:".$simulation->winnerID;
2473
2474 $fightlog = join('&', $fightlog);
2475 $ret[] = $fightlog;
2476
2477 $ret[] = "Success:";
2478 $ret[] = "fightresult.battlereward:".join("/", $rewardLog)."/";
2479 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
2480 $ret[] = "combatloglist.s:".$acc->getCombatLog(); // Update logs
2481 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
2482 // $ret[] = "combatloglist.s:178047146,Ragnarak,1,0,1453561071,0;1829371711,Mrozu,0,9,1453548804,0;2019179682,Arbuz,0,0,1453542838,0;608863024,Fort Szatana,1,2,1453536855,0;749062124,Schwarze Seelen,0,2,1453529461,0;1756257553,Smoke,1,9,1453527707,0;1430622921,KleinesGrünesMännchen,1,0,1453498654,0;690391557,Fort Szatana,1,2,1453494628,0;209357733,Schwarze Seelen,0,2,1453484127,0;1069100244,Yufie,0,0,1453470289,0;1577088167,Fort Szatana,1,2,1453449488,0;1085402077,KeMi,0,0,1453448193,0;1891565546,Schwarze Seelen,0,2,1453439977,0;615269297,FaiX,0,0,1453410393,0;2118894081,Gnadenlos,1,2,1453405221,0;59208430,Mysticwoman,1,0,1453392274,0;937567384,Gnadenlos,1,2,1453355203,0;1508609115,Schwarze Seelen,0,2,1453352471,0;1891729205,spino,1,0,1453329887,0;35842795,Gnadenlos,1,2,1453313103,0;931279938,Schwarze Seelen,0,2,1453310626,0;1192275299,Yulivee,0,0,1453297521,0;1141435371,Aviro,0,0,1453280641,0;721157918,Yulivee,0,0,1453277920,0;2033375401,Yulivee,0,0,1453274653,0;1245941037,Gnadenlos,1,2,1453268569,0;1954219141,Schwarze Seelen,0,2,1453267929,0;1987180995,Petter,0,0,1453229942,0;932256980,Gnadenlos,1,2,1453225438,0;1134002502,Schwarze Seelen,0,2,1453225037,0;1463110198,Mysticwoman,1,0,1453209612,0;908422992,crpzh,1,0,1453207557,0;1239827316,Swordrain,0,0,1453206326,0;1135909002,Gnadenlos,1,2,1453180647,0;1367861018,crpzh,0,0,1453168359,0;811858250,X9Rambo6X,1,0,1453156913,0;866597934,Momochi,0,9,1453151581,0;1426181582,Terrorman79,1,0,1453148036,0;165539174,18,0,3,1453136739,0;1214503715,ChallEnGeRRR,0,0,1453131933,0;1220250895,zarondechanger,1,0,1453114143,0;1927290930,17,1,3,1453093834,0;784169800,GrupaAzoty,1,2,1453082945,0;173641481,crpzh,0,0,1453068685,0;2030313976,crpzh,0,0,1453053120,0;1703023368,Deathrix,1,0,1453052841,0;1171886111,16,1,3,1453051246,0;601901905,FaiX,1,0,1453038432,0;576197653,Jan,0,0,1453035790,0;1854324173,audia17,1,0,1453032401,0;";
2483
2484
2485
2486 break;
2487 case 'wheeloffortune':
2488
2489 // Wheel of fortune by Greg
2490
2491 // Load basic datas
2492 $qry = $db->prepare("SELECT lvl, wheelcounts, newwheel, mush FROM players WHERE ssid = :ssid");
2493 $qry->bindParam(':ssid', $ssid);
2494 $qry->execute();
2495 $prpa = $qry->fetch(PDO::FETCH_ASSOC);
2496 $prlvl = $prpa['lvl'];
2497
2498 if($prpa['wheelcounts'] >= 20) {
2499 exit("Error:need more gold"); // Anit-cheat lol
2500 }
2501
2502 if($prpa['newwheel'] > $GLOBALS["CURRTIME"]) {
2503 $prpa['mush'] -= 1;
2504 if($prpa['mush'] < 0) {
2505 exit("Error:need more coins");
2506 }
2507 }
2508
2509 $prpa['newwheel'] = strtotime('tomorrow');
2510
2511 $db->exec("UPDATE players SET mush = mush - 1, wheelcounts = wheelcounts + 1, newwheel = '".$prpa['newwheel']."' WHERE ID = $playerID");
2512
2513 $qry = $db->prepare("SELECT b0, wood, stone FROM fortress WHERE owner = :pid");
2514 $qry->bindParam(':pid', $playerID);
2515 $qry->execute();
2516 $fortdata = $qry->fetch(PDO::FETCH_ASSOC);
2517
2518 $acc = new Account(null, null, false, false);
2519
2520 // Lets start
2521 $r = rand(1, 5); // 1 = Gold, 2 = XP, 3 = Wood, 4 = Stone, 5 = Mushroom
2522
2523 $more = rand(1, 3) == 3 ? TRUE : FALSE;
2524
2525 // Where are
2526 $bonus = array(4, 2, 6, 8);
2527 $normal = array(9, 7, 1, 3);
2528
2529 // Default values
2530 $waa = 0;
2531 $muu = rand(50, 250);
2532
2533 // Generate what and how much
2534 if($more) {
2535 // Give more
2536 switch($r) {
2537 case 1 :
2538 $waa = $bonus[0];
2539 $muu = Account::getQuestGold($prlvl, $goldbonus) * 4;
2540 break;
2541 case 2 :
2542 $waa = $bonus[1];
2543 $muu = $acc->generateQuest($prlvl, 0, 2)['exp'];
2544 break;
2545 case 3 :
2546 $waa = $bonus[2];
2547 $muu = intval( (Fortress::getGlobalMaxResources(1, $fortdata['b0']) / 7) * (rand(1000, 1100) / 1000) );
2548 break;
2549 case 4 :
2550 $waa = $bonus[3];
2551 $muu = intval( (Fortress::getGlobalMaxResources(2, $fortdata['b0']) / 7) * (rand(1000, 1100) / 1000) );
2552 break;
2553 }
2554 }else{
2555 // Give normal
2556 switch($r) {
2557 case 1 :
2558 $waa = $normal[0];
2559 $muu = Account::getQuestGold($prlvl, $goldbonus) * 2;
2560 break;
2561 case 2 :
2562 $waa = $normal[1];
2563 $muu = $acc->generateQuest($prlvl, 0, 1)['exp'];
2564 break;
2565 case 3 :
2566 $waa = $normal[2];
2567 $muu = intval( (Fortress::getGlobalMaxResources(1, $fortdata['b0']) / 7) * (rand(500, 550) / 1000) );
2568 break;
2569 case 4 :
2570 $waa = $normal[3];
2571 $muu = intval( (Fortress::getGlobalMaxResources(2, $fortdata['b0']) / 7) * (rand(500, 550) / 1000) );
2572 break;
2573 }
2574 }
2575
2576 if($r == 5) {
2577 $waa = 0;
2578 $muu = rand(50, 250);
2579 }
2580
2581 // Give things to player 1 = Gold, 2 = XP, 3 = Wood, 4 = Stone, 5 = Mushroom
2582 switch($r) {
2583 case 1 :
2584 $db->exec("UPDATE players SET silver = silver + $muu WHERE ID = $playerID");
2585 break;
2586 case 2 :
2587 $acc->addExp($muu);
2588 $db->exec("UPDATE players SET exp = ".$acc->data['exp'].", lvl = ".$acc->data['lvl']." WHERE ID = ".$playerID);
2589 break;
2590 case 3 :
2591 $new_wood = $fortdata['wood'] + $muu;
2592 if( $new_wood > Fortress::getGlobalMaxResources(1, $fortdata['b0']) ) {
2593 $new_wood = Fortress::getGlobalMaxResources(1, $fortdata['b0']);
2594 }
2595 $db->exec("UPDATE fortress SET wood = $new_wood WHERE owner = $playerID");
2596 break;
2597 case 4 :
2598 $new_stone = $fortdata['stone'] + $muu;
2599 if( $new_stone > Fortress::getGlobalMaxResources(2, $fortdata['b0']) ) {
2600 $new_stone = Fortress::getGlobalMaxResources(2, $fortdata['b0']);
2601 }
2602 $db->exec("UPDATE fortress SET stone = $new_stone WHERE owner = $playerID");
2603 break;
2604 case 5 :
2605 $db->exec("UPDATE players SET mush = mush + $muu WHERE ID = $playerID");
2606 break;
2607 }
2608
2609 $acc = new Account(null, null, false, false);
2610
2611 $ret[] = "Success:";
2612 $ret[] = "wheelresult(2):{$waa}/{$muu}";
2613 $ret[] = 'ownplayersave.playerSave:'.$acc->getPlayerSave();
2614 //$ret[] = '#ownplayersave:2/1659705906/14/12/545/2/772/3';
2615 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
2616 break;
2617 case 'playermessageview':
2618
2619 //arg0 = messageID
2620
2621 $qry = $db->prepare("SELECT ID, message FROM messages WHERE reciver = $playerID AND ID = :msgid");
2622 $qry->bindParam(':msgid', $args[0]);
2623 $qry->execute();
2624 $msg = $qry->fetch(PDO::FETCH_ASSOC);
2625
2626 if($qry->rowCount()>0){
2627
2628 $db->exec('UPDATE messages SET hasRead = true WHERE ID = '.$msg['ID']);
2629
2630 $ret[] = 'messagetext.s:'.$msg['message'];
2631 $ret[] = 'Success:';
2632 }
2633
2634 break;
2635 case 'playermessagedelete':
2636
2637 if($args[0] == -1){
2638 $db->exec("DELETE FROM messages WHERE reciver = $playerID");
2639
2640 exit('Success:&messagelist.r:');
2641 }else{
2642 $db->exec("DELETE FROM messages WHERE reciver = $playerID AND ID = $args[0]");
2643
2644 $messages = $db->query("SELECT messages.ID, players.name, messages.hasRead, messages.topic, messages.time
2645 FROM messages LEFT JOIN players ON messages.sender = players.ID WHERE reciver = $playerID ORDER BY time DESC");
2646 $messages = $messages->fetchAll(PDO::FETCH_ASSOC);
2647 // $msgs = [];
2648 // foreach($messages as $msg){
2649 // if(strlen($msg['name']) == 0)
2650 // $msg['name'] = 'admin';
2651 // $msgs[] = join(',', $msg);
2652 // }
2653
2654 $ret[] = 'Success:';
2655 $ret[] = 'messagelist.r:'.Chat::formatMessages($messages);
2656 }
2657
2658
2659
2660 break;
2661 case 'grouplookat':
2662 // arg 0 = guild name
2663
2664 $qry = $db->prepare('SELECT ID, descr FROM guilds WHERE name = :name');
2665 $qry->bindParam(':name', $args[0]);
2666 $qry->execute();
2667
2668 $fetch = $qry->fetch(PDO::FETCH_ASSOC);
2669
2670 if($qry->rowCount() == 0)
2671 exit('Error:group not found');
2672
2673 $guild = new Guild($fetch['ID']);
2674
2675 $ret[] = 'Success:';
2676 $ret[] = 'othergroup.groupSave:'.$guild->getGroupSave();
2677 $ret[] = 'othergroupdescription.s:'.$fetch['descr'];
2678 $ret[] = 'othergroupname.r:'.$guild->data['name'];
2679 $ret[] = 'othergroupmember.s:'.$guild->getMemberList();
2680 $ret[] = 'othergrouprank:1';
2681 $ret[] = 'othergroupfightcost:'.Guild::getAttackCost($guild->data['base']);
2682 if(($oga = $guild->getOtherGroupAttack()) !== false)
2683 $ret[] = $oga;
2684
2685 break;
2686 case 'groupsetofficer':
2687
2688 $time = $GLOBALS["CURRTIME"];
2689 $names = $db->query("SELECT name, guild_rank FROM players WHERE ID = $playerID OR ID = $args[0] ORDER BY guild_rank")->fetchAll();
2690
2691 $promote = $names[1]['guild_rank'] == 2? 3 : 2;
2692
2693 if(!$db->exec("UPDATE players SET guild_rank = $promote WHERE ID = $args[0] AND guild = $playerGuild"))
2694 exit('Error:');
2695
2696 $ftime = gmdate("H:i", $GLOBALS["CURRTIME"] + 3600);
2697 $name1 = $names[0]['name'];
2698 $name2 = $names[1]['name'];
2699 $message = "#ra#$ftime $name1#$promote#$name2";
2700
2701 $chattime = Chat::chatInsert($message, $playerGuild, $playerID);
2702
2703 $chat = Chat::getChat($playerGuild);
2704
2705 //update player poll
2706 $db->exec("UPDATE players SET poll = $time WHERE ID = $playerID");
2707
2708 $guild = new Guild($playerGuild);
2709
2710 $ret[] = 'Success:';
2711 $ret[] = 'owngroupsave.groupSave:'.$guild->getGroupSave();
2712 $ret[] = 'chathistory.s(5):'.Chat::formatChat($chat);
2713 $ret[] = "chattime:$chattime";
2714
2715 break;
2716 case 'groupsetleader':
2717 $qry = $db->query("SELECT name, guild, guild_rank FROM players WHERE ID = $args[0] OR ID = $playerID ORDER BY guild_rank DESC")->fetchAll(PDO::FETCH_ASSOC);
2718 $newleader = $qry[0];
2719 $player = $qry[1];
2720
2721 if($newleader['guild'] != $player['guild'] || $player['guild_rank'] != 1)
2722 exit();
2723
2724 $db->exec("UPDATE players SET guild_rank = 2 WHERE ID = $playerID;UPDATE players SET guild_rank = 1 WHERE ID = $args[0]");
2725
2726 $message = "#rv#$newleader[name]#$player[name]";
2727
2728 $chattime = Chat::chatInsert($message, $playerGuild, $playerID);
2729
2730 $guild = new Guild($playerGuild);
2731
2732 $ret[] ='Success:';
2733 $ret[] ='owngroupsave.groupSave:'.$guild->getGroupSave();
2734 $ret[] ='owngroupmember.r:'.$guild->getMemberList();
2735 $ret[] ='chathistory.s(5):'.Chat::formatChat(Chat::getChat($playerGuild));
2736 $ret[] ="chattime:$chattime";
2737
2738 break;
2739 case 'groupremovemember':
2740
2741 $time = $GLOBALS["CURRTIME"];
2742
2743
2744 if($playerID == $args[0]){
2745 $acc = new Account(null, null, false, false);
2746
2747 //disband guild
2748 if($acc->data['guild_rank'] == 1){
2749 $db->exec("INSERT INTO messages(sender, reciver, time, topic, message) SELECT $playerID, players.ID, UNIX_TIMESTAMP(), '1', '{$acc->data['gname']}' FROM players WHERE guild = $playerGuild AND players.ID != $playerID;
2750 UPDATE players SET guild = 0, guild_rank = 3, guild_fight = 0 WHERE guild = $playerGuild;
2751 DELETE FROM guilds WHERE ID = $playerGuild;
2752 DELETE FROM guildchat WHERE guildID = $playerGuild;
2753 DELETE FROM guildinvites WHERE guildID = $playerGuild;
2754 DELETE FROM guildfights WHERE guildAttacker = $playerGuild OR guildDefender = $playerGuild LIMIT 2;");
2755
2756 }else{
2757 $ftime = gmdate("H:i", $time + 30);
2758 $name = $acc->data['name'];
2759 $message = "#ou#$ftime $name";
2760
2761 Chat::chatInsert($message, $playerGuild, $playerID);
2762 $db->exec("UPDATE players SET guild = 0, guild_rank = 3, guild_fight = 0, event_trigger_count = 0 WHERE ID = $playerID");
2763 }
2764
2765 $acc->data['guild'] = 0;
2766 $acc->data['guild_rank'] = 3;
2767
2768 $ret[] = 'Success:';
2769 $ret[] = 'ownplayersave.playerSave:'.$acc->getPlayerSave();
2770 break;
2771 }
2772
2773 //see if just removing invite
2774 if(!$db->exec("DELETE FROM guildinvites WHERE guildID = $playerGuild AND playerID = $args[0]")){
2775
2776 //send message to the kicked player
2777
2778
2779 $db->exec("UPDATE players SET guild = 0, guild_rank = 3, guild_fight = 0, event_trigger_count = 0 WHERE ID = $args[0]");
2780
2781 $ftime = gmdate("H:i", $time + 30);
2782 $name = $db->query("SELECT name FROM players WHERE ID = $args[0]")->fetch(PDO::FETCH_ASSOC)['name'];
2783 $message = "#ou#$ftime $name";
2784
2785 //get chat before updating poll
2786 $chattime = Chat::chatInsert($message, $playerGuild, $playerID);
2787
2788 $chat = Chat::getChat($playerGuild);
2789
2790 //update player poll
2791 $db->exec("UPDATE players SET poll = $time WHERE ID = $playerID");
2792 $ret[] = 'chathistory.s(5):'.Chat::formatChat($chat);
2793 $ret[] = "chattime:$chattime";
2794 }
2795
2796 $guild = new Guild($playerGuild);
2797
2798 $ret[] = 'Success:';
2799 $ret[] = 'owngroupsave.groupSave:'.$guild->getGroupSave();
2800
2801 break;
2802 case 'groupinvitemember':
2803
2804 $acc = new Account(null, null, false, false);
2805
2806 $guild = new Guild($playerGuild);
2807
2808 if(!$guild->hasFreeInvitePlace())
2809 exit('Error:group is full');
2810
2811 $time = $GLOBALS["CURRTIME"];
2812 $gName = $guild->data['name'];
2813
2814 $fetchF = $db->query("SELECT ID, friends, guild, noinv FROM players WHERE name = '{$args[0]}'")->fetchAll()[0];
2815
2816 $uID = $fetchF['ID'];
2817
2818 if($acc->data['guild'] == $fetchF['guild'])
2819 exit("Success:"); // Fix by Greg
2820
2821 if($acc::isUserIgnored($fetchF['friends'], $playerID))
2822 exit('Error:player not found');
2823
2824 if($fetchF["noinv"] == 1)
2825 exit("Error:noinvite");
2826
2827 //insert message - Greg fix
2828 //$qry = $db->prepare("INSERT INTO messages(sender, reciver, time, topic, message) SELECT $playerID, players.ID, $time, 5, '$gName' FROM players WHERE name = :name");
2829 $qry = $db->prepare("INSERT INTO messages(sender, reciver, time, topic, message) VALUES ($playerID, $uID, $time, 5, '$gName')");
2830 //$qry->bindParam(':name', $args[0]);
2831 $qry->execute();
2832
2833 //insert invite
2834 $qry = $db->prepare("INSERT INTO guildinvites(guildID, playerID) SELECT $playerGuild, players.ID FROM players WHERE name = :name");
2835 $qry->bindParam(':name', $args[0]);
2836 $qry->execute();
2837
2838 //update invites in guild object
2839 $invited = $db->query("SELECT players.ID, players.name, players.lvl FROM guildinvites LEFT JOIN players ON guildinvites.playerID = players.ID WHERE guildinvites.guildID = $playerGuild ORDER BY players.lvl DESC");
2840 $guild->invites = $invited->fetchAll(PDO::FETCH_ASSOC);
2841
2842
2843
2844 $ret[] = 'Success:';
2845 $ret[] = 'owngroupsave.groupSave:'.$guild->getGroupSave();
2846 $ret[] = 'owngroupmember.r:'.$guild->getMemberList();
2847
2848 break;
2849 case 'groupinviteaccept':
2850
2851 if($playerGuild != 0)
2852 exit('Error:must leave group first');
2853
2854 $qry = $db->prepare("SELECT guilds.ID, event_trigger_count FROM guilds WHERE name = :name");
2855 $qry->bindParam(':name', $args[0]);
2856 $qry->execute();
2857 $obj = $qry->fetch(PDO::FETCH_ASSOC);
2858 $guildID = $obj['ID'];
2859 $etc = $obj['event_trigger_count'];
2860
2861 if($qry->rowCount() == 0)
2862 exit('Error:group not found');
2863
2864 if(!$db->exec("DELETE FROM guildinvites WHERE guildID = $guildID AND playerID = $playerID"))
2865 exit('Error:you are not invited');
2866
2867 $acc = new Account(null, null, false, false);
2868 $acc->data['guild'] = $guildID;
2869 $acc->data['guild_rank'] = 3;
2870 $acc->data['event_trigger_count'] = $etc;
2871
2872 //insert message
2873 $message = '#in#'.$acc->data['name'];
2874 $time = $GLOBALS["CURRTIME"];
2875 // $db->exec("INSERT INTO guildchat(guildID, playerID, message, time) VALUES($guildID, $playerID, '$message', $time)");
2876 $chattime = Chat::chatInsert($message, $guildID, $playerID);
2877 $chat = Chat::getChat($guildID);
2878
2879 $db->exec("UPDATE players SET guild = $guildID, guild_rank = 3, event_trigger_count = $etc, guild_fight = 0 WHERE ID = $playerID");
2880
2881
2882 $guild = new Guild($guildID);
2883
2884 $ret[] = 'Success:';
2885 $ret[] = 'ownplayersave.playerSave:'.$acc->getPlayerSave();
2886 $ret[] = 'owngroupsave.groupSave:'.$guild->getGroupSave();
2887 $ret[] = "owngrouppotion.r:".$guild->getPotionData();
2888 $ret[] = "owngroupname.r:".$guild->data['name'];
2889 $ret[] = "owngroupdescription.s:".$guild->data['descr'];
2890 $ret[] = "owngroupmember.r:".$guild->getMemberList();
2891 $ret[] = "owngrouprank:".$guild->getRank();
2892 $ret[] = "chathistory.s(5):".Chat::formatChat($chat);
2893 $cost_1 = Guild::getGuildBuildingCost($acc->data['skill_gold']);
2894 $cost_2 = Guild::getGuildBuildingCost($acc->data['skill_xp']);
2895 $ret[] = 'groupskillprice(6):'.$cost_1['silver'].'/'.$cost_1['mush'].'/'.$cost_2['silver'].'/'.$cost_2['mush'].'/250/0';
2896 $ret[] = "chattime:$chattime";
2897
2898 break;
2899 case 'groupspendgold':
2900
2901 $time = $GLOBALS["CURRTIME"];
2902
2903 $playerData = $db->query("SELECT players.name, players.silver, guilds.silver AS gsilver FROM players LEFT JOIN guilds ON players.guild = guilds.ID WHERE players.ID = $playerID")->fetch(PDO::FETCH_ASSOC);
2904 $playerSilver = $playerData['silver'];
2905 $name = $playerData['name'];
2906 $gSilver = $playerData['gsilver'];
2907
2908 if($args[0] < 0)
2909 exit();
2910
2911 if($playerSilver < $args[0])
2912 exit("Error:need more gold");
2913 if($gSilver >= 1000000000)
2914 exit('Error:group chest is full');
2915
2916 if($gSilver + $args[0] > 1000000000)
2917 $args[0] = 1000000000 - $gSilver;
2918
2919 $ftime = gmdate("H:i", $time + 3600);
2920 $message = "#dg#$ftime $name#$args[0]";
2921
2922 //get chat before updating poll
2923 // $db->exec("INSERT INTO guildchat(guildID, playerID, message, time) VALUES($playerGuild, $playerID, '$message', $time)");
2924
2925 // $chat = $db->query("SELECT players.name, guildchat.message, guildchat.time FROM guildchat LEFT JOIN players ON guildchat.playerID = players.ID
2926 // WHERE guildchat.guildID = $playerGuild AND guildchat.time > $playerPoll ORDER BY guildchat.time DESC LIMIT 5")->fetchAll(PDO::FETCH_ASSOC);
2927 $chattime = Chat::chatInsert($message, $playerGuild, $playerID);
2928 $chat = Chat::getChat($playerGuild);
2929
2930 //update player and guild gold
2931 $db->exec("UPDATE players SET donatesilver = donatesilver + $args[0], silver = silver - $args[0], poll = $time WHERE ID = $playerID;UPDATE guilds SET silver = silver + $args[0] WHERE ID = $playerGuild;");
2932
2933 $guild = new Guild($playerGuild);
2934
2935 $playerSilver -= $args[0];
2936
2937 $ret[] = 'Success:';
2938 $ret[] = "#ownplayersave:2/$time/13/$playerSilver";//.$acc->getPlayerSave();
2939 $ret[] = "timestamp:$time";
2940 $ret[] = 'owngroupsave.groupSave:'.$guild->getGroupSave();
2941 $ret[] = 'chathistory.s(5):'.Chat::formatChat($chat);
2942 $ret[] = "chattime:$chattime";
2943
2944 break;
2945 case 'groupspendcoins':
2946
2947 $time = $GLOBALS["CURRTIME"];
2948
2949 $playerData = $db->query("SELECT players.name, players.mush, guilds.mush AS gmush FROM players LEFT JOIN guilds ON players.guild = guilds.ID WHERE players.ID = $playerID")->fetch(PDO::FETCH_ASSOC);
2950 $playerMush = $playerData['mush'];
2951 $name = $playerData['name'];
2952 $gMush = $playerData['gmush'];
2953
2954 if($args[0] < 0)
2955 exit();
2956
2957 if($playerMush < $args[0])
2958 exit("Error:need more coins");
2959 if($gMush >= 10000)
2960 exit('Error:group chest is full');
2961
2962 if($gMush + $args[0] > 10000)
2963 $args[0] = 10000 - $gSilver;
2964
2965
2966 $ftime = gmdate("H:i", $time + 3600);
2967 $message = "#dm#$ftime $name#$args[0]";
2968
2969 //get chat before updating poll
2970 // $db->exec("INSERT INTO guildchat(guildID, playerID, message, time) VALUES($playerGuild, $playerID, '$message', $time)");
2971 // $chat = $db->query("SELECT players.name, guildchat.message, guildchat.time FROM guildchat LEFT JOIN players ON guildchat.playerID = players.ID
2972 // WHERE guildchat.guildID = $playerGuild AND guildchat.time > $playerPoll ORDER BY guildchat.time DESC LIMIT 5")->fetchAll(PDO::FETCH_ASSOC);
2973 $chattime = Chat::chatInsert($message, $playerGuild, $playerID);
2974 $chat = Chat::getChat($playerGuild);
2975
2976
2977 //update player and guild gold
2978 $db->exec("UPDATE players SET donatemush = donatemush + $args[0], mush = mush - $args[0], poll = $time WHERE ID = $playerID;UPDATE guilds SET mush = mush + $args[0] WHERE ID = $playerGuild;");
2979
2980 //load guild
2981 $guild = new Guild($playerGuild);
2982
2983 //insert this in chat #dg#14:29 Pan Marcel#38500
2984 $time = $GLOBALS["CURRTIME"];
2985
2986
2987 $playerMush -= $args[0];
2988
2989 $ret[] = 'Success:';
2990 $ret[] = "#ownplayersave:2/$time/14/$playerMush/437/$playerMush";//.$acc->getPlayerSave();
2991 $ret[] = "timestamp:$time";
2992 $ret[] = 'owngroupsave.groupSave:'.$guild->getGroupSave();
2993 $ret[] = 'chathistory.s(5):'.Chat::formatChat($chat);
2994 $ret[] = "chattime:$chattime";
2995
2996 // $message = "#dm#$time $name#$donation";
2997
2998
2999 break;
3000 case 'groupincreasebuilding':
3001
3002 $player = $db->query("SELECT name, guild_rank FROM players WHERE ID = $playerID")->fetch(PDO::FETCH_ASSOC);
3003
3004 if($player['guild_rank'] == 3)
3005 exit();
3006
3007 $guild = new Guild($playerGuild);
3008
3009 if($args[0] == '0') {
3010 // Catapult by Greg
3011 if($guild->data['mush'] < 5)
3012 exit('Error:need more coins');
3013
3014 if($guild->data['catapult'] >= 3)
3015 exit();
3016
3017 $guild->data['mush'] -= 5;
3018 $guild->data['catapult']++;
3019
3020 $db->exec("UPDATE guilds SET catapult = catapult + 1, mush = mush - 5 WHERE ID = $playerGuild");
3021
3022 $ret[] = 'Success:';
3023 $ret[] = 'owngroupsave.groupSave:'.$guild->getGroupSave();
3024 $ret[] = 'chathistory.s(5):'.Chat::formatChat($chat);
3025 $ret[] = "chattime:$chattime";
3026
3027 }else{
3028 // Building
3029 $building = ['base', 'treasure', 'instructor'][$args[0] - 1];
3030
3031 if($guild->data[$building] >= 50)
3032 exit();
3033
3034 $cost = Guild::getGuildBuildingCost($guild->data[$building]);
3035
3036 if($guild->data['silver'] < $cost['silver'])
3037 exit('Error:need more gold');
3038
3039 if($guild->data['mush'] < $cost['mushroom'])
3040 exit('Error:need more coins');
3041
3042 $guild->data[$building] ++;
3043 $guild->data['silver'] -= $cost['silver'];
3044 $guild->data['mush'] -= $cost['mushroom'];
3045
3046 $db->exec("UPDATE guilds SET $building = $building + 1, silver = silver - $cost[silver], mush = mush - $cost[mushroom] WHERE ID = $playerGuild");
3047 }
3048
3049 //log
3050 $time = $GLOBALS["CURRTIME"];
3051 $ftime = gmdate("H:i", $time + 3600);
3052 $message = "#bd#$ftime $player[name]#$args[0]";
3053
3054 //get chat before updating poll
3055 // $db->exec("INSERT INTO guildchat(guildID, playerID, message, time) VALUES($playerGuild, $playerID, '$message', $time)");
3056 // $chat = $db->query("SELECT players.name, guildchat.message, guildchat.time FROM guildchat LEFT JOIN players ON guildchat.playerID = players.ID
3057 // WHERE guildchat.guildID = $playerGuild AND guildchat.time > $playerPoll ORDER BY guildchat.time DESC LIMIT 5")->fetchAll(PDO::FETCH_ASSOC);
3058 $chattime = Chat::chatInsert($message, $playerGuild, $playerID);
3059 $chat = Chat::getChat($playerGuild);
3060
3061 //update player poll
3062 $db->exec("UPDATE players SET poll = $time WHERE ID = $playerID");
3063
3064
3065 $ret[] = 'Success:';
3066 $ret[] = 'owngroupsave.groupSave:'.$guild->getGroupSave();
3067 $ret[] = 'chathistory.s(5):'.Chat::formatChat($chat);
3068 $cost_1 = Guild::getGuildBuildingCost($acc->data['skill_gold']);
3069 $cost_2 = Guild::getGuildBuildingCost($acc->data['skill_xp']);
3070 $ret[] = 'groupskillprice(6):'.$cost_1['silver'].'/'.$cost_1['mush'].'/'.$cost_2['silver'].'/'.$cost_2['mush'].'/250/0';
3071 $ret[] = "chattime:$chattime";
3072
3073 break;
3074 case 'groupskillincrease':
3075
3076 intval($args[0]);
3077
3078 $guild = new Guild($playerGuild);
3079 $acc = new Account(null, null, false, false); // New acc
3080
3081 if($args[0] == 0) {
3082
3083 $cost_1 = Guild::getGuildBuildingCost($acc->data['skill_gold']);
3084
3085 if($acc->data['silver'] < $cost_1['silver'])
3086 exit_fixed('Error:need more gold');
3087
3088 if($acc->data['mush'] < $cost_1['mush'])
3089 exit_fixed('Error:need more coins');
3090
3091 $acc->data['silver'] -= $cost_1['silver'];
3092 $acc->data['mush'] -= $cost_1['mush'];
3093
3094 $acc->data['skill_gold']++;
3095 $guild->skill['guild_skill_gold']++;
3096
3097 $db->query("UPDATE players SET skill_gold = skill_gold + 1, mush = mush - $cost_1[mush], silver = silver - $cost_1[silver] WHERE ID = $playerID");
3098
3099 } else {
3100
3101 $cost_2 = Guild::getGuildBuildingCost($acc->data['skill_xp']);
3102
3103 if($acc->data['silver'] < $cost_2['silver'])
3104 exit_fixed('Error:need more gold');
3105
3106 if($acc->data['mush'] < $cost_2['mush'])
3107 exit_fixed('Error:need more coins');
3108
3109 $acc->data['silver'] -= $cost_2['silver'];
3110 $acc->data['mush'] -= $cost_2['mush'];
3111
3112 $acc->data['skill_xp']++;
3113 $guild->skill['guild_skill_xp']++;
3114
3115 $db->query("UPDATE players SET skill_xp = skill_xp + 1, mush = mush - $cost_2[mush], silver = silver - $cost_2[silver] WHERE ID = $playerID");
3116
3117 }
3118
3119 $ret[] = 'Success:';
3120 $ret[] = 'owngroupsave.groupSave:'.$guild->getGroupSave();
3121 $ret[] = 'ownplayersave.playerSave:'.$acc->getPlayerSave();
3122 $chat = Chat::getChat($playerGuild);
3123 $ret[] = 'chathistory.s(5):'.Chat::formatChat($chat);
3124 $cost_1 = Guild::getGuildBuildingCost($acc->data['skill_gold']);
3125 $cost_2 = Guild::getGuildBuildingCost($acc->data['skill_xp']);
3126 $ret[] = 'groupskillprice(6):'.$cost_1['silver'].'/'.$cost_1['mush'].'/'.$cost_2['silver'].'/'.$cost_2['mush'].'/250/0';
3127
3128 break;
3129 case 'groupchat':
3130
3131 $time = $GLOBALS["CURRTIME"];
3132
3133 $limit = 5;
3134
3135 $ins = $args[0];
3136
3137 if(substr($ins, 0, 2) == "--"){
3138 $spc = explode(" ", substr($ins, 2));
3139
3140 switch($spc[0]){
3141
3142 default:
3143 exit("Error:invalid command");
3144 }
3145 }
3146
3147 $chattime = Chat::chatInsert($ins, $playerGuild, $playerID, $playerPerm);
3148 $chat = Chat::getChat($playerGuild, $limit);
3149
3150 $db->exec("UPDATE players SET poll = $time WHERE ID = $playerID");
3151
3152 $ret[] = 'Success:';
3153 $ret[] = 'chathistory.s(5):'.Chat::formatChat($chat);
3154 $ret[] = "chattime:$chattime";
3155
3156
3157 break;
3158 case 'groupraiddeclare':
3159 // Raid
3160 $args[0] = 1000000;
3161 case 'groupattackdeclare':
3162 // Injection fix
3163 if(is_numeric($args[0]) == false)
3164 exit();
3165
3166 $guild = new Guild($playerGuild);
3167 $guild->declareFight($args[0], $playerID);
3168
3169
3170
3171 $ret[] = 'Success:';
3172 // $ret[] = '#ownplayersave:508/1';
3173 $ret[] = 'timestamp:'.$GLOBALS["CURRTIME"];
3174 $ret[] = 'owngroupsave.groupSave:'.$guild->getGroupSave();
3175 if($args[0] != 1000000){
3176 //$aname = $db->query("SELECT name FROM guilds WHERE ID = $args[0]")->fetch(PDO::FETCH_ASSOC)['name'];
3177
3178 $qry = $db->prepare("SELECT name FROM guilds WHERE ID = :groupid");
3179 $qry->bindParam(':groupid', $args[0]);
3180 $qry->execute();
3181 $aname = $qry->fetch(PDO::FETCH_ASSOC)['name'];
3182
3183 $ret[] = "owngroupattack.r:".$aname;
3184 }
3185
3186 break;
3187 case 'groupreadyattack':
3188
3189 if($playerGuild == 0)
3190 exit();
3191
3192 $fight = $db->query("SELECT guild_fight FROM players WHERE ID = $playerID")->fetch(PDO::FETCH_ASSOC)['guild_fight'];
3193 $fight++;
3194 if($fight != 1 && $fight != 3)
3195 exit();
3196 $db->exec("UPDATE players SET guild_fight = $fight WHERE ID = $playerID");
3197
3198 $guild = new Guild($playerGuild);
3199
3200 $ret[] = 'Success:';
3201 $ret[] = "#ownplayersave:508/$fight";
3202 $ret[] = 'timestamp:'.$GLOBALS["CURRTIME"];
3203 $ret[] = 'owngroupsave.groupSave:'.$guild->getGroupSave();
3204
3205 break;
3206 case 'groupreadydefense':
3207
3208 if($playerGuild == 0)
3209 exit();
3210
3211 $fight = $db->query("SELECT guild_fight FROM players WHERE ID = $playerID")->fetch(PDO::FETCH_ASSOC)['guild_fight'];
3212 $fight += 2;
3213 if($fight != 2 && $fight != 3)
3214 exit();
3215 $db->exec("UPDATE players SET guild_fight = $fight WHERE ID = $playerID");
3216
3217 $guild = new Guild($playerGuild);
3218
3219 $ret[] = 'Success:';
3220 $ret[] = "#ownplayersave:508/$fight";
3221 $ret[] = 'timestamp:'.$GLOBALS["CURRTIME"];
3222 $ret[] = 'owngroupsave.groupSave:'.$guild->getGroupSave();
3223
3224
3225 break;
3226 case 'groupgetbattle':
3227 // Fixed by Greg
3228
3229 $time = $GLOBALS["CURRTIME"];
3230
3231 $acc = new Account(null, null, false, false); // New acc
3232 $guild = new Guild($playerGuild);
3233
3234 // //SEE IF SIM FIGHT and shiet
3235 $guildData = $db->query("SELECT event_trigger_count, dungeon, honor, name FROM guilds WHERE ID = $playerGuild")->fetch(PDO::FETCH_ASSOC);
3236
3237 $fights = $db->query("SELECT guildfights.ID, guildfights.guildAttacker, g1.name AS attacker, guildfights.guildDefender, g2.name AS defender, time
3238 FROM guildfights LEFT JOIN guilds AS g1 ON guildfights.guildAttacker = g1.ID LEFT JOIN guilds AS g2 ON guildfights.guildDefender = g2.ID
3239 WHERE (guildfights.guildAttacker = $playerGuild OR guildfights.guildDefender = $playerGuild) AND time <= $time ORDER BY time ASC");
3240
3241
3242 // //if simfight
3243 if(($n = $fights->rowCount()) > 0){
3244 $fights = $fights->fetchAll(PDO::FETCH_ASSOC);
3245
3246 //delete fight from db right away
3247 $db->exec("DELETE FROM guildfights WHERE guildAttacker = $playerGuild OR guildDefender = $playerGuild LIMIT 2;");
3248
3249 //update trigger count, defenders guild too
3250 foreach($fights as $fight){
3251 if($fight['guildDefender'] != 1000000)
3252 $db->exec("UPDATE guilds SET event_trigger_count = event_trigger_count + 1 WHERE ID = $fight[guildAttacker] OR ID = $fight[guildDefender]");
3253 else
3254 $db->exec("UPDATE guilds SET event_trigger_count = event_trigger_count + 1 WHERE ID = $fight[guildAttacker]");
3255 $guildData['event_trigger_count']++;
3256 }
3257
3258 //ALG: loop through fights incase there are 2, always ordered by time ascending. Display only the lastest, which is simulated as 2nd
3259 // if the fight is in guildfights table, it hasn't been simulated, simulate and add to logs
3260 // always simulate from the perspective of the attacker, defender can use GroupSimulation::reverseGuildFightLog() on displaying
3261
3262 foreach($fights as $fight){
3263
3264 //fight log, plain string, fuck it
3265 $fightLog = [];
3266
3267 //get players
3268 // Fix by Greg only declared players fight
3269 //$players = $db->query("SELECT players.*, guilds.portal AS guild_portal FROM players LEFT JOIN guilds ON players.guild = guilds.ID WHERE players.guild = $fight[guildAttacker] ORDER BY lvl ASC")->fetchAll(PDO::FETCH_ASSOC);
3270 $players = $db->query("SELECT players.*, guilds.portal AS guild_portal FROM players LEFT JOIN guilds ON players.guild = guilds.ID WHERE players.guild = $fight[guildAttacker] AND players.guild_fight = 1 ORDER BY lvl ASC")->fetchAll(PDO::FETCH_ASSOC);
3271 $playerObjects = [];
3272 $items = $db->query("SELECT players.ID AS pid, items.* FROM items LEFT JOIN players ON items.owner = players.ID WHERE players.guild = $fight[guildAttacker] AND items.slot BETWEEN 10 AND 19");
3273 $items = $items->fetchAll(PDO::FETCH_GROUP);
3274 foreach($players as $player){
3275 //$items_p = $items[$player['ID']] ?? [];
3276 $items_p = (isset($items[$player['ID']])) ? $items[$player['ID']] : [];
3277 @$playerObjects[] = new Player($player, $items_p);
3278 }
3279
3280 //get opponents, see if guild raid
3281 if($fight['guildDefender'] == 1000000){
3282 //just get shit from guild data, only players from guild call this
3283 $opponentObjects = Monster::getGuildRaid($guildData['dungeon']);
3284
3285 //guild raid 150 lvl update - Greg
3286 //raid lvl 50 - 100
3287 if($guildData['dungeon'] >= 50 && $guildData['dungeon'] < 100) {
3288
3289 $opponentObjects = []; //clear array
3290
3291 $i = 0;
3292 foreach(Monster::getGuildRaid($guildData['dungeon'] - 50) as $monster) {
3293
3294 if($i == count(Monster::getGuildRaid($guildData['dungeon'] - 50)) - 1)
3295 $monster->raidbuff(true); // monster is boss
3296 else
3297 $monster->raidbuff(false);
3298
3299 $opponentObjects[] = $monster;
3300
3301 $i++;
3302 }
3303
3304 //raid lvl 100-150
3305 } else if($guildData['dungeon'] >= 100) {
3306 $opponentObjects = []; //clear array
3307
3308 $i = 0;
3309 foreach(Monster::getGuildRaid($guildData['dungeon'] - 100) as $monster) {
3310
3311 if($i == count(Monster::getGuildRaid($guildData['dungeon'] - 100)) - 1)
3312 $monster->raidbuff2(true); // monster is boss
3313 else
3314 $monster->raidbuff2(false);
3315
3316 $opponentObjects[] = $monster;
3317
3318 $i++;
3319 }
3320 }
3321
3322 }else{
3323 //get other guild members here
3324 //$opponents = $db->query("SELECT players.*, guilds.portal AS guild_portal, guilds.honor as ghonor FROM players LEFT JOIN guilds ON players.guild = guilds.ID WHERE players.guild = $fight[guildDefender] ORDER BY lvl ASC")->fetchAll(PDO::FETCH_ASSOC);
3325 $opponents = $db->query("SELECT players.*, guilds.portal AS guild_portal, guilds.honor as ghonor FROM players LEFT JOIN guilds ON players.guild = guilds.ID WHERE players.guild = $fight[guildDefender] AND players.guild_fight = 2 ORDER BY lvl ASC")->fetchAll(PDO::FETCH_ASSOC);
3326 $opponentObjects = [];
3327 $items = $db->query("SELECT players.ID as pid, items.* FROM items LEFT JOIN players ON items.owner = players.ID WHERE players.guild = $fight[guildDefender] AND items.slot BETWEEN 10 AND 19");
3328 $items = $items->fetchAll(PDO::FETCH_GROUP);
3329 foreach($opponents as $opponent){
3330 //$items_p = $items[$opponent['ID']] ?? [];
3331 $items_p = (isset($items[$opponent['ID']])) ? $items[$opponent['ID']] : [];
3332 @$opponentObjects[] = new Player($opponent, $items_p);
3333 }
3334 }
3335
3336
3337 //simulate fight
3338 $simulation = new GroupSimulation($playerObjects, $opponentObjects);
3339 $simulation->simulate();
3340
3341 //output logs
3342 for($i = 0; $i < count($simulation->simulations); $i++){
3343 $fightn = $i+1;
3344 $fightLog[] = "fightheader".$fightn.".fighters:3/0/0/1/1/".$simulation->fightHeaders[$i];
3345 $fightLog[] = "fight".$fightn.".r:".$simulation->simulations[$i]->fightLog;
3346 $fightLog[] = "winnerid".$fightn.".s:".$simulation->simulations[$i]->winnerID;
3347 }
3348 $fightLog[] = 'fightadditionalplayers.r:'.$simulation->getAdditionals();
3349
3350
3351 if($fight['guildDefender'] == 1000000){
3352 //insert raid chat logs
3353 $guildData['dungeon']++;
3354 if($simulation->win)
3355 $chatTime = Chat::chatInsert("#rplus#$guildData[dungeon]#", $playerGuild, 0);
3356 else
3357 $chatTime = Chat::chatInsert("#rminus#$guildData[dungeon]#", $playerGuild, 0);
3358 }else{
3359 //count out honor
3360
3361 //max honor diff = 2k
3362 //formula: 100 + (opponent.honor - player.honor) / (max honor diff / (max diff / 100))
3363 $attHonor = $guildData['honor'];
3364 $defHonor = $opponents[0]['ghonor'];
3365
3366 if(abs($diff = $defHonor - $attHonor) < 2000)
3367 $honor = 100 + round($diff / 20);
3368 else
3369 $honor = 0;
3370
3371 //update guilds honor
3372 if($simulation->win)
3373 {
3374 if($honor > $defHonor)
3375 $honor = $defHonor; // No farming on enemy guild pls
3376
3377 $db->exec("UPDATE guilds SET honor = honor + $honor WHERE ID = $fight[guildAttacker]; UPDATE guilds SET honor = GREATEST(0, honor - $honor) WHERE ID = $fight[guildDefender]");
3378 }
3379 else
3380 {
3381 if($honor > $attHonor)
3382 $honor = $attHonor; // No farming on enemy guild pls
3383
3384 $db->exec("UPDATE guilds SET honor = honor + $honor WHERE ID = $fight[guildDefender]; UPDATE guilds SET honor = GREATEST(0, honor - $honor) WHERE ID = $fight[guildAttacker]");
3385 }
3386
3387
3388 //need names
3389 // $attName = $players[0]['gname'];
3390 // $defName = $opponents[0]['gname'];
3391 $attName = $fight['attacker'];
3392 $defName = $fight['defender'];
3393
3394
3395 //fight logs, both guilds
3396 if($simulation->win){
3397 $chatTimeAtt = Chat::chatInsert("#aplus#$defName#$honor#", $fight['guildAttacker'], 0);
3398 $chatTimeDef = Chat::chatInsert("#dminus#$attName#$honor#", $fight['guildDefender'], 0);
3399 }else{
3400 $chatTimeAtt = Chat::chatInsert("#aminus#$defName#$honor#", $fight['guildAttacker'], 0);
3401 $chatTimeDef = Chat::chatInsert("#dplus#$attName#$honor#", $fight['guildDefender'], 0);
3402 }
3403
3404 }
3405
3406 //battlereward
3407 $battleReward = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
3408
3409 // endLog
3410 $endLog = "";
3411
3412 // Raid or normal
3413 if($fight['guildDefender'] == 1000000)
3414 {
3415 $endLog = "0";
3416
3417 if($simulation->win)
3418 {
3419 $endLog .= "/1";
3420 $battleReward[0] = 1;
3421 //add reward for dungeon
3422 $db->exec("UPDATE guilds SET dungeon = dungeon + 1 WHERE ID = $fight[guildAttacker]");
3423 }
3424 else
3425 $endLog .= "/0";
3426
3427 $endLog .= "/" . $guildData['dungeon'];
3428
3429 if($simulation->win) { // Guild raid xp by Greg
3430 $exp = Guild::getGuildBattleExp(0, $guildData['dungeon']);
3431 $endLog = $endLog . "/" . $exp;
3432 $battleReward[3] = $exp;
3433
3434 // Add exp to all guild members who fighted
3435 foreach($guild->players as $gplayer) {
3436 if($gplayer['guild_fight'] == 1) { // Player fighted
3437 if($gplayer['ID'] == $playerID) { // Player is $acc
3438 $acc->addExp($exp);
3439 $db->exec("UPDATE players SET exp = '".$acc->data['exp']."', lvl = '".$acc->data['lvl']."' WHERE ID = ".$acc->data['ID']);
3440 }else{ // Other player
3441 $player = $db->query("SELECT * FROM players WHERE ID = ".$gplayer['ID']); // Select all to create new Account
3442 $player = $player->fetch(PDO::FETCH_ASSOC);
3443
3444 $pl = new Account($player, null, false, false);
3445
3446 $pl->addExp($exp);
3447
3448 $db->exec("UPDATE players SET exp = '".$pl->data['exp']."', lvl = '".$pl->data['lvl']."' WHERE ID = ".$pl->data['ID']);
3449
3450 }
3451 }
3452 }
3453
3454 }
3455
3456 }
3457 else
3458 {
3459 $endLog = "1";
3460
3461 if($simulation->win)
3462 $winner = $fight['guildAttacker'];
3463 else
3464 $winner = $fight['guildDefender'];
3465
3466 $endLog .= "/" . $winner . "/" . $honor;
3467
3468 if($playerGuild == $winner)
3469 {
3470 $battleReward[0] = 1;
3471 $battleReward[6] = $honor;
3472 }
3473 }
3474
3475 $endBattleData = 'fightresult.battlereward:'.join('/', $battleReward);
3476
3477 $fightLog = join('&', $fightLog);
3478 //save logs to db
3479 $db->exec("INSERT INTO guildfightlogs(guildAttacker, guildDefender, log, endLog, time) VALUES($fight[guildAttacker], $fight[guildDefender], '$fightLog', '$endLog', $fight[time])");
3480
3481 //UPDATE player guild_fight of both guilds | this now is temporary
3482 $db->exec("UPDATE players SET guild_fight = 0 WHERE guild = $fight[guildAttacker] OR guild = $fight[guildDefender]");
3483 }
3484
3485 if($args[0] == 1)
3486 {
3487 $ret[] = $fightLog;
3488 $ret[] = $endBattleData;
3489 }
3490
3491 }else if($args[0] == 1){
3492 //else if fight already simulated and player wants to see the fight, pull the logs ***** AND time > 0
3493 $log = $db->query("SELECT log, endLog FROM guildfightlogs WHERE (guildAttacker = $playerGuild OR guildDefender = $playerGuild) ORDER BY time DESC LIMIT 1");
3494 $fetch = $log->fetch(PDO::FETCH_ASSOC);
3495 $ret[] = $fetch['log'];
3496
3497 // Get battlereward by Greg
3498
3499 //battlereward
3500 $battleReward = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
3501
3502 $endLog = explode("/", $fetch["endLog"]);
3503
3504 if($endLog[0] == "0" && $endLog[1] == "1")
3505 $battleReward[0] = 1;
3506 else if($endLog[0] == "1" && $playerGuild == $endLog[1])
3507 {
3508 $battleReward[0] = 1;
3509 $battleReward[6] = $endLog[2];
3510 }
3511
3512 $battleReward[3] = isset($endLog[3]) ? $endLog[3] : 0;
3513
3514 $ret[] = 'fightresult.battlereward:'.join('/', $battleReward);
3515 }
3516
3517
3518 //update player trigger count
3519 $acc->data['event_trigger_count'] = $guildData['event_trigger_count'];
3520 $db->exec("UPDATE players SET event_trigger_count = $guildData[event_trigger_count] WHERE ID = $playerID");
3521
3522
3523 $ret[] = 'Success:';
3524 $ret[] = "combatloglist.s:".$acc->getCombatLog(); // Update logs
3525 //$ret[] = '#ownplayersave:509/'.$guildData['event_trigger_count'];
3526 $ret[] = 'owngroupsave.groupSave:'.$guild->getGroupSave();
3527 $ret[] = 'ownplayersave.playerSave:'.$acc->getPlayerSave();
3528
3529
3530 break;
3531 case 'playermessagewhisper':
3532 // Whispering by Greg
3533 // 19:37 Brayght:§ Szia
3534
3535 // Args: 0 = name, 1 = message
3536
3537
3538 if(strlen($args[1]) > 255)
3539 exit("Error:text too long");
3540
3541 $acc = new Account(null, null, false, false);
3542
3543 $args[0] = $acc::formatUser($args[0]);
3544
3545 $msg = $acc->data['name'] . ':' . ($GLOBALS["CURRTIME"]) . ':' . $args[1];
3546
3547 $sql = "SELECT ID, name, whisper, friends, guild FROM players WHERE name='{$args[0]}'";
3548
3549 $qry = $db->query($sql);
3550
3551 if($qry->rowCount() == 0)
3552 exit('Error:player not found');
3553
3554 $fetch = $qry->fetchAll()[0];
3555
3556 if($fetch["guild"] <= 0)
3557 exit("Error:player no guild");
3558
3559 if(Account::isUserIgnored($fetch['friends'], $acc->data["ID"]))
3560 exit("Error:player not found"); // player is ignored
3561
3562 if($fetch['whisper'] == '') {
3563 $whisper = $msg;
3564 }else{
3565 $whisper = $fetch['whisper'] . '/' . $msg;
3566 }
3567
3568 $sql = "UPDATE players SET whisper = :whisper WHERE ID = '{$fetch['ID']}'";
3569
3570 $qry = $db->prepare($sql);
3571
3572 $qry->bindParam(":whisper", $whisper);
3573
3574 $qry->execute();
3575
3576 //$db->exec($sql);
3577
3578 $ret[] = "Success:";
3579 break;
3580 case 'playercombatlogmark':
3581 // I don't need this
3582 $ret[] = 'Success:';
3583 break;
3584 case 'playerlastfightstore': // Removed
3585 $ret[] = 'Success:';
3586 break;
3587 case 'playercombatlogview':
3588 // View log by Greg
3589
3590 $type = intval(substr($args[0], 0, 1));
3591
3592 $id = intval(substr($args[0], 1));
3593
3594 switch($type){
3595 case 2:
3596 case 3:
3597 $log = $db->query("SELECT log, endLog FROM guildfightlogs WHERE ((guildAttacker = $playerGuild OR guildDefender = $playerGuild) AND ID = $id) ORDER BY time DESC LIMIT 1");
3598
3599 if($log->rowCount() == 0)
3600 exit("not found");
3601
3602 $fetch = $log->fetch(PDO::FETCH_ASSOC);
3603 $ret[] = $fetch['log'];
3604
3605 //battlereward
3606 $battleReward = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
3607
3608 $endLog = explode("/", $fetch["endLog"]);
3609
3610 if($endLog[0] == "0" && $endLog[1] == "1")
3611 $battleReward[0] = 1;
3612 else if($endLog[0] == "1" && $playerGuild == $endLog[1])
3613 {
3614 $battleReward[0] = 1;
3615 $battleReward[6] = $endLog[2];
3616 }
3617
3618 $ret[] = 'fightresult.battlereward:'.join('/', $battleReward);
3619
3620 $ret[] = "Success:";
3621 break;
3622 default:
3623 exit("Error:player not found");
3624 }
3625 break;
3626 case 'playersetdescription':
3627
3628 $qry = $db->prepare("UPDATE players SET description = :description WHERE ID = $playerID");
3629 $qry->bindParam(':description', $args[0]);
3630 $qry->execute();
3631
3632 $ret[] = 'Success:';
3633 break;
3634 case 'poll':
3635 $ret[] = 'Success:';
3636 $time = $GLOBALS["CURRTIME"];
3637 $update = false;
3638
3639
3640 //fortress unit train
3641 if($playerData['ut1'] > 0 || $playerData['ut2'] > 0 || $playerData['ut3'] > 0){
3642 $accUpdate = false;
3643 $qryArgs = [];
3644 for($i = 1; $i <= 3; $i++){
3645 if($playerData["ut$i"] > 0 && ($timeElapsed = $GLOBALS["CURRTIME"] - $playerData["uttime$i"]) > 600){
3646
3647 $accUpdate = true;
3648 $units = floor($timeElapsed / 600);
3649 if($units > $playerData["ut$i"]) {
3650 // Important fix by Greg - no minus soldier training, no more than max soldiers
3651 $units = $playerData["ut$i"];
3652 }
3653 if($units < $playerData["ut$i"])
3654 $newtime = $playerData["uttime$i"] + $units * 600;
3655 else
3656 $newtime = 0;
3657 $qryArgs[] = "ut$i = ut$i - $units, u$i = u$i + $units, uttime$i = $newtime";
3658 }
3659 }
3660
3661 if($accUpdate){
3662 $db->exec("UPDATE fortress SET ".join(',', $qryArgs)." WHERE owner = $playerID");
3663 $acc = new Account();
3664
3665 $ret[] = 'ownplayersave.playerSave:'.$acc->getPlayerSave();
3666 }
3667 }else if($playerPoll < $time - 30){
3668 //check messages with 30 sec intervall, this is incase chat is polling to reduce the load somewhat significantly
3669 $messages = $db->query("SELECT COUNT(*) FROM messages WHERE reciver = $playerID AND messages.time > $playerPoll")->fetch(PDO::FETCH_ASSOC);
3670 $newMessages = $messages['COUNT(*)'];
3671
3672 if($newMessages > 0){
3673 $update = true;
3674
3675 $messages = $db->query("SELECT messages.ID, players.name, messages.hasRead, messages.topic, messages.time
3676 FROM messages LEFT JOIN players ON messages.sender = players.ID WHERE messages.reciver = $playerID ORDER BY time DESC");
3677 $messages = $messages->fetchAll(PDO::FETCH_ASSOC);
3678 // $msgs = [];
3679 // foreach($messages as $msg){
3680 // if(strlen($msg['name']) == 0)
3681 // $msg['name'] = 'admin';
3682 // $msgs[] = join(',', $msg);
3683 // }
3684
3685 $ret[] = 'messagelist.r:'.Chat::formatMessages($messages);
3686 $ret[] = '#ownplayersave.playerSave:434/'.$messages[0]['ID'];
3687
3688 //check if kick from guild message, load playerdata
3689 }
3690 }
3691
3692
3693 //types: 1 - quest, 2 - guild, 3 - raid, 4 - dungeon, 5 - tower, 6 - portal, 7 = gportal, 8 - fortressAtt, 9 - fortressDef, 10 - dark dungeons
3694 //ID,target name, win, type, time, marked
3695 // $ret[] = "combatloglist.s:1234,603,0,1,1456680807,0;1234,Nowakowscy,1,2,1456677448,0;";
3696
3697 //guild chat and guild refreshing
3698 if($playerGuild > 0){
3699 // $chat = $db->query("SELECT players.name, guildchat.message, guildchat.time FROM guildchat LEFT JOIN players ON guildchat.playerID = players.ID
3700 // WHERE guildchat.guildID = $playerGuild AND guildchat.time > $playerPoll ORDER BY guildchat.time DESC LIMIT 5");
3701 $chat = $db->query("SELECT Max(time) as newm, Max(chattime) as chattime FROM guildchat WHERE guildID = $playerGuild")->fetch(PDO::FETCH_ASSOC);
3702
3703 $whisper = $db->query("SELECT whisper FROM players WHERE ID = '$playerID'")->fetchAll()[0]['whisper'];
3704
3705 if($chat['newm'] > $playerPoll || $whisper != ''){
3706 $update = true;
3707 $chattime = $chat['chattime'];
3708 $chat = Chat::getChat($playerGuild);
3709 $ret[] = 'chathistory.s(5):'.Chat::formatChat($chat);
3710 $ret[] = "chattime:$chattime";
3711
3712 // Whispers by Greg
3713 $whisper = Chat::formatWhispers($whisper);
3714 if($whisper != '') {
3715 $ret[] = 'chatwhisper.s:'.$whisper;
3716 $db->exec("UPDATE players SET whisper = '' WHERE ID = '$playerID'");
3717 }
3718
3719 //IF system message, poll guild dataww
3720 if(Chat::containsSystemMessage($chat) || $playerPoll < $time - 10){
3721 $guild = new Guild($playerGuild);
3722 $ret[] = 'owngroupsave.groupSave:'.$guild->getGroupSave();
3723 $ret[] = "owngrouppotion.r:".$guild->getPotionData();
3724 $ret[] = "owngroupname.r:".$guild->data['name'];
3725 //$ret[] = "owngroupdescription.s:".$guild->data['descr']; // TODO DESCR
3726 $ret[] = "owngroupmember.r:".$guild->getMemberList();
3727 $ret[] = "owngrouprank:".$guild->getRank();
3728 if(($oga = $guild->getOtherGroupAttack()) !== false)
3729 $ret[] = $oga;
3730 }
3731
3732 //pull all shit above and bellow, namelist, potionlist, etc...
3733 }else if($playerPoll < $time - 30){
3734 //check time and load guild here every 60 sec or something?
3735 $update = true;
3736 $guild = new Guild($playerGuild);
3737 $ret[] = 'owngroupsave.groupSave:'.$guild->getGroupSave();
3738 $ret[] = "owngrouppotion.r:".$guild->getPotionData();
3739 $ret[] = "owngroupname.r:".$guild->data['name'];
3740 //$ret[] = "owngroupdescription.s:".$guild->data['descr']; // TODO DESCR
3741 $ret[] = "owngroupmember.r:".$guild->getMemberList();
3742 $ret[] = "owngrouprank:".$guild->getRank();
3743 if(($oga = $guild->getOwnGroupAttack()) !== false)
3744 $ret[] = $oga;
3745 }
3746 }
3747
3748
3749
3750
3751 //LIMIT THIS, CHECK IF 1 MIN GONE BY, chat will rek dis
3752 //update variable is true if player has recieved a message or read chat, without it shit will keep pulling
3753 if($update || $playerPoll < $time - 90)
3754 $db->exec("UPDATE players SET poll = $time WHERE ID = $playerID");
3755
3756
3757 break;
3758
3759 case 'groupsetdescription' :
3760 // By Greg
3761 // args 0 is description
3762
3763
3764 $qry = $db->prepare("SELECT guild_rank FROM players WHERE ID = '$playerID'");
3765 $qry->execute();
3766 $gr = $qry->fetch(PDO::FETCH_ASSOC)['guild_rank'];
3767
3768 if($gr != 1) {
3769 exit('Error:');
3770 }
3771
3772 $db->exec("UPDATE guilds SET descr = '{$args[0]}' WHERE ID = '$playerGuild'");
3773
3774 $ret[] = "Success:";
3775 break;
3776
3777 case "playergamblegold" :
3778 // By Greg
3779 // args 0 is how much the player would gamble
3780
3781 if(rand(1, 3) == 3) {
3782 $gamble = $args[0];
3783 }else{
3784 $gamble = $args[0] * -1;
3785 }
3786
3787 $qry = $db->prepare("SELECT silver FROM players WHERE ssid = :ssid");
3788 $qry->bindParam(':ssid', $ssid);
3789 $qry->execute();
3790 $prpa = $qry->fetch(PDO::FETCH_ASSOC);
3791
3792 $prpa['silver'] = $prpa['silver'] + $gamble;
3793
3794 if($prpa['silver'] < 0) {
3795 $prpa['silver'] = 0;
3796 }
3797
3798 $db->exec("UPDATE players SET silver = '".$prpa['silver']."' WHERE ID = $playerID");
3799
3800 $acc = new Account(null, null, false, false);
3801
3802 $ret[] = "Success:";
3803 $ret[] = "gamblegoldvalue:".$gamble;
3804 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
3805 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
3806 break;
3807 case "playergamblecoins" :
3808 // By Greg
3809 // args 0 is how much the player would gamble
3810
3811 if(rand(1, 3) == 3) {
3812 $gamble = $args[0];
3813 }else{
3814 $gamble = $args[0] * -1;
3815 }
3816
3817 $qry = $db->prepare("SELECT mush FROM players WHERE ssid = :ssid");
3818 $qry->bindParam(':ssid', $ssid);
3819 $qry->execute();
3820 $prpa = $qry->fetch(PDO::FETCH_ASSOC);
3821
3822 $prpa['mush'] = $prpa['mush'] + $gamble;
3823
3824 if($prpa['mush'] < 0) {
3825 $prpa['mush'] = 0;
3826 }
3827
3828 $db->exec("UPDATE players SET mush = '".$prpa['mush']."' WHERE ID = $playerID");
3829
3830 $acc = new Account(null, null, false, false);
3831
3832 $ret[] = "Success:";
3833 $ret[] = "gamblecoinsvalue:".$gamble;
3834 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
3835 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
3836 break;
3837 case "playergoldframebuy" :
3838 // By Greg
3839 $qry = $db->prepare("SELECT mush, gframe FROM players WHERE ID = '$playerID'");
3840 $qry->bindParam(':ssid', $ssid);
3841 $qry->execute();
3842 $prpa = $qry->fetch(PDO::FETCH_ASSOC);
3843 if($prpa['gframe'] == 1) {
3844 exit('Error:');
3845 }
3846
3847 $prpa['mush'] -= 1000;
3848 if($prpa['mush'] < 0) {
3849 exit('Error:need more coins');
3850 }
3851
3852 $db->exec("UPDATE players SET gframe = '1', mush = '{$prpa['mush']}' WHERE ID = $playerID");
3853
3854 $acc = new Account(null, null, false, false);
3855
3856 $ret[] = "Success:";
3857 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
3858 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
3859 break;
3860 case "petsgetstats" :
3861 // Pet stats by Greg
3862
3863 $pet = intval($args[0]);
3864
3865 $pD = new Pets();
3866
3867 $pS = $pD->getPetStats($pet);
3868
3869 if($pS[0] < 1)
3870 exit("Success:"); // Don't have pet wtf, kys tryhard hacker
3871
3872 $ret[] = "ownpetsstats.petsStats:$pet/$pS[0]/50/$pS[2]/" . implode("/", $pS[3]) . "/0/0/0/0/0/4/4/0/";
3873 $ret[] = "Success:";
3874 break;
3875 case "petsdungeonfight" :
3876 // Dungeon fight of pets by Greg
3877 $acc = new Account(null, null, false, false); // New acc
3878
3879 $place = $args[1]; // Place
3880 $mypet = $args[3]; // Fighting pet
3881
3882 if($acc->data['dungeon_time'] > $GLOBALS["CURRTIME"]){ //if time not up
3883 if($acc->data['mush'] <= 0)
3884 exit("Error:need more coins");
3885 $acc->data['mush']--;
3886 $acc->data['dungeon_time'] = 0;
3887 $db->exec("UPDATE players SET mush = mush - 1, dungeon_time = 0 WHERE ID = ".$acc->data['ID']);
3888 }else{
3889 $acc->data['dungeon_time'] = $GLOBALS["CURRTIME"] + 3600;
3890 $db->exec("UPDATE players SET dungeon_time = '{$acc->data['dungeon_time']}' WHERE ID = ".$acc->data['ID']);
3891 }
3892
3893 $freeSlot = $acc->getFreeBackpackSlot();
3894 if($freeSlot === false) {
3895 exit("Error:need a free slot");
3896 }
3897
3898 $pD = new Pets($acc->data["pets"], $acc->data["petsFed"], $acc->data["petsDung"], $acc->data["petsPvP"], $acc->data["petsBest2"], null, $acc->data["blacksmith"], $acc->data["pethonor"]);
3899
3900 $enemyLvl = 1 + ($pD->dungData[$place - 1] * 2);
3901
3902 $enemyId = ($place - 1) * 20 + $pD->dungData[$place - 1] + 1;
3903
3904 $me = $pD->getPetStats($mypet);
3905 if($me[0] == 0)
3906 exit("Error:");
3907
3908 $enemy = $pD->getPetStats($enemyId, $enemyLvl);
3909
3910 $meM = $pD->petToMonster($me);
3911 $meM->convertToMyPet();
3912
3913 $enemyM = $pD->petToMonster($enemy);
3914
3915 $ret[] = "fightheader.fighters:13/0/0/49/2/".$meM->getFightHeader().$enemyM->getFightHeader();
3916
3917 $simulation = new Simulation($meM, $enemyM);
3918 $simulation->simulate();
3919
3920
3921 $ret[] = "fight.r:". $simulation->fightLog;
3922 $ret[] = "winnerid:". $simulation->winnerID;
3923
3924 $rewardLog = [];
3925 for($i = 0; $i < 21; $i++)
3926 $rewardLog[] = 0;
3927
3928 $win = $simulation->winnerID == 100000;
3929
3930 // rewarding
3931 if($win)
3932 {
3933 // win true
3934 $rewardLog[0] = 1;
3935
3936 // Give item
3937 $it['type'] = 16;
3938 $it['item_id'] = 30 + $place;
3939 $it['dmg_max'] = 0;
3940 $it['dmg_min'] = 0;
3941 $it['a1'] = 0;
3942 $it['a2'] = 0;
3943 $it['a3'] = 0;
3944 $it['a4'] = 0;
3945 $it['a5'] = 0;
3946 $it['a6'] = 0;
3947 $it['value_silver'] = 1;
3948 $it['value_mush'] = 0;
3949
3950 $rewardLog[9] = $it['type'];
3951 $rewardLog[10] = $it['item_id'];
3952 $GLOBALS['acc']->insertItem($it, $GLOBALS['freeSlot']);
3953
3954 // +1 pet dung lvl
3955 $pD->dungData[$place - 1]++;
3956 $db->exec("UPDATE players SET petsDung = '" . implode("/", $pD->dungData) . "' WHERE ssid = '$ssid'");
3957 }
3958
3959 $ret[] = "fightresult.battlereward:".join("/", $rewardLog)."/";
3960 $ret[] = "Success:";
3961 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
3962 $ret[] = "ownpets.petsSave:" . $pD->getPetsSave();
3963 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
3964 break;
3965 case "petspvpfight" :
3966 $now = Misc::getNow();
3967
3968 $acc = new Account(null, null, false, false); // New acc
3969
3970 $freeSlot = $acc->getFreeBackpackSlot();
3971 if($freeSlot === false) {
3972 exit("Error:need a free slot");
3973 }
3974
3975 $pclass = intval($args[2]) - 1; // Attack enemy with which pet class
3976
3977 if($pclass < 0 || $pclass > 4)
3978 exit();
3979
3980 $myPets = [];
3981 $enemyPets = [];
3982
3983 // My Pet class
3984 $pD = new Pets($acc->data["pets"], $acc->data["petsFed"], $acc->data["petsDung"], $acc->data["petsPvP"], $acc->data["petsBest2"], null, $acc->data["blacksmith"], $acc->data["pethonor"]);
3985
3986 if ($pD->pvpData[1][$pclass] == $now)
3987 exit();
3988
3989 for($i = ($pclass * 20); $i < ($pclass * 20 + 20); $i++)
3990 {
3991 $stats = $pD->getPetStats($i + 1);
3992
3993 if($stats[0] == 0)
3994 continue;
3995
3996 $temp = $pD->petToMonster($stats);
3997 $temp->convertToMyPet();
3998
3999 $myPets[] = $temp;
4000 }
4001
4002 usort($myPets, function($a, $b) {
4003 return $a->lvl - $b->lvl;
4004 });
4005
4006 // Enemy Pet class
4007 $epD = new Pets(null, null, null, null, $pD->pvpData[0][3], $pD->pvpData[0][0]);
4008
4009 for($i = (($pD->pvpData[0][1] - 1) * 20); $i < (($pD->pvpData[0][1] - 1) * 20 + 20); $i++)
4010 {
4011 $stats = $epD->getPetStats($i + 1);
4012
4013 if($stats[0] == 0)
4014 continue;
4015
4016 $enemyPets[] = $epD->petToMonster($stats);
4017 }
4018
4019 usort($enemyPets, function($a, $b) {
4020 return $a->lvl - $b->lvl;
4021 });
4022
4023 //simulate fight
4024 $simulation = new GroupSimulation($myPets, $enemyPets);
4025 $simulation->simulate();
4026
4027 //output logs
4028 for($i = 0; $i < count($simulation->simulations); $i++)
4029 {
4030 $fightn = $i+1;
4031 $fightLog[] = "fightheader".$fightn.".fighters:14/0/0/0/1/".$simulation->fightHeaders[$i];
4032 $fightLog[] = "fight".$fightn.".r:".$simulation->simulations[$i]->fightLog;
4033 $fightLog[] = "winnerid".$fightn.".s:".$simulation->simulations[$i]->winnerID;
4034 }
4035
4036 $fightLog[] = 'fightadditionalplayers.r:'.$simulation->getAdditionals();
4037
4038 $enemyFetch = $db->query("SELECT name, pethonor FROM players WHERE ID = " . $pD->pvpData[0][0])->fetchAll()[0];
4039
4040 $enemyName = $enemyFetch["name"];
4041
4042 $enemyHonor = $enemyFetch["pethonor"];
4043
4044 $fightLog[] = 'fightgroups.r:100000,100001,' . $acc->data["name"] . ',' . $enemyName;
4045
4046 $battleReward = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
4047
4048 // Calculate honor
4049 if($enemyHonor > $acc->data['pethonor'])
4050 $honor = min(200, 100 + round(($enemyHonor - $acc->data['pethonor']) / 20));
4051 else
4052 $honor = max(0, 100 + round(($enemyHonor - $acc->data['pethonor']) / 20));
4053
4054 if($simulation->win)
4055 {
4056 $battleReward[0] = 1;
4057
4058 // Give item
4059 $it['type'] = 16;
4060 $it['item_id'] = 30 + $args[2];
4061 $it['dmg_max'] = 0;
4062 $it['dmg_min'] = 0;
4063 $it['a1'] = 0;
4064 $it['a2'] = 0;
4065 $it['a3'] = 0;
4066 $it['a4'] = 0;
4067 $it['a5'] = 0;
4068 $it['a6'] = 0;
4069 $it['value_silver'] = 1;
4070 $it['value_mush'] = 0;
4071
4072 $battleReward[9] = $it['type'];
4073 $battleReward[10] = $it['item_id'];
4074 $acc->insertItem($it, $GLOBALS['freeSlot']);
4075
4076 $battleReward[5] = $honor;
4077
4078 $acc->data["pethonor"] += $honor;
4079
4080 $enemyQuery = "pethonor = GREATEST(0, pethonor - $honor)";
4081 }
4082 else
4083 {
4084 $honor = 200 - $honor;
4085
4086 $battleReward[5] = -1 * $honor;
4087
4088 $acc->data["pethonor"] -= $honor;
4089
4090 $enemyQuery = "pethonor = pethonor + $honor";
4091 }
4092
4093 $pD->honor = $acc->data["pethonor"];
4094
4095 $db->exec("UPDATE players SET $enemyQuery WHERE ID = ".$pD->pvpData[0][0]);
4096
4097 $pD->pvpData[1][$pclass] = $now;
4098
4099 $petsPvP = json_encode($pD->pvpData);
4100
4101 $qry = $db->prepare("UPDATE players SET petsPvp = :pvp, pethonor = :honor WHERE ID = $playerID");
4102 $qry->bindParam(":pvp", $petsPvP);
4103 $qry->bindParam(":honor", $acc->data["pethonor"]);
4104 $qry->execute();
4105
4106 $pD->newPvPEnemy(); // Get a new enemy
4107
4108 $ret[] = "Success:";
4109 $ret[] = implode("&", $fightLog);
4110 $ret[] = 'fightresult.battlereward:'.join('/', $battleReward);
4111 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
4112 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
4113 $ret[] = "ownpets.petsSave:".$pD->getPetsSave();
4114 $ret[] = "petsdefensetype:" . $pD->pvpData[0][1];
4115 break;
4116 case 'playerfriendset' :
4117 // Set player friend status by Greg - v2
4118 // Args: 0 = ID, 1 = Status
4119
4120 $id = intval($args[0]);
4121 $status = intval($args[1]);
4122
4123 $acc = new Account(null, null, false, false); // New acc
4124
4125 if($id == $acc->data["ID"])
4126 exit(); // WTF LEL
4127
4128 $acc->setFriendStatus($id, $status);
4129
4130 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
4131 $ret[] = "friendlist.r:".$acc->friendList();
4132 $ret[] = "Success:";
4133 break;
4134 case 'petsgethalloffame' :
4135 if(strlen($args[1]) > 2){
4136
4137 $args[1] = Account::formatUser($args[1]);
4138
4139 $qry = $db->prepare('SELECT ID, pethonor FROM players WHERE name = :name');
4140 $qry->bindParam(':name', $args[1]);
4141 $qry->execute();
4142
4143 if($qry->rowCount() == 0)
4144 exit('Error:player not found');
4145
4146 $p = $qry->fetch(PDO::FETCH_ASSOC);
4147
4148 $qry = $db->query('SELECT Count(*) AS rank FROM players WHERE pethonor > '.$p['pethonor'].' OR (pethonor = '.$p['pethonor'].' AND ID > '.$p['ID'].')');
4149
4150 $args[0] = $qry->fetch(PDO::FETCH_ASSOC)['rank'];
4151 }
4152
4153 $args[0] -= $args[2] + 1;
4154 if($args[0] < 0)
4155 $args[0] = 0;
4156
4157
4158 $qry = $db->prepare("SELECT players.name, guilds.name AS gname, players.petsDung, players.pethonor FROM players FORCE INDEX(pethonor) LEFT JOIN guilds ON players.guild = guilds.ID
4159 WHERE players.pethonor >= 0 ORDER BY players.pethonor DESC, players.ID DESC LIMIT {$args[0]}, 30");
4160 $qry->execute();
4161
4162 $players = $qry->fetchAll( PDO::FETCH_ASSOC );
4163
4164 $list = [];
4165 for($i = 0; $i < count($players); $i++) {
4166 //$players[$i]["petsDung"] = explode("/", $players[$i]["petsDung"])[5] ?? 0;
4167
4168 if($players[$i]["petsDung"] != null)
4169 {
4170 $petsDung = explode("/", $players[$i]["petsDung"])[5];
4171
4172 }else{
4173 $petsDung = 0;
4174 }
4175
4176 $players[$i]["petsDung"] = $petsDung;
4177
4178 $rank = $args[0] + $i + 1;
4179 $list[] = $rank.','.join(',', $players[$i]).",0";
4180
4181 }
4182
4183 //rank, name, gname, lvl, honor
4184 $ret[] = "RanklistPets.r:".join(';', $list);
4185 $ret[] = "Success:";
4186 break;
4187 case 'fortressgethalloffame' :
4188 // Another useless..........
4189 /*
4190 $sql = "SELECT * FROM players WHERE ssid = '$ssid'";
4191 $qry = $db->query($sql);
4192 $name = $qry->fetch(PDO::FETCH_ASSOC)["name"];
4193 */
4194
4195 if(strlen($args[1]) > 2){
4196
4197 $args[1] = Account::formatUser($args[1]);
4198 $owner = Account::getAccountID($args[1]);
4199
4200 $qry = $db->prepare('SELECT ID, forthonor FROM fortress WHERE owner = :owner');
4201 $qry->bindParam(':owner', $owner);
4202 $qry->execute();
4203
4204 if($qry->rowCount() == 0)
4205 exit('Error:player not found');
4206
4207 $p = $qry->fetch(PDO::FETCH_ASSOC);
4208
4209 $qry = $db->query('SELECT Count(*) AS rank FROM fortress WHERE forthonor > '.$p['forthonor'].' OR (forthonor = '.$p['forthonor'].' AND ID > '.$p['fortressID'].')');
4210
4211 $args[0] = $qry->fetch(PDO::FETCH_ASSOC)['rank'];
4212 }
4213
4214 $args[0] -= $args[2] + 1;
4215 if($args[0] < 0)
4216 $args[0] = 0;
4217
4218 $upgraded = "fortress.b0 * 10 + fortress.b1 + fortress.b2 + fortress.b3 + fortress.b4 + fortress.b5 + fortress.b6
4219 + fortress.b7 + fortress.b8 + fortress.b9 + fortress.b10 + fortress.b11";
4220
4221 $qry = $db->prepare("SELECT players.name, guilds.name AS gname, {$upgraded} AS upgraded, fortress.forthonor AS forthonor FROM players FORCE INDEX(forthonor) LEFT JOIN guilds ON players.guild = guilds.ID
4222 LEFT JOIN fortress ON players.ID = fortress.owner WHERE fortress.forthonor >= 0 ORDER BY fortress.forthonor DESC, players.ID DESC LIMIT {$args[0]}, 30");
4223 $qry->execute();
4224
4225 $players = $qry->fetchAll( PDO::FETCH_ASSOC );
4226
4227 $list = [];
4228 for($i = 0; $i < count($players); $i++) {
4229
4230 if($players[$i]["upgraded"] > 0)
4231 {
4232 $rank = $args[0] + $i + 1;
4233 $list[] = $rank.','.join(',', $players[$i]).",0";
4234 }
4235 }
4236
4237 //rank, name, gname, upgraded, honor
4238 $ret[] = "Ranklistfortress.r:".join(';', $list);
4239 $ret[] = "Success:";
4240
4241 //$ret[] = "Ranklistfortress.r:1591,kreszko1,,218,1417,0;1592,gergc33,Fairy Tail,250,1417,0;1593,Rara,Fáraók Céhe,238,1417,0;1594,Disturbed,,249,1416,0;1595,Drub,,248,1415,0;1596,Vasznpszvotsz,,228,1413,0;1597,Essneki,,266,1413,0;1598,stark2015,EmErGiNgS,226,1413,0;1599,Lazuman,,244,1413,0;1600,Piskota,,226,1413,0;1601,Harcicickány,,254,1412,0;1602,DeepDildoHentaiMonster,Magyar Betyár Sereg,209,1412,0;1603,oldtibi,Kitaszítottak,290,1412,0;1604,EthanW,rablok céh,257,1412,0;1605,AkcioooK,,258,1412,0;1606," . $name . ",NOT WORKING,285,1412,0;1607,adrianbuzi,SCBP,210,1411,0;1608,ladymoon,Shadow Sword,249,1411,0;1609,benedek11,,240,1411,0;1610,Szaura,,249,1410,0;1611,kompusz123,,231,1410,0;1612,Tóbi,We are the best,267,1410,0;1613,laczkovics123,,249,1410,0;1614,Sir Andreas,,258,1410,0;1615,Mazs,Kekuravtyemuj,211,1409,0;1616,A20,awful,227,1409,0;1617,Khyra,,238,1409,0;1618,Lanselot,,239,1408,0;1619,Bridget01,Angyalok És Ördögök,253,1407,0;1620,IKIHUN,,229,1407,0;1621,varázslatos márkócska,EmErGiNgS,223,1407,0;&Success:";
4242 break;
4243 case 'underworldgethalloffame':
4244 if(strlen($args[1]) > 2){
4245
4246 $args[1] = Account::formatUser($args[1]);
4247 $owner = Account::getAccountID($args[1]);
4248
4249 $qry = $db->prepare('SELECT ID, uwhonor FROM underworld WHERE owner = :owner');
4250 $qry->bindParam(':owner', $owner);
4251 $qry->execute();
4252
4253 if($qry->rowCount() == 0)
4254 exit('Error:player not found');
4255
4256 $p = $qry->fetch(PDO::FETCH_ASSOC);
4257
4258 $qry = $db->query('SELECT Count(*) AS rank FROM underworld WHERE uwhonor > '.$p['uwhonor'].' OR (uwhonor = '.$p['uwhonor'].' AND ID > '.$p['ID'].')');
4259
4260 $args[0] = $qry->fetch(PDO::FETCH_ASSOC)['rank'];
4261 }
4262
4263 $args[0] -= $args[2] + 1;
4264 if($args[0] < 0)
4265 $args[0] = 0;
4266
4267 $qry = $db->prepare("SELECT players.name, guilds.name AS gname, underworld.heart AS lvl, underworld.uwhonor AS honor FROM players FORCE INDEX(honor) LEFT JOIN guilds ON players.guild = guilds.ID
4268 LEFT JOIN underworld ON players.ID = underworld.owner WHERE underworld.uwhonor >= 0 ORDER BY underworld.uwhonor DESC, players.ID DESC LIMIT {$args[0]}, 30");
4269 $qry->execute();
4270
4271 $players = $qry->fetchAll( PDO::FETCH_ASSOC );
4272
4273 $list = [];
4274 for($i = 0; $i < count($players); $i++) {
4275
4276 if($players[$i]["lvl"] > 0)
4277 {
4278 $rank = $args[0] + $i + 1;
4279 $list[] = $rank.','.join(',', $players[$i]).",0";
4280 }
4281 }
4282
4283 //rank, name, gname, upgraded, honor
4284 $ret[] = "ranklistunderworld.r:".join(';', $list);
4285 $ret[] = "Success:";
4286 break;
4287 case "playersetnogroupinvite":
4288 // No group invite by Greg
4289
4290 $val = $args[0] == 1 ? 1 : 0;
4291
4292 $db->exec("UPDATE players SET noinv = $val WHERE ID = $playerID");
4293
4294 $acc = new Account(null, null, false, false); // New acc
4295
4296
4297
4298 $ret[] = "Success:";
4299 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
4300
4301 break;
4302 case 'groupmessagesendaround':
4303 // Guild mail by Greg
4304
4305 $subject = $args[0];
4306 $body = $args[1];
4307
4308 $time = $GLOBALS["CURRTIME"];
4309
4310 $qry = $db->query("SELECT ID FROM players WHERE guild = $playerGuild");
4311
4312 foreach($qry->fetchAll() as $row){
4313 $reciver = $row['ID'];
4314
4315 $qry = $db->prepare("INSERT INTO messages(sender, reciver, time, topic, message) VALUES($playerID, $reciver, $time, :topic, :message)");
4316 $qry->bindParam(':topic', $subject);
4317 $qry->bindParam(':message', $body);
4318 $qry->execute();
4319 }
4320
4321 exit("Success:");
4322
4323 break;
4324 default:
4325
4326 if($sandbox)
4327 {
4328 var_dump($act);
4329 var_dump($args);
4330 $ret[] = "";
4331 $ret[] = "Error: not implemented";
4332 }
4333 else
4334 $ret[] = "Success:";
4335
4336
4337 break;
4338 case 'playertoilettopenwithkey':
4339 break;
4340 case 'underworldbuildstart': // Underworld building by Greg
4341
4342 $acc = new Account(null, null, true, false); // New acc
4343
4344 $uw = new Underworld($acc->data["ID"]);
4345
4346 $b = $uw->getBuilding($args[0]);
4347
4348 $silvercost = $uw->getBuildingPrice($args[0], $uw->data[$b] + 1);
4349
4350 if($acc->data['silver'] >= $silvercost[0]) {
4351 $acc->data['silver'] -= $silvercost[0];
4352 $db->exec("UPDATE players SET silver = ".$acc->data['silver']." WHERE ID = ".$acc->data['ID']);
4353 } else {
4354 exit('Error:need more gold');
4355 }
4356
4357 $uw->startBuilding($args[0]);
4358
4359 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
4360 $ret[] = "Success:";
4361 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
4362 $ret[] = "owntower.towerSave:".$acc->getTowerSave();
4363 $ret[] = "underworldprice.underworldPrice(10):".$uw->getUpgradePrice();
4364 $ret[] = "underworldupgradeprice.underworldupgradePrice(3):".$uw->getUnitUpgradePrice();
4365 $ret[] = "underworldmaxsouls:".$uw->getMaxSouls();
4366
4367 break;
4368 case 'underworldbuildfinished':
4369 // Update v2
4370
4371 $acc = new Account(null, null, true, false); // New acc
4372 $uw = new Underworld($acc->data["ID"]);
4373
4374 $id = $uw->data['build_id'];
4375
4376 $b = $uw->getBuilding($id);
4377
4378 $qry = [];
4379
4380 //By Greg
4381 //Stop when not building anything, fixes a click "hack"
4382 if($uw->data["build_id"] == null || $uw->data["build_id"] == 0)
4383 exit();
4384
4385 // Soul Extractor, Gold Mine
4386 // Fix - after building done, current soul/gold 0
4387 if($id == 3 || $id == 4) {
4388 $g = $id - 2;
4389
4390 $uw->data['gather'.$g] = $GLOBALS["CURRTIME"];
4391 $qry[] = "UPDATE underworld SET gather".$g." = ".$GLOBALS["CURRTIME"]." WHERE owner = ".$acc->data['ID'];
4392
4393 if($id == 3)
4394 $uw->newHourlyGold($acc->data["lvl"]);
4395
4396 }
4397
4398 $mushcost = 0;
4399 if($uw->data['build_end'] > $GLOBALS["CURRTIME"])
4400 $mushcost = ceil(($uw->data['build_end'] - $GLOBALS["CURRTIME"]) / 600);
4401
4402 if($mushcost > $acc->data['mush'])
4403 exit("Error:need more coins");
4404
4405 if($mushcost > 0){
4406 $acc->data['mush'] -= $mushcost;
4407 $qry[] = "UPDATE players SET mush = mush - ".$mushcost." WHERE ID = ".$acc->data['ID'];
4408 }
4409
4410 $uw->finishBuilding($args[0]);
4411
4412 // Honor system as fortress
4413 $uw->data['uwhonor'] += 10;
4414 $qry[] = "UPDATE underworld SET uwhonor = ".$uw->data['uwhonor']." WHERE owner = ".$acc->data['ID'];
4415
4416 if(!empty($qry)) {
4417 $db->exec(join(';', $qry));
4418 }
4419
4420 $uw = new Underworld($acc->data["ID"]);
4421
4422 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
4423 $ret[] = "Success:";
4424 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
4425 $ret[] = "owntower.towerSave:".$acc->getTowerSave();
4426 $ret[] = "underworldprice.underworldPrice(10):".$uw->getUpgradePrice();
4427 $ret[] = "underworldupgradeprice.underworldupgradePrice(3):".$uw->getUnitUpgradePrice();
4428 $ret[] = "underworldmaxsouls:".$uw->getMaxSouls();
4429
4430 break;
4431 case 'underworldgather': // By Greg
4432 //1 - Gold ($ret[17])
4433 //2 - Soul Extractor ($ret[12])
4434 //3 - Time ($ret[26])
4435
4436 $acc = new Account(null, null, true, false); // New acc
4437 $uw = new Underworld($acc->data["ID"]);
4438
4439 $qry = [];
4440
4441 $gain = 0;
4442 switch ($args[0]) {
4443 case 1: // Gold
4444 $gain = floor(($GLOBALS["CURRTIME"] - $uw->data["gather1"]) * ($uw->data["claim_gold"] / 3600));
4445
4446 if($gain > floor($uw->data["claim_gold"]) * 10)
4447 $gain = floor($uw->data["claim_gold"]) * 10;
4448
4449 // Add
4450 $acc->data['silver'] += $gain;
4451 $qry[] = "UPDATE players SET silver = ".$acc->data['silver']." WHERE ID = ".$acc->data['ID'];
4452
4453 break;
4454 case 2: // Soul
4455 //$last_gather = max($uw->data["gather1"], $uw->data["gather2"], $uw->data["gather3"]);
4456 //$gain = floor(($last_gather - $uw->data["gather2"]) * ($uw->getSoulExtractorResources($uw->data["extractor"])[0] / 3600) * $soulbonus);
4457 $gain = floor(($GLOBALS["CURRTIME"] - $uw->data["gather2"]) * ($uw->getSoulExtractorResources($uw->data["extractor"])[0] / 3600) * $soulbonus);
4458
4459 if($gain > $uw->getSoulExtractorResources($uw->data["extractor"])[1]) {
4460 $gain = $uw->getSoulExtractorResources($uw->data["extractor"])[1];
4461 }
4462
4463 // Add
4464 $uw->data['soul'] += $gain;
4465 $qry[] = "UPDATE underworld SET soul = ".$uw->data['soul']." WHERE owner = ".$acc->data['ID'];
4466
4467 break;
4468 case 3: // Time
4469 $uw->gatherTimeMachine();
4470 break;
4471
4472 }
4473
4474 // Remove gathered
4475 $uw->data["gather".$args[0]] = $GLOBALS["CURRTIME"];
4476 $qry[] = "UPDATE underworld SET gather".$args[0]." = ".$GLOBALS["CURRTIME"]." WHERE owner = ".$acc->data['ID'];
4477
4478 $db->exec(join(';', $qry));
4479
4480 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
4481 $ret[] = "Success:";
4482 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
4483 $ret[] = "owntower.towerSave:".$acc->getTowerSave($uw);
4484 break;
4485 case 'playersetflag': // Flag by Greg
4486
4487 $db->exec("UPDATE players SET flag = '".$args[0]."' WHERE ID = $playerID");
4488 $ret[] = "Success:";
4489 break;
4490 case 'playertutorialstatus': // Tutorial by Greg
4491 $acc = new Account(null, null, false, false); // New acc
4492
4493 $db->exec("UPDATE players SET tutorial = '".$args[0]."' WHERE ID = $playerID");
4494 $acc->data['tutorial'] = $args[0];
4495
4496 $ret[] = "Success:";
4497 $ret[] = '#ownplayersave:597/'.$acc->data['tutorial'];
4498 break;
4499 case 'underworldbuildstop':
4500 $qry = [];
4501
4502 $acc = new Account(null, null, true, false); // New acc
4503 $uw = new Underworld($acc->data['ID']);
4504
4505 //Stop build
4506 $uw->stopBuilding();
4507
4508 //Recieve 75% back of the resources
4509 $building = $uw->getBuilding($args[0]);
4510
4511 $price = $uw->getBuildingPrice($args[0], ($uw->data[$building] + 1));
4512 $acc->data['silver'] += floor($price[0] * 0.75);
4513 $uw->data['soul'] += floor($price[1] * 0.75);
4514
4515 $qry[] = "UPDATE players SET silver = ".$acc->data['silver']." WHERE ID = ".$acc->data['ID'];
4516 $qry[] = "UPDATE underworld SET soul = ".$uw->data['soul']." WHERE owner = ".$acc->data['ID'];
4517
4518 $db->exec(join(';', $qry));
4519
4520 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
4521 $ret[] = "Success:";
4522 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
4523 $ret[] = "owntower.towerSave:".$acc->getTowerSave();
4524 break;
4525 case 'underworldattack': // By Greg
4526 $acc = new Account(null, null, true, false);
4527 $uw = new Underworld($acc->data["ID"]);
4528
4529 //Log fight
4530 $fightlog = [];
4531
4532 if(!$uw->haveIt) {
4533 exit();
4534 }
4535
4536 if($uw->data["lured"] >= $uw->data["gate"]) {
4537 exit(); // max lured today
4538 }
4539
4540 //get opponent
4541 $qry = $db->prepare("SELECT players.*, guilds.portal AS guild_portal FROM players LEFT JOIN guilds ON players.guild = guilds.ID WHERE players.ID = :ID");
4542 $qry->bindParam(':ID', $args[0]);
4543 $qry->execute();
4544
4545 //player not found
4546 if($qry->rowCount() == 0)
4547 exit("Error:player not found");
4548
4549 $opponentData = $qry->fetch(PDO::FETCH_ASSOC);
4550
4551 $items = $db->query("SELECT * FROM items WHERE owner = ".$opponentData['ID']." AND slot BETWEEN 10 AND 19");
4552 $items = $items->fetchAll(PDO::FETCH_ASSOC);
4553
4554 $p = new Player($opponentData, $items);
4555 $opponent = [$p];
4556
4557 $unit = $uw->getUnderworldUnits();
4558
4559 //simulate fight
4560 $simulation = new GroupSimulation($unit, $opponent);
4561 $simulation->simulate();
4562
4563 //output logs
4564 for($i = 0; $i < count($simulation->simulations); $i++)
4565 {
4566 $fightn = $i+1;
4567 $fightlog[] = "fightheader".$fightn.".fighters:16/0/0/0/1/".$simulation->fightHeaders[$i];
4568 $fightlog[] = "fight".$fightn.".r:".$simulation->simulations[$i]->fightLog;
4569 $fightlog[] = "winnerid".$fightn.".s:".$simulation->simulations[$i]->winnerID;
4570 }
4571
4572 $fightlog[] = 'fightadditionalplayers.r:'.$simulation->getAdditionals();
4573
4574 $uw->data["lured"] ++;
4575 $db->exec("UPDATE underworld SET lured = ".$uw->data["lured"]." WHERE owner = ".$acc->data["ID"]);
4576
4577 $rewardLog = [];
4578 for($i = 0; $i < 6; $i++)
4579 $rewardLog[] = 0;
4580
4581 if($simulation->win) {
4582 $rewardLog[0] = 1;
4583
4584 $soulres = $uw->getSoulExtractorResources($uw->data["extractor"])[0];
4585 $soul = $soulres + (rand(floor($soulres / 8), floor($soulres / 6)));
4586
4587 $lvl = $opponentData['lvl'] + $acc->data['lvl'];
4588 $soul += $soul * floor($lvl / 2.5);
4589
4590 $soul += floor($soul * ($lvl / 4));
4591 $soulbonus = floor($soul * (0.1 * $uw->data["torture"]));
4592
4593 $rewardLog[3] = $soul;
4594 $rewardLog[4] = $soulbonus;
4595
4596 $uw->data["soul"] += $soul + $soulbonus;
4597
4598 $db->exec("UPDATE underworld SET soul = ".$uw->data["soul"]." WHERE owner = ".$acc->data["ID"]);
4599
4600 //Max soul at lvl
4601 if($uw->data["battle_lvl"] <= 0)
4602 $uw->data["battle_lvl"] = $opponentData["lvl"] + 1;
4603 else
4604 $uw->data["battle_lvl"] ++;
4605
4606 // Honor system as fortress
4607 $uw->data['uwhonor'] += round($opponentData["lvl"] / 40);
4608 $db->exec("UPDATE underworld SET uwhonor = ".$uw->data['uwhonor']." WHERE owner = ".$acc->data['ID']);
4609
4610 } else {
4611 // Max soul at lvl if loss
4612 $uw->data["battle_lvl"] -= 5;
4613
4614 if($uw->data["battle_lvl"] < 0)
4615 $uw->data["battle_lvl"] = 0;
4616
4617 // Honor system loss 5
4618 $uw->data['uwhonor'] -= 5;
4619 if($uw->data['uwhonor'] < 0)
4620 $uw->data['uwhonor'] = 0;
4621 $db->exec("UPDATE underworld SET uwhonor = ".$uw->data['uwhonor']." WHERE owner = ".$acc->data['ID']);
4622
4623 }
4624
4625 // Update max soul
4626 $db->exec("UPDATE underworld SET battle_lvl = ".$uw->data["battle_lvl"]." WHERE owner = ".$acc->data['ID']);
4627
4628
4629 //"underworldpillage\":[\"won\",\"fightnr\",\"gold\",\"souls\",\"bonussouls\",\"exp\"]
4630
4631 $fightlog = join('&', $fightlog);
4632 $ret[] = $fightlog;
4633
4634 $rewardLog = join("/", $rewardLog);
4635
4636 $ret[] = "fightresult.underworldpillage:".$rewardLog;
4637 $ret[] = "combatloglist.s:".$acc->getCombatLog(); // Update logs
4638 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
4639 $ret[] = 'Success:';
4640 $ret[] = "owntower.towerSave:".$acc->getTowerSave();
4641
4642
4643 break;
4644 case 'getserverversion':
4645 //$keyId = "0-0K36aS2567C735";
4646 //$key = "5O4ddy4KZLs41n6W";
4647
4648 echo "serverversion:$gameVersion&Success:";
4649 break;
4650 case 'underworldupgradeunit': //By Greg
4651 // Args 0: unit
4652 // 1 - Goblins, 2 - Trolls, 3 - Keeper
4653 $qry = [];
4654
4655 $acc = new Account(null, null, true, false);
4656 $uw = new Underworld($acc->data["ID"]);
4657 $defender = null;
4658
4659 if(!$uw->haveIt)
4660 exit();
4661
4662 switch($args[0]) {
4663 case 1: // Goblins
4664 if($uw->data['goblin'] <= 0)
4665 exit();
4666
4667 $defender = "goblins";
4668 break;
4669 case 2: // Trolls
4670 if($uw->data['troll'] <= 0)
4671 exit();
4672
4673 $defender = "trolls";
4674 break;
4675 case 3: // Keeper
4676 if($uw->data['keeper'] <= 0)
4677 exit();
4678
4679 $defender = "keeper";
4680 break;
4681
4682 }
4683
4684 if($defender == null)
4685 exit();
4686
4687 $price = $uw->getUnitUpgradePrice($args[0]);
4688
4689 // Check player has enough gold and soul
4690 if($acc->data['silver'] < $price[0])
4691 exit();
4692
4693 if($uw->data['soul'] < $price[1])
4694 exit();
4695
4696 //Remove prices
4697 $acc->data['silver'] -= $price[0];
4698 $uw->data['soul'] -= $price[1];
4699 $qry[] = "UPDATE players SET silver = ".$acc->data['silver']." WHERE ID = ".$acc->data['ID'];
4700 $qry[] = "UPDATE underworld SET soul = ".$uw->data['soul']." WHERE owner = ".$acc->data['ID'];
4701
4702 //Upgrade
4703 $unit = "unit_".$defender;
4704 $uw->data[$unit] ++;
4705 $qry[] = "UPDATE underworld SET ".$unit." = ".$uw->data[$unit]." WHERE owner = ".$acc->data['ID'];
4706
4707 if(!empty($qry)) {
4708 $db->exec(join(';', $qry));
4709 }
4710
4711 $ret[] = "timestamp:".$GLOBALS["CURRTIME"];
4712 $ret[] = 'Success:';
4713 $ret[] = "ownplayersave.playerSave:".$acc->getPlayerSave();
4714 $ret[] = "owntower.towerSave:".$acc->getTowerSave();
4715 $ret[] = "underworldprice.underworldPrice(10):".$uw->getUpgradePrice();
4716 $ret[] = "underworldupgradeprice.underworldupgradePrice(3):".$uw->getUnitUpgradePrice();
4717 $ret[] = "underworldmaxsouls:".$uw->getMaxSouls();
4718
4719 break;
4720}
4721
4722echo join("&", $ret);
4723?>