У меня на пвп сервере автоматическое изучение скилов.
Когда игрок у нпц берет первую или вторую профу - он подвисает на 10-20 секунд.
Также это создает небольшие лаги на сервере.
Есть ли способ сделать автоизучение или смену саба без лагов?
Код
Добавлено через 1 минуту
Когда игрок у нпц берет первую или вторую профу - он подвисает на 10-20 секунд.
Также это создает небольшие лаги на сервере.
Есть ли способ сделать автоизучение или смену саба без лагов?
Код
Код:
public int giveAvailableSkills(boolean includedByFs, boolean includeAutoGet)
{
int unLearnable = 0;
int skillCounter = 0;
// Get available skills
FastList<L2SkillLearn> skills = SkillTreesData.getInstance().getAvailableSkills(this, getClassId(), includedByFs, includeAutoGet);
while (skills.size() > unLearnable)
{
for (L2SkillLearn s: skills)
{
L2Skill sk = SkillTable.getInstance().getInfo(s.getSkillId(), s.getSkillLevel());
if (sk == null || (sk.getId() == L2Skill.SKILL_DIVINE_INSPIRATION && !Config.AUTO_LEARN_DIVINE_INSPIRATION && !isGM()))
{
unLearnable++;
continue;
}
if (getSkillLevel(sk.getId()) == -1)
{
skillCounter++;
}
// fix when learning toggle skills
if (sk.isToggle())
{
L2Effect toggleEffect = getFirstEffect(sk.getId());
if (toggleEffect != null)
{
// stop old toggle skill effect, and give new toggle skill effect back
toggleEffect.exit();
sk.getEffects(this, this);
}
}
addSkill(sk, true);
}
//Get new available skills, some skills depend of previous skills to be available.
skills = SkillTreesData.getInstance().getAvailableSkills(this, getClassId(), includedByFs, includeAutoGet);
}
sendMessage("You have learned " + skillCounter + " new skills.");
return skillCounter;
}
/**
* Give all available AutoGet skills to the player.<br>
*/
public void giveAvailableAutoGetSkills()
{
// Get available skills
final FastList<L2SkillLearn> autoGetSkills = SkillTreesData.getInstance().getAvailableAutoGetSkills(this);
if ((autoGetSkills != null) && !autoGetSkills.isEmpty())
{
for (L2SkillLearn s: autoGetSkills)
{
final L2Skill skill = SkillTable.getInstance().getInfo(s.getSkillId(), s.getSkillLevel());
if (skill != null)
{
addSkill(skill, true);
}
else
{
_log.warning("Skipped null autoGet Skill for player:" + getName() + "[" + getObjectId() + "]");
}
}
}
}
public L2Skill addSkill(L2Skill newSkill, boolean store)
{
// Add a skill to the L2PcInstance _skills and its Func objects to the calculator set of the L2PcInstance
L2Skill oldSkill = super.addSkill(newSkill);
// Add or update a L2PcInstance skill in the character_skills table of the database
if (store)
{
storeSkill(newSkill, oldSkill, -1);
}
return oldSkill;
}
Добавлено через 1 минуту
Код:
public FastList<L2SkillLearn> getAvailableSkills(L2PcInstance player, ClassId classId, boolean includeByFs, boolean includeAutoGet)
{
final FastList<L2SkillLearn> result = new FastList<L2SkillLearn>();
final FastMap<Integer, L2SkillLearn> skills = getCompleteClassSkillTree(classId);
if (skills.isEmpty())
{
// The Skill Tree for this class is undefined.
_log.warning(getClass().getSimpleName() + ": Skilltree for class " + classId + " is not defined!");
return result;
}
final L2Skill[] oldSkills = player.getAllSkills();
for (L2SkillLearn temp : skills.values())
{
if (((includeAutoGet && temp.isAutoGet()) || temp.isLearnedByNpc() || (includeByFs && temp.isLearnedByFS())) && (player.getLevel() >= temp.getGetLevel()))
{
boolean knownSkill = false;
for (int j = 0; (j < oldSkills.length) && !knownSkill; j++)
{
if (oldSkills[j].getId() == temp.getSkillId())
{
if (oldSkills[j].getLevel() == (temp.getSkillLevel() - 1))
{
// This is the next level of a known skill:
result.add(temp);
}
knownSkill = true;
}
}
if (!knownSkill && (temp.getSkillLevel() == 1))
{
// This is a new skill:
result.add(temp);
}
}
}
return result;
}