You should only learn skills from trainers.

This commit is contained in:
MobiusDevelopment
2019-11-24 12:18:35 +00:00
parent 705c22b169
commit b7701eefb4

View File

@@ -25,7 +25,9 @@ import org.l2jmobius.gameserver.data.SkillTreeTable;
import org.l2jmobius.gameserver.model.ShortCut; import org.l2jmobius.gameserver.model.ShortCut;
import org.l2jmobius.gameserver.model.Skill; import org.l2jmobius.gameserver.model.Skill;
import org.l2jmobius.gameserver.model.SkillLearn; import org.l2jmobius.gameserver.model.SkillLearn;
import org.l2jmobius.gameserver.model.WorldObject;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.actor.instance.TrainerInstance;
import org.l2jmobius.gameserver.network.ClientThread; import org.l2jmobius.gameserver.network.ClientThread;
import org.l2jmobius.gameserver.network.serverpackets.AquireSkillList; import org.l2jmobius.gameserver.network.serverpackets.AquireSkillList;
import org.l2jmobius.gameserver.network.serverpackets.ShortCutRegister; import org.l2jmobius.gameserver.network.serverpackets.ShortCutRegister;
@@ -39,25 +41,47 @@ public class RequestAquireSkill extends ClientBasePacket
public RequestAquireSkill(byte[] rawPacket, ClientThread client) throws IOException public RequestAquireSkill(byte[] rawPacket, ClientThread client) throws IOException
{ {
super(rawPacket); super(rawPacket);
final PlayerInstance player = client.getActiveChar();
final int id = readD(); final int id = readD();
final int level = readD(); final int level = readD();
final PlayerInstance player = client.getActiveChar();
// Prevent learning skills far from trainer.
if (!(player.getTarget() instanceof TrainerInstance))
{
return;
}
boolean found = false;
for (WorldObject object : player.getKnownObjects())
{
if ((object instanceof TrainerInstance) && (player.calculateDistance2D(object) < 250))
{
found = true;
break;
}
}
if (!found)
{
return;
}
final Skill skill = SkillTable.getInstance().getInfo(id, level); final Skill skill = SkillTable.getInstance().getInfo(id, level);
Collection<SkillLearn> skills = SkillTreeTable.getInstance().getAvailableSkills(player); Collection<SkillLearn> skills = SkillTreeTable.getInstance().getAvailableSkills(player);
int _requiredSp = 0;
for (SkillLearn skill2 : skills) int requiredSp = 0;
for (SkillLearn skillLearn : skills)
{ {
if (skill2.getId() != id) if (skillLearn.getId() != id)
{ {
continue; continue;
} }
_requiredSp = skill2.getSpCost(); requiredSp = skillLearn.getSpCost();
break; break;
} }
if (player.getSp() >= _requiredSp) if (player.getSp() >= requiredSp)
{ {
player.addSkill(skill); player.addSkill(skill);
player.setSp(player.getSp() - _requiredSp); player.setSp(player.getSp() - requiredSp);
final StatusUpdate su = new StatusUpdate(player.getObjectId()); final StatusUpdate su = new StatusUpdate(player.getObjectId());
su.addAttribute(StatusUpdate.SP, player.getSp()); su.addAttribute(StatusUpdate.SP, player.getSp());
player.sendPacket(su); player.sendPacket(su);
@@ -79,14 +103,13 @@ public class RequestAquireSkill extends ClientBasePacket
} }
else else
{ {
final SystemMessage sm = new SystemMessage(SystemMessage.NOT_ENOUGH_SP_TO_LEARN_SKILL); player.sendPacket(new SystemMessage(SystemMessage.NOT_ENOUGH_SP_TO_LEARN_SKILL));
player.sendPacket(sm);
} }
skills = SkillTreeTable.getInstance().getAvailableSkills(player); skills = SkillTreeTable.getInstance().getAvailableSkills(player);
final AquireSkillList asl = new AquireSkillList(); final AquireSkillList asl = new AquireSkillList();
for (SkillLearn skill2 : skills) for (SkillLearn skillLearn : skills)
{ {
asl.addSkill(skill2.getId(), skill2.getLevel(), skill2.getLevel(), skill2.getSpCost(), 0); asl.addSkill(skillLearn.getId(), skillLearn.getLevel(), skillLearn.getLevel(), skillLearn.getSpCost(), 0);
} }
player.getNetConnection().sendPacket(asl); player.getNetConnection().sendPacket(asl);
} }