Jump to content

Recommended Posts

Posted

Simple, auto-announce anything you want, you can set the announcement from game //admin and then auto announce.

I'ts by default auto-announce every 3 mins.

Working on L2j interlude and ofcourse on any other chronicle with 1-2 or 3 changes...

 

The patch is not so big that's why i'm posting it here.

 

Index: /trunk/Interlude/java/config/command-privileges.properties
===================================================================
@@ -62,4 +62,13 @@
admin_list_announcements = 75
admin_reload_announcements = 100

+# Auto Announcements
+admin_list_autoannouncements = 100
+admin_add_autoannouncement = 100
+admin_del_autoannouncement = 100
+admin_autoannounce = 100

Index: /trunk/Interlude/java/net/sf/l2j/gameserver/handler/AutoAnnouncementHandler.java
===================================================================
+package net.sf.l2j.gameserver.handler;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.ScheduledFuture;
+
+import javolution.text.TextBuilder;
+import javolution.util.FastMap;
+import net.sf.l2j.L2DatabaseFactory;
+import net.sf.l2j.gameserver.Announcements;
+import net.sf.l2j.gameserver.ThreadPoolManager;
+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
+import net.sf.l2j.gameserver.serverpackets.NpcHtmlMessage;
+
+public class AutoAnnouncementHandler
+{
+    private static AutoAnnouncementHandler _instance;
+    
+    private static final long DEFAULT_ANNOUNCEMENT_DELAY = 180000; // 3 mins by default
+    
+    protected Map<Integer, AutoAnnouncementInstance> _registeredAnnouncements;
+    
+    protected AutoAnnouncementHandler()
+    {
+        _registeredAnnouncements = new FastMap<Integer, AutoAnnouncementInstance>();
+        restoreAnnouncementData();
+    }
+    
+    private void restoreAnnouncementData()
+    {
+        int numLoaded = 0;
+        java.sql.Connection con = null;
+        PreparedStatement statement = null;
+        ResultSet rs = null;
+        
+        try
+        {
+            con = L2DatabaseFactory.getInstance().getConnection();
+            
+            statement = con.prepareStatement("SELECT * FROM auto_announcements ORDER BY id");
+            rs = statement.executeQuery();
+            
+            while (rs.next())
+            {
+                numLoaded++;
+                
+                registerGlobalAnnouncement(rs.getInt("id"), rs.getString("announcement"), rs.getLong("delay"));
+                
+            }
+            
+            statement.close();
+        }
+        catch (Exception e)
+        {
+        }
+        finally
+        {
+            try
+            {
+                con.close();
+            }
+            catch (Exception e)
+            {
+            }
+        }
+    }
+    
+    public void listAutoAnnouncements(L2PcInstance activeChar)
+    {       
+        NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
+        
+        TextBuilder replyMSG = new TextBuilder("<html><body>");
+        replyMSG.append("<table width=260><tr>");
+        replyMSG.append("<td width=40></td>");
+        replyMSG.append("<button value=\"Main\" action=\"bypass -h admin_admin\" width=50 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"><br>");
+        replyMSG.append("<td width=180><center>Auto Announcement Menu</center></td>");
+        replyMSG.append("<td width=40></td>");
+        replyMSG.append("</tr></table>");
+        replyMSG.append("<br><br>");
+        replyMSG.append("<center>Add new auto announcement:</center>");
+        replyMSG.append("<center><multiedit var=\"new_autoannouncement\" width=240 height=30></center><br>");
+        replyMSG.append("<br><br>");
+        replyMSG.append("<center>Delay: <edit var=\"delay\" width=70></center>");
+        replyMSG.append("<center>Note: Time in Seconds 60s = 1 min.</center>");
+        replyMSG.append("<br><br>");
+        replyMSG.append("<center><table><tr><td>");
+        replyMSG.append("<button value=\"Add\" action=\"bypass -h admin_add_autoannouncement $delay $new_autoannouncement\" width=60 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td><td>");
+        replyMSG.append("</td></tr></table></center>");
+        replyMSG.append("<br>");
+        
+        for (AutoAnnouncementInstance announcementInst : AutoAnnouncementHandler.getInstance().values())
+        {
+            replyMSG.append("<table width=260><tr><td width=220>[" + announcementInst.getDefaultDelay() + "s] " + announcementInst.getDefaultTexts().toString() + "</td><td width=40>");
+            replyMSG.append("<button value=\"Delete\" action=\"bypass -h admin_del_autoannouncement " + announcementInst.getDefaultId() + "\" width=60 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td></tr></table>");
+        }
+        
+        replyMSG.append("</body></html>");
+        
+        adminReply.setHtml(replyMSG.toString());
+        activeChar.sendPacket(adminReply);
+    }
+    
+    public static AutoAnnouncementHandler getInstance()
+    {
+        if (_instance == null) _instance = new AutoAnnouncementHandler();
+        
+        return _instance;
+    }
+    
+    public int size()
+    {
+        return _registeredAnnouncements.size();
+    }
+    
+    /**
+     * Registers a globally active autoannouncement.
+     * <BR>
+     * Returns the associated auto announcement instance.
+     * 
+     * @param String announcementTexts
+     * @param int announcementDelay (-1 = default delay)
+     * @return AutoAnnouncementInstance announcementInst
+     */
+    public AutoAnnouncementInstance registerGlobalAnnouncement(int id, String announcementTexts, long announcementDelay)
+    {
+        return registerAnnouncement(id, announcementTexts, announcementDelay);
+    }
+    
+    /**
+     * Registers a NON globally-active auto announcement
+     * <BR>
+     * Returns the associated auto chat instance.
+     * 
+     * @param String announcementTexts
+     * @param int announcementDelay (-1 = default delay)
+     * @return AutoAnnouncementInstance announcementInst
+     */
+    public AutoAnnouncementInstance registerAnnouncment(int id, String announcementTexts, long announcementDelay)
+    {
+        return registerAnnouncement(id, announcementTexts, announcementDelay);
+    }
+    
+    public AutoAnnouncementInstance registerAnnouncment(String announcementTexts, long announcementDelay)
+    {
+        int nextId = nextAutoAnnouncmentId();
+        
+        java.sql.Connection con = null;
+        try
+        {
+            con = L2DatabaseFactory.getInstance().getConnection();
+            PreparedStatement statement = con.prepareStatement("INSERT INTO auto_announcements (id,announcement,delay) " + "VALUES (?,?,?)");
+            statement.setInt(1, nextId);
+            statement.setString(2, announcementTexts);
+            statement.setLong(3, announcementDelay);
+            
+            
+            statement.executeUpdate();
+            
+            statement.close();
+        } catch (Exception e) {
+        } finally {
+            try { con.close(); } catch (Exception e) {}
+        }
+        
+        return registerAnnouncement(nextId, announcementTexts, announcementDelay);
+    }
+    
+    public int nextAutoAnnouncmentId()
+    {
+        
+        int nextId = 0;
+        
+        java.sql.Connection con = null;
+        PreparedStatement statement = null;
+        ResultSet rs = null;
+        
+        try
+        {
+            con = L2DatabaseFactory.getInstance().getConnection();
+            
+            statement = con.prepareStatement("SELECT id FROM auto_announcements ORDER BY id");
+            rs = statement.executeQuery();
+            
+            while (rs.next())
+            {
+                if(rs.getInt("id") > nextId)
+                    nextId = rs.getInt("id"); 
+            }
+            
+            statement.close();
+            
+            nextId++;
+        }
+        catch (Exception e)
+        {
+        }
+        finally
+        {
+            try
+            {
+                con.close();
+            }
+            catch (Exception e)
+            {
+            }
+        }
+        
+        return nextId;
+    }
+    
+    private final AutoAnnouncementInstance registerAnnouncement(int id, String announcementTexts, long chatDelay)
+    {
+        AutoAnnouncementInstance announcementInst = null;        
+        
+        if (chatDelay < 0) chatDelay = DEFAULT_ANNOUNCEMENT_DELAY;
+        
+        if (_registeredAnnouncements.containsKey(id)) announcementInst = _registeredAnnouncements.get(id);
+        else announcementInst = new AutoAnnouncementInstance(id, announcementTexts, chatDelay);
+        
+        _registeredAnnouncements.put(id, announcementInst);
+        
+        return announcementInst;
+    }
+    
+    public Collection<AutoAnnouncementInstance> values()
+    {        
+        return _registeredAnnouncements.values();
+    }
+    
+    /**
+     * Removes and cancels ALL auto announcement for the given announcement id.
+     * 
+     * @param int Id
+     * @return boolean removedSuccessfully
+     */
+    public boolean removeAnnouncement(int id)
+    {
+        AutoAnnouncementInstance announcementInst = _registeredAnnouncements.get(id);
+        
+        java.sql.Connection con = null;
+        try
+        {
+            con = L2DatabaseFactory.getInstance().getConnection();
+            PreparedStatement statement = con.prepareStatement("DELETE FROM auto_announcements WHERE id=?");
+            statement.setInt(1, announcementInst.getDefaultId());
+            statement.executeUpdate();
+            
+            statement.close();
+        } catch (Exception e) {
+        } finally {
+            try { con.close(); } catch (Exception e) {}
+        }
+        
+        return removeAnnouncement(announcementInst);
+    }
+    
+    /**
+     * Removes and cancels ALL auto announcement for the given announcement instance.
+     * 
+     * @param AutoAnnouncementInstance announcementInst
+     * @return boolean removedSuccessfully
+     */
+    public boolean removeAnnouncement(AutoAnnouncementInstance announcementInst)
+    {
+        if (announcementInst == null) return false;
+        
+        _registeredAnnouncements.remove(announcementInst.getDefaultId());
+        announcementInst.setActive(false);
+        
+        return true;
+    }
+    
+    /**
+     * Returns the associated auto announcement instance either by the given announcement ID
+     * or object ID.
+     * 
+     * @param int id
+     * @return AutoAnnouncementInstance announcementInst
+     */
+    public AutoAnnouncementInstance getAutoAnnouncementInstance(int id)
+    {
+        return _registeredAnnouncements.get(id);
+    }
+    
+    /**
+     * Sets the active state of all auto announcement instances to that specified,
+     * and cancels the scheduled chat task if necessary.
+     * 
+     * @param boolean isActive
+     */
+    public void setAutoAnnouncementActive(boolean isActive)
+    {
+        for (AutoAnnouncementInstance announcementInst : _registeredAnnouncements.values())
+            announcementInst.setActive(isActive);
+    }
+    
+    /**
+     * Auto Announcement Instance
+     */
+    public class AutoAnnouncementInstance
+    {
+        private long _defaultDelay = DEFAULT_ANNOUNCEMENT_DELAY;
+        private String _defaultTexts;
+        private boolean _defaultRandom = false;
+        private Integer _defaultId;
+        
+        private boolean _isActive;
+        
+        public ScheduledFuture<?> _chatTask;
+        
+        protected AutoAnnouncementInstance(int id, String announcementTexts, long announcementDelay)
+        {
+            _defaultId = id;
+            _defaultTexts = announcementTexts;
+            _defaultDelay = (announcementDelay * 1000);
+            
+            setActive(true);
+        }
+        
+        public boolean isActive()
+        {
+            return _isActive;
+        }
+        
+        public boolean isDefaultRandom()
+        {
+            return _defaultRandom;
+        }
+        
+        public long getDefaultDelay()
+        {
+            return _defaultDelay;
+        }
+        
+        public String getDefaultTexts()
+        {
+            return _defaultTexts;
+        }
+        
+        public Integer getDefaultId()
+        {
+            return _defaultId;
+        }
+        
+        public void setDefaultChatDelay(long delayValue)
+        {
+            _defaultDelay = delayValue;
+        }
+        
+        public void setDefaultChatTexts(String textsValue)
+        {
+            _defaultTexts = textsValue;
+        }
+        
+        public void setDefaultRandom(boolean randValue)
+        {
+            _defaultRandom = randValue;
+        }
+        
+        public void setActive(boolean activeValue)
+        {
+            if (_isActive == activeValue) return;
+            
+            _isActive = activeValue;
+            
+            
+            if (isActive())
+            {
+                AutoAnnouncementRunner acr = new AutoAnnouncementRunner(_defaultId);
+                _chatTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(acr,
+                                                                                       _defaultDelay,
+                                                                                       _defaultDelay);
+            }
+            else
+            {
+                _chatTask.cancel(false);
+            }
+        }
+        
+        
+        /**
+         * Auto Announcement Runner
+         * <BR><BR>
+         * Represents the auto announcement scheduled task for each announcement instance.
+         * 
+         * @author chief
+         */
+        private class AutoAnnouncementRunner implements Runnable
+        {
+            protected int id;
+            
+            protected AutoAnnouncementRunner(int pId)
+            {
+                id = pId;
+            }
+            
+            public synchronized void run()
+            {
+                AutoAnnouncementInstance announcementInst = _registeredAnnouncements.get(id);
+                
+                String text;
+                
+                text = announcementInst.getDefaultTexts();
+                
+                if (text == null) return;
+                
+                Announcements.getInstance().announceToAll(text);
+            }
+        }
+    }
+}
Index: /trunk/Interlude/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminAutoAnnouncements.java
===================================================================
+package net.sf.l2j.gameserver.handler.admincommandhandlers;
+
+import java.util.StringTokenizer;
+
+import net.sf.l2j.Config;
+import net.sf.l2j.gameserver.handler.AutoAnnouncementHandler;
+import net.sf.l2j.gameserver.handler.IAdminCommandHandler;
+import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
+
+/**
+ * This class handles following admin commands:
+ * - announce text = announces text to all players
+ * - list_announcements = show menu
+ * - reload_announcements = reloads announcements from txt file
+ * - announce_announcements = announce all stored announcements to all players
+ * - add_announcement text = adds text to startup announcements
+ * - del_announcement id = deletes announcement with respective id
+ * 
+ * @version $Revision: 1.4.4.5 $ $Date: 2005/04/11 10:06:06 $
+ */
+public class AdminAutoAnnouncements implements IAdminCommandHandler {
+
+	private static String[] ADMIN_COMMANDS = {
+			"admin_list_autoannouncements",
+			"admin_add_autoannouncement",
+			"admin_del_autoannouncement",
+            "admin_autoannounce"
+			};
+	private static final int REQUIRED_LEVEL = Config.GM_ANNOUNCE;
+
+	public boolean useAdminCommand(String command, L2PcInstance admin) {
+        if (!Config.ALT_PRIVILEGES_ADMIN)
+            if (!(checkLevel(admin.getAccessLevel()) && admin.isGM())) return false;
+		
+		if (command.equals("admin_list_autoannouncements"))
+		{
+            AutoAnnouncementHandler.getInstance().listAutoAnnouncements(admin);
+		}                            
+		else if (command.startsWith("admin_add_autoannouncement"))
+		{
+			//FIXME the player can send only 16 chars (if you try to send more it sends null), remove this function or not?
+			if (!command.equals("admin_add_autoannouncement"))
+			{
+			 try{
+                StringTokenizer st = new StringTokenizer(command.substring(27));                
+                int delay =  Integer.parseInt(st.nextToken().trim());
+                String autoAnnounce = st.nextToken();
+                
+                if (delay > 30)
+                {                                    
+                    while (st.hasMoreTokens()) {
+                        autoAnnounce = autoAnnounce + " " + st.nextToken();
+                    };
+                    
+                    AutoAnnouncementHandler.getInstance().registerAnnouncment(autoAnnounce, delay);
+                    AutoAnnouncementHandler.getInstance().listAutoAnnouncements(admin);
+                }
+                
+			 } catch(StringIndexOutOfBoundsException e){}//ignore errors
+			}
+		}
+		else if (command.startsWith("admin_del_autoannouncement"))
+		{
+            try
+            {
+    			int val = new Integer(command.substring(27)).intValue();
+                AutoAnnouncementHandler.getInstance().removeAnnouncement(val);
+                AutoAnnouncementHandler.getInstance().listAutoAnnouncements(admin);
+            }
+            catch (StringIndexOutOfBoundsException e)
+            { }
+		}
+		
+		// Command is admin autoannounce 
+		else if (command.startsWith("admin_autoannounce"))
+		{
+			// Call method from another class
+            AutoAnnouncementHandler.getInstance().listAutoAnnouncements(admin);
+		}
+		
+		return true;
+	}
+	
+	public String[] getAdminCommandList() {
+		return ADMIN_COMMANDS;
+	}
+	
+	private boolean checkLevel(int level) {
+		return (level >= REQUIRED_LEVEL);
+	}
+	
+}

Index: /trunk/Datapack/sql/autoanounce.sql
===================================================================
@@ -0,0 +1,9 @@
+-- ----------------------------
+-- Table structure for auto_announcements
+-- ----------------------------
+CREATE TABLE `auto_announcements` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `announcement` varchar(255) COLLATE latin1_general_ci NOT NULL DEFAULT '',
+  `delay` int(11) NOT NULL DEFAULT '0',
+  PRIMARY KEY (`id`)
+) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

Index: /trunk/Datapack/tools/database_installer.bat
===================================================================
+autoanounce.sql

Index: /trunk/Datapack/data/html/admin/announce.htm
===================================================================
@@ -11,4 +11,5 @@
<td><button value="Announce" action="bypass -h admin_announce_menu $new_announcement" width=60 height=15 back="sek.cbui94" fore="sek.cbui92"></td>
<td><button value="Reload" action="bypass -h admin_announce_announcements" width=60 height=15 back="sek.cbui94" fore="sek.cbui92"></td>
+<td><button value="Auto Announce" action="bypass -h admin_autoannounce $menu_command" width=55 height=15 back="sek.cbui94" fore="sek.cbui92"></td> 
</tr></table></center>
%announces%

Credits: L2j-Forum

Posted

L2J Contest share and its not yours?

 

/fail imo.

 

He can do it, but his share is counted like.. almost nothing..

It's just a sign that he participated and cared to post something..

 

By the way, why advanced?

 

 

To be honest, you can't compare a clean event engine with a feature that already exists @ the latest Chronicles..

Posted

He can do it, but his share is counted like.. almost nothing..

It's just a sign that he participated and cared to post something..

 

By the way, why advanced?

It's not like the old one...

 

here... http://www.l2jserver.com/old-forum/thread.php?threadid=33772&hilight=auto+announce

  • 3 weeks later...
  • 1 month later...
  • 4 weeks later...
  • 2 weeks later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Posts

    • I am selling my l2jeternity high five (all inclusive option $300) license+daily $50(mission) mod, autofarm, this is a very good and stable H5 assembly on market if you know how to run it properly, project developer LordWinter also a very passionate person and active in daily basis, because I am no longer using it, selling this out to put in good use for new h5 l2project. I am selling this for $180, pm me for details/offer. thanks *Sale and rebinding with the consent of the developer LordWinter payment option : paypal/crypto telegram: @arcadin77  
    • Hello friends, good morning, good afternoon or good evening, depending on the time you are seeing this! I have been trying to decompile and compile again with only the classes that I want LineageEffect.u for a few days now, but I have not been successful. Could someone help me by clearing up some doubts about how I can do this work and be successful?!
    • **INTERLUDE REMASTERED** Moonland is a server that's been running for about three years without wipe, and they don't plan on wiping it anytime soon. I'm selling my items or even the account due to not having much time to play anymore. I'm selling only for $$$. Not going to disclose my nickname in the server, but here are some of the items: Lvl 5 equipment for both mage and fighter +100 mage pvp set 2mastery jewels for fighter, 2 for mage, blessed antharas, blessed queen ant, ring of fallen angel, earring of fafurion. 1k + col, VIP cosmetics for armor, agathion and weapons(duals + mage wep)   I'm only selling for real money via paypal or cs2 skins so don't offer me anything else.
    • ➡ Discount for your purchase: MAY2025 (10% discount) ➡ Our Online Shop: https://socnet.store  ➡ Our SMM-Boosting Panel: https://socnet.pro  ➡ Telegram Shop Bot: https://socnet.shop  ➡ Telegram Support: https://t.me/solomon_bog  ➡ Telegram Channel: https://t.me/accsforyou_shop  ➡ Discord Support: @AllSocialNetworksShop  ➡ Discord Server: https://discord.gg/y9AStFFsrh  ➡ WhatsApp Support: https://wa.me/79051904467 ➡ WhatsApp Channel: https://whatsapp.com/channel/0029Vau0CMX002TGkD4uHa2n  ➡ Email Support: solomonbog@socnet.store 
  • Topics

×
×
  • Create New...