private static final int COMP_START = Config.ALT_OLY_START_TIME; // 6PM private static final int COMP_MIN = Config.ALT_OLY_MIN; // 00 mins private static final long COMP_PERIOD = Config.ALT_OLY_CPERIOD; // 6 hours protected static final long WEEKLY_PERIOD = Config.ALT_OLY_WPERIOD; // 1 week protected static final long VALIDATION_PERIOD = Config.ALT_OLY_VPERIOD; // 24 hours
protected static final int DEFAULT_POINTS = Config.ALT_OLY_START_POINTS; protected static final int WEEKLY_POINTS = Config.ALT_OLY_WEEKLY_POINTS;
public static final String CHAR_ID = "char_id"; public static final String CLASS_ID = "class_id"; public static final String CHAR_NAME = "char_name"; public static final String POINTS = "olympiad_points"; public static final String COMP_DONE = "competitions_done"; public static final String COMP_WON = "competitions_won"; public static final String COMP_LOST = "competitions_lost"; public static final String COMP_DRAWN = "competitions_drawn";
protected long _olympiadEnd; protected long _validationEnd;
/** * The current period of the olympiad.<br> * <b>0 -</b> Competition period<br> * <b>1 -</b> Validation Period */ protected int _period; protected long _nextWeeklyChange; protected int _currentCycle; private long _compEnd; private Calendar _compStart; protected static boolean _inCompPeriod; protected static boolean _compStarted = false;
rset.close(); statement.close(); } catch (Exception e) { _log.log(Level.WARNING, "Olympiad System: Error loading noblesse data from database: ", e); }
synchronized (this) { _log.info("Olympiad System: Loading Olympiad system...."); if (_period == 0) _log.info("Olympiad System: Currently in Competition period."); else _log.info("Olympiad System: Currently in Validation period.");
long milliToEnd; if (_period == 0) milliToEnd = getMillisToOlympiadEnd(); else milliToEnd = getMillisToValidationEnd();
_log.info("Olympiad System: " + Math.round(milliToEnd / 60000) + " minutes until period ends.");
if (_period == 0) { milliToEnd = getMillisToWeekChange(); _log.info("Olympiad System: Next weekly change is in " + Math.round(milliToEnd / 60000) + " minutes."); } }
long regEnd = getMillisToCompEnd() - 600000; if (regEnd > 0) { ThreadPoolManager.getInstance().scheduleGeneral(new Runnable() { @Override public void run() { Announcements.announceToAll(SystemMessage.getSystemMessage(SystemMessageId.OLYMPIAD_REGISTRATION_PERIOD_ENDED)); } }, regEnd); }
_scheduledCompEnd = ThreadPoolManager.getInstance().scheduleGeneral(new Runnable() { @Override public void run() { if (isOlympiadEnd()) return;
_inCompPeriod = false; Announcements.announceToAll(SystemMessage.getSystemMessage(SystemMessageId.THE_OLYMPIAD_GAME_HAS_ENDED)); _log.info("Olympiad System: Olympiad game ended.");
while (OlympiadGameManager.getInstance().isBattleStarted()) // cleared in game manager { // wait 1 minutes for end of pendings games try { Thread.sleep(60000); } catch (InterruptedException e) { } }
if (_gameManager != null) { _gameManager.cancel(false); _gameManager = null; }
if (_gameAnnouncer != null) { _gameAnnouncer.cancel(false); _gameAnnouncer = null; }
protected synchronized void addWeeklyPoints() { if (_period == 1) return;
int currentPoints; for (StatsSet nobleInfo : _nobles.values()) { currentPoints = nobleInfo.getInteger(POINTS); currentPoints += WEEKLY_POINTS; nobleInfo.set(POINTS, currentPoints); } }
public int getCurrentCycle() { return _currentCycle; }
public boolean playerInStadia(L2PcInstance player) { return ZoneManager.getOlympiadStadium(player) != null; }
/** * Save noblesse data to database */ protected synchronized void saveNobleData() { if (_nobles == null || _nobles.isEmpty()) return;
try (Connection con = L2DatabaseFactory.getInstance().getConnection()) { PreparedStatement statement; for (int nobleId : _nobles.keySet()) { StatsSet nobleInfo = _nobles.get(nobleId);
if (nobleInfo == null) continue;
int charId = nobleId; int classId = nobleInfo.getInteger(CLASS_ID); int points = nobleInfo.getInteger(POINTS); int compDone = nobleInfo.getInteger(COMP_DONE); int compWon = nobleInfo.getInteger(COMP_WON); int compLost = nobleInfo.getInteger(COMP_LOST); int compDrawn = nobleInfo.getInteger(COMP_DRAWN); boolean toSave = nobleInfo.getBool("to_save");
public int getNoblePoints(int objId) { if ((_nobles == null) || !_nobles.containsKey(objId)) return 0;
return _nobles.get(objId).getInteger(POINTS); }
public int getLastNobleOlympiadPoints(int objId) { int result = 0; try (Connection con = L2DatabaseFactory.getInstance().getConnection()) { final PreparedStatement statement = con.prepareStatement("SELECT olympiad_points FROM olympiad_nobles_eom WHERE char_id = ?"); statement.setInt(1, objId); final ResultSet rs = statement.executeQuery(); if (rs.first()) result = rs.getInt(1); rs.close(); statement.close(); } catch (Exception e) { _log.log(Level.WARNING, "Could not load last olympiad points:", e); } return result; }
public int getCompetitionDone(int objId) { if ((_nobles == null) || !_nobles.containsKey(objId)) return 0;
/** * @param charId the noble object Id. * @param data the stats set data to add. * @return the old stats set if the noble is already present, null otherwise. */ protected static StatsSet addNobleStats(int charId, StatsSet data) { return _nobles.put(Integer.valueOf(charId), data); }
private static class SingletonHolder { protected static final Olympiad _instance = new Olympiad(); } }
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.
DISCORD :
utchiha_market
telegram :
https://t.me/utchiha_market
SELLIX STORE :
https://utchihamkt.mysellix.io/
Join our server for more products :
https://discord.gg/hood-services
https://campsite.bio/utchihaamkt
hello everyone !
I need help with a l2script Rev H5-Salvation/Classic build. I compiled the project, installed everything but I can't log in to the server, it won't log me in. I tried a thousand ways without good results. I leave you the error when logging in either with the H5-Salvation Client.
ERROR ---> WARN: IPBANMANAGER ---> IP !!!!
I'm waiting for help! Thank you!
Question
dnox1987
Can someone dev help me about Olympiad Ranking didnt show me my points, someone who has experience on this project:
/**
Edited by dnox1987* @author godson
*/
package net.sf.l2j.gameserver.model.olympiad;
import gnu.trove.map.hash.TIntIntHashMap;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ScheduledFuture;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.sf.l2j.Config;
import net.sf.l2j.L2DatabaseFactory;
import net.sf.l2j.gameserver.Announcements;
import net.sf.l2j.gameserver.ThreadPoolManager;
import net.sf.l2j.gameserver.instancemanager.ZoneManager;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.model.entity.Hero;
import net.sf.l2j.gameserver.network.SystemMessageId;
import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
import net.sf.l2j.gameserver.templates.StatsSet;
public class Olympiad
{
protected static final Logger _log = Logger.getLogger(Olympiad.class.getName());
private static Map<Integer, StatsSet> _nobles;
protected static List<StatsSet> _heroesToBe;
private static final TIntIntHashMap _noblesRank = new TIntIntHashMap();
public static final String OLYMPIAD_HTML_PATH = "data/html/olympiad/";
private static final String OLYMPIAD_LOAD_DATA = "SELECT current_cycle, period, olympiad_end, validation_end, next_weekly_change FROM olympiad_data WHERE id = 0";
private static final String OLYMPIAD_SAVE_DATA = "INSERT INTO olympiad_data (id, current_cycle, period, olympiad_end, validation_end, next_weekly_change) VALUES (0,?,?,?,?,?) ON DUPLICATE KEY UPDATE current_cycle=?, period=?, olympiad_end=?, validation_end=?, next_weekly_change=?";
private static final String OLYMPIAD_LOAD_NOBLES = "SELECT olympiad_nobles.char_id, olympiad_nobles.class_id, characters.char_name, olympiad_nobles.olympiad_points, olympiad_nobles.competitions_done, olympiad_nobles.competitions_won, olympiad_nobles.competitions_lost, olympiad_nobles.competitions_drawn FROM olympiad_nobles, characters WHERE characters.obj_Id = olympiad_nobles.char_id";
private static final String OLYMPIAD_SAVE_NOBLES = "INSERT INTO olympiad_nobles (`char_id`,`class_id`,`olympiad_points`,`competitions_done`,`competitions_won`,`competitions_lost`, `competitions_drawn`) VALUES (?,?,?,?,?,?,?)";
private static final String OLYMPIAD_UPDATE_NOBLES = "UPDATE olympiad_nobles SET olympiad_points = ?, competitions_done = ?, competitions_won = ?, competitions_lost = ?, competitions_drawn = ? WHERE char_id = ?";
private static final String OLYMPIAD_GET_HEROS = "SELECT olympiad_nobles.char_id, characters.char_name FROM olympiad_nobles, characters WHERE characters.obj_Id = olympiad_nobles.char_id AND olympiad_nobles.class_id = ? AND olympiad_nobles.competitions_done >= " + Config.ALT_OLY_MIN_MATCHES + " AND olympiad_nobles.competitions_won > 0 ORDER BY olympiad_nobles.olympiad_points DESC, olympiad_nobles.competitions_done DESC, olympiad_nobles.competitions_won DESC";
private static final String GET_ALL_CLASSIFIED_NOBLESS = "SELECT char_id from olympiad_nobles_eom WHERE competitions_done >= " + Config.ALT_OLY_MIN_MATCHES + " ORDER BY olympiad_points DESC, competitions_done DESC, competitions_won DESC";
private static final String GET_EACH_CLASS_LEADER = "SELECT characters.char_name from olympiad_nobles_eom, characters WHERE characters.obj_Id = olympiad_nobles_eom.char_id AND olympiad_nobles_eom.class_id = ? AND olympiad_nobles_eom.competitions_done >= " + Config.ALT_OLY_MIN_MATCHES + " ORDER BY olympiad_nobles_eom.olympiad_points DESC, olympiad_nobles_eom.competitions_done DESC, olympiad_nobles_eom.competitions_won DESC LIMIT 10";
private static final String OLYMPIAD_DELETE_ALL = "TRUNCATE olympiad_nobles";
private static final String OLYMPIAD_MONTH_CLEAR = "TRUNCATE olympiad_nobles_eom";
private static final String OLYMPIAD_MONTH_CREATE = "INSERT INTO olympiad_nobles_eom SELECT char_id, class_id, olympiad_points, competitions_done, competitions_won, competitions_lost, competitions_drawn FROM olympiad_nobles";
private static final int[] HERO_IDS =
{
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118
};
private static final int COMP_START = Config.ALT_OLY_START_TIME; // 6PM
private static final int COMP_MIN = Config.ALT_OLY_MIN; // 00 mins
private static final long COMP_PERIOD = Config.ALT_OLY_CPERIOD; // 6 hours
protected static final long WEEKLY_PERIOD = Config.ALT_OLY_WPERIOD; // 1 week
protected static final long VALIDATION_PERIOD = Config.ALT_OLY_VPERIOD; // 24 hours
protected static final int DEFAULT_POINTS = Config.ALT_OLY_START_POINTS;
protected static final int WEEKLY_POINTS = Config.ALT_OLY_WEEKLY_POINTS;
public static final String CHAR_ID = "char_id";
public static final String CLASS_ID = "class_id";
public static final String CHAR_NAME = "char_name";
public static final String POINTS = "olympiad_points";
public static final String COMP_DONE = "competitions_done";
public static final String COMP_WON = "competitions_won";
public static final String COMP_LOST = "competitions_lost";
public static final String COMP_DRAWN = "competitions_drawn";
protected long _olympiadEnd;
protected long _validationEnd;
/**
* The current period of the olympiad.<br>
* <b>0 -</b> Competition period<br>
* <b>1 -</b> Validation Period
*/
protected int _period;
protected long _nextWeeklyChange;
protected int _currentCycle;
private long _compEnd;
private Calendar _compStart;
protected static boolean _inCompPeriod;
protected static boolean _compStarted = false;
protected ScheduledFuture<?> _scheduledCompStart;
protected ScheduledFuture<?> _scheduledCompEnd;
protected ScheduledFuture<?> _scheduledOlympiadEnd;
protected ScheduledFuture<?> _scheduledWeeklyTask;
protected ScheduledFuture<?> _scheduledValdationTask;
protected ScheduledFuture<?> _gameManager = null;
protected ScheduledFuture<?> _gameAnnouncer = null;
public static Olympiad getInstance()
{
return SingletonHolder._instance;
}
protected Olympiad()
{
load();
if (_period == 0)
init();
}
private void load()
{
_nobles = new HashMap<>();
boolean loaded = false;
try (Connection con = L2DatabaseFactory.getInstance().getConnection())
{
PreparedStatement statement = con.prepareStatement(OLYMPIAD_LOAD_DATA);
ResultSet rset = statement.executeQuery();
while (rset.next())
{
_currentCycle = rset.getInt("current_cycle");
_period = rset.getInt("period");
_olympiadEnd = rset.getLong("olympiad_end");
_validationEnd = rset.getLong("validation_end");
_nextWeeklyChange = rset.getLong("next_weekly_change");
loaded = true;
}
rset.close();
statement.close();
}
catch (Exception e)
{
_log.log(Level.WARNING, "Olympiad System: Error loading olympiad data from database: ", e);
}
if (!loaded)
{
_log.log(Level.INFO, "Olympiad System: failed to load data from database, default values are used.");
_currentCycle = 1;
_period = 0;
_olympiadEnd = 0;
_validationEnd = 0;
_nextWeeklyChange = 0;
}
switch (_period)
{
case 0:
if (_olympiadEnd == 0 || _olympiadEnd < Calendar.getInstance().getTimeInMillis())
setNewOlympiadEnd();
else
scheduleWeeklyChange();
break;
case 1:
if (_validationEnd > Calendar.getInstance().getTimeInMillis())
{
loadNoblesRank();
_scheduledValdationTask = ThreadPoolManager.getInstance().scheduleGeneral(new ValidationEndTask(), getMillisToValidationEnd());
}
else
{
_currentCycle++;
_period = 0;
deleteNobles();
setNewOlympiadEnd();
}
break;
default:
_log.warning("Olympiad System: something went wrong loading period: " + _period);
return;
}
try (Connection con = L2DatabaseFactory.getInstance().getConnection())
{
PreparedStatement statement = con.prepareStatement(OLYMPIAD_LOAD_NOBLES);
ResultSet rset = statement.executeQuery();
StatsSet statData;
while (rset.next())
{
statData = new StatsSet();
statData.set(CLASS_ID, rset.getInt(CLASS_ID));
statData.set(CHAR_NAME, rset.getString(CHAR_NAME));
statData.set(POINTS, rset.getInt(POINTS));
statData.set(COMP_DONE, rset.getInt(COMP_DONE));
statData.set(COMP_WON, rset.getInt(COMP_WON));
statData.set(COMP_LOST, rset.getInt(COMP_LOST));
statData.set(COMP_DRAWN, rset.getInt(COMP_DRAWN));
statData.set("to_save", false);
addNobleStats(rset.getInt(CHAR_ID), statData);
}
rset.close();
statement.close();
}
catch (Exception e)
{
_log.log(Level.WARNING, "Olympiad System: Error loading noblesse data from database: ", e);
}
synchronized (this)
{
_log.info("Olympiad System: Loading Olympiad system....");
if (_period == 0)
_log.info("Olympiad System: Currently in Competition period.");
else
_log.info("Olympiad System: Currently in Validation period.");
long milliToEnd;
if (_period == 0)
milliToEnd = getMillisToOlympiadEnd();
else
milliToEnd = getMillisToValidationEnd();
_log.info("Olympiad System: " + Math.round(milliToEnd / 60000) + " minutes until period ends.");
if (_period == 0)
{
milliToEnd = getMillisToWeekChange();
_log.info("Olympiad System: Next weekly change is in " + Math.round(milliToEnd / 60000) + " minutes.");
}
}
_log.info("Olympiad System: Loaded " + _nobles.size() + " nobles.");
}
public void loadNoblesRank()
{
_noblesRank.clear();
TIntIntHashMap tmpPlace = new TIntIntHashMap();
try (Connection con = L2DatabaseFactory.getInstance().getConnection())
{
PreparedStatement statement = con.prepareStatement(GET_ALL_CLASSIFIED_NOBLESS);
ResultSet rset = statement.executeQuery();
int place = 1;
while (rset.next())
{
tmpPlace.put(rset.getInt(CHAR_ID), place++);
}
rset.close();
statement.close();
}
catch (Exception e)
{
_log.log(Level.WARNING, "Olympiad System: Error loading noblesse data from database for Ranking: ", e);
}
int rank1 = (int) Math.round(tmpPlace.size() * 0.01);
int rank2 = (int) Math.round(tmpPlace.size() * 0.10);
int rank3 = (int) Math.round(tmpPlace.size() * 0.25);
int rank4 = (int) Math.round(tmpPlace.size() * 0.50);
if (rank1 == 0)
{
rank1 = 1;
rank2++;
rank3++;
rank4++;
}
for (int charId : tmpPlace.keys())
{
if (tmpPlace.get(charId) <= rank1)
_noblesRank.put(charId, 1);
else if (tmpPlace.get(charId) <= rank2)
_noblesRank.put(charId, 2);
else if (tmpPlace.get(charId) <= rank3)
_noblesRank.put(charId, 3);
else if (tmpPlace.get(charId) <= rank4)
_noblesRank.put(charId, 4);
else
_noblesRank.put(charId, 5);
}
}
protected void init()
{
if (_period == 1)
return;
_compStart = Calendar.getInstance();
_compStart.set(Calendar.HOUR_OF_DAY, COMP_START);
_compStart.set(Calendar.MINUTE, COMP_MIN);
_compEnd = _compStart.getTimeInMillis() + COMP_PERIOD;
if (_scheduledOlympiadEnd != null)
_scheduledOlympiadEnd.cancel(true);
_scheduledOlympiadEnd = ThreadPoolManager.getInstance().scheduleGeneral(new OlympiadEndTask(), getMillisToOlympiadEnd());
updateCompStatus();
}
protected class OlympiadEndTask implements Runnable
{
@Override
public void run()
{
Announcements.announceToAll(SystemMessage.getSystemMessage(SystemMessageId.OLYMPIAD_PERIOD_S1_HAS_ENDED).addNumber(_currentCycle));
if (_scheduledWeeklyTask != null)
_scheduledWeeklyTask.cancel(true);
saveNobleData();
_period = 1;
sortHerosToBe();
Hero.getInstance().resetData();
Hero.getInstance().computeNewHeroes(_heroesToBe);
saveOlympiadStatus();
updateMonthlyData();
Calendar validationEnd = Calendar.getInstance();
_validationEnd = validationEnd.getTimeInMillis() + VALIDATION_PERIOD;
loadNoblesRank();
_scheduledValdationTask = ThreadPoolManager.getInstance().scheduleGeneral(new ValidationEndTask(), getMillisToValidationEnd());
}
}
protected class ValidationEndTask implements Runnable
{
@Override
public void run()
{
_period = 0;
_currentCycle++;
deleteNobles();
setNewOlympiadEnd();
init();
}
}
protected static int getNobleCount()
{
return _nobles.size();
}
protected static StatsSet getNobleStats(int playerId)
{
return _nobles.get(playerId);
}
private void updateCompStatus()
{
synchronized (this)
{
long milliToStart = getMillisToCompBegin();
double numSecs = (milliToStart / 1000) % 60;
double countDown = ((milliToStart / 1000) - numSecs) / 60;
int numMins = (int) Math.floor(countDown % 60);
countDown = (countDown - numMins) / 60;
int numHours = (int) Math.floor(countDown % 24);
int numDays = (int) Math.floor((countDown - numHours) / 24);
_log.info("Olympiad System: Competition period starts in " + numDays + " days, " + numHours + " hours and " + numMins + " mins.");
_log.info("Olympiad System: Event starts/started : " + _compStart.getTime());
}
_scheduledCompStart = ThreadPoolManager.getInstance().scheduleGeneral(new Runnable()
{
@Override
public void run()
{
if (isOlympiadEnd())
return;
_inCompPeriod = true;
Announcements.announceToAll(SystemMessage.getSystemMessage(SystemMessageId.THE_OLYMPIAD_GAME_HAS_STARTED));
_log.info("Olympiad System: Olympiad game started.");
_gameManager = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(OlympiadGameManager.getInstance(), 30000, 30000);
if (Config.ALT_OLY_ANNOUNCE_GAMES)
_gameAnnouncer = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new OlympiadAnnouncer(), 30000, 500);
long regEnd = getMillisToCompEnd() - 600000;
if (regEnd > 0)
{
ThreadPoolManager.getInstance().scheduleGeneral(new Runnable()
{
@Override
public void run()
{
Announcements.announceToAll(SystemMessage.getSystemMessage(SystemMessageId.OLYMPIAD_REGISTRATION_PERIOD_ENDED));
}
}, regEnd);
}
_scheduledCompEnd = ThreadPoolManager.getInstance().scheduleGeneral(new Runnable()
{
@Override
public void run()
{
if (isOlympiadEnd())
return;
_inCompPeriod = false;
Announcements.announceToAll(SystemMessage.getSystemMessage(SystemMessageId.THE_OLYMPIAD_GAME_HAS_ENDED));
_log.info("Olympiad System: Olympiad game ended.");
while (OlympiadGameManager.getInstance().isBattleStarted()) // cleared in game manager
{
// wait 1 minutes for end of pendings games
try
{
Thread.sleep(60000);
}
catch (InterruptedException e)
{
}
}
if (_gameManager != null)
{
_gameManager.cancel(false);
_gameManager = null;
}
if (_gameAnnouncer != null)
{
_gameAnnouncer.cancel(false);
_gameAnnouncer = null;
}
saveOlympiadStatus();
init();
}
}, getMillisToCompEnd());
}
}, getMillisToCompBegin());
}
private long getMillisToOlympiadEnd()
{
return (_olympiadEnd - Calendar.getInstance().getTimeInMillis());
}
public void manualSelectHeroes()
{
if (_scheduledOlympiadEnd != null)
_scheduledOlympiadEnd.cancel(true);
_scheduledOlympiadEnd = ThreadPoolManager.getInstance().scheduleGeneral(new OlympiadEndTask(), 0);
}
protected long getMillisToValidationEnd()
{
if (_validationEnd > Calendar.getInstance().getTimeInMillis())
return (_validationEnd - Calendar.getInstance().getTimeInMillis());
return 10L;
}
public boolean isOlympiadEnd()
{
return (_period != 0);
}
protected void setNewOlympiadEnd()
{
Announcements.announceToAll(SystemMessage.getSystemMessage(SystemMessageId.OLYMPIAD_PERIOD_S1_HAS_STARTED).addNumber(_currentCycle));
Calendar currentTime = Calendar.getInstance();
currentTime.add(Calendar.MONTH, 1);
currentTime.set(Calendar.DAY_OF_MONTH, 1);
currentTime.set(Calendar.AM_PM, Calendar.AM);
currentTime.set(Calendar.HOUR, 12);
currentTime.set(Calendar.MINUTE, 0);
currentTime.set(Calendar.SECOND, 0);
_olympiadEnd = currentTime.getTimeInMillis();
Calendar nextChange = Calendar.getInstance();
_nextWeeklyChange = nextChange.getTimeInMillis() + WEEKLY_PERIOD;
scheduleWeeklyChange();
}
public boolean inCompPeriod()
{
return _inCompPeriod;
}
private long getMillisToCompBegin()
{
if (_compStart.getTimeInMillis() < Calendar.getInstance().getTimeInMillis() && _compEnd > Calendar.getInstance().getTimeInMillis())
return 10L;
if (_compStart.getTimeInMillis() > Calendar.getInstance().getTimeInMillis())
return (_compStart.getTimeInMillis() - Calendar.getInstance().getTimeInMillis());
return setNewCompBegin();
}
private long setNewCompBegin()
{
_compStart = Calendar.getInstance();
_compStart.set(Calendar.HOUR_OF_DAY, COMP_START);
_compStart.set(Calendar.MINUTE, COMP_MIN);
_compStart.add(Calendar.HOUR_OF_DAY, 24);
_compEnd = _compStart.getTimeInMillis() + COMP_PERIOD;
_log.info("Olympiad System: New schedule @ " + _compStart.getTime());
return (_compStart.getTimeInMillis() - Calendar.getInstance().getTimeInMillis());
}
protected long getMillisToCompEnd()
{
return (_compEnd - Calendar.getInstance().getTimeInMillis());
}
private long getMillisToWeekChange()
{
if (_nextWeeklyChange > Calendar.getInstance().getTimeInMillis())
return (_nextWeeklyChange - Calendar.getInstance().getTimeInMillis());
return 10L;
}
private void scheduleWeeklyChange()
{
_scheduledWeeklyTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new Runnable()
{
@Override
public void run()
{
addWeeklyPoints();
_log.info("Olympiad System: Added weekly points to nobles.");
Calendar nextChange = Calendar.getInstance();
_nextWeeklyChange = nextChange.getTimeInMillis() + WEEKLY_PERIOD;
}
}, getMillisToWeekChange(), WEEKLY_PERIOD);
}
protected synchronized void addWeeklyPoints()
{
if (_period == 1)
return;
int currentPoints;
for (StatsSet nobleInfo : _nobles.values())
{
currentPoints = nobleInfo.getInteger(POINTS);
currentPoints += WEEKLY_POINTS;
nobleInfo.set(POINTS, currentPoints);
}
}
public int getCurrentCycle()
{
return _currentCycle;
}
public boolean playerInStadia(L2PcInstance player)
{
return ZoneManager.getOlympiadStadium(player) != null;
}
/**
* Save noblesse data to database
*/
protected synchronized void saveNobleData()
{
if (_nobles == null || _nobles.isEmpty())
return;
try (Connection con = L2DatabaseFactory.getInstance().getConnection())
{
PreparedStatement statement;
for (int nobleId : _nobles.keySet())
{
StatsSet nobleInfo = _nobles.get(nobleId);
if (nobleInfo == null)
continue;
int charId = nobleId;
int classId = nobleInfo.getInteger(CLASS_ID);
int points = nobleInfo.getInteger(POINTS);
int compDone = nobleInfo.getInteger(COMP_DONE);
int compWon = nobleInfo.getInteger(COMP_WON);
int compLost = nobleInfo.getInteger(COMP_LOST);
int compDrawn = nobleInfo.getInteger(COMP_DRAWN);
boolean toSave = nobleInfo.getBool("to_save");
if (toSave)
{
statement = con.prepareStatement(OLYMPIAD_SAVE_NOBLES);
statement.setInt(1, charId);
statement.setInt(2, classId);
statement.setInt(3, points);
statement.setInt(4, compDone);
statement.setInt(5, compWon);
statement.setInt(6, compLost);
statement.setInt(7, compDrawn);
nobleInfo.set("to_save", false);
}
else
{
statement = con.prepareStatement(OLYMPIAD_UPDATE_NOBLES);
statement.setInt(1, points);
statement.setInt(2, compDone);
statement.setInt(3, compWon);
statement.setInt(4, compLost);
statement.setInt(5, compDrawn);
statement.setInt(6, charId);
}
statement.execute();
statement.close();
}
}
catch (SQLException e)
{
_log.log(Level.SEVERE, "Olympiad System: Failed to save noblesse data to database: ", e);
}
}
/**
* Save current olympiad status and update noblesse table in database
*/
public void saveOlympiadStatus()
{
saveNobleData();
try (Connection con = L2DatabaseFactory.getInstance().getConnection())
{
final PreparedStatement statement = con.prepareStatement(OLYMPIAD_SAVE_DATA);
statement.setInt(1, _currentCycle);
statement.setInt(2, _period);
statement.setLong(3, _olympiadEnd);
statement.setLong(4, _validationEnd);
statement.setLong(5, _nextWeeklyChange);
statement.setInt(6, _currentCycle);
statement.setInt(7, _period);
statement.setLong(8, _olympiadEnd);
statement.setLong(9, _validationEnd);
statement.setLong(10, _nextWeeklyChange);
statement.execute();
statement.close();
}
catch (SQLException e)
{
_log.log(Level.SEVERE, "Olympiad System: Failed to save olympiad data to database: ", e);
}
}
protected void updateMonthlyData()
{
try (Connection con = L2DatabaseFactory.getInstance().getConnection())
{
PreparedStatement statement = con.prepareStatement(OLYMPIAD_MONTH_CLEAR);
statement.execute();
statement.close();
statement = con.prepareStatement(OLYMPIAD_MONTH_CREATE);
statement.execute();
statement.close();
}
catch (SQLException e)
{
_log.log(Level.SEVERE, "Olympiad System: Failed to update monthly noblese data: ", e);
}
}
protected void sortHerosToBe()
{
if (_period != 1)
return;
if (_nobles != null)
{
for (Integer nobleId : _nobles.keySet())
{
StatsSet nobleInfo = _nobles.get(nobleId);
if (nobleInfo == null)
continue;
}
}
_heroesToBe = new ArrayList<>();
try (Connection con = L2DatabaseFactory.getInstance().getConnection())
{
PreparedStatement statement = con.prepareStatement(OLYMPIAD_GET_HEROS);
ResultSet rset;
StatsSet hero;
for (int element : HERO_IDS)
{
statement.setInt(1, element);
rset = statement.executeQuery();
statement.clearParameters();
if (rset.next())
{
hero = new StatsSet();
hero.set(CLASS_ID, element);
hero.set(CHAR_ID, rset.getInt(CHAR_ID));
hero.set(CHAR_NAME, rset.getString(CHAR_NAME));
_heroesToBe.add(hero);
}
rset.close();
}
statement.close();
}
catch (SQLException e)
{
_log.warning("Olympiad System: Couldnt load heros from DB");
}
}
public List<String> getClassLeaderBoard(int classId)
{
List<String> names = new ArrayList<>();
try (Connection con = L2DatabaseFactory.getInstance().getConnection())
{
PreparedStatement statement = con.prepareStatement(GET_EACH_CLASS_LEADER);
statement.setInt(1, classId);
ResultSet rset = statement.executeQuery();
while (rset.next())
names.add(rset.getString(CHAR_NAME));
statement.close();
rset.close();
}
catch (SQLException e)
{
_log.warning("Olympiad System: Couldn't load olympiad leaders from DB!");
}
return names;
}
public int getNoblessePasses(L2PcInstance player, boolean clear)
{
if ((player == null) || (_period != 1) || _noblesRank.isEmpty())
return 0;
final int objId = player.getObjectId();
if (!_noblesRank.containsKey(objId))
return 0;
final StatsSet noble = _nobles.get(objId);
if ((noble == null) || (noble.getInteger(POINTS) == 0))
return 0;
final int rank = _noblesRank.get(objId);
int points = (player.isHero() ? Config.ALT_OLY_HERO_POINTS : 0);
switch (rank)
{
case 1:
points += Config.ALT_OLY_RANK1_POINTS;
break;
case 2:
points += Config.ALT_OLY_RANK2_POINTS;
break;
case 3:
points += Config.ALT_OLY_RANK3_POINTS;
break;
case 4:
points += Config.ALT_OLY_RANK4_POINTS;
break;
default:
points += Config.ALT_OLY_RANK5_POINTS;
}
if (clear)
noble.set(POINTS, 0);
points *= Config.ALT_OLY_GP_PER_POINT;
return points;
}
public int getNoblePoints(int objId)
{
if ((_nobles == null) || !_nobles.containsKey(objId))
return 0;
return _nobles.get(objId).getInteger(POINTS);
}
public int getLastNobleOlympiadPoints(int objId)
{
int result = 0;
try (Connection con = L2DatabaseFactory.getInstance().getConnection())
{
final PreparedStatement statement = con.prepareStatement("SELECT olympiad_points FROM olympiad_nobles_eom WHERE char_id = ?");
statement.setInt(1, objId);
final ResultSet rs = statement.executeQuery();
if (rs.first())
result = rs.getInt(1);
rs.close();
statement.close();
}
catch (Exception e)
{
_log.log(Level.WARNING, "Could not load last olympiad points:", e);
}
return result;
}
public int getCompetitionDone(int objId)
{
if ((_nobles == null) || !_nobles.containsKey(objId))
return 0;
return _nobles.get(objId).getInteger(COMP_DONE);
}
public int getCompetitionWon(int objId)
{
if ((_nobles == null) || !_nobles.containsKey(objId))
return 0;
return _nobles.get(objId).getInteger(COMP_WON);
}
public int getCompetitionLost(int objId)
{
if ((_nobles == null) || !_nobles.containsKey(objId))
return 0;
return _nobles.get(objId).getInteger(COMP_LOST);
}
protected void deleteNobles()
{
try (Connection con = L2DatabaseFactory.getInstance().getConnection())
{
final PreparedStatement statement = con.prepareStatement(OLYMPIAD_DELETE_ALL);
statement.execute();
statement.close();
}
catch (SQLException e)
{
_log.warning("Olympiad System: Couldn't delete nobles from DB!");
}
_nobles.clear();
}
/**
* @param charId the noble object Id.
* @param data the stats set data to add.
* @return the old stats set if the noble is already present, null otherwise.
*/
protected static StatsSet addNobleStats(int charId, StatsSet data)
{
return _nobles.put(Integer.valueOf(charId), data);
}
private static class SingletonHolder
{
protected static final Olympiad _instance = new Olympiad();
}
}
9 answers to this question
Recommended Posts
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.