Reanimation06

L2jAcis Interlude Community Board

Dec 2nd, 2025
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 41.04 KB | Gaming | 0 0
  1. Index: java/net/sf/l2j/gameserver/GameServer.java
  2. ===================================================================
  3. --- java/net/sf/l2j/gameserver/GameServer.java  (revision 5)
  4. +++ java/net/sf/l2j/gameserver/GameServer.java  (working copy)
  5. @@ -15,6 +15,7 @@
  6.  
  7.  import net.sf.l2j.Config;
  8.  import net.sf.l2j.L2DatabaseFactory;
  9. +import net.sf.l2j.gameserver.communitybbs.BB.Ranking;
  10.  import net.sf.l2j.gameserver.communitybbs.Manager.ForumsBBSManager;
  11.  import net.sf.l2j.gameserver.data.ItemTable;
  12.  import net.sf.l2j.gameserver.data.SkillTable;
  13. @@ -189,7 +190,10 @@
  14.        
  15.         StringUtil.printSection("Community server");
  16.         if (Config.ENABLE_COMMUNITY_BOARD) // Forums has to be loaded before clan data
  17. +       {
  18.             ForumsBBSManager.getInstance().initRoot();
  19. +           Ranking.getInstance();
  20. +       }
  21.         else
  22.             LOGGER.info("Community server is disabled.");
  23.        
  24. Index: java/net/sf/l2j/gameserver/communitybbs/BB/Ranking.java
  25. ===================================================================
  26. --- java/net/sf/l2j/gameserver/communitybbs/BB/Ranking.java (revision 0)
  27. +++ java/net/sf/l2j/gameserver/communitybbs/BB/Ranking.java (revision 0)
  28. @@ -0,0 +1,249 @@
  29. +package net.sf.l2j.gameserver.communitybbs.BB;
  30. +
  31. +import java.sql.Connection;
  32. +import java.sql.PreparedStatement;
  33. +import java.sql.ResultSet;
  34. +import java.util.Comparator;
  35. +import java.util.HashMap;
  36. +import java.util.List;
  37. +import java.util.Map;
  38. +import java.util.stream.Collectors;
  39. +
  40. +import net.sf.l2j.commons.concurrent.ThreadPool;
  41. +import net.sf.l2j.commons.lang.StringUtil;
  42. +
  43. +import net.sf.l2j.L2DatabaseFactory;
  44. +import net.sf.l2j.gameserver.model.World;
  45. +import net.sf.l2j.gameserver.model.actor.instance.Player;
  46. +import net.sf.l2j.gameserver.model.base.ClassId;
  47. +
  48. +public class Ranking
  49. +{
  50. +   public static final int PERIOD = 1 * 60 * 1000; // 1 minutes
  51. +  
  52. +   Map<String, RankingHolder> pvp = new HashMap<>();
  53. +   Map<String, RankingHolder> pk = new HashMap<>();
  54. +  
  55. +   public Ranking()
  56. +   {
  57. +       ThreadPool.scheduleAtFixedRate(() -> generate(), 0, PERIOD);
  58. +   }
  59. +  
  60. +   public void generate()
  61. +   {
  62. +       pvpList();
  63. +       pkList();
  64. +   }
  65. +  
  66. +   private void pvpList()
  67. +   {
  68. +       try (Connection con = L2DatabaseFactory.getInstance().getConnection())
  69. +       {
  70. +           PreparedStatement ps = con.prepareStatement("SELECT char_name, base_class, pvpkills, level, online, onlinetime FROM characters WHERE pvpkills>0 AND accesslevel=0 ORDER BY pvpkills DESC LIMIT 18");
  71. +           ResultSet rs = ps.executeQuery();
  72. +          
  73. +           pvp.clear();
  74. +           while (rs.next())
  75. +           {
  76. +               RankingHolder rh = new RankingHolder();
  77. +               rh.name = rs.getString("char_name");
  78. +               rh.className = classId(rs.getInt("base_class"));
  79. +               rh.level = rs.getInt("level");
  80. +               rh.pvpKills = rs.getInt("pvpkills");
  81. +               rh.onlineTime = onlineTime(rs.getInt("onlinetime"));
  82. +              
  83. +               pvp.put(rh.name, rh);
  84. +           }
  85. +          
  86. +           rs.close();
  87. +           ps.close();
  88. +       }
  89. +       catch (Exception e)
  90. +       {
  91. +           e.printStackTrace();
  92. +       }
  93. +   }
  94. +
  95. +   private void pkList()
  96. +   {
  97. +       try (Connection con = L2DatabaseFactory.getInstance().getConnection())
  98. +       {
  99. +           PreparedStatement ps = con.prepareStatement("SELECT char_name, base_class, pkkills, level, online, onlinetime FROM characters WHERE pkkills>0 AND accesslevel=0 ORDER BY pkkills DESC LIMIT 18");
  100. +           ResultSet rs = ps.executeQuery();
  101. +          
  102. +           pk.clear();
  103. +          
  104. +           while (rs.next())
  105. +           {
  106. +               RankingHolder rh = new RankingHolder();
  107. +               rh.name = rs.getString("char_name");
  108. +               rh.className = classId(rs.getInt("base_class"));
  109. +               rh.level = rs.getInt("level");
  110. +               rh.pkKills = rs.getInt("pkkills");
  111. +               rh.onlineTime = onlineTime(rs.getInt("onlinetime"));
  112. +              
  113. +               pk.put(rh.name, rh);
  114. +           }
  115. +          
  116. +           rs.close();
  117. +           ps.close();
  118. +       }
  119. +       catch (Exception e)
  120. +       {
  121. +           e.printStackTrace();
  122. +       }
  123. +   }
  124. +  
  125. +   public String getPvp()
  126. +   {
  127. +       pvp.forEach((k,v) ->
  128. +       {
  129. +           Player p = World.getInstance().getPlayer(v.name);
  130. +          
  131. +           if (p!= null)
  132. +           {
  133. +               v.className = p.getClassId().toString();
  134. +               v.pvpKills = p.getPvpKills();
  135. +               v.level = p.getLevel();
  136. +           }
  137. +       });
  138. +      
  139. +       List<RankingHolder> ranking = pvp.values().stream().sorted(new Comparator<RankingHolder>()
  140. +       {
  141. +           @Override
  142. +           public int compare(RankingHolder o1, RankingHolder o2)
  143. +           {
  144. +               return o2.pvpKills.compareTo(o1.pvpKills);
  145. +           }
  146. +
  147. +        }).limit(18).collect(Collectors.toList());
  148. +      
  149. +      
  150. +       final StringBuilder sb = new StringBuilder(2000);
  151. +      
  152. +       int pos = 1;
  153. +       for (RankingHolder rh : ranking)
  154. +       {
  155. +           StringUtil.append(sb, "<table border=0 cellspacing=0 cellpadding=2 height=19 width=610><tr><td FIXWIDTH=5></td>");
  156. +           StringUtil.append(sb, "<td FIXWIDTH=20>" + pos + "</td>");
  157. +           StringUtil.append(sb, "<td FIXWIDTH=160>" + rh.name+ "</td>");
  158. +           StringUtil.append(sb, "<td FIXWIDTH=165>" + rh.className + "</td>");
  159. +           StringUtil.append(sb, "<td FIXWIDTH=80>" + rh.pvpKills + "</td>");
  160. +           StringUtil.append(sb, "<td FIXWIDTH=70>" + rh.level + "</td>");
  161. +           StringUtil.append(sb, "<td FIXWIDTH=150>" + rh.onlineTime +"</td>");
  162. +           StringUtil.append(sb, "<td FIXWIDTH=65>" + (World.getInstance().getPlayer(rh.name) != null ? "<font color=99FF00>Online</font>" : "<font color=CC0000>Offline</font>") +  "</td>");
  163. +           StringUtil.append(sb, "</tr></table>");
  164. +           pos++;
  165. +       }
  166. +
  167. +       return sb.toString();
  168. +   }  
  169. +  
  170. +   public String getPk()
  171. +   {
  172. +       pk.forEach((k,v) ->
  173. +       {
  174. +           Player p = World.getInstance().getPlayer(v.name);
  175. +          
  176. +           if (p!= null)
  177. +           {
  178. +               v.className = p.getClassId().toString();
  179. +               v.pkKills = p.getPkKills();
  180. +               v.level = p.getLevel();
  181. +           }
  182. +       });
  183. +      
  184. +       List<RankingHolder> ranking = pk.values().stream().sorted(new Comparator<RankingHolder>()
  185. +       {
  186. +           @Override
  187. +           public int compare(RankingHolder o1, RankingHolder o2)
  188. +           {
  189. +               return o2.pkKills.compareTo(o1.pkKills);
  190. +           }
  191. +
  192. +        }).limit(18).collect(Collectors.toList());
  193. +      
  194. +      
  195. +       final StringBuilder sb = new StringBuilder(2000);
  196. +      
  197. +       int pos = 1;
  198. +       for (RankingHolder rh : ranking)
  199. +       {
  200. +           StringUtil.append(sb, "<table border=0 cellspacing=0 cellpadding=2 height=19 width=610><tr><td FIXWIDTH=5></td>");
  201. +           StringUtil.append(sb, "<td FIXWIDTH=20>" + pos + "</td>");
  202. +           StringUtil.append(sb, "<td FIXWIDTH=160>" + rh.name+ "</td>");
  203. +           StringUtil.append(sb, "<td FIXWIDTH=165>" + rh.className + "</td>");
  204. +           StringUtil.append(sb, "<td FIXWIDTH=80>" + rh.pkKills + "</td>");
  205. +           StringUtil.append(sb, "<td FIXWIDTH=70>" + rh.level + "</td>");
  206. +           StringUtil.append(sb, "<td FIXWIDTH=150>" + rh.onlineTime +"</td>");
  207. +           StringUtil.append(sb, "<td FIXWIDTH=65>" + (World.getInstance().getPlayer(rh.name) != null ? "<font color=99FF00>Online</font>" : "<font color=CC0000>Offline</font>") +  "</td>");
  208. +           StringUtil.append(sb, "</tr></table>");
  209. +           pos++;
  210. +       }
  211. +
  212. +       return sb.toString();
  213. +   }
  214. +
  215. +   private static class RankingHolder
  216. +   {
  217. +       String name;
  218. +       String className;
  219. +       Integer pvpKills;
  220. +       Integer pkKills;
  221. +       int level;
  222. +       String onlineTime;
  223. +      
  224. +       public RankingHolder()
  225. +       {
  226. +           // Nothing.
  227. +       }
  228. +   }
  229. +  
  230. +   public String classId(int ordinal)
  231. +   {
  232. +       return ClassId.VALUES[ordinal].toString();
  233. +   }
  234. +
  235. +   public String onlineTime(long seconds)
  236. +   {
  237. +       long remainingTime = seconds;
  238. +      
  239. +       final int days = (int) remainingTime / (24 * 3600);
  240. +       remainingTime = remainingTime -(days * 3600 * 24);
  241. +      
  242. +       final int hours = (int) (remainingTime / 3600);
  243. +       remainingTime = remainingTime -(hours * 3600);
  244. +      
  245. +       final int minutes = (int) ((remainingTime % 3600) / 60);
  246. +       remainingTime = remainingTime -(minutes * 60);
  247. +      
  248. +       seconds = remainingTime;
  249. +       String info = "";
  250. +      
  251. +       if (days > 0)
  252. +           info = days + " Days";
  253. +       else if (hours > 0)
  254. +           info = hours + " Hours";
  255. +       else if (minutes > 0)
  256. +           info = minutes + " Minutes";
  257. +       else if (info=="")
  258. +       {  
  259. +           if (seconds > 0)
  260. +               info = seconds + " Seconds";
  261. +           else
  262. +               info = "N/A";
  263. +       }
  264. +      
  265. +       return info;
  266. +   }  
  267. +  
  268. +   public static Ranking getInstance()
  269. +   {
  270. +       return SingletonHolder._instance;
  271. +   }  
  272. +  
  273. +   private static class SingletonHolder
  274. +   {
  275. +       protected static final Ranking _instance = new Ranking();
  276. +   }
  277. +}
  278. \ No newline at end of file
  279. Index: java/net/sf/l2j/gameserver/communitybbs/CommunityBoard.java
  280. ===================================================================
  281. --- java/net/sf/l2j/gameserver/communitybbs/CommunityBoard.java (revision 4)
  282. +++ java/net/sf/l2j/gameserver/communitybbs/CommunityBoard.java (working copy)
  283. @@ -5,8 +5,12 @@
  284.  import net.sf.l2j.gameserver.communitybbs.Manager.ClanBBSManager;
  285.  import net.sf.l2j.gameserver.communitybbs.Manager.FriendsBBSManager;
  286.  import net.sf.l2j.gameserver.communitybbs.Manager.MailBBSManager;
  287. +import net.sf.l2j.gameserver.communitybbs.Manager.PasswordBBSManager;
  288.  import net.sf.l2j.gameserver.communitybbs.Manager.PostBBSManager;
  289. +import net.sf.l2j.gameserver.communitybbs.Manager.RankingBBSManager;
  290.  import net.sf.l2j.gameserver.communitybbs.Manager.RegionBBSManager;
  291. +import net.sf.l2j.gameserver.communitybbs.Manager.RepairBBSManager;
  292. +import net.sf.l2j.gameserver.communitybbs.Manager.ReportBBSManager;
  293.  import net.sf.l2j.gameserver.communitybbs.Manager.TopBBSManager;
  294.  import net.sf.l2j.gameserver.communitybbs.Manager.TopicBBSManager;
  295.  import net.sf.l2j.gameserver.model.actor.instance.Player;
  296. @@ -52,6 +56,14 @@
  297.             TopicBBSManager.getInstance().parseCmd(command, activeChar);
  298.         else if (command.startsWith("_bbsposts"))
  299.             PostBBSManager.getInstance().parseCmd(command, activeChar);
  300. +       else if (command.startsWith("_bbspassword"))
  301. +           PasswordBBSManager.getInstance().parseCmd(command, activeChar);    
  302. +       else if (command.startsWith("_bbsranking"))
  303. +           RankingBBSManager.getInstance().parseCmd(command, activeChar);
  304. +       else if (command.startsWith("_bbsrepair"))
  305. +           RepairBBSManager.getInstance().parseCmd(command, activeChar);  
  306. +       else if (command.startsWith("_bbsreport"))
  307. +           ReportBBSManager.getInstance().parseCmd(command, activeChar);      
  308.         else
  309.             BaseBBSManager.separateAndSend("<html><body><br><br><center>The command: " + command + " isn't implemented.</center></body></html>", activeChar);
  310.     }
  311. Index: java/net/sf/l2j/gameserver/communitybbs/Manager/PasswordBBSManager.java
  312. ===================================================================
  313. --- java/net/sf/l2j/gameserver/communitybbs/Manager/PasswordBBSManager.java (revision 0)
  314. +++ java/net/sf/l2j/gameserver/communitybbs/Manager/PasswordBBSManager.java (revision 0)
  315. @@ -0,0 +1,112 @@
  316. +package net.sf.l2j.gameserver.communitybbs.Manager;
  317. +
  318. +import java.security.MessageDigest;
  319. +import java.sql.Connection;
  320. +import java.sql.PreparedStatement;
  321. +import java.util.Base64;
  322. +import java.util.StringTokenizer;
  323. +
  324. +import net.sf.l2j.commons.concurrent.ThreadPool;
  325. +
  326. +import net.sf.l2j.L2DatabaseFactory;
  327. +import net.sf.l2j.gameserver.data.cache.HtmCache;
  328. +import net.sf.l2j.gameserver.model.actor.instance.Player;
  329. +
  330. +public class PasswordBBSManager extends BaseBBSManager
  331. +{
  332. +   protected PasswordBBSManager()
  333. +   {
  334. +   }
  335. +  
  336. +   public static PasswordBBSManager getInstance()
  337. +   {
  338. +       return SingletonHolder._instance;
  339. +   }  
  340. +  
  341. +   @Override
  342. +   public void parseCmd(String command, Player activeChar)
  343. +   {
  344. +       if (command.equals("_bbspassword"))
  345. +           showPasswordContent(activeChar);
  346. +       else if (command.startsWith("_bbspassword"))
  347. +       {
  348. +           StringTokenizer st = new StringTokenizer(command);
  349. +           st.nextToken();
  350. +          
  351. +           String password = "";
  352. +           String repeat = "";
  353. +          
  354. +           try
  355. +           {
  356. +               if (st.hasMoreTokens())
  357. +               {
  358. +                   password = st.nextToken();
  359. +                   repeat = st.nextToken();
  360. +               }
  361. +           }
  362. +           catch (Exception e)
  363. +           {
  364. +               e.printStackTrace();
  365. +           }
  366. +          
  367. +           generatePassword(password, repeat, activeChar);
  368. +       }
  369. +       else
  370. +           super.parseCmd(command, activeChar);
  371. +   }
  372. +
  373. +   @Override
  374. +   protected String getFolder()
  375. +   {
  376. +       return "password/";
  377. +   }
  378. +  
  379. +   public static void generatePassword(String password, String repeat, Player activeChar)
  380. +   {
  381. +       if (password.length() < 3)
  382. +       {
  383. +           activeChar.sendMessage("The new password is too short.");
  384. +           return;
  385. +       }
  386. +       else if (password.length() > 16)
  387. +       {
  388. +           activeChar.sendMessage("The new password is too long.");
  389. +           return;        
  390. +       }
  391. +       else if (!password.equals(repeat))
  392. +       {
  393. +           activeChar.sendMessage("The password you have entered is incorrect.");
  394. +           return;        
  395. +       }
  396. +      
  397. +       try (Connection con = L2DatabaseFactory.getInstance().getConnection())
  398. +       {
  399. +           PreparedStatement ps = con.prepareStatement("UPDATE accounts SET password=? WHERE login=?");
  400. +          
  401. +           byte[] newPassword = MessageDigest.getInstance("SHA").digest(password.getBytes("UTF-8"));
  402. +           ps.setString(1, Base64.getEncoder().encodeToString(newPassword));
  403. +           ps.setString(2, activeChar.getAccountName());
  404. +           ps.executeUpdate();
  405. +           ps.close();
  406. +          
  407. +           ThreadPool.schedule(() -> activeChar.logout(false), 10000);
  408. +       }
  409. +       catch (Exception e)
  410. +       {
  411. +           _log.warning("There was an error while updating account:" + e);
  412. +       }
  413. +      
  414. +       separateAndSend(HtmCache.getInstance().getHtm(CB_PATH + "password/successfully.htm"), activeChar);
  415. +   }  
  416. +  
  417. +   private static void showPasswordContent(Player activeChar)
  418. +   {
  419. +       String content = HtmCache.getInstance().getHtm(CB_PATH + "password/password.htm");
  420. +       separateAndSend(content, activeChar);
  421. +   }      
  422. +  
  423. +   private static class SingletonHolder
  424. +   {
  425. +       protected static final PasswordBBSManager _instance = new PasswordBBSManager();
  426. +   }  
  427. +}
  428. \ No newline at end of file
  429. Index: java/net/sf/l2j/gameserver/communitybbs/Manager/RankingBBSManager.java
  430. ===================================================================
  431. --- java/net/sf/l2j/gameserver/communitybbs/Manager/RankingBBSManager.java  (revision 0)
  432. +++ java/net/sf/l2j/gameserver/communitybbs/Manager/RankingBBSManager.java  (revision 0)
  433. @@ -0,0 +1,62 @@
  434. +package net.sf.l2j.gameserver.communitybbs.Manager;
  435. +
  436. +import java.util.StringTokenizer;
  437. +
  438. +import net.sf.l2j.gameserver.data.cache.HtmCache;
  439. +import net.sf.l2j.gameserver.communitybbs.BB.Ranking;
  440. +import net.sf.l2j.gameserver.model.actor.instance.Player;
  441. +
  442. +public class RankingBBSManager extends BaseBBSManager
  443. +{
  444. +   protected RankingBBSManager()
  445. +   {
  446. +   }
  447. +  
  448. +   public static RankingBBSManager getInstance()
  449. +   {
  450. +       return SingletonHolder._instance;
  451. +   }
  452. +  
  453. +   @Override
  454. +   public void parseCmd(String command, Player activeChar)
  455. +   {
  456. +       if (command.startsWith("_bbsranking"))
  457. +       {
  458. +           StringTokenizer st = new StringTokenizer(command, ";");
  459. +           st.nextToken();
  460. +          
  461. +           final String currentCommand = st.nextToken();
  462. +           if (currentCommand.equals("pvp"))
  463. +               showPvpList(activeChar);
  464. +           else if (currentCommand.equals("pk"))
  465. +               showPkList(activeChar);
  466. +       }
  467. +       else
  468. +           super.parseCmd(command, activeChar);
  469. +   }
  470. +
  471. +   @Override
  472. +   protected String getFolder()
  473. +   {
  474. +       return "ranking/";
  475. +   }  
  476. +  
  477. +   private static void showPvpList(Player activeChar)
  478. +   {
  479. +       String content = HtmCache.getInstance().getHtm(CB_PATH + "ranking/ranking.htm");
  480. +       content = content.replaceAll("%pvp_list%", Ranking.getInstance().getPvp());
  481. +       separateAndSend(content, activeChar);      
  482. +   }
  483. +  
  484. +   private static void showPkList(Player activeChar)
  485. +   {
  486. +       String content = HtmCache.getInstance().getHtm(CB_PATH + "ranking/ranking-1.htm");
  487. +       content = content.replaceAll("%pk_list%", Ranking.getInstance().getPk());
  488. +       separateAndSend(content, activeChar);      
  489. +   }
  490. +  
  491. +   private static class SingletonHolder
  492. +   {
  493. +       protected static final RankingBBSManager _instance = new RankingBBSManager();
  494. +   }  
  495. +}
  496. \ No newline at end of file
  497. Index: java/net/sf/l2j/gameserver/communitybbs/Manager/RepairBBSManager.java
  498. ===================================================================
  499. --- java/net/sf/l2j/gameserver/communitybbs/Manager/RepairBBSManager.java   (revision 0)
  500. +++ java/net/sf/l2j/gameserver/communitybbs/Manager/RepairBBSManager.java   (revision 0)
  501. @@ -0,0 +1,142 @@
  502. +package net.sf.l2j.gameserver.communitybbs.Manager;
  503. +
  504. +import java.sql.Connection;
  505. +import java.sql.PreparedStatement;
  506. +import java.sql.ResultSet;
  507. +import java.util.StringTokenizer;
  508. +import java.util.logging.Level;
  509. +
  510. +import net.sf.l2j.L2DatabaseFactory;
  511. +import net.sf.l2j.gameserver.data.cache.HtmCache;
  512. +import net.sf.l2j.gameserver.model.actor.instance.Player;
  513. +
  514. +public class RepairBBSManager extends BaseBBSManager
  515. +{
  516. +   protected RepairBBSManager()
  517. +   {
  518. +   }
  519. +  
  520. +   public static RepairBBSManager getInstance()
  521. +   {
  522. +       return SingletonHolder._instance;
  523. +   }  
  524. +  
  525. +   @Override
  526. +   public void parseCmd(String command, Player activeChar)
  527. +   {
  528. +       if (command.equals("_bbsrepair"))
  529. +           showRepairContent(activeChar);
  530. +       else if (command.startsWith("_bbsrepair"))
  531. +       {
  532. +           StringTokenizer st = new StringTokenizer(command);
  533. +           st.nextToken();
  534. +          
  535. +           if (activeChar.isInJail())
  536. +           {
  537. +               activeChar.sendMessage("The character that you are attempting to repair is in jail and this function cannot be used to help him.");
  538. +               return;
  539. +           }
  540. +          
  541. +           generateRepair(command, activeChar);
  542. +       }
  543. +       else
  544. +           super.parseCmd(command, activeChar);
  545. +   }
  546. +
  547. +   @Override
  548. +   protected String getFolder()
  549. +   {
  550. +       return "repair/";
  551. +   }
  552. +  
  553. +   public static void generateRepair(String command, Player activeChar)
  554. +   {
  555. +       String[] parts = command.split(" ");
  556. +       if (parts.length != 2)
  557. +           return;
  558. +      
  559. +       try (Connection con = L2DatabaseFactory.getInstance().getConnection())
  560. +       {
  561. +           PreparedStatement statement = con.prepareStatement("UPDATE characters SET x=-84318, y=244579, z=-3730 WHERE char_name=?");
  562. +           statement.setString(1, parts[1]);
  563. +           statement.execute();
  564. +           statement.close();
  565. +          
  566. +           statement = con.prepareStatement("SELECT obj_id FROM characters where char_name=?");
  567. +           statement.setString(1, parts[1]);
  568. +           ResultSet rset = statement.executeQuery();
  569. +           int objId = 0;
  570. +           if (rset.next())
  571. +           {
  572. +               objId = rset.getInt(1);
  573. +           }
  574. +          
  575. +           rset.close();
  576. +           statement.close();
  577. +          
  578. +           if (objId == 0)
  579. +           {
  580. +               con.close();
  581. +               return;
  582. +           }
  583. +          
  584. +           statement = con.prepareStatement("DELETE FROM character_shortcuts WHERE char_obj_id=?");
  585. +           statement.setInt(1, objId);
  586. +           statement.execute();
  587. +           statement.close();
  588. +          
  589. +           statement = con.prepareStatement("UPDATE items SET loc=\"INVENTORY\" WHERE owner_id=?");
  590. +           statement.setInt(1, objId);
  591. +           statement.execute();
  592. +           statement.close();
  593. +       }
  594. +       catch (Exception e)
  595. +       {
  596. +           _log.log(Level.WARNING, "could not repair char:", e);
  597. +       }      
  598. +      
  599. +       separateAndSend(HtmCache.getInstance().getHtm(CB_PATH + "repair/successfully.htm"), activeChar);
  600. +   }
  601. +
  602. +   public static String getAccountChars(Player activeChar)
  603. +   {
  604. +       String account = "";
  605. +       String accountName = activeChar.getAccountName();
  606. +      
  607. +       try (Connection con = L2DatabaseFactory.getInstance().getConnection())
  608. +       {
  609. +           PreparedStatement statement = con.prepareStatement("SELECT char_name FROM characters WHERE account_name=?");
  610. +           statement.setString(1, accountName);
  611. +          
  612. +           ResultSet rset = statement.executeQuery();
  613. +           while (rset.next())
  614. +           {
  615. +               if (activeChar.getName().compareTo(rset.getString(1)) != 0)
  616. +               {
  617. +                   account = account + rset.getString(1) + ";";
  618. +               }
  619. +           }
  620. +          
  621. +           rset.close();
  622. +           statement.close();
  623. +       }
  624. +       catch (Exception e)
  625. +       {
  626. +           e.printStackTrace();
  627. +       }
  628. +      
  629. +       return account;
  630. +   }
  631. +  
  632. +   private static void showRepairContent(Player activeChar)
  633. +   {
  634. +       String content = HtmCache.getInstance().getHtm(CB_PATH + "repair/repair.htm");
  635. +       content = content.replaceAll("%account_chars%", getAccountChars(activeChar));
  636. +       separateAndSend(content, activeChar);
  637. +   }
  638. +
  639. +   private static class SingletonHolder
  640. +   {
  641. +       protected static final RepairBBSManager _instance = new RepairBBSManager();
  642. +   }
  643. +}
  644. \ No newline at end of file
  645. Index: java/net/sf/l2j/gameserver/communitybbs/Manager/ReportBBSManager.java
  646. ===================================================================
  647. --- java/net/sf/l2j/gameserver/communitybbs/Manager/ReportBBSManager.java   (revision 0)
  648. +++ java/net/sf/l2j/gameserver/communitybbs/Manager/ReportBBSManager.java   (revision 0)
  649. @@ -0,0 +1,124 @@
  650. +package net.sf.l2j.gameserver.communitybbs.Manager;
  651. +
  652. +import java.io.BufferedWriter;
  653. +import java.io.File;
  654. +import java.io.FileWriter;
  655. +import java.util.StringTokenizer;
  656. +
  657. +import net.sf.l2j.gameserver.data.cache.HtmCache;
  658. +import net.sf.l2j.gameserver.data.xml.AdminData;
  659. +import net.sf.l2j.gameserver.data.xml.PlayerData;
  660. +import net.sf.l2j.gameserver.model.actor.instance.Player;
  661. +
  662. +public class ReportBBSManager extends BaseBBSManager
  663. +{
  664. +   protected ReportBBSManager()
  665. +   {
  666. +   }
  667. +  
  668. +   public static ReportBBSManager getInstance()
  669. +   {
  670. +       return SingletonHolder._instance;
  671. +   }  
  672. +  
  673. +   @Override
  674. +   public void parseCmd(String command, Player activeChar)
  675. +   {
  676. +       if (command.equals("_bbsreport"))
  677. +           showReportContent(activeChar);
  678. +       else if (command.startsWith("_bbsreport"))
  679. +       {
  680. +           StringTokenizer st = new StringTokenizer(command);
  681. +           st.nextToken();
  682. +          
  683. +           String type = null;
  684. +           String description = "";
  685. +
  686. +           try
  687. +           {
  688. +               type = st.nextToken();
  689. +              
  690. +               while (st.hasMoreTokens())
  691. +               {
  692. +                   description = description + st.nextToken() + " ";
  693. +               }
  694. +               if (description.equals(""))
  695. +               {
  696. +                   activeChar.sendMessage("Insert the description of your report first.");
  697. +                   return;
  698. +               }
  699. +               else if (description.length() >= 150)
  700. +               {
  701. +                   activeChar.sendMessage("The current description length is " + description.length() + ". Maximum length is 150!");
  702. +                   return;
  703. +               }  
  704. +              
  705. +               String name = "data/CommunityBoard/report/" + activeChar.getName() + ".txt";
  706. +               File file = new File(name);
  707. +              
  708. +               boolean exist = file.createNewFile();
  709. +               if (!exist)
  710. +               {
  711. +                   activeChar.sendMessage("You have already submit a report, staff member must confirm it first.");
  712. +                   return;
  713. +               }
  714. +              
  715. +               FileWriter fw = new FileWriter(name);
  716. +               BufferedWriter bw = new BufferedWriter(fw);
  717. +              
  718. +               bw.write("Report:");
  719. +               bw.newLine();
  720. +               bw.write("- - - - - - - - - - - - - - - - - - - -");
  721. +               bw.newLine();
  722. +               bw.write("Account Name: " + activeChar.getAccountName());
  723. +               bw.newLine();
  724. +               bw.write("Account IP: " + activeChar.getClient().getConnection().getInetAddress().getHostAddress());
  725. +               bw.newLine();
  726. +               bw.write("- - - - - - - - - - - - - - - - - - - -");
  727. +               bw.newLine();
  728. +               bw.write("Name: " + activeChar.getName());
  729. +               bw.newLine();
  730. +               bw.write("Level: " + activeChar.getLevel());
  731. +               bw.newLine();
  732. +               bw.write("Class: " + activeChar.getTemplate().getClassName());
  733. +               bw.newLine();
  734. +               bw.write("BaseClass: " + PlayerData.getInstance().getClassNameById(activeChar.getBaseClass()));
  735. +               bw.newLine();
  736. +               bw.write("- - - - - - - - - - - - - - - - - - - -");
  737. +               bw.newLine();
  738. +               bw.write("Type: " + type);
  739. +               bw.newLine();
  740. +               bw.write("Description: " + description);
  741. +               bw.close();
  742. +              
  743. +               separateAndSend(HtmCache.getInstance().getHtm(CB_PATH + "report/successfully.htm"), activeChar);
  744. +              
  745. +               for (Player gm : AdminData.getInstance().getAllGms(true))
  746. +                   gm.sendMessage("ATTENTION: " + activeChar.getName() + " just submitted a report! Please take care of his report by browsing in: data/CommunityBoard/report/ folder.");
  747. +           }
  748. +           catch (Exception e)
  749. +           {
  750. +               e.printStackTrace();
  751. +           }
  752. +       }
  753. +       else
  754. +           super.parseCmd(command, activeChar);
  755. +   }
  756. +
  757. +   @Override
  758. +   protected String getFolder()
  759. +   {
  760. +       return "report/";
  761. +   }  
  762. +  
  763. +   private static void showReportContent(Player activeChar)
  764. +   {
  765. +       String content = HtmCache.getInstance().getHtm(CB_PATH + "report/report.htm");
  766. +       separateAndSend(content, activeChar);  
  767. +   }  
  768. +  
  769. +   private static class SingletonHolder
  770. +   {
  771. +       protected static final ReportBBSManager _instance = new ReportBBSManager();
  772. +   }  
  773. +}
  774. \ No newline at end of file
  775.  
  776. Index: data/CommunityBoard/report/Readme.txt
  777. ===================================================================
  778. --- data/CommunityBoard/report/Readme.txt   (revision 0)
  779. +++ data/CommunityBoard/report/Readme.txt   (revision 0)
  780. @@ -0,0 +1 @@
  781. +Folder necessary for the creation of reports, You can delete this file after creating the folders.
  782. \ No newline at end of file
  783. Index: data/html/CommunityBoard/password/password.htm
  784. ===================================================================
  785. --- data/html/CommunityBoard/password/password.htm  (revision 0)
  786. +++ data/html/CommunityBoard/password/password.htm  (revision 0)
  787. @@ -0,0 +1,32 @@
  788. +<html><body><br>
  789. +   <table width="610">
  790. +       <tr>
  791. +           <td align="center" height="30"><img src="l2ui.bbs_lineage2" width="128" height="16"></td>
  792. +       </tr>
  793. +   </table>
  794. +   <img src="L2UI.squaregray" width=610 height=1><br>
  795. +   <center>
  796. +       <table>
  797. +           <tr>
  798. +               <td>Password Form:</td>
  799. +           </tr>
  800. +       </table>  
  801. +       <img src="L2UI.squaregray" width=610 height=1><br>
  802. +       Changing your password often is not recommended, because more passwords means more confusion and you might forget it.
  803. +       <img src="L2UI.squaregray" width=610 height=1><br>
  804. +       <table width=350 cellpadding=5>
  805. +           <tr>
  806. +               <tr>
  807. +                   <td width=100>New:</td>
  808. +                   <td width=200><edit var="new" width=100 height=12></td>
  809. +               </tr>
  810. +               <tr>
  811. +                   <td width=100 valign="top">Repeat:</td>
  812. +                   <td width=200 valign="top"><edit var="repeat" width=100 height=12></td>
  813. +               </tr>  
  814. +           </tr>
  815. +       </table><br><br>
  816. +       <img src="L2UI.squaregray" width=610 height=1><br>
  817. +       <button value="Submit password." action="bypass _bbspassword $new $repeat" width=140 height=21 back="L2UI_ch3.msnbutton_down" fore="L2UI_ch3.msnbutton">
  818. +   </center>
  819. +</body></html>
  820. \ No newline at end of file
  821. Index: data/html/CommunityBoard/password/successfully.htm
  822. ===================================================================
  823. --- data/html/CommunityBoard/password/successfully.htm  (revision 0)
  824. +++ data/html/CommunityBoard/password/successfully.htm  (revision 0)
  825. @@ -0,0 +1,23 @@
  826. +<html><body><br>
  827. +   <table width="610">
  828. +       <tr>
  829. +           <td align="center" height="30"><img src="l2ui.bbs_lineage2" width="128" height="16"></td>
  830. +       </tr>
  831. +   </table>
  832. +   <img src="L2UI.squaregray" width=610 height=1><br>
  833. +   <center>
  834. +       <table>
  835. +           <tr>
  836. +               <td>Password Form:</td>
  837. +           </tr>
  838. +       </table>  
  839. +       <img src="L2UI.squaregray" width=610 height=1><br>
  840. +       <table width=600>
  841. +           <tr>
  842. +               <tr>
  843. +                   <td>Password changing procedure has been successfully finished! You will be disconnected in 10 seconds, to confirm the password change.</td>
  844. +               </tr>
  845. +           </tr>
  846. +       </table>
  847. +   </center>
  848. +</body></html>
  849. \ No newline at end of file
  850. Index: data/html/CommunityBoard/ranking/ranking-1.htm
  851. ===================================================================
  852. --- data/html/CommunityBoard/ranking/ranking-1.htm  (revision 0)
  853. +++ data/html/CommunityBoard/ranking/ranking-1.htm  (revision 0)
  854. @@ -0,0 +1,31 @@
  855. +<html><body><br>
  856. +   <table width="610">
  857. +       <tr>
  858. +           <td align="center" height="30"><img src="l2ui.bbs_lineage2" width="128" height="16"></td>
  859. +       </tr>
  860. +   </table>
  861. +   <img src="L2UI.squaregray" width=610 height=1><br>
  862. +   <center>
  863. +       <table>
  864. +           <tr>
  865. +               <td>Current:  <font color="CCCC66">Pk </font>| <br1></td>
  866. +               <td><a action="bypass _bbsranking;pvp"><font color="808080">Pvp</font></a></td>
  867. +           </tr>
  868. +       </table>   
  869. +   </center>
  870. +   <img src="L2UI.squaregray" width=610 height=1>
  871. +   <table border="0" cellspacing="0" cellpadding="2" bgcolor="000000" height="24" width="610">
  872. +       <tr>
  873. +           <td FIXWIDTH=5></td>
  874. +            <td FIXWIDTH=20>#</td>
  875. +            <td FIXWIDTH=160>Name</td>
  876. +           <td FIXWIDTH=165>Class</td>
  877. +           <td fixwidth=80><font color="CCCC66">Pk</font></td>
  878. +           <td fixwidth=70>Level</td>
  879. +           <td fixwidth=150>Online</td>
  880. +            <td FIXWIDTH=65>Status</td>           
  881. +       </tr>      
  882. +   </table>   
  883. +   <img src="L2UI.squaregray" width=610 height=1>
  884. +   %pk_list%
  885. +</center></body></html>
  886. \ No newline at end of file
  887. Index: data/html/CommunityBoard/ranking/ranking.htm
  888. ===================================================================
  889. --- data/html/CommunityBoard/ranking/ranking.htm    (revision 0)
  890. +++ data/html/CommunityBoard/ranking/ranking.htm    (revision 0)
  891. @@ -0,0 +1,31 @@
  892. +<html><body><br>
  893. +   <table width="610">
  894. +       <tr>
  895. +           <td align="center" height="30"><img src="l2ui.bbs_lineage2" width="128" height="16"></td>
  896. +       </tr>
  897. +   </table>
  898. +   <img src="L2UI.squaregray" width=610 height=1><br>
  899. +   <center>
  900. +       <table>
  901. +           <tr>
  902. +               <td>Current:  <font color="CCCC66">Pvp </font>| <br1></td>
  903. +               <td><a action="bypass _bbsranking;pk"><font color="808080">Pk</font></a></td>
  904. +           </tr>
  905. +       </table>   
  906. +   </center>
  907. +   <img src="L2UI.squaregray" width=610 height=1>
  908. +   <table border="0" cellspacing="0" cellpadding="2" bgcolor="000000" height="24" width="610">
  909. +       <tr>
  910. +           <td FIXWIDTH=5></td>
  911. +            <td FIXWIDTH=20>#</td>
  912. +            <td FIXWIDTH=160>Name</td>
  913. +           <td FIXWIDTH=165>Class</td>
  914. +           <td fixwidth=80><font color="CCCC66">Pvp</font></td>
  915. +           <td fixwidth=70>Level</td>
  916. +           <td fixwidth=150>Online</td>
  917. +            <td FIXWIDTH=65>Status</td>           
  918. +       </tr>
  919. +   </table>   
  920. +   <img src="L2UI.squaregray" width=610 height=1>
  921. +   %pvp_list%
  922. +</center></body></html>
  923. \ No newline at end of file
  924. Index: data/html/CommunityBoard/repair/repair.htm
  925. ===================================================================
  926. --- data/html/CommunityBoard/repair/repair.htm  (revision 0)
  927. +++ data/html/CommunityBoard/repair/repair.htm  (revision 0)
  928. @@ -0,0 +1,32 @@
  929. +<html><body><br>
  930. +   <table width="610">
  931. +       <tr>
  932. +           <td align="center" height="30"><img src="l2ui.bbs_lineage2" width="128" height="16"></td>
  933. +       </tr>
  934. +   </table>
  935. +   <img src="L2UI.squaregray" width=610 height=1><br>
  936. +   <center>
  937. +       <table>
  938. +           <tr>
  939. +               <td>Repair Form:</td>
  940. +           </tr>
  941. +       </table>  
  942. +       <img src="L2UI.squaregray" width=610 height=1><br>
  943. +       Use this tool, to fix problems with your other character. Like client crashing while loading.
  944. +       <img src="L2UI.squaregray" width=610 height=1><br>
  945. +       <table width=500 cellpadding=5>
  946. +           <tr>
  947. +               <tr>
  948. +                   <td>
  949. +                       Choose character name, that you wish to attempt to fix. It will be moved to Floran and removed shortcuts and keyboard configuration.
  950. +                   </td>
  951. +                   <td>
  952. +                       <combobox var="accountChars" list="%account_chars%" width="170" height="15"/>
  953. +                   </td>
  954. +               </tr>  
  955. +           </tr>
  956. +       </table><br><br>
  957. +       <img src="L2UI.squaregray" width=610 height=1><br>
  958. +       <button value="Submit repair." action="bypass _bbsrepair $accountChars" width=140 height=21 back="L2UI_ch3.msnbutton_down" fore="L2UI_ch3.msnbutton">
  959. +   </center>
  960. +</body></html>
  961. Index: data/html/CommunityBoard/repair/successfully.htm
  962. ===================================================================
  963. --- data/html/CommunityBoard/repair/successfully.htm    (revision 0)
  964. +++ data/html/CommunityBoard/repair/successfully.htm    (revision 0)
  965. @@ -0,0 +1,23 @@
  966. +<html><body><br>
  967. +   <table width="610">
  968. +       <tr>
  969. +           <td align="center" height="30"><img src="l2ui.bbs_lineage2" width="128" height="16"></td>
  970. +       </tr>
  971. +   </table>
  972. +   <img src="L2UI.squaregray" width=610 height=1><br>
  973. +   <center>
  974. +       <table>
  975. +           <tr>
  976. +               <td>Repair Form:</td>
  977. +           </tr>
  978. +       </table>  
  979. +       <img src="L2UI.squaregray" width=610 height=1><br>
  980. +       <table width=600>
  981. +           <tr>
  982. +               <tr>
  983. +                   <td>Repairing procedure has been successfully finished! Re-login now on broken character, to confirm that repairing operation was successful.</td>
  984. +               </tr>
  985. +           </tr>
  986. +       </table>
  987. +   </center>
  988. +</body></html>
  989. \ No newline at end of file
  990. Index: data/html/CommunityBoard/report/report.htm
  991. ===================================================================
  992. --- data/html/CommunityBoard/report/report.htm  (revision 0)
  993. +++ data/html/CommunityBoard/report/report.htm  (revision 0)
  994. @@ -0,0 +1,30 @@
  995. +<html><body><br>
  996. +   <table width="610">
  997. +       <tr>
  998. +           <td align="center" height="30"><img src="l2ui.bbs_lineage2" width="128" height="16"></td>
  999. +       </tr>
  1000. +   </table>
  1001. +   <img src="L2UI.squaregray" width=610 height=1><br>
  1002. +   <center>
  1003. +       <table>
  1004. +           <tr>
  1005. +               <td>Report Form:</td>
  1006. +           </tr>
  1007. +       </table>  
  1008. +       <img src="L2UI.squaregray" width=610 height=1><br>
  1009. +       <table width=500>
  1010. +           <tr>
  1011. +               <tr>
  1012. +                   <td width="100">Type:</td>
  1013. +                   <td align=left<combobox width="105" var="type" list="General;Skill;Quest;Bug"></td>
  1014. +               </tr>
  1015. +               <tr>
  1016. +                   <td width="100">Description:</td>
  1017. +                   <td align=left><multiedit var="description" width=350 height=200></td>
  1018. +               </tr>  
  1019. +           </tr>
  1020. +       </table><br><br>
  1021. +       <img src="L2UI.squaregray" width=610 height=1><br>
  1022. +       <button value="Submit report." action="bypass _bbsreport $type $description" width=140 height=21 back="L2UI_ch3.msnbutton_down" fore="L2UI_ch3.msnbutton">
  1023. +   </center>
  1024. +</body></html>
  1025. \ No newline at end of file
  1026. Index: data/html/CommunityBoard/report/successfully.htm
  1027. ===================================================================
  1028. --- data/html/CommunityBoard/report/successfully.htm    (revision 0)
  1029. +++ data/html/CommunityBoard/report/successfully.htm    (revision 0)
  1030. @@ -0,0 +1,23 @@
  1031. +<html><body><br>
  1032. +   <table width="610">
  1033. +       <tr>
  1034. +           <td align="center" height="30"><img src="l2ui.bbs_lineage2" width="128" height="16"></td>
  1035. +       </tr>
  1036. +   </table>
  1037. +   <img src="L2UI.squaregray" width=610 height=1><br>
  1038. +   <center>
  1039. +       <table>
  1040. +           <tr>
  1041. +               <td>Report Form:</td>
  1042. +           </tr>
  1043. +       </table>  
  1044. +       <img src="L2UI.squaregray" width=610 height=1><br>
  1045. +       <table width=600>
  1046. +           <tr>
  1047. +               <tr>
  1048. +                   <td>Thank you for your report! We value player's problem reports because they are important for our server. Every reporting is making our server even more stronger.</td>
  1049. +               </tr>
  1050. +           </tr>
  1051. +       </table>
  1052. +   </center>
  1053. +</body></html>
  1054. \ No newline at end of file
  1055.  
  1056. <html><body><br>
  1057.     <table width="610">
  1058.         <tr>
  1059.             <td align="center" height="30"><img src="l2ui.bbs_lineage2" width="128" height="16"></td>
  1060.         </tr>
  1061.     </table>
  1062.     <table width="610" bgcolor="A7A19A">
  1063.         <tr>
  1064.             <td width="50" align="center">&$412;</td>
  1065.             <td width="380" align="center">&$413;</td>
  1066.             <td width="90" align="center">&$414;</td>
  1067.             <td width="90" align="center">&$415;</td>
  1068.         </tr>
  1069.     </table><br>
  1070.     <table width="610">
  1071.         <tr>
  1072.             <td width="50" align="center"><img src="l2ui.bbs_folder" width="32" height="32"></td>
  1073.             <td width="380" align="left"><a action="bypass _bbsgetfav">Favorites</a><br1><font color="AAAAAA">Bookmarks</font></td>
  1074.             <td width="90" align="center">0</td>
  1075.             <td width="90" align="center">admin</td>
  1076.         </tr>
  1077.     </table>
  1078.     <table border=0 cellspacing=0 cellpadding=0>
  1079.         <tr>
  1080.             <td width=610><img src="l2ui.squaregray" width="600" height="1"></td>
  1081.         </tr>
  1082.     </table><br>
  1083.     <table border=0 cellspacing=0 cellpadding=2>
  1084.         <tr>
  1085.             <td FIXWIDTH=50 align=right valign=top><img src="l2ui.bbs_folder" width=32 height=32></td>
  1086.             <td FIXWIDTH=380 align=left valign=top><a action="bypass _bbshome;rules.htm">Server Rules</a><br1><font color="AAAAAA">Read them carefully</font></td>
  1087.             <td FIXWIDTH=90 align=center valign=top>0</td>
  1088.             <td FIXWIDTH=90 align=center valign=top>admin</td>
  1089.         </tr>
  1090.     </table>
  1091.     <table border=0 cellspacing=0 cellpadding=0>
  1092.         <tr>
  1093.             <td width=610><img src="l2ui.squaregray" width="600" height="1"></td>
  1094.         </tr>
  1095.     </table><br>
  1096.     <table border=0 cellspacing=0 cellpadding=2>
  1097.         <tr>
  1098.             <td FIXWIDTH=50 align=right valign=top><img src="l2ui.bbs_folder" width=32 height=32></td>
  1099.             <td FIXWIDTH=380 align=left valign=top><a action="bypass _bbshome;news.htm">Lineage II News</a><br1><font color="AAAAAA">New Information</font></td>
  1100.             <td FIXWIDTH=90 align=center valign=top>0</td>
  1101.             <td FIXWIDTH=90 align=center valign=top>admin</td>
  1102.         </tr>
  1103.     </table>
  1104.     <table border=0 cellspacing=0 cellpadding=0>
  1105.         <tr>
  1106.             <td width=610><img src="l2ui.squaregray" width="600" height="1"></td>
  1107.         </tr>
  1108.     </table><br>
  1109.     <table border=0 cellspacing=0 cellpadding=2>
  1110.         <tr>
  1111.             <td FIXWIDTH=50 align=right valign=top><img src="l2ui.bbs_folder" width=32 height=32></td>
  1112.             <td FIXWIDTH=380 align=left valign=top><a action="bypass _bbsclan">Clan Community</a><br1><font color="AAAAAA">Clan Community</font></td>
  1113.             <td FIXWIDTH=90 align=center valign=top>0</td>
  1114.             <td FIXWIDTH=90 align=center valign=top>admin</td>
  1115.         </tr>
  1116.     </table>
  1117.     <table border=0 cellspacing=0 cellpadding=0>
  1118.         <tr>
  1119.             <td width=610><img src="l2ui.squaregray" width="600" height="1"></td>
  1120.         </tr>
  1121.     </table><br>
  1122.     <table border=0 cellspacing=0 cellpadding=2>
  1123.         <tr>
  1124.             <td FIXWIDTH=50 align=right valign=top><img src="l2ui.bbs_folder" width=32 height=32></td>
  1125.             <td FIXWIDTH=380 align=left valign=top><a action="bypass _bbspassword">Password Community</a><br1><font color="AAAAAA">Password Community</font></td>
  1126.             <td FIXWIDTH=90 align=center valign=top>0</td>
  1127.             <td FIXWIDTH=90 align=center valign=top>admin</td>
  1128.         </tr>
  1129.     </table>
  1130.     <table border=0 cellspacing=0 cellpadding=0>
  1131.         <tr>
  1132.             <td width=610><img src="l2ui.squaregray" width="600" height="1"></td>
  1133.         </tr>
  1134.     </table><br>   
  1135.     <table border=0 cellspacing=0 cellpadding=2>
  1136.         <tr>
  1137.             <td FIXWIDTH=50 align=right valign=top><img src="l2ui.bbs_folder" width=32 height=32></td>
  1138.             <td FIXWIDTH=380 align=left valign=top><a action="bypass _bbsranking;pvp">Ranking Community</a><br1><font color="AAAAAA">Ranking Community</font></td>
  1139.             <td FIXWIDTH=90 align=center valign=top>0</td>
  1140.             <td FIXWIDTH=90 align=center valign=top>admin</td>
  1141.         </tr>
  1142.     </table>   
  1143.     <table border=0 cellspacing=0 cellpadding=0>
  1144.         <tr>
  1145.             <td width=610><img src="l2ui.squaregray" width="600" height="1"></td>
  1146.         </tr>
  1147.     </table><br>       
  1148.     <table border=0 cellspacing=0 cellpadding=2>
  1149.         <tr>
  1150.             <td FIXWIDTH=50 align=right valign=top><img src="l2ui.bbs_folder" width=32 height=32></td>
  1151.             <td FIXWIDTH=380 align=left valign=top><a action="bypass _bbsrepair">Repair Community</a><br1><font color="AAAAAA">Repair Community</font></td>
  1152.             <td FIXWIDTH=90 align=center valign=top>0</td>
  1153.             <td FIXWIDTH=90 align=center valign=top>admin</td>
  1154.         </tr>
  1155.     </table>
  1156.     <table border=0 cellspacing=0 cellpadding=0>
  1157.         <tr>
  1158.             <td width=610><img src="l2ui.squaregray" width="600" height="1"></td>
  1159.         </tr>
  1160.     </table><br>   
  1161.     <table border=0 cellspacing=0 cellpadding=2>
  1162.         <tr>
  1163.             <td FIXWIDTH=50 align=right valign=top><img src="l2ui.bbs_folder" width=32 height=32></td>
  1164.             <td FIXWIDTH=380 align=left valign=top><a action="bypass _bbsreport">Report Community</a><br1><font color="AAAAAA">Report Community</font></td>
  1165.             <td FIXWIDTH=90 align=center valign=top>0</td>
  1166.             <td FIXWIDTH=90 align=center valign=top>admin</td>
  1167.         </tr>
  1168.     </table>       
  1169. </center></body></html>
Add Comment
Please, Sign In to add comment