Показать сообщение отдельно
Непрочитано 03.01.2013, 01:55   #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;
	}

Последний раз редактировалось orionpvp; 03.01.2013 в 01:56. Причина: Добавлено сообщение
orionpvp вне форума Отправить сообщение для orionpvp с помощью ICQ Отправить сообщение для orionpvp с помощью Skype™ Ответить с цитированием