Jump to content

Hero For Limited Time (No Need Restart Or Log Out)


Recommended Posts

Hello, since i'm disappointed with the forum and i'm bored i made a code. I haven't test it but if there is any problem you can write bellow.

What it does it basically you set how many hours you want your player to be hero and you set him hero. He can log out and login he is still hero

until time is over and hero removed automatically. It use database to store.

 

Index: com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
======================================================================

	private long _heroTime;
	
	public void setHeroTime(int hour) //Add hero time here
	{
		_heroTime = System.currentTimeMillis() + hour * 1000 * 3600;
		HeroTask.updateHero(this, _heroTime);
                scheduleHeroTime();
	}
	
	private ScheduledFuture<?> _heroTask;
	
	public void scheduleHeroTime()
	{
		setHero(true);
		broadcastUserInfo();
		
		for (L2Skill sk : HeroSkillTable.getHeroSkills())
			addSkill(sk, false);
		
		_heroTask = ThreadPoolManager.getInstance().scheduleGeneral(new Runnable()
		{
			@Override
			public void run()
			{
				if (L2PcInstance.this !=null)
				{
					setHero(false);
					broadcastUserInfo();
					
					for (L2Skill sk : HeroSkillTable.getHeroSkills())
						removeSkill(sk);
				}
			}
			
		}, HeroTask.getRemainedHero(this) - System.currentTimeMillis());
	}
	
	public boolean isHeroTimeTask()
	{
		if (System.currentTimeMillis() > HeroTask.getRemainedHero(this) + 5000)
			return false;
		return true;
	}
	
Index: com/l2jserver/gameserver/GameServer.java
======================================================================
HeroTask.loadData();

Index: com/l2jserver/gameserver/datatables/HeroTask.java
======================================================================

package com.l2jserver.gameserver.custom;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import com.l2jserver.L2DatabaseFactory;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;

/**
 * @author AccessDenied
 */
public class HeroTask
{
	private static Connection _con;
	private static final String SELECT_HERO = "SELECT * FROM heroTask";
	private static final String INSERT_HERO = "INSERT INTO heroTask(charId, heroTime) values (?,?)";
	private static final Map<Integer, Long> _hero = new HashMap<Integer, Long>();
	
	public static void storeHeroTime()
	{
		try
		{
			final PreparedStatement st = getConnection().prepareStatement(INSERT_HERO);

			for (Entry<Integer, Long> next : _hero.entrySet())
			{
				int objectId = next.getKey();
				Long time = next.getValue();

				st.setInt(1, objectId);
				st.setLong(2, time);
			}

			st.execute();
			st.close();

		} 
		catch (final Exception e)
		{
			e.printStackTrace();
		} 
		finally
		{
			L2DatabaseFactory.close(_con);
		}
	}

	public static void loadData()
	{
		try
		{
			final PreparedStatement st = getConnection().prepareStatement(SELECT_HERO);
			final ResultSet rset = st.executeQuery();

			while (rset.next())
			{
				final int playerId = rset.getInt(1);
				final long heroTime = rset.getLong(2);

				_hero.put(playerId, heroTime);
			}

			st.close();
		} 
		catch (final Exception e)
		{
			e.printStackTrace();
		} 
		finally
		{
			L2DatabaseFactory.close(_con);
		}
	}
	
	public static void updateHero(L2PcInstance p, long time)
	{
		_hero.put(p.getObjectId(), time);
	}
	
	public static long getRemainedHero(L2PcInstance p)
	{
		if (_hero.containsKey(p))
			return _hero.get(p);
		return 0;
	}

	private static Connection getConnection()
	{
		try
		{
			if (_con == null || _con.isClosed())
				_con = L2DatabaseFactory.getInstance().getConnection();
		} catch (final Exception e)
		{
			e.printStackTrace();
		}
		return _con;
	}
}

Index: com/l2jserver/gameserverg/gameserver/network/clientpackets/RequestRestart.java
======================================================================

if (player._heroTask !=null)
	_heroTask.cancel(true);
	
Index: com/l2jserver/gameserverg/gameserver/network/clientpackets/RequestLogout.java
======================================================================

if (player._heroTask !=null)
	_heroTask.cancel(true);


Index: com/l2jserver/gameserver/Shutdown.java
======================================================================

HeroTask.storeHeroTime();


Index: com/l2jserver/gameserver/network/clientpackets/Enterworld.java
======================================================================

	if (activeChar.isHeroTimeTask())
		activeChar.scheduleHeroTime();

 

Sql file:

/*
MySQL Data Transfer
Source Host: localhost
Source Database: none
Target Host: localhost
Target Database: L2j
Date: 6/1/2017 5:52:35 μμ
*/

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for herotask
-- ----------------------------
DROP TABLE IF EXISTS `herotask`;
CREATE TABLE `herotask` (
  `charId` int(15),
  `heroTime` bigint(15) DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records 
-- ----------------------------

Edited by AccessDenied
Link to comment
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now


×
×
  • Create New...