/*
* Copyright (C) 2004-2014 L2J Server
*
* This file is part of L2J Server.
*
* L2J Server 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.
*
* L2J Server 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 .
*/
package com.l2jserver.gameserver.model.olympiad;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import com.l2jserver.Config;
import com.l2jserver.gameserver.idfactory.IdFactory;
import com.l2jserver.gameserver.model.L2World;
import com.l2jserver.gameserver.model.Location;
import com.l2jserver.gameserver.model.actor.L2Character;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.zone.type.L2OlympiadStadiumZone;
import com.l2jserver.gameserver.network.SystemMessageId;
import com.l2jserver.gameserver.network.serverpackets.ExOlympiadMatchResult;
import com.l2jserver.gameserver.network.serverpackets.ExOlympiadUserInfo;
import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
import com.l2jserver.util.Rnd;
/**
* @author Pere, DS
*/
public class OlympiadGameTeams extends AbstractOlympiadGame
{
public static final int MAX_TEAM_SIZE = 3;
protected boolean _teamOneDefaulted;
protected boolean _teamTwoDefaulted;
protected int _damageT1 = 0;
protected int _damageT2 = 0;
protected final int _teamOneSize;
protected final int _teamTwoSize;
protected final Participant[] _teamOne;
protected final Participant[] _teamTwo;
protected OlympiadGameTeams(int id, Participant[] teamOne, Participant[] teamTwo)
{
super(id);
_teamOneSize = Math.min(teamOne.length, MAX_TEAM_SIZE);
_teamTwoSize = Math.min(teamTwo.length, MAX_TEAM_SIZE);
_teamOne = new Participant[MAX_TEAM_SIZE];
_teamTwo = new Participant[MAX_TEAM_SIZE];
Participant par;
for (int i = 0; i < MAX_TEAM_SIZE; i++)
{
if (i < _teamOneSize)
{
par = teamOne[i];
_teamOne[i] = par;
if (par.getPlayer() != null)
{
par.getPlayer().setOlympiadGameId(id);
}
}
else
{
_teamOne[i] = new Participant(IdFactory.getInstance().getNextId(), 1);
}
if (i < _teamTwoSize)
{
par = teamTwo[i];
_teamTwo[i] = par;
if (par.getPlayer() != null)
{
par.getPlayer().setOlympiadGameId(id);
}
}
else
{
_teamTwo[i] = new Participant(IdFactory.getInstance().getNextId(), 2);
}
}
}
protected static final Participant[][] createListOfParticipants(List> list)
{
if ((list == null) || list.isEmpty() || (list.size() < 2))
{
return null;
}
List teamOne = null;
List teamTwo = null;
L2PcInstance player;
List teamOnePlayers = new ArrayList<>(MAX_TEAM_SIZE);
List teamTwoPlayers = new ArrayList<>(MAX_TEAM_SIZE);
while (list.size() > 1)
{
teamOne = list.remove(Rnd.nextInt(list.size()));
if (((teamOne == null) || teamOne.isEmpty()))
{
continue;
}
for (int objectId : teamOne)
{
player = L2World.getInstance().getPlayer(objectId);
if ((player == null) || !player.isOnline())
{
teamOnePlayers.clear();
break;
}
teamOnePlayers.add(player);
}
if (teamOnePlayers.isEmpty())
{
continue;
}
teamTwo = list.remove(Rnd.nextInt(list.size()));
if ((teamTwo == null) || teamTwo.isEmpty())
{
list.add(teamOne);
teamOnePlayers.clear();
continue;
}
for (int objectId : teamTwo)
{
player = L2World.getInstance().getPlayer(objectId);
if ((player == null) || !player.isOnline())
{
teamTwoPlayers.clear();
break;
}
teamTwoPlayers.add(player);
}
if (teamTwoPlayers.isEmpty())
{
list.add(teamOne);
teamOnePlayers.clear();
continue;
}
Participant[] t1 = new Participant[teamOnePlayers.size()];
Participant[] t2 = new Participant[teamTwoPlayers.size()];
Participant[][] result = new Participant[2][];
for (int i = 0; i < t1.length; i++)
{
t1[i] = new Participant(teamOnePlayers.get(i), 1);
}
for (int i = 0; i < t2.length; i++)
{
t2[i] = new Participant(teamTwoPlayers.get(i), 2);
}
result[0] = t1;
result[1] = t2;
return result;
}
return null;
}
protected static OlympiadGameTeams createGame(int id, List> list)
{
final Participant[][] teams = createListOfParticipants(list);
if (teams == null)
{
return null;
}
return new OlympiadGameTeams(id, teams[0], teams[1]);
}
@Override
public CompetitionType getType()
{
return CompetitionType.TEAMS;
}
@Override
protected int getDivider()
{
return 5;
}
@Override
protected int[][] getReward()
{
return Config.ALT_OLY_TEAM_REWARD;
}
@Override
protected final String getWeeklyMatchType()
{
return COMP_DONE_WEEK_TEAM;
}
@Override
public final boolean containsParticipant(int playerId)
{
for (int i = _teamOneSize; --i >= 0;)
{
if (_teamOne[i].getObjectId() == playerId)
{
return true;
}
}
for (int i = _teamTwoSize; --i >= 0;)
{
if (_teamTwo[i].getObjectId() == playerId)
{
return true;
}
}
return false;
}
@Override
public final void sendOlympiadInfo(L2Character player)
{
for (int i = 0; i < MAX_TEAM_SIZE; i++)
{
player.sendPacket(new ExOlympiadUserInfo(_teamOne[i]));
}
for (int i = 0; i < MAX_TEAM_SIZE; i++)
{
player.sendPacket(new ExOlympiadUserInfo(_teamTwo[i]));
}
}
@Override
public final void broadcastOlympiadInfo(L2OlympiadStadiumZone stadium)
{
for (int i = 0; i < MAX_TEAM_SIZE; i++)
{
stadium.broadcastPacket(new ExOlympiadUserInfo(_teamOne[i]));
}
for (int i = 0; i < MAX_TEAM_SIZE; i++)
{
stadium.broadcastPacket(new ExOlympiadUserInfo(_teamTwo[i]));
}
}
@Override
protected final void broadcastPacket(L2GameServerPacket packet)
{
Participant par;
for (int i = 0; i < _teamOneSize; i++)
{
par = _teamOne[i];
if (par.updatePlayer())
{
par.getPlayer().sendPacket(packet);
}
}
for (int i = 0; i < _teamTwoSize; i++)
{
par = _teamTwo[i];
par.updatePlayer();
if (par.getPlayer() != null)
{
par.getPlayer().sendPacket(packet);
}
}
}
/**
* UnAfraid: FIXME: Sometimes buffers appear on arena 3v3 match where it shouldn't or they don't get unspawned when match start.
*/
@Override
protected boolean needBuffers()
{
return false;
}
@Override
protected final boolean portPlayersToArena(List spawns)
{
boolean result = true;
try
{
for (int i = 0; i < _teamOneSize; i++)
{
result &= portPlayerToArena(_teamOne[i], spawns.get(i), _stadiumID);
}
final int offset = spawns.size() / 2;
for (int i = 0; i < _teamTwoSize; i++)
{
result &= portPlayerToArena(_teamTwo[i], spawns.get(i + offset), _stadiumID);
}
}
catch (Exception e)
{
_log.log(Level.WARNING, "", e);
return false;
}
return result;
}
@Override
protected final void removals()
{
for (int i = _teamOneSize; --i >= 0;)
{
removals(_teamOne[i].getPlayer(), false);
}
for (int i = _teamTwoSize; --i >= 0;)
{
removals(_teamTwo[i].getPlayer(), false);
}
}
@Override
protected final boolean makeCompetitionStart()
{
if (!super.makeCompetitionStart())
{
return false;
}
Participant par;
for (int i = 0; i < _teamOneSize; i++)
{
par = _teamOne[i];
if (par.getPlayer() == null)
{
return false;
}
par.getPlayer().setIsOlympiadStart(true);
par.getPlayer().updateEffectIcons();
}
for (int i = 0; i < _teamTwoSize; i++)
{
par = _teamTwo[i];
if (par.getPlayer() == null)
{
return false;
}
par.getPlayer().setIsOlympiadStart(true);
par.getPlayer().updateEffectIcons();
}
return true;
}
@Override
protected final void cleanEffects()
{
Participant par;
for (int i = _teamOneSize; --i >= 0;)
{
par = _teamOne[i];
if ((par.getPlayer() != null) && !par.isDefaulted() && !par.isDisconnected() && (par.getPlayer().getOlympiadGameId() == _stadiumID))
{
cleanEffects(par.getPlayer());
}
}
for (int i = _teamTwoSize; --i >= 0;)
{
par = _teamTwo[i];
if ((par.getPlayer() != null) && !par.isDefaulted() && !par.isDisconnected() && (par.getPlayer().getOlympiadGameId() == _stadiumID))
{
cleanEffects(par.getPlayer());
}
}
}
@Override
protected final void portPlayersBack()
{
Participant par;
for (int i = _teamOneSize; --i >= 0;)
{
par = _teamOne[i];
if ((par.getPlayer() != null) && !par.isDefaulted() && !par.isDisconnected())
{
portPlayerBack(par.getPlayer());
}
}
for (int i = _teamTwoSize; --i >= 0;)
{
par = _teamTwo[i];
if ((par.getPlayer() != null) && !par.isDefaulted() && !par.isDisconnected())
{
portPlayerBack(par.getPlayer());
}
}
}
@Override
protected final void playersStatusBack()
{
Participant par;
for (int i = _teamOneSize; --i >= 0;)
{
par = _teamOne[i];
if ((par.getPlayer() != null) && !par.isDefaulted() && !par.isDisconnected() && (par.getPlayer().getOlympiadGameId() == _stadiumID))
{
playerStatusBack(par.getPlayer());
}
}
for (int i = _teamTwoSize; --i >= 0;)
{
par = _teamTwo[i];
if ((par.getPlayer() != null) && !par.isDefaulted() && !par.isDisconnected() && (par.getPlayer().getOlympiadGameId() == _stadiumID))
{
playerStatusBack(par.getPlayer());
}
}
}
@Override
protected final void clearPlayers()
{
for (int i = 0; i < MAX_TEAM_SIZE; i++)
{
if (i < _teamOneSize)
{
_teamOne[i].setPlayer(null);
}
else
{
IdFactory.getInstance().releaseId(_teamOne[i].getObjectId());
}
if (i < _teamTwoSize)
{
_teamTwo[i].setPlayer(null);
}
else
{
IdFactory.getInstance().releaseId(_teamTwo[i].getObjectId());
}
_teamOne[i] = null;
_teamTwo[i] = null;
}
}
@Override
protected final void handleDisconnect(L2PcInstance player)
{
Participant par;
for (int i = _teamOneSize; --i >= 0;)
{
par = _teamOne[i];
if (par.getObjectId() == player.getObjectId())
{
par.setDisconnected(true);
return;
}
}
for (int i = _teamTwoSize; --i >= 0;)
{
par = _teamTwo[i];
if (par.getObjectId() == player.getObjectId())
{
par.setDisconnected(true);
return;
}
}
}
@Override
protected final boolean haveWinner()
{
if (!checkBattleStatus())
{
return true;
}
boolean teamOneLost = true;
boolean teamTwoLost = true;
Participant par;
for (int i = _teamOneSize; --i >= 0;)
{
par = _teamOne[i];
if (!par.isDisconnected())
{
if ((par.getPlayer() != null) && (par.getPlayer().getOlympiadGameId() == _stadiumID))
{
teamOneLost &= par.getPlayer().isDead();
}
}
}
for (int i = _teamTwoSize; --i >= 0;)
{
par = _teamTwo[i];
if (!par.isDisconnected())
{
if ((par.getPlayer() != null) && (par.getPlayer().getOlympiadGameId() == _stadiumID))
{
teamTwoLost &= par.getPlayer().isDead();
}
}
}
return teamOneLost || teamTwoLost;
}
@Override
protected final boolean checkBattleStatus()
{
if (_aborted)
{
return false;
}
if (teamOneAllDisconnected())
{
return false;
}
if (teamTwoAllDisconnected())
{
return false;
}
return true;
}
@Override
protected void validateWinner(L2OlympiadStadiumZone stadium)
{
if (_aborted)
{
return;
}
ExOlympiadMatchResult result = null;
boolean tie = false;
int winside = 0;
List list1 = new ArrayList<>(3);
List list2 = new ArrayList<>(3);
final boolean tOneCrash = teamOneAllDisconnected();
final boolean tTwoCrash = teamTwoAllDisconnected();
Participant par;
SystemMessage sm;
int points;
// Check for if a team defaulted before battle started
if (_teamOneDefaulted || _teamTwoDefaulted)
{
try
{
if (_teamOneDefaulted)
{
for (int i = _teamOneSize; --i >= 0;)
{
par = _teamOne[i];
points = par.getStats().getInt(POINTS) / getDivider();
int val = Math.min(par.getStats().getInt(POINTS) / 3, Config.ALT_OLY_MAX_POINTS);
removePointsFromParticipant(par, val);
list1.add(new OlympiadInfo(par.getName(), par.getClanName(), par.getClanId(), par.getBaseClass(), _damageT1, points - val, -val));
}
winside = 2;
}
if (_teamTwoDefaulted)
{
for (int i = _teamTwoSize; --i >= 0;)
{
par = _teamTwo[i];
points = par.getStats().getInt(POINTS) / getDivider();
int val = Math.min(par.getStats().getInt(POINTS) / 3, Config.ALT_OLY_MAX_POINTS);
removePointsFromParticipant(par, val);
list2.add(new OlympiadInfo(par.getName(), par.getClanName(), par.getClanId(), par.getBaseClass(), _damageT2, points - val, -val));
}
if (winside == 2)
{
tie = true;
}
else
{
winside = 1;
}
}
if (winside == 1)
{
result = new ExOlympiadMatchResult(tie, winside, list1, list2);
}
else
{
result = new ExOlympiadMatchResult(tie, winside, list2, list1);
}
stadium.broadcastPacket(result);
}
catch (Exception e)
{
_log.log(Level.WARNING, "Exception on validateWinner(): " + e.getMessage(), e);
}
return;
}
// points to be dedicted in case of losing
final int[] pointsTeamOne = new int[_teamOneSize];
final int[] pointsTeamTwo = new int[_teamTwoSize];
final int[] maxPointsTeamOne = new int[_teamOneSize];
final int[] maxPointsTeamTwo = new int[_teamTwoSize];
int totalPointsTeamOne = 0;
int totalPointsTeamTwo = 0;
for (int i = 0; i < _teamOneSize; i++)
{
points = _teamOne[i].getStats().getInt(POINTS) / getDivider();
if (points <= 0)
{
points = 1;
}
else if (points > Config.ALT_OLY_MAX_POINTS)
{
points = Config.ALT_OLY_MAX_POINTS;
}
totalPointsTeamOne += points;
pointsTeamOne[i] = points;
maxPointsTeamOne[i] = points;
}
for (int i = _teamTwoSize; --i >= 0;)
{
points = _teamTwo[i].getStats().getInt(POINTS) / getDivider();
if (points <= 0)
{
points = 1;
}
else if (points > Config.ALT_OLY_MAX_POINTS)
{
points = Config.ALT_OLY_MAX_POINTS;
}
totalPointsTeamTwo += points;
pointsTeamTwo[i] = points;
maxPointsTeamTwo[i] = points;
}
// Choose minimum sum
int min = Math.min(totalPointsTeamOne, totalPointsTeamTwo);
// make sure all team members got same number of the points: round down to 3x
min = (min / MAX_TEAM_SIZE) * MAX_TEAM_SIZE;
// calculating coefficients and trying to correct total number of points for each team
// due to rounding errors total points after correction will always be lower or equal
// than needed minimal sum
final double dividerOne = (double) totalPointsTeamOne / min;
final double dividerTwo = (double) totalPointsTeamTwo / min;
totalPointsTeamOne = min;
totalPointsTeamTwo = min;
for (int i = 0; i < _teamOneSize; i++)
{
points = Math.max((int) (pointsTeamOne[i] / dividerOne), 1);
pointsTeamOne[i] = points;
totalPointsTeamOne -= points;
}
for (int i = _teamTwoSize; --i >= 0;)
{
points = Math.max((int) (pointsTeamTwo[i] / dividerTwo), 1);
pointsTeamTwo[i] = points;
totalPointsTeamTwo -= points;
}
// compensating remaining points, first team from begin to end, second from end to begin
for (int i = 0; (totalPointsTeamOne > 0) && (i < _teamOneSize); i++)
{
if (pointsTeamOne[i] < maxPointsTeamOne[i])
{
pointsTeamOne[i]++;
totalPointsTeamOne--;
}
}
for (int i = _teamTwoSize; (totalPointsTeamTwo > 0) && (--i >= 0);)
{
if (pointsTeamTwo[i] < maxPointsTeamTwo[i])
{
pointsTeamTwo[i]++;
totalPointsTeamTwo--;
}
}
// Create results for players if a team crashed
if (tOneCrash || tTwoCrash)
{
try
{
if (tTwoCrash && !tOneCrash)
{
sm = SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_WON_THE_GAME);
sm.addString(_teamOne[0].getName());
stadium.broadcastPacket(sm);
for (int i = 0; i < _teamTwoSize; i++)
{
par = _teamTwo[i];
par.updateStat(COMP_LOST, 1);
points = pointsTeamTwo[i];
removePointsFromParticipant(par, points);
list2.add(new OlympiadInfo(par.getName(), par.getClanName(), par.getClanId(), par.getBaseClass(), _damageT2, par.getStats().getInt(POINTS) - points, -points));
}
points = min / MAX_TEAM_SIZE;
for (int i = 0; i < _teamOneSize; i++)
{
par = _teamOne[i];
par.updateStat(COMP_WON, 1);
addPointsToParticipant(par, points);
list1.add(new OlympiadInfo(par.getName(), par.getClanName(), par.getClanId(), par.getBaseClass(), _damageT1, par.getStats().getInt(POINTS) + points, points));
}
for (int i = 0; i < _teamOneSize; i++)
{
rewardParticipant(_teamOne[i].getPlayer(), getReward());
}
winside = 1;
}
else if (tOneCrash && !tTwoCrash)
{
sm = SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_WON_THE_GAME);
sm.addString(_teamTwo[0].getName());
stadium.broadcastPacket(sm);
for (int i = 0; i < _teamOneSize; i++)
{
par = _teamOne[i];
par.updateStat(COMP_LOST, 1);
points = pointsTeamOne[i];
removePointsFromParticipant(par, points);
list1.add(new OlympiadInfo(par.getName(), par.getClanName(), par.getClanId(), par.getBaseClass(), _damageT1, par.getStats().getInt(POINTS) - points, -points));
}
points = min / MAX_TEAM_SIZE;
for (int i = 0; i < _teamTwoSize; i++)
{
par = _teamTwo[i];
par.updateStat(COMP_WON, 1);
addPointsToParticipant(par, points);
list2.add(new OlympiadInfo(par.getName(), par.getClanName(), par.getClanId(), par.getBaseClass(), _damageT2, par.getStats().getInt(POINTS) + points, points));
}
winside = 2;
for (int i = 0; i < _teamTwoSize; i++)
{
rewardParticipant(_teamTwo[i].getPlayer(), getReward());
}
}
else if (tOneCrash && tTwoCrash)
{
stadium.broadcastPacket(SystemMessage.getSystemMessage(SystemMessageId.THE_GAME_ENDED_IN_A_TIE));
for (int i = _teamOneSize; --i >= 0;)
{
par = _teamOne[i];
par.updateStat(COMP_LOST, 1);
removePointsFromParticipant(par, pointsTeamOne[i]);
list1.add(new OlympiadInfo(par.getName(), par.getClanName(), par.getClanId(), par.getBaseClass(), _damageT1, par.getStats().getInt(POINTS) - pointsTeamOne[i], -pointsTeamOne[i]));
}
for (int i = _teamTwoSize; --i >= 0;)
{
par = _teamTwo[i];
par.updateStat(COMP_LOST, 1);
removePointsFromParticipant(par, pointsTeamTwo[i]);
list2.add(new OlympiadInfo(par.getName(), par.getClanName(), par.getClanId(), par.getBaseClass(), _damageT2, par.getStats().getInt(POINTS) - pointsTeamOne[i], -pointsTeamOne[i]));
}
tie = true;
}
for (int i = _teamOneSize; --i >= 0;)
{
par = _teamOne[i];
par.updateStat(COMP_DONE, 1);
par.updateStat(COMP_DONE_WEEK, 1);
par.updateStat(getWeeklyMatchType(), 1);
}
for (int i = _teamTwoSize; --i >= 0;)
{
par = _teamTwo[i];
par.updateStat(COMP_DONE, 1);
par.updateStat(COMP_DONE_WEEK, 1);
par.updateStat(getWeeklyMatchType(), 1);
}
}
catch (Exception e)
{
_log.log(Level.WARNING, "Exception on validateWinner(): " + e.getMessage(), e);
}
if (winside == 1)
{
result = new ExOlympiadMatchResult(tie, winside, list1, list2);
}
else
{
result = new ExOlympiadMatchResult(tie, winside, list2, list1);
}
stadium.broadcastPacket(result);
return;
}
try
{
double hp;
double teamOneHp = 0;
double teamTwoHp = 0;
for (int i = _teamOneSize; --i >= 0;)
{
par = _teamOne[i];
if (!par.isDisconnected() && (par.getPlayer() != null) && !par.getPlayer().isDead())
{
hp = par.getPlayer().getCurrentHp() + par.getPlayer().getCurrentCp();
if (hp >= 0.5)
{
teamOneHp += hp;
}
}
par.updatePlayer();
}
for (int i = _teamTwoSize; --i >= 0;)
{
par = _teamTwo[i];
if (!par.isDisconnected() && (par.getPlayer() != null) && !par.getPlayer().isDead())
{
hp = par.getPlayer().getCurrentHp() + par.getPlayer().getCurrentCp();
if (hp >= 0.5)
{
teamTwoHp += hp;
}
}
par.updatePlayer();
}
if (((teamTwoHp == 0) && (teamOneHp != 0)) || ((_damageT1 > _damageT2) && (teamTwoHp != 0) && (teamOneHp != 0)))
{
sm = SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_WON_THE_GAME);
sm.addString(_teamOne[0].getName());
stadium.broadcastPacket(sm);
for (int i = 0; i < _teamTwoSize; i++)
{
par = _teamTwo[i];
par.updateStat(COMP_LOST, 1);
points = pointsTeamTwo[i];
removePointsFromParticipant(par, points);
list2.add(new OlympiadInfo(par.getName(), par.getClanName(), par.getClanId(), par.getBaseClass(), _damageT2, par.getStats().getInt(POINTS) - points, -points));
}
points = min / MAX_TEAM_SIZE;
for (int i = 0; i < _teamOneSize; i++)
{
par = _teamOne[i];
par.updateStat(COMP_WON, 1);
addPointsToParticipant(par, points);
list1.add(new OlympiadInfo(par.getName(), par.getClanName(), par.getClanId(), par.getBaseClass(), _damageT1, par.getStats().getInt(POINTS) + points, points));
}
winside = 1;
for (int i = 0; i < _teamOneSize; i++)
{
rewardParticipant(_teamOne[i].getPlayer(), getReward());
}
}
else if (((teamOneHp == 0) && (teamTwoHp != 0)) || ((_damageT2 > _damageT1) && (teamOneHp != 0) && (teamTwoHp != 0)))
{
sm = SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_WON_THE_GAME);
sm.addString(_teamTwo[0].getName());
stadium.broadcastPacket(sm);
for (int i = 0; i < _teamOneSize; i++)
{
par = _teamOne[i];
par.updateStat(COMP_LOST, 1);
points = pointsTeamOne[i];
removePointsFromParticipant(par, points);
list1.add(new OlympiadInfo(par.getName(), par.getClanName(), par.getClanId(), par.getBaseClass(), _damageT1, par.getStats().getInt(POINTS) - points, -points));
}
points = min / MAX_TEAM_SIZE;
for (int i = 0; i < _teamTwoSize; i++)
{
par = _teamTwo[i];
par.updateStat(COMP_WON, 1);
addPointsToParticipant(par, points);
list2.add(new OlympiadInfo(par.getName(), par.getClanName(), par.getClanId(), par.getBaseClass(), _damageT2, par.getStats().getInt(POINTS) + points, points));
}
winside = 2;
for (int i = 0; i < _teamTwoSize; i++)
{
rewardParticipant(_teamTwo[i].getPlayer(), getReward());
}
}
else
{
stadium.broadcastPacket(SystemMessage.getSystemMessage(SystemMessageId.THE_GAME_ENDED_IN_A_TIE));
for (int i = 0; i < _teamOneSize; i++)
{
par = _teamOne[i];
par.updateStat(COMP_DRAWN, 1);
points = Math.min(par.getStats().getInt(POINTS) / getDivider(), Config.ALT_OLY_MAX_POINTS);
removePointsFromParticipant(par, points);
list1.add(new OlympiadInfo(par.getName(), par.getClanName(), par.getClanId(), par.getBaseClass(), _damageT1, par.getStats().getInt(POINTS) - points, -points));
}
for (int i = 0; i < _teamTwoSize; i++)
{
par = _teamTwo[i];
par.updateStat(COMP_DRAWN, 1);
points = Math.min(par.getStats().getInt(POINTS) / getDivider(), Config.ALT_OLY_MAX_POINTS);
removePointsFromParticipant(par, points);
list2.add(new OlympiadInfo(par.getName(), par.getClanName(), par.getClanId(), par.getBaseClass(), _damageT2, par.getStats().getInt(POINTS) - points, -points));
}
tie = true;
}
for (int i = _teamOneSize; --i >= 0;)
{
par = _teamOne[i];
par.updateStat(COMP_DONE, 1);
par.updateStat(COMP_DONE_WEEK, 1);
par.updateStat(getWeeklyMatchType(), 1);
}
for (int i = _teamTwoSize; --i >= 0;)
{
par = _teamTwo[i];
par.updateStat(COMP_DONE, 1);
par.updateStat(COMP_DONE_WEEK, 1);
par.updateStat(getWeeklyMatchType(), 1);
}
if (winside == 1)
{
result = new ExOlympiadMatchResult(tie, winside, list1, list2);
}
else
{
result = new ExOlympiadMatchResult(tie, winside, list2, list1);
}
stadium.broadcastPacket(result);
}
catch (Exception e)
{
_log.log(Level.WARNING, "Exception on validateWinner(): " + e.getMessage(), e);
}
}
/**
* UnAfraid: TODO: We should calculate the damage in array separately for each player so we can display it on ExOlympiadMatchResult correctly.
*/
@Override
protected final void addDamage(L2PcInstance player, int damage)
{
Participant par;
for (int i = _teamOneSize; --i >= 0;)
{
par = _teamOne[i];
if (par.getObjectId() == player.getObjectId())
{
if (!par.isDisconnected())
{
_damageT1 += damage;
}
return;
}
}
for (int i = _teamTwoSize; --i >= 0;)
{
par = _teamTwo[i];
if (par.getObjectId() == player.getObjectId())
{
if (!par.isDisconnected())
{
_damageT2 += damage;
}
return;
}
}
}
@Override
public final String[] getPlayerNames()
{
return new String[]
{
_teamOne[0].getName(),
_teamTwo[0].getName()
};
}
@Override
public final boolean checkDefaulted()
{
try
{
SystemMessage reason = null;
Participant par;
for (int i = _teamOneSize; --i >= 0;)
{
par = _teamOne[i];
par.updatePlayer();
reason = checkDefaulted(par.getPlayer());
if (reason != null)
{
par.setDefaulted(true);
if (!_teamOneDefaulted)
{
_teamOneDefaulted = true;
for (Participant t : _teamTwo)
{
if (t.getPlayer() != null)
{
t.getPlayer().sendPacket(reason);
}
}
}
}
}
reason = null;
for (int i = _teamTwoSize; --i >= 0;)
{
par = _teamTwo[i];
par.updatePlayer();
reason = checkDefaulted(par.getPlayer());
if (reason != null)
{
par.setDefaulted(true);
if (!_teamTwoDefaulted)
{
_teamTwoDefaulted = true;
for (Participant t : _teamOne)
{
if (t.getPlayer() != null)
{
t.getPlayer().sendPacket(reason);
}
}
}
}
}
return _teamOneDefaulted || _teamTwoDefaulted;
}
catch (Exception e)
{
_log.log(Level.WARNING, "Exception on checkDefaulted(): " + e.getMessage(), e);
return true;
}
}
@Override
public final void resetDamage()
{
_damageT1 = 0;
_damageT2 = 0;
}
protected final boolean teamOneAllDisconnected()
{
for (int i = _teamOneSize; --i >= 0;)
{
if (!_teamOne[i].isDisconnected())
{
return false;
}
}
return true;
}
protected final boolean teamTwoAllDisconnected()
{
for (int i = _teamTwoSize; --i >= 0;)
{
if (!_teamTwo[i].isDisconnected())
{
return false;
}
}
return true;
}
}