/** * License * THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS * CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). * THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. * ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR * COPYRIGHT LAW IS PROHIBITED. * * BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND * AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE * MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED * HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. * */ package l1j.server.server; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Date; import java.util.Iterator; import java.util.List; import javolution.util.FastList; import l1j.server.Config; import l1j.server.server.model.L1World; import l1j.server.server.model.Instance.L1PcInstance; import l1j.server.server.serverpackets.S_SystemMessage; public class AnnouncementsCycle { private int round = 0; private String line = null; private boolean firstboot = true;; private StringBuffer sb = new StringBuffer(); private static AnnouncementsCycle _instance; /** 緩衝讀取 */ private static BufferedReader buf; /** announcementsCycle文件的位置 */ private static File dir = new File("data/announceCycle.txt"); /** 紀錄上一次修改時間 */ private static long lastmodify = dir.lastModified(); /** 在公告首顯示公告修改時間 */ private boolean AnnounceTimeDisplay = Config.Announcements_Cycle_Modify_Time; /** 容器 */ List<String> list = new FastList<String>(); private AnnouncementsCycle() { cycle(); } public static AnnouncementsCycle getInstance() { if (_instance == null) { _instance = new AnnouncementsCycle(); } return _instance; } /** * 從announcementsCycle.txt將字串讀入 */ private void scanfile() { try { fileEnsure(); // 先確保檔案存在 if (dir.lastModified() > lastmodify || firstboot) { // 如果有修改過 list.clear(); // 清空容器 buf = new BufferedReader(new InputStreamReader(new FileInputStream(dir))); while ((line = buf.readLine()) != null) { if (line.startsWith("#")||line.isEmpty()) // 略過註解 continue; sb.delete(0, sb.length()); // 清空 buffer [未來擴充用] list.add(line); } lastmodify = dir.lastModified(); // 回存修改時間 } else { // 檔案沒修改過,不做任何事。 } } catch (IOException e) { e.printStackTrace(); } finally { try { buf.close(); firstboot = false; } catch (IOException e) { e.printStackTrace(); } } } /** * 確保announcementsCycle.txt存在 * * @throws IOException * 產生檔案錯誤 */ private void fileEnsure() throws IOException { if (!dir.exists()) dir.createNewFile(); } private void cycle() { AnnouncementsCycleTask task = new AnnouncementsCycleTask(); GeneralThreadPool.getInstance().scheduleAtFixedRate(task, 100000, 60000 * Config.Announcements_Cycle_Time); // 10分鐘公告一次 } /** * 處理廣播字串任務 */ class AnnouncementsCycleTask implements Runnable { @Override public void run() { scanfile(); // 啟用修改時間顯示 - 〈yyyy.MM.dd〉 if (AnnounceTimeDisplay) { SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd"); ShowAnnouncementsCycle("〈"+ formatter.format(new Date(lastmodify)) + "〉"); } Iterator<String> iterator = list.listIterator(); if (iterator.hasNext()) { round %= list.size(); ShowAnnouncementsCycle(list.get(round)); round++; } } } /** * 把字串廣播到伺服器上 */ private void ShowAnnouncementsCycle(String announcement) { Collection<L1PcInstance> AllPlayer = L1World.getInstance().getAllPlayers(); for (L1PcInstance pc : AllPlayer) pc.sendPackets(new S_SystemMessage(announcement)); } }