Noticias:

No tienes permiso para ver los enlaces. Para poder verlos Registrate o Conectate.

Menú Principal

Community Board Smart modification

Iniciado por Swarlog, Ago 03, 2025, 12:22 AM

Tema anterior - Siguiente tema

Swarlog

Index: dist/game/config/SmartCB.properties
===================================================================
--- dist/game/config/SmartCB.properties    (revision 0)
+++ dist/game/config/SmartCB.properties    (working copy)
@@ -0,0 +1,33 @@
+# ---------------------------------------------------------------------------
+# Smart CommunityBoard Settings
+# ---------------------------------------------------------------------------
+# This properties file is solely for the Smart CB modifications.
+# The Smart CB has been created by Darule.
+
+# ---------------------------------------------------------------------------
+# Top Players Options
+# ---------------------------------------------------------------------------
+# Explanation 1
+# Default value 19
+TopPlayerRowHeight = 19
+
+# Here you can specify the amount of the results that will be displayed.
+# Default value 20
+TopPlayerResults = 20
+
+# Explanation 1
+# Default value 17
+RaidListRowHeight = 17
+
+# Here you can specify the amount of the results that will be displayed.
+# Default value 20 , max is 26. If you change this you have to check the Raids Pagination because some pages might be empty.
+RaidListResults = 20
+
+# If you enable this option Raid List results will be sorted using asceding level (Smaller level raids will appear 1st)
+# Default = True
+RaidListSortAsc = True
+
+# If you enable this option on the stat page 2 rows will appear under Players Online on stats page.
+# Real active players and detached players.
+# Default = True
+AllowRealOnlineStats = True
\ No newline at end of file
Index: java/com/l2jserver/Config.java
===================================================================
--- java/com/l2jserver/Config.java    (revision 5370)
+++ java/com/l2jserver/Config.java    (working copy)
@@ -90,8 +90,19 @@
     public static final String SECURITY_CONFIG_FILE = "./config/security.properties";
     public static final String EMAIL_CONFIG_FILE = "./config/email.properties";
     public static final String CH_SIEGE_FILE = "./config/ConquerableHallSiege.properties";
+    public static final String SMART_CB = "./config/SmartCB.properties";
     
     // --------------------------------------------------
+    // Smart Community Board Definitions
+    // --------------------------------------------------
+    public static int TOP_PLAYER_ROW_HEIGHT;
+    public static int TOP_PLAYER_RESULTS;
+    public static int RAID_LIST_ROW_HEIGHT;
+    public static int RAID_LIST_RESULTS;
+    public static boolean RAID_LIST_SORT_ASC;
+    public static boolean ALLOW_REAL_ONLINE_STATS;
+    
+    // --------------------------------------------------
     // L2J Variable Definitions
     // --------------------------------------------------
     public static boolean ALT_GAME_DELEVEL;
@@ -1260,6 +1271,25 @@
                 throw new Error("Failed to Load " + COMMUNITY_CONFIGURATION_FILE + " File.");
             }
             
+            // Load Smart CB Properties file (if exists)
+            final File smartcb = new File(SMART_CB);
+            try (InputStream is = new FileInputStream(smartcb))
+            {
+                L2Properties smartCB = new L2Properties();
+                smartCB.load(is);
+                TOP_PLAYER_ROW_HEIGHT = Integer.parseInt(smartCB.getProperty("TopPlayerRowHeight", "19"));                
+                TOP_PLAYER_RESULTS = Integer.parseInt(smartCB.getProperty("TopPlayerResults", "20"));
+                RAID_LIST_ROW_HEIGHT = Integer.parseInt(smartCB.getProperty("RaidListRowHeight", "18"));
+                RAID_LIST_RESULTS = Integer.parseInt(smartCB.getProperty("RaidListResults", "20"));
+                RAID_LIST_SORT_ASC = Boolean.parseBoolean(smartCB.getProperty("RaidListSortAsc", "True"));
+                ALLOW_REAL_ONLINE_STATS = Boolean.parseBoolean(smartCB.getProperty("AllowRealOnlineStats", "True"));
+            }
+            catch (Exception e)
+            {
+                _log.warning("Config: " + e.getMessage());
+                throw new Error("Failed to Load " + SMART_CB + " File.");
+            }
+            
             // Load Feature L2Properties file (if exists)
             final File feature = new File(FEATURE_CONFIG_FILE);
             try (InputStream is = new FileInputStream(feature))
Index: java/com/l2jserver/gameserver/communitybbs/BB/Forum.java
===================================================================
--- java/com/l2jserver/gameserver/communitybbs/BB/Forum.java    (revision 5370)
+++ java/com/l2jserver/gameserver/communitybbs/BB/Forum.java    (working copy)
@@ -292,7 +292,7 @@
      */
     public void vload()
     {
-        if (!_loaded)
+        if (_loaded == false)
         {
             load();
             getChildren();
Index: java/com/l2jserver/gameserver/communitybbs/CastleStatus.java
===================================================================
--- java/com/l2jserver/gameserver/communitybbs/CastleStatus.java    (revision 0)
+++ java/com/l2jserver/gameserver/communitybbs/CastleStatus.java    (working copy)
@@ -0,0 +1,102 @@
+package com.l2jserver.gameserver.communitybbs;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.l2jserver.L2DatabaseFactory;
+
+import javolution.text.TextBuilder;
+
+public class CastleStatus
+{
+    private TextBuilder _playerList = new TextBuilder();
+    
+    public CastleStatus()
+    {
+        loadFromDB();
+    }
+    
+    @SuppressWarnings("null")
+    private void loadFromDB()
+    {
+        Connection con = null;
+        
+        try
+        {
+            con = L2DatabaseFactory.getInstance().getConnection();
+            
+            for (int i = 1; i < 9; i++)
+            {
+                PreparedStatement statement = con.prepareStatement("SELECT clan_name, clan_level FROM clan_data WHERE hasCastle=" + i + ";");
+                ResultSet result = statement.executeQuery();
+                
+                PreparedStatement statement2 = con.prepareStatement("SELECT name, siegeDate, taxPercent FROM castle WHERE id=" + i + ";");
+                ResultSet result2 = statement2.executeQuery();
+                
+                while (result.next())
+                {
+                    String owner = result.getString("clan_name");
+                    int level = result.getInt("clan_level");
+                    
+                    while (result2.next())
+                    {
+                        String name = result2.getString("name");
+                        long someLong = result2.getLong("siegeDate");
+                        int tax = result2.getInt("taxPercent");
+                        Date anotherDate = new Date(someLong);
+                        String DATE_FORMAT = "dd-MMM-yyyy HH:mm";
+                        SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
+                        
+                        addCastleToList(name, owner, level, tax, sdf.format(anotherDate));
+                    }
+                    
+                    result2.close();
+                    statement2.close();
+                }
+                
+                result.close();
+                statement.close();
+            }
+        }
+        
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        
+        finally
+        {
+            try
+            {
+                con.close();
+            }
+            catch (Exception e)
+            {
+            }
+        }
+    }
+    
+    private void addCastleToList(String name, String owner, int level, int tax, String siegeDate)
+    {
+        _playerList.append("<table border=0 cellspacing=0 cellpadding=2 width=750>");
+        _playerList.append("<tr>");
+        _playerList.append("<td FIXWIDTH=10></td>");
+        _playerList.append("<td FIXWIDTH=100>" + name + "</td>");
+        _playerList.append("<td FIXWIDTH=100>" + owner + "</td>");
+        _playerList.append("<td FIXWIDTH=80>" + level + "</td>");
+        _playerList.append("<td FIXWIDTH=40>" + tax + "</td>");
+        _playerList.append("<td FIXWIDTH=180>" + siegeDate + "</td>");
+        _playerList.append("<td FIXWIDTH=5></td>");
+        _playerList.append("</tr>");
+        _playerList.append("</table>");
+        _playerList.append("<img src=\"L2UI.Squaregray\" width=\"740\" height=\"1\">");
+    }
+    
+    public String loadCastleList()
+    {
+        return _playerList.toString();
+    }
+}
Index: java/com/l2jserver/gameserver/communitybbs/ClanList.java
===================================================================
--- java/com/l2jserver/gameserver/communitybbs/ClanList.java    (revision 0)
+++ java/com/l2jserver/gameserver/communitybbs/ClanList.java    (working copy)
@@ -0,0 +1,116 @@
+package com.l2jserver.gameserver.communitybbs;
+
+import com.l2jserver.L2DatabaseFactory;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import javolution.text.TextBuilder;
+
+public class ClanList
+{
+    private TextBuilder _clanList = new TextBuilder();
+    
+    public ClanList(int type)
+    {
+        loadFromDB(type);
+    }
+    
+    private void loadFromDB(int type)
+    {
+        Connection con = null;
+        int stpoint = 0;
+        int results = 20;
+        String castlename = "";
+        String allystatus = "";
+        String leadername = "";
+        for (int count = 1; count != type; count++)
+        {
+            stpoint += 20;
+        }
+        
+        try
+        {
+            con = L2DatabaseFactory.getInstance().getConnection();
+            PreparedStatement statement = con.prepareStatement("SELECT clan_id, clan_name, ally_name, leader_id, clan_level, reputation_score, hasCastle, ally_id FROM clan_data ORDER BY `clan_level` desc Limit " + stpoint + ", " + results);
+            ResultSet result = statement.executeQuery();
+            int pos = 0;
+            
+            while (result.next())
+            {
+                int clanid = result.getInt("leader_id");
+                String clan = result.getString("clan_name");
+                String ally = result.getString("ally_name");
+                int clanleader = result.getInt("leader_id");
+                int clanlevel = result.getInt("clan_level");
+                int reputation = result.getInt("reputation_score");
+                int hascastle = result.getInt("hasCastle");
+                int allyid = result.getInt("ally_id");
+                if (allyid != 0)
+                {
+                    if (allyid == clanid)
+                        allystatus = "Alliance Leader";
+                    allystatus = "Affiliated Clan";
+                }
+                else
+                {
+                    allystatus = "-";
+                    ally = "[no-ally]";
+                }
+                if (hascastle != 0)
+                {
+                    PreparedStatement statement2 = con.prepareStatement("SELECT name FROM castle WHERE id=" + hascastle);
+                    ResultSet result2 = statement2.executeQuery();
+                    if (result2.next())
+                        castlename = result2.getString("name");
+                    result2.close();
+                    statement2.close();
+                }
+                else
+                    castlename = "[none]";
+                PreparedStatement statement3 = con.prepareStatement("SELECT char_name FROM characters WHERE charId=" + clanleader);
+                ResultSet result3 = statement3.executeQuery();
+                
+                if (result3.next())
+                    leadername = result3.getString("char_name");
+                result3.close();
+                statement3.close();
+                pos++;
+                addClanToList(pos, clan, ally, leadername, clanlevel, reputation, castlename, allystatus);
+            }
+            result.close();
+            statement.close();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        finally
+        {
+            L2DatabaseFactory.close(con);
+        }
+    }
+    
+    private void addClanToList(int pos, String clan, String ally, String leadername, int clanlevel, int reputation, String castlename, String allystatus)
+    {
+        _clanList.append("<table border=0 cellspacing=0 cellpadding=2 width=760>");
+        _clanList.append("<tr>");
+        _clanList.append("<td FIXWIDTH=5></td>");
+        _clanList.append("<td FIXWIDTH=20>" + pos + "</td>");
+        _clanList.append("<td FIXWIDTH=90>" + clan + "</td>");
+        _clanList.append("<td FIXWIDTH=90>" + ally + "</td>");
+        _clanList.append("<td FIXWIDTH=85>" + leadername + "</td>");
+        _clanList.append("<td FIXWIDTH=45 align=center>" + clanlevel + "</td>");
+        _clanList.append("<td FIXWIDTH=70 align=center>" + reputation + "</td>");
+        _clanList.append("<td FIXWIDTH=50 align=center>" + castlename + "</td>");
+        _clanList.append("<td FIXWIDTH=70 align=center>" + allystatus + "</td>");
+        _clanList.append("<td FIXWIDTH=5></td>");
+        _clanList.append("</tr>");
+        _clanList.append("</table>");
+        _clanList.append("<img src=\"L2UI.Squaregray\" width=\"740\" height=\"1\">");
+    }
+    
+    public String loadClanList()
+    {
+        return _clanList.toString();
+    }
+}
Index: java/com/l2jserver/gameserver/communitybbs/CommunityBoard.java
===================================================================
--- java/com/l2jserver/gameserver/communitybbs/CommunityBoard.java    (revision 5370)
+++ java/com/l2jserver/gameserver/communitybbs/CommunityBoard.java    (working copy)
@@ -27,6 +27,10 @@
 
 public class CommunityBoard
 {
+    private CommunityBoard()
+    {
+    }
+    
     public static CommunityBoard getInstance()
     {
         return SingletonHolder._instance;
@@ -144,6 +148,7 @@
         }
     }
     
+    @SuppressWarnings("synthetic-access")
     private static class SingletonHolder
     {
         protected static final CommunityBoard _instance = new CommunityBoard();
Index: java/com/l2jserver/gameserver/communitybbs/GrandBossList.java
===================================================================
--- java/com/l2jserver/gameserver/communitybbs/GrandBossList.java    (revision 0)
+++ java/com/l2jserver/gameserver/communitybbs/GrandBossList.java    (working copy)
@@ -0,0 +1,84 @@
+package com.l2jserver.gameserver.communitybbs;
+
+import com.l2jserver.L2DatabaseFactory;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import javolution.text.TextBuilder;
+
+public class GrandBossList
+{
+    private TextBuilder _GrandBossList = new TextBuilder();
+    
+    public GrandBossList()
+    {
+        loadFromDB();
+    }
+    
+    private void loadFromDB()
+    {
+        Connection con = null;
+        int pos = 0;
+        
+        try
+        {
+            con = L2DatabaseFactory.getInstance().getConnection();
+            PreparedStatement statement = con.prepareStatement("SELECT boss_id, status FROM grandboss_data");
+            ResultSet result = statement.executeQuery();
+            
+            nextnpc:
+            while (result.next())
+            {
+                int npcid = result.getInt("boss_id");
+                int status = result.getInt("status");
+                if (npcid == 29066 || npcid == 29067 || npcid == 29068 || npcid == 29118)
+                    continue nextnpc;
+                
+                PreparedStatement statement2 = con.prepareStatement("SELECT name FROM npc WHERE id=" + npcid);
+                ResultSet result2 = statement2.executeQuery();
+                
+                while (result2.next())
+                {
+                    pos++;
+                    boolean rstatus = false;
+                    if (status == 0)
+                        rstatus = true;
+                    String npcname = result2.getString("name");
+                    addGrandBossToList(pos, npcname, rstatus);
+                }
+                result2.close();
+                statement2.close();
+            }
+            
+            result.close();
+            statement.close();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        finally
+        {
+            L2DatabaseFactory.close(con);
+        }
+    }
+    
+    private void addGrandBossToList(int pos, String npcname, boolean rstatus)
+    {
+        _GrandBossList.append("<table border=0 cellspacing=0 cellpadding=2>");
+        _GrandBossList.append("<tr>");
+        _GrandBossList.append("<td FIXWIDTH=5></td>");
+        _GrandBossList.append("<td FIXWIDTH=50>" + pos + "</td>");
+        _GrandBossList.append("<td FIXWIDTH=130>" + npcname + "</td>");
+        _GrandBossList.append("<td FIXWIDTH=60 align=center>" + ((rstatus) ? "<font color=99FF00>Alive</font>" : "<font color=CC0000>Dead</font>") + "</td>");
+        _GrandBossList.append("<td FIXWIDTH=5></td>");
+        _GrandBossList.append("</tr>");
+        _GrandBossList.append("</table>");
+        _GrandBossList.append("<img src=\"L2UI.Squaregray\" width=\"250\" height=\"1\">");
+    }
+    
+    public String loadGrandBossList()
+    {
+        return _GrandBossList.toString();
+    }
+}
Index: java/com/l2jserver/gameserver/communitybbs/HeroeList.java
===================================================================
--- java/com/l2jserver/gameserver/communitybbs/HeroeList.java    (revision 0)
+++ java/com/l2jserver/gameserver/communitybbs/HeroeList.java    (working copy)
@@ -0,0 +1,197 @@
+package com.l2jserver.gameserver.communitybbs;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.util.Map;
+
+import com.l2jserver.L2DatabaseFactory;
+
+import javolution.text.TextBuilder;
+import javolution.util.FastMap;
+
+public class HeroeList
+{
+    private int _posId;
+    private TextBuilder _heroeList = new TextBuilder();
+    
+    public HeroeList()
+    {
+        loadFromDB();
+    }
+    
+    @SuppressWarnings("null")
+    private void loadFromDB()
+    {
+        java.sql.Connection con = null;
+        try
+        {
+            _posId = 0;
+            con = L2DatabaseFactory.getInstance().getConnection();
+            PreparedStatement statement = con.prepareStatement("SELECT h.count, h.played, ch.char_name, ch.base_class, ch.online, cl.clan_name, cl.ally_name FROM heroes h LEFT JOIN characters ch ON ch.charId=h.charId LEFT OUTER JOIN clan_data cl ON cl.clan_id=ch.clanid ORDER BY h.count DESC, ch.char_name ASC LIMIT 20");
+            
+            ResultSet result = statement.executeQuery();
+            
+            while (result.next())
+            {
+                boolean status = false;
+                _posId = _posId + 1;
+                
+                if (result.getInt("online") == 1)
+                    status = true;
+                
+                addPlayerToList(_posId, result.getInt("count"), result.getInt("played"), result.getString("char_name"), result.getInt("base_class"), result.getString("clan_name"), result.getString("ally_name"), status);
+            }
+            result.close();
+            statement.close();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        finally
+        {
+            try
+            {
+                con.close();
+            }
+            catch (Exception e)
+            {
+            }
+        }
+    }
+    
+    public String loadHeroeList()
+    {
+        return _heroeList.toString();
+    }
+    
+    private void addPlayerToList(int objId, int count, int played, String name, int ChrClass, String clan, String ally, boolean isOnline)
+    {
+        _heroeList.append("<table border=0 cellspacing=0 cellpadding=2 width=750>");
+        _heroeList.append("<tr>");
+        _heroeList.append("<td FIXWIDTH=10></td>");
+        _heroeList.append("<td FIXWIDTH=40>" + objId + ".</td>");
+        _heroeList.append("<td FIXWIDTH=150>" + name + "</td>");
+        _heroeList.append("<td FIXWIDTH=160>" + className(ChrClass) + "</td>");
+        _heroeList.append("<td FIXWIDTH=80>" + count + "</td>");
+        _heroeList.append("<td FIXWIDTH=80>" + played + "</td>");
+        _heroeList.append("<td FIXWIDTH=160>" + clan + "</td>");
+        _heroeList.append("<td FIXWIDTH=160>" + ally + "</td>");
+        _heroeList.append("<td FIXWIDTH=70>" + ((isOnline) ? "<font color=99FF00>Online</font>" : "<font color=CC0000>Offline</font>") + "</td>");
+        _heroeList.append("<td FIXWIDTH=5></td>");
+        _heroeList.append("</tr>");
+        _heroeList.append("</table>");
+        _heroeList.append("<img src=\"L2UI.Squaregray\" width=\"740\" height=\"1\">");
+    }
+    
+    public final static String className(int classId)
+    {
+        Map<Integer, String> classList;
+        classList = new FastMap<Integer, String>();
+        classList.put(0, "Fighter");
+        classList.put(1, "Warrior");
+        classList.put(2, "Gladiator");
+        classList.put(3, "Warlord");
+        classList.put(4, "Knight");
+        classList.put(5, "Paladin");
+        classList.put(6, "Dark Avenger");
+        classList.put(7, "Rogue");
+        classList.put(8, "Treasure Hunter");
+        classList.put(9, "Hawkeye");
+        classList.put(10, "Mage");
+        classList.put(11, "Wizard");
+        classList.put(12, "Sorcerer");
+        classList.put(13, "Necromancer");
+        classList.put(14, "Warlock");
+        classList.put(15, "Cleric");
+        classList.put(16, "Bishop");
+        classList.put(17, "Prophet");
+        classList.put(18, "Elven Fighter");
+        classList.put(19, "Elven Knight");
+        classList.put(20, "Temple Knight");
+        classList.put(21, "Swordsinger");
+        classList.put(22, "Elven Scout");
+        classList.put(23, "Plains Walker");
+        classList.put(24, "Silver Ranger");
+        classList.put(25, "Elven Mage");
+        classList.put(26, "Elven Wizard");
+        classList.put(27, "Spellsinger");
+        classList.put(28, "Elemental Summoner");
+        classList.put(29, "Oracle");
+        classList.put(30, "Elder");
+        classList.put(31, "Dark Fighter");
+        classList.put(32, "Palus Knightr");
+        classList.put(33, "Shillien Knight");
+        classList.put(34, "Bladedancer");
+        classList.put(35, "Assasin");
+        classList.put(36, "Abyss Walker");
+        classList.put(37, "Phantom Ranger");
+        classList.put(38, "Dark Mage");
+        classList.put(39, "Dark Wizard");
+        classList.put(40, "Spellhowler");
+        classList.put(41, "Phantom Summoner");
+        classList.put(42, "Shillien Oracle");
+        classList.put(43, "Shilien Elder");
+        classList.put(44, "Orc Fighter");
+        classList.put(45, "Orc Raider");
+        classList.put(46, "Destroyer");
+        classList.put(47, "Orc Monk");
+        classList.put(48, "Tyrant");
+        classList.put(49, "Orc Mage");
+        classList.put(50, "Orc Shaman");
+        classList.put(51, "Overlord");
+        classList.put(52, "Warcryer");
+        classList.put(53, "Dwarven Fighter");
+        classList.put(54, "Scavenger");
+        classList.put(55, "Bounty Hunter");
+        classList.put(56, "Artisan");
+        classList.put(57, "Warsmith");
+        classList.put(88, "Duelist");
+        classList.put(89, "Dreadnought");
+        classList.put(90, "Phoenix Knight");
+        classList.put(91, "Hell Knight");
+        classList.put(92, "Sagittarius");
+        classList.put(93, "Adventurer");
+        classList.put(94, "Archmage");
+        classList.put(95, "Soultaker");
+        classList.put(96, "Arcana Lord");
+        classList.put(97, "Cardinal");
+        classList.put(98, "Hierophant");
+        classList.put(99, "Evas Templar");
+        classList.put(100, "Sword Muse");
+        classList.put(101, "Wind Rider");
+        classList.put(102, "Moonlight Sentinel");
+        classList.put(103, "Mystic Muse");
+        classList.put(104, "Elemental Master");
+        classList.put(105, "Evas Saint");
+        classList.put(106, "Shillien Templar");
+        classList.put(107, "Spectral Dancer");
+        classList.put(108, "Ghost Hunter");
+        classList.put(109, "Ghost Sentinel");
+        classList.put(110, "Storm Screamer");
+        classList.put(111, "Spectral Master");
+        classList.put(112, "Shillien Saint");
+        classList.put(113, "Titan");
+        classList.put(114, "Grand Khavatari");
+        classList.put(115, "Dominator");
+        classList.put(116, "Doomcryer");
+        classList.put(117, "Fortune Seeker");
+        classList.put(118, "Maestro");
+        classList.put(123, "Male Soldier");
+        classList.put(124, "Female Soldier");
+        classList.put(125, "Trooper");
+        classList.put(126, "Warder");
+        classList.put(127, "Berserker");
+        classList.put(128, "Male Soulbreaker");
+        classList.put(129, "Female Soulbreaker");
+        classList.put(130, "Arbalester");
+        classList.put(131, "Doombringer");
+        classList.put(132, "Male Soulhound");
+        classList.put(133, "Female Soulhound");
+        classList.put(134, "Trickster");
+        classList.put(135, "Inspector");
+        classList.put(136, "Judicator");
+        
+        return classList.get(classId);
+    }
+}
Index: java/com/l2jserver/gameserver/communitybbs/Manager/AdminBBSManager.java
===================================================================
--- java/com/l2jserver/gameserver/communitybbs/Manager/AdminBBSManager.java    (revision 5370)
+++ java/com/l2jserver/gameserver/communitybbs/Manager/AdminBBSManager.java    (working copy)
@@ -27,6 +27,14 @@
         return SingletonHolder._instance;
     }
     
+    private AdminBBSManager()
+    {
+    }
+    
+    /**
+     * 
+     * @see com.l2jserver.gameserver.communitybbs.Manager.BaseBBSManager#parsecmd(java.lang.String, com.l2jserver.gameserver.model.actor.instance.L2PcInstance)
+     */
     @Override
     public void parsecmd(String command, L2PcInstance activeChar)
     {
@@ -65,6 +73,7 @@
         
     }
     
+    @SuppressWarnings("synthetic-access")
     private static class SingletonHolder
     {
         protected static final AdminBBSManager _instance = new AdminBBSManager();
Index: java/com/l2jserver/gameserver/communitybbs/Manager/ClanBBSManager.java
===================================================================
--- java/com/l2jserver/gameserver/communitybbs/Manager/ClanBBSManager.java    (revision 5370)
+++ java/com/l2jserver/gameserver/communitybbs/Manager/ClanBBSManager.java    (working copy)
@@ -24,6 +24,10 @@
 
 public class ClanBBSManager extends BaseBBSManager
 {
+    private ClanBBSManager()
+    {
+    }
+    
     public static ClanBBSManager getInstance()
     {
         return SingletonHolder._instance;
@@ -274,6 +278,7 @@
         clanhome(activeChar, activeChar.getClan().getClanId());
     }
     
+    @SuppressWarnings("synthetic-access")
     private static class SingletonHolder
     {
         protected static final ClanBBSManager _instance = new ClanBBSManager();
Index: java/com/l2jserver/gameserver/communitybbs/Manager/ForumsBBSManager.java
===================================================================
--- java/com/l2jserver/gameserver/communitybbs/Manager/ForumsBBSManager.java    (revision 5370)
+++ java/com/l2jserver/gameserver/communitybbs/Manager/ForumsBBSManager.java    (working copy)
@@ -41,7 +41,7 @@
         return SingletonHolder._instance;
     }
     
-    protected ForumsBBSManager()
+    private ForumsBBSManager()
     {
         _table = new FastList<Forum>();
         
@@ -157,6 +157,7 @@
     {
     }
     
+    @SuppressWarnings("synthetic-access")
     private static class SingletonHolder
     {
         protected static final ForumsBBSManager _instance = new ForumsBBSManager();
Index: java/com/l2jserver/gameserver/communitybbs/Manager/PostBBSManager.java
===================================================================
--- java/com/l2jserver/gameserver/communitybbs/Manager/PostBBSManager.java    (revision 5370)
+++ java/com/l2jserver/gameserver/communitybbs/Manager/PostBBSManager.java    (working copy)
@@ -32,10 +32,16 @@
 
 public class PostBBSManager extends BaseBBSManager
 {
+    
     private Map<Topic, Post> _postByTopic;
     
-    protected PostBBSManager()
+    public static PostBBSManager getInstance()
     {
+        return SingletonHolder._instance;
+    }
+    
+    private PostBBSManager()
+    {
         _postByTopic = new FastMap<Topic, Post>();
     }
     
@@ -45,7 +51,7 @@
         post = _postByTopic.get(t);
         if (post == null)
         {
-            post = new Post(t);
+            post = load(t);
             _postByTopic.put(t, post);
         }
         return post;
@@ -67,6 +73,17 @@
         }
     }
     
+    /**
+     * @param t
+     * @return
+     */
+    private Post load(Topic t)
+    {
+        Post p;
+        p = new Post(t);
+        return p;
+    }
+    
     @Override
     public void parsecmd(String command, L2PcInstance activeChar)
     {
@@ -288,34 +305,31 @@
             }
             else
             {
-                final Post p = getGPosttByTopic(t);
+                CPost cp = null;
+                Post p = getGPosttByTopic(t);
                 if (p != null)
                 {
-                    final CPost cp = p.getCPost(idp);
-                    if (cp == null)
-                    {
-                        ShowBoard sb = new ShowBoard("<html><body><br><br><center>the post: " + idp
-                                + " does not exist !</center><br><br></body></html>", "101");
-                        activeChar.sendPacket(sb);
-                        activeChar.sendPacket(new ShowBoard(null, "102"));
-                        activeChar.sendPacket(new ShowBoard(null, "103"));
-                    }
-                    else
-                    {
-                        p.getCPost(idp).postTxt = ar4;
-                        p.updatetxt(idp);
-                        parsecmd("_bbsposts;read;" + f.getID() + ";" + t.getID(), activeChar);
-                    }
+                    cp = p.getCPost(idp);
                 }
+                if (cp == null)
+                {
+                    ShowBoard sb = new ShowBoard("<html><body><br><br><center>the post: " + idp
+                            + " does not exist !</center><br><br></body></html>", "101");
+                    activeChar.sendPacket(sb);
+                    activeChar.sendPacket(new ShowBoard(null, "102"));
+                    activeChar.sendPacket(new ShowBoard(null, "103"));
+                }
+                else
+                {
+                    p.getCPost(idp).postTxt = ar4;
+                    p.updatetxt(idp);
+                    parsecmd("_bbsposts;read;" + f.getID() + ";" + t.getID(), activeChar);
+                }
             }
         }
     }
     
-    public static PostBBSManager getInstance()
-    {
-        return SingletonHolder._instance;
-    }
-    
+    @SuppressWarnings("synthetic-access")
     private static class SingletonHolder
     {
         protected static final PostBBSManager _instance = new PostBBSManager();
Index: java/com/l2jserver/gameserver/communitybbs/Manager/RegionBBSManager.java
===================================================================
--- java/com/l2jserver/gameserver/communitybbs/Manager/RegionBBSManager.java    (revision 5370)
+++ java/com/l2jserver/gameserver/communitybbs/Manager/RegionBBSManager.java    (working copy)
@@ -54,6 +54,10 @@
         }
     };
     
+    private RegionBBSManager()
+    {
+    }
+    
     @Override
     public void parsecmd(String command, L2PcInstance activeChar)
     {
@@ -564,6 +568,7 @@
         return null;
     }
     
+    @SuppressWarnings("synthetic-access")
     private static class SingletonHolder
     {
         protected static final RegionBBSManager _instance = new RegionBBSManager();
Index: java/com/l2jserver/gameserver/communitybbs/Manager/TopBBSManager.java
===================================================================
--- java/com/l2jserver/gameserver/communitybbs/Manager/TopBBSManager.java    (revision 5370)
+++ java/com/l2jserver/gameserver/communitybbs/Manager/TopBBSManager.java    (working copy)
@@ -1,66 +1,128 @@
-/*
- * 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.communitybbs.Manager;
 
+import java.io.File;
 import java.util.StringTokenizer;
 
+import com.l2jserver.Config;
+import com.l2jserver.gameserver.GameTimeController;
 import com.l2jserver.gameserver.cache.HtmCache;
+import com.l2jserver.gameserver.communitybbs.CastleStatus;
+import com.l2jserver.gameserver.communitybbs.ClanList;
+import com.l2jserver.gameserver.communitybbs.GrandBossList;
+import com.l2jserver.gameserver.communitybbs.HeroeList;
+import com.l2jserver.gameserver.communitybbs.RaidList;
+import com.l2jserver.gameserver.communitybbs.TopPlayers;
+import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.network.serverpackets.ShowBoard;
 
-
 public class TopBBSManager extends BaseBBSManager
 {
+    
+    private TopBBSManager()
+    {
+    }
+    
     @Override
     public void parsecmd(String command, L2PcInstance activeChar)
     {
-        if (command.equals("_bbstop"))
+        String path = "data/html/CommunityBoard/";
+        String filepath = "";
+        String content = "";
+        
+        if (command.equals("_bbstop") | command.equals("_bbshome"))
         {
-            String content = HtmCache.getInstance().getHtm(activeChar.getHtmlPrefix(), "data/html/CommunityBoard/index.htm");
-            if (content == null)
-            {
-                content = "<html><body><br><br><center>404 :File not found: 'data/html/CommunityBoard/index.htm' </center></body></html>";
-            }
+            filepath = path + "index.htm";
+            content = HtmCache.getInstance().getHtm(activeChar.getHtmlPrefix(), filepath);
             separateAndSend(content, activeChar);
         }
-        else if (command.equals("_bbshome"))
-        {
-            String content = HtmCache.getInstance().getHtm(activeChar.getHtmlPrefix(), "data/html/CommunityBoard/index.htm");
-            if (content == null)
-            {
-                content = "<html><body><br><br><center>404 :File not found: 'data/html/CommunityBoard/index.htm' </center></body></html>";
-            }
-            separateAndSend(content, activeChar);
-        }
         else if (command.startsWith("_bbstop;"))
         {
             StringTokenizer st = new StringTokenizer(command, ";");
             st.nextToken();
-            int idp = Integer.parseInt(st.nextToken());
-            String content = HtmCache.getInstance().getHtm(activeChar.getHtmlPrefix(), "data/html/CommunityBoard/" + idp + ".htm");
-            if (content == null)
+            String file = st.nextToken();
+            filepath = path + file + ".htm";
+            File filecom = new File(filepath);
+            
+            if (!(filecom.exists()))
             {
-                content = "<html><body><br><br><center>404 :File not found: 'data/html/CommunityBoard/" + idp
-                + ".htm' </center></body></html>";
+                content = "<html><body><br><br><center>The command " + command + " points to file(" + filepath + ") that NOT exists.</center></body></html>";
+                separateAndSend(content, activeChar);
+                return;
             }
+            content = HtmCache.getInstance().getHtm(activeChar.getHtmlPrefix(), filepath);
+            
+            if (content.isEmpty())
+                content = "<html><body><br><br><center>Content Empty: The command " + command + " points to an invalid or empty html file(" + filepath + ").</center></body></html>";
+            
+            switch (file)
+            {
+                case "toppvp":
+                    TopPlayers pvp = new TopPlayers(file);
+                    content = content.replaceAll("%toppvp%", pvp.loadTopList());
+                    break;
+                case "toppk":
+                    TopPlayers pk = new TopPlayers(file);
+                    content = content.replaceAll("%toppk%", pk.loadTopList());
+                    break;
+                case "toprbrank":
+                    TopPlayers raid = new TopPlayers(file);
+                    content = content.replaceAll("%toprbrank%", raid.loadTopList());
+                    break;
+                case "topadena":
+                    TopPlayers adena = new TopPlayers(file);
+                    content = content.replaceAll("%topadena%", adena.loadTopList());
+                    break;
+                case "toponline":
+                    TopPlayers online = new TopPlayers(file);
+                    content = content.replaceAll("%toponline%", online.loadTopList());
+                    break;
+                case "heroes":
+                    HeroeList hr = new HeroeList();
+                    content = content.replaceAll("%heroelist%", hr.loadHeroeList());
+                    break;
+                case "castle":
+                    CastleStatus status = new CastleStatus();
+                    content = content.replaceAll("%castle%", status.loadCastleList());
+                    break;
+                case "boss":
+                    GrandBossList gb = new GrandBossList();
+                    content = content.replaceAll("%gboss%", gb.loadGrandBossList());
+                    break;
+                case "stats":
+                    content = content.replace("%online%", Integer.toString(L2World.getInstance().getAllPlayersCount()));
+                    content = content.replace("%servercapacity%", Integer.toString(Config.MAXIMUM_ONLINE_USERS));
+                    content = content.replace("%serverruntime%", getServerRunTime());
+                    if (Config.ALLOW_REAL_ONLINE_STATS)
+                        content = content.replace("%serveronline%", getRealOnline());
+                    else
+                        content = content.replace("%serveronline%", "");
+                    break;
+                default:
+                    break;
+            
+            }
+            if (file.startsWith("clan"))
+            {
+                int cid = Integer.parseInt(file.substring(4));
+                ClanList cl = new ClanList(cid);
+                content = content.replaceAll("%clanlist%", cl.loadClanList());
+            }
+            if (file.startsWith("raid"))
+            {
+                String rfid = file.substring(4);
+                RaidList rd = new RaidList(rfid);
+                content = content.replaceAll("%raidlist%", rd.loadRaidList());
+            }
+            if (content.isEmpty())
+            {
+                content = "<html><body><br><br><center>404 :File not found or empty: " + filepath + " your command is " + command + "</center></body></html>";
+            }
             separateAndSend(content, activeChar);
         }
         else
         {
-            ShowBoard sb = new ShowBoard("<html><body><br><br><center>the command: " + command
-                    + " is not implemented yet</center><br><br></body></html>", "101");
+            ShowBoard sb = new ShowBoard("<html><body><br><br><center>the command: " + command + " is not implemented yet</center><br><br></body></html>", "101");
             activeChar.sendPacket(sb);
             activeChar.sendPacket(new ShowBoard(null, "102"));
             activeChar.sendPacket(new ShowBoard(null, "103"));
@@ -77,8 +139,34 @@
         return SingletonHolder._instance;
     }
     
+    @SuppressWarnings("synthetic-access")
     private static class SingletonHolder
     {
         protected static final TopBBSManager _instance = new TopBBSManager();
     }
+    
+    public String getServerRunTime()
+    {
+        int timeSeconds = (GameTimeController.getGameTicks() - 36000) / 10;
+        String timeResult = "";
+        if (timeSeconds >= 86400)
+            timeResult = Integer.toString(timeSeconds / 86400) + " Days " + Integer.toString((timeSeconds % 86400) / 3600) + " hours";
+        else
+            timeResult = Integer.toString(timeSeconds / 3600) + " Hours " + Integer.toString((timeSeconds % 3600) / 60) + " mins";
+        return timeResult;
+    }
+    
+    public String getRealOnline()
+    {
+        int counter = 0;
+        for (L2PcInstance onlinePlayer : L2World.getInstance().getAllPlayersArray())
+        {
+            if (onlinePlayer.isOnline() && (onlinePlayer.getClient() != null && !onlinePlayer.getClient().isDetached()))
+            {
+                counter++;
+            }
+        }
+        String realOnline = "<tr><td fixwidth=11></td><td FIXWIDTH=280>Players Active</td><td FIXWIDTH=470><font color=26e600>" + counter + "</font></td></tr>" + "<tr><td fixwidth=11></td><td FIXWIDTH=280>Players Shops</td><td FIXWIDTH=470><font color=26e600>" + (L2World.getInstance().getAllPlayersCount() - counter) + "</font></td></tr>";
+        return realOnline;
+    }
 }
\ No newline at end of file
Index: java/com/l2jserver/gameserver/communitybbs/Manager/TopicBBSManager.java
===================================================================
--- java/com/l2jserver/gameserver/communitybbs/Manager/TopicBBSManager.java    (revision 5370)
+++ java/com/l2jserver/gameserver/communitybbs/Manager/TopicBBSManager.java    (working copy)
@@ -42,7 +42,7 @@
         return SingletonHolder._instance;
     }
     
-    protected TopicBBSManager()
+    private TopicBBSManager()
     {
         _table = new FastList<Topic>();
         _maxId = new FastMap<Forum, Integer>().shared();
@@ -442,6 +442,7 @@
         separateAndSend(html.toString(), activeChar);
     }
     
+    @SuppressWarnings("synthetic-access")
     private static class SingletonHolder
     {
         protected static final TopicBBSManager _instance = new TopicBBSManager();
Index: java/com/l2jserver/gameserver/communitybbs/RaidList.java
===================================================================
--- java/com/l2jserver/gameserver/communitybbs/RaidList.java    (revision 0)
+++ java/com/l2jserver/gameserver/communitybbs/RaidList.java    (working copy)
@@ -0,0 +1,101 @@
+package com.l2jserver.gameserver.communitybbs;
+
+import com.l2jserver.Config;
+import com.l2jserver.L2DatabaseFactory;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import javolution.text.TextBuilder;
+
+public class RaidList
+{
+    private TextBuilder _raidList = new TextBuilder();
+    
+    public RaidList(String rfid)
+    {
+        loadFromDB(rfid);
+    }
+    
+    private void loadFromDB(String rfid)
+    {
+        int type = Integer.parseInt(rfid);
+        Connection con = null;
+        int stpoint = 0;
+        int pos = 0;
+        String sort = "";
+        if (Config.RAID_LIST_SORT_ASC)
+            sort = "ASC";
+        else
+            sort = "DESC";
+        for (int count = 1; count != type; count++)
+        {
+            stpoint += Config.RAID_LIST_RESULTS;
+        }
+        
+        
+        try
+        {
+            con = L2DatabaseFactory.getInstance().getConnection();
+            PreparedStatement statement = con.prepareStatement("SELECT id, name, level FROM npc WHERE type='L2RaidBoss' AND EXISTS (SELECT * FROM raidboss_spawnlist WHERE raidboss_spawnlist.boss_id = npc.id) ORDER BY `level` " + sort + " Limit " + stpoint + ", " + Config.RAID_LIST_RESULTS);
+            ResultSet result = statement.executeQuery();
+            pos = stpoint;
+            
+            while (result.next())
+            {
+                int npcid = result.getInt("id");
+                String npcname = result.getString("name");
+                int rlevel = result.getInt("level");
+                PreparedStatement statement2 = con.prepareStatement("SELECT respawn_time, respawn_min_delay, respawn_max_delay FROM raidboss_spawnlist WHERE boss_id=" + npcid);
+                ResultSet result2 = statement2.executeQuery();
+                
+                while (result2.next())
+                {
+                    pos++;
+                    boolean rstatus = false;
+                    long respawn = result2.getLong("respawn_time");
+                    if (respawn == 0)
+                        rstatus = true;
+                    int mindelay = result2.getInt("respawn_min_delay");
+                    int maxdelay = result2.getInt("respawn_max_delay");
+                    mindelay = mindelay / 60 / 60;
+                    maxdelay = maxdelay / 60 / 60;
+                    addRaidToList(pos, npcname, rlevel, mindelay, maxdelay, rstatus);
+                }
+                result2.close();
+                statement2.close();
+            }
+            
+            result.close();
+            statement.close();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        finally
+        {
+            L2DatabaseFactory.close(con);
+        }
+    }
+    
+    private void addRaidToList(int pos, String npcname, int rlevel, int mindelay, int maxdelay, boolean rstatus)
+    {
+        _raidList.append("<table border=0 cellspacing=0 cellpadding=2 width=750 height="+Config.RAID_LIST_ROW_HEIGHT+">");
+        _raidList.append("<tr>");
+        _raidList.append("<td FIXWIDTH=5></td>");
+        _raidList.append("<td FIXWIDTH=20>" + pos + "</td>");
+        _raidList.append("<td FIXWIDTH=270>" + npcname + "</td>");
+        _raidList.append("<td FIXWIDTH=50>" + rlevel + "</td>");
+        _raidList.append("<td FIXWIDTH=120 align=center>" + mindelay + " - " + maxdelay + "</td>");
+        _raidList.append("<td FIXWIDTH=50 align=center>" + ((rstatus) ? "<font color=99FF00>Alive</font>" : "<font color=CC0000>Dead</font>") + "</td>");
+        _raidList.append("<td FIXWIDTH=5></td>");
+        _raidList.append("</tr>");
+        _raidList.append("</table>");
+        _raidList.append("<img src=\"L2UI.Squaregray\" width=\"740\" height=\"1\">");
+    }
+    
+    public String loadRaidList()
+    {
+        return _raidList.toString();
+    }
+}
Index: java/com/l2jserver/gameserver/communitybbs/TopPlayers.java
===================================================================
--- java/com/l2jserver/gameserver/communitybbs/TopPlayers.java    (revision 0)
+++ java/com/l2jserver/gameserver/communitybbs/TopPlayers.java    (working copy)
@@ -0,0 +1,243 @@
+package com.l2jserver.gameserver.communitybbs;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.util.Map;
+
+import javolution.text.TextBuilder;
+import javolution.util.FastMap;
+
+import com.l2jserver.Config;
+import com.l2jserver.L2DatabaseFactory;
+
+public class TopPlayers
+{
+    private int pos;
+    private TextBuilder _topList = new TextBuilder();
+    String sort = "";
+    
+    public TopPlayers(String file)
+    {
+        loadDB(file);
+    }
+    
+    @SuppressWarnings("null")
+    private void loadDB(String file)
+    {
+        Connection con = null;
+        
+        switch (file)
+        {
+            case "toppvp":
+                sort = "pvpkills";
+                break;
+            case "toppk":
+                sort = "pkkills";
+                break;
+            case "topadena":
+                sort = "SUM(it.count)";
+                break;
+            case "toprbrank":
+                sort = "SUM(chr.points)";
+                break;
+            case "toponline":
+                sort = "onlinetime";
+                break;
+            default:
+                break;
+        
+        }
+        
+        try
+        {
+            pos = 0;
+            con = L2DatabaseFactory.getInstance().getConnection();
+            PreparedStatement statement = con.prepareStatement("SELECT SUM(chr.points), SUM(it.count), ch.char_name, ch.pkkills, ch.pvpkills, ch.onlinetime, ch.base_class, ch.online FROM characters ch LEFT JOIN character_raid_points chr ON ch.charId=chr.charId LEFT OUTER JOIN items it ON ch.charId=it.owner_id WHERE item_id=57 GROUP BY ch.charId ORDER BY " + sort + " DESC LIMIT " + Config.TOP_PLAYER_RESULTS);
+            
+            ResultSet result = statement.executeQuery();
+            
+            while (result.next())
+            {
+                boolean status = false;
+                pos++;
+                
+                if (result.getInt("online") == 1)
+                    status = true;
+                String timeon = getPlayerRunTime(result.getInt("ch.onlinetime"));
+                String adenas = getAdenas(result.getInt("SUM(it.count)"));
+                
+                addChar(pos, result.getString("ch.char_name"), result.getInt("base_class"), result.getInt("ch.pvpkills"), result.getInt("ch.pkkills"), result.getInt("SUM(chr.points)"), adenas, timeon, status);
+            }
+            
+            result.close();
+            statement.close();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        finally
+        {
+            try
+            {
+                con.close();
+            }
+            catch (Exception e)
+            {
+                
+            }
+        }
+    }
+    
+    public String loadTopList()
+    {
+        return _topList.toString();
+    }
+    
+    private void addChar(int position, String name, int classid, int pvp, int pk, int raid, String adenas, String online, boolean isOnline)
+    {
+        _topList.append("<table border=0 cellspacing=0 cellpadding=2 bgcolor=050505 height=" + Config.TOP_PLAYER_ROW_HEIGHT + "><tr><td FIXWIDTH=5></td>");
+        _topList.append("<td FIXWIDTH=20>" + position + ".</td>");
+        _topList.append("<td FIXWIDTH=180>" + name + "</td>");
+        _topList.append("<td FIXWIDTH=175>" + className(classid) + "</td>");
+        _topList.append("<td FIXWIDTH=60>" + pvp + "</td>");
+        _topList.append("<td FIXWIDTH=60>" + pk + "</td>");
+        _topList.append("<td FIXWIDTH=65>" + raid + "</td>");
+        _topList.append("<td FIXWIDTH=150>" + adenas + "</td>");
+        _topList.append("<td FIXWIDTH=148>" + online + "</td>");
+        _topList.append("<td FIXWIDTH=65>" + ((isOnline) ? "<font color=99FF00>Online</font>" : "<font color=CC0000>Offline</font>") + "</td>");
+        _topList.append("</tr></table><img src=\"L2UI.Squaregray\" width=\"758\" height=\"1\">");
+        
+    }
+    
+    public final static String className(int classid)
+    {
+        Map<Integer, String> classList;
+        classList = new FastMap<Integer, String>();
+        classList.put(0, "Fighter");
+        classList.put(1, "Warrior");
+        classList.put(2, "Gladiator");
+        classList.put(3, "Warlord");
+        classList.put(4, "Knight");
+        classList.put(5, "Paladin");
+        classList.put(6, "Dark Avenger");
+        classList.put(7, "Rogue");
+        classList.put(8, "Treasure Hunter");
+        classList.put(9, "Hawkeye");
+        classList.put(10, "Mage");
+        classList.put(11, "Wizard");
+        classList.put(12, "Sorcerer");
+        classList.put(13, "Necromancer");
+        classList.put(14, "Warlock");
+        classList.put(15, "Cleric");
+        classList.put(16, "Bishop");
+        classList.put(17, "Prophet");
+        classList.put(18, "Elven Fighter");
+        classList.put(19, "Elven Knight");
+        classList.put(20, "Temple Knight");
+        classList.put(21, "Swordsinger");
+        classList.put(22, "Elven Scout");
+        classList.put(23, "Plains Walker");
+        classList.put(24, "Silver Ranger");
+        classList.put(25, "Elven Mage");
+        classList.put(26, "Elven Wizard");
+        classList.put(27, "Spellsinger");
+        classList.put(28, "Elemental Summoner");
+        classList.put(29, "Oracle");
+        classList.put(30, "Elder");
+        classList.put(31, "Dark Fighter");
+        classList.put(32, "Palus Knightr");
+        classList.put(33, "Shillien Knight");
+        classList.put(34, "Bladedancer");
+        classList.put(35, "Assasin");
+        classList.put(36, "Abyss Walker");
+        classList.put(37, "Phantom Ranger");
+        classList.put(38, "Dark Mage");
+        classList.put(39, "Dark Wizard");
+        classList.put(40, "Spellhowler");
+        classList.put(41, "Phantom Summoner");
+        classList.put(42, "Shillien Oracle");
+        classList.put(43, "Shilien Elder");
+        classList.put(44, "Orc Fighter");
+        classList.put(45, "Orc Raider");
+        classList.put(46, "Destroyer");
+        classList.put(47, "Orc Monk");
+        classList.put(48, "Tyrant");
+        classList.put(49, "Orc Mage");
+        classList.put(50, "Orc Shaman");
+        classList.put(51, "Overlord");
+        classList.put(52, "Warcryer");
+        classList.put(53, "Dwarven Fighter");
+        classList.put(54, "Scavenger");
+        classList.put(55, "Bounty Hunter");
+        classList.put(56, "Artisan");
+        classList.put(57, "Warsmith");
+        classList.put(88, "Duelist");
+        classList.put(89, "Dreadnought");
+        classList.put(90, "Phoenix Knight");
+        classList.put(91, "Hell Knight");
+        classList.put(92, "Sagittarius");
+        classList.put(93, "Adventurer");
+        classList.put(94, "Archmage");
+        classList.put(95, "Soultaker");
+        classList.put(96, "Arcana Lord");
+        classList.put(97, "Cardinal");
+        classList.put(98, "Hierophant");
+        classList.put(99, "Evas Templar");
+        classList.put(100, "Sword Muse");
+        classList.put(101, "Wind Rider");
+        classList.put(102, "Moonlight Sentinel");
+        classList.put(103, "Mystic Muse");
+        classList.put(104, "Elemental Master");
+        classList.put(105, "Evas Saint");
+        classList.put(106, "Shillien Templar");
+        classList.put(107, "Spectral Dancer");
+        classList.put(108, "Ghost Hunter");
+        classList.put(109, "Ghost Sentinel");
+        classList.put(110, "Storm Screamer");
+        classList.put(111, "Spectral Master");
+        classList.put(112, "Shillien Saint");
+        classList.put(113, "Titan");
+        classList.put(114, "Grand Khavatari");
+        classList.put(115, "Dominator");
+        classList.put(116, "Doomcryer");
+        classList.put(117, "Fortune Seeker");
+        classList.put(118, "Maestro");
+        classList.put(123, "Male Soldier");
+        classList.put(124, "Female Soldier");
+        classList.put(125, "Trooper");
+        classList.put(126, "Warder");
+        classList.put(127, "Berserker");
+        classList.put(128, "Male Soulbreaker");
+        classList.put(129, "Female Soulbreaker");
+        classList.put(130, "Arbalester");
+        classList.put(131, "Doombringer");
+        classList.put(132, "Male Soulhound");
+        classList.put(133, "Female Soulhound");
+        classList.put(134, "Trickster");
+        classList.put(135, "Inspector");
+        classList.put(136, "Judicator");
+        
+        return classList.get(classid);
+    }
+    
+    public String getPlayerRunTime(int secs)
+    {
+        String timeResult = "";
+        if (secs >= 86400)
+            timeResult = Integer.toString(secs / 86400) + " Days " + Integer.toString((secs % 86400) / 3600) + " hours";
+        else
+            timeResult = Integer.toString(secs / 3600) + " Hours " + Integer.toString((secs % 3600) / 60) + " mins";
+        return timeResult;
+    }
+    public String getAdenas(int adena)
+    {
+        String adenas = "";
+        if (adena >= 1000000000)
+            adenas = Integer.toString(adena / 1000000000) + " Billion " + Integer.toString((adena % 1000000000) / 1000000) + " million";
+        else
+            adenas = Integer.toString(adena / 1000000) + " Million " + Integer.toString((adena % 1000000) / 1000) + " k";
+        return adenas;
+    }
+}