Перейти к содержанию
Авторизация  
Meg

нпц место указанного итема дает нг пуху

Рекомендуемые сообщения

нпц должен давать указанный итем но что бы я не указывал он дает мне Short Sword (самая простая нг пушка)

если я ставлю количество итемов 2 то дает Long Sword (тоже нг пушка)

работает исправно только если выставить итем - адену (любые шмотки\другие валюты -автоматически заменяет на нг пушку)

но вот что интересно, нпц - кот дающий профу (за каждую профу можно указать приз) за первую профу дает любой итем который укажешь!

а за вторую и третью - заменяет на Short Sword.

я так понимаю это какая то защита, но где ее искать не понятно, если есть идеи - напишите пожалуйста!

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Могу символически за денешку исправить. если интересно, пиши в лс

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
5 hours ago, LetsVirt said:

Могу символически за денешку исправить. если интересно, пиши в лс

а можешь просто подсказать в каком направлении искать? а я уже там попробую разобраться.

а там уже если не получится то  обращусь на платной основе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
10 минут назад, Meg сказал:

а можешь просто подсказать в каком направлении искать? а я уже там попробую разобраться.

а там уже если не получится то  обращусь на платной основе.

узнай id Short Sword  Вбей в конфигах  по поиску етот ид. Ибо у меня в сборке есть, в конфигах какой приз видавать после взятие професии.

Также поищи в самом скрипте клас мастера. Если нету, ищи в ядре. Если есть исходники, или делай декомпил.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

к сожалению в конфигах у меня не получилось найти этот параметр по id (id Short Sword - 1 :D)

сейчас пробую в ядре искать но пока пусто

package main.engine.events.daily.normal.types;

import java.util.ArrayList;
import java.util.List;

import l2j.gameserver.ThreadPoolManager;
import l2j.gameserver.data.ItemData;
import l2j.gameserver.model.actor.L2Npc;
import l2j.gameserver.model.actor.base.ClassId;
import l2j.gameserver.model.actor.instance.L2PcInstance;
import l2j.gameserver.model.actor.instance.enums.TeamType;
import l2j.gameserver.model.holder.LocationHolder;
import l2j.gameserver.model.world.L2World;
import l2j.gameserver.network.external.server.NpcHtmlMessage;
import l2j.gameserver.network.external.server.PlaySound;
import l2j.gameserver.network.external.server.PlaySound.PlaySoundType;
import l2j.gameserver.network.external.server.SystemMessage;
import l2j.gameserver.network.external.server.TutorialShowQuestionMark;
import main.data.ConfigData;
import main.engine.events.daily.AbstractEvent;
import main.holders.objects.CharacterHolder;
import main.holders.objects.NpcHolder;
import main.holders.objects.PlayerHolder;
import main.util.Util;
import main.util.UtilMessage;
import main.util.UtilSpawn;
import main.util.builders.html.HtmlBuilder;

/**
 * @author fissban
 */
public class NpcClassMaster extends AbstractEvent
{
	private static final int NPC = 12371;
	
	// format:
	// PriceItemId
	// PriceItemCount
	// ReardItemId
	// RewardItemCount
	
	// Usar el 0 para no definir ningun valor
	private static final List<ClassMasterList> ITEM_LIST = new ArrayList<>();
	{
		// Primer cambio de clase ----------------------
		var job1 = new ClassMasterList();
		job1.setPriceItemId(ConfigData.CLASSMASTER_PRICE_JOB1.getRewardId());
		job1.setPriceItemCount(ConfigData.CLASSMASTER_PRICE_JOB1.getRewardCount());
		job1.setRewardItemId(ConfigData.CLASSMASTER_REWARD_JOB1.getRewardId());
		job1.setRewardItemCount(ConfigData.CLASSMASTER_REWARD_JOB1.getRewardCount());
		ITEM_LIST.add(job1);
		// Segundo cambio de clase ----------------------
		var job2 = new ClassMasterList();
		job2.setPriceItemId(ConfigData.CLASSMASTER_PRICE_JOB2.getRewardId());
		job2.setPriceItemCount(ConfigData.CLASSMASTER_PRICE_JOB2.getRewardCount());
		job2.setRewardItemId(ConfigData.CLASSMASTER_REWARD_JOB2.getRewardCount());
		job2.setRewardItemCount(ConfigData.CLASSMASTER_REWARD_JOB2.getRewardCount());
		ITEM_LIST.add(job2);
		// Tercer cambio de clase -----------------------
		var job3 = new ClassMasterList();
		job3.setPriceItemId(ConfigData.CLASSMASTER_PRICE_JOB3.getRewardId());
		job3.setPriceItemCount(ConfigData.CLASSMASTER_PRICE_JOB3.getRewardCount());
		job3.setRewardItemId(ConfigData.CLASSMASTER_REWARD_JOB3.getRewardCount());
		job3.setRewardItemCount(ConfigData.CLASSMASTER_REWARD_JOB3.getRewardCount());
		ITEM_LIST.add(job3);
	}
	// Spawns
	private static final List<LocationHolder> SPAWNS = new ArrayList<>();
	{
		SPAWNS.add(new LocationHolder(11283, 15951, -4584));// ClassChange_DE
		SPAWNS.add(new LocationHolder(115774, -178666, -958));// ClassChange_DW
		SPAWNS.add(new LocationHolder(45036, 48384, -3060));// ClassChange_E
		SPAWNS.add(new LocationHolder(-44747, -113865, -208));// ClassChange_ORC
		SPAWNS.add(new LocationHolder(-84466, 243171, -3729));// ClassChange_TI
	}
	// Html
	private static final String HTML_PATH = "data/html/engine/events/classmaster/";
	
	private static final List<NpcHolder> npcs = new ArrayList<>();
	
	public NpcClassMaster()
	{
		registerEvent(ConfigData.ENABLE_ClassMaster, ConfigData.CLASSMASTER_DATE_START, ConfigData.CLASSMASTER_DATE_END);
	}
	
	@Override
	public void onModState()
	{
		switch (getState())
		{
			case START:
				UtilMessage.sendAnnounceMsg("Event Class Master: Started!", L2World.getInstance().getAllPlayers());
				
				ThreadPoolManager.schedule(() ->
				{
					SPAWNS.forEach(loc -> npcs.add(UtilSpawn.npc(NPC, loc.getX(), loc.getY(), loc.getZ(), 0, 0, 0, TeamType.NONE, 0)));
				}, 20000);
				
				break;
			case END:
				UtilMessage.sendAnnounceMsg("Event Class Master: End!", L2World.getInstance().getAllPlayers());
				npcs.forEach(npc -> npc.getInstance().deleteMe());
				break;
		}
	}
	
	@Override
	public void onEnterWorld(PlayerHolder ph)
	{
		UtilMessage.sendAnnounceMsg("Event Class Master: Started!", ph);
	}
	
	@Override
	public boolean onInteract(PlayerHolder ph, CharacterHolder character)
	{
		if (Util.areObjectType(L2Npc.class, character))
		{
			var npc = (L2Npc) character.getInstance();
			
			if (npc.getId() == NPC)
			{
				sendHtmlFile(ph, npc, HTML_PATH + "index.htm");
				return true;
			}
		}
		
		return false;
	}
	
	@Override
	public void onEvent(PlayerHolder ph, CharacterHolder npc, String event)
	{
		if (((NpcHolder) npc).getId() != NPC)
		{
			return;
		}
		
		if (event.startsWith("1stClass"))
		{
			showHtmlMenu(ph, npc.getObjectId(), 1);
		}
		else if (event.startsWith("2ndClass"))
		{
			showHtmlMenu(ph, npc.getObjectId(), 2);
		}
		else if (event.startsWith("3rdClass"))
		{
			showHtmlMenu(ph, npc.getObjectId(), 3);
		}
		else if (event.startsWith("change_class"))
		{
			try
			{
				int val = Integer.parseInt(event.split(" ")[1]);
				
				if (checkAndChangeClass(ph.getInstance(), val))
				{
					// Send sound
					ph.getInstance().sendPacket(new PlaySound(PlaySoundType.CHAR_CHANGE));
					// Send html
					var html = new NpcHtmlMessage(npc.getObjectId());
					html.setFile(HTML_PATH + "ok.htm");
					html.replace("%name%", ClassId.getById(val).getName());
					ph.getInstance().sendPacket(html);
				}
			}
			catch (Exception e)
			{
				//
			}
		}
	}
	
	public static final void showHtmlMenu(PlayerHolder ph, int objectId, int level)
	{
		var html = new NpcHtmlMessage(objectId);
		
		var currentClassId = ph.getInstance().getClassId();
		if (currentClassId.level() >= level)
		{
			html.setFile(HTML_PATH + "nomore.htm");
		}
		else
		{
			var minLevel = getMinLevel(currentClassId.level());
			if (ph.getInstance().getLevel() >= minLevel)
			{
				var menu = new HtmlBuilder();
				for (var cid : ClassId.values())
				{
					if (validateClassId(currentClassId, cid) && (cid.level() == level))
					{
						String className = cid.getName();
						menu.append("<img src=L2UI_CH3.br_bar2_mp width=204 height=1>");
						menu.append("<table width=204>");
						menu.append("<tr>");
						menu.append("<td><button value=\"", className, "\" action=\"bypass -h Engine NpcClassMaster change_class ", cid.getId() + "\" width=204 height=20 back=L2UI_CH3.br_party1_back2 fore=L2UI_CH3.balloon2_2></td>>");
						menu.append("</tr>");
						menu.append("</table>");
					}
				}
				
				if (menu.toString().length() > 0)
				{
					menu.append("<img src=L2UI_CH3.br_bar2_mp width=204 height=1>");
					
					html.setFile(HTML_PATH + "template.htm");
					html.replace("%name%", currentClassId.getName());
					html.replace("%menu%", menu.toString());
				}
				else
				{
					html.setFile(HTML_PATH + "comebacklater.htm");
					html.replace("%level%", String.valueOf(getMinLevel(level - 1)));
				}
			}
			else
			{
				if (minLevel < Integer.MAX_VALUE)
				{
					html.setFile(HTML_PATH + "comebacklater.htm");
					html.replace("%level%", String.valueOf(minLevel));
				}
				else
				{
					html.setFile(HTML_PATH + "nomore.htm");
				}
			}
		}
		
		html.replace("%objectId%", String.valueOf(objectId));
		html.replace("%req_items%", getRequiredItems(level));
		ph.getInstance().sendPacket(html);
	}
	
	private static final void showQuestionMark(L2PcInstance player)
	{
		var classId = player.getClassId();
		if (getMinLevel(classId.level()) > player.getLevel())
		{
			return;
		}
		
		player.sendPacket(new TutorialShowQuestionMark(1001));
	}
	
	/**
	 * Returns minimum player level required for next class transfer
	 * @param  level - current skillId level (0 - start, 1 - first, etc)
	 * @return
	 */
	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.getById(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;
		}
		
		return false;
	}
	
	private static String getRequiredItems(int level)
	{
		level--;
		var sb = new StringBuilder();
		if ((ITEM_LIST.get(level).getPriceItemId() != 0) && (ITEM_LIST.get(level).getPriceItemCount() != 0))
		{
			var count = ITEM_LIST.get(level).getPriceItemCount();
			var itemName = ItemData.getInstance().getTemplate(ITEM_LIST.get(level).getPriceItemId()).getName();
			sb.append("<tr><td><img src=L2UI_CH3.mapicon_mark width=32 height=32></td>");
			sb.append("<td><font color=\"LEVEL\">[" + count + "]</font></td>");
			sb.append("<td>[" + itemName + "]</td>");
			sb.append("<td><img src=L2UI_CH3.mapicon_mark width=32 height=32></td></tr>");
		}
		else
		{
			sb.append("<tr><td>None</td></tr>");
		}
		return sb.toString();
	}
	
	private static final boolean checkAndChangeClass(L2PcInstance player, int val)
	{
		var currentClassId = player.getClassId();
		if (getMinLevel(currentClassId.level()) > player.getLevel())
		{
			return false;
		}
		
		if (!validateClassId(currentClassId, val))
		{
			return false;
		}
		
		var newJobLevel = currentClassId.level();
		
		// Weight/Inventory check
		if (ITEM_LIST.get(newJobLevel).getRewardItemId() != 0)
		{
			if ((player.getWeightPenalty() >= 3) || ((player.getInventoryLimit() * 0.8) <= player.getInventory().getSize()))
			{
				player.sendPacket(SystemMessage.INVENTORY_LESS_THAN_80_PERCENT);
				return false;
			}
		}
		
		// get all required items for class transfer
		var priceCount = ITEM_LIST.get(newJobLevel).getPriceItemCount();
		var priceItemId = ITEM_LIST.get(newJobLevel).getPriceItemId();
		
		if (!player.getInventory().destroyItemByItemId("ClassMaster", priceItemId, priceCount, player, true))
		{
			player.sendPacket(SystemMessage.NOT_ENOUGH_ITEMS);
			return false;
		}
		
		// reward player with items
		var rewardCount = ITEM_LIST.get(newJobLevel).getRewardItemCount();
		var rewardItemId = ITEM_LIST.get(newJobLevel).getRewardItemId();
		player.getInventory().addItem("ClassMaster", rewardItemId, rewardCount, player, true);
		
		player.setClassId(val);
		
		if (player.isSubClassActive())
		{
			player.getSubClasses().get(player.getClassIndex()).setClassId(player.getActiveClass());
		}
		else
		{
			player.setBaseClass(player.getActiveClass());
		}
		
		player.broadcastUserInfo();
		
		if (((player.getClassId().level() == 1) && (player.getLevel() >= 40)) || ((player.getClassId().level() == 2) && (player.getLevel() >= 76)))
		{
			showQuestionMark(player);
		}
		
		return true;
	}
	
	public class ClassMasterList
	{
		private int priceItemId;
		private int priceItemCount;
		
		private int rewardItemId;
		private int rewardItemCount;
		
		public ClassMasterList()
		{
			//
		}
		
		public int getPriceItemId()
		{
			return priceItemId;
		}
		
		public void setPriceItemId(int priceItemId)
		{
			this.priceItemId = priceItemId;
		}
		
		public int getPriceItemCount()
		{
			return priceItemCount;
		}
		
		public void setPriceItemCount(int priceItemCount)
		{
			this.priceItemCount = priceItemCount;
		}
		
		public int getRewardItemId()
		{
			return rewardItemId;
		}
		
		public void setRewardItemId(int rewardItemId)
		{
			this.rewardItemId = rewardItemId;
		}
		
		public int getRewardItemCount()
		{
			return rewardItemCount;
		}
		
		public void setRewardItemCount(int rewardItemCount)
		{
			this.rewardItemCount = rewardItemCount;
		}
	}
}

в конфигах тоже вроде ничего такого

Enable_ClassMaster = True

# End of event
ClassMasterDateStart = 24-2-2015

# Start of event
ClassMasterDateEnd = 24-2-2020

# Message to start event
ClassMasterMessageStart = Class Master Event: Start!

# Define the items necessary to make the change of class. [itemId,ItemCount]
ClassMasterPriceJob1 = 57,10000
# Define the items necessary to make the change of class. [itemId,ItemCount]
ClassMasterPriceJob2 = 57,100000
# Define the items necessary to make the change of class. [itemId,ItemCount]
ClassMasterPriceJob3 = 57,1000000

# Define the prize for making the change of class. [itemId,ItemCount] (0,0 to disable)
ClassMasterRewardJob1 = 6622,1
# Define the prize for making the change of class. [itemId,ItemCount] (0,0 to disable)
ClassMasterRewardJob2 = 6622,1
# Define the prize for making the change of class. [itemId,ItemCount] (0,0 to disable)
ClassMasterRewardJob3 = 6622,1

Буду пробовать дальше..

если у кого-нибудь есть понимание этого напишите пожалуйста.

За первую профу дает итем правильно а за вторую и третью подменяет любые итемы (кроме адены) на Short Sword

Изменено пользователем Meg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если это квест то логично бдет искать id награды файлах этого квеста.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...