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.



  • Posts

    • Okay I respect that but why is your other account banned?   I don't think this happened just because you delayed somebodys work even in 2012
    • Do You understand the fact, I won't scam anyone? Can You grasp such idea?  Second of all, if a random restaurant on Google Maps has 599 positive reviews and few negative ones with 4,8* score, do You ask Google to block it's profile and burn the place down? No? Then why the fuck You are crying about my random delays? If someone can't get a CUSTOM DESIGN on time, I refund. I'm not 16  y.o. anymore. I don't make living out of this L2 bullshit. Never did. Since 2012 I've made shit tons of projects. How many delays did I have? 12? 15? Out of hundrets of projects. Calm Your tits please. If I would actually take 4k euro and NOT deliver and NOT refund - admins can ban me. So don't compare me to Simple. And just so You know, Celestine sent me customers, so it's not like I've worked with him on his account all the time. That's another thing You won't understand. I won't waste anymore time on You and any other cunt who never was my customer but is bitching just because he has nothing better to do in his life. You don't like my work? Hove along, I don't give a shit. 
    • So he's like unsimple you would say? Cherry picking who's getting scammed.   Deliver 5 projects, don't deliver/delay the other 2 projects. Of course he won't scam you because he know what's gonna happen after since he's dealing with the admin himself.
    • I've worked with Ave a lot lately on designs and other projects. He has always delivered as quickly as possible sometimes within a week, maybe two. Personally, I’m patient, so I’ve never had an issue with the wait. I’m not trying to defend him blindly, but I genuinely don’t believe he would mess someone over for €60 €100. Sometimes he's inactive, likely due to real life responsibilities, but I don't judge everyone has their own situations. I understand that some people are impatient and want their orders completed quickly, but considering the quality of his work, I have no problem waiting. Of course, people react differently to delays, and that’s fair. But in my experience, I can't call him a scammer he's always delivered what I ordered.
  • Topics

×
×
  • Create New...