Jump to content
  • 0

[ help ] items on class change


Question

Posted

how can i add class item .. i mean if i am paladin and i make 3rd class -> phoenix knight i get knight's bracelet ( if i am soultaker, 3rd class -> necromancer i get wizard's bracelet ) , i can't figured out how to code it ( reward item )

 

/*
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later
* version.
* 
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
* 
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.l2jserver.gameserver.model.actor.instance;

import com.l2jserver.Config;
import com.l2jserver.gameserver.cache.HtmCache;
import com.l2jserver.gameserver.datatables.CharTemplateTable;
import com.l2jserver.gameserver.datatables.ItemTable;
import com.l2jserver.gameserver.instancemanager.QuestManager;
import com.l2jserver.gameserver.model.base.ClassId;
import com.l2jserver.gameserver.model.quest.Quest;
import com.l2jserver.gameserver.network.SystemMessageId;
import com.l2jserver.gameserver.network.serverpackets.ExBrExtraUserInfo;
import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
import com.l2jserver.gameserver.network.serverpackets.TutorialCloseHtml;
import com.l2jserver.gameserver.network.serverpackets.TutorialShowHtml;
import com.l2jserver.gameserver.network.serverpackets.TutorialShowQuestionMark;
import com.l2jserver.gameserver.network.serverpackets.UserInfo;
import com.l2jserver.gameserver.templates.chars.L2NpcTemplate;
import com.l2jserver.util.StringUtil;

/**
* This class ...
*
* @version $Revision: 1.4.2.1.2.7 $ $Date: 2005/03/27 15:29:32 $
*/
public final class L2ClassMasterInstance extends L2MerchantInstance
{
/**
 * @param objectId 
 * @param template
 */
public L2ClassMasterInstance(int objectId, L2NpcTemplate template)
{
	super(objectId, template);
	setInstanceType(InstanceType.L2ClassMasterInstance);
}

@Override
public String getHtmlPath(int npcId, int val)
{
	String pom = "";

	if (val == 0)
		pom = "" + npcId;
	else
		pom = npcId + "-" + val;

	return "data/html/classmaster/" + pom + ".htm";
}

@Override
public void onBypassFeedback(L2PcInstance player, String command)
{
	if(command.startsWith("1stClass"))
	{
		showHtmlMenu(player, getObjectId(), 1);
	}
	else if(command.startsWith("2ndClass"))
	{
		showHtmlMenu(player, getObjectId(), 2);
	}
	else if(command.startsWith("3rdClass"))
	{
		showHtmlMenu(player, getObjectId(), 3);
	}
	else if(command.startsWith("change_class"))
	{
		int val = Integer.parseInt(command.substring(13));

		if (checkAndChangeClass(player, val))
		{
			NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
			html.setFile(player.getHtmlPrefix(), "data/html/classmaster/ok.htm");
			html.replace("%name%", CharTemplateTable.getInstance().getClassNameById(val));
			player.sendPacket(html);
		}
	}
	else if(command.startsWith("become_noble"))
	{
		if (!player.isNoble())
		{
			player.setNoble(true);
			player.sendPacket(new UserInfo(player));
			player.sendPacket(new ExBrExtraUserInfo(player));
			NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
			html.setFile(player.getHtmlPrefix(), "data/html/classmaster/nobleok.htm");
			player.sendPacket(html);
		}
	}
	else if(command.startsWith("learn_skills"))
	{
		player.giveAvailableSkills(Config.AUTO_LEARN_FS_SKILLS, true);
	}
	else if(command.startsWith("increase_clan_level"))
	{
		if (!player.isClanLeader())
		{
			NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
			html.setFile(player.getHtmlPrefix(), "data/html/classmaster/noclanleader.htm");
			player.sendPacket(html);
		}
		else if (player.getClan().getLevel() >= 5)
		{
			NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
			html.setFile(player.getHtmlPrefix(), "data/html/classmaster/noclanlevel.htm");
			player.sendPacket(html);
		}
		else
		{
			player.getClan().changeLevel(5);
		}
	}
	else
	{
		super.onBypassFeedback(player, command);
	}
}

public static final void onTutorialLink(L2PcInstance player, String request)
{
	if (!Config.ALTERNATE_CLASS_MASTER
			|| request == null
			|| !request.startsWith("CO"))
		return;

	if (!player.getFloodProtectors().getServerBypass().tryPerformAction("changeclass"))
		return;

	try
	{
		int val = Integer.parseInt(request.substring(2));
		checkAndChangeClass(player, val);
	}
	catch (NumberFormatException e)
	{
	}
	player.sendPacket(new TutorialCloseHtml());
}

public static final void onTutorialQuestionMark(L2PcInstance player, int number)
{
	if (!Config.ALTERNATE_CLASS_MASTER || number != 1001)
		return;

	showTutorialHtml(player);
}

public static final void showQuestionMark(L2PcInstance player)
{
	if (!Config.ALTERNATE_CLASS_MASTER)
		return;

	final ClassId classId = player.getClassId();
	if (getMinLevel(classId.level()) > player.getLevel())
		return;

	if (!Config.CLASS_MASTER_SETTINGS.isAllowed(classId.level()+1))
		return;

	player.sendPacket(new TutorialShowQuestionMark(1001));
}

private static final void showHtmlMenu(L2PcInstance player, int objectId, int level)
{
	NpcHtmlMessage html = new NpcHtmlMessage(objectId);

	if (!Config.ALLOW_CLASS_MASTERS)
	{
		html.setFile(player.getHtmlPrefix(), "data/html/classmaster/disabled.htm");
	}
	else if (!Config.CLASS_MASTER_SETTINGS.isAllowed(level))
	{
		int jobLevel = player.getClassId().level();
		final StringBuilder sb = new StringBuilder(100);
		sb.append("<html><body>");
		switch (jobLevel)
		{
			case 0:
				if (Config.CLASS_MASTER_SETTINGS.isAllowed(1))
					sb.append("Come back here when you reached level 20 to change your class.<br>");
				else if (Config.CLASS_MASTER_SETTINGS.isAllowed(2))
					sb.append("Come back after your first occupation change.<br>");
				else if (Config.CLASS_MASTER_SETTINGS.isAllowed(3))
					sb.append("Come back after your second occupation change.<br>");
				else
					sb.append("I can't change your occupation.<br>");
				break;
			case 1:
				if (Config.CLASS_MASTER_SETTINGS.isAllowed(2))
					sb.append("Come back here when you reached level 40 to change your class.<br>");
				else if (Config.CLASS_MASTER_SETTINGS.isAllowed(3))
					sb.append("Come back after your second occupation change.<br>");
				else
					sb.append("I can't change your occupation.<br>");
				break;
			case 2:
				if (Config.CLASS_MASTER_SETTINGS.isAllowed(3))
					sb.append("Come back here when you reached level 76 to change your class.<br>");
				else
					sb.append("I can't change your occupation.<br>");
				break;
			case 3:
				sb.append("There is no class change available for you anymore.<br>");
				break;
		}
		sb.append("</body></html>");
		html.setHtml(sb.toString());
	}
	else
	{
		final ClassId currentClassId = player.getClassId();
		if (currentClassId.level() >= level)
		{
			html.setFile(player.getHtmlPrefix(), "data/html/classmaster/nomore.htm");
		}
		else
		{
			final int minLevel = getMinLevel(currentClassId.level());
			if (player.getLevel() >= minLevel || Config.ALLOW_ENTIRE_TREE)
			{
				final StringBuilder menu = new StringBuilder(100);
				for (ClassId cid : ClassId.values())
				{
					if (cid == ClassId.inspector && player.getTotalSubClasses() < 2)
						continue;
					if (validateClassId(currentClassId, cid) && cid.level() == level)
					{
						StringUtil.append(menu,
								"<a action=\"bypass -h npc_%objectId%_change_class ",
								String.valueOf(cid.getId()),
								"\">",
								CharTemplateTable.getInstance().getClassNameById(cid.getId()),
								"</a><br>"
						);
					}
				}

				if (menu.length() > 0)
				{
					html.setFile(player.getHtmlPrefix(), "data/html/classmaster/template.htm");
					html.replace("%name%", CharTemplateTable.getInstance().getClassNameById(currentClassId.getId()));
					html.replace("%menu%", menu.toString());
				}
				else
				{
					html.setFile(player.getHtmlPrefix(), "data/html/classmaster/comebacklater.htm");
					html.replace("%level%", String.valueOf(getMinLevel(level - 1)));
				}
			}
			else
			{
				if (minLevel < Integer.MAX_VALUE)
				{
					html.setFile(player.getHtmlPrefix(), "data/html/classmaster/comebacklater.htm");
					html.replace("%level%", String.valueOf(minLevel));
				}
				else
					html.setFile(player.getHtmlPrefix(), "data/html/classmaster/nomore.htm");
			}
		}
	}

	html.replace("%objectId%", String.valueOf(objectId));
	html.replace("%req_items%", getRequiredItems(level));
	player.sendPacket(html);
}

private static final void showTutorialHtml(L2PcInstance player)
{
	final ClassId currentClassId = player.getClassId();
	if (getMinLevel(currentClassId.level()) > player.getLevel()
			&& !Config.ALLOW_ENTIRE_TREE)
		return;

	String msg = HtmCache.getInstance().getHtm(player.getHtmlPrefix(), "data/html/classmaster/tutorialtemplate.htm");

	msg = msg.replaceAll("%name%", CharTemplateTable.getInstance().getClassNameById(currentClassId.getId()));

	final StringBuilder menu = new StringBuilder(100);
	for (ClassId cid : ClassId.values())
	{
		if (cid == ClassId.inspector && player.getTotalSubClasses() < 2)
			continue;			
		if (validateClassId(currentClassId, cid))
		{
			StringUtil.append(menu,
					"<a action=\"link CO",
					String.valueOf(cid.getId()),
					"\">",
					CharTemplateTable.getInstance().getClassNameById(cid.getId()),
					"</a><br>"
			);
		}
	}

	msg = msg.replaceAll("%menu%", menu.toString());
	msg = msg.replace("%req_items%", getRequiredItems(currentClassId.level()+1));
	player.sendPacket(new TutorialShowHtml(msg));
}

private static final boolean checkAndChangeClass(L2PcInstance player, int val)
{
	final ClassId currentClassId = player.getClassId();
	if (getMinLevel(currentClassId.level()) > player.getLevel()
			&& !Config.ALLOW_ENTIRE_TREE)
		return false;

	if (!validateClassId(currentClassId, val))
		return false;

	int newJobLevel = currentClassId.level() + 1;

	// Weight/Inventory check
	if(!Config.CLASS_MASTER_SETTINGS.getRewardItems(newJobLevel).isEmpty() && !player.isInventoryUnder80(false))
	{
		player.sendPacket(SystemMessageId.INVENTORY_LESS_THAN_80_PERCENT);
		return false;
	}

	// check if player have all required items for class transfer
	for (int _itemId : Config.CLASS_MASTER_SETTINGS.getRequireItems(newJobLevel).keys())
	{
		int _count = Config.CLASS_MASTER_SETTINGS.getRequireItems(newJobLevel).get(_itemId);
		if (player.getInventory().getInventoryItemCount(_itemId, -1) < _count)
		{
			player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS);
			return false;
		}
	}

	// get all required items for class transfer
	for (int _itemId : Config.CLASS_MASTER_SETTINGS.getRequireItems(newJobLevel).keys())
	{
		int _count = Config.CLASS_MASTER_SETTINGS.getRequireItems(newJobLevel).get(_itemId);
		if (!player.destroyItemByItemId("ClassMaster", _itemId, _count, player, true))
			return false;
	}

	// reward player with items
	for (int _itemId : Config.CLASS_MASTER_SETTINGS.getRewardItems(newJobLevel).keys())
	{
		int _count = Config.CLASS_MASTER_SETTINGS.getRewardItems(newJobLevel).get(_itemId);
		player.addItem("ClassMaster", _itemId, _count, player, true);
	}

	player.setClassId(val);

	if (player.isSubClassActive())
		player.getSubClasses().get(player.getClassIndex()).setClassId(player.getActiveClass());
	else
		player.setBaseClass(player.getActiveClass());

	Quest q = QuestManager.getInstance().getQuest("SkillTransfer");
	if (q != null)
		q.startQuestTimer("givePormanders", 1, null, player);

	player.broadcastUserInfo();

	if(Config.CLASS_MASTER_SETTINGS.isAllowed(player.getClassId().level() + 1) && Config.ALTERNATE_CLASS_MASTER && ((player.getClassId().level() == 1 && player.getLevel() >= 40) || (player.getClassId().level() == 2 && player.getLevel() >= 76)))
		showQuestionMark(player);

	return true;
}

/**
 * @param level - current skillId level (0 - start, 1 - first, etc)
 * @return minimum player level required for next class transfer
 */
private static final int getMinLevel(int level)
{
	switch (level)
	{
		case 0:
			return 20;
		case 1:
			return 40;
		case 2:
			return 76;
		default:
			return Integer.MAX_VALUE;
	}
}

/**
 * Returns true if class change is possible
 * @param oldCID current player ClassId
 * @param val new class index
 * @return
 */
private static final boolean validateClassId(ClassId oldCID, int val)
{
	try
	{
		return validateClassId(oldCID, ClassId.values()[val]);
	}
	catch (Exception e)
	{
		// possible ArrayOutOfBoundsException
	}
	return false;
}

/**
 * Returns true if class change is possible
 * @param oldCID current player ClassId
 * @param newCID new ClassId
 * @return true if class change is possible
 */
private static final boolean validateClassId(ClassId oldCID, ClassId newCID)
{
	if (newCID == null || newCID.getRace() == null)
		return false;

	if (oldCID.equals(newCID.getParent()))
		return true;

	if (Config.ALLOW_ENTIRE_TREE
			&& newCID.childOf(oldCID))
		return true;

	return false;
}

private static String getRequiredItems(int level)
{
	if (Config.CLASS_MASTER_SETTINGS.getRequireItems(level) == null || Config.CLASS_MASTER_SETTINGS.getRequireItems(level).isEmpty())
		return "<tr><td>none</td></r>";
	StringBuilder sb = new StringBuilder();
	for (int _itemId : Config.CLASS_MASTER_SETTINGS.getRequireItems(level).keys())
	{
		int _count = Config.CLASS_MASTER_SETTINGS.getRequireItems(level).get(_itemId);
		sb.append("<tr><td><font color=\"LEVEL\">" + _count + "</font></td><td>" + ItemTable.getInstance().getTemplate(_itemId).getName() + "</td></tr>");
	}
	return sb.toString();
}
}

 

i think it should be here :

 

// reward player with items
	for (int _itemId : Config.CLASS_MASTER_SETTINGS.getRewardItems(newJobLevel).keys())
	{
		int _count = Config.CLASS_MASTER_SETTINGS.getRewardItems(newJobLevel).get(_itemId);
		player.addItem("ClassMaster", _itemId, _count, player, true);
	}

i tried but .. without succes :)

3 answers to this question

Recommended Posts

  • 0
Posted

up ...

 

i have add this:

 

// Reward players with Bracelet
	if (player.getClassId().level() == 2 && player.getLevel() >= 76)
	{
		if (player.getClassId().getId() == 5 || player.getClassId().getId() == 6 || player.getClassId().getId() == 20 || player.getClassId().getId() == 33)
		{
			player.addItem("ClassMaster", 40002, 1, player, true); // Knight's Bracelet
		}
		else if (player.getClassId().getId() == 9 || player.getClassId().getId() == 24 || player.getClassId().getId() == 37 || player.getClassId().getId() == 130)
		{
			player.addItem("ClassMaster", 40003, 1, player, true); // Archer's Bracelet
		}
		else if (player.getClassId().getId() == 17 || player.getClassId().getId() == 21 || player.getClassId().getId() == 34 || player.getClassId().getId() == 51 || player.getClassId().getId() == 52)
		{
			player.addItem("ClassMaster", 40004, 1, player, true); // Enchanter's Bracelet
		}
		else if (player.getClassId().getId() == 16 || player.getClassId().getId() == 30 || player.getClassId().getId() == 43)
		{
			player.addItem("ClassMaster", 40005, 1, player, true); // Healer's Bracelet
		}
		else if (player.getClassId().getId() == 8 || player.getClassId().getId() == 23 || player.getClassId().getId() == 36 || player.getClassId().getId() == 55)
		{
			player.addItem("ClassMaster", 40006, 1, player, true); // Rogue's Bracelet
		}
		else if (player.getClassId().getId() == 2 || player.getClassId().getId() == 3 || player.getClassId().getId() == 57 || player.getClassId().getId() == 46 || player.getClassId().getId() == 47 || player.getClassId().getId() == 127)
		{
			player.addItem("ClassMaster", 40007, 1, player, true); // Warrior's Bracelet
		}
		else if (player.getClassId().getId() == 14 || player.getClassId().getId() == 28 || player.getClassId().getId() == 41)
		{
			player.addItem("ClassMaster", 40008, 1, player, true); // Summoner's Bracelet
		}
		else if (player.getClassId().getId() == 12 || player.getClassId().getId() == 13 || player.getClassId().getId() == 27 || player.getClassId().getId() == 40 || player.getClassId().getId() == 128 || player.getClassId().getId() == 129)
		{
			player.addItem("ClassMaster", 40009, 1, player, true); // Wizard's Bracelet
		}
	}

 

but it give the item to subclass too, how can i make it to give only to base class ?

  • 0
Posted

Your code quoted before

if (player.isSubClassActive())
		player.getSubClasses().get(player.getClassIndex()).setClassId(player.getActiveClass());
	else
		player.setBaseClass(player.getActiveClass());

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...