Jump to content
  • 0

Community Button Adquire Skills


Question

Posted (edited)

Hi people!. I have created a button on my communityboard that show available skills to learn but with this code when SkillsList Opens and i try to click on that windows it closes.

 

 

public void showSkillsList(L2PcInstance player)
	{
		
		// Normal skills, No LearnedByFS, no AutoGet skills.
		final List<L2SkillLearn> skills = SkillTreesData.getInstance().getAvailableSkills(player, player.getClassId(), false, false);
		final AcquireSkillList asl = new AcquireSkillList(AcquireSkillType.CLASS);
		int count = 0;
		player.setLearningClass(player.getClassId());
		for (L2SkillLearn s : skills)
		{
			if (SkillData.getInstance().getInfo(s.getSkillId(), s.getSkillLevel()) != null)
			{
				asl.addSkill(s.getSkillId(), s.getSkillLevel(), s.getSkillLevel(), s.getCalculatedLevelUpSp(player.getClassId(), player.getClassId()), 0);
				count++;
			}
		}
		
		if (count == 0)
		{
			final Map<Integer, L2SkillLearn> skillTree = SkillTreesData.getInstance().getCompleteClassSkillTree(player.getClassId());
			final int minLevel = SkillTreesData.getInstance().getMinLevelForNewSkill(player, skillTree);
			if (minLevel > 0)
			{
				SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.DO_NOT_HAVE_FURTHER_SKILLS_TO_LEARN_S1);
				sm.addInt(minLevel);
				player.sendPacket(sm);
			}
			else
			{
				if (player.getClassId().level() == 1)
				{
					SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.NO_SKILLS_TO_LEARN_RETURN_AFTER_S1_CLASS_CHANGE);
					sm.addInt(2);
					player.sendPacket(sm);
				}
				else
				{
					player.sendPacket(SystemMessageId.NO_MORE_SKILLS_TO_LEARN);
				}
			}
		}
		else
		{
			player.sendPacket(asl);
		}
	}

 

 

Do you know if there ir a solution for that problem?.

 

 

Edited by Vision

9 answers to this question

Recommended Posts

  • 0
Posted
4 hours ago, LoVe+ said:
AcquireSkillList.java

show this file

 

 

public final class AcquireSkillList extends L2GameServerPacket
{
	private final List<Skill> _skills;
	private final AcquireSkillType _skillType;
	
	/**
	 * Private class containing learning skill information.
	 */
	private static class Skill
	{
		public int id;
		public int nextLevel;
		public int maxLevel;
		public int spCost;
		public int requirements;
		
		public Skill(int pId, int pNextLevel, int pMaxLevel, int pSpCost, int pRequirements)
		{
			id = pId;
			nextLevel = pNextLevel;
			maxLevel = pMaxLevel;
			spCost = pSpCost;
			requirements = pRequirements;
		}
	}
	
	public AcquireSkillList(AcquireSkillType type)
	{
		_skillType = type;
		_skills = new ArrayList<>();
	}
	
	public void addSkill(int id, int nextLevel, int maxLevel, int spCost, int requirements)
	{
		_skills.add(new Skill(id, nextLevel, maxLevel, spCost, requirements));
	}
	
	@Override
	protected void writeImpl()
	{
		if (_skills.isEmpty())
		{
			return;
		}
		
		writeC(0x90);
		writeD(_skillType.ordinal());
		writeD(_skills.size());
		
		for (Skill temp : _skills)
		{
			writeD(temp.id);
			writeD(temp.nextLevel);
			writeD(temp.maxLevel);
			writeD(temp.spCost);
			writeD(temp.requirements);
			if (_skillType == AcquireSkillType.SUBPLEDGE)
			{
				writeD(0); // TODO: ?
			}
		}
	}
}

 

  • 0
Posted

your condition is in this file: RequestAcquireSkill.java

 

package net.sf.l2j.gameserver.network.clientpackets;

import net.sf.l2j.Config;
import net.sf.l2j.gameserver.datatables.SkillTable;
import net.sf.l2j.gameserver.datatables.SkillTreeTable;
import net.sf.l2j.gameserver.datatables.SpellbookTable;
import net.sf.l2j.gameserver.model.L2PledgeSkillLearn;
import net.sf.l2j.gameserver.model.L2ShortCut;
import net.sf.l2j.gameserver.model.L2Skill;
import net.sf.l2j.gameserver.model.L2SkillLearn;
import net.sf.l2j.gameserver.model.actor.Npc;
import net.sf.l2j.gameserver.model.actor.instance.Fisherman;
import net.sf.l2j.gameserver.model.actor.instance.Folk;
import net.sf.l2j.gameserver.model.actor.instance.Player;
import net.sf.l2j.gameserver.model.actor.instance.VillageMaster;
import net.sf.l2j.gameserver.network.SystemMessageId;
import net.sf.l2j.gameserver.network.serverpackets.ExStorageMaxCount;
import net.sf.l2j.gameserver.network.serverpackets.ShortCutRegister;
import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;

public class RequestAcquireSkill extends L2GameClientPacket
{
    private int _skillId;
    private int _skillLevel;
    private int _skillType;
    
    @Override
    protected void readImpl()
    {
        _skillId = readD();
        _skillLevel = readD();
        _skillType = readD();
    }
    
    @Override
    protected void runImpl()
    {
        // Not valid skill data, return.
        if (_skillId <= 0 || _skillLevel <= 0)
            return;
        
        // Incorrect player, return.
        final Player activeChar = getClient().getActiveChar();
        if (activeChar == null)
            return;
        
        // Incorrect npc, return.
        final Npc trainer = activeChar.getCurrentFolkNPC();
        if (trainer == null)
            return;
        
        // Distance check for player <-> npc.
        if (!activeChar.isInsideRadius(trainer, Npc.INTERACTION_DISTANCE, false, false) && !activeChar.isGM())
            return;
        
        // Skill doesn't exist, return.
        final L2Skill skill = SkillTable.getInstance().getInfo(_skillId, _skillLevel);
        if (skill == null)
            return;
        

        // Set learn class.
        activeChar.setSkillLearningClassId(activeChar.getClassId());
        
        boolean exists = false;
        
        // Types.
        switch (_skillType)
        {
            case 0: // General skills.
                // Player already has such skill with same or higher level.
                int skillLvl = activeChar.getSkillLevel(_skillId);
                if (skillLvl >= _skillLevel)
                    return;
                
                // Requested skill must be 1 level higher than existing skill.
                if (Math.max(skillLvl, 0) + 1 != _skillLevel)
                    return;
                
                int spCost = 0;
                
                // Find skill information.
                for (L2SkillLearn sl : SkillTreeTable.getInstance().getAvailableSkills(activeChar, activeChar.getSkillLearningClassId()))
                {
                    // Skill found.
                    if (sl.getId() == _skillId && sl.getLevel() == _skillLevel)
                    {
                        exists = true;
                        spCost = sl.getSpCost();
                        break;
                    }
                }
                
                // No skill found, return.
                if (!exists)
                    return;
                
                // Not enought SP.
                if (activeChar.getSp() < spCost)
                {
                    activeChar.sendPacket(SystemMessageId.NOT_ENOUGH_SP_TO_LEARN_SKILL);
                    Folk.showSkillList(activeChar, trainer, activeChar.getSkillLearningClassId());
                    return;
                }
                
                // Get spellbook and try to consume it.
                int spbId = SpellbookTable.getInstance().getBookForSkill(_skillId, _skillLevel);
                if (spbId > 0)
                {
                    if (!activeChar.destroyItemByItemId("SkillLearn", spbId, 1, trainer, true))
                    {
                        activeChar.sendPacket(SystemMessageId.ITEM_MISSING_TO_LEARN_SKILL);
                        Folk.showSkillList(activeChar, trainer, activeChar.getSkillLearningClassId());
                        return;
                    }
                }
                
                // Consume SP.
                activeChar.removeExpAndSp(0, spCost);
                
                // Add skill new skill.
                activeChar.addSkill(skill, true);
                activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.LEARNED_SKILL_S1).addSkillName(skill));
                
                // Update player and return.
                updateShortCuts(activeChar);
                activeChar.sendSkillList();
                Folk.showSkillList(activeChar, trainer, activeChar.getSkillLearningClassId());
                break;
            
            case 1: // Common skills.
                skillLvl = activeChar.getSkillLevel(_skillId);
                if (skillLvl >= _skillLevel)
                    return;
                
                if (Math.max(skillLvl, 0) + 1 != _skillLevel)
                    return;
                
                int costId = 0;
                int costCount = 0;
                
                for (L2SkillLearn sl : SkillTreeTable.getInstance().getAvailableFishingDwarvenCraftSkills(activeChar))
                {
                    if (sl.getId() == _skillId && sl.getLevel() == _skillLevel)
                    {
                        exists = true;
                        costId = sl.getIdCost();
                        costCount = sl.getCostCount();
                        break;
                    }
                }
                
                if (!exists)
                    return;
                
                if (!activeChar.destroyItemByItemId("Consume", costId, costCount, trainer, true))
                {
                    activeChar.sendPacket(SystemMessageId.ITEM_MISSING_TO_LEARN_SKILL);
                    Fisherman.showFishSkillList(activeChar);
                    return;
                }
                
                activeChar.addSkill(skill, true);
                activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.LEARNED_SKILL_S1).addSkillName(skill));
                
                if (_skillId >= 1368 && _skillId <= 1372)
                    activeChar.sendPacket(new ExStorageMaxCount(activeChar));
                
                updateShortCuts(activeChar);
                activeChar.sendSkillList();
                Fisherman.showFishSkillList(activeChar);
                break;
            
            case 2: // Pledge skills.
                if (!activeChar.isClanLeader())
                    return;
                
                int itemId = 0;
                int repCost = 0;
                
                for (L2PledgeSkillLearn psl : SkillTreeTable.getInstance().getAvailablePledgeSkills(activeChar))
                {
                    if (psl.getId() == _skillId && psl.getLevel() == _skillLevel)
                    {
                        exists = true;
                        itemId = psl.getItemId();
                        repCost = psl.getRepCost();
                        break;
                    }
                }
                
                if (!exists)
                    return;
                
                if (activeChar.getClan().getReputationScore() < repCost)
                {
                    activeChar.sendPacket(SystemMessageId.ACQUIRE_SKILL_FAILED_BAD_CLAN_REP_SCORE);
                    VillageMaster.showPledgeSkillList(activeChar);
                    return;
                }
                
                if (Config.LIFE_CRYSTAL_NEEDED)
                {
                    if (!activeChar.destroyItemByItemId("Consume", itemId, 1, trainer, true))
                    {
                        activeChar.sendPacket(SystemMessageId.ITEM_MISSING_TO_LEARN_SKILL);
                        VillageMaster.showPledgeSkillList(activeChar);
                        return;
                    }
                }
                
                activeChar.getClan().takeReputationScore(repCost);
                activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.S1_DEDUCTED_FROM_CLAN_REP).addNumber(repCost));
                
                activeChar.getClan().addNewSkill(skill);
                
                VillageMaster.showPledgeSkillList(activeChar);
                return;
        }
    }
    
    private void updateShortCuts(Player player)
    {
        if (_skillLevel > 1)
        {
            for (L2ShortCut sc : player.getAllShortCuts())
            {
                if (sc.getId() == _skillId && sc.getType() == L2ShortCut.TYPE_SKILL)
                {
                    L2ShortCut newsc = new L2ShortCut(sc.getSlot(), sc.getPage(), L2ShortCut.TYPE_SKILL, _skillId, _skillLevel, 1);
                    player.sendPacket(new ShortCutRegister(newsc));
                    player.registerShortCut(newsc);
                }
            }
        }
    }
}

  • 0
Posted (edited)

The code is'ts equals or like that. but this parts is missing and i added.

 

   // Distance check for player <-> npc.
        if (!activeChar.isInsideRadius(trainer, Npc.INTERACTION_DISTANCE, false, false) && !activeChar.isGM())
            return;

 

but i tested and it closes when you click the window. only works when you click on npc. an then you can click on that window.

 

 

i think that i need to touch more classes. because when i want to learn skills on a windows or community is not equal that when you try to learn skills on a npc.

Edited by barao45
wrong
  • 0
Posted

IT BASSICALY 1 LINE UPPER  , DO YOU WANT ME TO COMPILE FOR U?

 

  // Incorrect npc, return.
        final Npc trainer = activeChar.getCurrentFolkNPC();
        if (trainer == null)
            return;

  • 0
Posted

I think you don't understand or you don't read more than 1 line onwards, so the solutions are not resolved because with that bugs are generated. If you solve everything like this, no thanks, I don't ask you for anything else xD. I have found the right way.
Thanks anyway

  • 0
Posted (edited)

you just said you created something and is not working ? why bcs you are brainless. im not trying to solve your problems , im trying to help you use you brain .. if you don't want to fix your source on your own and all time pay someone you should hire 1 guy as developer for your projects.

Edited by LoVe+

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...