Noticias:

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

Menú Principal

Cambio de Skin

Iniciado por Swarlog, Ago 31, 2022, 08:37 PM

Tema anterior - Siguiente tema

Swarlog

Npc para cambiar el skin de tu personaje, es decir, la apariencia del cuerpo de tu personaje.

CitarCORE

Index: java/net/sf/l2j/gameserver/model/CharSelectInfoPackage.java
===================================================================
--- java/net/sf/l2j/gameserver/model/CharSelectInfoPackage.java (revision 3)
+++ java/net/sf/l2j/gameserver/model/CharSelectInfoPackage.java (working copy)
@@ -51,6 +51,8 @@
  private int _y = 0;
  private int _z = 0;
  private int _accessLevel = 0;
+ private int _customClassSkin = -1;
+ private int _customRaceSkin = -1;
 
  public CharSelectInfoPackage(int objectId, String name)
  {
@@ -353,4 +355,24 @@
  {
  _z = z;
  }
+
+ public void setCustomClassSkin(int valor)
+ {
+ _customClassSkin = valor;
+ }
+
+ public void setCustomRaceSkin(int valor)
+ {
+ _customRaceSkin = valor;
+ }
+
+ public int getCustomClassSkin()
+ {
+ return _customClassSkin;
+ }
+
+ public int getCustomRaceSkin()
+ {
+ return _customRaceSkin;
+ }
 }
\ No newline at end of file
Index: java/net/sf/l2j/gameserver/model/actor/instance/L2ChangeSkinManagerInstance.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/instance/L2ChangeSkinManagerInstance.java (revision 0)
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2ChangeSkinManagerInstance.java (revision 0)
@@ -0,0 +1,143 @@
+/*
+ * 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 net.sf.l2j.gameserver.model.actor.instance;
+
+import net.sf.l2j.gameserver.model.actor.template.NpcTemplate;
+import net.sf.l2j.gameserver.model.base.ClassId;
+
+/**
+ * @author execanciani & Toxico
+ */
+public class L2ChangeSkinManagerInstance extends L2NpcInstance
+{
+ public enum Races
+ {
+ FIGHTER(net.sf.l2j.gameserver.model.base.Race.Human, ClassId.fighter),
+ MAGE(net.sf.l2j.gameserver.model.base.Race.Human, ClassId.mage),
+ ELVENFIGHTER(net.sf.l2j.gameserver.model.base.Race.Elf, ClassId.elvenFighter),
+ ELVENMAGE(net.sf.l2j.gameserver.model.base.Race.Elf, ClassId.elvenMage),
+ DARKFIGHTER(net.sf.l2j.gameserver.model.base.Race.DarkElf, ClassId.darkFighter),
+ DARKMAGE(net.sf.l2j.gameserver.model.base.Race.DarkElf, ClassId.darkMage),
+ ORCFIGHTER(net.sf.l2j.gameserver.model.base.Race.Orc, ClassId.orcFighter),
+ ORCMAGE(net.sf.l2j.gameserver.model.base.Race.Orc, ClassId.orcMage),
+ DWARVEN(net.sf.l2j.gameserver.model.base.Race.Dwarf, ClassId.dwarvenFighter);
+
+ private net.sf.l2j.gameserver.model.base.Race races;
+ private ClassId classId;
+
+ private Races(net.sf.l2j.gameserver.model.base.Race races, ClassId classid)
+ {
+ this.races = races;
+ this.classId = classid;
+ }
+
+ public int getRaceId()
+ {
+ return races.ordinal();
+ }
+
+ public int getClassId()
+ {
+ return classId.getId();
+ }
+ }
+
+
+ public L2ChangeSkinManagerInstance(int objectId, NpcTemplate template)
+ {
+ super(objectId, template);
+
+ }
+
+ @Override
+ public void onBypassFeedback(L2PcInstance player, String command)
+ {
+ Races races = null;
+ if (command.startsWith("HumanFighter"))
+ {
+ races = Races.FIGHTER;
+ }
+
+ else if (command.startsWith("HumanMage"))
+ {
+ races = Races.MAGE;
+ }
+
+ else if (command.startsWith("ElfFighter"))
+ {
+ races = Races.ELVENFIGHTER;
+ }
+
+ else if (command.startsWith("ElfMage"))
+ {
+ races = Races.ELVENMAGE;
+ }
+
+ else if (command.startsWith("DarkElfFighter"))
+ {
+ races = Races.DARKFIGHTER;
+ }
+
+ else if (command.startsWith("DarkElfMage"))
+ {
+ races = Races.DARKMAGE;
+ }
+
+ else if (command.startsWith("OrcFighter"))
+ {
+ races = Races.ORCFIGHTER;
+ }
+
+ else if (command.startsWith("OrcMage"))
+ {
+ races = Races.ORCMAGE;
+ }
+
+ else if (command.startsWith("Dwarven"))
+ {
+ races = Races.DWARVEN;
+
+ }
+ else if (command.startsWith("BackMainSkin"))
+ {
+ player.setCustomClassSkin(-1);
+ player.setCustomRaceSkin(-1);
+ }
+ setRaceCustomSkin(player, races);
+
+ player.broadcastCharInfo();
+ player.broadcastUserInfo();
+
+ }
+
+ @Override
+ public String getHtmlPath(int npcId, int val)
+ {
+ String filename = "";
+ if (val == 0)
+ filename = "" + npcId;
+ else
+ filename = npcId + "-" + val;
+
+ return "data/html/mods/ChangeSkin/" + filename + ".htm";
+ }
+
+ private static void setRaceCustomSkin(L2PcInstance player, Races valor)
+ {
+ if ((player == null) || (valor == null))
+ {
+ return;
+ }
+ player.setCustomRaceSkin(valor.getRaceId());
+ player.setCustomClassSkin(valor.getClassId());
+ }
+}
\ No newline at end of file
Index: java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java
===================================================================
--- java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (revision 3)
+++ java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java (working copy)
@@ -313,8 +313,8 @@
  private static final String DELETE_SKILL_SAVE = "DELETE FROM character_skills_save WHERE char_obj_id=? AND class_index=?";
 
  private static final String INSERT_CHARACTER = "INSERT INTO characters (account_name,obj_Id,char_name,level,maxHp,curHp,maxCp,curCp,maxMp,curMp,face,hairStyle,hairColor,sex,exp,sp,karma,pvpkills,pkkills,clanid,race,classid,deletetime,cancraft,title,accesslevel,online,isin7sdungeon,clan_privs,wantspeace,base_class,nobless,power_grade,last_recom_date) 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=?,pvpkills=?,pkkills=?,rec_have=?,rec_left=?,clanid=?,race=?,classid=?,deletetime=?,title=?,accesslevel=?,online=?,isin7sdungeon=?,clan_privs=?,wantspeace=?,base_class=?,onlinetime=?,punish_level=?,punish_timer=?,nobless=?,power_grade=?,subpledge=?,last_recom_date=?,lvl_joined_academy=?,apprentice=?,sponsor=?,varka_ketra_ally=?,clan_join_expiry_time=?,clan_create_expiry_time=?,char_name=?,death_penalty_level=? WHERE obj_id=?";
- private static final String RESTORE_CHARACTER = "SELECT account_name, obj_Id, char_name, level, maxHp, curHp, maxCp, curCp, maxMp, curMp, face, hairStyle, hairColor, sex, heading, x, y, z, exp, expBeforeDeath, sp, karma, pvpkills, pkkills, clanid, race, classid, deletetime, cancraft, title, rec_have, rec_left, accesslevel, online, char_slot, lastAccess, clan_privs, wantspeace, base_class, onlinetime, isin7sdungeon, punish_level, punish_timer, nobless, power_grade, subpledge, last_recom_date, lvl_joined_academy, apprentice, sponsor, varka_ketra_ally,clan_join_expiry_time,clan_create_expiry_time,death_penalty_level FROM characters WHERE obj_id=?";
+ 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=?,pvpkills=?,pkkills=?,rec_have=?,rec_left=?,clanid=?,race=?,classid=?,deletetime=?,title=?,accesslevel=?,online=?,isin7sdungeon=?,clan_privs=?,wantspeace=?,base_class=?,onlinetime=?,punish_level=?,punish_timer=?,nobless=?,power_grade=?,subpledge=?,last_recom_date=?,lvl_joined_academy=?,apprentice=?,sponsor=?,varka_ketra_ally=?,clan_join_expiry_time=?,clan_create_expiry_time=?,char_name=?,death_penalty_level=?, custom_race_skin=?, custom_class_skin=? WHERE obj_id=?";
+ private static final String RESTORE_CHARACTER = "SELECT account_name, obj_Id, char_name, level, maxHp, curHp, maxCp, curCp, maxMp, curMp, face, hairStyle, hairColor, sex, heading, x, y, z, exp, expBeforeDeath, sp, karma, pvpkills, pkkills, clanid, race, classid, deletetime, cancraft, title, rec_have, rec_left, accesslevel, online, char_slot, lastAccess, clan_privs, wantspeace, base_class, onlinetime, isin7sdungeon, punish_level, punish_timer, nobless, power_grade, subpledge, last_recom_date, lvl_joined_academy, apprentice, sponsor, varka_ketra_ally,clan_join_expiry_time,clan_create_expiry_time,death_penalty_level,custom_race_skin,custom_class_skin FROM characters WHERE obj_id=?";
 
  private static final String RESTORE_CHAR_SUBCLASSES = "SELECT class_id,exp,sp,level,class_index FROM character_subclasses WHERE char_obj_id=? ORDER BY class_index ASC";
  private static final String ADD_CHAR_SUBCLASS = "INSERT INTO character_subclasses (char_obj_id,class_id,exp,sp,level,class_index) VALUES (?,?,?,?,?,?)";
@@ -601,7 +601,10 @@
  private final SummonRequest _summonRequest = new SummonRequest();
 
  private final GatesRequest _gatesRequest = new GatesRequest();
-
+
+ private int _customClassSkin = -1;
+ private int _customRaceSkin = -1;
+
  protected class ShortBuffTask implements Runnable
  {
  @Override
@@ -611,6 +614,7 @@
  setShortBuffTaskSkillId(0);
  }
  }
+
 
  protected static class SummonRequest
  {
@@ -5581,6 +5585,9 @@
 
  CursedWeaponsManager.getInstance().checkPlayer(player);
 
+ player.setCustomRaceSkin(rset.getInt("custom_race_skin"));
+ player.setCustomClassSkin(rset.getInt("custom_class_skin"));
+
  player.setAllianceWithVarkaKetra(rset.getInt("varka_ketra_ally"));
 
  player.setDeathPenaltyBuffLevel(rset.getInt("death_penalty_level"));
@@ -5922,7 +5929,9 @@
  statement.setLong(47, getClanCreateExpiryTime());
  statement.setString(48, getName());
  statement.setLong(49, getDeathPenaltyBuffLevel());
- statement.setInt(50, getObjectId());
+ statement.setInt(50, getCustomRaceSkin());
+ statement.setInt(51, getCustomClassSkin());
+ statement.setInt(52, getObjectId());
 
  statement.execute();
  statement.close();
@@ -10705,4 +10714,30 @@
  break;
  }
  }
+
+ public void setCustomClassSkin(int valor)
+ {
+ _customClassSkin = valor;
+ }
+
+ public void setCustomRaceSkin(int valor)
+ {
+ _customRaceSkin = valor;
+ }
+
+ public int getCustomClassSkin()
+ {
+ return _customClassSkin;
+ }
+
+ public int getCustomRaceSkin()
+ {
+ return _customRaceSkin;
+ }
+
+ public PcTemplate getCustomSkinTemplate()
+ {
+ return CharTemplateTable.getInstance().getTemplate(getCustomClassSkin());
+ }
+
 }
\ No newline at end of file
Index: java/net/sf/l2j/gameserver/network/serverpackets/CharInfo.java
===================================================================
--- java/net/sf/l2j/gameserver/network/serverpackets/CharInfo.java (revision 3)
+++ java/net/sf/l2j/gameserver/network/serverpackets/CharInfo.java (working copy)
@@ -68,13 +68,22 @@
  writeD(_heading);
  writeD(_activeChar.getObjectId());
  writeS(_activeChar.getName());
- writeD(_activeChar.getRace().ordinal());
+
+ if (_activeChar.getCustomRaceSkin() == -1)
+ writeD(_activeChar.getRace().ordinal());
+ else
+ writeD(_activeChar.getCustomRaceSkin());
+
  writeD(_activeChar.getAppearance().getSex() ? 1 : 0);
 
- if (_activeChar.getClassIndex() == 0)
+ // if ((_activeChar.getClassIndex() == 0)
+ // {
+ if (_activeChar.getCustomClassSkin() == -1)
  writeD(_activeChar.getClassId().getId());
  else
- writeD(_activeChar.getBaseClass());
+ writeD(_activeChar.getCustomClassSkin());
+ // else
+ // writeD(_activeChar.getBaseClass());
 
  writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HAIRALL));
  writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HEAD));
@@ -140,8 +149,17 @@
  }
  else
  {
- writeF(_activeChar.getBaseTemplate().getCollisionRadius());
- writeF(_activeChar.getBaseTemplate().getCollisionHeight());
+ if (_activeChar.getCustomRaceSkin() == -1)
+ {
+ writeF(_activeChar.getBaseTemplate().getCollisionRadius());
+ writeF(_activeChar.getBaseTemplate().getCollisionHeight());
+ }
+ else
+ {
+ writeF(_activeChar.getCustomSkinTemplate().getCollisionRadius());
+ writeF(_activeChar.getCustomSkinTemplate().getCollisionHeight());
+ }
+
  }
 
  writeD(_activeChar.getAppearance().getHairStyle());
Index: java/net/sf/l2j/gameserver/network/serverpackets/CharSelectInfo.java
===================================================================
--- java/net/sf/l2j/gameserver/network/serverpackets/CharSelectInfo.java (revision 3)
+++ java/net/sf/l2j/gameserver/network/serverpackets/CharSelectInfo.java (working copy)
@@ -88,12 +88,16 @@
  writeD(0x00); // ??
 
  writeD(charInfoPackage.getSex());
- writeD(charInfoPackage.getRace());
+ if (charInfoPackage.getCustomRaceSkin() == -1)
+ writeD(charInfoPackage.getRace());
+ else
+ writeD(charInfoPackage.getCustomRaceSkin());
 
- if (charInfoPackage.getClassId() == charInfoPackage.getBaseClassId())
+ if ((charInfoPackage.getCustomClassSkin() == -1) && (charInfoPackage.getClassId() == charInfoPackage.getBaseClassId()))
  writeD(charInfoPackage.getClassId());
  else
- writeD(charInfoPackage.getBaseClassId());
+ // writeD(charInfoPackage.getBaseClassId());
+ writeD(charInfoPackage.getCustomClassSkin());
 
  writeD(0x01); // active ??
 
@@ -178,7 +182,7 @@
 
  try (Connection con = L2DatabaseFactory.getInstance().getConnection())
  {
- PreparedStatement statement = con.prepareStatement("SELECT account_name, obj_Id, char_name, level, maxHp, curHp, maxMp, curMp, face, hairStyle, hairColor, sex, heading, x, y, z, exp, sp, karma, pvpkills, pkkills, clanid, race, classid, deletetime, cancraft, title, accesslevel, online, char_slot, lastAccess, base_class FROM characters WHERE account_name=?");
+ PreparedStatement statement = con.prepareStatement("SELECT account_name, obj_Id, char_name, level, maxHp, curHp, maxMp, curMp, face, hairStyle, hairColor, sex, heading, x, y, z, exp, sp, karma, pvpkills, pkkills, clanid, race, classid, deletetime, cancraft, title, accesslevel, online, char_slot, lastAccess, base_class,custom_race_skin,custom_class_skin FROM characters WHERE account_name=?");
  statement.setString(1, loginName);
  ResultSet charList = statement.executeQuery();
 
@@ -267,11 +271,17 @@
  charInfopackage.setSp(chardata.getInt("sp"));
  charInfopackage.setClanId(chardata.getInt("clanid"));
 
- charInfopackage.setRace(chardata.getInt("race"));
+ final int customRaceSkin = chardata.getInt("custom_race_skin");
+
+ if (customRaceSkin == -1)
+ charInfopackage.setRace(chardata.getInt("race"));
+ else
+ charInfopackage.setCustomRaceSkin(customRaceSkin);
 
+ final int customClassSkin = chardata.getInt("custom_class_skin");
  final int baseClassId = chardata.getInt("base_class");
  final int activeClassId = chardata.getInt("classid");
-
+
  charInfopackage.setX(chardata.getInt("x"));
  charInfopackage.setY(chardata.getInt("y"));
  charInfopackage.setZ(chardata.getInt("z"));
@@ -313,10 +323,17 @@
  /*
  * Check if the base class is set to zero and alse doesn't match with the current active class, otherwise send the base class ID. This prevents chars created before base class was introduced from being displayed incorrectly.
  */
- if (baseClassId == 0 && activeClassId > 0)
- charInfopackage.setBaseClassId(activeClassId);
+ if (customClassSkin == -1)
+ if (baseClassId == 0 && activeClassId > 0)
+ charInfopackage.setBaseClassId(activeClassId);
+ else
+ charInfopackage.setBaseClassId(baseClassId);
  else
- charInfopackage.setBaseClassId(baseClassId);
+ charInfopackage.setCustomClassSkin(customClassSkin);
+ // if (baseClassId == 0 && activeClassId > 0)
+ // charInfopackage.setBaseClassId(activeClassId);
+ // else
+ // charInfopackage.setBaseClassId(baseClassId);
 
  charInfopackage.setDeleteTimer(deletetime);
  charInfopackage.setLastAccess(chardata.getLong("lastAccess"));
Index: java/net/sf/l2j/gameserver/network/serverpackets/UserInfo.java
===================================================================
--- java/net/sf/l2j/gameserver/network/serverpackets/UserInfo.java (revision 3)
+++ java/net/sf/l2j/gameserver/network/serverpackets/UserInfo.java (working copy)
@@ -66,13 +66,21 @@
  }
  writeS(name);
 
- writeD(_activeChar.getRace().ordinal());
+ if (_activeChar.getCustomRaceSkin() == -1)
+ writeD(_activeChar.getRace().ordinal());
+ else
+ writeD(_activeChar.getCustomRaceSkin());
+ // writeD(_activeChar.getRace().ordinal());
  writeD(_activeChar.getAppearance().getSex() ? 1 : 0);
 
- if (_activeChar.getClassIndex() == 0)
+ // if ((_activeChar.getClassIndex() == 0)
+ // {
+ if (_activeChar.getCustomClassSkin() == -1)
  writeD(_activeChar.getClassId().getId());
  else
- writeD(_activeChar.getBaseClass());
+ writeD(_activeChar.getCustomClassSkin());
+ // else
+ // writeD(_activeChar.getBaseClass());
 
  writeD(_activeChar.getLevel());
  writeQ(_activeChar.getExp());
@@ -198,8 +206,17 @@
  }
  else
  {
- writeF(_activeChar.getBaseTemplate().getCollisionRadius());
- writeF(_activeChar.getBaseTemplate().getCollisionHeight());
+ if (_activeChar.getCustomRaceSkin() == -1)
+ {
+ writeF(_activeChar.getBaseTemplate().getCollisionRadius());
+ writeF(_activeChar.getBaseTemplate().getCollisionHeight());
+ }
+ else
+ {
+ writeF(_activeChar.getCustomSkinTemplate().getCollisionRadius());
+ writeF(_activeChar.getCustomSkinTemplate().getCollisionHeight());
+ }
+
  }
 
  writeD(_activeChar.getAppearance().getHairStyle());

CitarSQL

  `custom_race_skin` smallint(5) NOT NULL DEFAULT '0',
  `custom_class_skin` smallint(5) NOT NULL DEFAULT '0',

CitarHTML

data/html/mods/ChangeSkin/...

<html><body><center><button value="Human Fighter" action="bypass -h npc_%objectId%_HumanFighter" width=204 height=20 back="sek.cbui75" fore="sek.cbui76"><br1>
<button value="Human Mage" action="bypass -h npc_%objectId%_HumanMage" width=204 height=20 back="sek.cbui75" fore="sek.cbui76"><br1>
<button value="Elf Fighter" action="bypass -h npc_%objectId%_ElfFighter" width=204 height=20 back="sek.cbui75" fore="sek.cbui76"><br1>
<button value="Elf Mage" action="bypass -h npc_%objectId%_ElfMage" width=204 height=20 back="sek.cbui75" fore="sek.cbui76"><br1>
<button value="Dark Elf Fighter" action="bypass -h npc_%objectId%_DarkElfFighter" width=204 height=20 back="sek.cbui75" fore="sek.cbui76"><br1>
<button value="Dark Elf Mage" action="bypass -h npc_%objectId%_DarkElfMage" width=204 height=20 back="sek.cbui75" fore="sek.cbui76"><br1>
<button value="Orc Fighte" action="bypass -h npc_%objectId%_OrcFighter" width=204 height=20 back="sek.cbui75" fore="sek.cbui76"><br1>
<button value="Orc Mage" action="bypass -h npc_%objectId%_OrcMage" width=204 height=20 back="sek.cbui75" fore="sek.cbui76"><br1>
<button value="Dwarven" action="bypass -h npc_%objectId%_Dwarven" width=204 height=20 back="sek.cbui75" fore="sek.cbui76"><br1>
SI NO QUERES MAS TU CAMBIO DE SKIN<br1>
CON LA SIGUIENTE OPCION PUEDES<br1>
VOLVER A TENER TU CUERPO ANTERIOR<br1>
<button value="Back Main Skin" action="bypass -h npc_%objectId%_BackMainSkin" width=204 height=20 back="sek.cbui75" fore="sek.cbui76">
</center></body></html>

CitarNPC

<npc id="50009" idTemplate="30519" name="Change Skin Manager" title="L2JaCis">
<set name="level" val="70"/>
<set name="radius" val="7"/>
<set name="height" val="18"/>
<set name="rHand" val="0"/>
<set name="lHand" val="0"/>
<set name="type" val="L2ChangeSkinManager"/>
<set name="exp" val="0"/>
<set name="sp" val="0"/>
<set name="hp" val="2444.46819"/>
<set name="mp" val="1345.8"/>
<set name="hpRegen" val="7.5"/>
<set name="mpRegen" val="2.7"/>
<set name="pAtk" val="688.86373"/>
<set name="pDef" val="295.91597"/>
<set name="mAtk" val="470.40463"/>
<set name="mDef" val="216.53847"/>
<set name="crit" val="4"/>
<set name="atkSpd" val="253"/>
<set name="str" val="40"/>
<set name="int" val="21"/>
<set name="dex" val="30"/>
<set name="wit" val="20"/>
<set name="con" val="43"/>
<set name="men" val="20"/>
<set name="corpseTime" val="7"/>
<set name="walkSpd" val="50"/>
<set name="runSpd" val="120"/>
<set name="dropHerbGroup" val="0"/>
<set name="attackRange" val="40"/>
<ai type="default" ssCount="0" ssRate="0" spsCount="0" spsRate="0" aggro="0" canMove="true" seedable="false"/>
<skills>
<skill id="4045" level="1"/>
<skill id="4416" level="18"/>
</skills>
</npc>

Creditos: execanciani & Toxico

afidrk


Swarlog

Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectatesirve en h5?


Si, solo tienes que adaptarlo.

afidrk

Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectate
Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectatesirve en h5?


Si, solo tienes que adaptarlo.


Gracias! No tengo idea como se hace pero investigaste! Si me anda te la chupo jajajaja SOS un genio!

Swarlog

Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectate
Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectate
Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectatesirve en h5?


Si, solo tienes que adaptarlo.


Gracias! No tengo idea como se hace pero investigaste! Si me anda te la chupo jajajaja SOS un genio!

Ve probando y nos comentas que tal ^^

dwight

Buenas..!!
un pequeño aporte de lo publicado con algunos retoques y mejoras

Index: java/L2jServer/gameserver/network/serverpackets/CharSelectInfo.java
===================================================================
--- java/L2jServer/gameserver/network/serverpackets/CharSelectInfo.java   
+++ java/L2jServer/gameserver/network/serverpackets/CharSelectInfo.java   (Working L2j)

+ private static int customClassSkin;

 charInfopackage.setClassId(activeClassId);
 
+   charInfopackage.setCustomClassSkin(customClassSkin);

-         writeD(charInfoPackage.getRace());
+         if (charInfoPackage.getCustomRaceSkin() == -1)
+            writeD(charInfoPackage.getRace());
+         else
+            writeD(charInfoPackage.getCustomRaceSkin());
+
          
-         if (charInfoPackage.getClassId() == charInfoPackage.getBaseClassId())
+         if ((charInfoPackage.getCustomClassSkin() == -1) && (charInfoPackage.getClassId() == charInfoPackage.getBaseClassId()))
          {
             writeD(charInfoPackage.getClassId());
          }
          else
          {
-            writeD(charInfoPackage.getBaseClassId());
+            // writeD(charInfoPackage.getBaseClassId());
+            writeD(charInfoPackage.getCustomClassSkin());
          }


-         final PreparedStatement statement = con.prepareStatement("SELECT account_name, obj_Id, char_name, level, maxHp, curHp, maxMp, curMp, acc, crit, evasion, mAtk, mDef, mSpd, pAtk, pDef, pSpd, runSpd, walkSpd, str, con, dex, _int, men, wit, face, hairStyle, hairColor, sex, heading, x, y, z, movement_multiplier, attack_speed_multiplier, colRad, colHeight, exp, sp, karma, pvpkills, pkkills, clanid, maxload, race, classid, deletetime, cancraft, title, rec_have, rec_left, accesslevel, online, char_slot, lastAccess, base_class FROM characters WHERE account_name=?");
+         final PreparedStatement statement = con.prepareStatement("SELECT account_name, obj_Id, char_name, level, maxHp, curHp, maxMp, curMp, acc, crit, evasion, mAtk, mDef, mSpd, pAtk, pDef, pSpd, runSpd, walkSpd, str, con, dex, _int, men, wit, face, hairStyle, hairColor, sex, heading, x, y, z, movement_multiplier, attack_speed_multiplier, colRad, colHeight, exp, sp, karma, pvpkills, pkkills, clanid, maxload, race, classid, deletetime, cancraft, title, rec_have, rec_left, accesslevel, online, char_slot, lastAccess, base_class, custom_race_skin, custom_class_skin FROM characters WHERE account_name=?");
    

-      charInfopackage.setRace(chardata.getInt("race"));
+      final int customRaceSkin = chardata.getInt("custom_race_skin");
+
+      if (customRaceSkin == -1)
+         charInfopackage.setRace(chardata.getInt("race"));
+      else
+         charInfopackage.setCustomRaceSkin(customRaceSkin);
+
+      final int customClassSkin = chardata.getInt("custom_class_skin");

-      if (baseClassId == 0 && activeClassId > 0)
-      {
-         charInfopackage.setBaseClassId(activeClassId);
-      }
+      if (customClassSkin == -1)
+         if (baseClassId == 0 && activeClassId > 0)
+            charInfopackage.setBaseClassId(activeClassId);
+         else
+            charInfopackage.setBaseClassId(baseClassId);
       else
       {
-         charInfopackage.setBaseClassId(baseClassId);
+         charInfopackage.setCustomClassSkin(customClassSkin);
       }
      
      

Index: java/L2jServer/Config/actor/instance/L2ChangeSkinManagerInstance.java
===================================================================
--- java/L2jServer/Config/actor/instance/L2ChangeSkinManagerInstance.java   
+++ java/L2jServer/Config/actor/instance/L2ChangeSkinManagerInstance.java   (Working L2j)

+ package L2jServer.gameserver.model.actor.instance;
+
+ import L2jServer.Config;
+ import L2jServer.gameserver.model.base.ClassId;
+ import L2jServer.gameserver.model.base.Race;
+ import L2jServer.gameserver.network.L2GameClient;
+ import L2jServer.gameserver.network.serverpackets.CharInfo;
+ import L2jServer.gameserver.network.serverpackets.CharSelectInfo;
+ import L2jServer.gameserver.network.serverpackets.RestartResponse;
+ import L2jServer.gameserver.templates.L2NpcTemplate;
+ import L2jServer.gameserver.thread.ThreadPoolManager;
+
+ public class L2ChangeSkinManagerInstance extends L2NpcInstance {
+   public enum Races {
+      FIGHTER(L2jServer.gameserver.model.base.Race.human, ClassId.fighter),
+      MAGE(L2jServer.gameserver.model.base.Race.human, ClassId.mage),
+      ELVENFIGHTER(L2jServer.gameserver.model.base.Race.elf, ClassId.elvenFighter),
+      ELVENMAGE(L2jServer.gameserver.model.base.Race.elf, ClassId.elvenMage),
+      DARKFIGHTER(L2jServer.gameserver.model.base.Race.darkelf, ClassId.darkFighter),
+      DARKMAGE(L2jServer.gameserver.model.base.Race.darkelf, ClassId.darkMage),
+      ORCFIGHTER(L2jServer.gameserver.model.base.Race.orc, ClassId.orcFighter),
+      ORCMAGE(L2jServer.gameserver.model.base.Race.orc, ClassId.orcMage),
+      DWARVEN(L2jServer.gameserver.model.base.Race.dwarf, ClassId.dwarvenFighter);
+
+     private Race races;
+     
+     private ClassId classId;
+     
+     Races(Race races, ClassId classid) {
+       this.races = races;
+       this.classId = classid;
+     }
+     
+     public int getRaceId() {
+       return this.races.ordinal();
+     }
+     
+     public int getClassId() {
+       return this.classId.getId();
+     }
+   }
+   
+   public L2ChangeSkinManagerInstance(int objectId, L2NpcTemplate template) {
+     super(objectId, template);
+   }
+   
+   public boolean reduceItem(L2PcInstance player, int itemId, int count) {
+     if (player.getInventory().getItemByItemId(itemId) == null || player.getInventory().getItemByItemId(itemId).getCount() < count)
+       return false;
+     return true;
+   }
+   
+   @Override
+ public void onBypassFeedback(L2PcInstance player, String command) {
+     Races races = null;
+     if (reduceItem(player, Config.ITEM_CHANGE_SKIN_ID, Config.ITEM_CHANGE_SKIN_COUNT)) {
+       if (command.startsWith("HumanFighter")) {
+         races = Races.FIGHTER;
+       } else if (command.startsWith("HumanMage")) {
+         races = Races.MAGE;
+       } else if (command.startsWith("ElfFighter")) {
+         races = Races.ELVENFIGHTER;
+       } else if (command.startsWith("ElfMage")) {
+         races = Races.ELVENMAGE;
+       } else if (command.startsWith("DarkElfFighter")) {
+         races = Races.DARKFIGHTER;
+       } else if (command.startsWith("DarkElfMage")) {
+         races = Races.DARKMAGE;
+       } else if (command.startsWith("OrcFighter")) {
+         races = Races.ORCFIGHTER;
+       } else if (command.startsWith("OrcMage")) {
+         races = Races.ORCMAGE;
+       } else if (command.startsWith("Dwarven")) {
+         races = Races.DWARVEN;
+       } else if (command.startsWith("BackMainSkin")) {
+         player.setCustomClassSkin(-1);
+         player.setCustomRaceSkin(-1);
+       }
+       setRaceCustomSkin(player, races);
+       player.broadcastPacket(new CharInfo(player));
+       player.broadcastUserInfo();
+       player.getInventory().destroyItemByItemId("change_skin", Config.ITEM_CHANGE_SKIN_ID, Config.ITEM_CHANGE_SKIN_COUNT, player, this);
+       player.sendMessage("Cambio realizado con exito!");
+     } else {
+       player.sendMessage("Cantidad incorrecta.");
+     }
+   }
+   
+   @Override
+ public String getHtmlPath(int npcId, int val) {
+     String filename = "";
+     if (val == 0) {
+       filename = "" + npcId;
+     } else {
+       filename = "" + npcId + "-" + npcId;
+     }
+     return "data/html/mods/ChangeSkin/" + filename + ".htm";
+   }
+   
+   private static void setRaceCustomSkin(final L2PcInstance player, Races valor) {
+     if (player == null || valor == null)
+       return;
+     player.setCustomRaceSkin(valor.getRaceId());
+     player.setCustomClassSkin(valor.getClassId());
+     ThreadPoolManager.getInstance().scheduleGeneral(new Runnable() {
+           @Override
+       public void run() {
+             L2ChangeSkinManagerInstance.forcedResetClient(player);
+           }
+         },  50);
+   }
+   
+   static void forcedResetClient(L2PcInstance player) {
+     if (player == null)
+       return;
+     Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectate();
+     L2GameClient client = player.getClient();
+     player.setClient((L2GameClient)null);
+     player.deleteMe();
+     client.setActiveChar(null);
+     client.setState(L2GameClient.GameClientState.AUTHED);
+     client.sendPacket(RestartResponse.valueOf(true));
+     CharSelectInfo cl = new CharSelectInfo(client.getAccountName(), (client.getSessionId()).playOkID1);
+     client.sendPacket(cl);
+     client.setCharSelection(cl.getCharInfo());
+   }
+ }

Index: java/L2jServer/Config.java
===================================================================
--- java/L2jServer/Config.java   
+++ java/L2jServer/Config.java   (Working L2j)

+// ===================================================================================================================================//
+   
+   public static int ITEM_CHANGE_SKIN_COUNT;
+   public static int ITEM_CHANGE_SKIN_ID;
+   
+// ============================================================

   
+         /** Change Skin Race **/
+         
+         ITEM_CHANGE_SKIN_ID = Integer.parseInt(ExtraSettings.getProperty("ItemChangeSkinId", "11001"));
+         ITEM_CHANGE_SKIN_COUNT = Integer.parseInt(ExtraSettings.getProperty("ItemChangeSkinCount", "10"));
+         
+         // ========================================================================================================================================== //
+         
   
Index: java/L2jServer/gameserver/network/serverpackets/UserInfo.java
===================================================================
--- java/L2jServer/gameserver/network/serverpackets/UserInfo.java   
+++ java/L2jServer/gameserver/network/serverpackets/UserInfo.java   (Working L2j)
@@ -109,16 +109,27 @@
       
       writeD(_activeChar.getObjectId());
       writeS(_activeChar.getName());
-      writeD(_activeChar.getRace().ordinal());
+      if (_activeChar.getCustomRaceSkin() == -1)
+         writeD(_activeChar.getRace().ordinal());
+      else
+         writeD(_activeChar.getCustomRaceSkin());
+      // writeD(_activeChar.getRace().ordinal());
+
       writeD(_activeChar.getAppearance().getSex() ? 1 : 0);
       
-      if (_activeChar.getClassIndex() == 0)
-       {
-          writeD(_activeChar.getClassId().getId());
-       }
-       else
-       {
-         writeD(_activeChar.getBaseClass());
-       }

+      if (_activeChar.getCustomClassSkin() == -1)
+      {      
+         if (_activeChar.getClassIndex() == 0)
+         {
+            writeD(_activeChar.getClassId().getId());
+         }
+         else
+         {
+            writeD(_activeChar.getBaseClass());
+         }
+      }
+      else
+      {
+         writeD(_activeChar.getCustomClassSkin());
+      }
       
       writeD(_activeChar.getLevel());
@@ -243,8 +254,17 @@
       }
       else
       {
-         writeF(_activeChar.getBaseTemplate().collisionRadius);
-         writeF(_activeChar.getBaseTemplate().collisionHeight);
+         if (_activeChar.getCustomRaceSkin() == -1)
+         {
+            writeF(_activeChar.getBaseTemplate().getCollisionRadius());
+            writeF(_activeChar.getBaseTemplate().getCollisionHeight());
+         }
+         else
+         {
+            writeF(_activeChar.getCustomSkinTemplate().getCollisionRadius());
+            writeF(_activeChar.getCustomSkinTemplate().getCollisionHeight());
+         }
+
       }
       
       writeD(_activeChar.getAppearance().getHairStyle());   
      
      
      Index: java/L2jServer/gameserver/model/actor/instance/L2PcInstance.java
===================================================================
--- java/L2jServer/gameserver/model/actor/instance/L2PcInstance.java   
+++ java/L2jServer/gameserver/model/actor/instance/L2PcInstance.java   (Working L2j)
@@ -461,7 +461,7 @@
     * =?,race=?,classid=?,deletetime=?,title=?,accesslevel=?,online=?,isin7sdungeon=?,clan_privs =?,wantspeace=?,base_class =?,onlinetime=?,in_jail=?,jail_timer=?,newbie=?,nobless=?,power_grade=?,subpledge=?,last_recom_date =?,lvl_joined_academy
     * =?,apprentice=?,sponsor=?,varka_ketra_ally=?,clan_join_expiry_time=?,clan_create_expiry_time=? ,char_name=?,death_penalty_level=?,good=?,evil=?,gve_kills=? WHERE obj_id=?.
     */
-   private static final String UPDATE_CHARACTER = "UPDATE characters SET level=?,maxHp=?,curHp=?,maxCp=?,curCp=?,maxMp=?,curMp=?,str=?,con=?,dex=?,_int=?,men=?,wit=?,face=?,hairStyle=?,hairColor=?,heading=?,x=?,y=?,z=?,exp=?,expBeforeDeath=?,sp=?,karma=?,pvpkills=?,pkkills=?,rec_have=?,rec_left=?,clanid=?,maxload=?,race=?,classid=?,deletetime=?,title=?,accesslevel=?,online=?,isin7sdungeon=?,clan_privs=?,wantspeace=?,base_class=?,onlinetime=?,punish_level=?,punish_timer=?,newbie=?,nobless=?,power_grade=?,subpledge=?,last_recom_date=?,lvl_joined_academy=?,apprentice=?,sponsor=?,varka_ketra_ally=?,clan_join_expiry_time=?,clan_create_expiry_time=?,char_name=?,death_penalty_level=?,pc_point=?,name_color=?,title_color=?,aio=?,aio_end=? WHERE obj_id=?";
+   private static final String UPDATE_CHARACTER = "UPDATE characters SET level=?,maxHp=?,curHp=?,maxCp=?,curCp=?,maxMp=?,curMp=?,str=?,con=?,dex=?,_int=?,men=?,wit=?,face=?,hairStyle=?,hairColor=?,heading=?,x=?,y=?,z=?,exp=?,expBeforeDeath=?,sp=?,karma=?,pvpkills=?,pkkills=?,rec_have=?,rec_left=?,clanid=?,maxload=?,race=?,classid=?,deletetime=?,title=?,accesslevel=?,online=?,isin7sdungeon=?,clan_privs=?,wantspeace=?,base_class=?,onlinetime=?,punish_level=?,punish_timer=?,newbie=?,nobless=?,power_grade=?,subpledge=?,last_recom_date=?,lvl_joined_academy=?,apprentice=?,sponsor=?,varka_ketra_ally=?,clan_join_expiry_time=?,clan_create_expiry_time=?,char_name=?,death_penalty_level=?,pc_point=?,name_color=?,title_color=?,aio=?,aio_end=?,custom_race_skin=?,custom_class_skin=? WHERE obj_id=?";
    
    /**
     * SELECT account_name, obj_Id, char_name, level, maxHp, curHp, maxCp, curCp, maxMp, curMp, acc, crit, evasion, mAtk, mDef, mSpd, pAtk, pDef, pSpd, runSpd, walkSpd, str, con, dex, _int, men, wit, face, hairStyle, hairColor, sex, heading, x, y, z, movement_multiplier, attack_speed_multiplier,
@@ -478,7 +478,7 @@
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         */"newbie, nobless, power_grade, subpledge, last_recom_date, lvl_joined_academy, apprentice, sponsor, varka_ketra_ally,clan_join_expiry_time,clan_create_expiry_time,death_penalty_level,pc_point" + /*
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            * ,
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            * banchat_time
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           */",name_color,title_color,first_log,aio,aio_end FROM characters WHERE obj_id=?";
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           */",name_color,title_color,first_log,aio,aio_end,custom_race_skin,custom_class_skin FROM characters WHERE obj_id=?";
    
    /** The Constant STATUS_DATA_GET. */
    private static final String STATUS_DATA_GET = "SELECT hero, noble, donator, hero_end_date FROM characters_custom_data WHERE obj_Id = ?";
@@ -10140,6 +10140,10 @@
             
             CursedWeaponsManager.getInstance().checkPlayer(player);
             
+            player.setCustomRaceSkin(rset.getInt("custom_race_skin"));
+            player.setCustomClassSkin(rset.getInt("custom_class_skin"));
+
+            
             player.setAllianceWithVarkaKetra(rset.getInt("varka_ketra_ally"));
             
             player.setDeathPenaltyBuffLevel(rset.getInt("death_penalty_level"));
@@ -10627,8 +10631,11 @@
          statement.setInt(60, isAio() ? 1 : 0);
          statement.setLong(61, getAioEndTime());
          
-         statement.setInt(62, getObjectId());
          
+         statement.setInt(62, getCustomRaceSkin());
+         statement.setInt(63, getCustomClassSkin());
+         statement.setInt(64, getObjectId());
+         
          statement.execute();
          DatabaseUtils.close(statement);
          statement = null;
@@ -14519,6 +14526,32 @@
       sl = null;
    }
    
+   public void setCustomClassSkin(int valor)
+   {
+      _customClassSkin = valor;
+   }
+
+   public void setCustomRaceSkin(int valor)
+   {
+      _customRaceSkin = valor;
+   }
+
+   public int getCustomClassSkin()
+   {
+      return _customClassSkin;
+   }
+
+   public int getCustomRaceSkin()
+   {
+      return _customRaceSkin;
+   }
+
+   public L2PcTemplate getCustomSkinTemplate()
+   {
+      return CharTemplateTable.getInstance().getTemplate(getCustomClassSkin());
+   }
+
+   
    /**
     * 1. Add the specified class ID as a subclass (up to the maximum number of <b>three</b>) for this character.<BR>
     * 2. This method no longer changes the active _classIndex of the player. This is only done by the calling of setActiveClass() method as that should be the only way to do so.
@@ -18934,7 +18967,9 @@
    // open/close gates
    @SuppressWarnings("synthetic-access")
    private final GatesRequest _gatesRequest = new GatesRequest();
-   
+   private int _customClassSkin = -1;
+   private int _customRaceSkin = -1;
+
    private static class GatesRequest
    {
       private L2DoorInstance _target = null;

      +ndex: java/L2jServer/gameserver/model/CharSelectInfoPackage.java
===================================================================
--- java/L2jServer/gameserver/model/CharSelectInfoPackage.java   (revision 1132)
+++ java/L2jServer/gameserver/model/CharSelectInfoPackage.java   (working copy)
@@ -50,6 +50,9 @@
    private int _karma = 0;
    private int _augmentationId = 0;
    private int _accessLevel;
+   private int _customClassSkin = -1;
+   private int _customRaceSkin = -1;
+
    
    /**
     * @param objectId
@@ -309,4 +312,24 @@
    {
       _accessLevel = accessLevel;
    }
+   public void setCustomClassSkin(int valor)
+   {
+      _customClassSkin = valor;
+   }
+
+   public void setCustomRaceSkin(int valor)
+   {
+      _customRaceSkin = valor;
+   }
+
+   public int getCustomClassSkin()
+   {
+      return _customClassSkin;
+   }
+
+   public int getCustomRaceSkin()
+   {
+      return _customRaceSkin;
+   }
+
 }
Index: java/L2jServer/gameserver/network/serverpackets/CharInfo.java
===================================================================
--- java/L2jServer/gameserver/network/serverpackets/CharInfo.java   (revision 1132)
+++ java/L2jServer/gameserver/network/serverpackets/CharInfo.java   (working copy)
@@ -218,16 +218,21 @@
          writeD(_heading);
          writeD(_activeChar.getObjectId());
          writeS(_activeChar.getName());
-         writeD(_activeChar.getRace().ordinal());
+         
+         if (_activeChar.getCustomRaceSkin() == -1)
+            writeD(_activeChar.getRace().ordinal());
+         else
+            writeD(_activeChar.getCustomRaceSkin());
+
          writeD(_activeChar.getAppearance().getSex() ? 1 : 0);
          
-         if (_activeChar.getClassIndex() == 0)
-          {
-             writeD(_activeChar.getClassId().getId());
-          }
-          else
-          {
-            writeD(_activeChar.getBaseClass());
-          }


+         if (_activeChar.getCustomClassSkin() == -1)
+         {            
+            if (_activeChar.getClassIndex() == 0)
+            {
+               writeD(_activeChar.getClassId().getId());
+            }
+            else
+            {
+               writeD(_activeChar.getBaseClass());
+            }
+         }
+         else
+         {
+            writeD(_activeChar.getCustomClassSkin());
+         }
          
          writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_DHAIR));
@@ -286,8 +291,18 @@
          writeD(_flyWalkSpd);
          writeF(_activeChar.getMovementSpeedMultiplier()); // _activeChar.getProperMultiplier()
          writeF(_activeChar.getAttackSpeedMultiplier()); // _activeChar.getAttackSpeedMultiplier()
-         writeF(_activeChar.getBaseTemplate().collisionRadius);
-         writeF(_activeChar.getBaseTemplate().collisionHeight);
+      
+         if (_activeChar.getCustomRaceSkin() == -1)
+         {
+            writeF(_activeChar.getBaseTemplate().getCollisionRadius());
+            writeF(_activeChar.getBaseTemplate().getCollisionHeight());
+         }
+         else
+         {
+            writeF(_activeChar.getCustomSkinTemplate().getCollisionRadius());
+            writeF(_activeChar.getCustomSkinTemplate().getCollisionHeight());
+         }
+
          
          writeD(_activeChar.getAppearance().getHairStyle());
          writeD(_activeChar.getAppearance().getHairColor());