/*
* 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 lineage2.gameserver.network.clientpackets;
import java.util.Calendar;
import lineage2.gameserver.Announcements;
import lineage2.gameserver.Config;
import lineage2.gameserver.dao.MailDAO;
import lineage2.gameserver.data.StringHolder;
import lineage2.gameserver.data.xml.holder.ResidenceHolder;
import lineage2.gameserver.instancemanager.AwakingManager;
import lineage2.gameserver.instancemanager.CoupleManager;
import lineage2.gameserver.instancemanager.CursedWeaponsManager;
import lineage2.gameserver.instancemanager.PetitionManager;
import lineage2.gameserver.instancemanager.PlayerMessageStack;
import lineage2.gameserver.instancemanager.QuestManager;
import lineage2.gameserver.listener.actor.player.OnAnswerListener;
import lineage2.gameserver.listener.actor.player.impl.ReviveAnswerListener;
import lineage2.gameserver.model.Creature;
import lineage2.gameserver.model.Effect;
import lineage2.gameserver.model.GameObjectsStorage;
import lineage2.gameserver.model.Player;
import lineage2.gameserver.model.Skill;
import lineage2.gameserver.model.SubClass;
import lineage2.gameserver.model.Summon;
import lineage2.gameserver.model.World;
import lineage2.gameserver.model.base.InvisibleType;
import lineage2.gameserver.model.entity.events.impl.ClanHallAuctionEvent;
import lineage2.gameserver.model.entity.residence.Castle;
import lineage2.gameserver.model.entity.residence.ClanHall;
import lineage2.gameserver.model.items.ItemInstance;
import lineage2.gameserver.model.mail.Mail;
import lineage2.gameserver.model.pledge.Clan;
import lineage2.gameserver.model.pledge.SubUnit;
import lineage2.gameserver.model.pledge.UnitMember;
import lineage2.gameserver.model.quest.Quest;
import lineage2.gameserver.network.GameClient;
import lineage2.gameserver.network.serverpackets.ChangeWaitType;
import lineage2.gameserver.network.serverpackets.ClientSetTime;
import lineage2.gameserver.network.serverpackets.ConfirmDlg;
import lineage2.gameserver.network.serverpackets.Die;
import lineage2.gameserver.network.serverpackets.EtcStatusUpdate;
import lineage2.gameserver.network.serverpackets.ExAcquirableSkillListByClass;
import lineage2.gameserver.network.serverpackets.ExAutoSoulShot;
import lineage2.gameserver.network.serverpackets.ExBR_PremiumState;
import lineage2.gameserver.network.serverpackets.ExBasicActionList;
import lineage2.gameserver.network.serverpackets.ExCastleState;
import lineage2.gameserver.network.serverpackets.ExChangeMPCost;
import lineage2.gameserver.network.serverpackets.ExGoodsInventoryChangedNotify;
import lineage2.gameserver.network.serverpackets.ExMPCCOpen;
import lineage2.gameserver.network.serverpackets.ExNoticePostArrived;
import lineage2.gameserver.network.serverpackets.ExNotifyPremiumItem;
import lineage2.gameserver.network.serverpackets.ExPCCafePointInfo;
import lineage2.gameserver.network.serverpackets.ExReceiveShowPostFriend;
import lineage2.gameserver.network.serverpackets.ExSetCompassZoneCode;
import lineage2.gameserver.network.serverpackets.ExShowUsmVideo;
import lineage2.gameserver.network.serverpackets.ExStorageMaxCount;
import lineage2.gameserver.network.serverpackets.ExSubjobInfo;
import lineage2.gameserver.network.serverpackets.ExTutorialList;
import lineage2.gameserver.network.serverpackets.ExVitalityEffectInfo;
import lineage2.gameserver.network.serverpackets.ExWaitWaitingSubStituteInfo;
import lineage2.gameserver.network.serverpackets.HennaInfo;
import lineage2.gameserver.network.serverpackets.L2FriendList;
import lineage2.gameserver.network.serverpackets.L2GameServerPacket;
import lineage2.gameserver.network.serverpackets.MagicSkillLaunched;
import lineage2.gameserver.network.serverpackets.MagicSkillUse;
import lineage2.gameserver.network.serverpackets.PartySmallWindowAll;
import lineage2.gameserver.network.serverpackets.PartySpelled;
import lineage2.gameserver.network.serverpackets.PetInfo;
import lineage2.gameserver.network.serverpackets.PledgeShowInfoUpdate;
import lineage2.gameserver.network.serverpackets.PledgeShowMemberListUpdate;
import lineage2.gameserver.network.serverpackets.PledgeSkillList;
import lineage2.gameserver.network.serverpackets.PrivateStoreMsgBuy;
import lineage2.gameserver.network.serverpackets.PrivateStoreMsgSell;
import lineage2.gameserver.network.serverpackets.QuestList;
import lineage2.gameserver.network.serverpackets.RecipeShopMsg;
import lineage2.gameserver.network.serverpackets.RelationChanged;
import lineage2.gameserver.network.serverpackets.Ride;
import lineage2.gameserver.network.serverpackets.SSQInfo;
import lineage2.gameserver.network.serverpackets.ShortCutInit;
import lineage2.gameserver.network.serverpackets.SkillCoolTime;
import lineage2.gameserver.network.serverpackets.SkillList;
import lineage2.gameserver.network.serverpackets.SystemMessage2;
import lineage2.gameserver.network.serverpackets.components.SystemMsg;
import lineage2.gameserver.skills.AbnormalEffect;
import lineage2.gameserver.tables.SkillTable;
import lineage2.gameserver.templates.item.ItemTemplate;
import lineage2.gameserver.utils.GameStats;
import lineage2.gameserver.utils.ItemFunctions;
import lineage2.gameserver.utils.TradeHelper;
import org.apache.commons.lang3.tuple.Pair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author Mobius
* @version $Revision: 1.0 $
*/
public class EnterWorld extends L2GameClientPacket
{
/**
* Field _lock.
*/
private static final Object _lock = new Object();
/**
* Field _log.
*/
private static final Logger _log = LoggerFactory.getLogger(EnterWorld.class);
/**
* Method readImpl.
*/
@Override
protected void readImpl()
{
}
/**
* Method runImpl.
*/
@Override
protected void runImpl()
{
GameClient client = getClient();
Player activeChar = client.getActiveChar();
if (activeChar == null)
{
client.closeNow(false);
return;
}
int MyObjectId = activeChar.getObjectId();
Long MyStoreId = activeChar.getStoredId();
for(Castle castle : ResidenceHolder.getInstance().getResidenceList(Castle.class))
{
activeChar.sendPacket(new ExCastleState(castle));
}
synchronized (_lock)
{
for (Player cha : GameObjectsStorage.getAllPlayersForIterate())
{
if (MyStoreId.equals(cha.getStoredId()))
{
continue;
}
try
{
if (cha.getObjectId() == MyObjectId)
{
_log.warn("Double EnterWorld for char: " + activeChar.getName());
cha.kick();
}
}
catch (Exception e)
{
_log.error("", e);
}
}
}
GameStats.incrementPlayerEnterGame();
boolean first = activeChar.entering;
if (first)
{
activeChar.setOnlineStatus(true);
if (activeChar.getPlayerAccess().GodMode && !Config.SHOW_GM_LOGIN)
{
activeChar.setInvisibleType(InvisibleType.NORMAL);
}
activeChar.setNonAggroTime(Long.MAX_VALUE);
activeChar.spawnMe();
if (activeChar.isInStoreMode())
{
if (!TradeHelper.checksIfCanOpenStore(activeChar, activeChar.getPrivateStoreType()))
{
activeChar.setPrivateStoreType(Player.STORE_PRIVATE_NONE);
activeChar.standUp();
activeChar.broadcastCharInfo();
}
}
activeChar.setRunning();
activeChar.standUp();
activeChar.startTimers();
}
activeChar.sendPacket(new ExBR_PremiumState(activeChar, activeChar.hasBonus()));
activeChar.getMacroses().sendUpdate(0x01, 0, true);
activeChar.sendPacket(new SSQInfo(), new HennaInfo(activeChar));
activeChar.sendItemList(false);
activeChar.sendPacket(new ShortCutInit(activeChar));
activeChar.sendPacket(new ShortCutInit(activeChar), new SkillList(activeChar), new SkillCoolTime(activeChar));
activeChar.sendPacket(new SkillCoolTime(activeChar));
//activeChar.sendPacket(new ExCastleState(_castle));
activeChar.sendPacket(new ExVitalityEffectInfo(activeChar));
for(Castle castle : ResidenceHolder.getInstance().getResidenceList(Castle.class))
{
activeChar.sendPacket(new ExCastleState(castle));
}
activeChar.sendPacket(SystemMsg.WELCOME_TO_THE_WORLD_OF_LINEAGE_II);
Announcements.getInstance().showAnnouncements(activeChar);
if (first)
{
activeChar.getListeners().onEnter();
}
if (first && (activeChar.getCreateTime() > 0))
{
Calendar create = Calendar.getInstance();
create.setTimeInMillis(activeChar.getCreateTime());
Calendar now = Calendar.getInstance();
int day = create.get(Calendar.DAY_OF_MONTH);
if ((create.get(Calendar.MONTH) == Calendar.FEBRUARY) && (day == 29))
{
day = 28;
}
int myBirthdayReceiveYear = activeChar.getVarInt(Player.MY_BIRTHDAY_RECEIVE_YEAR, 0);
if ((create.get(Calendar.MONTH) == now.get(Calendar.MONTH)) && (create.get(Calendar.DAY_OF_MONTH) == day))
{
if (((myBirthdayReceiveYear == 0) && (create.get(Calendar.YEAR) != now.get(Calendar.YEAR))) || ((myBirthdayReceiveYear > 0) && (myBirthdayReceiveYear != now.get(Calendar.YEAR))))
{
Mail mail = new Mail();
mail.setSenderId(1);
mail.setSenderName(StringHolder.getInstance().getNotNull(activeChar, "birthday.npc"));
mail.setReceiverId(activeChar.getObjectId());
mail.setReceiverName(activeChar.getName());
mail.setTopic(StringHolder.getInstance().getNotNull(activeChar, "birthday.title"));
mail.setBody(StringHolder.getInstance().getNotNull(activeChar, "birthday.text"));
ItemInstance item = ItemFunctions.createItem(21169);
item.setLocation(ItemInstance.ItemLocation.MAIL);
item.setCount(1L);
item.save();
mail.addAttachment(item);
mail.setUnread(true);
mail.setType(Mail.SenderType.BIRTHDAY);
mail.setExpireTime((720 * 3600) + (int) (System.currentTimeMillis() / 1000L));
mail.save();
activeChar.setVar(Player.MY_BIRTHDAY_RECEIVE_YEAR, String.valueOf(now.get(Calendar.YEAR)), -1);
}
}
}
if (activeChar.getClan() != null)
{
notifyClanMembers(activeChar);
activeChar.sendPacket(activeChar.getClan().listAll());
activeChar.sendPacket(new PledgeShowInfoUpdate(activeChar.getClan()), new PledgeSkillList(activeChar.getClan()));
}
if (first && Config.ALLOW_WEDDING)
{
CoupleManager.getInstance().engage(activeChar);
CoupleManager.getInstance().notifyPartner(activeChar);
}
if (first)
{
activeChar.getFriendList().notifyFriends(true);
loadTutorial(activeChar);
activeChar.restoreDisableSkills();
activeChar.mentoringLoginConditions();
}
sendPacket(new L2FriendList(activeChar), new ExStorageMaxCount(activeChar), new QuestList(activeChar), new ExBasicActionList(activeChar), new EtcStatusUpdate(activeChar));
activeChar.checkHpMessages(activeChar.getMaxHp(), activeChar.getCurrentHp());
activeChar.checkDayNightMessages();
if (Config.PETITIONING_ALLOWED)
{
PetitionManager.getInstance().checkPetitionMessages(activeChar);
}
if (!first)
{
if (activeChar.isCastingNow())
{
Creature castingTarget = activeChar.getCastingTarget();
Skill castingSkill = activeChar.getCastingSkill();
long animationEndTime = activeChar.getAnimationEndTime();
if ((castingSkill != null) && (castingTarget != null) && castingTarget.isCreature() && (activeChar.getAnimationEndTime() > 0))
{
sendPacket(new MagicSkillUse(activeChar, castingTarget, castingSkill.getId(), castingSkill.getLevel(), (int) (animationEndTime - System.currentTimeMillis()), 0));
}
}
if (activeChar.isInBoat())
{
activeChar.sendPacket(activeChar.getBoat().getOnPacket(activeChar, activeChar.getInBoatPosition()));
}
if (activeChar.isMoving || activeChar.isFollow)
{
sendPacket(activeChar.movePacket());
}
if (activeChar.getMountNpcId() != 0)
{
sendPacket(new Ride(activeChar));
}
if (activeChar.isFishing())
{
activeChar.stopFishing();
}
}
activeChar.entering = false;
activeChar.sendUserInfo();
if (activeChar.isSitting())
{
activeChar.sendPacket(new ChangeWaitType(activeChar, ChangeWaitType.WT_SITTING));
}
if (activeChar.getPrivateStoreType() != Player.STORE_PRIVATE_NONE)
{
if (activeChar.getPrivateStoreType() == Player.STORE_PRIVATE_BUY)
{
sendPacket(new PrivateStoreMsgBuy(activeChar));
}
else if ((activeChar.getPrivateStoreType() == Player.STORE_PRIVATE_SELL) || (activeChar.getPrivateStoreType() == Player.STORE_PRIVATE_SELL_PACKAGE))
{
sendPacket(new PrivateStoreMsgSell(activeChar));
}
else if (activeChar.getPrivateStoreType() == Player.STORE_PRIVATE_MANUFACTURE)
{
sendPacket(new RecipeShopMsg(activeChar));
}
}
if (activeChar.isDead())
{
sendPacket(new Die(activeChar));
}
activeChar.unsetVar("offline");
activeChar.sendActionFailed();
if (first && activeChar.isGM() && Config.SAVE_GM_EFFECTS && activeChar.getPlayerAccess().CanUseGMCommand)
{
if (activeChar.getVarB("gm_silence"))
{
activeChar.setMessageRefusal(true);
activeChar.sendPacket(SystemMsg.MESSAGE_REFUSAL_MODE);
}
if (activeChar.getVarB("gm_invul"))
{
activeChar.setIsInvul(true);
activeChar.startAbnormalEffect(AbnormalEffect.S_INVINCIBLE);
activeChar.sendMessage(activeChar.getName() + " is now immortal.");
}
try
{
int var_gmspeed = Integer.parseInt(activeChar.getVar("gm_gmspeed"));
if ((var_gmspeed >= 1) && (var_gmspeed <= 4))
{
activeChar.doCast(SkillTable.getInstance().getInfo(7029, var_gmspeed), activeChar, true);
}
}
catch (Exception E)
{
}
}
PlayerMessageStack.getInstance().CheckMessages(activeChar);
sendPacket(ClientSetTime.STATIC, new ExSetCompassZoneCode(activeChar));
Pair<Integer, OnAnswerListener> entry = activeChar.getAskListener(false);
if ((entry != null) && (entry.getValue() instanceof ReviveAnswerListener))
{
sendPacket(new ConfirmDlg(SystemMsg.C1_IS_MAKING_AN_ATTEMPT_TO_RESURRECT_YOU_IF_YOU_CHOOSE_THIS_PATH_S2_EXPERIENCE_WILL_BE_RETURNED_FOR_YOU, 0).addString("Other player").addString("some"));
}
if (activeChar.isCursedWeaponEquipped())
{
CursedWeaponsManager.getInstance().showUsageTime(activeChar, activeChar.getCursedWeaponEquippedId());
}
if (!first)
{
if (activeChar.isInObserverMode())
{
if (activeChar.getObserverMode() == Player.OBSERVER_LEAVING)
{
activeChar.returnFromObserverMode();
}
else if (activeChar.getOlympiadObserveGame() != null)
{
activeChar.leaveOlympiadObserverMode(true);
}
else
{
activeChar.leaveObserverMode();
}
}
else if (activeChar.isVisible())
{
World.showObjectsToPlayer(activeChar);
}
for (Summon summon : activeChar.getSummonList())
{
sendPacket(new PetInfo(summon));
}
if (activeChar.isInParty())
{
sendPacket(new PartySmallWindowAll(activeChar.getParty(), activeChar));
for (Player member : activeChar.getParty().getPartyMembers())
{
if (member != activeChar)
{
sendPacket(new PartySpelled(member, true));
for (Summon memberPet : member.getSummonList())
{
sendPacket(new PartySpelled(memberPet, true));
}
sendPacket(RelationChanged.update(activeChar, member, activeChar));
}
}
if (activeChar.getParty().isInCommandChannel())
{
sendPacket(ExMPCCOpen.STATIC);
}
}
for (int shotId : activeChar.getAutoSoulShot())
{
sendPacket(new ExAutoSoulShot(shotId, true));
}
for (Effect e : activeChar.getEffectList().getAllFirstEffects())
{
if (e.getSkill().isToggle())
{
sendPacket(new MagicSkillLaunched(activeChar.getObjectId(), e.getSkill().getId(), e.getSkill().getLevel(), activeChar));
}
}
activeChar.broadcastCharInfo();
}
else
{
activeChar.sendUserInfo();
}
activeChar.updateEffectIcons();
activeChar.setCurrentHpMp(activeChar.getActiveSubClass().getlogOnHp(),activeChar.getActiveSubClass().getlogOnMp());
activeChar.setCurrentCp(activeChar.getActiveSubClass().getlogOnCp());
activeChar.updateStats();
if (Config.ALT_PCBANG_POINTS_ENABLED)
{
activeChar.sendPacket(new ExPCCafePointInfo(activeChar, 0, 1, 2, 12));
}
if (!activeChar.getPremiumItemList().isEmpty())
{
activeChar.sendPacket(Config.GOODS_INVENTORY_ENABLED ? ExGoodsInventoryChangedNotify.STATIC : ExNotifyPremiumItem.STATIC);
}
if (activeChar.getVarB("HeroPeriod") && Config.SERVICES_HERO_SELL_ENABLED)
{
activeChar.setHero(activeChar);
}
activeChar.sendVoteSystemInfo();
activeChar.sendPacket(new ExReceiveShowPostFriend(activeChar));
activeChar.sendPacket(new ExSubjobInfo(activeChar.getPlayer(), false));
activeChar.sendPacket(new ExVitalityEffectInfo(activeChar));
activeChar.sendPacket(new ExTutorialList());
activeChar.sendPacket(new ExWaitWaitingSubStituteInfo(true));
for (Effect effect : activeChar.getEffectList().getAllEffects())
{
if (effect.isInUse())
{
if (effect.getSkill().getId() == 10022)
{
activeChar.setIsIgnoringDeath(true);
}
}
}
if(Config.ALT_GAME_REMOVE_PREVIOUS_CERTIFICATES)
{
Skill [] allSkill = activeChar.getAllSkillsArray();
int totalCertificates = 0;
for(Skill skl : allSkill)
{
if(skl.getId() >= 1573 && skl.getId() <= 1581)
{
totalCertificates += skl.getLevel();
activeChar.removeSkill(skl,true);
}
}
if(totalCertificates > 0)
{
activeChar.getInventory().addItem(10280, totalCertificates);
_log.info("EnterWorld: Player - " + activeChar.getName() + " - Has received " + totalCertificates + " by previous skill certificate deletion." );
for(SubClass sc : activeChar.getSubClassList().values())
{
sc.setCertification(0);
activeChar.store(true);
}
}
}
activeChar.sendPacket(new ExAcquirableSkillListByClass(activeChar));
activeChar.setPartySearchStatus(true);
activeChar.sendPacket(new ExWaitWaitingSubStituteInfo(true));
checkNewMail(activeChar);
activeChar.sendPacket(new ExChangeMPCost(1, -3));
activeChar.sendPacket(new ExChangeMPCost(1, -5));
activeChar.sendPacket(new ExChangeMPCost(0, 20));
activeChar.sendPacket(new ExChangeMPCost(1, -10));
activeChar.sendPacket(new ExChangeMPCost(3, -20));
activeChar.sendPacket(new ExChangeMPCost(22, -20));
if (activeChar.getVar("startMovie") == null)
{
activeChar.setVar("startMovie", "1", -1);
activeChar.sendPacket(new ExShowUsmVideo(ExShowUsmVideo.GD1_INTRO));
}
if ((activeChar.getLevel() > 84) && !activeChar.isAwaking())
{
AwakingManager.getInstance().SendReqToStartQuest(activeChar);
}
if(activeChar.isAwaking()) //If the characters returns to Main, or dual Subclass and Delete Skills prof are active, do check of Correct skills
{
if(Config.ALT_CHECK_SKILLS_AWAKENING)
{
AwakingManager.getInstance().checkAwakenPlayerSkills(activeChar);
}
}
}
/**
* Method notifyClanMembers.
* @param activeChar Player
*/
private static void notifyClanMembers(Player activeChar)
{
Clan clan = activeChar.getClan();
SubUnit subUnit = activeChar.getSubUnit();
if ((clan == null) || (subUnit == null))
{
return;
}
UnitMember member = subUnit.getUnitMember(activeChar.getObjectId());
if (member == null)
{
return;
}
member.setPlayerInstance(activeChar, false);
int sponsor = activeChar.getSponsor();
int apprentice = activeChar.getApprentice();
L2GameServerPacket msg = new SystemMessage2(SystemMsg.CLAN_MEMBER_S1_HAS_LOGGED_INTO_GAME).addName(activeChar);
PledgeShowMemberListUpdate memberUpdate = new PledgeShowMemberListUpdate(activeChar);
for (Player clanMember : clan.getOnlineMembers(activeChar.getObjectId()))
{
clanMember.sendPacket(memberUpdate);
if (clanMember.getObjectId() == sponsor)
{
clanMember.sendPacket(new SystemMessage2(SystemMsg.YOUR_APPRENTICE_C1_HAS_LOGGED_OUT).addName(activeChar));
}
else if (clanMember.getObjectId() == apprentice)
{
clanMember.sendPacket(new SystemMessage2(SystemMsg.YOUR_SPONSOR_C1_HAS_LOGGED_IN).addName(activeChar));
}
else
{
clanMember.sendPacket(msg);
}
}
activeChar.getClan().startNotifyClanEnterWorld(activeChar);
if (!activeChar.isClanLeader())
{
return;
}
ClanHall clanHall = clan.getHasHideout() > 0 ? ResidenceHolder.getInstance().getResidence(ClanHall.class, clan.getHasHideout()) : null;
if ((clanHall == null) || (clanHall.getAuctionLength() != 0))
{
return;
}
if (clanHall.getSiegeEvent().getClass() != ClanHallAuctionEvent.class)
{
return;
}
if (clan.getWarehouse().getCountOf(ItemTemplate.ITEM_ID_ADENA) < clanHall.getRentalFee())
{
activeChar.sendPacket(new SystemMessage2(SystemMsg.PAYMENT_FOR_YOUR_CLAN_HALL_HAS_NOT_BEEN_MADE_PLEASE_ME_PAYMENT_TO_YOUR_CLAN_WAREHOUSE_BY_S1_TOMORROW).addLong(clanHall.getRentalFee()));
}
}
/**
* Method loadTutorial.
* @param player Player
*/
private void loadTutorial(Player player)
{
Quest q = QuestManager.getQuest(255);
if (q != null)
{
player.processQuestEvent(q.getName(), "UC", null);
}
}
/**
* Method checkNewMail.
* @param activeChar Player
*/
private void checkNewMail(Player activeChar)
{
for (Mail mail : MailDAO.getInstance().getReceivedMailByOwnerId(activeChar.getObjectId()))
{
if (mail.isUnread())
{
sendPacket(ExNoticePostArrived.STATIC_FALSE);
break;
}
}
}
}