🔥 Presentación del Sistema DressMe Custom
Te presento un sistema DressMe completamente personalizado, desarrollado para DreamV2, inspirado en los mejores servidores y mejorado con características únicas que garantizan máximo rendimiento, personalización y efectos visuales impresionantes.
✨ Características Principales
- ✅ Aplicación de apariencia de armas/armaduras sin modificar el ítem equipado
- ✅ Compatibilidad con todo tipo de armas/armaduras (ej: skins de arco solo visibles con arcos equipados)
- ✅ Remoción automática del visual al desequipar partes del set
- ✅ Efectos visuales (skills) con soporte para:
- ▪ Aplicación única o recurrente
- ▪ Intervalos configurables via XML
- ▪ Remoción automática al desactivar el visual
- ✅ Interfaz limpia y diseño modular para fácil expansión
📦 Ejemplo de Configuración XML
<?xml version="1.0" encoding="UTF-8"?>
<dressMeList>
<dress skillId="9100" name="Armadura Dragónica" type="ARMOR" isVip="false">
<visualSet chest="6379" legs="0" gloves="6380" feet="6381" helmet="6841"/>
<visualEffect skillId="445" level="1" recurring="true" interval="35"/>
</dress>
<dress skillId="9102" name="Armadura Estilo Capa" type="CLOAK" isVip="false">
<visualSet chest="7000" legs="0" gloves="0" feet="0" helmet="0"/>
<visualEffect skillId="10005" level="1" recurring="false"/>
</dress>
<dress skillId="9103" name="Arma Estilo Valakas" type="WEAPON" isVip="false">
<visualWep type="bow" rhand="7575" lhand="0" lrhand="0"/>
<visualEffect skillId="10005" level="1" recurring="false"/>
</dress>
</dressMeList>
📸 Capturas & Vídeo
(https://i.imgur.com/ejemplo.png)
🛠� Detalles Técnicos
• Desarrollado sobre L2J DreamV2
• Integración directa con L2PcInstance, Inventory y SkillTable
• Sistema centralizado de gestión mediante DressMeEffectManager
• Programación segura de efectos recurrentes
• Totalmente compatible con operaciones en segundo plano
📂 Instalación
Incluye todo lo necesario para implementar:
- Clases principales (DressMeHolder, DressMeEffectManager)
- Modificaciones en L2PcInstance
- Archivos XML de configuración
- Soporte para expansión de visuals
📎 Descarga
Enlace de Descarga (https://pastebin.com/raw/7i843yKh)
diff --git a/game/config/hexid.txt b/game/config/hexid.txt
index abfb004..9d92619 100644
--- a/game/config/hexid.txt
+++ b/game/config/hexid.txt
@@ -1,4 +1,4 @@
-#the hexID to auth into login
-#Thu Jun 05 09:42:23 BRT 2025
-HexID=-799cd2897113eca3680c51a702a74c7a
-ServerID=1
+#the hexID to auth into login
+#Fri Jun 06 07:37:15 BRT 2025
+HexID=-799cd2897113eca3680c51a702a74c7a
+ServerID=1
diff --git a/game/data/xml/DressMeData.xml b/game/data/xml/DressMeData.xml
new file mode 100644
index 0000000..d849fe3
--- /dev/null
+++ b/game/data/xml/DressMeData.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<dressMeList>
+ <dress skillId="9100" name="Draconic Armor" type="ARMOR" isVip="false" >
+ <visualSet chest="6379" legs="0" gloves="6380" feet="6381" helmet="6841" />
+ <visualEffect skillId="445" level="1" recurring="true" interval="35" />
+ </dress>
+
+ <dress skillId="9102" name="Cloak Style Armor" type="CLOAK" isVip="false">
+ <visualSet chest="7000" legs="0" gloves="0" feet="0" helmet="0" />
+ <visualEffect skillId="10005" level="1" recurring="false" />
+ </dress>
+
+ <dress skillId="9103" name="Valakas Style Weapon" type="WEAPON" isVip="false">
+ <visualWep type="bow" rhand="7575" lhand="0" lrhand="0" />
+ <visualEffect skillId="10005" level="1" recurring="false" />
+ </dress>
+</dressMeList>
\ No newline at end of file
diff --git a/game/data/xml/stats/skills/9000-9099.xml b/game/data/xml/stats/skills/9000-9099.xml
index 756b986..fd30a78 100644
--- a/game/data/xml/stats/skills/9000-9099.xml
+++ b/game/data/xml/stats/skills/9000-9099.xml
@@ -84,4 +84,52 @@
<add val="#lvl" order="0x10" stat="STR" />
</for>
</skill>
+ <skill id="9100" levels="1" name="Visual Style Draconic">
+ <set name="mpConsume" val="100" />
+ <set name="target" val="TARGET_SELF" />
+ <set name="skillType" val="DRESSME" />
+ <set name="operateType" val="OP_ACTIVE" />
+ <set name="reuseDelay" val="23000" />
+ <set name="hitTime" val="1000" />
+ </skill>
+ <skill id="9101" levels="1" name="Visual Style Imperial">
+ <set name="mpConsume" val="100" />
+ <set name="target" val="TARGET_SELF" />
+ <set name="skillType" val="DRESSME" />
+ <set name="operateType" val="OP_ACTIVE" />
+ <set name="reuseDelay" val="23000" />
+ <set name="hitTime" val="1000" />
+ </skill>
+ <skill id="9102" levels="1" name="Visual Style Majo">
+ <set name="mpConsume" val="100" />
+ <set name="target" val="TARGET_SELF" />
+ <set name="skillType" val="DRESSME" />
+ <set name="operateType" val="OP_ACTIVE" />
+ <set name="reuseDelay" val="23000" />
+ <set name="hitTime" val="1000" />
+ </skill>
+ <skill id="9103" levels="1" name="Visual Style Titanium">
+ <set name="mpConsume" val="100" />
+ <set name="target" val="TARGET_SELF" />
+ <set name="skillType" val="DRESSME" />
+ <set name="operateType" val="OP_ACTIVE" />
+ <set name="reuseDelay" val="23000" />
+ <set name="hitTime" val="1000" />
+ </skill>
+ <skill id="9104" levels="1" name="Visual Style Titanium">
+ <set name="mpConsume" val="100" />
+ <set name="target" val="TARGET_SELF" />
+ <set name="skillType" val="DRESSME" />
+ <set name="operateType" val="OP_ACTIVE" />
+ <set name="reuseDelay" val="23000" />
+ <set name="hitTime" val="1000" />
+ </skill>
+ <skill id="9105" levels="1" name="Visual Style Titanium">
+ <set name="mpConsume" val="100" />
+ <set name="target" val="TARGET_SELF" />
+ <set name="skillType" val="DRESSME" />
+ <set name="operateType" val="OP_ACTIVE" />
+ <set name="reuseDelay" val="23000" />
+ <set name="hitTime" val="1000" />
+ </skill>
</list>
\ No newline at end of file
diff --git a/java/com/dream/game/L2GameServer.java b/java/com/dream/game/L2GameServer.java
index 5c7eb79..811e567 100644
--- a/java/com/dream/game/L2GameServer.java
+++ b/java/com/dream/game/L2GameServer.java
@@ -25,6 +25,7 @@
import com.dream.game.datatables.xml.CharTemplateTable;
import com.dream.game.datatables.xml.ClanLeveLUpPricesData;
import com.dream.game.datatables.xml.DoorTable;
+import com.dream.game.datatables.xml.DressMeData;
import com.dream.game.datatables.xml.ExtractableItemsData;
import com.dream.game.datatables.xml.FishTable;
import com.dream.game.datatables.xml.GreetingData;
@@ -137,6 +138,7 @@
import com.dream.game.scripting.L2ScriptEngineManager;
import com.dream.game.taskmanager.AttackStanceTaskManager;
import com.dream.game.taskmanager.DecayTaskManager;
+import com.dream.game.taskmanager.GreetingManager;
import com.dream.game.taskmanager.KnownListUpdateTaskManager;
import com.dream.game.taskmanager.LeakTaskManager;
import com.dream.game.taskmanager.SQLQueue;
@@ -577,11 +579,15 @@
Console.printSection("Greeter Data");
GreetingData.getInstance();
+ GreetingManager.getInstance().start();
Console.printSection("Reset Data");
ResetData.getInstance();
ResetManager.getInstance().start();
+ Console.printSection("DressMe Data");
+ DressMeData.getInstance();
+
Console.printSection("Oficial Event's");
Cristmas.startEvent();
EventMedals.startEvent();
diff --git a/java/com/dream/game/datatables/xml/DressMeData.java b/java/com/dream/game/datatables/xml/DressMeData.java
new file mode 100644
index 0000000..57f9100
--- /dev/null
+++ b/java/com/dream/game/datatables/xml/DressMeData.java
@@ -0,0 +1,71 @@
+package com.dream.game.datatables.xml;
+
+import com.dream.data.xml.IXmlReader;
+import com.dream.data.xml.StatSet;
+import com.dream.game.model.holders.DressMeEffectHolder;
+import com.dream.game.model.holders.DressMeHolder;
+
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.w3c.dom.Document;
+
+public class DressMeData implements IXmlReader
+{
+ private final List<DressMeHolder> _entries = new ArrayList<>();
+
+ public DressMeData()
+ {
+ load();
+ }
+
+ public void reload()
+ {
+ _entries.clear();
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ parseFile("./data/xml/DressMeData.xml");
+ LOGGER.info("Loaded {" + _entries.size() + "} DressMe entries.");
+ }
+
+ @Override
+ public void parseDocument(Document doc, Path path)
+ {
+ forEach(doc, "dressMeList", listNode -> forEach(listNode, "dress", dressNode -> {
+ final StatSet attrs = parseAttributes(dressNode);
+
+ final DressMeHolder holder = new DressMeHolder(attrs);
+
+ forEach(dressNode, "visualSet", setNode -> holder.setVisualSet(parseAttributes(setNode)));
+ forEach(dressNode, "visualWep", wepNode -> holder.setWeaponSet(parseAttributes(wepNode)));
+ forEach(dressNode, "visualEffect", fxNode -> holder.setEffect(new DressMeEffectHolder(parseAttributes(fxNode))));
+
+ _entries.add(holder);
+ }));
+ }
+
+ public List<DressMeHolder> getEntries()
+ {
+ return _entries;
+ }
+
+ public DressMeHolder getBySkillId(int skillId)
+ {
+ return _entries.stream().filter(d -> d.getSkillId() == skillId).findFirst().orElse(null);
+ }
+
+ public static DressMeData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final DressMeData INSTANCE = new DressMeData();
+ }
+}
\ No newline at end of file
+package com.dream.game.datatables.xml;
+
+import com.dream.data.xml.IXmlReader;
+import com.dream.data.xml.StatSet;
+import com.dream.game.model.holders.GreetingHolder;
+
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+
+public class GreetingData implements IXmlReader
+{
+ private final Map<Integer, GreetingHolder> _greetings = new HashMap<>();
+
+ public GreetingData()
+ {
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ parseFile("./data/xml/greeting.xml");
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + _greetings.size() + " greetings.");
+
+ }
+
+ @Override
+ public void parseDocument(Document doc, Path path)
+ {
+ forEach(doc, "list", listNode -> {
+ forEach(listNode, "greeting", greetNode -> {
+ StatSet set = new StatSet(parseAttributes(greetNode));
+ GreetingHolder holder = new GreetingHolder(set);
+ _greetings.put(holder.getCastleId(), holder);
+ });
+ });
+ }
+
+ public GreetingHolder getGreeting(int castleId)
+ {
+ return _greetings.get(castleId);
+ }
+
+ public static GreetingData getInstance()
+ {
+ return SingletonHolder._instance;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final GreetingData _instance = new GreetingData();
+ }
+}
diff --git a/java/com/dream/game/handler/skill/applySkins.java b/java/com/dream/game/handler/skill/applySkins.java
new file mode 100644
index 0000000..a765c61
--- /dev/null
+++ b/java/com/dream/game/handler/skill/applySkins.java
@@ -0,0 +1,65 @@
+package com.dream.game.handler.skill;
+
+import com.dream.game.datatables.xml.DressMeData;
+import com.dream.game.handler.ISkillHandler;
+import com.dream.game.model.L2Skill;
+import com.dream.game.model.actor.L2Character;
+import com.dream.game.model.actor.instance.L2PcInstance;
+import com.dream.game.model.holders.DressMeHolder;
+import com.dream.game.templates.skills.L2SkillType;
+
+public class applySkins implements ISkillHandler
+{
+ private static final L2SkillType[] SKILL_IDS =
+ {
+ L2SkillType.DRESSME
+ };
+
+ @Override
+ public L2SkillType[] getSkillIds()
+ {
+ return SKILL_IDS;
+ }
+
+ @Override
+ public void useSkill(L2Character activeChar, L2Skill skill, L2Character... targets)
+ {
+ if (!(activeChar instanceof L2PcInstance))
+ return;
+
+ L2PcInstance player = (L2PcInstance) activeChar;
+ DressMeHolder dress = DressMeData.getInstance().getBySkillId(skill.getId());
+
+ if (dress == null)
+ {
+ player.sendMessage("Visual not found.");
+ return;
+ }
+ final long cooldown = 10000;
+
+ long currentTime = System.currentTimeMillis();
+ if (currentTime - player.getLastDressMeSummonTime() < cooldown)
+ {
+ player.sendMessage("You need to wait before summoning another DressMe.");
+ return;
+ }
+ if (player.getArmorSkin() != null && player.getArmorSkin().getSkillId() == skill.getId())
+ {
+ player.sendMessage("This armor look is already active.");
+ player.removeDressMeArmor();
+ return;
+ }
+
+ if (player.getWeaponSkin() != null && player.getWeaponSkin().getSkillId() == skill.getId())
+ {
+ player.sendMessage("This weapon look is already active.");
+ player.removeDressMeWeapon();
+ return;
+ }
+
+
+ player.setLastDressMeSummonTime(currentTime);
+ player.applyDressMe(dress);
+ player.broadcastUserInfo();
+ }
+}
\ No newline at end of file
diff --git a/java/com/dream/game/model/DressMeEffectManager.java b/java/com/dream/game/model/DressMeEffectManager.java
new file mode 100644
index 0000000..eaa1a5a
--- /dev/null
+++ b/java/com/dream/game/model/DressMeEffectManager.java
@@ -0,0 +1,100 @@
+package com.dream.game.model;
+
+import com.dream.game.datatables.xml.SkillTable;
+import com.dream.game.model.actor.instance.L2PcInstance;
+import com.dream.game.model.holders.DressMeHolder;
+import com.dream.game.model.world.L2World;
+import com.dream.game.network.ThreadPoolManager;
+import com.dream.game.network.serverpackets.MagicSkillUse;
+import com.dream.game.util.Broadcast;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ScheduledFuture;
+
+public class DressMeEffectManager
+{
+
+ private final Map<Integer, ActiveEffect> _activeEffects = new ConcurrentHashMap<>();
+
+ private static class ActiveEffect
+ {
+ private final int _skillId;
+ private final ScheduledFuture<?> _task;
+
+ public ActiveEffect(int skillId, ScheduledFuture<?> task)
+ {
+ _skillId = skillId;
+ _task = task;
+ }
+ }
+
+ private DressMeEffectManager()
+ {
+ }
+
+ public void startEffect(L2PcInstance player, DressMeHolder skin)
+ {
+ if (player == null || skin.getEffect() == null)
+ return;
+
+ final int playerId = player.getObjectId();
+ final int skillId = skin.getEffect().getSkillId();
+ final int skillLevel = skin.getEffect().getLevel();
+ final int interval = skin.getEffect().getInterval(); // em segundos
+
+ stopEffect(player); // Cancela qualquer anterior
+
+ applySkill(player, skillId, skillLevel); // Aplica imediatamente
+
+ ScheduledFuture<?> task = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(() -> {
+
+ L2PcInstance checkOnplayer = L2World.getInstance().getPlayer(player.getObjectId());
+
+ if (checkOnplayer != null)
+ {
+ applySkill(player, skillId, skillLevel);
+ }
+ else
+ {
+ stopEffect(player);
+ }
+
+ }, interval * 1000L, interval * 1000L);
+
+ _activeEffects.put(playerId, new ActiveEffect(skillId, task));
+ }
+
+ public void stopEffect(L2PcInstance player)
+ {
+ if (player == null)
+ return;
+
+ ActiveEffect effect = _activeEffects.remove(player.getObjectId());
+ if (effect != null)
+ {
+ effect._task.cancel(false);
+ player.stopSkillEffects(effect._skillId); // Remove o efeito visual
+ }
+ }
+
+ private static void applySkill(L2PcInstance player, int skillId, int skillLevel)
+ {
+ L2Skill skill = SkillTable.getInstance().getInfo(skillId, skillLevel);
+ if (skill != null)
+ {
+ Broadcast.toSelfAndKnownPlayers(player, new MagicSkillUse(player, player, skill.getId(), 1, 0, 0, false));
+
+ }
+ }
+
+ public static DressMeEffectManager getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ private static final DressMeEffectManager INSTANCE = new DressMeEffectManager();
+ }
+}
\ No newline at end of file
diff --git a/java/com/dream/game/model/actor/instance/L2PcInstance.java b/java/com/dream/game/model/actor/instance/L2PcInstance.java
index 3bfb0de..eb2e993 100644
--- a/java/com/dream/game/model/actor/instance/L2PcInstance.java
+++ b/java/com/dream/game/model/actor/instance/L2PcInstance.java
@@ -51,6 +51,7 @@
import com.dream.game.manager.SiegeManager;
import com.dream.game.model.BlockList;
import com.dream.game.model.CursedWeapon;
+import com.dream.game.model.DressMeEffectManager;
import com.dream.game.model.FishData;
import com.dream.game.model.L2Clan;
import com.dream.game.model.L2ClanMember;
@@ -101,6 +102,7 @@
import com.dream.game.model.entity.siege.Fort;
import com.dream.game.model.entity.siege.FortSiege;
import com.dream.game.model.entity.siege.Siege;
+import com.dream.game.model.holders.DressMeHolder;
import com.dream.game.model.itemcontainer.Inventory;
import com.dream.game.model.itemcontainer.ItemContainer;
import com.dream.game.model.itemcontainer.PcFreight;
@@ -13848,4 +13850,148 @@
_scriptValues.clear();
}
+ private long _lastDressMeSummonTime;
+
+ public long getLastDressMeSummonTime()
+ {
+ return _lastDressMeSummonTime;
+ }
+
+ public void setLastDressMeSummonTime(long time)
+ {
+ _lastDressMeSummonTime = time;
+ }
+
+ private boolean _isDressMe;
+
+ public boolean isDressMe()
+ {
+ return _isDressMe;
+ }
+
+ public void setDressMe(boolean val)
+ {
+ _isDressMe = val;
+ }
+
+ private DressMeHolder _armorSkin;
+ private DressMeHolder _weaponSkin;
+
+ public DressMeHolder getArmorSkin()
+ {
+ return _armorSkin;
+ }
+
+ public void setArmorSkin(DressMeHolder skin)
+ {
+ _armorSkin = skin;
+ }
+
+ public DressMeHolder getWeaponSkin()
+ {
+ return _weaponSkin;
+ }
+
+ public void setWeaponSkin(DressMeHolder skin)
+ {
+ _weaponSkin = skin;
+ }
+
+ public void setDressVisual(int chest, int legs, int gloves, int feet, int helmet)
+ {
+ Inventory inv = getInventory();
+
+ if (chest > 0)
+ inv.setPaperdollItemVisual(Inventory.PAPERDOLL_CHEST);
+ if (legs > 0)
+ inv.setPaperdollItemVisual(Inventory.PAPERDOLL_LEGS);
+ if (gloves > 0)
+ inv.setPaperdollItemVisual(Inventory.PAPERDOLL_GLOVES);
+ if (feet > 0)
+ inv.setPaperdollItemVisual(Inventory.PAPERDOLL_FEET);
+ if (helmet > 0)
+ inv.setPaperdollItemVisual(Inventory.PAPERDOLL_HEAD);
+
+ broadcastUserInfo();
+ }
+
+ public void setWeaponVisual(int rhand, int lhand, int lrhand)
+ {
+ Inventory inv = getInventory();
+
+ if (rhand > 0)
+ inv.setPaperdollItemVisual(Inventory.PAPERDOLL_RHAND);
+ if (lhand > 0)
+ inv.setPaperdollItemVisual(Inventory.PAPERDOLL_LHAND);
+ if (lrhand > 0)
+ inv.setPaperdollItemVisual(Inventory.PAPERDOLL_LRHAND);
+
+ broadcastUserInfo();
+ }
+
+ public void applyDressMe(DressMeHolder skin)
+ {
+ if (skin == null)
+ return;
+
+ switch (skin.getType())
+ {
+ case ARMOR:
+ case CLOAK:
+ setArmorSkin(skin);
+ setDressVisual(skin.getChestId(), skin.getLegsId(), skin.getGlovesId(), skin.getFeetId(), skin.getHelmetId());
+ break;
+
+ case WEAPON:
+ setWeaponSkin(skin);
+ setWeaponVisual(skin.getRightHandId(), skin.getLeftHandId(), skin.getTwoHandId());
+ break;
+ }
+
+ setDressMe(true);
+
+ // Aplica efeito visual, se houver
+ if (skin.getEffect() != null && skin.getEffect().getSkillId() > 0)
+ {
+ if (skin.getEffect().isRecurring())
+ {
+ DressMeEffectManager.getInstance().startEffect(this, skin);
+ }
+ }
+ }
+
+ public void removeDressMeArmor()
+ {
+ DressMeEffectManager.getInstance().stopEffect(this);
+ _armorSkin = null;
+ Inventory inv = getInventory();
+ inv.setPaperdollItemVisual(Inventory.PAPERDOLL_CHEST);
+ inv.setPaperdollItemVisual(Inventory.PAPERDOLL_LEGS);
+ inv.setPaperdollItemVisual(Inventory.PAPERDOLL_GLOVES);
+ inv.setPaperdollItemVisual(Inventory.PAPERDOLL_FEET);
+ inv.setPaperdollItemVisual(Inventory.PAPERDOLL_HEAD);
+ broadcastUserInfo();
+ checkIfNoDressMe();
+ }
+
+ public void removeDressMeWeapon()
+ {
+ DressMeEffectManager.getInstance().stopEffect(this);
+ _weaponSkin = null;
+ Inventory inv = getInventory();
+ inv.setPaperdollItemVisual(Inventory.PAPERDOLL_RHAND);
+ inv.setPaperdollItemVisual(Inventory.PAPERDOLL_LHAND);
+ inv.setPaperdollItemVisual(Inventory.PAPERDOLL_LRHAND);
+ broadcastUserInfo();
+ checkIfNoDressMe();
+ }
+
+ private void checkIfNoDressMe()
+ {
+ if (_armorSkin == null && _weaponSkin == null)
+ {
+ setDressMe(false);
+
+ }
+ }
}
\ No newline at end of file
diff --git a/java/com/dream/game/model/holders/DressMeEffectHolder.java b/java/com/dream/game/model/holders/DressMeEffectHolder.java
new file mode 100644
index 0000000..c36824c
--- /dev/null
+++ b/java/com/dream/game/model/holders/DressMeEffectHolder.java
@@ -0,0 +1,39 @@
+package com.dream.game.model.holders;
+
+import com.dream.data.xml.StatSet;
+
+public class DressMeEffectHolder
+{
+ private final int _skillId;
+ private final int _level;
+ private final boolean _recurring;
+ private final int _interval;
+
+ public DressMeEffectHolder(StatSet set)
+ {
+ _skillId = set.getInteger("skillId", 0);
+ _level = set.getInteger("level", 1);
+ _recurring = set.getBool("recurring", false);
+ _interval = set.getInteger("interval", 60);
+ }
+
+ public int getSkillId()
+ {
+ return _skillId;
+ }
+
+ public int getLevel()
+ {
+ return _level;
+ }
+
+ public boolean isRecurring()
+ {
+ return _recurring;
+ }
+
+ public int getInterval()
+ {
+ return _interval;
+ }
+}
\ No newline at end of file
diff --git a/java/com/dream/game/model/holders/DressMeHolder.java b/java/com/dream/game/model/holders/DressMeHolder.java
new file mode 100644
index 0000000..d503a32
--- /dev/null
+++ b/java/com/dream/game/model/holders/DressMeHolder.java
@@ -0,0 +1,117 @@
+package com.dream.game.model.holders;
+
+import com.dream.data.xml.StatSet;
+
+public class DressMeHolder
+{
+ private final int _skillId;
+ private final String _name;
+ private final boolean _isVip;
+ private final DressMeVisualType _type;
+
+ private int _chestId, _legsId, _glovesId, _feetId, _helmetId;
+ private int _rHandId, _lHandId, _lrHandId;
+ private String _weaponTypeVisual;
+
+ private DressMeEffectHolder _effect;
+
+ public DressMeHolder(StatSet set)
+ {
+ _skillId = set.getInteger("skillId");
+ _name = set.getString("name", "");
+ _type = DressMeVisualType.valueOf(set.getString("type", "ARMOR"));
+ _isVip = set.getBool("isVip", false);
+ }
+
+ public void setVisualSet(StatSet set)
+ {
+ _chestId = set.getInteger("chest", 0);
+ _legsId = set.getInteger("legs", 0);
+ _glovesId = set.getInteger("gloves", 0);
+ _feetId = set.getInteger("feet", 0);
+ _helmetId = set.getInteger("helmet", 0);
+ }
+
+ public void setWeaponSet(StatSet set)
+ {
+ _rHandId = set.getInteger("rhand", 0);
+ _lHandId = set.getInteger("lhand", 0);
+ _lrHandId = set.getInteger("lrhand", 0);
+ _weaponTypeVisual = set.getString("type", "");
+ }
+
+ public void setEffect(DressMeEffectHolder effect)
+ {
+ _effect = effect;
+ }
+
+ public int getSkillId()
+ {
+ return _skillId;
+ }
+
+ public String getName()
+ {
+ return _name;
+ }
+
+ public boolean isVip()
+ {
+ return _isVip;
+ }
+
+ public DressMeVisualType getType()
+ {
+ return _type;
+ }
+
+ public int getChestId()
+ {
+ return _chestId;
+ }
+
+ public int getLegsId()
+ {
+ return _legsId;
+ }
+
+ public int getGlovesId()
+ {
+ return _glovesId;
+ }
+
+ public int getFeetId()
+ {
+ return _feetId;
+ }
+
+ public int getHelmetId()
+ {
+ return _helmetId;
+ }
+
+ public String getWeaponTypeVisual()
+ {
+ return _weaponTypeVisual;
+ }
+
+ public int getRightHandId()
+ {
+ return _rHandId;
+ }
+
+ public int getLeftHandId()
+ {
+ return _lHandId;
+ }
+
+ public int getTwoHandId()
+ {
+ return _lrHandId;
+ }
+
+ public DressMeEffectHolder getEffect()
+ {
+ return _effect;
+ }
+}
diff --git a/java/com/dream/game/model/holders/DressMeVisualType.java b/java/com/dream/game/model/holders/DressMeVisualType.java
new file mode 100644
index 0000000..53d25ad
--- /dev/null
+++ b/java/com/dream/game/model/holders/DressMeVisualType.java
@@ -0,0 +1,8 @@
+package com.dream.game.model.holders;
+
+public enum DressMeVisualType
+{
+ ARMOR,
+ CLOAK,
+ WEAPON
+}
\ No newline at end of file
diff --git a/java/com/dream/game/model/itemcontainer/Inventory.java b/java/com/dream/game/model/itemcontainer/Inventory.java
index 3610144..95549f6 100644
--- a/java/com/dream/game/model/itemcontainer/Inventory.java
+++ b/java/com/dream/game/model/itemcontainer/Inventory.java
@@ -629,6 +629,7 @@
return -1;
}
+
private final L2ItemInstance[] _paperdoll;
private final List<PaperdollListener> _paperdollListeners;
@@ -1262,6 +1263,66 @@
_paperdollListeners.get(2).notifyEquiped(i, getPaperdollItem(i));
}
}
+
+ public void setPaperdollItemVisual(int slot)
+ {
+ L2ItemInstance item = getPaperdollItem(slot);
+ L2ItemInstance old = _paperdoll[slot];
+ if (old != item)
+ {
+ if (old != null)
+ {
+ _paperdoll[slot] = null;
+ old.setLocation(getBaseLocation());
+ old.setLastChange(L2ItemInstance.MODIFIED);
+
+ int mask = 0;
+ for (int i = 0; i < PAPERDOLL_LRHAND; i++)
+ {
+ L2ItemInstance pi = _paperdoll[i];
+ if (pi != null)
+ {
+ mask |= pi.getItem().getItemMask();
+ }
+ }
+ _wearedMask = mask;
+
+ for (PaperdollListener temp : _paperdollListeners)
+ {
+ try
+ {
+ temp.notifyUnequiped(slot, old);
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ if (item != null)
+ {
+ _paperdoll[slot] = item;
+ item.setLocation(getEquipLocation(), slot);
+ item.setLastChange(L2ItemInstance.MODIFIED);
+ _wearedMask |= item.getItem().getItemMask();
+ for (PaperdollListener temp : _paperdollListeners)
+ {
+ temp.notifyEquiped(slot, item);
+ }
+ }
+ }
+
+
+ L2PcInstance owner = getOwner() instanceof L2PcInstance ? (L2PcInstance) getOwner() : null;
+ if (owner != null)
+ {
+ owner.broadcastUserInfo();
+ owner.broadcastFullInfoImpl();
+ }
+ }
+
+
public synchronized L2ItemInstance setPaperdollItem(int slot, L2ItemInstance item)
{
diff --git a/java/com/dream/game/network/serverpackets/CharInfo.java b/java/com/dream/game/network/serverpackets/CharInfo.java
index 080bbec..c98e25a 100644
--- a/java/com/dream/game/network/serverpackets/CharInfo.java
+++ b/java/com/dream/game/network/serverpackets/CharInfo.java
@@ -3,10 +3,13 @@
import com.dream.game.datatables.sql.NpcTable;
import com.dream.game.manager.CursedWeaponsManager;
import com.dream.game.model.actor.L2Decoy;
+import com.dream.game.model.actor.instance.L2ItemInstance;
import com.dream.game.model.actor.instance.L2PcInstance;
+import com.dream.game.model.holders.DressMeHolder;
import com.dream.game.model.itemcontainer.Inventory;
import com.dream.game.skills.AbnormalEffect;
import com.dream.game.templates.chars.L2NpcTemplate;
+import com.dream.game.templates.item.L2Weapon;
import org.apache.log4j.Logger;
@@ -194,18 +197,70 @@
writeD(_activeChar.getBaseClass());
}
- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HAIRALL));
+ DressMeHolder armorSkin = _activeChar.getArmorSkin();
+ DressMeHolder weaponSkin = _activeChar.getWeaponSkin();
+
+ int hairall = _inv.getPaperdollItemId(Inventory.PAPERDOLL_HAIRALL);
+ writeD((armorSkin != null && hairall > 0 && armorSkin.getHelmetId() > 0) ? armorSkin.getHelmetId() : hairall);
+
writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HEAD));
- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LHAND));
- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_GLOVES));
- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_CHEST));
- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_LEGS));
- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_FEET));
+
+
+ int rhand = _inv.getPaperdollItemId(Inventory.PAPERDOLL_RHAND);
+ int lhand = _inv.getPaperdollItemId(Inventory.PAPERDOLL_LHAND);
+
+ if (_activeChar.isDressMe() && weaponSkin != null)
+ {
+ String equippedWeaponType = "";
+ L2ItemInstance weaponInstance = _activeChar.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND);
+
+ if (weaponInstance != null && weaponInstance.getItem() instanceof L2Weapon)
+ {
+ L2Weapon weapon = (L2Weapon) weaponInstance.getItem();
+ equippedWeaponType = weapon.getItemType().toString().toLowerCase();
+ }
+
+ if (equippedWeaponType.equalsIgnoreCase(weaponSkin.getWeaponTypeVisual()))
+ {
+
+ if (weaponSkin.getTwoHandId() > 0)
+ {
+ rhand = weaponSkin.getTwoHandId();
+ lhand = 0;
+ }
+ else
+ {
+ if (weaponSkin.getRightHandId() > 0 && rhand > 0)
+ rhand = weaponSkin.getRightHandId();
+ if (weaponSkin.getLeftHandId() > 0 && lhand > 0)
+ lhand = weaponSkin.getLeftHandId();
+ }
+
+ }
+ }
+
+ writeD(rhand); // PaperdollItemId RHAND
+ writeD(lhand); // PaperdollItemId LHAND
+
+
+ int glovesOId = _inv.getPaperdollItemId(Inventory.PAPERDOLL_GLOVES);
+ int chestOId = _inv.getPaperdollItemId(Inventory.PAPERDOLL_CHEST);
+ int legsOId = _inv.getPaperdollItemId(Inventory.PAPERDOLL_LEGS);
+ int feetOId = _inv.getPaperdollItemId(Inventory.PAPERDOLL_FEET);
+
+ writeD((armorSkin != null && glovesOId > 0 && armorSkin.getGlovesId() > 0) ? armorSkin.getGlovesId() : glovesOId);
+ writeD((armorSkin != null && chestOId > 0 && armorSkin.getChestId() > 0) ? armorSkin.getChestId() : chestOId);
+ writeD((armorSkin != null && legsOId > 0 && armorSkin.getLegsId() > 0) ? armorSkin.getLegsId() : legsOId);
+ writeD((armorSkin != null && feetOId > 0 && armorSkin.getFeetId() > 0) ? armorSkin.getFeetId() : feetOId);
+
writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_BACK));
- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_HAIR));
- writeD(_inv.getPaperdollItemId(Inventory.PAPERDOLL_FACE));
+ writeD(rhand); // PaperdollItemId RHAND
+
+ int hair = _inv.getPaperdollItemId(Inventory.PAPERDOLL_HAIR);
+ writeD((armorSkin != null && hair > 0 && armorSkin.getHelmetId() > 0) ? armorSkin.getHelmetId() : hair);
+
+ int face = _inv.getPaperdollItemId(Inventory.PAPERDOLL_FACE);
+ writeD((armorSkin != null && face > 0 && armorSkin.getHelmetId() > 0) ? armorSkin.getHelmetId() : face);
writeH(0x00);
writeH(0x00);
\ No newline at end of file
diff --git a/java/com/dream/game/network/serverpackets/UserInfo.java b/java/com/dream/game/network/serverpackets/UserInfo.java
index adcddcf..c32a4c0 100644
--- a/java/com/dream/game/network/serverpackets/UserInfo.java
+++ b/java/com/dream/game/network/serverpackets/UserInfo.java
@@ -3,9 +3,12 @@
import com.dream.game.datatables.sql.NpcTable;
import com.dream.game.manager.CursedWeaponsManager;
import com.dream.game.model.actor.L2Summon;
+import com.dream.game.model.actor.instance.L2ItemInstance;
import com.dream.game.model.actor.instance.L2PcInstance;
+import com.dream.game.model.holders.DressMeHolder;
import com.dream.game.model.itemcontainer.Inventory;
import com.dream.game.templates.chars.L2NpcTemplate;
+import com.dream.game.templates.item.L2Weapon;
public class UserInfo extends L2GameServerPacket
{
@@ -84,41 +87,137 @@
writeD(0x28);
- writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_HAIRALL));
+ DressMeHolder armorSkin = _activeChar.getArmorSkin();
+ DressMeHolder weaponSkin = _activeChar.getWeaponSkin();
+
+ int hairallObj = _activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_HAIRALL);
+ writeD((armorSkin != null && hairallObj > 0 && armorSkin.getHelmetId() > 0) ? armorSkin.getHelmetId() : hairallObj);
writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_REAR));
writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LEAR));
writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_NECK));
writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RFINGER));
writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LFINGER));
writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_HEAD));
- writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RHAND));
- writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LHAND));
- writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_GLOVES));
- writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_CHEST));
- writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LEGS));
- writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_FEET));
- writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_BACK));
- writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RHAND));
- writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_HAIR));
- writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_FACE));
- writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HAIRALL));
+ int rhandObj = _activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RHAND);
+ int lhandObj = _activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LHAND);
+
+ if (_activeChar.isDressMe() && weaponSkin != null)
+ {
+ String equippedWeaponType = "";
+ L2ItemInstance weaponInstance = _activeChar.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND);
+
+ if (weaponInstance != null && weaponInstance.getItem() instanceof L2Weapon)
+ {
+ L2Weapon weapon = (L2Weapon) weaponInstance.getItem();
+ equippedWeaponType = weapon.getItemType().toString().toLowerCase();
+ }
+
+ if (equippedWeaponType.equalsIgnoreCase(weaponSkin.getWeaponTypeVisual()))
+ {
+
+ if (weaponSkin.getTwoHandId() > 0)
+ {
+ rhandObj = weaponSkin.getTwoHandId();
+ lhandObj = 0;
+ }
+ else
+ {
+ if (weaponSkin.getRightHandId() > 0 && rhandObj > 0)
+ rhandObj = weaponSkin.getRightHandId();
+ if (weaponSkin.getLeftHandId() > 0 && lhandObj > 0)
+ lhandObj = weaponSkin.getLeftHandId();
+ }
+
+ }
+ }
+
+ // Armas
+ writeD(rhandObj); // PaperdollItemId RHAND
+ writeD(lhandObj); // PaperdollItemId LHAND
+
+ int glovesOId = _activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_GLOVES);
+ int chestOId = _activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_CHEST);
+ int legsOId = _activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_LEGS);
+ int feetOId = _activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_FEET);
+
+ writeD((armorSkin != null && glovesOId > 0 && armorSkin.getGlovesId() > 0) ? armorSkin.getGlovesId() : glovesOId);
+ writeD((armorSkin != null && chestOId > 0 && armorSkin.getChestId() > 0) ? armorSkin.getChestId() : chestOId);
+ writeD((armorSkin != null && legsOId > 0 && armorSkin.getLegsId() > 0) ? armorSkin.getLegsId() : legsOId);
+ writeD((armorSkin != null && feetOId > 0 && armorSkin.getFeetId() > 0) ? armorSkin.getFeetId() : feetOId);
+
+ writeD(_activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_BACK));
+ writeD(rhandObj);
+ int hairObj = _activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_HAIR);
+ writeD((armorSkin != null && hairObj > 0 && armorSkin.getHelmetId() > 0) ? armorSkin.getHelmetId() : hairObj);
+
+ int faceObj = _activeChar.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_FACE);
+ writeD((armorSkin != null && faceObj > 0 && armorSkin.getHelmetId() > 0) ? armorSkin.getHelmetId() : faceObj);
+
+ int hairall = _activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HAIRALL);
+ writeD((armorSkin != null && hairall > 0 && armorSkin.getHelmetId() > 0) ? armorSkin.getHelmetId() : hairall);
+
writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_REAR));
writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LEAR));
writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_NECK));
writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RFINGER));
writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LFINGER));
writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HEAD));
- writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
- writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LHAND));
- writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_GLOVES));
- writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_CHEST));
- writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LEGS));
- writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_FEET));
+
+ int rhand = _activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RHAND);
+ int lhand = _activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LHAND);
+
+ if (_activeChar.isDressMe() && weaponSkin != null)
+ {
+ String equippedWeaponType = "";
+ L2ItemInstance weaponInstance = _activeChar.getInventory().getPaperdollItem(Inventory.PAPERDOLL_RHAND);
+
+ if (weaponInstance != null && weaponInstance.getItem() instanceof L2Weapon)
+ {
+ L2Weapon weapon = (L2Weapon) weaponInstance.getItem();
+ equippedWeaponType = weapon.getItemType().toString().toLowerCase();
+ }
+
+ if (equippedWeaponType.equalsIgnoreCase(weaponSkin.getWeaponTypeVisual()))
+ {
+
+ if (weaponSkin.getTwoHandId() > 0)
+ {
+ rhand = weaponSkin.getTwoHandId();
+ lhand = 0;
+ }
+ else
+ {
+ if (weaponSkin.getRightHandId() > 0 && rhand > 0)
+ rhand = weaponSkin.getRightHandId();
+ if (weaponSkin.getLeftHandId() > 0 && lhand > 0)
+ lhand = weaponSkin.getLeftHandId();
+ }
+
+
+
+ }
+ }
+
+ writeD(rhand); // PaperdollItemId RHAND
+ writeD(lhand); // PaperdollItemId LHAND
+ int glovesId = _activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_GLOVES);
+ int chestId = _activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_CHEST);
+ int legsId = _activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_LEGS);
+ int feetId = _activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_FEET);
+
+ writeD((armorSkin != null && glovesId > 0 && armorSkin.getGlovesId() > 0) ? armorSkin.getGlovesId() : glovesId);
+ writeD((armorSkin != null && chestId > 0 && armorSkin.getChestId() > 0) ? armorSkin.getChestId() : chestId);
+ writeD((armorSkin != null && legsId > 0 && armorSkin.getLegsId() > 0) ? armorSkin.getLegsId() : legsId);
+ writeD((armorSkin != null && feetId > 0 && armorSkin.getFeetId() > 0) ? armorSkin.getFeetId() : feetId);
+
writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_BACK));
- writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RHAND));
- writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HAIR));
- writeD(_activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_FACE));
+ writeD(rhand);
+
+ int hair = _activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_HAIR);
+ writeD((armorSkin != null && hair > 0 && armorSkin.getHelmetId() > 0) ? armorSkin.getHelmetId() : hair);
+ int face = _activeChar.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_FACE);
+ writeD((armorSkin != null && face > 0 && armorSkin.getHelmetId() > 0) ? armorSkin.getHelmetId() : face);
writeH(0x00);
writeH(0x00);
diff --git a/java/com/dream/game/templates/skills/L2SkillType.java b/java/com/dream/game/templates/skills/L2SkillType.java
index 1394060..9acfda6 100644
--- a/java/com/dream/game/templates/skills/L2SkillType.java
+++ b/java/com/dream/game/templates/skills/L2SkillType.java
@@ -1,7 +1,5 @@
package com.dream.game.templates.skills;
-import java.lang.reflect.Constructor;
-
import com.dream.game.model.L2Skill;
import com.dream.game.skills.l2skills.L2ScriptSkill;
import com.dream.game.skills.l2skills.L2SkillChargeDmg;
@@ -13,8 +11,11 @@
import com.dream.game.skills.l2skills.L2SkillSummon;
import com.dream.util.StatsSet;
+import java.lang.reflect.Constructor;
+
public enum L2SkillType
{
+ DRESSME,
PDAM,
MDAM,
CPDAM,