|
@@ -26,6 +26,7 @@ import java.util.Calendar;
|
|
import java.util.Collection;
|
|
import java.util.Collection;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
|
+import java.util.Map.Entry;
|
|
import java.util.Set;
|
|
import java.util.Set;
|
|
import java.util.concurrent.Future;
|
|
import java.util.concurrent.Future;
|
|
import java.util.concurrent.ScheduledFuture;
|
|
import java.util.concurrent.ScheduledFuture;
|
|
@@ -129,6 +130,7 @@ import com.l2jserver.gameserver.model.PartyMatchRoomList;
|
|
import com.l2jserver.gameserver.model.PartyMatchWaitingList;
|
|
import com.l2jserver.gameserver.model.PartyMatchWaitingList;
|
|
import com.l2jserver.gameserver.model.ShortCuts;
|
|
import com.l2jserver.gameserver.model.ShortCuts;
|
|
import com.l2jserver.gameserver.model.TerritoryWard;
|
|
import com.l2jserver.gameserver.model.TerritoryWard;
|
|
|
|
+import com.l2jserver.gameserver.model.TimeStamp;
|
|
import com.l2jserver.gameserver.model.TradeList;
|
|
import com.l2jserver.gameserver.model.TradeList;
|
|
import com.l2jserver.gameserver.model.actor.L2Attackable;
|
|
import com.l2jserver.gameserver.model.actor.L2Attackable;
|
|
import com.l2jserver.gameserver.model.actor.L2Character;
|
|
import com.l2jserver.gameserver.model.actor.L2Character;
|
|
@@ -221,6 +223,7 @@ import com.l2jserver.gameserver.network.serverpackets.ExSetCompassZoneCode;
|
|
import com.l2jserver.gameserver.network.serverpackets.ExSpawnEmitter;
|
|
import com.l2jserver.gameserver.network.serverpackets.ExSpawnEmitter;
|
|
import com.l2jserver.gameserver.network.serverpackets.ExStartScenePlayer;
|
|
import com.l2jserver.gameserver.network.serverpackets.ExStartScenePlayer;
|
|
import com.l2jserver.gameserver.network.serverpackets.ExStorageMaxCount;
|
|
import com.l2jserver.gameserver.network.serverpackets.ExStorageMaxCount;
|
|
|
|
+import com.l2jserver.gameserver.network.serverpackets.ExUseSharedGroupItem;
|
|
import com.l2jserver.gameserver.network.serverpackets.ExVitalityPointInfo;
|
|
import com.l2jserver.gameserver.network.serverpackets.ExVitalityPointInfo;
|
|
import com.l2jserver.gameserver.network.serverpackets.ExVoteSystemInfo;
|
|
import com.l2jserver.gameserver.network.serverpackets.ExVoteSystemInfo;
|
|
import com.l2jserver.gameserver.network.serverpackets.FriendStatusPacket;
|
|
import com.l2jserver.gameserver.network.serverpackets.FriendStatusPacket;
|
|
@@ -296,6 +299,11 @@ public final class L2PcInstance extends L2Playable
|
|
private static final String RESTORE_SKILL_SAVE = "SELECT skill_id,skill_level,effect_count,effect_cur_time, reuse_delay, systime, restore_type FROM character_skills_save WHERE charId=? AND class_index=? ORDER BY buff_index ASC";
|
|
private static final String RESTORE_SKILL_SAVE = "SELECT skill_id,skill_level,effect_count,effect_cur_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=?";
|
|
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:
|
|
// 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 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=?,punish_level=?,punish_timer=?,newbie=?,nobless=?,power_grade=?,subpledge=?,lvl_joined_academy=?,apprentice=?,sponsor=?,varka_ketra_ally=?,clan_join_expiry_time=?,clan_create_expiry_time=?,char_name=?,death_penalty_level=?,bookmarkslot=?,vitality_points=?,language=? WHERE charId=?";
|
|
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=?,punish_level=?,punish_timer=?,newbie=?,nobless=?,power_grade=?,subpledge=?,lvl_joined_academy=?,apprentice=?,sponsor=?,varka_ketra_ally=?,clan_join_expiry_time=?,clan_create_expiry_time=?,char_name=?,death_penalty_level=?,bookmarkslot=?,vitality_points=?,language=? WHERE charId=?";
|
|
@@ -464,6 +472,11 @@ public final class L2PcInstance extends L2Playable
|
|
private long _punishTimer = 0;
|
|
private long _punishTimer = 0;
|
|
private ScheduledFuture<?> _punishTask;
|
|
private ScheduledFuture<?> _punishTask;
|
|
|
|
|
|
|
|
+ private boolean _canFeed;
|
|
|
|
+ private int _eventEffectId = 0;
|
|
|
|
+ private boolean _isInSiege;
|
|
|
|
+ private boolean _isInHideoutSiege = false;
|
|
|
|
+
|
|
public enum PunishLevel
|
|
public enum PunishLevel
|
|
{
|
|
{
|
|
NONE(0, ""),
|
|
NONE(0, ""),
|
|
@@ -4289,7 +4302,7 @@ public final class L2PcInstance extends L2Playable
|
|
public void enableSkill(L2Skill skill)
|
|
public void enableSkill(L2Skill skill)
|
|
{
|
|
{
|
|
super.enableSkill(skill);
|
|
super.enableSkill(skill);
|
|
- _reuseTimeStamps.remove(skill.getReuseHashCode());
|
|
|
|
|
|
+ _reuseTimeStampsSkills.remove(skill.getReuseHashCode());
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -7435,6 +7448,8 @@ public final class L2PcInstance extends L2Playable
|
|
if (Config.STORE_SKILL_COOLTIME)
|
|
if (Config.STORE_SKILL_COOLTIME)
|
|
player.restoreEffects();
|
|
player.restoreEffects();
|
|
|
|
|
|
|
|
+ player.restoreItemReuse();
|
|
|
|
+
|
|
// Restore current Cp, HP and MP values
|
|
// Restore current Cp, HP and MP values
|
|
player.setCurrentCp(currentCp);
|
|
player.setCurrentCp(currentCp);
|
|
player.setCurrentHp(currentHp);
|
|
player.setCurrentHp(currentHp);
|
|
@@ -7763,6 +7778,7 @@ public final class L2PcInstance extends L2Playable
|
|
storeCharBase();
|
|
storeCharBase();
|
|
storeCharSub();
|
|
storeCharSub();
|
|
storeEffect(storeActiveEffects);
|
|
storeEffect(storeActiveEffects);
|
|
|
|
+ storeItemReuseDelay();
|
|
transformInsertInfo();
|
|
transformInsertInfo();
|
|
if(Config.STORE_RECIPE_SHOPLIST)
|
|
if(Config.STORE_RECIPE_SHOPLIST)
|
|
storeRecipeShopList();
|
|
storeRecipeShopList();
|
|
@@ -7962,9 +7978,9 @@ public final class L2PcInstance extends L2Playable
|
|
statement.setInt(4, effect.getCount());
|
|
statement.setInt(4, effect.getCount());
|
|
statement.setInt(5, effect.getTime());
|
|
statement.setInt(5, effect.getTime());
|
|
|
|
|
|
- if (_reuseTimeStamps.containsKey(skill.getReuseHashCode()))
|
|
|
|
|
|
+ if (_reuseTimeStampsSkills.containsKey(skill.getReuseHashCode()))
|
|
{
|
|
{
|
|
- TimeStamp t = _reuseTimeStamps.get(skill.getReuseHashCode());
|
|
|
|
|
|
+ TimeStamp t = _reuseTimeStampsSkills.get(skill.getReuseHashCode());
|
|
statement.setLong(6, t.hasNotPassed() ? t.getReuse() : 0);
|
|
statement.setLong(6, t.hasNotPassed() ? t.getReuse() : 0);
|
|
statement.setDouble(7, t.hasNotPassed() ? t.getStamp() : 0);
|
|
statement.setDouble(7, t.hasNotPassed() ? t.getStamp() : 0);
|
|
}
|
|
}
|
|
@@ -7984,13 +8000,17 @@ public final class L2PcInstance extends L2Playable
|
|
|
|
|
|
// Store the reuse delays of remaining skills which
|
|
// Store the reuse delays of remaining skills which
|
|
// lost effect but still under reuse delay. 'restore_type' 1.
|
|
// lost effect but still under reuse delay. 'restore_type' 1.
|
|
- for (int hash : _reuseTimeStamps.keys())
|
|
|
|
|
|
+ int hash;
|
|
|
|
+ TimeStamp t;
|
|
|
|
+ for (Entry<Integer, TimeStamp> ts : _reuseTimeStampsSkills.entrySet())
|
|
{
|
|
{
|
|
|
|
+ hash = ts.getKey();
|
|
if (storedSkills.contains(hash))
|
|
if (storedSkills.contains(hash))
|
|
|
|
+ {
|
|
continue;
|
|
continue;
|
|
-
|
|
|
|
- TimeStamp t = _reuseTimeStamps.get(hash);
|
|
|
|
- if (t != null && t.hasNotPassed())
|
|
|
|
|
|
+ }
|
|
|
|
+ t = ts.getValue();
|
|
|
|
+ if ((t != null) && t.hasNotPassed())
|
|
{
|
|
{
|
|
storedSkills.add(hash);
|
|
storedSkills.add(hash);
|
|
|
|
|
|
@@ -8019,6 +8039,44 @@ public final class L2PcInstance extends L2Playable
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private void storeItemReuseDelay()
|
|
|
|
+ {
|
|
|
|
+ Connection con = null;
|
|
|
|
+ try
|
|
|
|
+ {
|
|
|
|
+ con = L2DatabaseFactory.getInstance().getConnection();
|
|
|
|
+
|
|
|
|
+ PreparedStatement statement = con.prepareStatement(DELETE_ITEM_REUSE_SAVE);
|
|
|
|
+
|
|
|
|
+ statement.setInt(1, getObjectId());
|
|
|
|
+ statement.execute();
|
|
|
|
+ statement.close();
|
|
|
|
+
|
|
|
|
+ statement = con.prepareStatement(ADD_ITEM_REUSE_SAVE);
|
|
|
|
+ for (TimeStamp ts : _reuseTimeStampsItems.values())
|
|
|
|
+ {
|
|
|
|
+ if ((ts != null) && ts.hasNotPassed())
|
|
|
|
+ {
|
|
|
|
+ statement.setInt(1, getObjectId());
|
|
|
|
+ statement.setInt(2, ts.getItemId());
|
|
|
|
+ statement.setInt(3, ts.getItemObjectId());
|
|
|
|
+ statement.setLong(4, ts.getReuse());
|
|
|
|
+ statement.setDouble(5, ts.getStamp());
|
|
|
|
+ statement.execute();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ statement.close();
|
|
|
|
+ }
|
|
|
|
+ catch (Exception e)
|
|
|
|
+ {
|
|
|
|
+ _log.log(Level.WARNING, "Could not store char item reuse data: ", e);
|
|
|
|
+ }
|
|
|
|
+ finally
|
|
|
|
+ {
|
|
|
|
+ L2DatabaseFactory.close(con);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* @return True if the L2PcInstance is on line.
|
|
* @return True if the L2PcInstance is on line.
|
|
*/
|
|
*/
|
|
@@ -8349,6 +8407,79 @@ public final class L2PcInstance extends L2Playable
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Retrieve from the database all Item Reuse Time of this L2PcInstance and add them to the player.
|
|
|
|
+ */
|
|
|
|
+ private void restoreItemReuse()
|
|
|
|
+ {
|
|
|
|
+ Connection con = null;
|
|
|
|
+ try
|
|
|
|
+ {
|
|
|
|
+ con = L2DatabaseFactory.getInstance().getConnection();
|
|
|
|
+ PreparedStatement statement = con.prepareStatement(RESTORE_ITEM_REUSE_SAVE);
|
|
|
|
+ statement.setInt(1, getObjectId());
|
|
|
|
+ final ResultSet rset = statement.executeQuery();
|
|
|
|
+ int itemId;
|
|
|
|
+ @SuppressWarnings("unused")
|
|
|
|
+ int itemObjId;
|
|
|
|
+ long reuseDelay;
|
|
|
|
+ long systime;
|
|
|
|
+ boolean isInInventory;
|
|
|
|
+ long remainingTime;
|
|
|
|
+ while (rset.next())
|
|
|
|
+ {
|
|
|
|
+ itemId = rset.getInt("itemId");
|
|
|
|
+ itemObjId = rset.getInt("itemObjId");
|
|
|
|
+ reuseDelay = rset.getLong("reuseDelay");
|
|
|
|
+ systime = rset.getLong("systime");
|
|
|
|
+ isInInventory = true;
|
|
|
|
+
|
|
|
|
+ // Using item Id
|
|
|
|
+ L2ItemInstance item = getInventory().getItemByItemId(itemId);
|
|
|
|
+ if (item == null)
|
|
|
|
+ {
|
|
|
|
+ item = getWarehouse().getItemByItemId(itemId);
|
|
|
|
+ isInInventory = false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ((item != null) && (item.getItemId() == itemId) && (item.getReuseDelay() > 0))
|
|
|
|
+ {
|
|
|
|
+ remainingTime = systime - System.currentTimeMillis();
|
|
|
|
+ // Hardcoded to 10 seconds.
|
|
|
|
+ if (remainingTime > 10)
|
|
|
|
+ {
|
|
|
|
+ addTimeStampItem(item, reuseDelay, systime);
|
|
|
|
+
|
|
|
|
+ if (isInInventory && item.isEtcItem())
|
|
|
|
+ {
|
|
|
|
+ final int group = item.getSharedReuseGroup();
|
|
|
|
+ if (group > 0)
|
|
|
|
+ {
|
|
|
|
+ sendPacket(new ExUseSharedGroupItem(itemId, group, (int) remainingTime, (int) reuseDelay));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ rset.close();
|
|
|
|
+ statement.close();
|
|
|
|
+
|
|
|
|
+ statement = con.prepareStatement(DELETE_ITEM_REUSE_SAVE);
|
|
|
|
+ statement.setInt(1, getObjectId());
|
|
|
|
+ statement.executeUpdate();
|
|
|
|
+ statement.close();
|
|
|
|
+ }
|
|
|
|
+ catch (Exception e)
|
|
|
|
+ {
|
|
|
|
+ _log.log(Level.WARNING, "Could not restore "+this+" Item Reuse data: " + e.getMessage(), e);
|
|
|
|
+ }
|
|
|
|
+ finally
|
|
|
|
+ {
|
|
|
|
+ L2DatabaseFactory.close(con);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* Retrieve from the database all Henna of this L2PcInstance, add them to _henna and calculate stats of the L2PcInstance.<BR><BR>
|
|
* Retrieve from the database all Henna of this L2PcInstance, add them to _henna and calculate stats of the L2PcInstance.<BR><BR>
|
|
*/
|
|
*/
|
|
@@ -9009,10 +9140,9 @@ public final class L2PcInstance extends L2Playable
|
|
if (isSkillDisabled(skill))
|
|
if (isSkillDisabled(skill))
|
|
{
|
|
{
|
|
SystemMessage sm = null;
|
|
SystemMessage sm = null;
|
|
-
|
|
|
|
- if (_reuseTimeStamps.containsKey(skill.getReuseHashCode()))
|
|
|
|
|
|
+ if (_reuseTimeStampsSkills.containsKey(skill.getReuseHashCode()))
|
|
{
|
|
{
|
|
- int remainingTime = (int)(_reuseTimeStamps.get(skill.getReuseHashCode()).getRemaining()/1000);
|
|
|
|
|
|
+ int remainingTime = (int)(_reuseTimeStampsSkills.get(skill.getReuseHashCode()).getRemaining()/1000);
|
|
int hours = remainingTime/3600;
|
|
int hours = remainingTime/3600;
|
|
int minutes = (remainingTime%3600)/60;
|
|
int minutes = (remainingTime%3600)/60;
|
|
int seconds = (remainingTime%60);
|
|
int seconds = (remainingTime%60);
|
|
@@ -10878,7 +11008,7 @@ public final class L2PcInstance extends L2Playable
|
|
* 2. Register the correct _classId against applied 'classIndex'.
|
|
* 2. Register the correct _classId against applied 'classIndex'.
|
|
*/
|
|
*/
|
|
store(Config.SUBCLASS_STORE_SKILL_COOLTIME);
|
|
store(Config.SUBCLASS_STORE_SKILL_COOLTIME);
|
|
- _reuseTimeStamps.clear();
|
|
|
|
|
|
+ _reuseTimeStampsSkills.clear();
|
|
|
|
|
|
// clear charges
|
|
// clear charges
|
|
_charges.set(0);
|
|
_charges.set(0);
|
|
@@ -13218,96 +13348,81 @@ public final class L2PcInstance extends L2Playable
|
|
addSkill(SkillTable.getInstance().getInfo(5076, getDeathPenaltyBuffLevel()), false);
|
|
addSkill(SkillTable.getInstance().getInfo(5076, getDeathPenaltyBuffLevel()), false);
|
|
}
|
|
}
|
|
|
|
|
|
- private final L2TIntObjectHashMap<TimeStamp> _reuseTimeStamps = new L2TIntObjectHashMap<TimeStamp>();
|
|
|
|
- private boolean _canFeed;
|
|
|
|
- private int _eventEffectId = 0;
|
|
|
|
- private boolean _isInSiege;
|
|
|
|
- private boolean _isInHideoutSiege = false;
|
|
|
|
|
|
+ private FastMap<Integer, TimeStamp> _reuseTimeStampsItems = new FastMap<>();
|
|
|
|
|
|
- public TimeStamp[] getReuseTimeStamps()
|
|
|
|
|
|
+ public void addTimeStampItem(L2ItemInstance item, long reuse)
|
|
{
|
|
{
|
|
- return _reuseTimeStamps.values(new TimeStamp[0]);
|
|
|
|
|
|
+ _reuseTimeStampsItems.put(item.getObjectId(), new TimeStamp(item, reuse));
|
|
}
|
|
}
|
|
|
|
|
|
- public L2TIntObjectHashMap<TimeStamp> getReuseTimeStamp()
|
|
|
|
|
|
+ public void addTimeStampItem(L2ItemInstance item, long reuse, long systime)
|
|
{
|
|
{
|
|
- return _reuseTimeStamps;
|
|
|
|
|
|
+ _reuseTimeStampsItems.put(item.getObjectId(), new TimeStamp(item, reuse, systime));
|
|
}
|
|
}
|
|
|
|
|
|
- /**
|
|
|
|
- * Simple class containing all neccessary information to maintain
|
|
|
|
- * valid timestamps and reuse for skills upon relog. Filter this
|
|
|
|
- * carefully as it becomes redundant to store reuse for small delays.
|
|
|
|
- * @author Yesod
|
|
|
|
- */
|
|
|
|
- public static class TimeStamp
|
|
|
|
|
|
+ public long getItemRemainingReuseTime(int itemObjId)
|
|
{
|
|
{
|
|
- private final int _skillId;
|
|
|
|
- private final int _skillLvl;
|
|
|
|
- private final long _reuse;
|
|
|
|
- private final long _stamp;
|
|
|
|
-
|
|
|
|
- public TimeStamp(L2Skill skill, long reuse)
|
|
|
|
- {
|
|
|
|
- _skillId = skill.getId();
|
|
|
|
- _skillLvl = skill.getLevel();
|
|
|
|
- _reuse = reuse;
|
|
|
|
- _stamp = System.currentTimeMillis()+ reuse;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- public TimeStamp(L2Skill skill, long reuse, long systime)
|
|
|
|
|
|
+ if (_reuseTimeStampsItems.isEmpty() || !_reuseTimeStampsItems.containsKey(itemObjId))
|
|
{
|
|
{
|
|
- _skillId = skill.getId();
|
|
|
|
- _skillLvl = skill.getLevel();
|
|
|
|
- _reuse = reuse;
|
|
|
|
- _stamp = systime;
|
|
|
|
|
|
+ return -1;
|
|
}
|
|
}
|
|
-
|
|
|
|
- public long getStamp()
|
|
|
|
- {
|
|
|
|
- return _stamp;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- public int getSkillId()
|
|
|
|
- {
|
|
|
|
- return _skillId;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- public int getSkillLvl()
|
|
|
|
- {
|
|
|
|
- return _skillLvl;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- public long getReuse()
|
|
|
|
|
|
+ return _reuseTimeStampsItems.get(itemObjId).getRemaining();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public long getReuseDelayOnGroup(int group)
|
|
|
|
+ {
|
|
|
|
+ if (group > 0)
|
|
{
|
|
{
|
|
- return _reuse;
|
|
|
|
|
|
+ for (TimeStamp ts : _reuseTimeStampsItems.values())
|
|
|
|
+ {
|
|
|
|
+ if ((ts.getSharedReuseGroup() == group) && ts.hasNotPassed())
|
|
|
|
+ {
|
|
|
|
+ return ts.getRemaining();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
-
|
|
|
|
- public long getRemaining()
|
|
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private final FastMap<Integer, TimeStamp> _reuseTimeStampsSkills = new FastMap<>();
|
|
|
|
+
|
|
|
|
+ public FastMap<Integer, TimeStamp> getSkillReuseTimeStamps()
|
|
|
|
+ {
|
|
|
|
+ return _reuseTimeStampsSkills;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public long getSkillRemainingReuseTime(int skillReuseHashId)
|
|
|
|
+ {
|
|
|
|
+ if (_reuseTimeStampsSkills.isEmpty() || !_reuseTimeStampsSkills.containsKey(skillReuseHashId))
|
|
{
|
|
{
|
|
- return Math.max(_stamp - System.currentTimeMillis(), 0);
|
|
|
|
|
|
+ return -1;
|
|
}
|
|
}
|
|
-
|
|
|
|
- /* Check if the reuse delay has passed and
|
|
|
|
- * if it has not then update the stored reuse time
|
|
|
|
- * according to what is currently remaining on
|
|
|
|
- * the delay. */
|
|
|
|
- public boolean hasNotPassed()
|
|
|
|
|
|
+ return _reuseTimeStampsSkills.get(skillReuseHashId).getRemaining();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public boolean hasSkillReuse(int skillReuseHashId)
|
|
|
|
+ {
|
|
|
|
+ if (_reuseTimeStampsSkills.isEmpty() || !_reuseTimeStampsSkills.containsKey(skillReuseHashId))
|
|
{
|
|
{
|
|
- return System.currentTimeMillis() < _stamp;
|
|
|
|
|
|
+ return false;
|
|
}
|
|
}
|
|
|
|
+ return _reuseTimeStampsSkills.get(skillReuseHashId).hasNotPassed();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public TimeStamp getSkillReuseTimeStamp(int skillReuseHashId)
|
|
|
|
+ {
|
|
|
|
+ return _reuseTimeStampsSkills.get(skillReuseHashId);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * Index according to skill id the current
|
|
|
|
- * timestamp of use.
|
|
|
|
|
|
+ * Index according to skill id the current timestamp of use.
|
|
* @param skill
|
|
* @param skill
|
|
* @param reuse delay
|
|
* @param reuse delay
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
public void addTimeStamp(L2Skill skill, long reuse)
|
|
public void addTimeStamp(L2Skill skill, long reuse)
|
|
{
|
|
{
|
|
- _reuseTimeStamps.put(skill.getReuseHashCode(), new TimeStamp(skill, reuse));
|
|
|
|
|
|
+ _reuseTimeStampsSkills.put(skill.getReuseHashCode(), new TimeStamp(skill, reuse));
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -13319,9 +13434,11 @@ public final class L2PcInstance extends L2Playable
|
|
*/
|
|
*/
|
|
public void addTimeStamp(L2Skill skill, long reuse, long systime)
|
|
public void addTimeStamp(L2Skill skill, long reuse, long systime)
|
|
{
|
|
{
|
|
- _reuseTimeStamps.put(skill.getReuseHashCode(), new TimeStamp(skill, reuse, systime));
|
|
|
|
|
|
+ _reuseTimeStampsSkills.put(skill.getReuseHashCode(), new TimeStamp(skill, reuse, systime));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
public L2PcInstance getActingPlayer()
|
|
public L2PcInstance getActingPlayer()
|
|
{
|
|
{
|
|
@@ -13437,10 +13554,8 @@ public final class L2PcInstance extends L2Playable
|
|
getStat().updateVitalityPoints(points, useRates, quiet);
|
|
getStat().updateVitalityPoints(points, useRates, quiet);
|
|
}
|
|
}
|
|
|
|
|
|
- /*
|
|
|
|
- * Function for skill summon friend or Gate Chant.
|
|
|
|
- */
|
|
|
|
/**
|
|
/**
|
|
|
|
+ * Function for skill summon friend or Gate Chant.
|
|
* Request Teleport
|
|
* Request Teleport
|
|
* @param requester
|
|
* @param requester
|
|
* @param skill
|
|
* @param skill
|