Timestamp that partially matches other branches.

This commit is contained in:
MobiusDevelopment 2019-11-04 12:36:19 +00:00
parent de911015c6
commit cd918658d1
3 changed files with 49 additions and 20 deletions

View File

@ -14,63 +14,92 @@
* 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 org.l2jmobius.gameserver.model.holders;
import org.l2jmobius.gameserver.model.Skill;
package org.l2jmobius.gameserver.model;
/**
* @author Mobius
* Simple class containing all necessary information to maintain<br>
* valid time stamps and reuse for skills and items reuse upon re-login.<br>
* <b>Filter this carefully as it becomes redundant to store reuse for small delays.</b>
* @author Yesod, Zoey76
*/
public class TimestampHolder
public class Timestamp
{
private final Skill _skill;
private final long _reuse;
private final long _stamp;
private volatile long _stamp;
public TimestampHolder(Skill skill, long reuse)
public Timestamp(Skill skill, long reuse)
{
_skill = skill;
_reuse = reuse;
_stamp = System.currentTimeMillis() + _reuse;
}
public TimestampHolder(Skill skill, long reuse, long stamp)
public Timestamp(Skill skill, long reuse, long stamp)
{
_skill = skill;
_reuse = reuse;
_stamp = stamp;
}
/**
* Gets the time stamp.
* @return the time stamp, either the system time where this time stamp was created or the custom time assigned
*/
public long getStamp()
{
return _stamp;
}
/**
* Gets the skill.
* @return the skill
*/
public Skill getSkill()
{
return _skill;
}
/**
* Gets the skill ID.
* @return the skill ID
*/
public int getSkillId()
{
return _skill.getId();
}
/**
* Gets the skill level.
* @return the skill level
*/
public int getSkillLevel()
{
return _skill.getLevel();
}
/**
* Gets the reuse.
* @return the reuse
*/
public long getReuse()
{
return _reuse;
}
/**
* Gets the remaining time.
* @return the remaining time for this time stamp to expire
*/
public long getRemaining()
{
return Math.max(_stamp - System.currentTimeMillis(), 0);
}
/**
* Verifies if the reuse delay has passed.
* @return {@code true} if this time stamp has expired, {@code false} otherwise
*/
public boolean hasNotPassed()
{
return System.currentTimeMillis() < _stamp;

View File

@ -114,6 +114,7 @@ import org.l2jmobius.gameserver.model.Skill;
import org.l2jmobius.gameserver.model.Skill.SkillTargetType;
import org.l2jmobius.gameserver.model.Skill.SkillType;
import org.l2jmobius.gameserver.model.SkillLearn;
import org.l2jmobius.gameserver.model.Timestamp;
import org.l2jmobius.gameserver.model.TradeList;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldObject;
@ -148,7 +149,6 @@ import org.l2jmobius.gameserver.model.entity.siege.FortSiege;
import org.l2jmobius.gameserver.model.entity.siege.Siege;
import org.l2jmobius.gameserver.model.entity.siege.clanhalls.DevastatedCastle;
import org.l2jmobius.gameserver.model.holders.PlayerStatsHolder;
import org.l2jmobius.gameserver.model.holders.TimestampHolder;
import org.l2jmobius.gameserver.model.items.Armor;
import org.l2jmobius.gameserver.model.items.Henna;
import org.l2jmobius.gameserver.model.items.Item;
@ -527,7 +527,7 @@ public class PlayerInstance extends Playable
private final List<Integer> _selectedBlocksList = new ArrayList<>(); // Related to CB.
private int _mailPosition;
private FishData _fish;
private final Map<Integer, TimestampHolder> _reuseTimestamps = new ConcurrentHashMap<>();
private final Map<Integer, Timestamp> _reuseTimestamps = new ConcurrentHashMap<>();
boolean _gmStatus = true; // true by default since this is used by GMS
public WorldObject _saymode = null;
String Dropzor = "Coin of Luck";
@ -9716,7 +9716,7 @@ public class PlayerInstance extends Playable
statement.setInt(5, effect.getTime());
if (_reuseTimestamps.containsKey(effect.getSkill().getId()))
{
final TimestampHolder t = _reuseTimestamps.get(effect.getSkill().getId());
final Timestamp t = _reuseTimestamps.get(effect.getSkill().getId());
statement.setLong(6, t.hasNotPassed() ? t.getReuse() : 0);
statement.setLong(7, t.hasNotPassed() ? t.getStamp() : 0);
}
@ -9732,7 +9732,7 @@ public class PlayerInstance extends Playable
}
}
// Store the reuse delays of remaining skills which lost effect but still under reuse delay. 'restore_type' 1.
for (TimestampHolder t : _reuseTimestamps.values())
for (Timestamp t : _reuseTimestamps.values())
{
if (t.hasNotPassed())
{
@ -10188,7 +10188,7 @@ public class PlayerInstance extends Playable
}
disableSkill(skill, remainingTime);
addTimestamp(new TimestampHolder(skill, reuseDelay, systime));
addTimestamp(new Timestamp(skill, reuseDelay, systime));
}
}
rset.close();
@ -10218,7 +10218,7 @@ public class PlayerInstance extends Playable
}
disableSkill(skill, remainingTime);
addTimestamp(new TimestampHolder(skill, reuseDelay, systime));
addTimestamp(new Timestamp(skill, reuseDelay, systime));
}
}
rset.close();
@ -16216,14 +16216,14 @@ public class PlayerInstance extends Playable
*/
public void addTimestamp(Skill s, int r)
{
_reuseTimestamps.put(s.getId(), new TimestampHolder(s, r));
_reuseTimestamps.put(s.getId(), new Timestamp(s, r));
}
/**
* Index according to skill this TimeStamp instance for restoration purposes only.
* @param t the t
*/
private void addTimestamp(TimestampHolder t)
private void addTimestamp(Timestamp t)
{
_reuseTimestamps.put(t.getSkillId(), t);
}
@ -16237,7 +16237,7 @@ public class PlayerInstance extends Playable
_reuseTimestamps.remove(skill.getId());
}
public Collection<TimestampHolder> getReuseTimeStamps()
public Collection<Timestamp> getReuseTimeStamps()
{
return _reuseTimestamps.values();
}

View File

@ -18,12 +18,12 @@ package org.l2jmobius.gameserver.network.serverpackets;
import java.util.Collection;
import org.l2jmobius.gameserver.model.Timestamp;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.TimestampHolder;
public class SkillCoolTime extends GameServerPacket
{
public Collection<TimestampHolder> _reuseTimestamps;
public Collection<Timestamp> _reuseTimestamps;
public SkillCoolTime(PlayerInstance player)
{
@ -40,7 +40,7 @@ public class SkillCoolTime extends GameServerPacket
}
writeC(0xc1);
writeD(_reuseTimestamps.size());
for (TimestampHolder reuseTimestamp : _reuseTimestamps)
for (Timestamp reuseTimestamp : _reuseTimestamps)
{
writeD(reuseTimestamp.getSkillId());
writeD(reuseTimestamp.getSkillLevel());