### Eclipse Workspace Patch 1.0
#P aCis_datapack
Index: data/html/admin/main_menu.htm
===================================================================
--- data/html/admin/main_menu.htm   (revision 30)
+++ data/html/admin/main_menu.htm   (working copy)
@@ -43,7 +43,7 @@
            <td><button value="Set Name" action="bypass -h admin_setname $menu_command" width=55 height=15 back="sek.cbui94" fore="sek.cbui92"></td>
            <td><button value="Set Title" action="bypass -h admin_settitle $menu_command" width=55 height=15 back="sek.cbui94" fore="sek.cbui92"></td>
            <td><button value="Get Buffs" action="bypass -h admin_getbuffs $menu_command" width=55 height=15 back="sek.cbui94" fore="sek.cbui92"></td>
-           <td></td>
+           <td><button value="Search" action="bypass -h admin_search" width=55 height=15 back="sek.cbui94" fore="sek.cbui92"></td>
        </tr>
    </table>
    <br><img src="L2UI_CH3.herotower_deco" width=256 height=32><br>
Index: data/html/admin/search.htm
===================================================================
--- data/html/admin/search.htm  (revision 0)
+++ data/html/admin/search.htm  (working copy)
@@ -0,0 +1,19 @@
+<html><title>Search menu</title><body><center>
+<table width=260>
+   <tr>
+       <td><button value="Main" action="bypass -h admin_admin" width=65 height=19 back="L2UI_ch3.smallbutton2_over" fore="L2UI_ch3.smallbutton2"></td>
+       <td><button value="Game" action="bypass -h admin_admin 2" width=65 height=19 back="L2UI_ch3.smallbutton2_over" fore="L2UI_ch3.smallbutton2"></td>
+       <td><button value="Effects" action="bypass -h admin_admin 3" width=65 height=19 back="L2UI_ch3.smallbutton2_over" fore="L2UI_ch3.smallbutton2"></td>
+       <td><button value="Server" action="bypass -h admin_admin 4" width=65 height=19 back="L2UI_ch3.smallbutton2_over" fore="L2UI_ch3.smallbutton2"></td>
+   </tr>
+</table>
+<img src="l2ui.SquareWhite" width=275 height=1><br>
+<table width=274>
+   <tr>
+       <td width=204><multiedit var="search" width=204 height=15></td>
+       <td width=70><button value="Search" action="bypass -h admin_search 1 $search" width=65 height=19 back="L2UI_ch3.smallbutton2_over" fore="L2UI_ch3.smallbutton2"></td>
+   </tr>
+</table><br>
+<img src=L2UI.SquareGray width=280 height=1>
+%list%
+</body></html>
\ No newline at end of file
Index: data/xml/adminCommands.xml
===================================================================
--- data/xml/adminCommands.xml  (revision 30)
+++ data/xml/adminCommands.xml  (working copy)
@@ -251,6 +251,9 @@
    <aCar name="admin_ride" accessLevel="7"/>
    <aCar name="admin_unride" accessLevel="7"/>
 
+   <!-- SEARCH -->
+   <aCar name="admin_search" accessLevel="7"/>
+   
    <!-- SHOP -->
    <aCar name="admin_buy" accessLevel="7"/>
    <aCar name="admin_gmshop" accessLevel="7"/>
#P aCis_gameserver
Index: java/net/sf/l2j/gameserver/data/xml/ItemData.java
===================================================================
--- java/net/sf/l2j/gameserver/data/xml/ItemData.java   (revision 30)
+++ java/net/sf/l2j/gameserver/data/xml/ItemData.java   (working copy)
@@ -75,6 +75,14 @@
    }
    
    /**
+    * @return the list of all {@link Item} templates.
+    */
+   public Item[] getTemplates()
+   {
+       return _templates;
+   }
+   
+   /**
     * @param id : the item id to check.
     * @return the {@link Item} corresponding to the item id.
     */
Index: java/net/sf/l2j/gameserver/handler/AdminCommandHandler.java
===================================================================
--- java/net/sf/l2j/gameserver/handler/AdminCommandHandler.java (revision 30)
+++ java/net/sf/l2j/gameserver/handler/AdminCommandHandler.java (working copy)
@@ -38,6 +38,7 @@
 import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminPolymorph;
 import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminRes;
 import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminRideWyvern;
+import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminSearch;
 import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminShop;
 import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminSiege;
 import net.sf.l2j.gameserver.handler.admincommandhandlers.AdminSkill;
@@ -87,6 +88,7 @@
        registerHandler(new AdminPolymorph());
        registerHandler(new AdminRes());
        registerHandler(new AdminRideWyvern());
+       registerHandler(new AdminSearch());
        registerHandler(new AdminShop());
        registerHandler(new AdminSiege());
        registerHandler(new AdminSkill());
Index: java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminSearch.java
===================================================================
--- java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminSearch.java    (revision 0)
+++ java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminSearch.java    (working copy)
@@ -0,0 +1,101 @@
+package net.sf.l2j.gameserver.handler.admincommandhandlers;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.StringTokenizer;
+import java.util.stream.Collectors;
+
+import net.sf.l2j.commons.math.MathUtil;
+
+import net.sf.l2j.gameserver.data.xml.ItemData;
+import net.sf.l2j.gameserver.handler.IAdminCommandHandler;
+import net.sf.l2j.gameserver.model.actor.Player;
+import net.sf.l2j.gameserver.model.item.kind.Item;
+import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
+
+public class AdminSearch implements IAdminCommandHandler
+{
+   private static final int PAGE_LIMIT = 6;
+   
+   private static final String[] ADMIN_COMMANDS =
+   {
+       "admin_search"
+   };
+   
+   @Override
+   public boolean useAdminCommand(String command, Player activeChar)
+   {
+       final NpcHtmlMessage html = new NpcHtmlMessage(0);
+       html.setFile("data/html/admin/search.htm");
+       
+       if (command.equals("admin_search"))
+           html.replace("%list%", "<center><br><br><br>Set first an key word</center>");
+       else if (command.startsWith("admin_search"))
+       {
+           StringTokenizer st = new StringTokenizer(command, " ");
+           st.nextToken();
+           
+           int page = Integer.valueOf(st.nextToken());
+           if (st.hasMoreTokens())
+           {
+               StringBuilder sb = new StringBuilder(String.valueOf(page));
+               StringBuilder list = getList(activeChar, page, command.substring(14 + sb.length()));
+               html.replace("%list%", list == null ? "" : list.toString());
+           }
+           else
+               html.replace("%list%", "<center><br><br><br>Set first an key word</center>");
+       }
+       activeChar.sendPacket(html);
+       return true;
+   }
+   
+   public StringBuilder getList(Player activeChar, int page, String search)
+   {
+       List<Item> items = Arrays.asList(ItemData.getInstance().getTemplates()).stream().filter(item -> item != null && matches(item.getName(), search)).collect(Collectors.toList());
+       
+       if (items == null || items.isEmpty())
+           return new StringBuilder("<center><br><br><br>There its no item : <font color=LEVEL>" + search + "</font></center>");
+       
+       final int max = Math.min(100, MathUtil.countPagesNumber(items.size(), PAGE_LIMIT));
+       items = items.subList((page - 1) * PAGE_LIMIT, Math.min(page * PAGE_LIMIT, items.size()));
+       
+       final StringBuilder sb = new StringBuilder();
+       
+       int row = 0;
+       for (Item item : items)
+       {
+           String name = item.getName();
+           
+           if (name.length() >= 43)
+               name = name.substring(0, 40) + "...";
+           
+           sb.append("<table width=280 bgcolor=000000><tr>");
+           sb.append("<td width=44 height=41 align=center><table bgcolor=FFFFFF cellpadding=6 cellspacing=\"-5\"><tr><td><button width=32 height=32 back=" + item.getIcon() + " fore=" + item.getIcon() + "></td></tr></table></td>");
+           sb.append("<td width=236>" + name + "<br1><font color=B09878>Item ID : " + item.getItemId() + " " + (item.isQuestItem() ? "(Quest Item)" : "") + "</font></td>");
+           sb.append("</tr></table><img src=L2UI.SquareGray width=280 height=1>");
+           row++;
+       }
+       
+       for (int i = PAGE_LIMIT; i > row; i--)
+           sb.append("<img height=42>");
+       
+       // Build page footer.
+       sb.append("<img height=2><img src=L2UI.SquareGray width=280 height=1><table width=280 bgcolor=000000><tr>");
+       sb.append("<td align=right width=70>" + (page > 1 ? "<button value=\"< PREV\" action=\"bypass admin_search " + (page - 1) + " " + search + "\" width=65 height=19 back=L2UI_ch3.smallbutton2_over fore=L2UI_ch3.smallbutton2>" : "") + "</td>");
+       sb.append("<td align=center width=100>Page " + page + "</td>");
+       sb.append("<td align=left width=70>" + (page < max ? "<button value=\"NEXT >\" action=\"bypass admin_search " + (page + 1) + " " + search + "\" width=65 height=19 back=L2UI_ch3.smallbutton2_over fore=L2UI_ch3.smallbutton2>" : "") + "</td>");
+       sb.append("</tr></table><img src=L2UI.SquareGray width=280 height=1>");
+       return sb;
+   }
+   
+   public static boolean matches(String name, String search)
+   {
+       return Arrays.stream(search.toLowerCase().split(" ")).allMatch(result -> name.toLowerCase().contains(result));
+   }
+   
+   @Override
+   public String[] getAdminCommandList()
+   {
+       return ADMIN_COMMANDS;
+   }
+}