Рейтинг темы:
  • 1 Голос(ов) - 1 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Гс Ошибка
#1
Подскажите в чем проблема и как исправить.
Ошибка
Ответ
#2
Для начала можно было бы предоставить копию файла l2ft.gameserver.model.Player.java, чтобы точно сказать. Но на первый взгляд ошибка из-за неверного тега html для получения профы в community board, или же в сервере просто нет этих классов персонажей
Ответ
#3
Delete......
Ответ
#4
[SPOILER="Player.java"]package l2ft.gameserver.model;

import static l2ft.gameserver.network.l2.s2c.ExSetCompassZoneCode.ZONE_ALTERED_FLAG;
import static l2ft.gameserver.network.l2.s2c.ExSetCompassZoneCode.ZONE_PEACE_FLAG;
import static l2ft.gameserver.network.l2.s2c.ExSetCompassZoneCode.ZONE_PVP_FLAG;
import static l2ft.gameserver.network.l2.s2c.ExSetCompassZoneCode.ZONE_SIEGE_FLAG;
import static l2ft.gameserver.network.l2.s2c.ExSetCompassZoneCode.ZONE_SSQ_FLAG;

import java.awt.Color;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
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.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentSkipListMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import l2ft.commons.collections.LazyArrayList;
import l2ft.commons.dao.JdbcEntityState;
import l2ft.commons.dbutils.DbUtils;
import l2ft.commons.lang.reference.HardReference;
import l2ft.commons.lang.reference.HardReferences;
import l2ft.commons.threading.RunnableImpl;
import l2ft.commons.util.Rnd;
import l2ft.gameserver.Config;
import l2ft.gameserver.GameTimeController;
import l2ft.gameserver.ThreadPoolManager;
import l2ft.gameserver.ai.CtrlEvent;
import l2ft.gameserver.ai.CtrlIntention;
import l2ft.gameserver.ai.PlayableAI.nextAction;
import l2ft.gameserver.ai.PlayerAI;
import l2ft.gameserver.cache.Msg;
import l2ft.gameserver.dao.AccountBonusDAO;
import l2ft.gameserver.dao.CharacterDAO;
import l2ft.gameserver.dao.CharacterGroupReuseDAO;
import l2ft.gameserver.dao.CharacterPostFriendDAO;
import l2ft.gameserver.dao.EffectsDAO;
import l2ft.gameserver.data.xml.holder.CharTemplateHolder;
import l2ft.gameserver.data.xml.holder.EventHolder;
import l2ft.gameserver.data.xml.holder.HennaHolder;
import l2ft.gameserver.data.xml.holder.InstantZoneHolder;
import l2ft.gameserver.data.xml.holder.ItemHolder;
import l2ft.gameserver.data.xml.holder.MultiSellHolder.MultiSellListContainer;
import l2ft.gameserver.data.xml.holder.NpcHolder;
import l2ft.gameserver.data.xml.holder.RecipeHolder;
import l2ft.gameserver.data.xml.holder.ResidenceHolder;
import l2ft.gameserver.data.xml.holder.SkillAcquireHolder;
import l2ft.gameserver.database.DatabaseFactory;
import l2ft.gameserver.database.mysql;
import l2ft.gameserver.geodata.GeoEngine;
import l2ft.gameserver.handler.bbs.CommunityBoardManager;
import l2ft.gameserver.handler.bbs.ICommunityBoardHandler;
import l2ft.gameserver.handler.items.IItemHandler;
import l2ft.gameserver.idfactory.IdFactory;
import l2ft.gameserver.instancemanager.BypassManager;
import l2ft.gameserver.instancemanager.BypassManager.BypassType;
import l2ft.gameserver.instancemanager.BypassManager.DecodedBypass;
import l2ft.gameserver.instancemanager.CursedWeaponsManager;
import l2ft.gameserver.instancemanager.DimensionalRiftManager;
import l2ft.gameserver.instancemanager.MatchingRoomManager;
import l2ft.gameserver.instancemanager.QuestManager;
import l2ft.gameserver.instancemanager.ReflectionManager;
import l2ft.gameserver.instancemanager.games.HandysBlockCheckerManager;
import l2ft.gameserver.instancemanager.games.HandysBlockCheckerManager.ArenaParticipantsHolder;
import l2ft.gameserver.listener.actor.player.OnAnswerListener;
import l2ft.gameserver.listener.actor.player.impl.ReviveAnswerListener;
import l2ft.gameserver.listener.actor.player.impl.ScriptAnswerListener;
import l2ft.gameserver.listener.actor.player.impl.SummonAnswerListener;
import l2ft.gameserver.model.GameObjectTasks.EndSitDownTask;
import l2ft.gameserver.model.GameObjectTasks.EndStandUpTask;
import l2ft.gameserver.model.GameObjectTasks.HourlyTask;
import l2ft.gameserver.model.GameObjectTasks.KickTask;
import l2ft.gameserver.model.GameObjectTasks.PvPFlagTask;
import l2ft.gameserver.model.GameObjectTasks.RecomBonusTask;
import l2ft.gameserver.model.GameObjectTasks.UnJailTask;
import l2ft.gameserver.model.GameObjectTasks.WaterTask;
import l2ft.gameserver.model.Request.L2RequestType;
import l2ft.gameserver.model.Skill.AddedSkill;
import l2ft.gameserver.model.Zone.ZoneType;
import l2ft.gameserver.model.actor.instances.player.Bonus;
import l2ft.gameserver.model.actor.instances.player.BookMarkList;
import l2ft.gameserver.model.actor.instances.player.FriendList;
import l2ft.gameserver.model.actor.instances.player.Macro;
import l2ft.gameserver.model.actor.instances.player.MacroList;
import l2ft.gameserver.model.actor.instances.player.NevitSystem;
import l2ft.gameserver.model.actor.instances.player.RecomBonus;
import l2ft.gameserver.model.actor.instances.player.ShortCut;
import l2ft.gameserver.model.actor.instances.player.ShortCutList;
import l2ft.gameserver.model.actor.listener.PlayerListenerList;
import l2ft.gameserver.model.actor.recorder.PlayerStatsChangeRecorder;
import l2ft.gameserver.model.base.AcquireType;
import l2ft.gameserver.model.base.ClassId;
import l2ft.gameserver.model.base.Element;
import l2ft.gameserver.model.base.Experience;
import l2ft.gameserver.model.base.InvisibleType;
import l2ft.gameserver.model.base.PlayerAccess;
import l2ft.gameserver.model.base.Race;
import l2ft.gameserver.model.base.RestartType;
import l2ft.gameserver.model.base.TeamType;
import l2ft.gameserver.model.entity.DimensionalRift;
import l2ft.gameserver.model.entity.Hero;
import l2ft.gameserver.model.entity.Reflection;
import l2ft.gameserver.model.entity.SevenSignsFestival.DarknessFestival;
import l2ft.gameserver.model.entity.boat.Boat;
import l2ft.gameserver.model.entity.boat.ClanAirShip;
import l2ft.gameserver.model.entity.events.GameEvent;
import l2ft.gameserver.model.entity.events.GlobalEvent;
import l2ft.gameserver.model.entity.events.impl.CastleSiegeEvent;
import l2ft.gameserver.model.entity.events.impl.ClanHallSiegeEvent;
import l2ft.gameserver.model.entity.events.impl.DominionSiegeEvent;
import l2ft.gameserver.model.entity.events.impl.DuelEvent;
import l2ft.gameserver.model.entity.events.impl.FortressSiegeEvent;
import l2ft.gameserver.model.entity.events.impl.SiegeEvent;
import l2ft.gameserver.model.entity.olympiad.CompType;
import l2ft.gameserver.model.entity.olympiad.Olympiad;
import l2ft.gameserver.model.entity.olympiad.OlympiadGame;
import l2ft.gameserver.model.entity.residence.Castle;
import l2ft.gameserver.model.entity.residence.ClanHall;
import l2ft.gameserver.model.entity.residence.Fortress;
import l2ft.gameserver.model.entity.residence.Residence;
import l2ft.gameserver.model.instances.DecoyInstance;
import l2ft.gameserver.model.instances.FestivalMonsterInstance;
import l2ft.gameserver.model.instances.GuardInstance;
import l2ft.gameserver.model.instances.MonsterInstance;
import l2ft.gameserver.model.instances.NpcInstance;
import l2ft.gameserver.model.instances.PetBabyInstance;
import l2ft.gameserver.model.instances.PetInstance;
import l2ft.gameserver.model.instances.ReflectionBossInstance;
import l2ft.gameserver.model.instances.StaticObjectInstance;
import l2ft.gameserver.model.instances.TamedBeastInstance;
import l2ft.gameserver.model.instances.TrapInstance;
import l2ft.gameserver.model.items.Inventory;
import l2ft.gameserver.model.items.ItemContainer;
import l2ft.gameserver.model.items.ItemInstance;
import l2ft.gameserver.model.items.LockType;
import l2ft.gameserver.model.items.ManufactureItem;
import l2ft.gameserver.model.items.PcFreight;
import l2ft.gameserver.model.items.PcInventory;
import l2ft.gameserver.model.items.PcRefund;
import l2ft.gameserver.model.items.PcWarehouse;
import l2ft.gameserver.model.items.TradeItem;
import l2ft.gameserver.model.items.Warehouse;
import l2ft.gameserver.model.items.Warehouse.WarehouseType;
import l2ft.gameserver.model.items.attachment.FlagItemAttachment;
import l2ft.gameserver.model.items.attachment.PickableAttachment;
import l2ft.gameserver.model.matching.MatchingRoom;
import l2ft.gameserver.model.petition.PetitionMainGroup;
import l2ft.gameserver.model.pledge.Alliance;
import l2ft.gameserver.model.pledge.Clan;
import l2ft.gameserver.model.pledge.Privilege;
import l2ft.gameserver.model.pledge.RankPrivs;
import l2ft.gameserver.model.pledge.SubUnit;
import l2ft.gameserver.model.pledge.UnitMember;
import l2ft.gameserver.model.quest.Quest;
import l2ft.gameserver.model.quest.QuestEventType;
import l2ft.gameserver.model.quest.QuestState;
import l2ft.gameserver.network.authcomm.AuthServerCommunication;
import l2ft.gameserver.network.authcomm.gspackets.ChangeAccessLevel;
import l2ft.gameserver.network.l2.GameClient;
import l2ft.gameserver.network.l2.components.CustomMessage;
import l2ft.gameserver.network.l2.components.IStaticPacket;
import l2ft.gameserver.network.l2.components.SceneMovie;
import l2ft.gameserver.network.l2.components.SystemMsg;
import l2ft.gameserver.network.l2.s2c.AbnormalStatusUpdate;
import l2ft.gameserver.network.l2.s2c.ActionFail;
import l2ft.gameserver.network.l2.s2c.AutoAttackStart;
import l2ft.gameserver.network.l2.s2c.CameraMode;
import l2ft.gameserver.network.l2.s2c.ChairSit;
import l2ft.gameserver.network.l2.s2c.ChangeWaitType;
import l2ft.gameserver.network.l2.s2c.CharInfo;
import l2ft.gameserver.network.l2.s2c.ConfirmDlg;
import l2ft.gameserver.network.l2.s2c.EtcStatusUpdate;
import l2ft.gameserver.network.l2.s2c.ExAutoSoulShot;
import l2ft.gameserver.network.l2.s2c.ExBR_AgathionEnergyInfo;
import l2ft.gameserver.network.l2.s2c.ExBR_ExtraUserInfo;
import l2ft.gameserver.network.l2.s2c.ExBR_PremiumState;
import l2ft.gameserver.network.l2.s2c.ExBasicActionList;
import l2ft.gameserver.network.l2.s2c.ExDominionWarStart;
import l2ft.gameserver.network.l2.s2c.ExDuelUpdateUserInfo;
import l2ft.gameserver.network.l2.s2c.ExOlympiadMatchEnd;
import l2ft.gameserver.network.l2.s2c.ExOlympiadMode;
import l2ft.gameserver.network.l2.s2c.ExOlympiadSpelledInfo;
import l2ft.gameserver.network.l2.s2c.ExPCCafePointInfo;
import l2ft.gameserver.network.l2.s2c.ExQuestItemList;
import l2ft.gameserver.network.l2.s2c.ExSetCompassZoneCode;
import l2ft.gameserver.network.l2.s2c.ExStartScenePlayer;
import l2ft.gameserver.network.l2.s2c.ExStorageMaxCount;
import l2ft.gameserver.network.l2.s2c.ExVitalityPointInfo;
import l2ft.gameserver.network.l2.s2c.ExVoteSystemInfo;
import l2ft.gameserver.network.l2.s2c.GetItem;
import l2ft.gameserver.network.l2.s2c.HennaInfo;
import l2ft.gameserver.network.l2.s2c.InventoryUpdate;
import l2ft.gameserver.network.l2.s2c.ItemList;
import l2ft.gameserver.network.l2.s2c.L2GameServerPacket;
import l2ft.gameserver.network.l2.s2c.LeaveWorld;
import l2ft.gameserver.network.l2.s2c.MagicSkillLaunched;
import l2ft.gameserver.network.l2.s2c.MagicSkillUse;
import l2ft.gameserver.network.l2.s2c.MyTargetSelected;
import l2ft.gameserver.network.l2.s2c.NpcInfoPoly;
import l2ft.gameserver.network.l2.s2c.ObserverEnd;
import l2ft.gameserver.network.l2.s2c.ObserverStart;
import l2ft.gameserver.network.l2.s2c.PartySmallWindowUpdate;
import l2ft.gameserver.network.l2.s2c.PartySpelled;
import l2ft.gameserver.network.l2.s2c.PlaySound;
import l2ft.gameserver.network.l2.s2c.PledgeShowMemberListDelete;
import l2ft.gameserver.network.l2.s2c.PledgeShowMemberListDeleteAll;
import l2ft.gameserver.network.l2.s2c.PledgeShowMemberListUpdate;
import l2ft.gameserver.network.l2.s2c.PrivateStoreListBuy;
import l2ft.gameserver.network.l2.s2c.PrivateStoreListSell;
import l2ft.gameserver.network.l2.s2c.PrivateStoreMsgBuy;
import l2ft.gameserver.network.l2.s2c.PrivateStoreMsgSell;
import l2ft.gameserver.network.l2.s2c.QuestList;
import l2ft.gameserver.network.l2.s2c.RadarControl;
import l2ft.gameserver.network.l2.s2c.RecipeShopMsg;
import l2ft.gameserver.network.l2.s2c.RecipeShopSellList;
import l2ft.gameserver.network.l2.s2c.RelationChanged;
import l2ft.gameserver.network.l2.s2c.Ride;
import l2ft.gameserver.network.l2.s2c.SendTradeDone;
import l2ft.gameserver.network.l2.s2c.ServerClose;
import l2ft.gameserver.network.l2.s2c.SetupGauge;
import l2ft.gameserver.network.l2.s2c.ShortBuffStatusUpdate;
import l2ft.gameserver.network.l2.s2c.ShortCutInit;
import l2ft.gameserver.network.l2.s2c.ShortCutRegister;
import l2ft.gameserver.network.l2.s2c.SkillCoolTime;
import l2ft.gameserver.network.l2.s2c.SkillList;
import l2ft.gameserver.network.l2.s2c.SocialAction;
import l2ft.gameserver.network.l2.s2c.Snoop;
import l2ft.gameserver.network.l2.s2c.SpawnEmitter;
import l2ft.gameserver.network.l2.s2c.SpecialCamera;
import l2ft.gameserver.network.l2.s2c.StatusUpdate;
import l2ft.gameserver.network.l2.s2c.SystemMessage;
import l2ft.gameserver.network.l2.s2c.SystemMessage2;
import l2ft.gameserver.network.l2.s2c.TargetSelected;
import l2ft.gameserver.network.l2.s2c.TargetUnselected;
import l2ft.gameserver.network.l2.s2c.TeleportToLocation;
import l2ft.gameserver.network.l2.s2c.UserInfo;
import l2ft.gameserver.network.l2.s2c.ValidateLocation;
import l2ft.gameserver.network.l2.c2s.NetPing;
import l2ft.gameserver.scripts.Events;
import l2ft.gameserver.skills.EffectType;
import l2ft.gameserver.skills.TimeStamp;
import l2ft.gameserver.skills.effects.EffectCubic;
import l2ft.gameserver.skills.effects.EffectTemplate;
import l2ft.gameserver.skills.skillclasses.Charge;
import l2ft.gameserver.skills.skillclasses.Transformation;
import l2ft.gameserver.stats.Formulas;
import l2ft.gameserver.stats.Stats;
import l2ft.gameserver.stats.funcs.FuncTemplate;
import l2ft.gameserver.tables.ClanTable;
import l2ft.gameserver.tables.PetDataTable;
import l2ft.gameserver.tables.SkillTable;
import l2ft.gameserver.tables.SkillTreeTable;
import l2ft.gameserver.taskmanager.AutoSaveManager;
import l2ft.gameserver.taskmanager.LazyPrecisionTaskManager;
import l2ft.gameserver.templates.FishTemplate;
import l2ft.gameserver.templates.Henna;
import l2ft.gameserver.templates.InstantZone;
import l2ft.gameserver.templates.PlayerTemplate;
import l2ft.gameserver.templates.StatsSet;
import l2ft.gameserver.templates.item.ArmorTemplate;
import l2ft.gameserver.templates.item.ArmorTemplate.ArmorType;
import l2ft.gameserver.templates.item.ItemTemplate;
import l2ft.gameserver.templates.item.WeaponTemplate;
import l2ft.gameserver.templates.item.WeaponTemplate.WeaponType;
import l2ft.gameserver.templates.npc.NpcTemplate;
import l2ft.gameserver.utils.AddonsConfig;
import l2ft.gameserver.utils.AntiFlood;
import l2ft.gameserver.utils.EffectsComparator;
import l2ft.gameserver.utils.FixEnchantOlympiad;
import l2ft.gameserver.utils.GameStats;
import l2ft.gameserver.utils.ItemFunctions;
import l2ft.gameserver.utils.Language;
import l2ft.gameserver.utils.Location;
import l2ft.gameserver.utils.Log;
import l2ft.gameserver.utils.SiegeUtils;
import l2ft.gameserver.utils.SqlBatch;
import l2ft.gameserver.utils.Strings;
import l2ft.gameserver.utils.TeleportUtils;
import l2ft.gameserver.utils.GArray;
import org.napile.primitive.Containers;
import org.napile.primitive.maps.IntObjectMap;
import org.napile.primitive.maps.impl.CHashIntObjectMap;

import ftGuard.ftGuard;
import ftGuard.ftConfig;
import ftGuard.network.l2.GuardManager;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public final class Player extends Playable implements PlayerGroup
{
public static final int DEFAULT_TITLE_COLOR = 0xFFFF77;
public static final int MAX_POST_FRIEND_SIZE = 100;
public static final int MAX_FRIEND_SIZE = 128;

private static final Logger _log = LoggerFactory.getLogger(Player.class);

public static final String NO_TRADERS_VAR = "notraders";
public static final String NO_ANIMATION_OF_CAST_VAR = "notShowBuffAnim";
public static final String MY_BIRTHDAY_RECEIVE_YEAR = "MyBirthdayReceiveYear";
private static final String NOT_CONNECTED = "<not connected>";

public Map<Integer, SubClass> _classlist = new HashMap<Integer, SubClass>(4);

public final static int OBSERVER_NONE = 0;
public final static int OBSERVER_STARTING = 1;
public final static int OBSERVER_STARTED = 3;
public final static int OBSERVER_LEAVING = 2;

public static final int STORE_PRIVATE_NONE = 0;
public static final int STORE_PRIVATE_SELL = 1;
public static final int STORE_PRIVATE_BUY = 3;
public static final int STORE_PRIVATE_MANUFACTURE = 5;
public static final int STORE_OBSERVING_GAMES = 7;
public static final int STORE_PRIVATE_SELL_PACKAGE = 8;

public static final int RANK_VAGABOND = 0;
public static final int RANK_VASSAL = 1;
public static final int RANK_HEIR = 2;
public static final int RANK_KNIGHT = 3;
public static final int RANK_WISEMAN = 4;
public static final int RANK_BARON = 5;
public static final int RANK_VISCOUNT = 6;
public static final int RANK_COUNT = 7;
public static final int RANK_MARQUIS = 8;
public static final int RANK_DUKE = 9;
public static final int RANK_GRAND_DUKE = 10;
public static final int RANK_DISTINGUISHED_KING = 11;
public static final int RANK_EMPEROR = 12; // unused

public static final int LANG_ENG = 0;
public static final int LANG_RUS = 1;
public static final int LANG_UNK = -1;

public static final int[] EXPERTISE_LEVELS =
{
0,
20,
40,
52,
61,
76,
80,
84,
Integer.MAX_VALUE
};

private GameClient _connection;
private String _login;

private int _karma, _pkKills, _pvpKills;
private int _face, _hairStyle, _hairColor;
private int _recomHave, _recomLeftToday, _fame;
private int _recomLeft = 20;
private int _recomBonusTime = 3600;
private boolean _isHourglassEffected, _isRecomTimerActive;
private boolean _isUndying = false;
private int _deleteTimer;

private long _createTime, _onlineTime, _onlineBeginTime, _leaveClanTime, _deleteClanTime, _NoChannel, _NoChannelBegin;
private long _uptime;
/**
* Time on login in game
*/
private long _lastAccess;

/**
* The Color of players name / title (white is 0xFFFFFF)
*/
private int _nameColor, _titlecolor;

private int _vitalityLevel = -1;
private double _vitality = Config.VITALITY_LEVELS[4];
private boolean _overloaded;

boolean sittingTaskLaunched;

/**
* Time counter when L2Player is sitting
*/
private int _waitTimeWhenSit;

private boolean _autoLoot = Config.AUTO_LOOT, AutoLootHerbs = Config.AUTO_LOOT_HERBS, AutoLootOnlyAdena = Config.AUTO_LOOT_ONLY_ADENA;

private final PcInventory _inventory = new PcInventory(this);
private final Warehouse _warehouse = new PcWarehouse(this);
private final ItemContainer _refund = new PcRefund(this);
private final PcFreight _freight = new PcFreight(this);

public final BookMarkList bookmarks = new BookMarkList(this, 0);

public final AntiFlood antiFlood = new AntiFlood();

/**
* The table containing all L2RecipeList of the L2Player
*/
private final Map<Integer, Recipe> _recipebook = new TreeMap<Integer, Recipe>();
private final Map<Integer, Recipe> _commonrecipebook = new TreeMap<Integer, Recipe>();

/**
* Premium Items
*/
private Map<Integer, PremiumItem> _premiumItems = new TreeMap<Integer, PremiumItem>();

/**
* The table containing all Quests began by the L2Player
*/
private final Map<String, QuestState> _quests = new HashMap<String, QuestState>();

/**
* The list containing all shortCuts of this L2Player
*/
private final ShortCutList _shortCuts = new ShortCutList(this);

/**
* The list containing all macroses of this L2Player
*/
private final MacroList _macroses = new MacroList(this);

/**
* The Private Store type of the L2Player (STORE_PRIVATE_NONE=0, STORE_PRIVATE_SELL=1, sellmanage=2, STORE_PRIVATE_BUY=3, buymanage=4, STORE_PRIVATE_MANUFACTURE=5)
*/
private int _privatestore;
/**
* Данные для магазина рецептов
*/
private String _manufactureName;
private List<ManufactureItem> _createList = Collections.emptyList();
/**
* Данные для магазина продажи
*/
private String _sellStoreName;
private List<TradeItem> _sellList = Collections.emptyList();
private List<TradeItem> _packageSellList = Collections.emptyList();
/**
* Данные для магазина покупки
*/
private String _buyStoreName;
private List<TradeItem> _buyList = Collections.emptyList();
/**
* Данные для обмена
*/
private List<TradeItem> _tradeList = Collections.emptyList();

/**
* hennas
*/
private final Henna[] _henna = new Henna[3];
private int _hennaSTR, _hennaINT, _hennaDEX, _hennaMEN, _hennaWIT, _hennaCON;

private Party _party;
private Location _lastPartyPosition;

private Clan _clan;
private int _pledgeClass = 0, _pledgeType = Clan.SUBUNIT_NONE, _powerGrade = 0, _lvlJoinedAcademy = 0, _apprentice = 0;

/**
* GM Stuff
*/
private int _accessLevel;
private PlayerAccess _playerAccess = new PlayerAccess();

private boolean _messageRefusal = false, _tradeRefusal = false, _blockAll = false;

/**
* The L2Summon of the L2Player
*/
private Summon _summon = null;
private boolean _riding;

private DecoyInstance _decoy = null;

private Map<Integer, EffectCubic> _cubics = null;
private int _agathionId = 0;

private Request _request;

private ItemInstance _arrowItem;

/**
* The fists L2Weapon of the L2Player (used when no weapon is equipped)
*/
private WeaponTemplate _fistsWeaponItem;

private Map<Integer, String> _chars = new HashMap<Integer, String>(8);

/**
* The current higher Expertise of the L2Player (None=0, D=1, C=2, B=3, A=4, S=5, S80=6, S84=7)
*/
public int expertiseIndex = 0;

private ItemInstance _enchantScroll = null;

private WarehouseType _usingWHType;

private boolean _isOnline = false;

private AtomicBoolean _isLogout = new AtomicBoolean();

/**
* The L2NpcInstance corresponding to the last Folk which one the player talked.
*/
private HardReference<NpcInstance> _lastNpc = HardReferences.emptyRef();
/**
* тут храним мультиселл с которым работаем
*/
private MultiSellListContainer _multisell = null;

private Set<Integer> _activeSoulShots = new CopyOnWriteArraySet<Integer>();

private WorldRegion _observerRegion;
private AtomicInteger _observerMode = new AtomicInteger(0);

public int _telemode = 0;

private int _handysBlockCheckerEventArena = -1;

public boolean entering = true;

/**
* Эта точка проверяется при нештатном выходе чара, и если не равна null чар возвращается в нее
* Используется например для возвращения при падении с виверны
* Поле heading используется для хранения денег возвращаемых при сбое
*/
public Location _stablePoint = null;

/**
* new loto ticket *
*/
public int _loto[] = new int[5];
/**
* new race ticket *
*/
public int _race[] = new int[2];

private final Map<Integer, String> _blockList = new ConcurrentSkipListMap<Integer, String>(); // characters blocked with '/block <charname>' cmd
private final FriendList _friendList = new FriendList(this);

private boolean _hero = false;

/**
* True if the L2Player is in a boat
*/
private Boat _boat;
private Location _inBoatPosition;

protected int _baseClass = -1;
protected SubClass _activeClass = null;

private Bonus _bonus = new Bonus();
private Future<?> _bonusExpiration;

private boolean _isSitting;
private StaticObjectInstance _sittingObject;

private boolean _noble = false;

private boolean _inOlympiadMode;
private OlympiadGame _olympiadGame;
private OlympiadGame _olympiadObserveGame;

private int _olympiadSide = -1;

/**
* ally with ketra or varka related wars
*/
private int _varka = 0;
private int _ketra = 0;
private int _ram = 0;

private byte[] _keyBindings = ArrayUtils.EMPTY_BYTE_ARRAY;

private int _cursedWeaponEquippedId = 0;

private final Fishing _fishing = new Fishing(this);
private boolean _isFishing;

private Future<?> _taskWater;
private Future<?> _autoSaveTask;
private Future<?> _kickTask;

private Future<?> _vitalityTask;
private Future<?> _pcCafePointsTask;
private Future<?> _unjailTask;

private final Lock _storeLock = new ReentrantLock();

private int _zoneMask;

private boolean _offline = false;

private int _transformationId;
private int _transformationTemplate;
private String _transformationName;

private int _pcBangPoints;

Map<Integer, Skill> _transformationSkills = new HashMap<Integer, Skill>();

private int _expandInventory = 0;
private int _expandWarehouse = 0;
private int _battlefieldChatId;
private int _lectureMark;
private InvisibleType _invisibleType = InvisibleType.NONE;

private List<String> bypasses = null, bypasses_bbs = null;
private IntObjectMap<String> _postFriends = Containers.emptyIntObjectMap();

private List<String> _blockedActions = new ArrayList<String>();

private boolean _notShowBuffAnim = false;
private boolean _notShowTraders = false;
private boolean _debug = false;

private long _dropDisabled;
private long _lastItemAuctionInfoRequest;

private IntObjectMap<TimeStamp> _sharedGroupReuses = new CHashIntObjectMap<TimeStamp>();
private Pair<Integer, OnAnswerListener> _askDialog = null;

// High Five: Navit's Bonus System
private NevitSystem _nevitSystem = new NevitSystem(this);

private MatchingRoom _matchingRoom;
private PetitionMainGroup _petitionGroup;
private final Map<Integer, Long> _instancesReuses = new ConcurrentHashMap<Integer, Long>();

public List<TeleportPoints> _teleportPoints = new ArrayList<TeleportPoints>();

public GameEvent _event = null;

/**
* Конструктор для L2Player. Напрямую не вызывается, для создания игрока используется PlayerManager.create
*/
public Player(final int objectId, final PlayerTemplate template, final String accountName)
{
super(objectId, template);

_login = accountName;
_nameColor = 0xFFFFFF;
_titlecolor = 0xFFFF77;
_baseClass = getClassId().getId();
}

/**
* Constructor<?> of L2Player (use L2Character constructor).<BR><BR>
* <p/>
* <B><U> Actions</U> :</B><BR><BR>
* <li>Call the L2Character constructor to create an empty _skills slot and copy basic Calculator set to this L2Player </li>
* <li>Create a L2Radar object</li>
* <li>Retrieve from the database all items of this L2Player and add them to _inventory </li>
* <p/>
* <FONT COLOR=#FF0000><B> <U>Caution</U> : This method DOESN'T SET the account name of the L2Player</B></FONT><BR><BR>
*
* @param objectId Identifier of the object to initialized
* @param template The L2PlayerTemplate to apply to the L2Player
*/
private Player(final int objectId, final PlayerTemplate template)
{
this(objectId, template, null);

_ai = new PlayerAI(this);

if(!Config.EVERYBODY_HAS_ADMIN_RIGHTS)
setPlayerAccess(Config.gmlist.get(objectId));
else
setPlayerAccess(Config.gmlist.get(0));
}

@SuppressWarnings("unchecked")
@Override
public HardReference<Player> getRef()
{
return (HardReference<Player>) super.getRef();
}

public String getAccountName()
{
if(_connection == null)
return _login;
return _connection.getLogin();
}

public String getIP()
{
if(_connection == null)
return NOT_CONNECTED;
return _connection.getIpAddr();
}

public String getHWID()
{
if(_connection == null)
return NOT_CONNECTED;
return _connection.getHWID();
}

/**
* Возвращает список персонажей на аккаунте, за исключением текущего
*
* @return Список персонажей
*/
public Map<Integer, String> getAccountChars()
{
return _chars;
}

@Override
public final PlayerTemplate getTemplate()
{
return (PlayerTemplate) _template;
}

@Override
public PlayerTemplate getBaseTemplate()
{
return (PlayerTemplate) _baseTemplate;
}

public void changeSex()
{
boolean male = true;
if(getSex() == 1)
male = false;
_template = CharTemplateHolder.getInstance().getTemplate(getClassId(), !male);
}

@Override
public PlayerAI getAI()
{
return (PlayerAI) _ai;
}

@Override
public void doCast(final Skill skill, final Creature target, boolean forceUse)
{
if(skill == null)
return;

if(_event != null && !_event.canUseSkill(this, target, skill))
{
sendActionFailed();
return;
}

super.doCast(skill, target, forceUse);

//if(getUseSeed() != 0 && skill.getSkillType() == SkillType.SOWING)
// sendPacket(new ExUseSharedGroupItem(getUseSeed(), getUseSeed(), 5000, 5000));
}

@Override
public void doAttack(Creature target)
{
if(_event != null && !_event.canAttack(this, target))
{
sendActionFailed();
return;
}
super.doAttack(target);
}

@Override
public void sendReuseMessage(Skill skill)
{
if(isCastingNow())
return;
TimeStamp sts = getSkillReuse(skill);
if(sts == null || !sts.hasNotPassed())
return;
long timeleft = sts.getReuseCurrent();
if(!Config.ALT_SHOW_REUSE_MSG && timeleft < 10000 || timeleft < 500)
return;
long hours = timeleft / 3600000;
long minutes = (timeleft - hours * 3600000) / 60000;
long seconds = (long) Math.ceil((timeleft - hours * 3600000 - minutes * 60000) / 1000.);
if(hours > 0)
sendPacket(new SystemMessage(SystemMessage.THERE_ARE_S2_HOURS_S3_MINUTES_AND_S4_SECONDS_REMAINING_IN_S1S_REUSE_TIME).addSkillName(skill.getId(), skill.getDisplayLevel()).addNumber(hours).addNumber(minutes).addNumber(seconds));
else if(minutes > 0)
sendPacket(new SystemMessage(SystemMessage.THERE_ARE_S2_MINUTES_S3_SECONDS_REMAINING_IN_S1S_REUSE_TIME).addSkillName(skill.getId(), skill.getDisplayLevel()).addNumber(minutes).addNumber(seconds));
else
sendPacket(new SystemMessage(SystemMessage.THERE_ARE_S2_SECONDS_REMAINING_IN_S1S_REUSE_TIME).addSkillName(skill.getId(), skill.getDisplayLevel()).addNumber(seconds));
}

@Override
public final int getLevel()
{
return _activeClass == null ? 1 : _activeClass.getLevel();
}

public int getSex()
{
return getTemplate().isMale ? 0 : 1;
}

public int getFace()
{
return _face;
}

public void setFace(int face)
{
_face = face;
}

public int getHairColor()
{
return _hairColor;
}

public void setHairColor(int hairColor)
{
_hairColor = hairColor;
}

public int getHairStyle()
{
return _hairStyle;
}

public void setHairStyle(int hairStyle)
{
_hairStyle = hairStyle;
}

public void offline()
{
if(_connection != null)
{
_connection.setActiveChar(null);
_connection.close(ServerClose.STATIC);
setNetConnection(null);
}

setNameColor(Config.SERVICES_OFFLINE_TRADE_NAME_COLOR);
setOfflineMode(true);

setVar("offline", String.valueOf(System.currentTimeMillis() / 1000L), -1);

if(Config.SERVICES_OFFLINE_TRADE_SECONDS_TO_KICK > 0)
startKickTask(Config.SERVICES_OFFLINE_TRADE_SECONDS_TO_KICK * 1000L);

Party party = getParty();
if(party != null)
{
if(isFestivalParticipant())
party.broadcastMessageToPartyMembers(getName() + " has been removed from the upcoming festival.");
leaveParty();
}

if(getPet() != null)
{
getPet().saveEffects();
getPet().unSummon();
}

CursedWeaponsManager.getInstance().doLogout(this);

if(isInOlympiadMode() || getOlympiadGame() != null)
Olympiad.logoutPlayer(this);

if(isInObserverMode())
{
if(getOlympiadObserveGame() == null)
leaveObserverMode();
else
leaveOlympiadObserverMode(true);
_observerMode.set(OBSERVER_NONE);
}

broadcastCharInfo();
stopWaterTask();
stopBonusTask();
stopHourlyTask();
stopVitalityTask();
stopPcBangPointsTask();
stopAutoSaveTask();
stopRecomBonusTask(true);
stopQuestTimers();
getNevitSystem().stopTasksOnLogout();

try
{
getInventory().store();
}
catch(Throwable t)
{
_log.error("", t);
}

try
{
store(false);
}
catch(Throwable t)
{
_log.error("", t);
}
}

/**
* Соединение закрывается, клиент закрывается, персонаж сохраняется и удаляется из игры
* Не пишем надпись NO CARRIER, не ждем
*/
public void kick()
{
if(ftGuard.isProtectionOn())
{
GuardManager.scheduleSendPacketToClient(0, this);
}
if(_connection != null)
{
_connection.close(LeaveWorld.STATIC);
setNetConnection(null);
}
prepareToLogout();
deleteMe();
}

/**
* Соединение не закрывается, клиент не закрывается, персонаж сохраняется и удаляется из игры
*/
public void restart()
{
if(ftGuard.isProtectionOn())
{
GuardManager.scheduleSendPacketToClient(0, this);
}
if(_connection != null)
{
_connection.setActiveChar(null);
setNetConnection(null);
}
prepareToLogout();
if(!Config.SERVICES_ENABLE_NO_CARRIER)
deleteMe();
else
scheduleDelete();
}

/**
* Соединение закрывается, клиент не закрывается, персонаж сохраняется и удаляется из игры
* Пишем надпись NO CARRIER
*/
public void logout()
{
if(ftGuard.isProtectionOn())
{
GuardManager.scheduleSendPacketToClient(0, this);
}
if(_connection != null)
{
store(false);
_connection.close(LeaveWorld.STATIC);
setNetConnection(null);
}
prepareToLogout();
if(!Config.SERVICES_ENABLE_NO_CARRIER)
deleteMe();
else
scheduleDelete();
}

private void prepareToLogout()
{
if(_isLogout.getAndSet(true))
return;

setNetConnection(null);
setIsOnline(false);

getListeners().onExit();

if(isFlying() && !checkLandingState())
_stablePoint = TeleportUtils.getRestartLocation(this, RestartType.TO_VILLAGE);

if(isCastingNow())
abortCast(true, true);

Party party = getParty();

if(party != null && !Config.SERVICES_ENABLE_NO_CARRIER)
{
if(isFestivalParticipant())
party.broadcastMessageToPartyMembers(getName() + " has been removed from the upcoming festival."); //TODO [G1ta0] custom message
leaveParty();
}

CursedWeaponsManager.getInstance().doLogout(this);

if(_olympiadObserveGame != null)
_olympiadObserveGame.removeSpectator(this);

if(isInOlympiadMode() || getOlympiadGame() != null)
Olympiad.logoutPlayer(this);

stopFishing();

if(isInObserverMode())
{
if(getOlympiadObserveGame() == null)
leaveObserverMode();
else
leaveOlympiadObserverMode(true);
_observerMode.set(OBSERVER_NONE);
}

if(_stablePoint != null)
teleToLocation(_stablePoint);

Summon pet = getPet();
if(pet != null)
{
pet.saveEffects();
pet.unSummon();
}

_friendList.notifyFriends(false);

if(isProcessingRequest())
getRequest().cancel();

stopAllTimers();

if(isInBoat())
getBoat().removePlayer(this);

SubUnit unit = getSubUnit();
UnitMember member = unit == null ? null : unit.getUnitMember(getObjectId());
if(member != null)
{
int sponsor = member.getSponsor();
int apprentice = getApprentice();
PledgeShowMemberListUpdate memberUpdate = new PledgeShowMemberListUpdate(this);
for(Player clanMember : _clan.getOnlineMembers(getObjectId()))
{
clanMember.sendPacket(memberUpdate);
if(clanMember.getObjectId() == sponsor)
clanMember.sendPacket(new SystemMessage(SystemMessage.S1_YOUR_CLAN_ACADEMYS_APPRENTICE_HAS_LOGGED_OUT).addString(_name));
else if(clanMember.getObjectId() == apprentice)
clanMember.sendPacket(new SystemMessage(SystemMessage.S1_YOUR_CLAN_ACADEMYS_SPONSOR_HAS_LOGGED_OUT).addString(_name));
}
member.setPlayerInstance(this, true);
}

FlagItemAttachment attachment = getActiveWeaponFlagAttachment();
if(attachment != null)
attachment.onLogout(this);

if(CursedWeaponsManager.getInstance().getCursedWeapon(getCursedWeaponEquippedId()) != null)
CursedWeaponsManager.getInstance().getCursedWeapon(getCursedWeaponEquippedId()).setPlayer(null);

MatchingRoom room = getMatchingRoom();
if(room != null)
{
if(room.getLeader() == this)
room.disband();
else
room.removeMember(this, false);
}
setMatchingRoom(null);

MatchingRoomManager.getInstance().removeFromWaitingList(this);

destroyAllTraps();

if(_decoy != null)
{
_decoy.unSummon();
_decoy = null;
}

stopPvPFlag();

if (_event != null)
_event.onLogout(this);

Reflection ref = getReflection();

if(ref != ReflectionManager.DEFAULT)
{
if(ref.getReturnLoc() != null)
_stablePoint = ref.getReturnLoc();

ref.removeObject(this);
}

try
{
getInventory().store();
getRefund().clear();
}
catch(Throwable t)
{
_log.error("", t);
}

try
{
store(false);
}
catch(Throwable t)
{
_log.error("", t);
}
}

/**
* @return a table containing all L2RecipeList of the L2Player.<BR><BR>
*/
public Collection<Recipe> getDwarvenRecipeBook()
{
return _recipebook.values();
}

public Collection<Recipe> getCommonRecipeBook()
{
return _commonrecipebook.values();
}

public int recipesCount()
{
return _commonrecipebook.size() + _recipebook.size();
}

public boolean hasRecipe(final Recipe id)
{
return _recipebook.containsValue(id) || _commonrecipebook.containsValue(id);
}

public boolean findRecipe(final int id)
{
return _recipebook.containsKey(id) || _commonrecipebook.containsKey(id);
}

/**
* Add a new L2RecipList to the table _recipebook containing all L2RecipeList of the L2Player
*/
public void registerRecipe(final Recipe recipe, boolean saveDB)
{
if(recipe == null)
return;
if(recipe.isDwarvenRecipe())
_recipebook.put(recipe.getId(), recipe);
else
_commonrecipebook.put(recipe.getId(), recipe);
if(saveDB)
mysql.set("REPLACE INTO character_recipebook (char_id, id) VALUES(?,?)", getObjectId(), recipe.getId());
}

/**
* Remove a L2RecipList from the table _recipebook containing all L2RecipeList of the L2Player
*/
public void unregisterRecipe(final int RecipeID)
{
if(_recipebook.containsKey(RecipeID))
{
mysql.set("DELETE FROM `character_recipebook` WHERE `char_id`=? AND `id`=? LIMIT 1", getObjectId(), RecipeID);
_recipebook.remove(RecipeID);
}
else if(_commonrecipebook.containsKey(RecipeID))
{
mysql.set("DELETE FROM `character_recipebook` WHERE `char_id`=? AND `id`=? LIMIT 1", getObjectId(), RecipeID);
_commonrecipebook.remove(RecipeID);
}
else
_log.warn("Attempted to remove unknown RecipeList" + RecipeID);
}

// ------------------- Quest Engine ----------------------

public QuestState getQuestState(String quest)
{
questRead.lock();
try
{
return _quests.get(quest);
}
finally
{
questRead.unlock();
}
}

public QuestState getQuestState(Class<?> quest)
{
return getQuestState(quest.getSimpleName());
}

public boolean isQuestCompleted(String quest)
{
QuestState q = getQuestState(quest);
return q != null && q.isCompleted();
}

public boolean isQuestCompleted(Class<?> quest)
{
QuestState q = getQuestState(quest);
return q != null && q.isCompleted();
}

public void setQuestState(QuestState qs)
{
questWrite.lock();
try
{
_quests.put(qs.getQuest().getName(), qs);
}
finally
{
questWrite.unlock();
}
}

public void removeQuestState(String quest)
{
questWrite.lock();
try
{
_quests.remove(quest);
}
finally
{
questWrite.unlock();
}
}

public Quest[] getAllActiveQuests()
{
List<Quest> quests = new ArrayList<Quest>(_quests.size());
questRead.lock();
try
{
for(final QuestState qs : _quests.values())
if(qs.isStarted())
quests.add(qs.getQuest());
}
finally
{
questRead.unlock();
}
return quests.toArray(new Quest[quests.size()]);
}

public QuestState[] getAllQuestsStates()
{
questRead.lock();
try
{
return _quests.values().toArray(new QuestState[_quests.size()]);
}
finally
{
questRead.unlock();
}
}

public List<QuestState> getQuestsForEvent(NpcInstance npc, QuestEventType event)
{
List<QuestState> states = new ArrayList<QuestState>();
Quest[] quests = npc.getTemplate().getEventQuests(event);
QuestState qs;
if(quests != null)
for(Quest quest : quests)
{
qs = getQuestState(quest.getName());
if(qs != null && !qs.isCompleted())
states.add(getQuestState(quest.getName()));
}
return states;
}

public void processQuestEvent(String quest, String event, NpcInstance npc)
{
if(event == null)
event = "";
QuestState qs = getQuestState(quest);
if(qs == null)
{
Quest q = QuestManager.getQuest(quest);
if(q == null)
{
_log.warn("Quest " + quest + " not found!");
return;
}
qs = q.newQuestState(this, Quest.CREATED);
}
if(qs == null || qs.isCompleted())
return;
qs.getQuest().notifyEvent(event, qs, npc);
sendPacket(new QuestList(this));
}

/**
* Проверка на переполнение инвентаря и перебор в весе для квестов и эвентов
*
* @return true если ве проверки прошли успешно
*/
public boolean isQuestContinuationPossible(boolean msg)
{
if(getWeightPenalty() >= 3 || getInventoryLimit() * 0.9 < getInventory().getSize() || Config.QUEST_INVENTORY_MAXIMUM * 0.9 < getInventory().getQuestSize())
{
if(msg)
sendPacket(Msg.PROGRESS_IN_A_QUEST_IS_POSSIBLE_ONLY_WHEN_YOUR_INVENTORYS_WEIGHT_AND_VOLUME_ARE_LESS_THAN_80_PERCENT_OF_CAPACITY);
return false;
}
return true;
}

/**
* Останавливаем и запоминаем все квестовые таймеры
*/
public void stopQuestTimers()
{
for(QuestState qs : getAllQuestsStates())
if(qs.isStarted())
qs.pauseQuestTimers();
else
qs.stopQuestTimers();
}

/**
* Восстанавливаем все квестовые таймеры
*/
public void resumeQuestTimers()
{
for(QuestState qs : getAllQuestsStates())
qs.resumeQuestTimers();
}

// ----------------- End of Quest Engine -------------------

public Collection<ShortCut> getAllShortCuts()
{
return _shortCuts.getAllShortCuts();
}

public ShortCut getShortCut(int slot, int page)
{
return _shortCuts.getShortCut(slot, page);
}

public void registerShortCut(ShortCut shortcut)
{
_shortCuts.registerShortCut(shortcut);
}

public void deleteShortCut(int slot, int page)
{
_shortCuts.deleteShortCut(slot, page);
}

public void registerMacro(Macro macro)
{
_macroses.registerMacro(macro);
}

public void deleteMacro(int id)
{
_macroses.deleteMacro(id);
}

public MacroList getMacroses()
{
return _macroses;
}

public boolean isCastleLord(int castleId)
{
return _clan != null && isClanLeader() && _clan.getCastle() == castleId;
}

/**
* Проверяет является ли этот персонаж владельцем крепости
*
* @param fortressId
* @return true если владелец
*/
public boolean isFortressLord(int fortressId)
{
return _clan != null && isClanLeader() && _clan.getHasFortress() == fortressId;
}

public int getPkKills()
{
return _pkKills;
}

public void setPkKills(final int pkKills)
{
_pkKills = pkKills;
}

public long getCreateTime()
{
return _createTime;
}

public void setCreateTime(final long createTime)
{
_createTime = createTime;
}

public int getDeleteTimer()
{
return _deleteTimer;
}

public void setDeleteTimer(final int deleteTimer)
{
_deleteTimer = deleteTimer;
}

public int getCurrentLoad()
{
return getInventory().getTotalWeight();
}

public long getLastAccess()
{
return _lastAccess;
}

public void setLastAccess(long value)
{
_lastAccess = value;
}

public int getRecomHave()
{
return _recomHave;
}

public void setRecomHave(int value)
{
if(value > 255)
_recomHave = 255;
else if(value < 0)
_recomHave = 0;
else
_recomHave = value;
}

public int getRecomBonusTime()
{
if(_recomBonusTask != null)
return (int) Math.max(0, _recomBonusTask.getDelay(TimeUnit.SECONDS));
return _recomBonusTime;
}

public void setRecomBonusTime(int val)
{
_recomBonusTime = val;
}

public int getRecomLeft()
{
return _recomLeft;
}

public void setRecomLeft(final int value)
{
_recomLeft = value;
}

public boolean isHourglassEffected()
{
return _isHourglassEffected;
}

public void setHourlassEffected(boolean val)
{
_isHourglassEffected = val;
}

public void startHourglassEffect()
{
setHourlassEffected(true);
stopRecomBonusTask(true);
sendVoteSystemInfo();
}

public void stopHourglassEffect()
{
setHourlassEffected(false);
startRecomBonusTask();
sendVoteSystemInfo();
}

public int addRecomLeft()
{
int recoms = 0;
if(getRecomLeftToday() < 20)
recoms = 10;
else
recoms = 1;
setRecomLeft(getRecomLeft() + recoms);
setRecomLeftToday(getRecomLeftToday() + recoms);
sendUserInfo(true);
return recoms;
}

public int getRecomLeftToday()
{
return _recomLeftToday;
}

public void setRecomLeftToday(final int value)
{
_recomLeftToday = value;
setVar("recLeftToday", String.valueOf(_recomLeftToday), -1);
}

public void giveRecom(final Player target)
{
int targetRecom = target.getRecomHave();
if(targetRecom < 255)
target.addRecomHave(1);
if(getRecomLeft() > 0)
setRecomLeft(getRecomLeft() - 1);

sendUserInfo(true);
}

public void addRecomHave(final int val)
{
setRecomHave(getRecomHave() + val);
broadcastUserInfo(true);
sendVoteSystemInfo();
}

public int getRecomBonus()
{
if(getRecomBonusTime() > 0 || isHourglassEffected())
return RecomBonus.getRecoBonus(this);
return 0;
}

public double getRecomBonusMul()
{
if(getRecomBonusTime() > 0 || isHourglassEffected())
return RecomBonus.getRecoMultiplier(this);
return 1;
}

public void sendVoteSystemInfo()
{
sendPacket(new ExVoteSystemInfo(this));
}

public boolean isRecomTimerActive()
{
return _isRecomTimerActive;
}

public void setRecomTimerActive(boolean val)
{
if(_isRecomTimerActive == val)
return;

_isRecomTimerActive = val;

if(val)
startRecomBonusTask();
else
stopRecomBonusTask(true);

sendVoteSystemInfo();
}

private ScheduledFuture<?> _recomBonusTask;

public void startRecomBonusTask()
{
if(_recomBonusTask == null && getRecomBonusTime() > 0 && isRecomTimerActive() && !isHourglassEffected())
_recomBonusTask = ThreadPoolManager.getInstance().schedule(new RecomBonusTask(this), getRecomBonusTime() * 1000);
}

public void stopRecomBonusTask(boolean saveTime)
{
if(_recomBonusTask != null)
{
if(saveTime)
setRecomBonusTime((int) Math.max(0, _recomBonusTask.getDelay(TimeUnit.SECONDS)));
_recomBonusTask.cancel(false);
_recomBonusTask = null;
}
}

@Override
public int getKarma()
{
return _karma;
}

public void setKarma(int karma)
{
if(karma < 0)
karma = 0;

if(_karma == karma)
return;

_karma = karma;

sendChanges();

if(getPet() != null)
getPet().broadcastCharInfo();
}

@Override
public int getMaxLoad()
{
// Weight Limit = (CON Modifier*69000)*Skills
// Source http://l2ft.bravehost.com/weightlimit.html (May 2007)
// Fitted exponential curve to the data
int con = getCON();
if(con < 1)
return (int) (31000 * Config.MAXLOAD_MODIFIER);
else if(con > 59)
return (int) (176000 * Config.MAXLOAD_MODIFIER);
else
return (int) calcStat(Stats.MAX_LOAD, Math.pow(1.029993928, con) * 30495.627366 * Config.MAXLOAD_MODIFIER, this, null);
}

private Future<?> _updateEffectIconsTask;

private class UpdateEffectIcons extends RunnableImpl
{
@Override
public void runImpl() throws Exception
{
updateEffectIconsImpl();
_updateEffectIconsTask = null;
}
}

@Override
public void updateEffectIcons()
{
if(entering || isLogoutStarted())
return;

if(Config.USER_INFO_INTERVAL == 0)
{
if(_updateEffectIconsTask != null)
{
_updateEffectIconsTask.cancel(false);
_updateEffectIconsTask = null;
}
updateEffectIconsImpl();
return;
}

if(_updateEffectIconsTask != null)
return;

_updateEffectIconsTask = ThreadPoolManager.getInstance().schedule(new UpdateEffectIcons(), Config.USER_INFO_INTERVAL);
}

public void updateEffectIconsImpl()
{
Effect[] effects = getEffectList().getAllFirstEffects();
Arrays.sort(effects, EffectsComparator.getInstance());

PartySpelled ps = new PartySpelled(this, false);
AbnormalStatusUpdate mi = new AbnormalStatusUpdate();

for(Effect effect : effects)
if(effect.isInUse())
{
if(effect.getStackType().equals(EffectTemplate.HP_RECOVER_CAST))
sendPacket(new ShortBuffStatusUpdate(effect));
else
effect.addIcon(mi);
if(_party != null)
effect.addPartySpelledIcon(ps);
}

sendPacket(mi);
if(_party != null)
_party.broadCast(ps);

if(isInOlympiadMode() && isOlympiadCompStart())
{
OlympiadGame olymp_game = _olympiadGame;
if(olymp_game != null)
{
ExOlympiadSpelledInfo olympiadSpelledInfo = new ExOlympiadSpelledInfo();

for(Effect effect : effects)
if(effect != null && effect.isInUse())
effect.addOlympiadSpelledIcon(this, olympiadSpelledInfo);

if(olymp_game.getType() == CompType.CLASSED || olymp_game.getType() == CompType.NON_CLASSED)
for(Player member : olymp_game.getTeamMembers(this))
member.sendPacket(olympiadSpelledInfo);

for(Player member : olymp_game.getSpectators())
member.sendPacket(olympiadSpelledInfo);
}
}
}

public int getWeightPenalty()
{
return getSkillLevel(4270, 0);
}

public void refreshOverloaded()
{
if(isLogoutStarted() || getMaxLoad() <= 0)
return;

setOverloaded(getCurrentLoad() > getMaxLoad());
double weightproc = 100. * (getCurrentLoad() - calcStat(Stats.MAX_NO_PENALTY_LOAD, 0, this, null)) / getMaxLoad();
int newWeightPenalty = 0;

if(weightproc < 50)
newWeightPenalty = 0;
else if(weightproc < 66.6)
newWeightPenalty = 1;
else if(weightproc < 80)
newWeightPenalty = 2;
else if(weightproc < 100)
newWeightPenalty = 3;
else
newWeightPenalty = 4;

int current = getWeightPenalty();
if(current == newWeightPenalty)
return;

if(newWeightPenalty > 0)
super.addSkill(SkillTable.getInstance().getInfo(4270, newWeightPenalty));
else
super.removeSkill(getKnownSkill(4270));

sendPacket(new SkillList(this));
sendEtcStatusUpdate();
updateStats();
}

public int getArmorsExpertisePenalty()
{
return getSkillLevel(6213, 0);
}

public int getWeaponsExpertisePenalty()
{
return getSkillLevel(6209, 0);
}

public int getExpertisePenalty(ItemInstance item)
{
if(item.getTemplate().getType2() == ItemTemplate.TYPE2_WEAPON)
return getWeaponsExpertisePenalty();
else if(item.getTemplate().getType2() == ItemTemplate.TYPE2_SHIELD_ARMOR || item.getTemplate().getType2() == ItemTemplate.TYPE2_ACCESSORY)
return getArmorsExpertisePenalty();
return 0;
}

public void refreshExpertisePenalty()
{
if(isLogoutStarted())
return;

boolean skillUpdate = false; // Для того, чтобы лишний раз не посылать пакеты

int level = (int) calcStat(Stats.GRADE_EXPERTISE_LEVEL, getLevel(), null, null);
int i = 0;
for (i = 0; (i < EXPERTISE_LEVELS.length) && (level >= EXPERTISE_LEVELS[(i + 1)]); i++);
if (expertiseIndex != i)
{
expertiseIndex = i;
if (expertiseIndex > 0 && Config.EXPERTISE_PENALTY) //TODO кто делал??? не тут нужно!!! переделайте с проверкой на эпик итем!!! добавлено Config.EPIC_EXPERTISE_PENALTY
{
addSkill(SkillTable.getInstance().getInfo(239, expertiseIndex), false);
skillUpdate = true;
}
}

int newWeaponPenalty = 0;
int newArmorPenalty = 0;
ItemInstance[] items = getInventory().getPaperdollItems();
for(ItemInstance item : items)
if(item != null)
{
int crystaltype = item.getTemplate().getCrystalType().ordinal();
if(item.getTemplate().getType2() == ItemTemplate.TYPE2_WEAPON)
{
if(crystaltype > newWeaponPenalty)
newWeaponPenalty = crystaltype;
}
else if(item.getTemplate().getType2() == ItemTemplate.TYPE2_SHIELD_ARMOR || item.getTemplate().getType2() == ItemTemplate.TYPE2_ACCESSORY)
if(crystaltype > newArmorPenalty)
newArmorPenalty = crystaltype;
}

newWeaponPenalty = newWeaponPenalty - expertiseIndex;
if(newWeaponPenalty <= 0)
newWeaponPenalty = 0;
else if(newWeaponPenalty >= 4)
newWeaponPenalty = 4;

newArmorPenalty = newArmorPenalty - expertiseIndex;
if(newArmorPenalty <= 0)
newArmorPenalty = 0;
else if(newArmorPenalty >= 4)
newArmorPenalty = 4;

int weaponExpertise = getWeaponsExpertisePenalty();
int armorExpertise = getArmorsExpertisePenalty();

if(weaponExpertise != newWeaponPenalty)
{
weaponExpertise = newWeaponPenalty;
if(newWeaponPenalty > 0 && Config.EXPERTISE_PENALTY)
super.addSkill(SkillTable.getInstance().getInfo(6209, weaponExpertise));
else
super.removeSkill(getKnownSkill(6209));
skillUpdate = true;
}
if(armorExpertise != newArmorPenalty)
{
armorExpertise = newArmorPenalty;
if(newArmorPenalty > 0 && Config.EXPERTISE_PENALTY)
super.addSkill(SkillTable.getInstance().getInfo(6213, armorExpertise));
else
super.removeSkill(getKnownSkill(6213));
skillUpdate = true;
}

if(skillUpdate)
{
getInventory().validateItemsSkills();

sendPacket(new SkillList(this));
sendEtcStatusUpdate();
updateStats();
}
}

public int getPvpKills()
{
return _pvpKills;
}

public void setPvpKills(int pvpKills)
{
_pvpKills = pvpKills;
}

public ClassId getClassId()
{
return getTemplate().classId;
}

public void addClanPointsOnProfession(final int id)
{
if(getLvlJoinedAcademy() != 0 && _clan != null && _clan.getLevel() >= 5 && ClassId.VALUES[id].getLevel() == 2)
_clan.incReputation(100, true, "Academy");
else if(getLvlJoinedAcademy() != 0 && _clan != null && _clan.getLevel() >= 5 && ClassId.VALUES[id].getLevel() == 3)
{
int earnedPoints = 0;
if(getLvlJoinedAcademy() <= 16)
earnedPoints = Config.MAX_ACADEM_POINT;
else if(getLvlJoinedAcademy() >= 39)
earnedPoints = Config.MIN_ACADEM_POINT;
else
earnedPoints = Config.MAX_ACADEM_POINT - (getLvlJoinedAcademy() - 16) * 20;

_clan.removeClanMember(getObjectId());

SystemMessage sm = new SystemMessage(SystemMessage.CLAN_ACADEMY_MEMBER_S1_HAS_SUCCESSFULLY_COMPLETED_THE_2ND_CLASS_TRANSFER_AND_OBTAINED_S2_CLAN_REPUTATION_POINTS);
sm.addString(getName());
sm.addNumber(_clan.incReputation(earnedPoints, true, "Academy"));
_clan.broadcastToOnlineMembers(sm);
_clan.broadcastToOtherOnlineMembers(new PledgeShowMemberListDelete(getName()), this);

setClan(null);
setTitle("");
sendPacket(Msg.CONGRATULATIONS_YOU_WILL_NOW_GRADUATE_FROM_THE_CLAN_ACADEMY_AND_LEAVE_YOUR_CURRENT_CLAN_AS_A_GRADUATE_OF_THE_ACADEMY_YOU_CAN_IMMEDIATELY_JOIN_A_CLAN_AS_A_REGULAR_MEMBER_WITHOUT_BEING_SUBJECT_TO_ANY_PENALTIES);
setLeaveClanTime(0);

broadcastCharInfo();

sendPacket(PledgeShowMemberListDeleteAll.STATIC);

ItemFunctions.addItem(this, 8181, 1, true);
}
}

/**
* Set the template of the L2Player.
*
* @param id The Identifier of the L2PlayerTemplate to set to the L2Player
*/
public synchronized void setClassId(final int id, boolean noban, boolean fromQuest)
{
if(!noban && !(ClassId.VALUES[id].equalsOrChildOf(ClassId.VALUES[getActiveClassId()]) || getPlayerAccess().CanChangeClass || Config.EVERYBODY_HAS_ADMIN_RIGHTS))
{
//Thread.dumpStack();
return;
}

//Если новый ID не принадлежит имеющимся классам значит это новая профа
if(!getSubClasses().containsKey(id))
{
final SubClass cclass = getActiveClass();
getSubClasses().remove(getActiveClassId());
changeClassInDb(cclass.getClassId(), id);
if(cclass.isBase())
{
setBaseClass(id);
addClanPointsOnProfession(id);
ItemInstance coupons = null;
if(ClassId.VALUES[id].getLevel() == 2)
{
if(fromQuest && Config.ALT_ALLOW_SHADOW_WEAPONS)
coupons = ItemFunctions.createItem(8869);
unsetVar("newbieweapon");
unsetVar("p1q2");
unsetVar("p1q3");
unsetVar("p1q4");
unsetVar("prof1");
unsetVar("ng1");
unsetVar("ng2");
unsetVar("ng3");
unsetVar("ng4");
}
else if(ClassId.VALUES[id].getLevel() == 3)
{
if(fromQuest && Config.ALT_ALLOW_SHADOW_WEAPONS)
coupons = ItemFunctions.createItem(8870);
unsetVar("newbiearmor");
unsetVar("dd1"); // удаляем отметки о выдаче дименшен даймондов
unsetVar("dd2");
unsetVar("dd3");
unsetVar("prof2.1");
unsetVar("prof2.2");
unsetVar("prof2.3");
}

if(coupons != null)
{
coupons.setCount(15);
sendPacket(SystemMessage2.obtainItems(coupons));
getInventory().addItem(coupons);
}
}

// Выдача Holy Pomander
// Выдача Support Power
switch(ClassId.VALUES[id])
{
case cardinal:
ItemFunctions.addItem(this, 15307, 1, true);
if(Config.USER_NAME.equalsIgnoreCase("Castor") && AddonsConfig.getBoolean("AllowSupportPower", false))
ItemFunctions.addItem(this, 24001, 1, true);
break;
case hierophant:
if(Config.USER_NAME.equalsIgnoreCase("Castor") && AddonsConfig.getBoolean("AllowSupportPower", false))
ItemFunctions.addItem(this, 24001, 1, true);
break;
case swordMuse:
if(Config.USER_NAME.equalsIgnoreCase("Castor") && AddonsConfig.getBoolean("AllowSupportPower", false))
ItemFunctions.addItem(this, 24001, 1, true);
break;
case evaSaint:
ItemFunctions.addItem(this, 15308, 1, true);
if(Config.USER_NAME.equalsIgnoreCase("Castor") && AddonsConfig.getBoolean("AllowSupportPower", false))
ItemFunctions.addItem(this, 24001, 1, true);
break;
case spectralDancer:
ItemFunctions.addItem(this, 24001, 1, true);
break;
case shillienSaint:
ItemFunctions.addItem(this, 15309, 4, true);
if(Config.USER_NAME.equalsIgnoreCase("Castor") && AddonsConfig.getBoolean("AllowSupportPower", false))
ItemFunctions.addItem(this, 24001, 1, true);
break;
case dominator:
if(Config.USER_NAME.equalsIgnoreCase("Castor") && AddonsConfig.getBoolean("AllowSupportPower", false))
ItemFunctions.addItem(this, 24001, 1, true);
break;
case doomcryer:
if(Config.USER_NAME.equalsIgnoreCase("Castor") && AddonsConfig.getBoolean("AllowSupportPower", false))
ItemFunctions.addItem(this, 24001, 1, true);
break;
}

cclass.setClassId(id);
getSubClasses().put(id, cclass);
rewardSkills(true);
storeCharSubClasses();

if(fromQuest)
{
// Социалка при получении профы
broadcastPacket(new MagicSkillUse(this, this, 5103, 1, 1000, 0));
sendPacket(new PlaySound("ItemSound.quest_fanfare_2"));
}
broadcastCharInfo();
}

PlayerTemplate t = CharTemplateHolder.getInstance().getTemplate(id, getSex() == 1);
if(t == null)
{
_log.error("Missing template for classId: " + id);
// do not throw error - only print error
return;
}

// Set the template of the L2Player
_template = t;

// Update class icon in party and clan
if(isInParty())
getParty().broadCast(new PartySmallWindowUpdate(this));
if(getClan() != null)
getClan().broadcastToOnlineMembers(new PledgeShowMemberListUpdate(this));
if(_matchingRoom != null)
_matchingRoom.broadcastPlayerUpdate(this);
}

public long getExp()
{
return _activeClass == null ? 0 : _activeClass.getExp();
}

public long getMaxExp()
{
return _activeClass == null ? Experience.LEVEL[Experience.getMaxLevel() + 1] : _activeClass.getMaxExp();
}

public void set...
Ответ
#5
Ошибка в строке
Цитата:if(Config.USER_NAME.equalsIgnoreCase("Castor") && AddonsConfig.getBoolean("AllowSupportPower", false))

Поэтому я склонен думать что эта переменная (Config.USER_NAME) в конфиге пустая
Ответ
#6
KID Написал:Ошибка в строке


Поэтому я склонен думать что эта переменная (Config.USER_NAME) в конфиге пустая

... или с пробелами.
Fortuna - non penis, in manus non recipe.
Ответ
#7
Вот все что было в етом конфиге AllowSupportPower = False
Ответ
#8
Литион Написал:Вот все что было в етом конфиге AllowSupportPower = False

А в этом "Config.USER_NAME"? Вам про этот говорили.
Fortuna - non penis, in manus non recipe.
Ответ
#9
Ashe Написал:А в этом "Config.USER_NAME"? Вам про этот говорили.
Такова не нашел вопше.
Ответ
#10
Ashe Написал:... или с пробелами.
пробелы не вызывают NullPointer

Литион Написал:Такова не нашел вопше.
Сделай, ошибки не будет
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Что за ошибка? serg5777 22 10,252 07-11-2023, 09:49 PM
Последний пост: ntking
  Ошибка Cannot read field "race" valdemart123 0 1,297 12-04-2021, 04:44 AM
Последний пост: valdemart123
  При запуске game server на сайте (sw13) ошибка mysql 0 AndreDeiu 1 1,714 09-27-2020, 11:32 PM
Последний пост: Lord_Gothic
  Ошибка геймсервера zane 9 3,018 04-27-2018, 12:28 PM
Последний пост: DmnC
  Ошибка загрузки гейм сервера zane 5 2,393 04-17-2018, 08:03 PM
Последний пост: zane
  Ошибка телепорта Rork 1 1,473 03-02-2018, 03:05 PM
Последний пост: Gaikotsu
  Ошибка с ГМ шопом silok 1 1,503 01-11-2018, 07:36 AM
Последний пост: Narsell
  Ошибка PWSOFT Ananim 0 1,547 07-07-2017, 11:42 AM
Последний пост: Ananim
  Ошибка _aveList; knaif 1 1,599 06-22-2017, 03:07 PM
Последний пост: Trimius
  Ошибка KastaMeN 1 1,997 06-16-2017, 11:32 PM
Последний пост: Mangol

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)