Code: Select all
/* * 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.actor.instance; import java.sql.Connection;import java.sql.Date;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.Arrays;import java.util.Calendar;import java.util.Collection;import java.util.Collections;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import java.util.LinkedHashMap;import java.util.LinkedList;import java.util.List;import java.util.Map;import java.util.Map.Entry;import java.util.Set;import java.util.concurrent.ConcurrentSkipListMap;import java.util.concurrent.Future;import java.util.concurrent.ScheduledFuture;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.locks.ReentrantLock;import java.util.logging.Level; import javolution.util.FastList;import javolution.util.FastMap;import javolution.util.FastSet; import com.l2jserver.Config;import com.l2jserver.L2DatabaseFactory;import com.l2jserver.gameserver.Announcements;import com.l2jserver.gameserver.GameTimeController;import com.l2jserver.gameserver.GeoData;import com.l2jserver.gameserver.ItemsAutoDestroy;import com.l2jserver.gameserver.LoginServerThread;import com.l2jserver.gameserver.RecipeController;import com.l2jserver.gameserver.SevenSigns;import com.l2jserver.gameserver.SevenSignsFestival;import com.l2jserver.gameserver.ThreadPoolManager;import com.l2jserver.gameserver.ai.CtrlIntention;import com.l2jserver.gameserver.ai.L2CharacterAI;import com.l2jserver.gameserver.ai.L2PlayerAI;import com.l2jserver.gameserver.ai.L2SummonAI;import com.l2jserver.gameserver.cache.HtmCache;import com.l2jserver.gameserver.cache.WarehouseCacheManager;import com.l2jserver.gameserver.communitybbs.BB.Forum;import com.l2jserver.gameserver.communitybbs.Manager.ForumsBBSManager;import com.l2jserver.gameserver.communitybbs.Manager.RegionBBSManager;import com.l2jserver.gameserver.datatables.AdminTable;import com.l2jserver.gameserver.datatables.CharNameTable;import com.l2jserver.gameserver.datatables.CharSummonTable;import com.l2jserver.gameserver.datatables.CharTemplateTable;import com.l2jserver.gameserver.datatables.ClanTable;import com.l2jserver.gameserver.datatables.ClassListData;import com.l2jserver.gameserver.datatables.EnchantSkillGroupsData;import com.l2jserver.gameserver.datatables.ExperienceTable;import com.l2jserver.gameserver.datatables.FishData;import com.l2jserver.gameserver.datatables.HennaData;import com.l2jserver.gameserver.datatables.ItemTable;import com.l2jserver.gameserver.datatables.NpcData;import com.l2jserver.gameserver.datatables.PetDataTable;import com.l2jserver.gameserver.datatables.RecipeData;import com.l2jserver.gameserver.datatables.SkillData;import com.l2jserver.gameserver.datatables.SkillTreesData;import com.l2jserver.gameserver.enums.HtmlActionScope;import com.l2jserver.gameserver.enums.IllegalActionPunishmentType;import com.l2jserver.gameserver.enums.InstanceType;import com.l2jserver.gameserver.enums.MountType;import com.l2jserver.gameserver.enums.PartyDistributionType;import com.l2jserver.gameserver.enums.PlayerAction;import com.l2jserver.gameserver.enums.PrivateStoreType;import com.l2jserver.gameserver.enums.Race;import com.l2jserver.gameserver.enums.Sex;import com.l2jserver.gameserver.enums.ShortcutType;import com.l2jserver.gameserver.enums.ShotType;import com.l2jserver.gameserver.enums.Team;import com.l2jserver.gameserver.handler.IItemHandler;import com.l2jserver.gameserver.handler.ItemHandler;import com.l2jserver.gameserver.idfactory.IdFactory;import com.l2jserver.gameserver.instancemanager.AntiFeedManager;import com.l2jserver.gameserver.instancemanager.CastleManager;import com.l2jserver.gameserver.instancemanager.CoupleManager;import com.l2jserver.gameserver.instancemanager.CursedWeaponsManager;import com.l2jserver.gameserver.instancemanager.DimensionalRiftManager;import com.l2jserver.gameserver.instancemanager.DuelManager;import com.l2jserver.gameserver.instancemanager.FortManager;import com.l2jserver.gameserver.instancemanager.FortSiegeManager;import com.l2jserver.gameserver.instancemanager.GrandBossManager;import com.l2jserver.gameserver.instancemanager.HandysBlockCheckerManager;import com.l2jserver.gameserver.instancemanager.InstanceManager;import com.l2jserver.gameserver.instancemanager.ItemsOnGroundManager;import com.l2jserver.gameserver.instancemanager.PunishmentManager;import com.l2jserver.gameserver.instancemanager.QuestManager;import com.l2jserver.gameserver.instancemanager.SiegeManager;import com.l2jserver.gameserver.instancemanager.TerritoryWarManager;import com.l2jserver.gameserver.instancemanager.ZoneManager;import com.l2jserver.gameserver.model.ArenaParticipantsHolder;import com.l2jserver.gameserver.model.BlockList;import com.l2jserver.gameserver.model.ClanPrivilege;import com.l2jserver.gameserver.model.L2AccessLevel;import com.l2jserver.gameserver.model.L2Clan;import com.l2jserver.gameserver.model.L2ClanMember;import com.l2jserver.gameserver.model.L2ContactList;import com.l2jserver.gameserver.model.L2EnchantSkillLearn;import com.l2jserver.gameserver.model.L2ManufactureItem;import com.l2jserver.gameserver.model.L2Object;import com.l2jserver.gameserver.model.L2Party;import com.l2jserver.gameserver.model.L2Party.messageType;import com.l2jserver.gameserver.model.L2PetData;import com.l2jserver.gameserver.model.L2PetLevelData;import com.l2jserver.gameserver.model.L2PremiumItem;import com.l2jserver.gameserver.model.L2Radar;import com.l2jserver.gameserver.model.L2RecipeList;import com.l2jserver.gameserver.model.L2Request;import com.l2jserver.gameserver.model.L2SkillLearn;import com.l2jserver.gameserver.model.L2World;import com.l2jserver.gameserver.model.L2WorldRegion;import com.l2jserver.gameserver.model.Location;import com.l2jserver.gameserver.model.Macro;import com.l2jserver.gameserver.model.MacroList;import com.l2jserver.gameserver.model.PartyMatchRoom;import com.l2jserver.gameserver.model.PartyMatchRoomList;import com.l2jserver.gameserver.model.PartyMatchWaitingList;import com.l2jserver.gameserver.model.PcCondOverride;import com.l2jserver.gameserver.model.ShortCuts;import com.l2jserver.gameserver.model.Shortcut;import com.l2jserver.gameserver.model.TeleportBookmark;import com.l2jserver.gameserver.model.TeleportWhereType;import com.l2jserver.gameserver.model.TerritoryWard;import com.l2jserver.gameserver.model.TimeStamp;import com.l2jserver.gameserver.model.TradeList;import com.l2jserver.gameserver.model.UIKeysSettings;import com.l2jserver.gameserver.model.actor.L2Attackable;import com.l2jserver.gameserver.model.actor.L2Character;import com.l2jserver.gameserver.model.actor.L2Decoy;import com.l2jserver.gameserver.model.actor.L2Npc;import com.l2jserver.gameserver.model.actor.L2Playable;import com.l2jserver.gameserver.model.actor.L2Summon;import com.l2jserver.gameserver.model.actor.L2Vehicle;import com.l2jserver.gameserver.model.actor.appearance.PcAppearance;import com.l2jserver.gameserver.model.actor.knownlist.PcKnownList;import com.l2jserver.gameserver.model.actor.stat.PcStat;import com.l2jserver.gameserver.model.actor.status.PcStatus;import com.l2jserver.gameserver.model.actor.tasks.player.DismountTask;import com.l2jserver.gameserver.model.actor.tasks.player.FameTask;import com.l2jserver.gameserver.model.actor.tasks.player.GameGuardCheckTask;import com.l2jserver.gameserver.model.actor.tasks.player.InventoryEnableTask;import com.l2jserver.gameserver.model.actor.tasks.player.LookingForFishTask;import com.l2jserver.gameserver.model.actor.tasks.player.PetFeedTask;import com.l2jserver.gameserver.model.actor.tasks.player.PvPFlagTask;import com.l2jserver.gameserver.model.actor.tasks.player.RecoBonusTaskEnd;import com.l2jserver.gameserver.model.actor.tasks.player.RecoGiveTask;import com.l2jserver.gameserver.model.actor.tasks.player.RentPetTask;import com.l2jserver.gameserver.model.actor.tasks.player.ResetChargesTask;import com.l2jserver.gameserver.model.actor.tasks.player.ResetSoulsTask;import com.l2jserver.gameserver.model.actor.tasks.player.SitDownTask;import com.l2jserver.gameserver.model.actor.tasks.player.StandUpTask;import com.l2jserver.gameserver.model.actor.tasks.player.TeleportWatchdogTask;import com.l2jserver.gameserver.model.actor.tasks.player.VitalityTask;import com.l2jserver.gameserver.model.actor.tasks.player.WarnUserTakeBreakTask;import com.l2jserver.gameserver.model.actor.tasks.player.WaterTask;import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;import com.l2jserver.gameserver.model.actor.templates.L2PcTemplate;import com.l2jserver.gameserver.model.actor.transform.Transform;import com.l2jserver.gameserver.model.base.ClassId;import com.l2jserver.gameserver.model.base.ClassLevel;import com.l2jserver.gameserver.model.base.PlayerClass;import com.l2jserver.gameserver.model.base.SubClass;import com.l2jserver.gameserver.model.effects.EffectFlag;import com.l2jserver.gameserver.model.effects.L2EffectType;import com.l2jserver.gameserver.model.entity.Castle;import com.l2jserver.gameserver.model.entity.Duel;import com.l2jserver.gameserver.model.entity.Fort;import com.l2jserver.gameserver.model.entity.Hero;import com.l2jserver.gameserver.model.entity.Instance;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.events.EventDispatcher;import com.l2jserver.gameserver.model.events.EventType;import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerEquipItem;import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerFameChanged;import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerHennaRemove;import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerKarmaChanged;import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerLogin;import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerLogout;import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerPKChanged;import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerProfessionChange;import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerPvPChanged;import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerPvPKill;import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerTransform;import com.l2jserver.gameserver.model.events.listeners.AbstractEventListener;import com.l2jserver.gameserver.model.fishing.L2Fish;import com.l2jserver.gameserver.model.fishing.L2Fishing;import com.l2jserver.gameserver.model.holders.ItemHolder;import com.l2jserver.gameserver.model.holders.PlayerEventHolder;import com.l2jserver.gameserver.model.holders.SkillUseHolder;import com.l2jserver.gameserver.model.interfaces.IEventListener;import com.l2jserver.gameserver.model.interfaces.ILocational;import com.l2jserver.gameserver.model.itemcontainer.Inventory;import com.l2jserver.gameserver.model.itemcontainer.ItemContainer;import com.l2jserver.gameserver.model.itemcontainer.PcFreight;import com.l2jserver.gameserver.model.itemcontainer.PcInventory;import com.l2jserver.gameserver.model.itemcontainer.PcRefund;import com.l2jserver.gameserver.model.itemcontainer.PcWarehouse;import com.l2jserver.gameserver.model.itemcontainer.PetInventory;import com.l2jserver.gameserver.model.items.L2Armor;import com.l2jserver.gameserver.model.items.L2EtcItem;import com.l2jserver.gameserver.model.items.L2Henna;import com.l2jserver.gameserver.model.items.L2Item;import com.l2jserver.gameserver.model.items.L2Weapon;import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;import com.l2jserver.gameserver.model.items.type.ActionType;import com.l2jserver.gameserver.model.items.type.ArmorType;import com.l2jserver.gameserver.model.items.type.EtcItemType;import com.l2jserver.gameserver.model.items.type.WeaponType;import com.l2jserver.gameserver.model.multisell.PreparedListContainer;import com.l2jserver.gameserver.model.olympiad.OlympiadGameManager;import com.l2jserver.gameserver.model.olympiad.OlympiadGameTask;import com.l2jserver.gameserver.model.olympiad.OlympiadManager;import com.l2jserver.gameserver.model.punishment.PunishmentAffect;import com.l2jserver.gameserver.model.punishment.PunishmentType;import com.l2jserver.gameserver.model.quest.Quest;import com.l2jserver.gameserver.model.quest.QuestState;import com.l2jserver.gameserver.model.quest.State;import com.l2jserver.gameserver.model.skills.AbnormalType;import com.l2jserver.gameserver.model.skills.BuffInfo;import com.l2jserver.gameserver.model.skills.CommonSkill;import com.l2jserver.gameserver.model.skills.Skill;import com.l2jserver.gameserver.model.skills.targets.L2TargetType;import com.l2jserver.gameserver.model.stats.Formulas;import com.l2jserver.gameserver.model.stats.Stats;import com.l2jserver.gameserver.model.variables.AccountVariables;import com.l2jserver.gameserver.model.variables.PlayerVariables;import com.l2jserver.gameserver.model.zone.L2ZoneType;import com.l2jserver.gameserver.model.zone.ZoneId;import com.l2jserver.gameserver.model.zone.type.L2BossZone;import com.l2jserver.gameserver.network.L2GameClient;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.AbstractHtmlPacket;import com.l2jserver.gameserver.network.serverpackets.ActionFailed;import com.l2jserver.gameserver.network.serverpackets.ChangeWaitType;import com.l2jserver.gameserver.network.serverpackets.CharInfo;import com.l2jserver.gameserver.network.serverpackets.ConfirmDlg;import com.l2jserver.gameserver.network.serverpackets.EtcStatusUpdate;import com.l2jserver.gameserver.network.serverpackets.ExAutoSoulShot;import com.l2jserver.gameserver.network.serverpackets.ExBrExtraUserInfo;import com.l2jserver.gameserver.network.serverpackets.ExDominionWarStart;import com.l2jserver.gameserver.network.serverpackets.ExDuelUpdateUserInfo;import com.l2jserver.gameserver.network.serverpackets.ExFishingEnd;import com.l2jserver.gameserver.network.serverpackets.ExFishingStart;import com.l2jserver.gameserver.network.serverpackets.ExGetBookMarkInfoPacket;import com.l2jserver.gameserver.network.serverpackets.ExGetOnAirShip;import com.l2jserver.gameserver.network.serverpackets.ExOlympiadMode;import com.l2jserver.gameserver.network.serverpackets.ExPrivateStoreSetWholeMsg;import com.l2jserver.gameserver.network.serverpackets.ExSetCompassZoneCode;import com.l2jserver.gameserver.network.serverpackets.ExStartScenePlayer;import com.l2jserver.gameserver.network.serverpackets.ExStorageMaxCount;import com.l2jserver.gameserver.network.serverpackets.ExUseSharedGroupItem;import com.l2jserver.gameserver.network.serverpackets.FlyToLocation.FlyType;import com.l2jserver.gameserver.network.serverpackets.FriendStatusPacket;import com.l2jserver.gameserver.network.serverpackets.GameGuardQuery;import com.l2jserver.gameserver.network.serverpackets.GetOnVehicle;import com.l2jserver.gameserver.network.serverpackets.HennaInfo;import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate;import com.l2jserver.gameserver.network.serverpackets.ItemList;import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;import com.l2jserver.gameserver.network.serverpackets.LeaveWorld;import com.l2jserver.gameserver.network.serverpackets.MagicSkillUse;import com.l2jserver.gameserver.network.serverpackets.MyTargetSelected;import com.l2jserver.gameserver.network.serverpackets.NicknameChanged;import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;import com.l2jserver.gameserver.network.serverpackets.ObservationMode;import com.l2jserver.gameserver.network.serverpackets.ObservationReturn;import com.l2jserver.gameserver.network.serverpackets.PartySmallWindowUpdate;import com.l2jserver.gameserver.network.serverpackets.PetInventoryUpdate;import com.l2jserver.gameserver.network.serverpackets.PlaySound;import com.l2jserver.gameserver.network.serverpackets.PledgeShowMemberListDelete;import com.l2jserver.gameserver.network.serverpackets.PledgeShowMemberListUpdate;import com.l2jserver.gameserver.network.serverpackets.PrivateStoreListBuy;import com.l2jserver.gameserver.network.serverpackets.PrivateStoreListSell;import com.l2jserver.gameserver.network.serverpackets.PrivateStoreManageListBuy;import com.l2jserver.gameserver.network.serverpackets.PrivateStoreManageListSell;import com.l2jserver.gameserver.network.serverpackets.PrivateStoreMsgBuy;import com.l2jserver.gameserver.network.serverpackets.PrivateStoreMsgSell;import com.l2jserver.gameserver.network.serverpackets.RecipeShopMsg;import com.l2jserver.gameserver.network.serverpackets.RecipeShopSellList;import com.l2jserver.gameserver.network.serverpackets.RelationChanged;import com.l2jserver.gameserver.network.serverpackets.Ride;import com.l2jserver.gameserver.network.serverpackets.ServerClose;import com.l2jserver.gameserver.network.serverpackets.SetupGauge;import com.l2jserver.gameserver.network.serverpackets.ShortCutInit;import com.l2jserver.gameserver.network.serverpackets.SkillCoolTime;import com.l2jserver.gameserver.network.serverpackets.SkillList;import com.l2jserver.gameserver.network.serverpackets.Snoop;import com.l2jserver.gameserver.network.serverpackets.SocialAction;import com.l2jserver.gameserver.network.serverpackets.StatusUpdate;import com.l2jserver.gameserver.network.serverpackets.StopMove;import com.l2jserver.gameserver.network.serverpackets.SystemMessage;import com.l2jserver.gameserver.network.serverpackets.TargetSelected;import com.l2jserver.gameserver.network.serverpackets.TargetUnselected;import com.l2jserver.gameserver.network.serverpackets.TradeDone;import com.l2jserver.gameserver.network.serverpackets.TradeOtherDone;import com.l2jserver.gameserver.network.serverpackets.TradeStart;import com.l2jserver.gameserver.network.serverpackets.UserInfo;import com.l2jserver.gameserver.network.serverpackets.ValidateLocation;import com.l2jserver.gameserver.taskmanager.AttackStanceTaskManager;import com.l2jserver.gameserver.util.Broadcast;import com.l2jserver.gameserver.util.FloodProtectors;import com.l2jserver.gameserver.util.Util;import com.l2jserver.util.EnumIntBitmask;import com.l2jserver.util.Rnd; /** * This class represents all player characters in the world.<br> * There is always a client-thread connected to this (except if a player-store is activated upon logout). */public final class L2PcInstance extends L2Playable{ // Character Skill SQL String Definitions: private static final String RESTORE_SKILLS_FOR_CHAR = "SELECT skill_id,skill_level FROM character_skills WHERE charId=? AND class_index=?"; private static final String ADD_NEW_SKILL = "INSERT INTO character_skills (charId,skill_id,skill_level,class_index) VALUES (?,?,?,?)"; private static final String UPDATE_CHARACTER_SKILL_LEVEL = "UPDATE character_skills SET skill_level=? WHERE skill_id=? AND charId=? AND class_index=?"; private static final String ADD_NEW_SKILLS = "REPLACE INTO character_skills (charId,skill_id,skill_level,class_index) VALUES (?,?,?,?)"; private static final String DELETE_SKILL_FROM_CHAR = "DELETE FROM character_skills WHERE skill_id=? AND charId=? AND class_index=?"; private static final String DELETE_CHAR_SKILLS = "DELETE FROM character_skills WHERE charId=? AND class_index=?"; // Character Skill Save SQL String Definitions: private static final String ADD_SKILL_SAVE = "INSERT INTO character_skills_save (charId,skill_id,skill_level,remaining_time,reuse_delay,systime,restore_type,class_index,buff_index) VALUES (?,?,?,?,?,?,?,?,?)"; private static final String RESTORE_SKILL_SAVE = "SELECT skill_id,skill_level,remaining_time, reuse_delay, systime, restore_type FROM character_skills_save WHERE charId=? AND class_index=? ORDER BY buff_index ASC"; private static final String DELETE_SKILL_SAVE = "DELETE FROM character_skills_save WHERE charId=? AND class_index=?"; // Character Item Reuse Time String Definition: private static final String ADD_ITEM_REUSE_SAVE = "INSERT INTO character_item_reuse_save (charId,itemId,itemObjId,reuseDelay,systime) VALUES (?,?,?,?,?)"; private static final String RESTORE_ITEM_REUSE_SAVE = "SELECT charId,itemId,itemObjId,reuseDelay,systime FROM character_item_reuse_save WHERE charId=?"; private static final String DELETE_ITEM_REUSE_SAVE = "DELETE FROM character_item_reuse_save WHERE charId=?"; // Character Character SQL String Definitions: private static final String INSERT_CHARACTER = "INSERT INTO characters (account_name,charId,char_name,level,maxHp,curHp,maxCp,curCp,maxMp,curMp,face,hairStyle,hairColor,sex,exp,sp,karma,fame,pvpkills,pkkills,clanid,race,classid,deletetime,cancraft,title,title_color,accesslevel,online,isin7sdungeon,clan_privs,wantspeace,base_class,newbie,nobless,power_grade,createDate) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; private static final String UPDATE_CHARACTER = "UPDATE characters SET level=?,maxHp=?,curHp=?,maxCp=?,curCp=?,maxMp=?,curMp=?,face=?,hairStyle=?,hairColor=?,sex=?,heading=?,x=?,y=?,z=?,exp=?,expBeforeDeath=?,sp=?,karma=?,fame=?,pvpkills=?,pkkills=?,clanid=?,race=?,classid=?,deletetime=?,title=?,title_color=?,accesslevel=?,online=?,isin7sdungeon=?,clan_privs=?,wantspeace=?,base_class=?,onlinetime=?,newbie=?,nobless=?,power_grade=?,subpledge=?,lvl_joined_academy=?,apprentice=?,sponsor=?,clan_join_expiry_time=?,clan_create_expiry_time=?,char_name=?,death_penalty_level=?,bookmarkslot=?,vitality_points=?,language=? WHERE charId=?"; private static final String RESTORE_CHARACTER = "SELECT * FROM characters WHERE charId=?"; // Character Teleport Bookmark: private static final String INSERT_TP_BOOKMARK = "INSERT INTO character_tpbookmark (charId,Id,x,y,z,icon,tag,name) values (?,?,?,?,?,?,?,?)"; private static final String UPDATE_TP_BOOKMARK = "UPDATE character_tpbookmark SET icon=?,tag=?,name=? where charId=? AND Id=?"; private static final String RESTORE_TP_BOOKMARK = "SELECT Id,x,y,z,icon,tag,name FROM character_tpbookmark WHERE charId=?"; private static final String DELETE_TP_BOOKMARK = "DELETE FROM character_tpbookmark WHERE charId=? AND Id=?"; // Character Subclass SQL String Definitions: private static final String RESTORE_CHAR_SUBCLASSES = "SELECT class_id,exp,sp,level,class_index FROM character_subclasses WHERE charId=? ORDER BY class_index ASC"; private static final String ADD_CHAR_SUBCLASS = "INSERT INTO character_subclasses (charId,class_id,exp,sp,level,class_index) VALUES (?,?,?,?,?,?)"; private static final String UPDATE_CHAR_SUBCLASS = "UPDATE character_subclasses SET exp=?,sp=?,level=?,class_id=? WHERE charId=? AND class_index =?"; private static final String DELETE_CHAR_SUBCLASS = "DELETE FROM character_subclasses WHERE charId=? AND class_index=?"; // Character Henna SQL String Definitions: private static final String RESTORE_CHAR_HENNAS = "SELECT slot,symbol_id FROM character_hennas WHERE charId=? AND class_index=?"; private static final String ADD_CHAR_HENNA = "INSERT INTO character_hennas (charId,symbol_id,slot,class_index) VALUES (?,?,?,?)"; private static final String DELETE_CHAR_HENNA = "DELETE FROM character_hennas WHERE charId=? AND slot=? AND class_index=?"; private static final String DELETE_CHAR_HENNAS = "DELETE FROM character_hennas WHERE charId=? AND class_index=?"; // Character Shortcut SQL String Definitions: private static final String DELETE_CHAR_SHORTCUTS = "DELETE FROM character_shortcuts WHERE charId=? AND class_index=?"; // Character Recipe List Save private static final String DELETE_CHAR_RECIPE_SHOP = "DELETE FROM character_recipeshoplist WHERE charId=?"; private static final String INSERT_CHAR_RECIPE_SHOP = "REPLACE INTO character_recipeshoplist (`charId`, `recipeId`, `price`, `index`) VALUES (?, ?, ?, ?)"; private static final String RESTORE_CHAR_RECIPE_SHOP = "SELECT * FROM character_recipeshoplist WHERE charId=? ORDER BY `index`"; private static final String COND_OVERRIDE_KEY = "cond_override"; public static final String NEWBIE_KEY = "NEWBIE"; public static final int ID_NONE = -1; public static final int REQUEST_TIMEOUT = 15; private final List<IEventListener> _eventListeners = new FastList<IEventListener>().shared(); public class AIAccessor extends L2Character.AIAccessor { public L2PcInstance getPlayer() { return L2PcInstance.this; } public void doPickupItem(L2Object object) { L2PcInstance.this.doPickupItem(object); } public void doInteract(L2Character target) { L2PcInstance.this.doInteract(target); } @Override public void doAttack(L2Character target) { super.doAttack(target); // cancel the recent fake-death protection instantly if the player attacks or casts spells getPlayer().setRecentFakeDeath(false); } @Override public void doCast(Skill skill) { super.doCast(skill); // cancel the recent fake-death protection instantly if the player attacks or casts spells getPlayer().setRecentFakeDeath(false); } } private L2GameClient _client; private final String _accountName; private long _deleteTimer; private Calendar _createDate = Calendar.getInstance(); private String _lang = null; private String _htmlPrefix = null; private volatile boolean _isOnline = false; private long _onlineTime; private long _onlineBeginTime; private long _lastAccess; private long _uptime; private final ReentrantLock _subclassLock = new ReentrantLock(); protected int _baseClass; protected int _activeClass; protected int _classIndex = 0; /** data for mounted pets */ private int _controlItemId; private L2PetData _data; private L2PetLevelData _leveldata; private int _curFeed; protected Future<?> _mountFeedTask; private ScheduledFuture<?> _dismountTask; private boolean _petItems = false; /** The list of sub-classes this character has. */ private Map<Integer, SubClass> _subClasses; private final PcAppearance _appearance; /** The Experience of the L2PcInstance before the last Death Penalty */ private long _expBeforeDeath; /** The Karma of the L2PcInstance (if higher than 0, the name of the L2PcInstance appears in red) */ private int _karma; /** The number of player killed during a PvP (the player killed was PvP Flagged) */ private int _pvpKills; /** The PK counter of the L2PcInstance (= Number of non PvP Flagged player killed) */ private int _pkKills; /** The PvP Flag state of the L2PcInstance (0=White, 1=Purple) */ private byte _pvpFlag; /** The Fame of this L2PcInstance */ private int _fame; private ScheduledFuture<?> _fameTask; /** Vitality recovery task */ private ScheduledFuture<?> _vitalityTask; private volatile ScheduledFuture<?> _teleportWatchdog; /** The Siege state of the L2PcInstance */ private byte _siegeState = 0; /** The id of castle/fort which the L2PcInstance is registered for siege */ private int _siegeSide = 0; private int _curWeightPenalty = 0; private int _lastCompassZone; // the last compass zone update send to the client private boolean _isIn7sDungeon = false; private final L2ContactList _contactList = new L2ContactList(this); private int _bookmarkslot = 0; // The Teleport Bookmark Slot private final Map<Integer, TeleportBookmark> _tpbookmarks = new FastMap<>(); private boolean _canFeed; private boolean _isInSiege; private boolean _isInHideoutSiege = false; /** Olympiad */ private boolean _inOlympiadMode = false; private boolean _OlympiadStart = false; private int _olympiadGameId = -1; private int _olympiadSide = -1; /** Olympiad buff count. */ private int _olyBuffsCount = 0; /** Duel */ private boolean _isInDuel = false; private int _duelState = Duel.DUELSTATE_NODUEL; private int _duelId = 0; private SystemMessageId _noDuelReason = SystemMessageId.THERE_IS_NO_OPPONENT_TO_RECEIVE_YOUR_CHALLENGE_FOR_A_DUEL; /** Boat and AirShip */ private L2Vehicle _vehicle = null; private Location _inVehiclePosition; public ScheduledFuture<?> _taskforfish; private MountType _mountType = MountType.NONE; private int _mountNpcId; private int _mountLevel; /** Store object used to summon the strider you are mounting **/ private int _mountObjectID = 0; public int _telemode = 0; private boolean _inCrystallize; private boolean _inCraftMode; private long _offlineShopStart = 0; private Transform _transformation; /** The table containing all L2RecipeList of the L2PcInstance */ private final Map<Integer, L2RecipeList> _dwarvenRecipeBook = new FastMap<>(); private final Map<Integer, L2RecipeList> _commonRecipeBook = new FastMap<>(); /** Premium Items */ private final Map<Integer, L2PremiumItem> _premiumItems = new FastMap<>(); /** True if the L2PcInstance is sitting */ private boolean _waitTypeSitting; /** Location before entering Observer Mode */ private final Location _lastLoc = new Location(0, 0, 0); private boolean _observerMode = false; /** Stored from last ValidatePosition **/ private final Location _lastServerPosition = new Location(0, 0, 0); /** The number of recommendation obtained by the L2PcInstance */ private int _recomHave; // how much I was recommended by others /** The number of recommendation that the L2PcInstance can give */ private int _recomLeft; // how many recommendations I can give to others /** Recommendation Bonus task **/ private ScheduledFuture<?> _recoBonusTask; /** Recommendation task **/ private ScheduledFuture<?> _recoGiveTask; /** Recommendation Two Hours bonus **/ protected boolean _recoTwoHoursGiven = false; private final PcInventory _inventory = new PcInventory(this); private final PcFreight _freight = new PcFreight(this); private PcWarehouse _warehouse; private PcRefund _refund; private PrivateStoreType _privateStoreType = PrivateStoreType.NONE; private TradeList _activeTradeList; private ItemContainer _activeWarehouse; private volatile Map<Integer, L2ManufactureItem> _manufactureItems; private String _storeName = ""; private TradeList _sellList; private TradeList _buyList; // Multisell private PreparedListContainer _currentMultiSell = null; /** Bitmask used to keep track of one-time/newbie quest rewards */ private int _newbie; private boolean _noble = false; private boolean _hero = false; /** The L2FolkInstance corresponding to the last Folk which one the player talked. */ private L2Npc _lastFolkNpc = null; /** Last NPC Id talked on a quest */ private int _questNpcObject = 0; /** The table containing all Quests began by the L2PcInstance */ private final Map<String, QuestState> _quests = new FastMap<>(); /** The list containing all shortCuts of this player. */ private final ShortCuts _shortCuts = new ShortCuts(this); /** The list containing all macros of this player. */ private final MacroList _macros = new MacroList(this); private final List<L2PcInstance> _snoopListener = new FastList<>(); private final List<L2PcInstance> _snoopedPlayer = new FastList<>(); // hennas private final L2Henna[] _henna = new L2Henna[3]; private int _hennaSTR; private int _hennaINT; private int _hennaDEX; private int _hennaMEN; private int _hennaWIT; private int _hennaCON; /** The L2Summon of the L2PcInstance */ private L2Summon _summon = null; /** The L2Decoy of the L2PcInstance */ private L2Decoy _decoy = null; /** The L2Trap of the L2PcInstance */ private L2TrapInstance _trap = null; /** The L2Agathion of the L2PcInstance */ private int _agathionId = 0; // apparently, a L2PcInstance CAN have both a summon AND a tamed beast at the same time!! // after Freya players can control more than one tamed beast private List<L2TamedBeastInstance> _tamedBeast = null; private boolean _minimapAllowed = false; // client radar // TODO: This needs to be better integrated and saved/loaded private final L2Radar _radar; // Party matching // private int _partymatching = 0; private int _partyroom = 0; // private int _partywait = 0; // Clan related attributes /** The Clan Identifier of the L2PcInstance */ private int _clanId; /** The Clan object of the L2PcInstance */ private L2Clan _clan; /** Apprentice and Sponsor IDs */ private int _apprentice = 0; private int _sponsor = 0; private long _clanJoinExpiryTime; private long _clanCreateExpiryTime; private int _powerGrade = 0; private volatile EnumIntBitmask<ClanPrivilege> _clanPrivileges = new EnumIntBitmask<>(ClanPrivilege.class, false); /** L2PcInstance's pledge class (knight, Baron, etc.) */ private int _pledgeClass = 0; private int _pledgeType = 0; /** Level at which the player joined the clan as an academy member */ private int _lvlJoinedAcademy = 0; private int _wantsPeace = 0; // Death Penalty Buff Level private int _deathPenaltyBuffLevel = 0; // charges private final AtomicInteger _charges = new AtomicInteger(); private ScheduledFuture<?> _chargeTask = null; // Absorbed Souls private int _souls = 0; private ScheduledFuture<?> _soulTask = null; // WorldPosition used by TARGET_SIGNET_GROUND private Location _currentSkillWorldPosition; private L2AccessLevel _accessLevel; private boolean _messageRefusal = false; // message refusal mode private boolean _silenceMode = false; // silence mode private List<Integer> _silenceModeExcluded; // silence mode private boolean _dietMode = false; // ignore weight penalty private boolean _tradeRefusal = false; // Trade refusal private boolean _exchangeRefusal = false; // Exchange refusal private L2Party _party; // this is needed to find the inviting player for Party response // there can only be one active party request at once private L2PcInstance _activeRequester; private long _requestExpireTime = 0; private final L2Request _request = new L2Request(this); private L2ItemInstance _arrowItem; private L2ItemInstance _boltItem; // Used for protection after teleport private long _protectEndTime = 0; private L2ItemInstance _lure = null; public boolean isSpawnProtected() { return _protectEndTime > GameTimeController.getInstance().getGameTicks(); } private long _teleportProtectEndTime = 0; public boolean isTeleportProtected() { return _teleportProtectEndTime > GameTimeController.getInstance().getGameTicks(); } // protects a char from aggro mobs when getting up from fake death private long _recentFakeDeathEndTime = 0; private boolean _isFakeDeath; /** The fists L2Weapon of the L2PcInstance (used when no weapon is equipped) */ private L2Weapon _fistsWeaponItem; private final Map<Integer, String> _chars = new FastMap<>(); // private byte _updateKnownCounter = 0; private int _expertiseArmorPenalty = 0; private int _expertiseWeaponPenalty = 0; private int _expertisePenaltyBonus = 0; private boolean _isEnchanting = false; private int _activeEnchantItemId = ID_NONE; private int _activeEnchantSupportItemId = ID_NONE; private int _activeEnchantAttrItemId = ID_NONE; private long _activeEnchantTimestamp = 0; protected boolean _inventoryDisable = false; /** Player's cubics. */ private final Map<Integer, L2CubicInstance> _cubics = new ConcurrentSkipListMap<>(); /** Active shots. */ protected FastSet<Integer> _activeSoulShots = new FastSet<Integer>().shared(); public final ReentrantLock soulShotLock = new ReentrantLock(); /** Event parameters */ private PlayerEventHolder eventStatus = null; private byte _handysBlockCheckerEventArena = -1; /** new loto ticket **/ private final int _loto[] = new int[5]; // public static int _loto_nums[] = {0,1,2,3,4,5,6,7,8,9,}; /** new race ticket **/ private final int _race[] = new int[2]; private final BlockList _blockList = new BlockList(this); private L2Fishing _fishCombat; private boolean _fishing = false; private int _fishx = 0; private int _fishy = 0; private int _fishz = 0; private volatile Set<Integer> _transformAllowedSkills; private ScheduledFuture<?> _taskRentPet; private ScheduledFuture<?> _taskWater; /** Last Html Npcs, 0 = last html was not bound to an npc */ private final int[] _htmlActionOriginObjectIds = new int[HtmlActionScope.values().length]; /** * Origin of the last incoming html action request.<br> * This can be used for htmls continuing the conversation with an npc. */ private int _lastHtmlActionOriginObjId; /** Bypass validations */ @SuppressWarnings("unchecked") private final LinkedList<String>[] _htmlActionCaches = new LinkedList[HtmlActionScope.values().length]; private Forum _forumMail; private Forum _forumMemo; /** Current skill in use. Note that L2Character has _lastSkillCast, but this has the button presses */ private SkillUseHolder _currentSkill; private SkillUseHolder _currentPetSkill; /** Skills queued because a skill is already in progress */ private SkillUseHolder _queuedSkill; private int _cursedWeaponEquippedId = 0; private boolean _combatFlagEquippedId = false; private boolean _canRevive = true; private int _reviveRequested = 0; private double _revivePower = 0; private boolean _revivePet = false; private double _cpUpdateIncCheck = .0; private double _cpUpdateDecCheck = .0; private double _cpUpdateInterval = .0; private double _mpUpdateIncCheck = .0; private double _mpUpdateDecCheck = .0; private double _mpUpdateInterval = .0; private double _originalCp = .0; private double _originalHp = .0; private double _originalMp = .0; /** Char Coords from Client */ private int _clientX; private int _clientY; private int _clientZ; private int _clientHeading; // during fall validations will be disabled for 10 ms. private static final int FALLING_VALIDATION_DELAY = 10000; private volatile long _fallingTimestamp = 0; private int _multiSocialTarget = 0; private int _multiSociaAction = 0; private int _movieId = 0; private String _adminConfirmCmd = null; private volatile long _lastItemAuctionInfoRequest = 0; private Future<?> _PvPRegTask; private long _pvpFlagLasts; private long _notMoveUntil = 0; /** Map containing all custom skills of this player. */ private Map<Integer, Skill> _customSkills = null; private volatile int _actionMask; public void setPvpFlagLasts(long time) { _pvpFlagLasts = time; } public long getPvpFlagLasts() { return _pvpFlagLasts; } public void startPvPFlag() { updatePvPFlag(1); if (_PvPRegTask == null) { _PvPRegTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new PvPFlagTask(this), 1000, 1000); } } public void stopPvpRegTask() { if (_PvPRegTask != null) { _PvPRegTask.cancel(true); _PvPRegTask = null; } } public void stopPvPFlag() { stopPvpRegTask(); updatePvPFlag(0); _PvPRegTask = null; } // Character UI private UIKeysSettings _uiKeySettings; // L2JMOD Wedding private boolean _married = false; private int _partnerId = 0; private int _coupleId = 0; private boolean _engagerequest = false; private int _engageid = 0; private boolean _marryrequest = false; private boolean _marryaccepted = false; // Save responder name for log it private String _lastPetitionGmName = null; private boolean _hasCharmOfCourage = false; /** * Create a new L2PcInstance and add it in the characters table of the database.<br> * <B><U> Actions</U> :</B> * <ul> * <li>Create a new L2PcInstance with an account name</li> * <li>Set the name, the Hair Style, the Hair Color and the Face type of the L2PcInstance</li> * <li>Add the player in the characters table of the database</li> * </ul> * @param template The L2PcTemplate to apply to the L2PcInstance * @param accountName The name of the L2PcInstance * @param name The name of the L2PcInstance * @param app the player's appearance * @return The L2PcInstance added to the database or null */ public static L2PcInstance create(L2PcTemplate template, String accountName, String name, PcAppearance app) { // Create a new L2PcInstance with an account name L2PcInstance player = new L2PcInstance(IdFactory.getInstance().getNextId(), template, accountName, app); // Set the name of the L2PcInstance player.setName(name); // Set Character's create time player.setCreateDate(Calendar.getInstance()); // Set the base class ID to that of the actual class ID. player.setBaseClass(player.getClassId()); // Kept for backwards compatibility. player.setNewbie(1); // Give 20 recommendations player.setRecomLeft(20); // Set custom title player.setTitle("Slave"); // Add the player in the characters table of the database return player.createDb() ? player : null; } public String getAccountName() { if (getClient() == null) { return getAccountNamePlayer(); } return getClient().getAccountName(); } public String getAccountNamePlayer() { return _accountName; } public Map<Integer, String> getAccountChars() { return _chars; } public int getRelation(L2PcInstance target) { int result = 0; if (getClan() != null) { result |= RelationChanged.RELATION_CLAN_MEMBER; if (getClan() == target.getClan()) { result |= RelationChanged.RELATION_CLAN_MATE; } if (getAllyId() != 0) { result |= RelationChanged.RELATION_ALLY_MEMBER; } } if (isClanLeader()) { result |= RelationChanged.RELATION_LEADER; } if ((getParty() != null) && (getParty() == target.getParty())) { result |= RelationChanged.RELATION_HAS_PARTY; for (int i = 0; i < getParty().getMembers().size(); i++) {