Задать вопрос
eprivalov
@eprivalov
Учусь

Что за неизвестная ошибка PHP или Javascript?

Уже ровно неделю не могу исправить такую проблему: я администрирую браузерную онлайн игру Травиан. Все было, почти, отлично. Но примерно неделю назад начались серьезные проблемы. Проблема заключается в том, что при отправке войск в атаку они должны пройти какое-либо расстояние, это занимает время. Так вот когда таймер доходит до нуля, самого сражения не происходит, а на главной странице деревни такое ощущение, что зажата кнопка F5 (идет вечное обновление страницы)...

pkl7zMB.png

Когда сервер не успевает отвечать на запросы, то игрок видит просто пустой экран:

CX2TJ5r.png

Вот метод, который отвечают за войска... Я уверен, что проблема именно в нем:
(есть еще два метода, но их выложу как уточнение вопроса)

private function sendTroopsBack($post) {
		global $form, $database, $village, $generator, $session, $technology;

		$enforce=$database->getEnforceArray($post['ckey'],0);
			$to = $database->getVillage($enforce['from']);
			$Gtribe = "";
			if ($database->getUserField($to['owner'],'tribe',0) == '2'){ $Gtribe = "1"; } else if ($database->getUserField($to['owner'],'tribe',0) == '3'){ $Gtribe = "2"; } else if ($database->getUserField($to['owner'],'tribe',0) == '4'){ $Gtribe = "3"; }else if ($database->getUserField($to['owner'],'tribe',0) == '5'){ $Gtribe = "4"; }

					for($i=1; $i<10; $i++){
						if(isset($post['t'.$i])){
							if($i!=10){
								if ($post['t'.$i] > $enforce['u'.$Gtribe.$i])
								{
									$form->addError("error","Вы не можете отправить больше войск чем у Вас есть в наличии");
									break;
								}

								if($post['t'.$i]<0)
								{
									$form->addError("error","You can't send negative units.");
									break;
								}
							}
						} else {
						$post['t'.$i.'']='0';
						}
					}
						if(isset($post['t11'])){
								if ($post['t11'] > $enforce['hero'])
								{
									$form->addError("error","Вы не можете отправить больше войск чем у Вас есть в наличии");
									break;
								}

								if($post['t11']<0)
								{
									$form->addError("error","You can't send negative units.");
									break;
								}
						} else {
						$post['t11']='0';
						}

				if($form->returnErrors() > 0) {
					$_SESSION['errorarray'] = $form->getErrors();
					$_SESSION['valuearray'] = $_POST;
					header("Location: a2b.php");
				} else {

					//change units
					$start = ($database->getUserField($to['owner'],'tribe',0)-1)*10+1;
					$end = ($database->getUserField($to['owner'],'tribe',0)*10);

					$j='1';
					for($i=$start;$i<=$end;$i++){
						$database->modifyEnforce($post['ckey'],$i,$post['t'.$j.''],0); $j++;
					}

						//get cord
						$from = $database->getVillage($enforce['from']);
						$fromcoor = $database->getCoor($enforce['from']);
						$tocoor = $database->getCoor($enforce['vref']);
						$fromCor = array('x'=>$tocoor['x'], 'y'=>$tocoor['y']);
						$toCor = array('x'=>$fromcoor['x'], 'y'=>$fromcoor['y']);

				$speeds = array();

				//find slowest unit.
				for($i=1;$i<=10;$i++){
					if (isset($post['t'.$i])){
						if( $post['t'.$i] != '' && $post['t'.$i] > 0){
						if($unitarray) { reset($unitarray); }
						$unitarray = $GLOBALS["u".(($session->tribe-1)*10+$i)];
						$speeds[] = $unitarray['speed'];
					} else {
						$post['t'.$i.'']='0';
						}
					} else {
						$post['t'.$i.'']='0';
					}
				}
					if (isset($post['t11'])){
						if( $post['t11'] != '' && $post['t11'] > 0){
						$qh = "SELECT * FROM tx5_hero WHERE uid = ".$from['owner']."";
						$resulth = mysqli_query($database->connection, $qh);
						$hero_f=mysqli_fetch_array($resulth);
						$hero_unit=$hero_f['unit'];
						$speeds[] = $GLOBALS['u'.$hero_unit]['speed'];
					} else {
						$post['t11']='0';
						}
					} else {
						$post['t11']='0';
					}
			$artefact = count($database->getOwnUniqueArtefactInfo2($from['owner'],2,3,0));
			$artefact1 = count($database->getOwnUniqueArtefactInfo2($from['vref'],2,1,1));
			$artefact2 = count($database->getOwnUniqueArtefactInfo2($from['owner'],2,2,0));
			if($artefact > 0){
			$fastertroops = 3;
			}else if($artefact1 > 0){
			$fastertroops = 2;
			}else if($artefact2 > 0){
			$fastertroops = 1.5;
			}else{
			$fastertroops = 1;
			}
				$time = round($generator->procDistanceTime($fromCor,$toCor,min($speeds),1)/$fastertroops);
				$foolartefact4 = $database->getFoolArtefactInfo(2,$from['wref'],$from['owner']);
				if(count($foolartefact4) > 0){
				foreach($foolartefact4 as $arte){
				if($arte['bad_effect'] == 1){
				$time *= $arte['effect2'];
				}else{
				$time /= $arte['effect2'];
				$time = round($endtime);
				}
				}
				}
				$reference = $database->addAttack($enforce['from'],$post['t1'],$post['t2'],$post['t3'],$post['t4'],$post['t5'],$post['t6'],$post['t7'],$post['t8'],$post['t9'],$post['t10'],$post['t11'],2,0,0,0,0);
				$database->addMovement(4,$village->wid,$enforce['from'],$reference,$AttackArrivalTime,($time+$AttackArrivalTime));
				$technology->checkReinf($post['ckey']);

						header("Location: build.php?id=39");

				}
	}
  • Вопрос задан
  • 2984 просмотра
Подписаться 2 Оценить 5 комментариев
Пригласить эксперта
Ответы на вопрос 3
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
вам бы на фриланс-биржу с такими вопросами.... или на форум какой...
Ответ написан
m0Hze
@m0Hze
if ($database->getUserField($to['owner'],'tribe',0) == '2'){ $Gtribe = "1"; } else if ($database->getUserField($to['owner'],'tribe',0) == '3'){ $Gtribe = "2"; } else if ($database->getUserField($to['owner'],'tribe',0) == '4'){ $Gtribe = "3"; }else if ($database->getUserField($to['owner'],'tribe',0) == '5'){ $Gtribe = "4"; }

А вот это вообще считается нормальным кодом? Для сравнения, происходит как я понимаю аж 4 запроса в бд, идентичных, кхм. И вообще, код слегдка сранноват, избыточен очень.
Ответ написан
fenric
@fenric
Тут правы все, одно дело когда вы спрашиваете совета, который пригодится не только вам, и другое дело, тратить своё время не понятно на что, и не понятно ради чего, вы понимаете, что если браться за вашу проблему, необходимо как минимум понять что происходит в участке кода, который вы тут опубликовали, и сколько потратится на это времени?
Разработка любой программы должна проходить при тотальной отладке всего, когда я пишу программы, я понимаю каждую строчку своего кода, я могу вам рассказать на какой строчке в каком файле что где находится (на самом деле, практически так и есть, я свой фреймворк знаю лучше чем самого себя), вам необходимо реализовать перехват ошибок вызванных в PHP, и анализировать их, исправить всё, а когда вы всё исправите, я думаю и эта проблема решится по ходу пьесы...
Как то так.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы