Tested:Yes
Working:Yes
Code:
Index: data/xml/autoannounce.xml =================================================================== --- data/xml/autoannounce.xml (revision 0) +++ data/xml/autoannounce.xml (revision 0) @@ -0,0 +1,5 @@ +<?xml version='1.0' encoding='utf-8'?> +<list> + <message text="By Ventic!"/> + <message text="Kisses!"/> +</list> Index: java/net/sf/l2j/gameserver/datatables/xml/AutoAnnounce.java =================================================================== --- java/net/sf/l2j/gameserver/datatables/xml/AutoAnnounce.java (revision 0) +++ java/net/sf/l2j/gameserver/datatables/xml/AutoAnnounce.java (revision 0) @@ -0,0 +1,107 @@ +/* + * 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 net.sf.l2j.gameserver.datatables.xml; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStreamReader; +import java.util.logging.Logger; + +import javax.xml.parsers.DocumentBuilderFactory; + +import javolution.util.FastList; +import net.sf.l2j.Config; +import net.sf.l2j.gameserver.Announcements; +import net.sf.l2j.gameserver.ThreadPoolManager; + +import org.w3c.dom.Document; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.xml.sax.InputSource; + +/** + * @author Ventic + */ + +public class AutoAnnounce +{ + private static final Logger log = Logger.getLogger(AutoAnnounce.class.getName()); + private FastList<String> messages = new FastList<String>(); + + private class AutoAnnounceTask implements Runnable + { + @SuppressWarnings("synthetic-access") + public void run() + { + loadData(); + } + } + + private void loadData() + { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setValidating(false); + factory.setIgnoringComments(true); + File f = new File(Config.DATAPACK_ROOT + "/data/xml/autoannounce.xml"); + + if (!f.exists()) + { + log.warning("autoannounce.xml could not be loaded: file not found"); + return; + } + try + { + InputSource in = new InputSource(new InputStreamReader(new FileInputStream(f), "UTF-8")); + in.setEncoding("UTF-8"); + Document doc = factory.newDocumentBuilder().parse(f); + for (Node na = doc.getFirstChild(); na != null; na = na.getNextSibling()) + { + if(na.getNodeName().equalsIgnoreCase("list")) + { + for (Node n = na.getFirstChild(); n != null; n = n.getNextSibling()) + { + if (n.getNodeName().equals("message")) + { + NamedNodeMap ndm = n.getAttributes(); + String message = ndm.getNamedItem("text").getNodeValue(); + if (!messages.contains(message)) + { + messages.add(message); + } + Announcements.getInstance().announceToAll(message); + } + } + } + } + } + catch (Exception e) + {} + } + + public static AutoAnnounce getInstance() + { + return SingletonHolder._instance; + } + + private static class SingletonHolder + { + @SuppressWarnings("synthetic-access") + protected static final AutoAnnounce _instance = new AutoAnnounce(); + } + + @SuppressWarnings("synthetic-access") + private AutoAnnounce() + { + ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new AutoAnnounceTask(), 120000, 120000); + } +} Index: java/net/sf/l2j/gameserver/GameServer.java =================================================================== --- java/net/sf/l2j/gameserver/GameServer.java (revision 73) +++ java/net/sf/l2j/gameserver/GameServer.java (working copy) @@ -51,6 +51,7 @@ import net.sf.l2j.gameserver.datatables.sql.SpawnTable; import net.sf.l2j.gameserver.datatables.xml.ArmorSetsTable; import net.sf.l2j.gameserver.datatables.xml.AugmentationData; +import net.sf.l2j.gameserver.datatables.xml.AutoAnnounce; import net.sf.l2j.gameserver.datatables.xml.CharTemplateTable; import net.sf.l2j.gameserver.datatables.xml.FishTable; import net.sf.l2j.gameserver.datatables.xml.HelperBuffTable; @@ -247,6 +248,7 @@ AdminCommandAccessRights.getInstance(); L2World.getInstance(); ZoneManager.getInstance(); + AutoAnnounce.getInstance(); SpawnTable.getInstance(); RaidBossSpawnManager.getInstance(); _log.config("GrandBossManager: Loaded " + GrandBossManager.getInstance().size() + " GrandBosses instances.");