Jump to content
  • 0
Sign in to follow this  
Chaazy

Skill Cooltime ( Skill volta do 0 após restart )

Question

Ha algum tempo venho tentando resolver um problema na l2jfrozen 1132, ja pesquisei em vários fóruns,porem sem sucesso.

O que acontece é o seguinte. Skills que contem o reusedelay maior (buffs como heroic, battle roar, rage, frenzy, zealot, ultimate defense etc...) assim que você os usa e deixa ele carregar 30,50,90% que seja, se o player tomar dc, critical error ou ate mesmo dar restart, o skill volta do 0! Ele simplesmente não volta de onde parou, e mesmo ficando 1 hora sem entrar no jogo a skill não termina de carregar, é como se não salva-se os dados das skills.

Alguém pode ajudar? 


Eduardo Garcia 👽

Share this post


Link to post
Share on other sites

25 answers to this question

Recommended Posts

  • 0

Como você mesmo falou, não está salvando no banco de dados essa informação ou essa informação não está sendo restaurada. Você precisa salvar essa informação no método 'onDisconnection' da classe L2GameClient e restaurar no método que carrega os dados do player na classe L2PcInstance. Geralmente essa informação é salva na tabela 'characters_skills_save'.  Infelizmente não conheço a Frozen pra te ajudar além disso.

Edited by KhayrusS
  • Like 1

Share this post


Link to post
Share on other sites
  • 0
 

Como você mesmo falou, não está salvando no banco de dados essa informação ou essa informação não está sendo restaurada. Você precisa salvar essa informação no método 'onDisconnection' da classe L2GameClient e restaurar no método que carrega os dados do player na classe L2PcInstance. Geralmente essa informação é salva na tabela 'characters_skills_save'.  Infelizmente não conheço a Frozen pra te ajudar além disso.

Obrigado mesmo assim, já é um ponto de partida!


Eduardo Garcia 👽

Share this post


Link to post
Share on other sites
  • 0

Basta ir em L2PcInstance

Procure por
public void restoreEffects(final boolean activateEffects)

Tem todas as informações que você precisa sobre a restauração do player.

Basta corrigir da forma que vc quiser, eu não utilizo frozen, mas corrigi na que eu utilizo à tempos.

Certa vez no meu server, para burlarem o tempo reuse skill, eles trocavam de subclasse, a skill voltava zerada.

Nesse caso precisa modificar tb.

  • I love it 1

Share this post


Link to post
Share on other sites
  • 0
 

Basta ir em L2PcInstance

Procure por
public void restoreEffects(final boolean activateEffects)

Tem todas as informações que você precisa sobre a restauração do player.

Basta corrigir da forma que vc quiser, eu não utilizo frozen, mas corrigi na que eu utilizo à tempos.

Certa vez no meu server, para burlarem o tempo reuse skill, eles trocavam de subclasse, a skill voltava zerada.

Nesse caso precisa modificar tb.

   

	public void restoreEffects(final boolean activateEffects)
	{
		Connection con = null;
		
		try
		{
			con = L2DatabaseFactory.getInstance().getConnection(false);
			PreparedStatement statement;
			ResultSet rset;
			
			/**
			 * Restore Type 0 These skill were still in effect on the character upon logout. Some of which were self casted and might still have had a long reuse delay which also is restored.
			 */
			statement = con.prepareStatement(RESTORE_SKILL_SAVE);
			statement.setInt(1, getObjectId());
			statement.setInt(2, getClassIndex());
			statement.setInt(3, 0);
			rset = statement.executeQuery();
			
			while (rset.next())
			{
				final int skillId = rset.getInt("skill_id");
				final int skillLvl = rset.getInt("skill_level");
				final int effectCount = rset.getInt("effect_count");
				final int effectCurTime = rset.getInt("effect_cur_time");
				final long reuseDelay = rset.getLong("reuse_delay");
				
				// Just incase the admin minipulated this table incorrectly :x
				if (skillId == -1 || effectCount == -1 || effectCurTime == -1 || reuseDelay < 0)
				{
					continue;
				}
				
				if (activateEffects)
				{
					
					L2Skill skill = SkillTable.getInstance().getInfo(skillId, skillLvl);
					
					skill.getEffects(this, this, false, false, false);
					skill = null;
					
					for (final L2Effect effect : getAllEffects())
					{
						if (effect.getSkill().getId() == skillId)
						{
							effect.setCount(effectCount);
							effect.setFirstTime(effectCurTime);
						}
					}
				}
				
				if (reuseDelay > 10)
				{
					final L2Skill skill = SkillTable.getInstance().getInfo(skillId, skillLvl);
					
					if (skill == null)
						continue;
					
					disableSkill(skill, reuseDelay);
					addTimeStamp(new TimeStamp(skill, reuseDelay));
				}
				
			}
			DatabaseUtils.close(rset);
			DatabaseUtils.close(statement);
			rset = null;
			statement = null;
			
			/**
			 * Restore Type 1 The remaning skills lost effect upon logout but were still under a high reuse delay.
			 */
			statement = con.prepareStatement(RESTORE_SKILL_SAVE);
			statement.setInt(1, getObjectId());
			statement.setInt(2, getClassIndex());
			statement.setInt(3, 1);
			rset = statement.executeQuery();
			
			while (rset.next())
			{
				final int skillId = rset.getInt("skill_id");
				final int skillLvl = rset.getInt("skill_level");
				final long reuseDelay = rset.getLong("reuse_delay");
				
				if (reuseDelay <= 0)
				{
					continue;
				}
				
				final L2Skill skill = SkillTable.getInstance().getInfo(skillId, skillLvl);
				
				if (skill == null)
					continue;
				
				disableSkill(skill, reuseDelay);
				addTimeStamp(new TimeStamp(skill, reuseDelay));
			}
			DatabaseUtils.close(rset);
			DatabaseUtils.close(statement);
			rset = null;
			
			statement = con.prepareStatement(DELETE_SKILL_SAVE);
			statement.setInt(1, getObjectId());
			statement.setInt(2, getClassIndex());
			statement.executeUpdate();
			DatabaseUtils.close(statement);
			statement = null;
		}
		catch (final Exception e)
		{
			if (Config.ENABLE_ALL_EXCEPTIONS)
				e.printStackTrace();
			
			LOGGER.warn("Could not restore active effect data: " + e);
		}
		finally
		{
			CloseUtil.close(con);
		}
		
		updateEffectIcons();
	}

 

pode me dizer onde devo alterar?

  • Like 1

Eduardo Garcia 👽

Share this post


Link to post
Share on other sites
  • 0
 

Aparentemente essa parte do código está correta. Procura pelo método que salva essas informações no DB, provavelmente algo parecido com 'storeEffects'.

	@SuppressWarnings("null")
	private synchronized void storeEffect()
	{
		if (!Config.STORE_SKILL_COOLTIME)
			return;
		
		Connection con = null;
		try
		{
			con = L2DatabaseFactory.getInstance().getConnection(false);
			PreparedStatement statement;
			// Delete all current stored effects for char to avoid dupe
			statement = con.prepareStatement(DELETE_SKILL_SAVE);
			statement.setInt(1, getObjectId());
			statement.setInt(2, getClassIndex());
			statement.execute();
			DatabaseUtils.close(statement);
			
			// Store all effect data along with calulated remaining
			// reuse delays for matching skills. 'restore_type'= 0.
			final L2Effect[] effects = getAllEffects();
			statement = con.prepareStatement(ADD_SKILL_SAVE);
			
			final List<Integer> storedSkills = new FastList<>();
			
			int buff_index = 0;
			
			for (final L2Effect effect : effects)
			{
				final int skillId = effect.getSkill().getId();
				
				if (storedSkills.contains(skillId))
					continue;
				storedSkills.add(skillId);
				
				if (effect != null && effect.getInUse() && !effect.getSkill().isToggle() && !effect.getStackType().equals("BattleForce") && !effect.getStackType().equals("SpellForce") && effect.getSkill().getSkillType() != SkillType.FORCE_BUFF)
				{
					statement.setInt(1, getObjectId());
					statement.setInt(2, skillId);
					statement.setInt(3, effect.getSkill().getLevel());
					statement.setInt(4, effect.getCount());
					statement.setInt(5, effect.getTime());
					if (ReuseTimeStamps.containsKey(effect.getSkill().getReuseHashCode()))
					{
						final TimeStamp t = ReuseTimeStamps.get(effect.getSkill().getReuseHashCode());
						statement.setLong(6, t.hasNotPassed() ? t.getReuse() : 0);
						statement.setLong(7, t.hasNotPassed() ? t.getStamp() : 0);
					}
					else
					{
						statement.setLong(6, 0);
						statement.setLong(7, 0);
					}
					statement.setInt(8, 0);
					statement.setInt(9, getClassIndex());
					statement.setInt(10, ++buff_index);
					statement.execute();
				}
			}
			// Store the reuse delays of remaining skills which
			// lost effect but still under reuse delay. 'restore_type' 1.
			for (final TimeStamp t : ReuseTimeStamps.values())
			{
				if (t.hasNotPassed())
				{
					final int skillId = t.getSkill().getId();
					final int skillLvl = t.getSkill().getLevel();
					if (storedSkills.contains(skillId))
						continue;
					storedSkills.add(skillId);
					
					statement.setInt(1, getObjectId());
					statement.setInt(2, skillId);
					statement.setInt(3, skillLvl);
					statement.setInt(4, -1);
					statement.setInt(5, -1);
					statement.setLong(6, t.getReuse());
					statement.setLong(7, t.getStamp());
					statement.setInt(8, 1);
					statement.setInt(9, getClassIndex());
					statement.setInt(10, ++buff_index);
					statement.execute();
				}
			}
			DatabaseUtils.close(statement);
		}
		catch (final Exception e)
		{
			LOGGER.warn("Could not store char effect data: ");
			e.printStackTrace();
		}
		finally
		{
			CloseUtil.close(con);
		}
	}

Seria isso?


Eduardo Garcia 👽

Share this post


Link to post
Share on other sites
  • 0
 

Isso. Eu preciso só de mais duas informações:

o valor dessa constante  ADD_SKILL_SAVE;

e o código dessa classe: TimeStamp.

 

Código da TimeStamp 

	public static class TimeStamp
	{
		
		public long getStamp()
		{
			return stamp;
		}
		
		public L2Skill getSkill()
		{
			return skill;
		}
		
		public long getReuse()
		{
			return reuse;
		}
		
		public long getRemaining()
		{
			return Math.max(stamp - System.currentTimeMillis(), 0L);
		}
		
		protected boolean hasNotPassed()
		{
			return System.currentTimeMillis() < stamp;
		}
		
		private final L2Skill skill;
		private final long reuse;
		private final long stamp;
		
		protected TimeStamp(final L2Skill _skill, final long _reuse)
		{
			skill = _skill;
			reuse = _reuse;
			stamp = System.currentTimeMillis() + reuse;
		}
		
		protected TimeStamp(final L2Skill _skill, final long _reuse, final long _systime)
		{
			skill = _skill;
			reuse = _reuse;
			stamp = _systime;
		}
	}

Valor da Constant ADD_SKILL_SAVE seria isso?

	/** The Constant ADD_SKILL_SAVE. */
	// private static final String ADD_SKILL_SAVE = "INSERT INTO character_skills_save (char_obj_id,skill_id,skill_level,effect_count,effect_cur_time,reuse_delay,restore_type,class_index,buff_index) VALUES (?,?,?,?,?,?,?,?,?)";
	private static final String ADD_SKILL_SAVE = "INSERT INTO character_skills_save (char_obj_id,skill_id,skill_level,effect_count,effect_cur_time,reuse_delay,systime,restore_type,class_index,buff_index) VALUES (?,?,?,?,?,?,?,?,?,?)";

 


Eduardo Garcia 👽

Share this post


Link to post
Share on other sites
  • 0

É isso mesmo. Existem duas abordagens:

  • A skill ser restaurada com o cooltime  que estava quando o player deslogou;
  • O cooltime ser baseado no tempo real, por exemplo: A skill tem restando 10 min de cooltime, se o player logar apenas depois que os 10 min  passou, a skill já estaria pronta pra uso.

Qual delas você quer ?

Share this post


Link to post
Share on other sites
  • 0
 

É isso mesmo. Existem duas abordagens:

  • A skill ser restaurada com o cooltime  que estava quando o player deslogou;
  • O cooltime ser baseado no tempo real, por exemplo: A skill tem restando 10 min de cooltime, se o player logar apenas depois que os 10 min  passou, a skill já estaria pronta pra uso.

Qual delas você quer ?

Com o cooltime baseado no tempo real, pois assim resolve o problema de logar bom tempo depois e a skill começando do 0.

Dessa forma se o player tomar dc e voltar 1 minuto depois, a skill vai continuar seu cooltime normalmente? Exemplo:

Tomei dc com heroic 50%, demorei 1 minuto pra logar novamente e o mesmo vai estar 60%.


Eduardo Garcia 👽

Share this post


Link to post
Share on other sites
  • 0

O problema é que está sendo salvo o reuseDelay da skill no DB, por isso ela sempre volta do 0.

Para a skill ser restaurada com o cooltime  que estava quando o player deslogou, no método storeEffect, é necessário apenas mudar essa linha

 

statement.setLong(6, t.getReuse());

para essa :

statement.setLong(6, t.getRemaining());

 

Já para a segunda alternativa a mudança pode ser realizada no método restoreEffects. Após as linhas

final int effectCurTime = rset.getInt("effect_cur_time");
final long reuseDelay = rset.getLong("reuse_delay");

adicionar:

final long coolTime = rset.getLong("systime") - System.currentTimeMillis(); 

Trocar essa parte do código:

if (reuseDelay > 10)
{
  final L2Skill skill = SkillTable.getInstance().getInfo(skillId, skillLvl);

  if (skill == null)
    continue;

  disableSkill(skill, reuseDelay);
  addTimeStamp(new TimeStamp(skill, reuseDelay));
}

por essa:

if (coolTime > 10)
{
  final L2Skill skill = SkillTable.getInstance().getInfo(skillId, skillLvl);

  if (skill == null)
    continue;

  disableSkill(skill, coolTime);
  addTimeStamp(new TimeStamp(skill, coolTime));
}

 

Seguir a mesma lógica pra parte mais abaixo do código. Além disso, confirmar que a coluna systime faz parte do select da constante RESTORE_SKILL_SAVE

  • I love it 1

Share this post


Link to post
Share on other sites
  • 0
 

O problema é que está sendo salvo o reuseDelay da skill no DB, por isso ela sempre volta do 0.

Para a skill ser restaurada com o cooltime  que estava quando o player deslogou, no método storeEffect, é necessário apenas mudar essa linha

para essa :

statement.setLong(6, t.getRemaining());

 

Já para a segunda alternativa a mudança pode ser realizada no método restoreEffects. Após as linhas

final int effectCurTime = rset.getInt("effect_cur_time");
final long reuseDelay = rset.getLong("reuse_delay");

adicionar:

final long coolTime = rset.getLong("systime") - System.currentTimeMillis(); 

Trocar essa parte do código:

if (reuseDelay > 10)
{
  final L2Skill skill = SkillTable.getInstance().getInfo(skillId, skillLvl);

  if (skill == null)
    continue;

  disableSkill(skill, reuseDelay);
  addTimeStamp(new TimeStamp(skill, reuseDelay));
}

por essa:

if (coolTime > 10)
{
  final L2Skill skill = SkillTable.getInstance().getInfo(skillId, skillLvl);

  if (skill == null)
    continue;

  disableSkill(skill, coolTime);
  addTimeStamp(new TimeStamp(skill, coolTime));
}

 

Seguir a mesma lógica pra parte mais abaixo do código. Além disso, confirmar que a coluna systime faz parte do select da constante RESTORE_SKILL_SAVE

Muito Obrigado mesmo KhayrusS!!! Me ajudou demais ❤️ Porém fiz algumas alterações nos códigos ficando da seguinte forma:

Adicionei a linha 

final long systime = rset.getLong("systime");

abaixo das linhas 

final int effectCount = rset.getInt("effect_count");
final int effectCurTime = rset.getInt("effect_cur_time");
final long reuseDelay = rset.getLong("reuse_delay");

Troquei esse parte código 

if (reuseDelay > 10)
{
  final L2Skill skill = SkillTable.getInstance().getInfo(skillId, skillLvl);

  if (skill == null)
    continue;

  disableSkill(skill, reuseDelay);
  addTimeStamp(new TimeStamp(skill, reuseDelay));
}

por esta

				final long remainingTime = systime - System.currentTimeMillis();
				if (remainingTime > 10)
					
				{
					final L2Skill skill = SkillTable.getInstance().getInfo(skillId, skillLvl);
					
					if (skill == null)
						continue;
					
					disableSkill(skill, remainingTime);
					addTimeStamp(new TimeStamp(skill, reuseDelay, systime));
				}

E segui a mesma logica para os codigos abaixo. O meu problema era no RestoreEffects, dessa forma se eu usar a skill e ele tiver 50%, se eu tomar dc ou der restart a skill continua carregando normalmente 😄 e quando voltar a skill vai continuar de onde ela estiver.

Mas com isso tambem apareceu um novo bug, que nao tinha como saber com a skill voltando do 0 toda vez.

Se eu usar uma skill (ex: Heroic) e der 2 restarts seguidos, a skill volta carregada 100%.

Pode me ajudar a arrumar isso também?


Eduardo Garcia 👽

Share this post


Link to post
Share on other sites
  • 0
 

Dois restarts rápidos ? Depois do segundo restart, antes de logar, novamente, valor do systime continua correto no DB ?

Sim 2 restarts rapidos, notei o seguinte. Se usar a skill e atualizar a db com o char logado, não aparece que a skill foi salva, não mostra systime, reuse essas coisas, ai quando dou o primeiro restart com o char e atualizo a db, mostra os dados salvos corretamente, systime e tudo.

Assim que dou o segundo restart, as informações que foram salvas na db somem. Ai a skill volta do 100% 

Edited by Chaazy

Eduardo Garcia 👽

Share this post


Link to post
Share on other sites
  • 0
10 horas atrás, KhayrusS disse:

Isso é um pouco estranho mesmo.

Posta o código do método addTimestamp

Vou postar todos os códigos.

StoreEffect

	@SuppressWarnings("null")
	private synchronized void storeEffect()
	{
		if (!Config.STORE_SKILL_COOLTIME)
			return;
		
		Connection con = null;
		try
		{
			con = L2DatabaseFactory.getInstance().getConnection(false);
			PreparedStatement statement;
			// Delete all current stored effects for char to avoid dupe
			statement = con.prepareStatement(DELETE_SKILL_SAVE);
			statement.setInt(1, getObjectId());
			statement.setInt(2, getClassIndex());
			statement.execute();
			DatabaseUtils.close(statement);
			
			// Store all effect data along with calulated remaining
			// reuse delays for matching skills. 'restore_type'= 0.
			final L2Effect[] effects = getAllEffects();
			statement = con.prepareStatement(ADD_SKILL_SAVE);
			
			final List<Integer> storedSkills = new FastList<>();
			
			int buff_index = 0;
			
			for (final L2Effect effect : effects)
			{
				final int skillId = effect.getSkill().getId();
				
				if (storedSkills.contains(skillId))
					continue;
				storedSkills.add(skillId);
				
				if (effect != null && effect.getInUse() && !effect.getSkill().isToggle() && !effect.getStackType().equals("BattleForce") && !effect.getStackType().equals("SpellForce") && effect.getSkill().getSkillType() != SkillType.FORCE_BUFF)
				{
					statement.setInt(1, getObjectId());
					statement.setInt(2, skillId);
					statement.setInt(3, effect.getSkill().getLevel());
					statement.setInt(4, effect.getCount());
					statement.setInt(5, effect.getTime());
					if (ReuseTimeStamps.containsKey(effect.getSkill().getReuseHashCode()))
					{
						final TimeStamp t = ReuseTimeStamps.get(effect.getSkill().getReuseHashCode());
						statement.setLong(6, t.hasNotPassed() ? t.getReuse() : 0);
						statement.setLong(7, t.hasNotPassed() ? t.getStamp() : 0);
					}
					else
					{
						statement.setLong(6, 0);
						statement.setLong(7, 0);
					}
					statement.setInt(8, 0);
					statement.setInt(9, getClassIndex());
					statement.setInt(10, ++buff_index);
					statement.execute();
				}
			}
			// Store the reuse delays of remaining skills which
			// lost effect but still under reuse delay. 'restore_type' 1.
			for (final TimeStamp t : ReuseTimeStamps.values())
			{
				if (t.hasNotPassed())
				{
					final int skillId = t.getSkill().getId();
					final int skillLvl = t.getSkill().getLevel();
					if (storedSkills.contains(skillId))
						continue;
					storedSkills.add(skillId);
					
					statement.setInt(1, getObjectId());
					statement.setInt(2, skillId);
					statement.setInt(3, skillLvl);
					statement.setInt(4, -1);
					statement.setInt(5, -1);
					statement.setLong(6, t.getReuse());
					statement.setLong(7, t.getStamp());
					statement.setInt(8, 1);
					statement.setInt(9, getClassIndex());
					statement.setInt(10, ++buff_index);
					statement.execute();
				}
			}
			DatabaseUtils.close(statement);
		}
		catch (final Exception e)
		{
			LOGGER.warn("Could not store char effect data: ");
			e.printStackTrace();
		}
		finally
		{
			CloseUtil.close(con);
		}
	}

 

restoreEffect

	public void restoreEffects(final boolean activateEffects)
	{
		Connection con = null;
		
		try
		{
			con = L2DatabaseFactory.getInstance().getConnection(false);
			PreparedStatement statement;
			ResultSet rset;
			
			/**
			 * Restore Type 0 These skill were still in effect on the character upon logout. Some of which were self casted and might still have had a long reuse delay which also is restored.
			 */
			statement = con.prepareStatement(RESTORE_SKILL_SAVE);
			statement.setInt(1, getObjectId());
			statement.setInt(2, getClassIndex());
			statement.setInt(3, 0);
			rset = statement.executeQuery();
			
			while (rset.next())
			{
				final int skillId = rset.getInt("skill_id");
				final int skillLvl = rset.getInt("skill_level");
				final int effectCount = rset.getInt("effect_count");
				final int effectCurTime = rset.getInt("effect_cur_time");
				final long reuseDelay = rset.getLong("reuse_delay");
				final long systime = rset.getLong("systime");
				
				// Just incase the admin minipulated this table incorrectly :x
				if (skillId == -1 || effectCount == -1 || effectCurTime == -1 || reuseDelay < 0)
				{
					continue;
				}
				
				if (activateEffects)
				{
					
					L2Skill skill = SkillTable.getInstance().getInfo(skillId, skillLvl);
					
					skill.getEffects(this, this, false, false, false);
					skill = null;
					
					for (final L2Effect effect : getAllEffects())
					{
						if (effect.getSkill().getId() == skillId)
						{
							effect.setCount(effectCount);
							effect.setFirstTime(effectCurTime);
						}
					}
				}
				
				final long remainingTime = systime - System.currentTimeMillis();
				if (remainingTime > 10)
					
				{
					final L2Skill skill = SkillTable.getInstance().getInfo(skillId, skillLvl);
					
					if (skill == null)
						continue;
					
					disableSkill(skill, remainingTime);
					addTimeStamp(new TimeStamp(skill, reuseDelay, systime));
				}
				
			}
			DatabaseUtils.close(rset);
			DatabaseUtils.close(statement);
			rset = null;
			statement = null;
			
			/**
			 * Restore Type 1 The remaning skills lost effect upon logout but were still under a high reuse delay.
			 */
			statement = con.prepareStatement(RESTORE_SKILL_SAVE);
			statement.setInt(1, getObjectId());
			statement.setInt(2, getClassIndex());
			statement.setInt(3, 1);
			rset = statement.executeQuery();
			
			while (rset.next())
			{
				final int skillId = rset.getInt("skill_id");
				final int skillLvl = rset.getInt("skill_level");
				final long reuseDelay = rset.getLong("reuse_delay");
				final long systime = rset.getLong("systime");
				
				final long remainingTime = systime - System.currentTimeMillis();
				if (remainingTime > 0)
					
				{
					final L2Skill skill = SkillTable.getInstance().getInfo(skillId, skillLvl);
					
					if (skill == null)
						continue;
					
					disableSkill(skill, remainingTime);
					addTimeStamp(new TimeStamp(skill, reuseDelay, systime));
				}
				
			}
			DatabaseUtils.close(rset);
			DatabaseUtils.close(statement);
			rset = null;
			
			statement = con.prepareStatement(DELETE_SKILL_SAVE);
			statement.setInt(1, getObjectId());
			statement.setInt(2, getClassIndex());
			statement.executeUpdate();
			DatabaseUtils.close(statement);
			statement = null;
		}
		catch (final Exception e)
		{
			if (Config.ENABLE_ALL_EXCEPTIONS)
				e.printStackTrace();
			
			LOGGER.warn("Could not restore active effect data: " + e);
		}
		finally
		{
			CloseUtil.close(con);
		}
		
		updateEffectIcons();
	}

TimeStamp

	public static class TimeStamp
	{
		
		public long getStamp()
		{
			return stamp;
		}
		
		public L2Skill getSkill()
		{
			return skill;
		}
		
		public long getReuse()
		{
			return reuse;
		}
		
		public long getRemaining()
		{
			return Math.max(stamp - System.currentTimeMillis(), 0L);
		}
		
		protected boolean hasNotPassed()
		{
			return System.currentTimeMillis() < stamp;
		}
		
		private final L2Skill skill;
		private final long reuse;
		private final long stamp;
		
		protected TimeStamp(final L2Skill _skill, final long _reuse)
		{
			skill = _skill;
			reuse = _reuse;
			stamp = System.currentTimeMillis() + reuse;
		}
		
		protected TimeStamp(final L2Skill _skill, final long _reuse, final long _systime)
		{
			skill = _skill;
			reuse = _reuse;
			stamp = _systime;
		}
	}
	
	/**
	 * Index according to skill id the current timestamp of use.
	 * @param s the s
	 * @param r the r
	 */
	@Override
	public void addTimeStamp(final L2Skill s, final int r)
	{
		ReuseTimeStamps.put(s.getReuseHashCode(), new TimeStamp(s, r));
	}
	
	/**
	 * Index according to skill this TimeStamp instance for restoration purposes only.
	 * @param T the t
	 */
	private void addTimeStamp(final TimeStamp T)
	{
		ReuseTimeStamps.put(T.getSkill().getId(), T);
	}
	
	/**
	 * Index according to skill id the current timestamp of use.
	 * @param s the s
	 */
	@Override
	public void removeTimeStamp(final L2Skill s)
	{
		ReuseTimeStamps.remove(s.getReuseHashCode());
	}
	
	public Collection<TimeStamp> getReuseTimeStamps()
	{
		return ReuseTimeStamps.values();
	}
	
	public void resetSkillTime(final boolean ssl)
	{
		final L2Skill arr$[] = getAllSkills();
		for (final L2Skill skill : arr$)
		{
			if (skill != null && skill.isActive() && skill.getId() != 1324)
				enableSkill(skill);
		}
		
		if (ssl)
			sendSkillList();
		sendPacket(new SkillCoolTime(this));
	}

Valor da ADD/RESTORE skills save

	/** The Constant ADD_SKILL_SAVE. */
	// private static final String ADD_SKILL_SAVE = "INSERT INTO character_skills_save (char_obj_id,skill_id,skill_level,effect_count,effect_cur_time,reuse_delay,restore_type,class_index,buff_index) VALUES (?,?,?,?,?,?,?,?,?)";
	private static final String ADD_SKILL_SAVE = "INSERT INTO character_skills_save (char_obj_id,skill_id,skill_level,effect_count,effect_cur_time,reuse_delay,systime,restore_type,class_index,buff_index) VALUES (?,?,?,?,?,?,?,?,?,?)";
	
	/** The Constant RESTORE_SKILL_SAVE. */
	private static final String RESTORE_SKILL_SAVE = "SELECT skill_id,skill_level,effect_count,effect_cur_time, reuse_delay, systime FROM character_skills_save WHERE char_obj_id=? AND class_index=? AND restore_type=? ORDER BY buff_index ASC";

Acho que são esses os responsaveis. 


Eduardo Garcia 👽

Share this post


Link to post
Share on other sites
  • 0

Quando as skills vão ser salvas há uma condição que se aplica quando o efeito ainda está em uso:

1 hora atrás, Chaazy disse:
if (effect != null && effect.getInUse() && !effect.getSkill().isToggle() && !effect.getStackType().equals("BattleForce") && !effect.getStackType().equals("SpellForce") && effect.getSkill().getSkillType() != SkillType.FORCE_BUFF)

 

O problema é que nessa condição o timestamp da skill é procurado utilizando o método getReuseHashCode:

1 hora atrás, Chaazy disse:
if (ReuseTimeStamps.containsKey(effect.getSkill().getReuseHashCode())) { 
   final TimeStamp t = ReuseTimeStamps.get(effect.getSkill().getReuseHashCode()); 
   statement.setLong(6, t.hasNotPassed() ? t.getReuse() : 0); 
   statement.setLong(7, t.hasNotPassed() ? t.getStamp() : 0); 
} else { 
  statement.setLong(6, 0); 
  statement.setLong(7, 0); 
}

 

Mas o método addTimeStamp está utilizando o método getId para salvar a informação:

1 hora atrás, Chaazy disse:
private void addTimeStamp(final TimeStamp T) {
  ReuseTimeStamps.put(T.getSkill().getId(), T); 
}

 

Acredito que modificando-o para utilizar o getReuseHashCode esse problema não irá mais acontecer

private void addTimeStamp(final TimeStamp T) {
  ReuseTimeStamps.put(T.getSkill().getReuseHashCode(), T); 
}

 

  • Thanks 1

Share this post


Link to post
Share on other sites
  • 0
22 horas atrás, KhayrusS disse:

Quando as skills vão ser salvas há uma condição que se aplica quando o efeito ainda está em uso:

O problema é que nessa condição o timestamp da skill é procurado utilizando o método getReuseHashCode:

Mas o método addTimeStamp está utilizando o método getId para salvar a informação:

Acredito que modificando-o para utilizar o getReuseHashCode esse problema não irá mais acontecer

private void addTimeStamp(final TimeStamp T) {
  ReuseTimeStamps.put(T.getSkill().getReuseHashCode(), T); 
}

 

Meu amigo você é demais! Problema resolvido! Vou postar a correção no tópico dos fixes da Frozen 1132.

Muito Obrigado KhayrusS. Abraço


Eduardo Garcia 👽

Share this post


Link to post
Share on other sites
  • 0

can you help me too please i use frozen revision=1073 i have the same problem

 

error: cannot find symbol
    [javac]                 final long remainingTime = systime - System.currentTimeMillis();
    [javac]                                            ^

 

error: cannot find symbol
    [javac]                     addTimeStamp(new TimeStamp(skill, reuseDelay, systime));
    [javac]                                                                   ^

 

final long remainingTime = systime - System.currentTimeMillis();
				if (remainingTime > 10)
					
				{
					final L2Skill skill = SkillTable.getInstance().getInfo(skillId, skillLvl);
					
					if (skill == null)
						continue;
					
					disableSkill(skill, remainingTime);
					addTimeStamp(new TimeStamp(skill, reuseDelay, systime));
				}

			}
			DatabaseUtils.close(rset);
			DatabaseUtils.close(statement);
			rset = null;
			statement = null;

 

Edited by ayioko

Share this post


Link to post
Share on other sites
  • 0

Probably ur code is a bit different. So u need to figure out based on what was said here how ur code works.

For instance, on the Rev 1132 there is a class TimeStamp inside of the class L2PCInstance, but on 1073 looks like don't have it. Thats why this error: cannot find symbol

8 horas atrás, ayioko disse:

ddTimeStamp(new TimeStamp(skill, reuseDelay, systime));

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  




     



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • Obrigado pelo projeto, achei a idéia interessante! Precisar de qualquer coisa estamos ai. Baixei todos os arquivos e vou baixando os updates. Semana que vem começo a testar e reportar. Se tiver algum lugar específico pra eu postar os reports só avisar.
    • fico indi guinado com wallace e os de mais l2jdream que estão criando outros projetos ou sei la oque e deixaram o projeto de lado como fez o leandro da vote games que so pensou em dinheiro, voce estao fazendo pior ainda que cada epoca inventa uma coisa pra arrecadar  dinheiro de nos consumidor isso e uma falta de respeito inventaram a dream depois agora a dream plus e agora estao inventando outra coisa totalmente diferente isso e uma falta de respeito cade a atualização ate agora nada paguei 70, e ja foram 60 dias e nada de atualização e outra ja si passaram mais de 60 dias e atualização ainda estar 170 nao passa disso e o pack estar cheio de bugs.  
    • Larga de ser egoísta. simples, se quer compartilhar e ajudar, faça de bom grado como a maioria faz assim. Se você não se encaixa nas regras da comunidade ela não foi feita para você, vá para uma aonde o seu rage será aplaudido e admirado. Reconheço suas contribuições no tópico mas tinham 5 postagens seguidas sua apenas criticando quem não fazia nada... eu juntei 1.. 2..3..4.. na quinta eu tive que postar. É simples, estou pedindo muito ? Vc consegue ao menos respeitar as regras? Meu trabalho aqui é moderar e vigiar a comunidade para que ela funcione da melhor forma possível, quando vc flooda vc gera pertubação para as pessoas que assinam esse tópico e consome recursos do site de forma leviana.  PS: Não precisava ter feito a pirraça de apagar todos seus posts, eu só chamei sua atenção para que justamente soubesse que sua atitude foi errada, mesmo tendo boas intenções, não é assim que se faz.  
    • blz, na verdade tudo oque eu falei é concreto, e justamente pelo fato de ter muito a postar que meu post ficou longo, mais se te incomodou, vou excluir meus posts, que inclusive não tem nada de rage, é apenas comentários sobre os erros, alguns ensinando como arrumar, o máximo que eu fiz foi criticar algumas pessoas que ficam apenas esperando para fazer download mais não são capazes de arrumar 1 erro ou de apenas tentar e comentar sobre isso. E tbm reclamei de começarem um projeto e largarem na metade e dizerem apenas Boa Sorte para quem for usar. kk mais blz...afinal, sozinho eu consigo, minha intenção era apenas ajudar e tentar incentivar as pessoas a fazerem o mesmo, n preciso de vcs. vlw flw
    • @EstouOff voce precisa pagar 100 Euros pra comprar o primeiro acesso +20 mensalmente pra ter as atualizações diárias de todos packs, sim voce pode passar os erros la e dentro do possivel ele vai atualizando e tu atualiza teu pack. 
    • @EstouOff vamos reduzir o rage manolo.. se não tem nada de concreto para acrescentar recomendo não comentar nada até que novos comentários sejam feitos.  
    • isso eu sei mano, eu disse que eu matei um mob de earth mais ele deu exp pra wind como se tivesse invertido. o problema que aqui no meu pack não sai do 0,00. bom eu fiz os testes aqui, coloquei o sv limpo online e mesmo assim não sai do 0,00%.. E tbm aquela parte de evoluir que tem varias abas, parece que ta tudo sem funcionar ainda, pq eu nao consegui fazer funcionar. vlws Outros bugs para lembrar: ----------------->baium top não tem skill, ele ta dando skill do damaged baium que da apenas +1 de bleed ----------------->e o zaken ta dando um skill do orfen toda bugada, se vc tent usa ela, vai bugar o server inteiro Provavelmente as próximas atualizações serão mais importantes, talvez eles arrumem.   eu tbm ja tinha arrumado para equipar os brooches, mais a galera nem deu bola como sempre...por isso eu exclui meus posts  o problema é fazer funcionar o efeito das jóias, que como vc pode ver, ainda não dão efeito nenhum, ruby, saphire não dao efeito no soulshot e o Diamond tbm nem ta dando p defesa...alguma é facil de arrumar, mais que nem o ruby e saphire que tem glow e efeito no SS ou o topaz que é uma skill que dá dano...  Topaz tbm não funciona e não tem a skill que era pra ter, basicamente as jóias equipam mais não dão efeitos Mesma coisa nos agathions, eu tbm tinha arrumado pra equipar, mais isso é fácil, o difícil é que maioria dos agathions nao da a skill pra sumonar ele, ou quando vc sumona não aparece o agathion... e o agathion Nebula, quando sumona ele, ele nao anda atraz de vc, ele fica parado no lugar. kkk mesmo assim da uma animada, de ver que eles tão arrumando. ou pelo menos tentando. problema que a galera só fica esperando os links pra apenas clicar e fazer o download, mais trabalhar e arruma pelo menos 1 erro ninguém faz. arrume pelo menos 1 erro e compartilhe com a galera que vcs já fazem a parte de vcs. EU NÃO VI NENHUM POST DE ALGUMA PESSOA ARRUMANDO UM ERRO, NEM SEQUER 1 ERRINHO BÁSICO A GALERA NÃO ARRUMA OU COMPARTILHA.  apenas 10% do que eu aprendi foi no fórum, os outros 90% eu aprendi sozinho de tanto tentar e tentar... e acho que se a galera tentar mais ao em vez de ficar só esperando pra baixar seria muito melhor para todos. Porém as próximas atualizações provavelmente serão as mais importantes, pq eles começaram a mexer nessas coisas que eu estou citando a mais de 3 meses e só agora eles começaram a mexer nisso. porém ainda não está funcional como eu expliquei acima. Mais se não vai mais ter atualização aqui no fórum a gnt fica mto triste por começarem algo e largarem na metade Peço de coração para que continua pelo menos por mais 1 mês, acredito que em poucas atualizações teremos um pack excelente pq eles já começaram  a mexer nessas coisas importantes, apesar de ainda não estar funcionando (acredito que nas próximas atualizações eles vão arrumar ou pelo menos está mais perto ) parar de atualizar agora seria um fracasso total e uma grande perda de tempo, e tbm uma perca de uma grande oportunidade. tem coisa que não conseguimos arrumar sozinho mesmo que passe dias tentando.     para termos acesso as atualizações que vc estava passando para nós, precisamos pagar 20 dólares? com isso eu posso postar os erros lá e tbm baixar as atualizações? se for assim eu vou tentar pagar em breve, esperar uns 2 meses e comprar ai assim já vai ter atualizado bastante, certo? pq acredito que com mais algumas atualizações o pack vai ficar bom. talvez mais alguns meses...até pq essa última atualização ficou meio incompleta pq eles começaram a arrumar mais não terminaram. outra pergunta, 20 dólares é para 1 mês de acesso?
    • tem um problema com angelic icon quando ativa trava gameserver todo ai nao equipa arma nem ativa efeito das skill.............depois de um tempo volta sozinho........mais esta muito dahora ultima vez que testei nao equipava broche etc mais agora ta equipando tudo muito fluido pra jogar ta top  intendi o elemento adquire xp dos mobs que sao fortes contra eles........referencia a CDZ Omega ou Avatar kkkkkkkkkkkkkkkkkkk
    • É assim mesmo que funciona, ao matar um mob elemental a exp adquirida é do elemento que eles chamam de elemento dominador       Fire  (Forge of the Gods) XP for Water Spirit                               Water (Garden of Eva)  XP for Earth Spirit  Wind (Land of Winds) XP for Fire Spirit  Earth (Wall of Argos) XP for Wind Spirit
×
×
  • Create New...