123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510 |
- /*
- * 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 <http://www.gnu.org/licenses/>.
- */
- package com.l2jserver.gameserver.model.olympiad;
- import java.util.List;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- import com.l2jserver.Config;
- import com.l2jserver.gameserver.ai.CtrlIntention;
- import com.l2jserver.gameserver.datatables.SkillTreesData;
- import com.l2jserver.gameserver.instancemanager.AntiFeedManager;
- import com.l2jserver.gameserver.instancemanager.CastleManager;
- import com.l2jserver.gameserver.instancemanager.FortManager;
- import com.l2jserver.gameserver.model.L2Party;
- import com.l2jserver.gameserver.model.L2Party.messageType;
- import com.l2jserver.gameserver.model.Location;
- 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.entity.TvTEvent;
- import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
- import com.l2jserver.gameserver.model.skills.Skill;
- import com.l2jserver.gameserver.model.zone.type.L2OlympiadStadiumZone;
- import com.l2jserver.gameserver.network.SystemMessageId;
- import com.l2jserver.gameserver.network.serverpackets.ExOlympiadMode;
- import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate;
- import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
- import com.l2jserver.gameserver.network.serverpackets.SkillCoolTime;
- import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
- /**
- * @author godson, GodKratos, Pere, DS
- */
- public abstract class AbstractOlympiadGame
- {
- protected static final Logger _log = Logger.getLogger(AbstractOlympiadGame.class.getName());
- protected static final Logger _logResults = Logger.getLogger("olympiad");
-
- protected static final String POINTS = "olympiad_points";
- protected static final String COMP_DONE = "competitions_done";
- protected static final String COMP_WON = "competitions_won";
- protected static final String COMP_LOST = "competitions_lost";
- protected static final String COMP_DRAWN = "competitions_drawn";
- protected static final String COMP_DONE_WEEK = "competitions_done_week";
- protected static final String COMP_DONE_WEEK_CLASSED = "competitions_done_week_classed";
- protected static final String COMP_DONE_WEEK_NON_CLASSED = "competitions_done_week_non_classed";
- protected static final String COMP_DONE_WEEK_TEAM = "competitions_done_week_team";
-
- protected long _startTime = 0;
- protected boolean _aborted = false;
- protected final int _stadiumID;
-
- protected AbstractOlympiadGame(int id)
- {
- _stadiumID = id;
- }
-
- public final boolean isAborted()
- {
- return _aborted;
- }
-
- public final int getStadiumId()
- {
- return _stadiumID;
- }
-
- protected boolean makeCompetitionStart()
- {
- _startTime = System.currentTimeMillis();
- return !_aborted;
- }
-
- protected final void addPointsToParticipant(Participant par, int points)
- {
- par.updateStat(POINTS, points);
- final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_GAINED_S2_OLYMPIAD_POINTS);
- sm.addString(par.getName());
- sm.addInt(points);
- broadcastPacket(sm);
- }
-
- protected final void removePointsFromParticipant(Participant par, int points)
- {
- par.updateStat(POINTS, -points);
- final SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.C1_HAS_LOST_S2_OLYMPIAD_POINTS);
- sm.addString(par.getName());
- sm.addInt(points);
- broadcastPacket(sm);
- }
-
- /**
- * Function return null if player passed all checks or SystemMessage with reason for broadcast to opponent(s).
- * @param player
- * @return
- */
- protected static SystemMessage checkDefaulted(L2PcInstance player)
- {
- if ((player == null) || !player.isOnline())
- {
- return SystemMessage.getSystemMessage(SystemMessageId.THE_GAME_HAS_BEEN_CANCELLED_BECAUSE_THE_OTHER_PARTY_ENDS_THE_GAME);
- }
-
- if ((player.getClient() == null) || player.getClient().isDetached())
- {
- return SystemMessage.getSystemMessage(SystemMessageId.THE_GAME_HAS_BEEN_CANCELLED_BECAUSE_THE_OTHER_PARTY_ENDS_THE_GAME);
- }
-
- // safety precautions
- if (player.inObserverMode() || TvTEvent.isPlayerParticipant(player.getObjectId()))
- {
- return SystemMessage.getSystemMessage(SystemMessageId.THE_GAME_HAS_BEEN_CANCELLED_BECAUSE_THE_OTHER_PARTY_DOES_NOT_MEET_THE_REQUIREMENTS_FOR_JOINING_THE_GAME);
- }
-
- SystemMessage sm;
- if (player.isDead())
- {
- sm = SystemMessage.getSystemMessage(SystemMessageId.C1_CANNOT_PARTICIPATE_OLYMPIAD_WHILE_DEAD);
- sm.addPcName(player);
- player.sendPacket(sm);
- return SystemMessage.getSystemMessage(SystemMessageId.THE_GAME_HAS_BEEN_CANCELLED_BECAUSE_THE_OTHER_PARTY_DOES_NOT_MEET_THE_REQUIREMENTS_FOR_JOINING_THE_GAME);
- }
- if (player.isSubClassActive())
- {
- sm = SystemMessage.getSystemMessage(SystemMessageId.C1_CANNOT_PARTICIPATE_IN_OLYMPIAD_WHILE_CHANGED_TO_SUB_CLASS);
- sm.addPcName(player);
- player.sendPacket(sm);
- return SystemMessage.getSystemMessage(SystemMessageId.THE_GAME_HAS_BEEN_CANCELLED_BECAUSE_THE_OTHER_PARTY_DOES_NOT_MEET_THE_REQUIREMENTS_FOR_JOINING_THE_GAME);
- }
- if (player.isCursedWeaponEquipped())
- {
- sm = SystemMessage.getSystemMessage(SystemMessageId.C1_CANNOT_JOIN_OLYMPIAD_POSSESSING_S2);
- sm.addPcName(player);
- sm.addItemName(player.getCursedWeaponEquippedId());
- player.sendPacket(sm);
- return SystemMessage.getSystemMessage(SystemMessageId.THE_GAME_HAS_BEEN_CANCELLED_BECAUSE_THE_OTHER_PARTY_DOES_NOT_MEET_THE_REQUIREMENTS_FOR_JOINING_THE_GAME);
- }
- if (!player.isInventoryUnder90(true))
- {
- sm = SystemMessage.getSystemMessage(SystemMessageId.C1_CANNOT_PARTICIPATE_IN_OLYMPIAD_INVENTORY_SLOT_EXCEEDS_80_PERCENT);
- sm.addPcName(player);
- player.sendPacket(sm);
- return SystemMessage.getSystemMessage(SystemMessageId.THE_GAME_HAS_BEEN_CANCELLED_BECAUSE_THE_OTHER_PARTY_DOES_NOT_MEET_THE_REQUIREMENTS_FOR_JOINING_THE_GAME);
- }
-
- return null;
- }
-
- protected static final boolean portPlayerToArena(Participant par, Location loc, int id)
- {
- final L2PcInstance player = par.getPlayer();
- if ((player == null) || !player.isOnline())
- {
- return false;
- }
-
- try
- {
- player.setLastLocation();
- if (player.isSitting())
- {
- player.standUp();
- }
- player.setTarget(null);
-
- player.setOlympiadGameId(id);
- player.setIsInOlympiadMode(true);
- player.setIsOlympiadStart(false);
- player.setOlympiadSide(par.getSide());
- player.olyBuff = 5;
- loc.setInstanceId(OlympiadGameManager.getInstance().getOlympiadTask(id).getZone().getInstanceId());
- player.teleToLocation(loc, false);
- player.sendPacket(new ExOlympiadMode(2));
- }
- catch (Exception e)
- {
- _log.log(Level.WARNING, e.getMessage(), e);
- return false;
- }
- return true;
- }
-
- protected static final void removals(L2PcInstance player, boolean removeParty)
- {
- try
- {
- if (player == null)
- {
- return;
- }
-
- // Remove Buffs
- player.stopAllEffectsExceptThoseThatLastThroughDeath();
-
- // Remove Clan Skills
- if (player.getClan() != null)
- {
- player.getClan().removeSkillEffects(player);
- if (player.getClan().getCastleId() > 0)
- {
- CastleManager.getInstance().getCastleByOwner(player.getClan()).removeResidentialSkills(player);
- }
- if (player.getClan().getFortId() > 0)
- {
- FortManager.getInstance().getFortByOwner(player.getClan()).removeResidentialSkills(player);
- }
- }
- // Abort casting if player casting
- player.abortAttack();
- player.abortCast();
-
- // Force the character to be visible
- player.setInvisible(false);
-
- // Remove Hero Skills
- if (player.isHero())
- {
- for (Skill skill : SkillTreesData.getInstance().getHeroSkillTree().values())
- {
- player.removeSkill(skill, false);
- }
- }
-
- // Heal Player fully
- player.setCurrentCp(player.getMaxCp());
- player.setCurrentHp(player.getMaxHp());
- player.setCurrentMp(player.getMaxMp());
-
- // Remove Summon's Buffs
- if (player.hasSummon())
- {
- final L2Summon summon = player.getSummon();
- summon.stopAllEffectsExceptThoseThatLastThroughDeath();
- summon.abortAttack();
- summon.abortCast();
-
- if (summon.isPet())
- {
- summon.unSummon(player);
- }
- }
-
- // stop any cubic that has been given by other player.
- player.stopCubicsByOthers();
-
- // Remove player from his party
- if (removeParty)
- {
- final L2Party party = player.getParty();
- if (party != null)
- {
- party.removePartyMember(player, messageType.Expelled);
- }
- }
- // Remove Agathion
- if (player.getAgathionId() > 0)
- {
- player.setAgathionId(0);
- player.broadcastUserInfo();
- }
-
- player.checkItemRestriction();
-
- // Remove shot automation
- player.disableAutoShotsAll();
-
- // Discharge any active shots
- L2ItemInstance item = player.getActiveWeaponInstance();
- if (item != null)
- {
- item.unChargeAllShots();
- }
-
- // enable skills with cool time <= 15 minutes
- for (Skill skill : player.getAllSkills())
- {
- if (skill.getReuseDelay() <= 900000)
- {
- player.enableSkill(skill);
- }
- }
-
- player.sendSkillList();
- player.sendPacket(new SkillCoolTime(player));
- }
- catch (Exception e)
- {
- _log.log(Level.WARNING, e.getMessage(), e);
- }
- }
-
- protected static final void cleanEffects(L2PcInstance player)
- {
- try
- {
- // prevent players kill each other
- player.setIsOlympiadStart(false);
- player.setTarget(null);
- player.abortAttack();
- player.abortCast();
- player.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
-
- if (player.isDead())
- {
- player.setIsDead(false);
- }
-
- player.stopAllEffectsExceptThoseThatLastThroughDeath();
- player.clearSouls();
- player.clearCharges();
- if (player.getAgathionId() > 0)
- {
- player.setAgathionId(0);
- }
- final L2Summon summon = player.getSummon();
- if ((summon != null) && !summon.isDead())
- {
- summon.setTarget(null);
- summon.abortAttack();
- summon.abortCast();
- summon.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
- summon.stopAllEffectsExceptThoseThatLastThroughDeath();
- }
-
- player.setCurrentCp(player.getMaxCp());
- player.setCurrentHp(player.getMaxHp());
- player.setCurrentMp(player.getMaxMp());
- player.getStatus().startHpMpRegeneration();
- }
- catch (Exception e)
- {
- _log.log(Level.WARNING, e.getMessage(), e);
- }
- }
-
- protected static final void playerStatusBack(L2PcInstance player)
- {
- try
- {
- if (player.isTransformed())
- {
- player.untransform();
- }
-
- player.setIsInOlympiadMode(false);
- player.setIsOlympiadStart(false);
- player.setOlympiadSide(-1);
- player.setOlympiadGameId(-1);
- player.sendPacket(new ExOlympiadMode(0));
-
- // Add Clan Skills
- if (player.getClan() != null)
- {
- player.getClan().addSkillEffects(player);
- if (player.getClan().getCastleId() > 0)
- {
- CastleManager.getInstance().getCastleByOwner(player.getClan()).giveResidentialSkills(player);
- }
- if (player.getClan().getFortId() > 0)
- {
- FortManager.getInstance().getFortByOwner(player.getClan()).giveResidentialSkills(player);
- }
- }
-
- // Add Hero Skills
- if (player.isHero())
- {
- for (Skill skill : SkillTreesData.getInstance().getHeroSkillTree().values())
- {
- player.addSkill(skill, false);
- }
- }
- player.sendSkillList();
-
- // heal again after adding clan skills
- player.setCurrentCp(player.getMaxCp());
- player.setCurrentHp(player.getMaxHp());
- player.setCurrentMp(player.getMaxMp());
- player.getStatus().startHpMpRegeneration();
-
- if (Config.L2JMOD_DUALBOX_CHECK_MAX_OLYMPIAD_PARTICIPANTS_PER_IP > 0)
- {
- AntiFeedManager.getInstance().removePlayer(AntiFeedManager.OLYMPIAD_ID, player);
- }
- }
- catch (Exception e)
- {
- _log.log(Level.WARNING, "portPlayersToArena()", e);
- }
- }
-
- protected static final void portPlayerBack(L2PcInstance player)
- {
- if (player == null)
- {
- return;
- }
- final Location loc = player.getLastLocation();
- if ((loc.getX() == 0) && (loc.getY() == 0))
- {
- return;
- }
-
- player.setInstanceId(0);
- player.teleToLocation(loc);
- player.unsetLastLocation();
- }
-
- 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 = SystemMessage.getSystemMessage(SystemMessageId.EARNED_S2_S1_S);
- sm.addItemName(it[0]);
- sm.addInt(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();
-
- public abstract boolean containsParticipant(int playerId);
-
- public abstract void sendOlympiadInfo(L2Character player);
-
- public abstract void broadcastOlympiadInfo(L2OlympiadStadiumZone stadium);
-
- protected abstract void broadcastPacket(L2GameServerPacket packet);
-
- protected abstract boolean needBuffers();
-
- protected abstract boolean checkDefaulted();
-
- protected abstract void removals();
-
- protected abstract boolean portPlayersToArena(List<Location> spawns);
-
- protected abstract void cleanEffects();
-
- protected abstract void portPlayersBack();
-
- protected abstract void playersStatusBack();
-
- protected abstract void clearPlayers();
-
- protected abstract void handleDisconnect(L2PcInstance player);
-
- protected abstract void resetDamage();
-
- protected abstract void addDamage(L2PcInstance player, int damage);
-
- protected abstract boolean checkBattleStatus();
-
- protected abstract boolean haveWinner();
-
- protected abstract void validateWinner(L2OlympiadStadiumZone stadium);
-
- protected abstract int getDivider();
-
- protected abstract int[][] getReward();
-
- protected abstract String getWeeklyMatchType();
- }
|