Noticias:

Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectate

Menú Principal

Gestor de Apariencia personalizada

Iniciado por Swarlog, Ago 19, 2022, 01:11 AM

Tema anterior - Siguiente tema

Swarlog


CitarCORE:

### Eclipse Workspace Patch 1.0
#P L2J_Server 2 latest
Index: java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
===================================================================
--- java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java    (revision 5537)
+++ java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java    (working copy)
@@ -316,8 +316,8 @@
 
    // 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,accesslevel,online,isin7sdungeon,clan_privs,wantspeace,base_class,newbie,nobless,power_grade,createDate) 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=?,accesslevel=?,online=?,isin7sdungeon=?,clan_privs=?,wantspeace=?,base_class=?,onlinetime=?,punish_level=?,punish_timer=?,newbie=?,nobless=?,power_grade=?,subpledge=?,lvl_joined_academy=?,apprentice=?,sponsor=?,varka_ketra_ally=?,clan_join_expiry_time=?,clan_create_expiry_time=?,char_name=?,death_penalty_level=?,bookmarkslot=?,vitality_points=?,language=? WHERE charId=?";
-    private static final String RESTORE_CHARACTER = "SELECT account_name, charId, char_name, 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, cancraft, title, title_color, accesslevel, online, char_slot, lastAccess, clan_privs, wantspeace, base_class, onlinetime, isin7sdungeon, punish_level, punish_timer, newbie, nobless, power_grade, subpledge, lvl_joined_academy, apprentice, sponsor, varka_ketra_ally,clan_join_expiry_time,clan_create_expiry_time,death_penalty_level,bookmarkslot,vitality_points,createDate,language FROM characters WHERE charId=?";
+    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=?,accesslevel=?,online=?,isin7sdungeon=?,clan_privs=?,wantspeace=?,base_class=?,onlinetime=?,punish_level=?,punish_timer=?,newbie=?,nobless=?,power_grade=?,subpledge=?,lvl_joined_academy=?,apprentice=?,sponsor=?,varka_ketra_ally=?,clan_join_expiry_time=?,clan_create_expiry_time=?,char_name=?,death_penalty_level=?,bookmarkslot=?,vitality_points=?,language=?,namec=? WHERE charId=?";
+    private static final String RESTORE_CHARACTER = "SELECT account_name, charId, char_name, 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, cancraft, title, title_color, accesslevel, online, char_slot, lastAccess, clan_privs, wantspeace, base_class, onlinetime, isin7sdungeon, punish_level, punish_timer, newbie, nobless, power_grade, subpledge, lvl_joined_academy, apprentice, sponsor, varka_ketra_ally,clan_join_expiry_time,clan_create_expiry_time,death_penalty_level,bookmarkslot,vitality_points,createDate,language,namec FROM characters WHERE charId=?"; //survey
 
    // Character Teleport Bookmark:
    private static final String INSERT_TP_BOOKMARK = "INSERT INTO character_tpbookmark (charId,Id,x,y,z,icon,tag,name) values (?,?,?,?,?,?,?,?)";
@@ -7240,6 +7240,9 @@
                player.setName(rset.getString("char_name"));
                player._lastAccess = rset.getLong("lastAccess");
             
+                // Appearance
+                player.setNamec(rset.getString("namec"));
+           
                player.getStat().setExp(rset.getLong("exp"));
                player.setExpBeforeDeath(rset.getLong("expBeforeDeath"));
                player.getStat().setLevel(rset.getByte("level"));
@@ -7314,7 +7317,7 @@
 
                player.setTitle(rset.getString("title"));
-                player.getAppearance().setTitleColor(rset.getInt("title_color"));
+                player.setTitlec(rset.getString("title_color"));
                player.setAccessLevel(rset.getInt("accesslevel"));
                player.setFistsWeaponItem(player.findFistsWeaponItem(activeClassId));
                player.setUptime(System.currentTimeMillis());
             
@@ -7781,7 +7784,7 @@
            statement.setInt(25, getClassId().getId());
            statement.setLong(26, getDeleteTimer());
            statement.setString(27, getTitle());
-            statement.setInt(28, getAppearance().getTitleColor());
+            statement.setString(28, getTitlec());
            statement.setInt(29, getAccessLevel().getLevel());
            statement.setInt(30, isOnlineInt());
            statement.setInt(31, isIn7sDungeon() ? 1 : 0);
@@ -7812,7 +7815,8 @@
            statement.setInt(50, getBookMarkSlot());
            statement.setInt(51, getVitalityPoints());
            statement.setString(52, getLang());
-            statement.setInt(53, getObjectId());
+            statement.setString(53, getNamec());
+            statement.setInt(54, getObjectId());
         
            statement.execute();
            statement.close();
@@ -14182,6 +14186,26 @@
            return true;
    }
 
+    // Appearance system start
+    public String _namec = "FFFFFF";
+    public String getNamec()
+    {
+        return _namec;
+    }
+    public void setNamec(String val)
+    {
+        _namec = val;
+    }
+    public String _titlec = "FFFFFF";
+    public String getTitlec()
+    {
+        return _titlec;
+    }
+    public void setTitlec(String val)
+    {
+        _titlec = val;
+    }    // Appearance system end
+
    public void teleportBookmarkAdd(int x,int y,int z,int icon, String tag, String name)
    {
        if(this == null)
Index: java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java
===================================================================
--- java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java    (revision 5526)
+++ java/com/l2jserver/gameserver/network/clientpackets/EnterWorld.java    (working copy)
@@ -447,29 +456,28 @@
                obj.sendPacket(sm);
            }
        }
-
+   
+        // Appearance
+        if (!activeChar.isGM())
+        {
+            activeChar.getAppearance().setNameColor(Integer.decode("0x" + activeChar.getNamec()));
+            activeChar.getAppearance().setTitleColor(Integer.decode("0x" + activeChar.getTitlec()));
+        }
        activeChar.sendPacket(SystemMessageId.WELCOME_TO_LINEAGE);
Index: java/com/l2jserver/gameserver/model/actor/instance/L2AppearanceInstance.java
===================================================================
--- java/com/l2jserver/gameserver/model/actor/instance/L2AppearanceInstance.java    (revision 0)
+++ java/com/l2jserver/gameserver/model/actor/instance/L2AppearanceInstance.java    (revision 0)
@@ -0,0 +1,370 @@
+/*
+ * 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 com.l2jserver.gameserver.model.actor.instance;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+
+import javolution.text.TextBuilder;
+
+import com.l2jserver.Config;
+import com.l2jserver.gameserver.ThreadPoolManager;
+import com.l2jserver.gameserver.communitybbs.Manager.RegionBBSManager;
+import com.l2jserver.gameserver.datatables.CharNameTable;
+import com.l2jserver.gameserver.instancemanager.TransformationManager;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.appearance.PcAppearance;
+import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
+import com.l2jserver.gameserver.network.communityserver.CommunityServerThread;
+import com.l2jserver.gameserver.network.communityserver.writepackets.WorldInfo;
+import com.l2jserver.gameserver.network.serverpackets.ExShowScreenMessage;
+import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
+import com.l2jserver.gameserver.network.serverpackets.PartySmallWindowAll;
+import com.l2jserver.gameserver.network.serverpackets.PartySmallWindowDeleteAll;
+import com.l2jserver.gameserver.util.Util;
+
+/**
+ *
+ * @author NeverMore
+ *
+ */
+public final class L2AppearanceInstance extends L2Npc
+{
+
+    public L2AppearanceInstance(int objectId, L2NpcTemplate template)
+    {
+        super(objectId, template);
+    }
+
+    @Override
+    public void onBypassFeedback(L2PcInstance player, String command)
+    {
+        if (player == null)
+        {
+            return;
+        }
+        if (command.startsWith("info"))
+        {
+            showInfoWindow(player);
+        }
+        if (command.startsWith("namec"))
+        {
+            try
+            {
+                String val = command.substring(6);
+                player.getAppearance().setNameColor(Integer.decode("0x" + val));
+                ExShowScreenMessage message = new ExShowScreenMessage("Your name color has been changed", 4000);
+                player.sendPacket(message);
+                player.sendMessage("Your name color has been changed");
+                player.broadcastUserInfo();
+                player.setNamec(val);
+            }
+            catch (Exception e)
+            { //Case of empty color or invalid hex string
+                ExShowScreenMessage message = new ExShowScreenMessage("You need to specify a valid new color.", 4000);
+                player.sendPacket(message);
+                player.sendMessage("You need to specify a valid new color.");
+            }
+            return;
+        }
+        if (command.startsWith("titlec"))
+        {
+            try
+            {
+                String val = command.substring(7);
+                player.getAppearance().setTitleColor(Integer.decode("0x" + val));
+                ExShowScreenMessage message = new ExShowScreenMessage("Your title color has been changed", 4000);
+                player.sendPacket(message);
+                player.sendMessage("Your title color has been changed");
+                player.broadcastUserInfo();
+                player.setTitlec(val);
+            }
+            catch (Exception e)
+            { //Case of empty color or invalid hex string
+                ExShowScreenMessage message = new ExShowScreenMessage("You need to specify a valid new color.", 4000);
+                player.sendPacket(message);
+                player.sendMessage("You need to specify a valid new color.");
+            }
+            return;
+        }
+        if (command.startsWith("name"))
+        {
+            try
+            {
+                String val = command.substring(5);
+                if (val.length() > 16)
+                {
+                    ExShowScreenMessage message1 = new ExShowScreenMessage("Name cannot be more than 16 characters", 4000);
+                    player.sendPacket(message1);
+                    return;
+                }
+                if (CharNameTable.getInstance().getIdByName(val) > 0)
+                {
+                    ExShowScreenMessage message = new ExShowScreenMessage("Problem, name "+val+" already exists! Try something else", 4000);
+                    player.sendPacket(message);
+                    player.sendMessage("Problem, name "+val+" already exists! Try something else");
+                    return;
+                }
+                if (Config.FORBIDDEN_NAMES.length > 1)
+                {
+                    for (String st : Config.FORBIDDEN_NAMES)
+                    {
+                        if (val.toLowerCase().contains(st.toLowerCase()))
+                        {
+                            ExShowScreenMessage message1 = new ExShowScreenMessage("This name is forbidden ,try something else.", 4000);
+                            player.sendPacket(message1);
+                            return;
+                        }
+                    }
+                }
+                if (!Util.isAlphaNumeric(val) || !isValidName(val))
+                {
+                    ExShowScreenMessage message1 = new ExShowScreenMessage("This name is not valid ,try something else.", 4000);
+                    player.sendPacket(message1);
+                    return;
+                }
+                player.setName(val);
+                player.store();
+       
+                ExShowScreenMessage message = new ExShowScreenMessage("You successfully changed your name to "+val+"", 4000);
+                player.sendPacket(message);           
+                player.sendMessage("You successfully changed your name to "+val);
+                player.broadcastUserInfo();
+                CommunityServerThread.getInstance().sendPacket(new WorldInfo(player, null, WorldInfo.TYPE_UPDATE_PLAYER_DATA));
+           
+                if (player.isInParty())
+                {
+                    // Delete party window for other party members
+                    player.getParty().broadcastToPartyMembers(player, PartySmallWindowDeleteAll.STATIC_PACKET);
+                    for (L2PcInstance member : player.getParty().getMembers())
+                    {
+                        // And re-add
+                        if (member != player)
+                            member.sendPacket(new PartySmallWindowAll(member, player.getParty()));
+                    }
+                }
+                if (player.getClan() != null)
+                {
+                    player.getClan().broadcastClanStatus();
+                }           
+                RegionBBSManager.getInstance().changeCommunityBoard();
+                return;
+            }
+            catch (Exception e)
+            { //Case of empty name
+                ExShowScreenMessage message = new ExShowScreenMessage("Enter the Name into the box.", 4000);
+                player.sendPacket(message);
+                player.sendMessage("Enter the Name into the box.");
+            }
+        }
+        if (command.startsWith("sex"))
+        {
+            player.getAppearance().setSex(player.getAppearance().getSex() ? false : true);
+            ExShowScreenMessage message = new ExShowScreenMessage("Your gender has been changed!", 4000);
+            player.sendPacket(message);
+            player.sendMessage("Your gender has been changed!");
+            player.broadcastUserInfo();
+            // Transform-untransorm player quickly to force the client to reload the character textures
+            TransformationManager.getInstance().transformPlayer(105, player);
+            ThreadPoolManager.getInstance().scheduleGeneral(new Untransform(player), 200);
+            return;
+        }
+        if (command.startsWith("face"))
+        {
+            try
+            {
+                String val = command.substring(5);
+                int faceVal = Integer.parseInt(val);
+                if ((faceVal != 0) && (faceVal != 1) && (faceVal != 2))
+                {
+                    ExShowScreenMessage message1 = new ExShowScreenMessage("Invalid face id | Possible id's (0,1,2)", 4000);
+                    player.sendPacket(message1);
+                    return;
+                }
+                if (faceVal == PcAppearance.getFace())
+                {
+                    ExShowScreenMessage message1 = new ExShowScreenMessage(" Id " + faceVal + " is your current face id ! Try something else ! ", 4000);
+                    player.sendPacket(message1);
+                    return;
+                }
+                PcAppearance.setFace(faceVal);
+                ExShowScreenMessage message = new ExShowScreenMessage("Your face id has been changed!", 4000);
+                player.sendPacket(message);
+                player.sendMessage("Your face id has been changed!");
+                player.broadcastUserInfo();
+                // Transform-untransorm player quickly to force the client to reload the character textures
+                TransformationManager.getInstance().transformPlayer(105, player);
+                ThreadPoolManager.getInstance().scheduleGeneral(new Untransform(player), 200);
+
+            }
+            catch (Exception e)
+            { //Case of empty id or invalid id
+                ExShowScreenMessage message1 = new ExShowScreenMessage("Fill into the box the face id (0,1,2).", 4000);
+                player.sendPacket(message1);
+                player.sendMessage("Fill into the box the face id (0,1,2).");
+            }   
+        }
+        if (command.startsWith("hair"))
+        {
+            try
+            {
+                String val = command.substring(5);
+                int hairVal = Integer.parseInt(val);
+                if ((hairVal != 0) && (hairVal != 1) && (hairVal != 2) && (hairVal != 3))
+                {
+                    ExShowScreenMessage message1 = new ExShowScreenMessage("Invalid hair id | Possible id's (0,1,2,3)", 4000);
+                    player.sendPacket(message1);
+                    return;
+                }
+                if (hairVal == PcAppearance.getHairStyle())
+                {
+                    ExShowScreenMessage message1 = new ExShowScreenMessage(" Id " + hairVal + " is your current hair id ! Try something else ! ", 4000);
+                    player.sendPacket(message1);
+                    return;
+                }
+                PcAppearance.setHairStyle(hairVal);
+                ExShowScreenMessage message = new ExShowScreenMessage("Your hair id has been changed!", 4000);
+                player.sendPacket(message);
+                player.sendMessage("Your hair id has been changed!");
+                player.broadcastUserInfo();
+                // Transform-untransorm player quickly to force the client to reload the character textures
+                TransformationManager.getInstance().transformPlayer(105, player);
+                ThreadPoolManager.getInstance().scheduleGeneral(new Untransform(player), 200);
+
+            }
+            catch (Exception e)
+            { //Case of empty id or invalid id
+                ExShowScreenMessage message1 = new ExShowScreenMessage("Fill into the box the hair id (0,1,2,3).", 4000);
+                player.sendPacket(message1);
+                player.sendMessage("Fill into the box the hair id (0,1,2,3).");
+            }
+        }
+    }
+
+    /**
+    * @param val
+    * @return
+    */
+    private boolean isValidName(String val)
+    {
+        boolean result = true;
+        String test = val;
+        Pattern pattern;
+        try
+        {
+            pattern = Pattern.compile(Config.CNAME_TEMPLATE);
+        }
+        catch (PatternSyntaxException e) // case of illegal pattern
+        {
+            _log.warning("ERROR : Character name pattern of config is wrong!");
+            pattern = Pattern.compile(".*");
+        }
+        Matcher regexp = pattern.matcher(test);
+        if (!regexp.matches())
+        {
+            result = false;
+        }
+        return result;
+    }
+
+    @Override
+    public void showChatWindow(L2PcInstance player)
+    {
+        if (player == null)
+        {
+            return;
+        }
+        NpcHtmlMessage nhm = new NpcHtmlMessage(2);
+        TextBuilder tb = new TextBuilder("");
+   
+        tb.append("<html>");
+        tb.append(" <head>");
+        tb.append(" <title>Appearance Manager</title>");
+        tb.append(" </head>");
+        tb.append("<body>");
+        tb.append("<center>");
+        tb.append("<table width=\"250\" cellpadding=\"5\" bgcolor=\"444444\">");
+        tb.append("<tr>");
+        tb.append("<td width=\"45\" valign=\"top\" align=\"center\"><img src=\"L2ui_ch3.menubutton4\" width=\"38\" height=\"38\"></td>");
+        tb.append("<td valign=\"top\"><font color=\"FF6600\">Appearance manager</font>");
+        tb.append("<br1><font color=\"00FF00\">"+ player.getName() +"</font>, use this npc to change your appearance.</td>");
+        tb.append("</tr></table></center><br><center>");
+        tb.append("<br><edit var=\"val\" width=140 height=20><br>");
+        tb.append("<table width=125 border=0 bgcolor=444444><tr><br><br><br><br>");
+        tb.append("<td><button action=\"bypass -h npc_" + getObjectId() + "_name $val\" value=\"Name\" width=90 height=24 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td>");
+        tb.append("<td><button action=\"bypass -h npc_" + getObjectId() + "_sex\" value=\"Sex\" width=90 height=24 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td>");
+        tb.append("</tr></table>");
+        tb.append("<table width=125 border=0 bgcolor=444444><tr><br><br><br><br>");
+        tb.append("<td><button action=\"bypass -h npc_" + getObjectId() + "_namec $val\" value=\"Name Color\" width=90 height=24 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td>");
+        tb.append("<td><button action=\"bypass -h npc_" + getObjectId() + "_titlec $val\" value=\"Title Color\" width=90 height=24 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td>");
+        tb.append("</tr></table>");
+        tb.append("<table width=125 border=0 bgcolor=444444><tr><br><br><br><br>");
+        tb.append("<td><button action=\"bypass -h npc_" + getObjectId() + "_hair $val\" value=\"Hair id\" width=90 height=24 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td>");
+        tb.append("<td><button action=\"bypass -h npc_" + getObjectId() + "_face $val\" value=\"Face id\" width=90 height=24 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td>");
+        tb.append("</tr></table><br><br>");
+        tb.append("<table width=125 border=0 bgcolor=444444><tr><br><br><br><br>");
+        tb.append("<td><button action=\"bypass -h npc_" + getObjectId() + "_info\" value=\"How to use ?\" width=130 height=18 back=\"L2UI_ct1.button_df\" fore=\"L2UI_ct1.button_df\"></td>");
+        tb.append("</tr></table>");
+        tb.append("</center><br><br>");
+        tb.append("<br><br><center><font color=\"A9A9A9\">~ by NeverMore ~</font></center>");
+        tb.append("</body>");
+        tb.append("</html>");
+        nhm.setHtml(tb.toString());
+        player.sendPacket(nhm);   
+    }
+
+    public void showInfoWindow(L2PcInstance player)
+    {
+        NpcHtmlMessage nhm = new NpcHtmlMessage(1);
+        TextBuilder tb = new TextBuilder("");
+   
+        tb.append("<html>");
+        tb.append(" <head>");
+        tb.append(" <title>Appearance Manager</title>");
+        tb.append(" </head>");
+        tb.append("<body>");
+        tb.append("<center>");
+        tb.append("<table width=\"250\" cellpadding=\"5\" bgcolor=\"444444\">");
+        tb.append("<tr>");
+        tb.append("<td width=\"45\" valign=\"top\" align=\"center\"><img src=\"L2ui_ch3.menubutton4\" width=\"38\" height=\"38\"></td>");
+        tb.append("<td valign=\"top\"><font color=\"FF6600\">Appearance manager</font>");
+        tb.append("<br1><font color=\"00FF00\">"+ player.getName() +"</font>, use this npc to change your appearance.</td>");
+        tb.append("</tr></table></center><br><center>");
+        tb.append("<br><br>Using this npc , you can change your Name / Title and Name Color / Sex / Hair and Face id!<br>Just fill into the box the required value's and press the button you want.");
+        tb.append("</center>");
+        tb.append("<br><br><center><font color=\"A9A9A9\">~ by NeverMore ~</font></center>");
+        tb.append("</body>");
+        tb.append("</html>");
+        nhm.setHtml(tb.toString());
+        player.sendPacket(nhm);   
+    }
+
+    private final class Untransform implements Runnable
+    {
+        private final L2PcInstance _player;
+
+        protected Untransform(L2PcInstance player)
+        {
+            _player = player;
+        }
+
+        @Override
+        public void run()
+        {
+            _player.untransform();
+        }
+    }
+}
\ No newline at end of file
Index: java/com/l2jserver/gameserver/model/actor/appearance/PcAppearance.java
===================================================================
--- java/com/l2jserver/gameserver/model/actor/appearance/PcAppearance.java    (revision 5526)
+++ java/com/l2jserver/gameserver/model/actor/appearance/PcAppearance.java    (working copy)
@@ -20,11 +20,11 @@
{
    private L2PcInstance _owner;
 
-    private byte _face;
+    private static byte _face;
 
    private byte _hairColor;
 
-    private byte _hairStyle;
+    private static byte _hairStyle;
 
    private boolean _sex; // Female true(1)
 
@@ -94,7 +94,7 @@
        return _visibleTitle;
    }
 
-    public final byte getFace()
+    public final static byte getFace()
    {
        return _face;
    }
@@ -102,7 +102,7 @@
    /**
      * @param value
      */
-    public final void setFace(int value)
+    public final static void setFace(int value)
    {
        _face = (byte) value;
    }
@@ -120,7 +120,7 @@
        _hairColor = (byte) value;
    }
 
-    public final byte getHairStyle()
+    public final static byte getHairStyle()
    {
        return _hairStyle;
    }
@@ -128,7 +128,7 @@
    /**
      * @param value
      */
-    public final void setHairStyle(int value)
+    public final static void setHairStyle(int value)
    {
        _hairStyle = (byte) value;
    }

CitarDATA:

### Eclipse Workspace Patch 1.0
 
#P L2J_DataPack
 
Index: dist/sql/game/characters.sql
 
===================================================================
 
--- dist/sql/game/characters.sql    (revision 9024)
 
+++ dist/sql/game/characters.sql    (working copy)
 
@@ -32,7 +32,7 @@
 
  `deletetime` bigint(13) unsigned NOT NULL DEFAULT '0',
 
  `cancraft` TINYINT UNSIGNED DEFAULT NULL,
 
  `title` VARCHAR(16) DEFAULT NULL,
 
-  `title_color` MEDIUMINT UNSIGNED NOT NULL DEFAULT '16777079',
 
+  `title_color` VARCHAR(16) NOT NULL DEFAULT 'FFFFFF',
 
  `accesslevel` MEDIUMINT DEFAULT 0,
 
  `online` TINYINT UNSIGNED DEFAULT NULL,
 
  `onlinetime` INT DEFAULT NULL,
 
@@ -58,6 +58,7 @@
 
  `vitality_points` SMALLINT UNSIGNED NOT NULL DEFAULT 0,
 
  `createDate` date NOT NULL DEFAULT '0000-00-00',
 
  `language` VARCHAR(2) DEFAULT NULL,
 
+  `namec` VARCHAR(16) NOT NULL DEFAULT 'FFFFFF',
 
  PRIMARY KEY (`charId`),
 
  KEY `account_name` (`account_name`),
 
  KEY `char_name` (`char_name`),