Skill enchant related work in progress.

This commit is contained in:
MobiusDev
2016-06-19 21:37:49 +00:00
parent bf739d2ca1
commit b56363ba31
14 changed files with 1200 additions and 271 deletions

View File

@@ -21,6 +21,7 @@ import java.util.List;
import com.l2jmobius.commons.network.PacketWriter;
import com.l2jmobius.gameserver.data.xml.impl.EnchantSkillGroupsData;
import com.l2jmobius.gameserver.data.xml.impl.SkillData;
import com.l2jmobius.gameserver.model.L2EnchantSkillGroup.EnchantSkillHolder;
import com.l2jmobius.gameserver.model.L2EnchantSkillLearn;
import com.l2jmobius.gameserver.network.client.OutgoingPackets;
@@ -31,19 +32,21 @@ public final class ExEnchantSkillInfo implements IClientOutgoingPacket
private final int _id;
private final int _lvl;
private final int _maxlvl;
private boolean _maxEnchanted = false;
public ExEnchantSkillInfo(int id, int lvl)
{
_id = id;
_lvl = lvl;
_maxlvl = SkillData.getInstance().getMaxLevel(_id);
final L2EnchantSkillLearn enchantLearn = EnchantSkillGroupsData.getInstance().getSkillEnchantmentBySkillId(_id);
// do we have this skill?
if (enchantLearn != null)
{
// skill already enchanted?
if (_lvl > 100)
if (_lvl > 1000)
{
_maxEnchanted = enchantLearn.isMaxEnchant(_lvl);
@@ -51,24 +54,19 @@ public final class ExEnchantSkillInfo implements IClientOutgoingPacket
final EnchantSkillHolder esd = enchantLearn.getEnchantSkillHolder(_lvl);
// if it exists add it
if (esd != null)
if ((esd != null) && !_maxEnchanted)
{
_routes.add(_lvl); // current enchant add firts
_routes.add(_lvl + 1); // current enchant add firts
}
final int skillLvL = (_lvl % 100);
for (int route : enchantLearn.getAllRoutes())
{
if (((route * 100) + skillLvL) == _lvl)
if (((route * 1000) + (_lvl % 1000)) == _lvl)
{
continue;
}
// add other levels of all routes - same lvl as enchanted
// lvl
_routes.add((route * 100) + skillLvL);
_routes.add((route * 1000) + (_lvl % 1000));
}
}
else
// not already enchanted
@@ -76,7 +74,7 @@ public final class ExEnchantSkillInfo implements IClientOutgoingPacket
for (int route : enchantLearn.getAllRoutes())
{
// add first level (+1) of all routes
_routes.add((route * 100) + 1);
_routes.add((route * 1000) + 1);
}
}
}
@@ -88,11 +86,25 @@ public final class ExEnchantSkillInfo implements IClientOutgoingPacket
OutgoingPackets.EX_ENCHANT_SKILL_INFO.writeId(packet);
packet.writeD(_id);
packet.writeD(_lvl);
if (_lvl < 100)
{
packet.writeD(_lvl);
}
else
{
packet.writeH(_maxlvl);
packet.writeH(_lvl);
}
packet.writeD(_maxEnchanted ? 0 : 1);
packet.writeD(_lvl > 100 ? 1 : 0); // enchanted?
packet.writeD(_lvl > 1000 ? 1 : 0); // enchanted?
packet.writeD(_routes.size());
_routes.forEach(packet::writeD);
for (int level : _routes)
{
packet.writeH(_maxlvl);
packet.writeH(level);
}
return true;
}
}

View File

@@ -19,6 +19,7 @@ package com.l2jmobius.gameserver.network.serverpackets;
import com.l2jmobius.Config;
import com.l2jmobius.commons.network.PacketWriter;
import com.l2jmobius.gameserver.data.xml.impl.EnchantSkillGroupsData;
import com.l2jmobius.gameserver.data.xml.impl.SkillData;
import com.l2jmobius.gameserver.model.L2EnchantSkillGroup.EnchantSkillHolder;
import com.l2jmobius.gameserver.model.L2EnchantSkillLearn;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
@@ -34,6 +35,7 @@ public class ExEnchantSkillInfoDetail implements IClientOutgoingPacket
private static final int TYPE_SAFE_ENCHANT = 1;
private static final int TYPE_UNTRAIN_ENCHANT = 2;
private static final int TYPE_CHANGE_ENCHANT = 3;
private static final int TYPE_IMMORTAL_ENCHANT = 4;
private int bookId = 0;
private int reqCount = 0;
@@ -41,21 +43,26 @@ public class ExEnchantSkillInfoDetail implements IClientOutgoingPacket
private final int _type;
private final int _skillid;
private final int _skilllvl;
private final int _maxlvl;
private final int _chance;
private int _sp;
private final int _adenacount;
public ExEnchantSkillInfoDetail(int type, int skillid, int skilllvl, L2PcInstance ply)
{
_type = type;
_skillid = skillid;
_skilllvl = skilllvl;
_maxlvl = SkillData.getInstance().getMaxLevel(_skillid);
final L2EnchantSkillLearn enchantLearn = EnchantSkillGroupsData.getInstance().getSkillEnchantmentBySkillId(skillid);
EnchantSkillHolder esd = null;
// do we have this skill?
if (enchantLearn != null)
{
if (skilllvl > 100)
if (_skilllvl > 1000)
{
esd = enchantLearn.getEnchantSkillHolder(skilllvl);
esd = enchantLearn.getEnchantSkillHolder(_skilllvl);
}
else
{
@@ -65,48 +72,125 @@ public class ExEnchantSkillInfoDetail implements IClientOutgoingPacket
if (esd == null)
{
throw new IllegalArgumentException("Skill " + skillid + " dont have enchant data for level " + skilllvl);
throw new IllegalArgumentException("Skill " + skillid + " dont have enchant data for level " + _skilllvl);
}
if (type == 0)
{
multi = Config.NORMAL_ENCHANT_COST_MULTIPLIER;
multi = EnchantSkillGroupsData.NORMAL_ENCHANT_COST_MULTIPLIER;
}
else if (type == 1)
{
multi = Config.SAFE_ENCHANT_COST_MULTIPLIER;
multi = EnchantSkillGroupsData.SAFE_ENCHANT_COST_MULTIPLIER;
}
_chance = esd.getRate(ply);
_sp = esd.getSpCost();
if (type == TYPE_UNTRAIN_ENCHANT)
if (type != TYPE_IMMORTAL_ENCHANT)
{
_sp = (int) (0.8 * _sp);
_chance = esd.getRate(ply);
_sp = esd.getSpCost();
if (type == TYPE_UNTRAIN_ENCHANT)
{
_sp = (int) (0.8 * _sp);
}
_adenacount = esd.getAdenaCost() * multi;
}
else
{
_chance = 100;
_sp = 0;
_adenacount = 0;
}
_adenacount = esd.getAdenaCost() * multi;
_type = type;
_skillid = skillid;
_skilllvl = skilllvl;
final int _elvl = ((_skilllvl % 100) - 1) / 10;
switch (type)
{
case TYPE_NORMAL_ENCHANT:
bookId = EnchantSkillGroupsData.NORMAL_ENCHANT_BOOK;
reqCount = (((_skilllvl % 100) > 1) ? 0 : 1);
{
if (ply.getClassId().level() < 4)
{
bookId = EnchantSkillGroupsData.NORMAL_ENCHANT_BOOK_OLD;
}
else if (_elvl == 0)
{
bookId = EnchantSkillGroupsData.NORMAL_ENCHANT_BOOK;
}
else if (_elvl == 1)
{
bookId = EnchantSkillGroupsData.NORMAL_ENCHANT_BOOK_V2;
}
else
{
bookId = EnchantSkillGroupsData.NORMAL_ENCHANT_BOOK_V3;
}
reqCount = 1;
break;
}
case TYPE_SAFE_ENCHANT:
bookId = EnchantSkillGroupsData.SAFE_ENCHANT_BOOK;
reqCount = 1;
break;
case TYPE_UNTRAIN_ENCHANT:
bookId = EnchantSkillGroupsData.UNTRAIN_ENCHANT_BOOK;
{
if (ply.getClassId().level() < 4)
{
bookId = EnchantSkillGroupsData.SAFE_ENCHANT_BOOK_OLD;
}
else if (_elvl == 0)
{
bookId = EnchantSkillGroupsData.SAFE_ENCHANT_BOOK;
}
else if (_elvl == 1)
{
bookId = EnchantSkillGroupsData.SAFE_ENCHANT_BOOK_V2;
}
else
{
bookId = EnchantSkillGroupsData.SAFE_ENCHANT_BOOK_V3;
}
reqCount = 1;
break;
}
case TYPE_CHANGE_ENCHANT:
bookId = EnchantSkillGroupsData.CHANGE_ENCHANT_BOOK;
{
if (ply.getClassId().level() < 4)
{
bookId = EnchantSkillGroupsData.CHANGE_ENCHANT_BOOK_OLD;
}
else if (_elvl == 0)
{
bookId = EnchantSkillGroupsData.CHANGE_ENCHANT_BOOK;
}
else if (_elvl == 1)
{
bookId = EnchantSkillGroupsData.CHANGE_ENCHANT_BOOK_V2;
}
else
{
bookId = EnchantSkillGroupsData.CHANGE_ENCHANT_BOOK_V3;
}
reqCount = 1;
break;
}
case TYPE_IMMORTAL_ENCHANT:
{
if (ply.getClassId().level() < 4)
{
bookId = EnchantSkillGroupsData.IMMORTAL_SCROLL;
}
else if (_elvl == 0)
{
bookId = EnchantSkillGroupsData.IMMORTAL_SCROLL;
}
else if (_elvl == 1)
{
bookId = EnchantSkillGroupsData.IMMORTAL_SCROLL_V2;
}
else
{
bookId = EnchantSkillGroupsData.IMMORTAL_SCROLL_V3;
}
reqCount = 1;
break;
}
default:
{
return;
}
}
if ((type != TYPE_SAFE_ENCHANT) && !Config.ES_SP_BOOK_NEEDED)
@@ -122,7 +206,8 @@ public class ExEnchantSkillInfoDetail implements IClientOutgoingPacket
packet.writeD(_type);
packet.writeD(_skillid);
packet.writeD(_skilllvl);
packet.writeH(_maxlvl);
packet.writeH(_skilllvl);
packet.writeQ(_sp * multi); // sp
packet.writeD(_chance); // exp
packet.writeD(0x02); // items count?

View File

@@ -16,11 +16,10 @@
*/
package com.l2jmobius.gameserver.network.serverpackets;
import java.util.LinkedList;
import java.util.ArrayList;
import java.util.List;
import com.l2jmobius.commons.network.PacketWriter;
import com.l2jmobius.gameserver.model.skills.Skill;
import com.l2jmobius.gameserver.network.client.OutgoingPackets;
public class ExEnchantSkillList implements IClientOutgoingPacket
@@ -34,16 +33,29 @@ public class ExEnchantSkillList implements IClientOutgoingPacket
}
private final EnchantSkillType _type;
private final List<Skill> _skills = new LinkedList<>();
private final List<Skill> _skills;
static class Skill
{
public int id;
public int nextLevel;
Skill(int pId, int pNextLevel)
{
id = pId;
nextLevel = pNextLevel;
}
}
public void addSkill(int id, int level)
{
_skills.add(new Skill(id, level));
}
public ExEnchantSkillList(EnchantSkillType type)
{
_type = type;
}
public void addSkill(Skill skill)
{
_skills.add(skill);
_skills = new ArrayList<>();
}
@Override
@@ -53,10 +65,10 @@ public class ExEnchantSkillList implements IClientOutgoingPacket
packet.writeD(_type.ordinal());
packet.writeD(_skills.size());
for (Skill skill : _skills)
for (Skill sk : _skills)
{
packet.writeD(skill.getId());
packet.writeD(skill.getLevel());
packet.writeD(sk.id);
packet.writeD(sk.nextLevel);
}
return true;
}