-
Posts
259 -
Joined
-
Last visited
Never -
Feedback
0%
Content Type
Articles
Profiles
Forums
Store
Everything posted by FFs
-
[Help]How do you make a downloadable system file
FFs replied to Marlin's question in Request Server Development Help [L2J]
Server chronicle? -
It works fine for Hopzone (Tested) Topzone (Tested) and Hopzones (Tested) Thanx for share men. A question, the credits are for you or for L2JServer?
-
[Share] Online players script for website
FFs replied to Shadowalker's topic in Server Development Discussion [L2J]
Thanx for share, i'll test it. -
Ok, thanx for the information HighOne :)
-
[Question] Non Crashing pack?
FFs replied to [DEV]DjSt3rios's question in Request Server Development Help [L2J]
I read a lot of post about aCis and i think you dont will have problems with aCis pack... If you need help just make a post. -
[Question] Non Crashing pack?
FFs replied to [DEV]DjSt3rios's question in Request Server Development Help [L2J]
aCis, i alredy test it and is better than L2JFrozen Here's the project web: http://acis.i-live.eu/ -
I think yes, but is not tested. You can test it by yourself.
-
If the imports dont change at H5 update, the NPC with python will work.
-
You are right, but if he is newbie (i'm not saying that) that pack will be the best for use. I'll test aCis pack.....
-
But you can fix that, and is not difficult, and for me is the most popular pack working at now...
-
You tested it? L2JServer Freya last rev
-
I'll test it, and send you by PM the bugs. Thanx men :)
-
You need to edit the imports too, because if the code dont find the files direction, it will not work
-
[Question] Non Crashing pack?
FFs replied to [DEV]DjSt3rios's question in Request Server Development Help [L2J]
L2JServer is fully configurable by yourself, i recommend it. And if you have errors or questions you can post here in MxC, we work with L2JServer Freya, at least me... -
L2JFrozen Interlude Web: http://l2jfrozen.com/ SVN: http://subversion.assembla.com/svn/L2jFrozenInterlude/trunk/ Timeline: http://www.assembla.com/spaces/L2jFrozenInterlude/stream
-
That code is tested on L2JServer last rev Freya?
-
I'll test it for L2JFreya, thanx.
-
Tested? And works for L2JServer Freya?
-
[Share] Class Cloak Goddess of Destruction (Freya Client)
FFs replied to crash_8675's topic in Client Development Discussion
That's realy cool :D Thanx for share :) -
com.l2jserver.gameserver.Shutdown.java /* * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * 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 com.l2jserver.gameserver; import java.util.Collection; import java.util.logging.Level; import java.util.logging.Logger; import com.l2jserver.Config; import com.l2jserver.L2DatabaseFactory; import com.l2jserver.gameserver.datatables.ClanTable; import com.l2jserver.gameserver.datatables.OfflineTradersTable; import com.l2jserver.gameserver.instancemanager.CastleManorManager; import com.l2jserver.gameserver.instancemanager.CursedWeaponsManager; import com.l2jserver.gameserver.instancemanager.GlobalVariablesManager; import com.l2jserver.gameserver.instancemanager.GrandBossManager; import com.l2jserver.gameserver.instancemanager.ItemAuctionManager; import com.l2jserver.gameserver.instancemanager.ItemsOnGroundManager; import com.l2jserver.gameserver.instancemanager.QuestManager; import com.l2jserver.gameserver.instancemanager.RaidBossSpawnManager; import com.l2jserver.gameserver.model.L2World; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.entity.Hero; import com.l2jserver.gameserver.model.olympiad.Olympiad; import com.l2jserver.gameserver.network.L2GameClient; import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.communityserver.CommunityServerThread; import com.l2jserver.gameserver.network.gameserverpackets.ServerStatus; import com.l2jserver.gameserver.network.serverpackets.ServerClose; import com.l2jserver.gameserver.network.serverpackets.SystemMessage; import com.l2jserver.gameserver.util.Broadcast; /** * * This class provides the functions for shutting down and restarting the server * It closes all open clientconnections and saves all data. * * @version $Revision: 1.2.4.5 $ $Date: 2005/03/27 15:29:09 $ */ public class Shutdown extends Thread { private static Logger _log = Logger.getLogger(Shutdown.class.getName()); private static Shutdown _counterInstance = null; private int _secondsShut; private int _shutdownMode; public static final int SIGTERM = 0; public static final int GM_SHUTDOWN = 1; public static final int GM_RESTART = 2; public static final int ABORT = 3; private static final String[] MODE_TEXT = { "SIGTERM", "shutting down", "restarting", "aborting" }; /** * This function starts a shutdown countdown from Telnet (Copied from Function startShutdown()) * * @param ip IP Which Issued shutdown command * @param seconds seconds untill shutdown * @param restart true if the server will restart after shutdown */ private void SendServerQuit(int seconds) { SystemMessage sysm = SystemMessage.getSystemMessage(SystemMessageId.THE_SERVER_WILL_BE_COMING_DOWN_IN_S1_SECONDS); sysm.addNumber(seconds); Broadcast.toAllOnlinePlayers(sysm); } public void startTelnetShutdown(String IP, int seconds, boolean restart) { _log.warning("IP: " + IP + " issued shutdown command. " + MODE_TEXT[_shutdownMode] + " in " + seconds + " seconds!"); //_an.announceToAll("Server is " + _modeText[shutdownMode] + " in "+seconds+ " seconds!"); if (restart) { _shutdownMode = GM_RESTART; } else { _shutdownMode = GM_SHUTDOWN; } if (_shutdownMode > 0) { switch (seconds) { case 540: case 480: case 420: case 360: case 300: case 240: case 180: case 120: case 60: case 30: case 10: case 5: case 4: case 3: case 2: case 1: break; default: SendServerQuit(seconds); } } if (_counterInstance != null) { _counterInstance._abort(); } _counterInstance = new Shutdown(seconds, restart); _counterInstance.start(); } /** * This function aborts a running countdown * * @param IP IP Which Issued shutdown command */ public void telnetAbort(String IP) { _log.warning("IP: " + IP + " issued shutdown ABORT. " + MODE_TEXT[_shutdownMode] + " has been stopped!"); if (_counterInstance != null) { _counterInstance._abort(); Announcements _an = Announcements.getInstance(); _an.announceToAll("Server aborts " + MODE_TEXT[_shutdownMode] + " and continues normal operation!"); } } /** * Default constucter is only used internal to create the shutdown-hook instance * */ private Shutdown() { _secondsShut = -1; _shutdownMode = SIGTERM; } /** * This creates a countdown instance of Shutdown. * * @param seconds how many seconds until shutdown * @param restart true is the server shall restart after shutdown * */ public Shutdown(int seconds, boolean restart) { if (seconds < 0) { seconds = 0; } _secondsShut = seconds; if (restart) { _shutdownMode = GM_RESTART; } else { _shutdownMode = GM_SHUTDOWN; } } /** * get the shutdown-hook instance * the shutdown-hook instance is created by the first call of this function, * but it has to be registrered externaly. * * @return instance of Shutdown, to be used as shutdown hook */ public static Shutdown getInstance() { return SingletonHolder._instance; } /** * this function is called, when a new thread starts * * if this thread is the thread of getInstance, then this is the shutdown hook * and we save all data and disconnect all clients. * * after this thread ends, the server will completely exit * * if this is not the thread of getInstance, then this is a countdown thread. * we start the countdown, and when we finished it, and it was not aborted, * we tell the shutdown-hook why we call exit, and then call exit * * when the exit status of the server is 1, startServer.sh / startServer.bat * will restart the server. * */ @Override public void run() { if (this == SingletonHolder._instance) { try { if ((Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) && Config.RESTORE_OFFLINERS) OfflineTradersTable.storeOffliners(); } catch (Throwable t) { _log.log(Level.WARNING, "Error saving offline shops.",t); } try { disconnectAllCharacters(); _log.info("All players disconnected."); } catch (Throwable t) { // ignore } // ensure all services are stopped try { GameTimeController.getInstance().stopTimer(); } catch (Throwable t) { // ignore } // stop all threadpolls try { ThreadPoolManager.getInstance().shutdown(); } catch (Throwable t) { // ignore } try { CommunityServerThread.getInstance().interrupt(); } catch (Throwable t) { // ignore } try { LoginServerThread.getInstance().interrupt(); } catch (Throwable t) { // ignore } // last byebye, save all data and quit this server saveData(); // saveData sends messages to exit players, so shutdown selector after it try { GameServer.gameServer.getSelectorThread().shutdown(); } catch (Throwable t) { // ignore } // commit data, last chance try { L2DatabaseFactory.getInstance().shutdown(); } catch (Throwable t) { } // server will quit, when this function ends. if (SingletonHolder._instance._shutdownMode == GM_RESTART) { Runtime.getRuntime().halt(2); } else { Runtime.getRuntime().halt(0); } } else { // gm shutdown: send warnings and then call exit to start shutdown sequence countdown(); // last point where logging is operational :( _log.warning("GM shutdown countdown is over. " + MODE_TEXT[_shutdownMode] + " NOW!"); switch (_shutdownMode) { case GM_SHUTDOWN: SingletonHolder._instance.setMode(GM_SHUTDOWN); System.exit(0); break; case GM_RESTART: SingletonHolder._instance.setMode(GM_RESTART); System.exit(2); break; } } } /** * This functions starts a shutdown countdown * * @param activeChar GM who issued the shutdown command * @param seconds seconds until shutdown * @param restart true if the server will restart after shutdown */ public void startShutdown(L2PcInstance activeChar, int seconds, boolean restart) { if (restart) { _shutdownMode = GM_RESTART; } else { _shutdownMode = GM_SHUTDOWN; } _log.warning("GM: " + activeChar.getName() + "(" + activeChar.getObjectId() + ") issued shutdown command. " + MODE_TEXT[_shutdownMode] + " in " + seconds + " seconds!"); if (_shutdownMode > 0) { switch (seconds) { case 540: case 480: case 420: case 360: case 300: case 240: case 180: case 120: case 60: case 30: case 10: case 5: case 4: case 3: case 2: case 1: break; default: SendServerQuit(seconds); } } if (_counterInstance != null) { _counterInstance._abort(); } // the main instance should only run for shutdown hook, so we start a new instance _counterInstance = new Shutdown(seconds, restart); _counterInstance.start(); } /** * This function aborts a running countdown * * @param activeChar GM who issued the abort command */ public void abort(L2PcInstance activeChar) { _log.warning("GM: " + activeChar.getName() + "(" + activeChar.getObjectId() + ") issued shutdown ABORT. " + MODE_TEXT[_shutdownMode] + " has been stopped!"); if (_counterInstance != null) { _counterInstance._abort(); Announcements _an = Announcements.getInstance(); _an.announceToAll("Server aborts " + MODE_TEXT[_shutdownMode] + " and continues normal operation!"); } } /** * set the shutdown mode * @param mode what mode shall be set */ private void setMode(int mode) { _shutdownMode = mode; } /** * set shutdown mode to ABORT * */ private void _abort() { _shutdownMode = ABORT; } /** * this counts the countdown and reports it to all players * countdown is aborted if mode changes to ABORT */ private void countdown() { try { while (_secondsShut > 0) { switch (_secondsShut) { case 540: SendServerQuit(540); break; case 480: SendServerQuit(480); break; case 420: SendServerQuit(420); break; case 360: SendServerQuit(360); break; case 300: SendServerQuit(300); break; case 240: SendServerQuit(240); break; case 180: SendServerQuit(180); break; case 120: SendServerQuit(120); break; case 60: LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); //avoids new players from logging in SendServerQuit(60); break; case 30: SendServerQuit(30); break; case 10: SendServerQuit(10); break; case 5: SendServerQuit(5); break; case 4: SendServerQuit(4); break; case 3: SendServerQuit(3); break; case 2: SendServerQuit(2); break; case 1: SendServerQuit(1); break; } _secondsShut--; int delay = 1000; //milliseconds Thread.sleep(delay); if (_shutdownMode == ABORT) break; } } catch (InterruptedException e) { //this will never happen } } /** * this sends a last byebye, disconnects all players and saves data * */ private void saveData() { switch (_shutdownMode) { case SIGTERM: _log.info("SIGTERM received. Shutting down NOW!"); break; case GM_SHUTDOWN: _log.info("GM shutdown received. Shutting down NOW!"); break; case GM_RESTART: _log.info("GM restart received. Restarting NOW!"); break; } /*if (Config.ACTIVATE_POSITION_RECORDER) Universe.getInstance().implode(true);*/ // Seven Signs data is now saved along with Festival data. if (!SevenSigns.getInstance().isSealValidationPeriod()) SevenSignsFestival.getInstance().saveFestivalData(false); // Save Seven Signs data before closing. :) SevenSigns.getInstance().saveSevenSignsData(); SevenSigns.getInstance().saveSevenSignsStatus(); // Save all raidboss and GrandBoss status ^_^ RaidBossSpawnManager.getInstance().cleanUp(); _log.info("RaidBossSpawnManager: All raidboss info saved!!"); GrandBossManager.getInstance().cleanUp(); _log.info("GrandBossManager: All Grand Boss info saved!!"); _log.info("TradeController saving data.. This action may take some minutes! Please wait until completed!"); TradeController.getInstance().dataCountStore(); _log.info("TradeController: All count Item Saved"); ItemAuctionManager.getInstance().shutdown(); Olympiad.getInstance().saveOlympiadStatus(); _log.info("Olympiad System: Data saved!!"); Hero.getInstance().shutdown(); _log.info("Hero System: Data saved!!"); ClanTable.getInstance().storeClanScore(); _log.info("Clan System: Data saved!!"); // Save Cursed Weapons data before closing. CursedWeaponsManager.getInstance().saveData(); // Save all manor data CastleManorManager.getInstance().save(); // Save all global (non-player specific) Quest data that needs to persist after reboot QuestManager.getInstance().save(); // Save all global variables data GlobalVariablesManager.getInstance().saveVars(); //Save items on ground before closing if (Config.SAVE_DROPPED_ITEM) { ItemsOnGroundManager.getInstance().saveInDb(); ItemsOnGroundManager.getInstance().cleanUp(); _log.info("ItemsOnGroundManager: All items on ground saved!!"); } try { int delay = 5000; Thread.sleep(delay); } catch (InterruptedException e) { //never happens :p } } /** * this disconnects all clients from the server * */ private void disconnectAllCharacters() { Collection<L2PcInstance> pls = L2World.getInstance().getAllPlayers().values(); //synchronized (L2World.getInstance().getAllPlayers()) { for (L2PcInstance player : pls) { if (player == null) continue; //Logout Character try { L2GameClient client = player.getClient(); if (client != null && !client.isDetached()) { client.close(ServerClose.STATIC_PACKET); client.setActiveChar(null); player.setClient(null); } player.deleteMe(); } catch (Throwable t) { _log.log(Level.WARNING, "Failed logour char "+player, t); } } } } @SuppressWarnings("synthetic-access") private static class SingletonHolder { protected static final Shutdown _instance = new Shutdown(); } } You must edit this lines: Announcements _an = Announcements.getInstance(); _an.announceToAll("Server aborts " + MODE_TEXT[_shutdownMode] + " and continues normal operation!"); To your server name for example: Announcements _an = Announcements.getInstance(); _an.announceToAll("Lineage II YourServer aborts " + MODE_TEXT[_shutdownMode] + " and continues normal operation!"); And in: com.l2jserver.gameserver.network.SystemMessageId.java find this lines: /** * ID: 1<br> * Message: The server will be coming down in $1 seconds. Please find a safe place to log out. */ public static final SystemMessageId THE_SERVER_WILL_BE_COMING_DOWN_IN_S1_SECONDS; Edit this: Message: YourServerName will be coming down in $1 seconds. Please find a safe place to log out. Save and compile, thats all.
-
[Guide]Developers mode in Lineage2
FFs replied to EdenEternal's topic in Server Development Discussion [L2J]
I think yes, its a pawnviewer, but i never used it, and i think is for test things like armors and skills right? If i'm bad informed tell me