L2JMobius

High Five Community Board

Deving · 6 · 1511

Offline Deving

  • Vassal
  • *
    • Posts: 6
I’d like to share my contribution to the community. I’ve added several services to the Community Board: Class Master, Subclass Master, a server statistics display service, and a name/title color customization service. It’s my small way of giving back.

I will post new services here: https://gitea.com/Debug/ShadowCraftCore


https://pastebin.com/hU2n5jNf




Offline mateuspereira

  • Vassal
  • *
    • Posts: 2
Hey friend, I compiled it from your Git, but it's giving an error when creating a character.

Quote
[27/05 12:39:34] Could not insert char data: Parameter index out of range (39 > number of parameters, which is 38).
java.sql.SQLException: Parameter index out of range (39 > number of parameters, which is 38).
   at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:121)
   at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
   at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:81)
   at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:55)
   at com.mysql.cj.jdbc.ClientPreparedStatement.checkBounds(ClientPreparedStatement.java:1482)
   at com.mysql.cj.jdbc.ClientPreparedStatement.getCoreParameterIndex(ClientPreparedStatement.java:1497)
   at com.mysql.cj.jdbc.ClientPreparedStatement.setLong(ClientPreparedStatement.java:1780)
   at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.setLong(HikariProxyPreparedStatement.java)
   at org.l2jmobius.gameserver.model.actor.Player.createDb(Player.java:6899)
   at org.l2jmobius.gameserver.model.actor.Player.create(Player.java:1019)
   at org.l2jmobius.gameserver.network.clientpackets.CharacterCreate.runImpl(CharacterCreate.java:237)
   at org.l2jmobius.gameserver.network.clientpackets.ClientPacket.run(ClientPacket.java:57)
   at org.l2jmobius.commons.network.PacketExecutor$PacketRunnable.run(PacketExecutor.java:74)
   at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1095)
   at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:619)
   at java.base/java.lang.Thread.run(Thread.java:1447)

[27/05 12:39:34] Client: [Account: mateus95 - IP: 127.0.0.1] - Failed running: CharacterCreate ; Cannot invoke "org.l2jmobius.gameserver.model.actor.Player.getMaxHp()" because "newChar" is null
[27/05 12:39:34] java.lang.NullPointerException: Cannot invoke "org.l2jmobius.gameserver.model.actor.Player.getMaxHp()" because "newChar" is null
   at org.l2jmobius.gameserver.network.clientpackets.CharacterCreate.runImpl(CharacterCreate.java:241)
   at org.l2jmobius.gameserver.network.clientpackets.ClientPacket.run(ClientPacket.java:57)
   at org.l2jmobius.commons.network.PacketExecutor$PacketRunnable.run(PacketExecutor.java:74)
   at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1095)
   at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:619)
   at java.base/java.lang.Thread.run(Thread.java:1447)


Offline Deving

  • Vassal
  • *
    • Posts: 6
Fixed bug with number of parameters in createDb()
Code: [Select]
From 9839c9798d115b945ceb937c7cb46d62c4faeb51 Mon Sep 17 00:00:00 2001
From: Debug <[email protected]>
Date: Wed, 28 May 2025 20:01:30 +0300
Subject: [PATCH] no message

---
 java/org/l2jmobius/gameserver/model/actor/Player.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/java/org/l2jmobius/gameserver/model/actor/Player.java b/java/org/l2jmobius/gameserver/model/actor/Player.java
index 60106e88..c4ec2bf4 100644
--- a/java/org/l2jmobius/gameserver/model/actor/Player.java
+++ b/java/org/l2jmobius/gameserver/model/actor/Player.java
@@ -377,7 +377,7 @@ public class Player extends Playable
  private static final String DELETE_ITEM_REUSE_SAVE = "DELETE FROM character_item_reuse_save WHERE charId=?";
 
  // Character Character SQL String Definitions:
- private static final String INSERT_CHARACTER = "INSERT INTO characters (account_name,charId,char_name,level,maxHp,curHp,maxCp,curCp,maxMp,curMp,face,hairStyle,hairColor,sex,exp,sp,karma,fame,pvpkills,pkkills,clanid,race,classid,deletetime,cancraft,title,title_color,name_color,accesslevel,online,isin7sdungeon,clan_privs,wantspeace,base_class,newbie,nobless,power_grade,createDate,lastAccess) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
+ private static final String INSERT_CHARACTER = "INSERT INTO characters (account_name,charId,char_name,level,maxHp,curHp,maxCp,curCp,maxMp,curMp,face,hairStyle,hairColor,sex,exp,sp,karma,fame,pvpkills,pkkills,clanid,race,classid,deletetime,cancraft,title,title_color,accesslevel,online,isin7sdungeon,clan_privs,wantspeace,base_class,newbie,nobless,power_grade,createDate,lastAccess) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
  private static final String UPDATE_CHARACTER = "UPDATE characters SET level=?,maxHp=?,curHp=?,maxCp=?,curCp=?,maxMp=?,curMp=?,face=?,hairStyle=?,hairColor=?,sex=?,heading=?,x=?,y=?,z=?,exp=?,expBeforeDeath=?,sp=?,karma=?,fame=?,pvpkills=?,pkkills=?,clanid=?,race=?,classid=?,deletetime=?,title=?,title_color=?,name_color=?,accesslevel=?,online=?,isin7sdungeon=?,clan_privs=?,wantspeace=?,base_class=?,onlinetime=?,newbie=?,nobless=?,power_grade=?,subpledge=?,lvl_joined_academy=?,apprentice=?,sponsor=?,clan_join_expiry_time=?,clan_create_expiry_time=?,char_name=?,death_penalty_level=?,bookmarkslot=?,vitality_points=?,language=?,faction=?,pccafe_points=? WHERE charId=?";
  private static final String RESTORE_CHARACTER = "SELECT * FROM characters WHERE charId=?";
 
--
2.46.0.windows.1

Thanks for your vigilance


Offline Deving

  • Vassal
  • *
    • Posts: 6
I’d like to share my contribution to the community. I’ve added several services to the Community Board: Class Master, Subclass Master, a server statistics display service, and a name/title color customization service. It’s my small way of giving back.

I will post new services here: https://gitea.com/Debug/ShadowCraftCore


https://pastebin.com/hU2n5jNf

Add Nobles

Code: [Select]
From d2ecbcceda778f264c3d69c29e5ccfa4820674a6 Mon Sep 17 00:00:00 2001
From: Debug <[email protected]>
Date: Tue, 27 May 2025 20:55:33 +0300
Subject: [PATCH] Added the ability to obtain nobleman status through the
 community board

---
 dist/game/config/Custom/CommunityBoard.ini    |  12 ++
 .../CommunityBoard/Custom/navigation.html     |   4 +
 .../handlers/communityboard/HomeBoard.java    |  11 +-
 .../handlers/communityboard/NoblessBoard.java | 105 ++++++++++++++++++
 java/org/l2jmobius/Config.java                |   8 ++
 5 files changed, 138 insertions(+), 2 deletions(-)
 create mode 100644 dist/game/data/scripts/handlers/communityboard/NoblessBoard.java

diff --git a/dist/game/config/Custom/CommunityBoard.ini b/dist/game/config/Custom/CommunityBoard.ini
index 7a8f2ff0..b3118fc1 100644
--- a/dist/game/config/Custom/CommunityBoard.ini
+++ b/dist/game/config/Custom/CommunityBoard.ini
@@ -40,6 +40,18 @@ ColorChangeColors = 00FF00,FF9900,000000,00FFFF,000080,87CEFA,98FF98,808080,FFFF
 
 ColorChangeColorNames = Зелёный,Оранжевый,Чёрный,Бирюзовый,Темно-синий,Голубой,Мятный,Серый,Жёлтый,Розовый
 
+# Enables or disables Noblesse service via Community Board
+NoblesseService = true
+
+# Item ID required to obtain Noblesse status
+NoblesseItemId = 57
+
+# Number of items required for Noblesse
+NoblesseItemCount = 100000000
+
+# Tiara item ID granted upon becoming Noblesse
+NoblesseTiaraId = 7694
+
 # Currency used by the Community Board (itemId).
 # Default: 57 (Adena)
 CommunityCurrencyId = 57
diff --git a/dist/game/data/html/CommunityBoard/Custom/navigation.html b/dist/game/data/html/CommunityBoard/Custom/navigation.html
index 7832fa44..fa59773a 100644
--- a/dist/game/data/html/CommunityBoard/Custom/navigation.html
+++ b/dist/game/data/html/CommunityBoard/Custom/navigation.html
@@ -35,4 +35,8 @@
 <tr>
  <td><button value="Top" action="bypass _bbstopboard" width=200 height=30 back="L2UI_CT1.OlympiadWnd_DF_Reward_Down" fore="L2UI_CT1.OlympiadWnd_DF_Reward"></td>
 </tr>
+<tr>
+<td>
+  <button value="BuyNobless" action="bypass _bbspurchase_noblesse" width=200 height=30 back="L2UI_CT1.OlympiadWnd_DF_Reward_Down" fore="L2UI_CT1.OlympiadWnd_DF_Reward">
+</td>
 </table>
\ No newline at end of file
diff --git a/dist/game/data/scripts/handlers/communityboard/HomeBoard.java b/dist/game/data/scripts/handlers/communityboard/HomeBoard.java
index 4249a880..aa142c43 100644
--- a/dist/game/data/scripts/handlers/communityboard/HomeBoard.java
+++ b/dist/game/data/scripts/handlers/communityboard/HomeBoard.java
@@ -58,7 +58,7 @@ import org.l2jmobius.gameserver.network.serverpackets.ShowBoard;
 
 /**
  * Home board.
- * @author Zoey76, Mobius
+ * @author Zoey76, Mobius. Druid
  */
 public class HomeBoard implements IParseBoardHandler
 {
@@ -69,6 +69,7 @@ public class HomeBoard implements IParseBoardHandler
  private final TopBoard topBoard = new TopBoard();
  private final SubClassMasterBoard subClassMasterBoard = new SubClassMasterBoard();
  private final ColorChangeBoard colorChangeBoard = new ColorChangeBoard();
+ private final NoblessBoard noblessBoard = new NoblessBoard();
 
  private static final String[] COMMANDS =
  {
@@ -103,7 +104,7 @@ public class HomeBoard implements IParseBoardHandler
  };
 
  private static final Predicate<Player> KARMA_CHECK = player -> Config.COMMUNITYBOARD_KARMA_DISABLED && (player.getKarma() > 0);
-
+
  [member=79]override[/member]
  public String[] getCommunityBoardCommands()
  {
@@ -114,6 +115,7 @@ public class HomeBoard implements IParseBoardHandler
  commands.addAll(Arrays.asList(topBoard.getCommunityBoardCommands()));
  commands.addAll(Arrays.asList(subClassMasterBoard.getCommunityBoardCommands()));
  commands.addAll(Arrays.asList(colorChangeBoard.getCommunityBoardCommands()));
+ commands.addAll(Arrays.asList(noblessBoard.getCommunityBoardCommands()));
  return commands.stream().filter(Objects::nonNull).toArray(String[]::new);
  }
 
@@ -173,6 +175,11 @@ public class HomeBoard implements IParseBoardHandler
  return colorChangeBoard.parseCommunityBoardCommand(command, player);
  }
 
+ if (command.startsWith("_bbspurchase_noblesse"))
+ {
+ return noblessBoard.parseCommunityBoardCommand(command, player);
+ }
+
  else if (command.startsWith("_bbstop;"))
  {
  final String customPath = Config.CUSTOM_CB_ENABLED ? "Custom/" : "";
diff --git a/dist/game/data/scripts/handlers/communityboard/NoblessBoard.java b/dist/game/data/scripts/handlers/communityboard/NoblessBoard.java
new file mode 100644
index 00000000..8586b18c
--- /dev/null
+++ b/dist/game/data/scripts/handlers/communityboard/NoblessBoard.java
@@ -0,0 +1,105 @@
+package handlers.communityboard;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.data.xml.ItemData;
+import org.l2jmobius.gameserver.handler.IParseBoardHandler;
+import org.l2jmobius.gameserver.handler.CommunityBoardHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.model.item.ItemTemplate;
+import org.l2jmobius.gameserver.model.item.enums.ItemProcessType;
+import org.l2jmobius.gameserver.model.item.instance.Item;
+import org.l2jmobius.gameserver.network.serverpackets.MagicSkillUse;
+
+/**
+ * @author Debug
+ */
+
+public class NoblessBoard implements IParseBoardHandler
+{
+    private static final String[] COMMANDS = {
+            "_bbspurchase_noblesse",
+            "_bbspurchase_noblesse_yes"
+    };
+
+    // Настройки
+    final int ITEM_ID = Config.NOBLESSE_ITEM_ID;
+    final long ITEM_COUNT = Config.NOBLESSE_ITEM_COUNT;
+    final int TIARA_ID = Config.NOBLESSE_TIARA_ID;
+
+    [member=79]override[/member]
+    public String[] getCommunityBoardCommands()
+    {
+        return COMMANDS;
+    }
+
+    [member=79]override[/member]
+    public boolean parseCommunityBoardCommand(String command, Player player)
+    {
+        if (!Config.NOBLESSE_SERVICE)
+        {
+            CommunityBoardHandler.separateAndSend("<html><body><center><br><font color=FF0000>Сервис дворянства отключён</font><br></center></body></html>", player);
+            return false;
+        }
+
+        StringBuilder sb = new StringBuilder();
+        sb.append("<html><body><center>");
+
+        if (command.equals("_bbspurchase_noblesse"))
+        {
+            sb.append("<br><font color=LEVEL>Вы хотите стать дворянином?</font><br><br>");
+            sb.append("Стоимость: <font color=LEVEL>").append(String.format("%,d", ITEM_COUNT)).append("</font> аден.<br><br>");
+            sb.append("<table><tr>");
+            sb.append("<td><button value=\"Да\" action=\"bypass _bbspurchase_noblesse_yes\" width=80 height=25 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
+            sb.append("<td><button value=\"Нет\" action=\"bypass _bbshome\" width=80 height=25 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
+            sb.append("</tr></table>");
+        }
+        else if (command.equals("_bbspurchase_noblesse_yes"))
+        {
+            sb.append("<br><font color=LEVEL>Покупка Дворянства</font><br><br>");
+
+            if (player.isNoble())
+            {
+                sb.append("Вы уже являетесь дворянином.<br>");
+            }
+            else
+            {
+                long playerCount = player.getInventory().getInventoryItemCount(ITEM_ID, -1);
+                if (playerCount >= ITEM_COUNT)
+                {
+                    Item destroyed = player.getInventory().destroyItemByItemId(ItemProcessType.FEE, ITEM_ID, ITEM_COUNT, player, null);
+
+                    if (destroyed != null)
+                    {
+                        player.setNoble(true);
+                        player.broadcastPacket(new MagicSkillUse(player, 5103, 1, 0, 0));
+                        player.addItem(ItemProcessType.REWARD, TIARA_ID, 1, player, true);
+                        player.broadcastUserInfo();
+
+                        ItemTemplate item = ItemData.getInstance().getTemplate(ITEM_ID);
+                        String itemName = (item != null) ? item.getName() : ("ID: " + ITEM_ID);
+                        player.sendMessage("Вы стали дворянином за " + String.format("%,d", ITEM_COUNT) + " " + itemName + ".");
+
+                        sb.append("<font color=LEVEL>Поздравляем! Вы стали дворянином!</font><br>");
+                    }
+                    else
+                    {
+                        sb.append("<font color=FF0000>Ошибка при списании средств.</font><br>");
+                        player.sendMessage("Ошибка при списании средств.");
+                    }
+                }
+                else
+                {
+                    sb.append("У вас недостаточно средств.<br>Необходимо: <font color=LEVEL>")
+                            .append(String.format("%,d", ITEM_COUNT))
+                            .append("</font> аден.<br>");
+                    player.sendMessage("Недостаточно адены. Требуется " + String.format("%,d", ITEM_COUNT) + " аден.");
+                }
+            }
+            sb.append("<br><button value=\"Назад\" action=\"bypass _bbshome\" width=80 height=25 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\">");
+        }
+
+        sb.append("</center></body></html>");
+        CommunityBoardHandler.separateAndSend(sb.toString(), player);
+        return true;
+    }
+}
diff --git a/java/org/l2jmobius/Config.java b/java/org/l2jmobius/Config.java
index 2c1f7768..68679a04 100644
--- a/java/org/l2jmobius/Config.java
+++ b/java/org/l2jmobius/Config.java
@@ -1190,6 +1190,10 @@ public class Config
  public static long COLOR_CHANGE_ITEM_AMOUNT;
  public static String[] COLOR_CHANGE_COLORS;
  public static String[] COLOR_CHANGE_COLOR_NAMES;
+ public static boolean NOBLESSE_SERVICE;
+ public static int NOBLESSE_ITEM_ID;
+ public static long NOBLESSE_ITEM_COUNT;
+ public static int NOBLESSE_TIARA_ID;
  public static int COMMUNITYBOARD_CURRENCY;
  public static boolean COMMUNITYBOARD_ENABLE_MULTISELLS;
  public static boolean COMMUNITYBOARD_ENABLE_TELEPORTS;
@@ -3047,6 +3051,10 @@ public class Config
  COLOR_CHANGE_ITEM_AMOUNT = communityBoardConfig.getInt("ColorChangeItemAmount", 100000);
  COLOR_CHANGE_COLORS = communityBoardConfig.getString("ColorChangeColors", "").split(",");
  COLOR_CHANGE_COLOR_NAMES = communityBoardConfig.getString("ColorChangeColorNames", "").split(",");
+ NOBLESSE_SERVICE = communityBoardConfig.getBoolean("NoblesseService", false);
+ NOBLESSE_ITEM_ID = communityBoardConfig.getInt("NoblesseItemId", 57);
+ NOBLESSE_ITEM_COUNT = communityBoardConfig.getInt("NoblesseItemCount", 100000000);
+ NOBLESSE_TIARA_ID = communityBoardConfig.getInt("NoblesseTiaraId", 7694);
  COMMUNITYBOARD_CURRENCY = communityBoardConfig.getInt("CommunityCurrencyId", 57);
  COMMUNITYBOARD_ENABLE_MULTISELLS = communityBoardConfig.getBoolean("CommunityEnableMultisells", true);
  COMMUNITYBOARD_ENABLE_TELEPORTS = communityBoardConfig.getBoolean("CommunityEnableTeleports", true);
--
2.46.0.windows.1




Offline Deving

  • Vassal
  • *
    • Posts: 6
add custum services visual change of armor (DressMY) =))