Pārlūkot izejas kodu

Olympiad system update. Announcer moved to the separated class, cache NPC's list and use NpcSay? instead of text strings.
All games started at once to prevent time gap between game creation and countdown.
Defaulted and disconnected players not ported back (because they not on stadium).
Some other little changes to allow injecting of the games from scripts.

_DS_ 14 gadi atpakaļ
vecāks
revīzija
a7d772c230

+ 39 - 34
L2_GameServer/java/com/l2jserver/gameserver/model/olympiad/AbstractOlympiadGame.java

@@ -32,6 +32,7 @@ import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Summon;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PetInstance;
+import com.l2jserver.gameserver.model.entity.TvTEvent;
 import com.l2jserver.gameserver.model.zone.type.L2OlympiadStadiumZone;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.ExOlympiadMode;
@@ -113,6 +114,10 @@ public abstract class AbstractOlympiadGame
 		if (player.getClient() == null || player.getClient().isDetached())
 			return new SystemMessage(SystemMessageId.THE_GAME_HAS_BEEN_CANCELLED_BECAUSE_THE_OTHER_PARTY_ENDS_THE_GAME);
 
+		// safety precautions
+		if (player.inObserverMode() || TvTEvent.isPlayerParticipant(player.getObjectId()))
+			return new SystemMessage(SystemMessageId.THE_GAME_HAS_BEEN_CANCELLED_BECAUSE_THE_OTHER_PARTY_DOES_NOT_MEET_THE_REQUIREMENTS_FOR_JOINING_THE_GAME);
+
 		SystemMessage sm;
 		if (player.isDead())
 		{
@@ -272,39 +277,6 @@ public abstract class AbstractOlympiadGame
 		}
 	}
 
-	protected static final void rewardParticipant(L2PcInstance player, int[][] reward)
-	{
-		if (player == null || !player.isOnline() || reward == null)
-			return;
-
-		try
-		{
-			SystemMessage sm;
-			L2ItemInstance item;
-			final InventoryUpdate iu = new InventoryUpdate();
-			for (int[] it : reward)
-			{
-				if (it == null || it.length != 2)
-					continue;
-
-				item = player.getInventory().addItem("Olympiad", it[0], it[1], player, null);
-				if (item == null)
-					continue;
-
-				iu.addModifiedItem(item);
-				sm = new SystemMessage(SystemMessageId.EARNED_S2_S1_S);
-				sm.addItemName(it[0]);
-				sm.addNumber(it[1]);
-				player.sendPacket(sm);
-			}
-			player.sendPacket(iu);			
-		}
-		catch (Exception e)
-		{
-			_log.log(Level.WARNING, e.getMessage(), e);
-		}
-	}
-
 	protected static final void cleanEffects(L2PcInstance player)
 	{
 		try
@@ -391,7 +363,7 @@ public abstract class AbstractOlympiadGame
 		}
 	}
 
-	protected void portPlayerBack(L2PcInstance player)
+	protected static final void portPlayerBack(L2PcInstance player)
 	{
 		if (player == null)
 			return;
@@ -403,6 +375,39 @@ public abstract class AbstractOlympiadGame
 		player.setLastCords(0, 0, 0);
 	}
 
+	public static final void rewardParticipant(L2PcInstance player, int[][] reward)
+	{
+		if (player == null || !player.isOnline() || reward == null)
+			return;
+
+		try
+		{
+			SystemMessage sm;
+			L2ItemInstance item;
+			final InventoryUpdate iu = new InventoryUpdate();
+			for (int[] it : reward)
+			{
+				if (it == null || it.length != 2)
+					continue;
+
+				item = player.getInventory().addItem("Olympiad", it[0], it[1], player, null);
+				if (item == null)
+					continue;
+
+				iu.addModifiedItem(item);
+				sm = new SystemMessage(SystemMessageId.EARNED_S2_S1_S);
+				sm.addItemName(it[0]);
+				sm.addNumber(it[1]);
+				player.sendPacket(sm);
+			}
+			player.sendPacket(iu);			
+		}
+		catch (Exception e)
+		{
+			_log.log(Level.WARNING, e.getMessage(), e);
+		}
+	}
+
 	public abstract CompetitionType getType();
 
 	public abstract String[] getPlayerNames();

+ 2 - 1
L2_GameServer/java/com/l2jserver/gameserver/model/olympiad/CompetitionType.java

@@ -23,7 +23,8 @@ public enum CompetitionType
 {
 	CLASSED("classed"),
 	NON_CLASSED("non-classed"),
-	TEAMS("teams");
+	TEAMS("teams"),
+	OTHER("other");
 
 	private final String _name;
 

+ 10 - 1
L2_GameServer/java/com/l2jserver/gameserver/model/olympiad/Olympiad.java

@@ -144,7 +144,8 @@ public class Olympiad
 	protected ScheduledFuture<?> _scheduledOlympiadEnd;
 	protected ScheduledFuture<?> _scheduledWeeklyTask;
 	protected ScheduledFuture<?> _scheduledValdationTask;
-	protected ScheduledFuture<?> _gameManager;
+	protected ScheduledFuture<?> _gameManager = null;
+	protected ScheduledFuture<?> _gameAnnouncer = null;
 
 	public static Olympiad getInstance()
 	{
@@ -486,6 +487,8 @@ public class Olympiad
 				_logResults.info("Result,Player1,Player2,Player1 HP,Player2 HP,Player1 Damage,Player2 Damage,Points,Classed");
 				
 				_gameManager = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(OlympiadGameManager.getInstance(), 30000, 30000);
+				if (Config.ALT_OLY_ANNOUNCE_GAMES)
+					_gameAnnouncer = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new OlympiadAnnouncer(), 30000, 500);
 				
 				long regEnd = getMillisToCompEnd() - 600000;
 				if (regEnd > 0)
@@ -525,6 +528,12 @@ public class Olympiad
 							_gameManager = null;
 						}
 
+						if (_gameAnnouncer != null)
+						{
+							_gameAnnouncer.cancel(false);
+							_gameAnnouncer = null;
+						}
+
 						saveOlympiadStatus();
 						
 						init();

+ 90 - 0
L2_GameServer/java/com/l2jserver/gameserver/model/olympiad/OlympiadAnnouncer.java

@@ -0,0 +1,90 @@
+/*
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ * 
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ * 
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.model.olympiad;
+
+import java.util.List;
+
+import javolution.util.FastList;
+
+import com.l2jserver.gameserver.datatables.SpawnTable;
+import com.l2jserver.gameserver.model.L2Spawn;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.network.clientpackets.Say2;
+import com.l2jserver.gameserver.network.serverpackets.CreatureSay;
+
+/**
+ * 
+ * @author DS
+ *
+ */
+public final class OlympiadAnnouncer implements Runnable
+{
+	private static final int OLY_MANAGER = 31688;
+
+	private List<L2Spawn> _managers = new FastList<L2Spawn>();
+	private int _currentStadium = 0;
+
+	public OlympiadAnnouncer()
+	{
+		for (L2Spawn spawn : SpawnTable.getInstance().getSpawnTable().values())
+		{
+			if (spawn != null && spawn.getNpcid() == OLY_MANAGER)
+				_managers.add(spawn);
+		}
+	}
+
+	public void run()
+	{
+		OlympiadGameTask task;
+		for (int i = OlympiadGameManager.getInstance().getNumberOfStadiums(); --i >= 0; _currentStadium++)
+		{
+			if (_currentStadium >= OlympiadGameManager.getInstance().getNumberOfStadiums())
+				_currentStadium = 0;
+
+			task = OlympiadGameManager.getInstance().getOlympiadTask(_currentStadium);
+			if (task != null && task.getGame() != null && task.needAnnounce())
+			{
+				String msg;
+				final int arenaId = task.getGame().getStadiumId() + 1;
+				switch (task.getGame().getType())
+				{
+					case NON_CLASSED:
+						//msg = 1300166;
+						msg = "Olympiad class-free individual match is going to begin in Arena " + arenaId + " in a moment.";
+						break;
+					case CLASSED:
+						//msg = 1300167;
+						msg = "Olympiad class-specific individual match is going to begin in Arena " + arenaId + " in a moment.";
+						break;
+					case TEAMS:
+						//msg = 1300132;
+						msg = "Olympiad class-free team match is going to begin in Arena " + arenaId + " in a moment.";
+						break;
+					default:
+						continue;
+				}
+
+				L2Npc manager;
+				for (L2Spawn spawn : _managers)
+				{
+					manager = spawn.getLastSpawn();
+					if (manager != null)
+						manager.broadcastPacket(new CreatureSay(manager.getObjectId(), Say2.SHOUT, manager.getName(), msg));
+				}
+				break;
+			}
+		}
+	}
+}

+ 38 - 35
L2_GameServer/java/com/l2jserver/gameserver/model/olympiad/OlympiadGameManager.java

@@ -80,59 +80,62 @@ public class OlympiadGameManager implements Runnable
 			
 			if (readyClassed != null || readyNonClassed || readyTeams)
 			{
-				int startDelay = 0;
 				// set up the games queue
 				for (int i = 0; i < _tasks.length; i++)
 				{
 					task = _tasks[i];
-					if (!task.isRunning())
+					synchronized (task)
 					{
-						// Fair arena distribution
-						// 0,2,4,6,8.. arenas checked for classed or teams first
-						if ((readyClassed != null || readyTeams) && (i % 2) == 0)
+						if (!task.isRunning())
 						{
-							// 0,4,8.. arenas checked for teams first
-							if (readyTeams && (i % 4) == 0)
+							// Fair arena distribution
+							// 0,2,4,6,8.. arenas checked for classed or teams first
+							if ((readyClassed != null || readyTeams) && (i % 2) == 0)
 							{
-								newGame = OlympiadGameTeams.createGame(i, OlympiadManager.getInstance().getRegisteredTeamsBased());
-								if (newGame != null)
+								// 0,4,8.. arenas checked for teams first
+								if (readyTeams && (i % 4) == 0)
 								{
-									task.attachGame(newGame, startDelay);
-									startDelay += 1000;
-									continue;
+									newGame = OlympiadGameTeams.createGame(i, OlympiadManager.getInstance().getRegisteredTeamsBased());
+									if (newGame != null)
+									{
+										task.attachGame(newGame);
+										continue;
+									}
+									else
+										readyTeams = false;
+								}
+								// if no ready teams found check for classed
+								if (readyClassed != null)
+								{
+									newGame = OlympiadGameClassed.createGame(i, readyClassed);
+									if (newGame != null)
+									{
+										task.attachGame(newGame);
+										continue;
+									}
+									else
+										readyClassed = null;
 								}
-								else
-									readyTeams = false;
 							}
-							// if no ready teams found check for classed
-							if (readyClassed != null)
+							// 1,3,5,7,9.. arenas used for non-classed
+							// also other arenas will be used for non-classed if no classed or teams available
+							if (readyNonClassed)
 							{
-								newGame = OlympiadGameClassed.createGame(i, readyClassed);
+								newGame = OlympiadGameNonClassed.createGame(i, OlympiadManager.getInstance().getRegisteredNonClassBased());
 								if (newGame != null)
 								{
-									task.attachGame(newGame, startDelay);
-									startDelay += 1000;
+									task.attachGame(newGame);
 									continue;
 								}
 								else
-									readyClassed = null;
-							}
+									readyNonClassed = false;
+							}							
 						}
-						// 1,3,5,7,9.. arenas used for non-classed
-						// also other arenas will be used for non-classed if no classed or teams available
-						if (readyNonClassed)
-						{
-							newGame = OlympiadGameNonClassed.createGame(i, OlympiadManager.getInstance().getRegisteredNonClassBased());
-							if (newGame != null)
-							{
-								task.attachGame(newGame, startDelay);
-								startDelay += 1000;
-								continue;
-							}
-							else
-								readyNonClassed = false;
-						}							
 					}
+
+					// stop generating games if no more participants
+					if (readyClassed == null && !readyNonClassed && !readyTeams)
+						break;
 				}
 			}
 		}

+ 27 - 16
L2_GameServer/java/com/l2jserver/gameserver/model/olympiad/OlympiadGameNormal.java

@@ -40,9 +40,6 @@ import com.l2jserver.util.Rnd;
  */
 abstract public class OlympiadGameNormal extends AbstractOlympiadGame
 {
-	protected boolean _playerOneDefaulted;
-	protected boolean _playerTwoDefaulted;
-	
 	protected int _damageP1 = 0;
 	protected int _damageP2 = 0;
 	
@@ -150,7 +147,7 @@ abstract public class OlympiadGameNormal extends AbstractOlympiadGame
 	@Override
 	protected final void removals()
 	{
-		if (isAborted())
+		if (_aborted)
 			return;
 
 		removals(_playerOne.player, true);
@@ -177,30 +174,44 @@ abstract public class OlympiadGameNormal extends AbstractOlympiadGame
 	protected final void cleanEffects()
 	{
 		if (_playerOne.player != null
-				&& _playerOne.player.getOlympiadGameId() == getStadiumId())
+				&& !_playerOne.defaulted
+				&& !_playerOne.disconnected
+				&& _playerOne.player.getOlympiadGameId() == _stadiumID)
 			cleanEffects(_playerOne.player);
 
 		if (_playerTwo.player != null
-				&& _playerTwo.player.getOlympiadGameId() == getStadiumId())
+				&& !_playerTwo.defaulted
+				&& !_playerTwo.disconnected
+				&& _playerTwo.player.getOlympiadGameId() == _stadiumID)
 			cleanEffects(_playerTwo.player);
 	}
 
 	@Override
 	protected final void portPlayersBack()
 	{
-		portPlayerBack(_playerOne.player);
-		portPlayerBack(_playerTwo.player);
+		if (_playerOne.player != null
+				&& !_playerOne.defaulted
+				&& !_playerOne.disconnected)
+			portPlayerBack(_playerOne.player);
+		if (_playerTwo.player != null 
+				&& !_playerTwo.defaulted
+				&& !_playerTwo.disconnected)
+			portPlayerBack(_playerTwo.player);
 	}
 
 	@Override
 	protected final void playersStatusBack()
 	{
 		if (_playerOne.player != null
-				&& _playerOne.player.getOlympiadGameId() == getStadiumId())
+				&& !_playerOne.defaulted
+				&& !_playerOne.disconnected
+				&& _playerOne.player.getOlympiadGameId() == _stadiumID)
 			playerStatusBack(_playerOne.player);
 
 		if (_playerTwo.player != null
-				&& _playerTwo.player.getOlympiadGameId() == getStadiumId())
+				&& !_playerTwo.defaulted
+				&& !_playerTwo.disconnected
+				&& _playerTwo.player.getOlympiadGameId() == _stadiumID)
 			playerStatusBack(_playerTwo.player);
 	}
 
@@ -289,11 +300,11 @@ abstract public class OlympiadGameNormal extends AbstractOlympiadGame
 		SystemMessage sm;
 		
 		// Check for if a player defaulted before battle started
-		if (_playerOneDefaulted || _playerTwoDefaulted)
+		if (_playerOne.defaulted || _playerTwo.defaulted)
 		{
 			try
 			{
-				if (_playerOneDefaulted)
+				if (_playerOne.defaulted)
 				{
 					try
 					{
@@ -313,7 +324,7 @@ abstract public class OlympiadGameNormal extends AbstractOlympiadGame
 						_log.log(Level.WARNING, "Exception on validateWinner(): " + e.getMessage(), e);
 					}
 				}
-				if (_playerTwoDefaulted)
+				if (_playerTwo.defaulted)
 				{
 					try
 					{
@@ -553,7 +564,7 @@ abstract public class OlympiadGameNormal extends AbstractOlympiadGame
 		reason = AbstractOlympiadGame.checkDefaulted(_playerOne.player);
 		if (reason != null)
 		{
-			_playerOneDefaulted = true;
+			_playerOne.defaulted = true;
 			if (_playerTwo.player != null)
 				_playerTwo.player.sendPacket(reason);
 		}
@@ -561,12 +572,12 @@ abstract public class OlympiadGameNormal extends AbstractOlympiadGame
 		reason = AbstractOlympiadGame.checkDefaulted(_playerTwo.player);
 		if (reason != null)
 		{
-			_playerTwoDefaulted = true;
+			_playerTwo.defaulted = true;
 			if (_playerOne.player != null)
 				_playerOne.player.sendPacket(reason);
 		}
 
-		return _playerOneDefaulted || _playerTwoDefaulted;
+		return _playerOne.defaulted || _playerTwo.defaulted;
 	}
 
 	@Override

+ 25 - 39
L2_GameServer/java/com/l2jserver/gameserver/model/olympiad/OlympiadGameTask.java

@@ -19,13 +19,8 @@ import java.util.logging.Logger;
 
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.ThreadPoolManager;
-import com.l2jserver.gameserver.datatables.SpawnTable;
-import com.l2jserver.gameserver.model.L2Spawn;
-import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.zone.type.L2OlympiadStadiumZone;
 import com.l2jserver.gameserver.network.SystemMessageId;
-import com.l2jserver.gameserver.network.clientpackets.Say2;
-import com.l2jserver.gameserver.network.serverpackets.CreatureSay;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 
 /**
@@ -43,11 +38,10 @@ public final class OlympiadGameTask implements Runnable
 	public static final int[] BATTLE_START_TIME_SECOND = { 10, 5, 4, 3, 2, 1, 0 };
 	public static final int[] TELEPORT_TO_TOWN = { 40, 30, 20, 10, 5, 4, 3, 2, 1, 0 };
 
-	private static final int OLY_MANAGER = 31688;
-
 	private final L2OlympiadStadiumZone _zone;
 	private AbstractOlympiadGame _game;
 	private GameState _state = GameState.IDLE;
+	private boolean _needAnnounce = false;
 	private int _countDown = 0;
 
 	private static enum GameState
@@ -91,6 +85,17 @@ public final class OlympiadGameTask implements Runnable
 		return _state == GameState.TELEPORT_TO_TOWN;
 	}
 
+	public final boolean needAnnounce()
+	{
+		if (_needAnnounce)
+		{
+			_needAnnounce = false;
+			return true;
+		}
+		else
+			return false;
+	}
+
 	public final L2OlympiadStadiumZone getZone()
 	{
 		return _zone;
@@ -101,7 +106,7 @@ public final class OlympiadGameTask implements Runnable
 		return _game;
 	}
 
-	public final void attachGame(AbstractOlympiadGame game, int startDelay)
+	public final void attachGame(AbstractOlympiadGame game)
 	{
 		if (game!= null && _state != GameState.IDLE)
 		{
@@ -111,7 +116,8 @@ public final class OlympiadGameTask implements Runnable
 
 		_game = game;
 		_state = GameState.BEGIN;
-		ThreadPoolManager.getInstance().scheduleGeneral(this, startDelay);
+		_needAnnounce = false;
+		ThreadPoolManager.getInstance().executeTask(this);
 	}
 
 	public final void run()
@@ -310,36 +316,7 @@ public final class OlympiadGameTask implements Runnable
 				return false;
 
 			_game.removals();
-
-			if (Config.ALT_OLY_ANNOUNCE_GAMES)
-			{
-				L2Npc manager;
-				final String message;
-				final int arenaId = _game.getStadiumId() + 1;
-				switch (_game.getType())
-				{
-					case NON_CLASSED:
-						message = "Olympiad class-free individual match is going to begin in Arena " + arenaId + " in a moment.";
-						break;
-					case CLASSED:
-						message = "Olympiad class-specific individual match is going to begin in Arena " + arenaId + " in a moment.";
-						break;
-					default:
-						message = "Olympiad class-free team match is going to begin in Arena " + arenaId + " in a moment.";
-						break;
-				}
-				
-				for (L2Spawn spawn : SpawnTable.getInstance().getSpawnTable().values())
-				{
-					if (spawn != null && spawn.getNpcid() == OLY_MANAGER)
-					{
-						manager = spawn.getLastSpawn();
-						if (manager != null)
-							manager.broadcastPacket(new CreatureSay(manager.getObjectId(), Say2.SHOUT, manager.getName(), message));
-					}
-				}
-			}
-
+			_needAnnounce = true;
 			OlympiadGameManager.getInstance().startBattle(); // inform manager
 			return true;
 		}
@@ -474,5 +451,14 @@ public final class OlympiadGameTask implements Runnable
 		{
 			_log.log(Level.WARNING, e.getMessage(), e);
 		}
+
+		try
+		{
+			_zone.closeDoors();
+		}
+		catch (Exception e)
+		{
+			_log.log(Level.WARNING, e.getMessage(), e);
+		}
 	}
 }

+ 44 - 16
L2_GameServer/java/com/l2jserver/gameserver/model/olympiad/OlympiadGameTeams.java

@@ -279,11 +279,17 @@ class OlympiadGameTeams extends AbstractOlympiadGame
 		for (int i = 0; i < TEAM_SIZE; i++)
 		{
 			par = _teamOne[i];
-			if (par.player != null && par.player.getOlympiadGameId() == getStadiumId())
+			if (par.player != null
+					&& !par.defaulted
+					&& !par.disconnected
+					&& par.player.getOlympiadGameId() == _stadiumID)
 				cleanEffects(par.player);
 
 			par = _teamTwo[i];
-			if (par.player != null && par.player.getOlympiadGameId() == getStadiumId())
+			if (par.player != null
+					&& !par.defaulted
+					&& !par.disconnected
+					&& par.player.getOlympiadGameId() == _stadiumID)
 				cleanEffects(par.player);
 		}
 	}
@@ -291,10 +297,20 @@ class OlympiadGameTeams extends AbstractOlympiadGame
 	@Override
 	protected final void portPlayersBack()
 	{
+		Participant par;
 		for (int i = 0; i < TEAM_SIZE; i++)
 		{
-			portPlayerBack(_teamOne[i].player);
-			portPlayerBack(_teamTwo[i].player);
+			par = _teamOne[i];
+			if (par.player != null
+					&& !par.defaulted
+					&& !par.disconnected)
+				portPlayerBack(par.player);
+
+			par = _teamTwo[i];
+			if (par.player != null
+					&& !par.defaulted
+					&& !par.disconnected)
+				portPlayerBack(par.player);
 		}
 	}
 
@@ -305,11 +321,17 @@ class OlympiadGameTeams extends AbstractOlympiadGame
 		for (int i = 0; i < TEAM_SIZE; i++)
 		{
 			par = _teamOne[i];
-			if (par.player != null && par.player.getOlympiadGameId() == getStadiumId())
+			if (par.player != null
+					&& !par.defaulted
+					&& !par.disconnected
+					&& par.player.getOlympiadGameId() == _stadiumID)
 				playerStatusBack(par.player);
 
 			par = _teamTwo[i];
-			if (par.player != null && par.player.getOlympiadGameId() == getStadiumId())
+			if (par.player != null
+					&& !par.defaulted
+					&& !par.disconnected
+					&& par.player.getOlympiadGameId() == _stadiumID)
 				playerStatusBack(par.player);
 		}
 	}
@@ -757,13 +779,16 @@ class OlympiadGameTeams extends AbstractOlympiadGame
 				reason = AbstractOlympiadGame.checkDefaulted(par.player);
 				if (reason != null)
 				{
-					_teamOneDefaulted = true;
-					for (Participant t : _teamTwo)
+					par.defaulted = true;
+					if (!_teamOneDefaulted)
 					{
-						if (t.player != null)
-							t.player.sendPacket(reason);
+						_teamOneDefaulted = true;
+						for (Participant t : _teamTwo)
+						{
+							if (t.player != null)
+								t.player.sendPacket(reason);
+						}
 					}
-					break;
 				}
 			}
 
@@ -775,13 +800,16 @@ class OlympiadGameTeams extends AbstractOlympiadGame
 				reason = AbstractOlympiadGame.checkDefaulted(par.player);
 				if (reason != null)
 				{
-					_teamTwoDefaulted = true;
-					for (Participant t : _teamOne)
+					par.defaulted = true;
+					if (!_teamTwoDefaulted)
 					{
-						if (t.player != null)
-							t.player.sendPacket(reason);
+						_teamTwoDefaulted = true;
+						for (Participant t : _teamOne)
+						{
+							if (t.player != null)
+								t.player.sendPacket(reason);
+						}
 					}
-					break;
 				}
 			}
 			

+ 1 - 0
L2_GameServer/java/com/l2jserver/gameserver/model/olympiad/Participant.java

@@ -31,6 +31,7 @@ public final class Participant
 	public final int side;
 	public final int baseClass;
 	public boolean disconnected = false;
+	public boolean defaulted = false;
 	public final StatsSet stats;
 
 	public Participant(L2PcInstance plr, int olympiadSide)