Jump to content

Recommended Posts

Posted

And that isnt mine I find it  in l2jserver .... I havent tested  .... as i see it is working 99% on l2jserver gameserver version 2819 ... As vago says it is working

 

On official servers, the clan community board has this feature, and my players were missing it, so i developed it Wink

It's not 100% retail-like but it works really well, and doesn't seem to have any bugs on it...

This is the patch created by  _DS_ The share was created by cybersick ...

Index: java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java
===================================================================
--- java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java	(revision 2819)
+++ java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java	(working copy)
@@ -513,6 +513,15 @@
             clan.broadcastToOtherOnlineMembers(msg, activeChar);
             msg = null;
             clan.broadcastToOtherOnlineMembers(new PledgeShowMemberListUpdate(activeChar), activeChar);
+            if (clan.isNoticeEnabled())
+            {
+            	sendPacket(new NpcHtmlMessage(1, "<html><title>Clan Announcements</title><body><br><center><font color=\"CCAA00\">" +
+            			activeChar.getClan().getName() +
+            			"</font> <font color=\"6655FF\">Clan Alert Message</font></center><br>" +
+            			"<img src=\"L2UI.SquareWhite\" width=270 height=1><br>" +
+            			activeChar.getClan().getNotice().replaceAll("\r\n", "<br>") + 
+            			"</body></html>"));
+            }
         }
     }

Index: java/net/sf/l2j/gameserver/model/L2Clan.java
===================================================================
--- java/net/sf/l2j/gameserver/model/L2Clan.java	(revision 2819)
+++ java/net/sf/l2j/gameserver/model/L2Clan.java	(working copy)
@@ -156,6 +156,9 @@

     private int _reputationScore = 0;
     private int _rank = 0;
+    
+    private String _notice;
+    private boolean _noticeEnabled = false;

     /**
      * Called if a clan is referenced only by id.
@@ -870,6 +873,7 @@
             restoreSubPledges();
             restoreRankPrivs();
             restoreSkills();
+            restoreNotice();
         }
         catch (Exception e)
         {
@@ -881,6 +885,110 @@
         }
     }

+    private void restoreNotice()
+    {
+    	java.sql.Connection con = null;
+    	try
+    	{
+    		con = L2DatabaseFactory.getInstance().getConnection();
+    		PreparedStatement statement = con.prepareStatement("SELECT enabled,notice FROM clan_notices WHERE clan_id=?");
+    		statement.setInt(1, getClanId());
+    		ResultSet noticeData = statement.executeQuery();
+    		
+    		while (noticeData.next())
+    		{
+    			_noticeEnabled = noticeData.getBoolean("enabled");
+    			_notice = noticeData.getString("notice");
+    		}
+    		
+    		noticeData.close();
+    		statement.close();
+    		con.close();
+    	}
+    	catch (Exception e)
+    	{
+    		_log.log(Level.SEVERE, "Error restoring clan notice.", e);
+    	}
+    	finally
+    	{
+    		try { con.close(); } catch (Exception e) {}
+    	}
+    }
+
+    private void storeNotice(String notice, boolean enabled)
+    {
+    	if (notice == null)
+    		notice = "";
+    	
+    	java.sql.Connection con = null;
+
+    	try
+    	{
+    		con = L2DatabaseFactory.getInstance().getConnection();
+
+    		if (notice.length() > 8192)
+    			notice = notice.substring(0, 8191);
+    		
+    		if (_notice != null)
+    		{
+    			PreparedStatement statement = con.prepareStatement("UPDATE clan_notices SET enabled=?,notice=? WHERE clan_id=?");
+        		if (enabled)
+            		statement.setString(1, "true");
+        		else
+            		statement.setString(1, "false");
+        		statement.setString(2, notice);
+        		statement.setInt(3, getClanId());
+                statement.execute();
+                statement.close();
+    		}
+    		else
+    		{
+        		PreparedStatement statement = con.prepareStatement("INSERT INTO clan_notices (clan_id, enabled, notice) values (?,?,?)");
+        		statement.setInt(1, getClanId());
+        		if (enabled)
+            		statement.setString(2, "true");
+        		else
+            		statement.setString(2, "false");
+        		statement.setString(3, notice);
+                statement.execute();
+                statement.close();
+    		}
+    	}
+        catch (Exception e)
+        {
+            _log.warning("Error could not store clan notice: " + e);
+        }
+        finally
+        {
+            try { con.close(); } catch (Exception e) {}
+        }
+
+    	_notice = notice;
+    	_noticeEnabled = enabled;
+    }
+
+    public void setNoticeEnabled(boolean noticeEnabled)
+    {
+    	storeNotice(_notice, noticeEnabled);
+    }
+    
+    public void setNotice(String notice)
+    {
+    	storeNotice(notice, _noticeEnabled);
+    }
+
+    public boolean isNoticeEnabled()
+    {
+    	return _noticeEnabled;
+    }
+    
+    public String getNotice()
+    {
+    	if (_notice == null)
+    		return "";
+    	return _notice;
+    }
+    
     private void restoreSkills()
     {
         java.sql.Connection con = null;
Index: java/net/sf/l2j/gameserver/communitybbs/Manager/ClanBBSManager.java
===================================================================
--- java/net/sf/l2j/gameserver/communitybbs/Manager/ClanBBSManager.java	(revision 2819)
+++ java/net/sf/l2j/gameserver/communitybbs/Manager/ClanBBSManager.java	(working copy)
@@ -88,13 +88,127 @@
				clanhome(activeChar, index);
			}
		}
+		else if(command.startsWith("_bbsclan_clannotice_edit;"))
+		{
+			clanNotice(activeChar, activeChar.getClan().getClanId());
+		}
+		else if(command.startsWith("_bbsclan_clannotice_enable"))
+		{
+			activeChar.getClan().setNoticeEnabled(true);
+			clanNotice(activeChar, activeChar.getClan().getClanId());
+		}
+		else if(command.startsWith("_bbsclan_clannotice_disable"))
+		{
+			activeChar.getClan().setNoticeEnabled(false);
+			clanNotice(activeChar, activeChar.getClan().getClanId());
+		}
		else
		{
-			separateAndSend("<html><body><br><br><center>Commande : " + command + " pas encore implante</center><br><br></body></html>", activeChar);
+			separateAndSend("<html><body><br><br><center>Command : " + command + " needs core development</center><br><br></body></html>", activeChar);

		}
	}

+	private void clanNotice(L2PcInstance activeChar, int clanId)
+	{
+		L2Clan cl = ClanTable.getInstance().getClan(clanId);
+		if (cl != null)
+		{
+			if (cl.getLevel() < 2)
+			{
+				activeChar.sendPacket(new SystemMessage(SystemMessageId.NO_CB_IN_MY_CLAN));
+				parsecmd("_bbsclan_clanlist", activeChar);
+			}
+			else
+			{
+				final StringBuilder html = StringUtil.startAppend(2000,
+						"<html><body><br><br>" +
+						"<table border=0 width=610><tr><td width=10></td><td width=600 align=left>" +
+						"<a action=\"bypass _bbshome\">HOME</a> > " +
+						"<a action=\"bypass _bbsclan_clanlist\"> CLAN COMMUNITY </a>  > " +
+						"<a action=\"bypass _bbsclan_clanhome;",
+						String.valueOf(clanId),
+						"\"> &$802; </a>" +
+						"</td></tr>" +
+						"</table>"
+						);
+				if(activeChar.isClanLeader())
+				{
+					StringUtil.append(html,
+							"<br><br><center>" +
+							"<table width=610 border=0 cellspacing=0 cellpadding=0>" +
+							"<tr><td fixwidth=610><font color=\"AAAAAA\">The Clan Notice function allows the clan leader to send messages through a pop-up window to clan members at login.</font> </td></tr>" +
+							"<tr><td height=20></td></tr>"
+							);
+					
+					if(activeChar.getClan().isNoticeEnabled())
+						StringUtil.append(html, "<tr><td fixwidth=610> Clan Notice Function:   on   /   <a action=\"bypass _bbsclan_clannotice_disable\">off</a>");
+					else
+						StringUtil.append(html, "<tr><td fixwidth=610> Clan Notice Function:   <a action=\"bypass _bbsclan_clannotice_enable\">on</a>   /   off");
+					
+					StringUtil.append(html,
+							"</td></tr>" +
+							"</table>" +
+							"<img src=\"L2UI.Squaregray\" width=\"610\" height=\"1\">" +
+							"<br> <br>" +
+							"<table width=610 border=0 cellspacing=2 cellpadding=0>" +
+							"<tr><td>Edit Notice: </td></tr>" +
+							"<tr><td height=5></td></tr>" +
+							"<tr><td>" +
+							"<MultiEdit var =\"Content\" width=610 height=100>" +
+							"</td></tr>" +
+							"</table>" +
+							"<br>" +
+							"<table width=610 border=0 cellspacing=0 cellpadding=0>" +
+							"<tr><td height=5></td></tr>" +
+							"<tr>" +
+							"<td align=center FIXWIDTH=65><button value=\"&$140;\" action=\"Write Notice Set _ Content Content Content\" back=\"l2ui_ch3.smallbutton2_down\" width=65 height=20 fore=\"l2ui_ch3.smallbutton2\" ></td>" +
+							"<td align=center FIXWIDTH=45></td>" +
+							"<td align=center FIXWIDTH=500></td>" +
+							"</tr>" +
+							"</table>" +
+							"</center>" +
+							"</body>" +
+							"</html>"
+							);
+					send1001(html.toString(), activeChar);
+					send1002(activeChar,activeChar.getClan().getNotice()," ","0");
+				}
+				else
+				{
+					StringUtil.append(html,
+							"<img src=\"L2UI.squareblank\" width=\"1\" height=\"10\">" +
+							"<center>" +
+							"<table border=0 cellspacing=0 cellpadding=0><tr>" +
+							"<td>You are not your clan's leader, and therefore cannot change the clan notice</td>" +
+							"</tr></table>"
+							);
+					if (activeChar.getClan().isNoticeEnabled())
+					{
+						StringUtil.append(html, 
+								"<table border=0 cellspacing=0 cellpadding=0>" +
+								"<tr>" +
+								"<td>The current clan notice:</td>" +
+								"</tr>" +
+								"<tr><td fixwidth=5></td>" +
+								"<td FIXWIDTH=600 align=left>" +
+								activeChar.getClan().getNotice() +
+								"</td>" +
+								"<td fixqqwidth=5></td>" +
+								"</tr>" +
+								"</table>"
+								);
+					}
+					StringUtil.append(html,
+							"</center>" +
+							"</body>" +
+							"</html>"
+							);
+					separateAndSend(html.toString(), activeChar);
+				}
+			}
+		}
+	}
	/**
	 * @param activeChar
	 */
@@ -281,7 +395,7 @@
                                     "<a action=\"bypass _bbsclan_clanhome;",
                                     String.valueOf(clanId),
                                     ";cmail\">[CLAN MAIL]</a>  " +
-                                    "<a action=\"bypass _bbsclan_clanhome;",
+                                    "<a action=\"bypass _bbsclan_clannotice_edit;",
                                     String.valueOf(clanId),
                                     ";cnotice\">[CLAN NOTICE]</a>  " +
                                     "</td>" +
@@ -367,7 +481,11 @@
	public void parsewrite(String ar1, String ar2, String ar3, String ar4, String ar5, L2PcInstance activeChar)
	{
		// TODO Auto-generated method stub
-		
+		if (ar1.equals("Set"))
+		{
+			activeChar.getClan().setNotice(ar4);
+			parsecmd("_bbsclan_clanhome;" + activeChar.getClan().getClanId(),activeChar);
+		}
	}

}
\ No newline at end of file
Index: java/net/sf/l2j/gameserver/communitybbs/CommunityBoard.java
===================================================================
--- java/net/sf/l2j/gameserver/communitybbs/CommunityBoard.java	(revision 2819)
+++ java/net/sf/l2j/gameserver/communitybbs/CommunityBoard.java	(working copy)
@@ -129,6 +129,10 @@
				{
					RegionBBSManager.getInstance().parsewrite(arg1, arg2, arg3, arg4, arg5, activeChar);
				}
+				else if (url.equals("Notice"))
+				{
+					ClanBBSManager.getInstance().parsewrite(arg1, arg2, arg3, arg4, arg5, activeChar);
+				}
				else
				{
					ShowBoard sb = new ShowBoard("<html><body><br><br><center>the command: " + url + " is not implemented yet</center><br><br></body></html>", "101");

That is the patch ..

Sql file :

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for clan_notices
-- ----------------------------
CREATE TABLE `clan_notices` (
  `clanID` int(32) NOT NULL,
  `notice` varchar(512) NOT NULL,
  `enabled` varchar(5) NOT NULL,
  PRIMARY KEY  (`clanID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Posted

its working. I got it on live server.

Thx vago ! I will add this on the first post.

  • 2 months later...
  • 4 weeks later...
  • 5 months later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



  • Posts

    • Good luck with your project!
    • Hola Fissban , che queria preguntarte algo estoy tratando de hacer que el testserver ande pro que cuando logeo y voy a elejir el servidor no aparece y he estado con la ia incluso buscando que puede ser pero no e logrado decifrarlo me darias una mano o alguien ?  
    • The Return of L2Elixir – A Legacy Reborn in 2025 Read more features: https://l2elixir.org/features/ It’s time to relive the magic. Many of you remember L2Elixir, first launched in 2008 – a server that brought players together, created friendships, rivalries, and unforgettable memories. For two+ incredible years, until its closure in 2010, Elixir was more than just a server… it was home. In 2018, a fake project borrowed the name and damaged that legacy, but the true memories of L2Elixir never died. Today, in 2025, we are proud to announce that a new dedicated team has taken up the mantle to bring L2Elixir back to life – with respect for the past and a fresh vision for the future.   What to Expect We’re not here to be “just another server.” Our mission is to bring back nostalgia with innovation, offering a unique progression experience: Interlude-Like start, capturing that classic old-school feeling. A natural evolution into Gracia Final. Followed by Gracia Epilogue, keeping the journey alive without losing balance. This is not a copy-paste server – it’s a carefully crafted world designed to honor the spirit of Lineage II while introducing fresh ideas to keep the gameplay alive and rewarding. Why L2Elixir? A balanced environment where community comes first. A project built with passion, not profit. A server that values longevity, fairness, and nostalgia.   📅 Launch Date & Details Closed Beta: Online. Open Beta & Rewards: November 15 & 21:00 UTC +2 Launch: November 28 & 21:00 UTC +2   🔗 Join the Community Be part of history once again. Follow our Discord, join the discussion, and prepare to step back into the world where legends were made.   https://l2elixir.org/ https://discord.gg/5ydPHvhbxs L2Elixir 2025 – Honoring the Past. Building the Future.
    • 10-24-2025 - OUR TOPIC IS RELEVANT! CONTACT US BY THE CONTACTS BELOW
    • Can someone decompile in classes this LineageSkilleffect.u ? I am willing to pay if needed,  protocol god any. https://wormhole.app/BEj0pr#osVXtnL9Q-AmmVmxOcEZfw found, ty
  • Topics

×
×
  • Create New...

AdBlock Extension Detected!

Our website is made possible by displaying online advertisements to our members.

Please disable AdBlock browser extension first, to be able to use our community.

I've Disabled AdBlock