Premium account manager from latest projects.
Custom community board from latest projects. Fixed existing hexid replacement issue.
This commit is contained in:
@ -801,10 +801,16 @@ public final class Config
|
||||
public static boolean COMMUNITYBOARD_ENABLE_MULTISELLS;
|
||||
public static boolean COMMUNITYBOARD_ENABLE_TELEPORTS;
|
||||
public static boolean COMMUNITYBOARD_ENABLE_BUFFS;
|
||||
public static boolean COMMUNITYBOARD_ENABLE_HEAL;
|
||||
public static int COMMUNITYBOARD_TELEPORT_PRICE;
|
||||
public static int COMMUNITYBOARD_BUFF_PRICE;
|
||||
public static int COMMUNITYBOARD_HEAL_PRICE;
|
||||
public static boolean COMMUNITYBOARD_COMBAT_DISABLED;
|
||||
public static boolean COMMUNITYBOARD_KARMA_DISABLED;
|
||||
public static boolean COMMUNITYBOARD_CAST_ANIMATIONS;
|
||||
public static boolean COMMUNITY_PREMIUM_SYSTEM_ENABLED;
|
||||
public static int COMMUNITY_PREMIUM_COIN_ID;
|
||||
public static int COMMUNITY_PREMIUM_PRICE_PER_DAY;
|
||||
public static boolean PREMIUM_SYSTEM_ENABLED;
|
||||
public static float PREMIUM_RATE_XP;
|
||||
public static float PREMIUM_RATE_SP;
|
||||
@ -2595,10 +2601,16 @@ public final class Config
|
||||
COMMUNITYBOARD_ENABLE_MULTISELLS = CustomSettings.getBoolean("CommunityEnableMultisells", true);
|
||||
COMMUNITYBOARD_ENABLE_TELEPORTS = CustomSettings.getBoolean("CommunityEnableTeleports", true);
|
||||
COMMUNITYBOARD_ENABLE_BUFFS = CustomSettings.getBoolean("CommunityEnableBuffs", true);
|
||||
COMMUNITYBOARD_ENABLE_HEAL = CustomSettings.getBoolean("CommunityEnableHeal", true);
|
||||
COMMUNITYBOARD_TELEPORT_PRICE = CustomSettings.getInt("CommunityTeleportPrice", 0);
|
||||
COMMUNITYBOARD_BUFF_PRICE = CustomSettings.getInt("CommunityBuffPrice", 0);
|
||||
COMMUNITYBOARD_HEAL_PRICE = CustomSettings.getInt("CommunityHealPrice", 0);
|
||||
COMMUNITYBOARD_COMBAT_DISABLED = CustomSettings.getBoolean("CommunityCombatDisabled", true);
|
||||
COMMUNITYBOARD_KARMA_DISABLED = CustomSettings.getBoolean("CommunityKarmaDisabled", true);
|
||||
COMMUNITYBOARD_CAST_ANIMATIONS = CustomSettings.getBoolean("CommunityCastAnimations", false);
|
||||
COMMUNITY_PREMIUM_SYSTEM_ENABLED = CustomSettings.getBoolean("CommunityPremiumSystem", false);
|
||||
COMMUNITY_PREMIUM_COIN_ID = CustomSettings.getInt("CommunityPremiumBuyCoinId", 57);
|
||||
COMMUNITY_PREMIUM_PRICE_PER_DAY = CustomSettings.getInt("CommunityPremiumPricePerDay", 1000000);
|
||||
|
||||
PREMIUM_SYSTEM_ENABLED = CustomSettings.getBoolean("EnablePremiumSystem", false);
|
||||
PREMIUM_RATE_XP = CustomSettings.getFloat("PremiumRateXp", 2);
|
||||
@ -2959,12 +2971,15 @@ public final class Config
|
||||
final Properties hexSetting = new Properties();
|
||||
final File file = new File(fileName);
|
||||
// Create a new empty file only if it doesn't exist
|
||||
file.createNewFile();
|
||||
try (OutputStream out = new FileOutputStream(file))
|
||||
if (!file.exists())
|
||||
{
|
||||
hexSetting.setProperty("ServerID", String.valueOf(serverId));
|
||||
hexSetting.setProperty("HexID", hexId);
|
||||
hexSetting.store(out, "The HexId to Auth into LoginServer");
|
||||
try (OutputStream out = new FileOutputStream(file))
|
||||
{
|
||||
hexSetting.setProperty("ServerID", String.valueOf(serverId));
|
||||
hexSetting.setProperty("HexID", hexId);
|
||||
hexSetting.store(out, "The HexId to Auth into LoginServer");
|
||||
_log.log(Level.INFO, "Gameserver: Generated new HexID file for server id " + serverId + ".");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
|
@ -408,6 +408,11 @@ public class ItemTable
|
||||
return _weapons.keySet();
|
||||
}
|
||||
|
||||
public L2Item[] getAllItems()
|
||||
{
|
||||
return _allTemplates;
|
||||
}
|
||||
|
||||
public int getArraySize()
|
||||
{
|
||||
return _allTemplates.length;
|
||||
|
@ -20,107 +20,203 @@ import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.Calendar;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import com.l2jmobius.Config;
|
||||
import com.l2jmobius.commons.database.DatabaseFactory;
|
||||
import com.l2jmobius.gameserver.ThreadPoolManager;
|
||||
import com.l2jmobius.gameserver.model.L2World;
|
||||
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
|
||||
import com.l2jmobius.gameserver.model.events.Containers;
|
||||
import com.l2jmobius.gameserver.model.events.EventType;
|
||||
import com.l2jmobius.gameserver.model.events.ListenersContainer;
|
||||
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogin;
|
||||
import com.l2jmobius.gameserver.model.events.impl.character.player.OnPlayerLogout;
|
||||
import com.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;
|
||||
|
||||
/**
|
||||
* @author Mobius
|
||||
*/
|
||||
public class PremiumManager
|
||||
{
|
||||
private long endDate = 0;
|
||||
private final static Logger LOGGER = Logger.getLogger(PremiumManager.class.getName());
|
||||
|
||||
public long getPremiumEndDate(String accountName)
|
||||
// SQL Statement
|
||||
private final static String LOAD_SQL = "SELECT account_name,enddate FROM account_premium";
|
||||
private final static String UPDATE_SQL = "UPDATE account_premium SET enddate = ? WHERE account_name = ?";
|
||||
private final static String ADD_SQL = "INSERT INTO account_premium (enddate,account_name) VALUE (?,?)";
|
||||
|
||||
class PremiumExpireTask implements Runnable
|
||||
{
|
||||
try (Connection con = DatabaseFactory.getInstance().getConnection())
|
||||
{
|
||||
final PreparedStatement statement = con.prepareStatement("SELECT premium_service,enddate FROM account_premium WHERE account_name=?");
|
||||
statement.setString(1, accountName);
|
||||
final ResultSet rset = statement.executeQuery();
|
||||
while (rset.next())
|
||||
{
|
||||
if (Config.PREMIUM_SYSTEM_ENABLED)
|
||||
{
|
||||
endDate = rset.getLong("enddate");
|
||||
if (endDate <= System.currentTimeMillis())
|
||||
{
|
||||
endDate = 0;
|
||||
removePremiumStatus(accountName);
|
||||
}
|
||||
}
|
||||
}
|
||||
statement.close();
|
||||
}
|
||||
catch (Exception e)
|
||||
final L2PcInstance player;
|
||||
|
||||
PremiumExpireTask(L2PcInstance player)
|
||||
{
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
return endDate;
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
player.setPremiumStatus(false);
|
||||
// player.sendPacket(new ExBrPremiumState(player));
|
||||
}
|
||||
}
|
||||
|
||||
public void updatePremiumData(int months, String accountName)
|
||||
// Data Cache
|
||||
private final Map<String, Long> premiumData = new HashMap<>();
|
||||
|
||||
// expireTasks
|
||||
private final Map<String, ScheduledFuture<?>> expiretasks = new HashMap<>();
|
||||
|
||||
// Listeners
|
||||
private final ListenersContainer listenerContainer = Containers.Players();
|
||||
|
||||
private final Consumer<OnPlayerLogin> playerLoginEvent = (event) ->
|
||||
{
|
||||
long remainingTime = getPremiumEndDate(accountName);
|
||||
if (remainingTime > 0)
|
||||
{
|
||||
remainingTime -= System.currentTimeMillis();
|
||||
}
|
||||
final L2PcInstance player = event.getActiveChar();
|
||||
final String accountName = player.getAccountName();
|
||||
final long now = System.currentTimeMillis();
|
||||
final long premiumExpiration = getPremiumExpiration(accountName);
|
||||
player.setPremiumStatus(premiumExpiration > now);
|
||||
// player.sendPacket(new ExBrPremiumState(player));
|
||||
|
||||
try (Connection con = DatabaseFactory.getInstance().getConnection())
|
||||
if (player.hasPremiumStatus())
|
||||
{
|
||||
final Calendar endDate = Calendar.getInstance();
|
||||
endDate.setTimeInMillis(System.currentTimeMillis() + remainingTime);
|
||||
endDate.set(Calendar.SECOND, 0);
|
||||
endDate.add(Calendar.MONTH, months);
|
||||
|
||||
final PreparedStatement statement = con.prepareStatement("UPDATE account_premium SET premium_service=?,enddate=? WHERE account_name=?");
|
||||
statement.setInt(1, 1);
|
||||
statement.setLong(2, endDate.getTimeInMillis());
|
||||
statement.setString(3, accountName);
|
||||
statement.execute();
|
||||
statement.close();
|
||||
startExpireTask(player, premiumExpiration - now);
|
||||
}
|
||||
};
|
||||
|
||||
private final Consumer<OnPlayerLogout> playerLogoutEvent = (event) ->
|
||||
{
|
||||
L2PcInstance player = event.getActiveChar();
|
||||
stopExpireTask(player);
|
||||
};
|
||||
|
||||
protected PremiumManager()
|
||||
{
|
||||
loadPremiumData();
|
||||
listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGIN, playerLoginEvent, this));
|
||||
listenerContainer.addListener(new ConsumerEventListener(listenerContainer, EventType.ON_PLAYER_LOGOUT, playerLogoutEvent, this));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param player
|
||||
* @param delay
|
||||
*/
|
||||
private void startExpireTask(L2PcInstance player, long delay)
|
||||
{
|
||||
ScheduledFuture<?> task = ThreadPoolManager.getInstance().scheduleEvent(new PremiumExpireTask(player), delay);
|
||||
expiretasks.put(player.getAccountName(), task);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param player
|
||||
*/
|
||||
private void stopExpireTask(L2PcInstance player)
|
||||
{
|
||||
ScheduledFuture<?> task = expiretasks.remove(player.getAccountName());
|
||||
if (task != null)
|
||||
{
|
||||
task.cancel(false);
|
||||
task = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void loadPremiumData()
|
||||
{
|
||||
try (Connection con = DatabaseFactory.getInstance().getConnection();
|
||||
PreparedStatement statement = con.prepareStatement(LOAD_SQL);
|
||||
ResultSet rset = statement.executeQuery())
|
||||
{
|
||||
while (rset.next())
|
||||
{
|
||||
premiumData.put(rset.getString(1), rset.getLong(2));
|
||||
}
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
for (L2PcInstance player : L2World.getInstance().getPlayers())
|
||||
long expiredData = premiumData.values().stream().filter(d -> d < System.currentTimeMillis()).count();
|
||||
LOGGER.info(getClass().getSimpleName() + ": Loaded " + premiumData.size() + " premium data (" + expiredData + " have expired)");
|
||||
}
|
||||
|
||||
public long getPremiumExpiration(String accountName)
|
||||
{
|
||||
return premiumData.getOrDefault(accountName, 0L);
|
||||
}
|
||||
|
||||
public void addPremiumTime(String accountName, int timeValue, TimeUnit timeUnit)
|
||||
{
|
||||
long addTime = timeUnit.toMillis(timeValue);
|
||||
long now = System.currentTimeMillis();
|
||||
// new premium task at least from now
|
||||
long oldPremiumExpiration = Math.max(now, getPremiumExpiration(accountName));
|
||||
long newPremiumExpiration = oldPremiumExpiration + addTime;
|
||||
|
||||
String sqlCmd = premiumData.containsKey(accountName) ? UPDATE_SQL : ADD_SQL;
|
||||
|
||||
// UPDATE DATABASE
|
||||
try (Connection con = DatabaseFactory.getInstance().getConnection();
|
||||
PreparedStatement stmt = con.prepareStatement(sqlCmd))
|
||||
{
|
||||
if (player.getAccountNamePlayer().equalsIgnoreCase(accountName))
|
||||
stmt.setLong(1, newPremiumExpiration);
|
||||
stmt.setString(2, accountName);
|
||||
stmt.execute();
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// UPDATE CACHE
|
||||
premiumData.put(accountName, newPremiumExpiration);
|
||||
|
||||
// UPDATE PlAYER PREMIUMSTATUS
|
||||
L2PcInstance playerOnline = L2World.getInstance().getPlayers().stream().filter(p -> accountName.equals(p.getAccountName())).findFirst().orElse(null);
|
||||
if (playerOnline != null)
|
||||
{
|
||||
stopExpireTask(playerOnline);
|
||||
startExpireTask(playerOnline, newPremiumExpiration - now);
|
||||
|
||||
if (!playerOnline.hasPremiumStatus())
|
||||
{
|
||||
player.setPremiumStatus(getPremiumEndDate(accountName) > 0);
|
||||
playerOnline.setPremiumStatus(true);
|
||||
// playerOnline.sendPacket(new ExBrPremiumState(playerOnline));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void removePremiumStatus(String accountName)
|
||||
{
|
||||
// TODO: Add check if account exists. XD
|
||||
try (Connection con = DatabaseFactory.getInstance().getConnection())
|
||||
L2PcInstance playerOnline = L2World.getInstance().getPlayers().stream().filter(p -> accountName.equals(p.getAccountName())).findFirst().orElse(null);
|
||||
if ((playerOnline != null) && playerOnline.hasPremiumStatus())
|
||||
{
|
||||
final PreparedStatement statement = con.prepareStatement("INSERT INTO account_premium (account_name,premium_service,enddate) values(?,?,?) ON DUPLICATE KEY UPDATE premium_service = ?, enddate = ?");
|
||||
statement.setString(1, accountName);
|
||||
statement.setInt(2, 0);
|
||||
statement.setLong(3, 0);
|
||||
statement.setInt(4, 0);
|
||||
statement.setLong(5, 0);
|
||||
statement.execute();
|
||||
statement.close();
|
||||
playerOnline.setPremiumStatus(false);
|
||||
// playerOnline.sendPacket(new ExBrPremiumState(playerOnline));
|
||||
stopExpireTask(playerOnline);
|
||||
}
|
||||
|
||||
// UPDATE CACHE
|
||||
premiumData.remove(accountName);
|
||||
|
||||
// UPDATE DATABASE
|
||||
try (Connection con = DatabaseFactory.getInstance().getConnection();
|
||||
PreparedStatement stmt = con.prepareStatement(UPDATE_SQL))
|
||||
{
|
||||
stmt.setLong(1, 0L);
|
||||
stmt.setString(2, accountName);
|
||||
stmt.execute();
|
||||
}
|
||||
catch (SQLException e)
|
||||
{
|
||||
}
|
||||
|
||||
for (L2PcInstance player : L2World.getInstance().getPlayers())
|
||||
{
|
||||
if (player.getAccountNamePlayer().equalsIgnoreCase(accountName))
|
||||
{
|
||||
player.setPremiumStatus(false);
|
||||
}
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user