/* * 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.network.clientpackets; import java.io.UnsupportedEncodingException; import java.util.logging.Logger; import com.l2jserver.Config; import com.l2jserver.gameserver.Announcements; import com.l2jserver.gameserver.GmListTable; import com.l2jserver.gameserver.LoginServerThread; import com.l2jserver.gameserver.SevenSigns; import com.l2jserver.gameserver.TaskPriority; import com.l2jserver.gameserver.cache.HtmCache; import com.l2jserver.gameserver.communitybbs.Manager.RegionBBSManager; import com.l2jserver.gameserver.datatables.AdminCommandAccessRights; import com.l2jserver.gameserver.datatables.GMSkillTable; import com.l2jserver.gameserver.datatables.SkillTable; import com.l2jserver.gameserver.instancemanager.CastleManager; import com.l2jserver.gameserver.instancemanager.ClanHallManager; import com.l2jserver.gameserver.instancemanager.CoupleManager; import com.l2jserver.gameserver.instancemanager.CursedWeaponsManager; import com.l2jserver.gameserver.instancemanager.DimensionalRiftManager; import com.l2jserver.gameserver.instancemanager.FortManager; import com.l2jserver.gameserver.instancemanager.FortSiegeManager; import com.l2jserver.gameserver.instancemanager.InstanceManager; import com.l2jserver.gameserver.instancemanager.MailManager; import com.l2jserver.gameserver.instancemanager.MapRegionManager; import com.l2jserver.gameserver.instancemanager.PetitionManager; import com.l2jserver.gameserver.instancemanager.QuestManager; import com.l2jserver.gameserver.instancemanager.SiegeManager; import com.l2jserver.gameserver.instancemanager.TerritoryWarManager; import com.l2jserver.gameserver.model.L2Clan; import com.l2jserver.gameserver.model.L2ItemInstance; import com.l2jserver.gameserver.model.L2Object; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.instance.L2ClassMasterInstance; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.entity.ClanHall; import com.l2jserver.gameserver.model.entity.Couple; import com.l2jserver.gameserver.model.entity.Fort; import com.l2jserver.gameserver.model.entity.FortSiege; import com.l2jserver.gameserver.model.entity.L2Event; import com.l2jserver.gameserver.model.entity.Siege; import com.l2jserver.gameserver.model.entity.TvTEvent; import com.l2jserver.gameserver.model.quest.Quest; import com.l2jserver.gameserver.model.quest.QuestState; import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.communityserver.CommunityServerThread; import com.l2jserver.gameserver.network.communityserver.writepackets.WorldInfo; import com.l2jserver.gameserver.network.serverpackets.Die; import com.l2jserver.gameserver.network.serverpackets.EtcStatusUpdate; import com.l2jserver.gameserver.network.serverpackets.ExBasicActionList; import com.l2jserver.gameserver.network.serverpackets.ExBirthdayPopup; import com.l2jserver.gameserver.network.serverpackets.ExGetBookMarkInfoPacket; import com.l2jserver.gameserver.network.serverpackets.ExNevitAdventPointInfoPacket; import com.l2jserver.gameserver.network.serverpackets.ExNevitAdventTimeChange; import com.l2jserver.gameserver.network.serverpackets.ExNoticePostArrived; import com.l2jserver.gameserver.network.serverpackets.ExNotifyPremiumItem; import com.l2jserver.gameserver.network.serverpackets.ExShowContactList; import com.l2jserver.gameserver.network.serverpackets.ExShowScreenMessage; import com.l2jserver.gameserver.network.serverpackets.ExStorageMaxCount; import com.l2jserver.gameserver.network.serverpackets.ExVoteSystemInfo; import com.l2jserver.gameserver.network.serverpackets.FriendList; import com.l2jserver.gameserver.network.serverpackets.HennaInfo; import com.l2jserver.gameserver.network.serverpackets.ItemList; import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage; import com.l2jserver.gameserver.network.serverpackets.PledgeShowMemberListAll; import com.l2jserver.gameserver.network.serverpackets.PledgeShowMemberListUpdate; import com.l2jserver.gameserver.network.serverpackets.PledgeSkillList; import com.l2jserver.gameserver.network.serverpackets.PledgeStatusChanged; import com.l2jserver.gameserver.network.serverpackets.QuestList; import com.l2jserver.gameserver.network.serverpackets.ShortCutInit; import com.l2jserver.gameserver.network.serverpackets.SkillCoolTime; import com.l2jserver.gameserver.network.serverpackets.SystemMessage; import com.l2jserver.util.Base64; /** * Enter World Packet Handler<p> * <p> * 0000: 03 <p> * packet format rev87 bddddbdcccccccccccccccccccc * <p> */ public class EnterWorld extends L2GameClientPacket { private static final String _C__11_ENTERWORLD = "[C] 11 EnterWorld"; private static Logger _log = Logger.getLogger(EnterWorld.class.getName()); private final int[][] tracert = new int[5][4]; public TaskPriority getPriority() { return TaskPriority.PR_URGENT; } @Override protected void readImpl() { readB(new byte[32]); // Unknown Byte Array readD(); // Unknown Value readD(); // Unknown Value readD(); // Unknown Value readD(); // Unknown Value readB(new byte[32]); // Unknown Byte Array readD(); // Unknown Value for (int i = 0; i < 5; i++) for (int o = 0; o < 4; o++) tracert[i][o] = readC(); } @Override protected void runImpl() { L2PcInstance activeChar = getClient().getActiveChar(); if (activeChar == null) { _log.warning("EnterWorld failed! activeChar returned 'null'."); getClient().closeNow(); return; } String[] adress = new String[5]; for (int i = 0; i < 5; i++) adress[i] = tracert[i][0]+"."+tracert[i][1]+"."+tracert[i][2]+"."+tracert[i][3]; LoginServerThread.getInstance().sendClientTracert(activeChar.getAccountName(), adress); getClient().setClientTracert(tracert); // Restore to instanced area if enabled if (Config.RESTORE_PLAYER_INSTANCE) activeChar.setInstanceId(InstanceManager.getInstance().getPlayerInstance(activeChar.getObjectId())); else { int instanceId = InstanceManager.getInstance().getPlayerInstance(activeChar.getObjectId()); if (instanceId > 0) InstanceManager.getInstance().getInstance(instanceId).removePlayer(activeChar.getObjectId()); } if (L2World.getInstance().findObject(activeChar.getObjectId()) != null) { if (Config.DEBUG) _log.warning("User already exists in Object ID map! User "+activeChar.getName()+" is a character clone."); } // Apply special GM properties to the GM when entering if (activeChar.isGM()) { if (Config.GM_STARTUP_INVULNERABLE && AdminCommandAccessRights.getInstance().hasAccess("admin_invul", activeChar.getAccessLevel())) activeChar.setIsInvul(true); if (Config.GM_STARTUP_INVISIBLE && AdminCommandAccessRights.getInstance().hasAccess("admin_invisible", activeChar.getAccessLevel())) activeChar.getAppearance().setInvisible(); if (Config.GM_STARTUP_SILENCE && AdminCommandAccessRights.getInstance().hasAccess("admin_silence", activeChar.getAccessLevel())) activeChar.setSilenceMode(true); if (Config.GM_STARTUP_DIET_MODE && AdminCommandAccessRights.getInstance().hasAccess("admin_diet", activeChar.getAccessLevel())) { activeChar.setDietMode(true); activeChar.refreshOverloaded(); } if (Config.GM_STARTUP_AUTO_LIST && AdminCommandAccessRights.getInstance().hasAccess("admin_gmliston", activeChar.getAccessLevel())) GmListTable.getInstance().addGm(activeChar, false); else GmListTable.getInstance().addGm(activeChar, true); if (Config.GM_GIVE_SPECIAL_SKILLS) GMSkillTable.getInstance().addSkills(activeChar); } // Set dead status if applies if (activeChar.getCurrentHp() < 0.5) activeChar.setIsDead(true); boolean showClanNotice = false; // Clan related checks are here if (activeChar.getClan() != null) { activeChar.sendPacket(new PledgeSkillList(activeChar.getClan())); notifyClanMembers(activeChar); notifySponsorOrApprentice(activeChar); ClanHall clanHall = ClanHallManager.getInstance().getClanHallByOwner(activeChar.getClan()); if (clanHall != null) { if (!clanHall.getPaid()) activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.PAYMENT_FOR_YOUR_CLAN_HALL_HAS_NOT_BEEN_MADE_PLEASE_MAKE_PAYMENT_TO_YOUR_CLAN_WAREHOUSE_BY_S1_TOMORROW)); } for (Siege siege : SiegeManager.getInstance().getSieges()) { if (!siege.getIsInProgress()) continue; if (siege.checkIsAttacker(activeChar.getClan())) { activeChar.setSiegeState((byte)1); activeChar.setSiegeSide(siege.getCastle().getCastleId()); } else if (siege.checkIsDefender(activeChar.getClan())) { activeChar.setSiegeState((byte)2); activeChar.setSiegeSide(siege.getCastle().getCastleId()); } } for (FortSiege siege : FortSiegeManager.getInstance().getSieges()) { if (!siege.getIsInProgress()) continue; if (siege.checkIsAttacker(activeChar.getClan())) { activeChar.setSiegeState((byte)1); activeChar.setSiegeSide(siege.getFort().getFortId()); } else if (siege.checkIsDefender(activeChar.getClan())) { activeChar.setSiegeState((byte)2); activeChar.setSiegeSide(siege.getFort().getFortId()); } } sendPacket(new PledgeShowMemberListAll(activeChar.getClan(), activeChar)); sendPacket(new PledgeStatusChanged(activeChar.getClan())); // Residential skills support if (activeChar.getClan().getHasCastle() > 0) CastleManager.getInstance().getCastleByOwner(activeChar.getClan()).giveResidentialSkills(activeChar); if (activeChar.getClan().getHasFort() > 0) FortManager.getInstance().getFortByOwner(activeChar.getClan()).giveResidentialSkills(activeChar); showClanNotice = activeChar.getClan().isNoticeEnabled(); } if (TerritoryWarManager.getInstance().getRegisteredTerritoryId(activeChar) > 0) { if (TerritoryWarManager.getInstance().isTWInProgress()) activeChar.setSiegeState((byte)1); activeChar.setSiegeSide(TerritoryWarManager.getInstance().getRegisteredTerritoryId(activeChar)); } // Updating Seal of Strife Buff/Debuff if (SevenSigns.getInstance().isSealValidationPeriod() && SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_STRIFE) != SevenSigns.CABAL_NULL) { int cabal = SevenSigns.getInstance().getPlayerCabal(activeChar.getObjectId()); if (cabal != SevenSigns.CABAL_NULL) { if (cabal == SevenSigns.getInstance().getSealOwner(SevenSigns.SEAL_STRIFE)) activeChar.addSkill(SkillTable.FrequentSkill.THE_VICTOR_OF_WAR.getSkill()); else activeChar.addSkill(SkillTable.FrequentSkill.THE_VANQUISHED_OF_WAR.getSkill()); } } else { activeChar.removeSkill(SkillTable.FrequentSkill.THE_VICTOR_OF_WAR.getSkill()); activeChar.removeSkill(SkillTable.FrequentSkill.THE_VANQUISHED_OF_WAR.getSkill()); } if (Config.ENABLE_VITALITY && Config.RECOVER_VITALITY_ON_RECONNECT) { float points = Config.RATE_RECOVERY_ON_RECONNECT * (System.currentTimeMillis() - activeChar.getLastAccess()) / 60000; if (points > 0) activeChar.updateVitalityPoints(points, false, true); } activeChar.checkRecoBonusTask(); activeChar.broadcastUserInfo(); // Send Macro List activeChar.getMacroses().sendUpdate(); // Send Item List sendPacket(new ItemList(activeChar, false)); // Send GG check activeChar.queryGameGuard(); // Send Teleport Bookmark List sendPacket(new ExGetBookMarkInfoPacket(activeChar)); // Send Shortcuts sendPacket(new ShortCutInit(activeChar)); // Send Action list activeChar.sendPacket(ExBasicActionList.getStaticPacket(activeChar)); // Send Skill list activeChar.sendSkillList(); // Send Dye Information activeChar.sendPacket(new HennaInfo(activeChar)); Quest.playerEnter(activeChar); if (!Config.DISABLE_TUTORIAL) loadTutorial(activeChar); for (Quest quest : QuestManager.getInstance().getAllManagedScripts()) { if (quest != null && quest.getOnEnterWorld()) quest.notifyEnterWorld(activeChar); } activeChar.sendPacket(new QuestList()); if (Config.PLAYER_SPAWN_PROTECTION > 0) activeChar.setProtection(true); activeChar.spawnMe(activeChar.getX(), activeChar.getY(), activeChar.getZ()); if (L2Event.isParticipant(activeChar)) L2Event.restorePlayerEventStatus(activeChar); // Wedding Checks if (Config.L2JMOD_ALLOW_WEDDING) { engage(activeChar); notifyPartner(activeChar,activeChar.getPartnerId()); } if (activeChar.isCursedWeaponEquipped()) { CursedWeaponsManager.getInstance().getCursedWeapon(activeChar.getCursedWeaponEquippedId()).cursedOnLogin(); } activeChar.updateEffectIcons(); activeChar.sendPacket(new EtcStatusUpdate(activeChar)); //Expand Skill activeChar.sendPacket(new ExStorageMaxCount(activeChar)); sendPacket(new FriendList(activeChar)); SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.FRIEND_S1_HAS_LOGGED_IN); sm.addString(activeChar.getName()); for (int id : activeChar.getFriendList()) { L2Object obj = L2World.getInstance().findObject(id); if (obj != null) obj.sendPacket(sm); } sendPacket(SystemMessage.getSystemMessage(SystemMessageId.WELCOME_TO_LINEAGE)); // While you are free to remove this message,this is strongly discouraged and espeically // frowned upon by the L2J community. Please consider before removing the credits activeChar.sendMessage("This server runs L2Adena, a server emulator based on L2J"); activeChar.sendMessage("Visit https://github.com/Bigcheese/l2adena-l2j-core for more information"); SevenSigns.getInstance().sendCurrentPeriodMsg(activeChar); Announcements.getInstance().showAnnouncements(activeChar); if (showClanNotice) { NpcHtmlMessage notice = new NpcHtmlMessage(1); notice.setFile(activeChar.getHtmlPrefix(), "data/html/clanNotice.htm"); notice.replace("%clan_name%", activeChar.getClan().getName()); notice.replace("%notice_text%", activeChar.getClan().getNotice().replaceAll("\r\n", "<br>")); notice.disableValidation(); sendPacket(notice); } else if (Config.SERVER_NEWS) { String serverNews = HtmCache.getInstance().getHtm(activeChar.getHtmlPrefix(), "data/html/servnews.htm"); if (serverNews != null) sendPacket(new NpcHtmlMessage(1, serverNews)); } if (Config.PETITIONING_ALLOWED) PetitionManager.getInstance().checkPetitionMessages(activeChar); if (activeChar.isAlikeDead()) // dead or fake dead { // no broadcast needed since the player will already spawn dead to others sendPacket(new Die(activeChar)); } activeChar.onPlayerEnter(); sendPacket(new SkillCoolTime(activeChar)); sendPacket(new ExVoteSystemInfo(activeChar)); sendPacket(new ExNevitAdventPointInfoPacket(0)); sendPacket(new ExNevitAdventTimeChange(-1)); // only set pause state... sendPacket(new ExShowContactList(activeChar)); for (L2ItemInstance i : activeChar.getInventory().getItems()) { if (i.isTimeLimitedItem()) i.scheduleLifeTimeTask(); if (i.isShadowItem() && i.isEquipped()) i.decreaseMana(false); } for (L2ItemInstance i : activeChar.getWarehouse().getItems()) { if (i.isTimeLimitedItem()) i.scheduleLifeTimeTask(); } if (DimensionalRiftManager.getInstance().checkIfInRiftZone(activeChar.getX(), activeChar.getY(), activeChar.getZ(), false)) DimensionalRiftManager.getInstance().teleportToWaitingRoom(activeChar); if (activeChar.getClanJoinExpiryTime() > System.currentTimeMillis()) activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.CLAN_MEMBERSHIP_TERMINATED)); // remove combat flag before teleporting if (activeChar.getInventory().getItemByItemId(9819) != null) { Fort fort = FortManager.getInstance().getFort(activeChar); if (fort != null) FortSiegeManager.getInstance().dropCombatFlag(activeChar, fort.getFortId()); else { int slot = activeChar.getInventory().getSlotFromItem(activeChar.getInventory().getItemByItemId(9819)); activeChar.getInventory().unEquipItemInBodySlot(slot); activeChar.destroyItem("CombatFlag", activeChar.getInventory().getItemByItemId(9819), null, true); } } // Attacker or spectator logging in to a siege zone. Actually should be checked for inside castle only? if (!activeChar.isGM() // inside siege zone && activeChar.isInsideZone(L2Character.ZONE_SIEGE) // but non-participant or attacker && (!activeChar.isInSiege() || activeChar.getSiegeState() < 2)) activeChar.teleToLocation(MapRegionManager.TeleportWhereType.Town); if (Config.ALLOW_MAIL) { if (MailManager.getInstance().hasUnreadPost(activeChar)) sendPacket(ExNoticePostArrived.valueOf(false)); } RegionBBSManager.getInstance().changeCommunityBoard(); CommunityServerThread.getInstance().sendPacket(new WorldInfo(activeChar, null, WorldInfo.TYPE_UPDATE_PLAYER_STATUS)); TvTEvent.onLogin(activeChar); if (Config.WELCOME_MESSAGE_ENABLED) activeChar.sendPacket(new ExShowScreenMessage(Config.WELCOME_MESSAGE_TEXT, Config.WELCOME_MESSAGE_TIME)); L2ClassMasterInstance.showQuestionMark(activeChar); int birthday = activeChar.checkBirthDay(); if (birthday == 0) { activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.YOUR_BIRTHDAY_GIFT_HAS_ARRIVED)); activeChar.sendPacket(new ExBirthdayPopup()); } else if (birthday != -1) { sm = SystemMessage.getSystemMessage(SystemMessageId.THERE_ARE_S1_DAYS_UNTIL_YOUR_CHARACTERS_BIRTHDAY); sm.addString(Integer.toString(birthday)); activeChar.sendPacket(sm); } if(!activeChar.getPremiumItemList().isEmpty()) activeChar.sendPacket(new ExNotifyPremiumItem()); } /** * @param cha */ private void engage(L2PcInstance cha) { int _chaid = cha.getObjectId(); for(Couple cl: CoupleManager.getInstance().getCouples()) { if (cl.getPlayer1Id()==_chaid || cl.getPlayer2Id()==_chaid) { if (cl.getMaried()) cha.setMarried(true); cha.setCoupleId(cl.getId()); if (cl.getPlayer1Id()==_chaid) cha.setPartnerId(cl.getPlayer2Id()); else cha.setPartnerId(cl.getPlayer1Id()); } } } /** * @param cha * @param partnerId */ private void notifyPartner(L2PcInstance cha, int partnerId) { if (cha.getPartnerId() != 0) { int objId = cha.getPartnerId(); try { L2PcInstance partner = L2World.getInstance().getPlayer(objId); if (partner != null) partner.sendMessage("Your Partner has logged in."); partner = null; } catch (ClassCastException cce) { _log.warning("Wedding Error: ID "+objId+" is now owned by a(n) "+L2World.getInstance().findObject(objId).getClass().getSimpleName()); } } } /** * @param activeChar */ private void notifyClanMembers(L2PcInstance activeChar) { L2Clan clan = activeChar.getClan(); // This null check may not be needed anymore since notifyClanMembers is called from within a null check already. Please remove if we're certain it's ok to do so. if (clan != null) { clan.getClanMember(activeChar.getObjectId()).setPlayerInstance(activeChar); SystemMessage msg = SystemMessage.getSystemMessage(SystemMessageId.CLAN_MEMBER_S1_LOGGED_IN); msg.addString(activeChar.getName()); clan.broadcastToOtherOnlineMembers(msg, activeChar); msg = null; clan.broadcastToOtherOnlineMembers(new PledgeShowMemberListUpdate(activeChar), activeChar); } } /** * @param activeChar */ private void notifySponsorOrApprentice(L2PcInstance activeChar) { if (activeChar.getSponsor() != 0) { L2PcInstance sponsor = L2World.getInstance().getPlayer(activeChar.getSponsor()); if (sponsor != null) { SystemMessage msg = SystemMessage.getSystemMessage(SystemMessageId.YOUR_APPRENTICE_S1_HAS_LOGGED_IN); msg.addString(activeChar.getName()); sponsor.sendPacket(msg); } } else if (activeChar.getApprentice() != 0) { L2PcInstance apprentice = L2World.getInstance().getPlayer(activeChar.getApprentice()); if (apprentice != null) { SystemMessage msg = SystemMessage.getSystemMessage(SystemMessageId.YOUR_SPONSOR_C1_HAS_LOGGED_IN); msg.addString(activeChar.getName()); apprentice.sendPacket(msg); } } } /** * @param string * @return * @throws UnsupportedEncodingException */ private String getText(String string) { try { String result = new String(Base64.decode(string), "UTF-8"); return result; } catch (UnsupportedEncodingException e) { return null; } } private void loadTutorial(L2PcInstance player) { QuestState qs = player.getQuestState("255_Tutorial"); if (qs != null) qs.getQuest().notifyEvent("UC", null, player); } @Override public String getType() { return _C__11_ENTERWORLD; } @Override protected boolean triggersOnActionRequest() { return false; } }