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

Сервис аугментации (lostworld)

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

Всем привет, подскажите пожалуйста, как сделать сервис для вставки определенного ЛС в оружие (например экипированое, чтоб не ковырять интерфайс), за адену/другую валюту? 
Сборка лостворлд. Может подобное реализовано и можно сделать в датапаке?
Если нет, то в какую сторону копать в ядре? Или может кто-то делал подобное?

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


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

package services;

import java.util.Collection;

import org.mmocore.commons.dao.JdbcEntityState;
import org.mmocore.gameserver.data.htm.HtmCache;
import org.mmocore.gameserver.data.xml.holder.OptionDataHolder;
import org.mmocore.gameserver.model.Player;
import org.mmocore.gameserver.model.actor.instances.player.ShortCut;
import org.mmocore.gameserver.model.instances.NpcInstance;
import org.mmocore.gameserver.model.items.Inventory;
import org.mmocore.gameserver.model.items.ItemInstance;
import org.mmocore.gameserver.network.l2.components.HtmlMessage;
import org.mmocore.gameserver.network.l2.s2c.InventoryUpdate;
import org.mmocore.gameserver.network.l2.s2c.ShortCutRegister;
import org.mmocore.gameserver.skills.SkillEntry;
import org.mmocore.gameserver.templates.OptionDataTemplate;
import org.mmocore.gameserver.templates.augmentation.AugmentationFilter;
import org.mmocore.gameserver.templates.augmentation.AugmentationInfo;
import org.mmocore.gameserver.utils.Util;
import org.mmocore.gameserver.handler.bypass.Bypass;
import org.napile.primitive.maps.IntObjectMap;

public class Augmentation
{
	private static final int _id = 4356;
	private static final long _count = 50;

	@Bypass("augment.task")
	public void task(Player player, NpcInstance npc, String[] arg)
	{
		if(arg.length < 1)
		{
			showMainMenu(player, 0, 0);
			return;
		}

		String command = arg[0];
		int _page = 0;
		int _filter = 0;
		if(command.equals("menu"))
		{
			_page = 1;
			_filter = Integer.parseInt(arg[1]);
		}
		else if(command.equals("page"))
		{
			_page = Integer.parseInt(arg[1]);
			_filter = Integer.parseInt(arg[2]);
		}
		else if(command.equals("put"))
		{
			try
			{
				if(player.isInStoreMode() || player.isProcessingRequest() || player.isInTrade())
				{
					player.sendMessage("You cannot edit augmentation because you are on store mode");
					return;
				}

				ItemInstance targetItem = player.getInventory().getItemByObjectId(player.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RHAND));
				if(targetItem == null)
				{
					player.sendMessage("You doesn't have any weapon equipped");
					return;
				}
				if(!targetItem.getTemplate().getAugmentationInfos().isEmpty())
				{
					int augId = Integer.parseInt(arg[1]);
					OptionDataTemplate augment = OptionDataHolder.getInstance().getTemplate(augId);
					if(augment != null && Util.getPay(player, _id, _count, true))
					{
						IntObjectMap<AugmentationInfo> augmentationInfos = targetItem.getTemplate().getAugmentationInfos();
						AugmentationInfo augmentationInfo = augmentationInfos.get(16167);
						int[] options = new int[2];
						options[0] = augmentationInfo.randomOption(targetItem.getTemplate())[0];
						options[1] = augment.getId();

						player.getInventory().unEquipItem(targetItem);
						targetItem.setAugmentation(augId, options);
						targetItem.setJdbcState(JdbcEntityState.UPDATED);
						targetItem.update();

						player.getInventory().equipItem(targetItem);

						player.sendPacket(new InventoryUpdate().addModifiedItem(targetItem));

						for(ShortCut sc : player.getAllShortCuts())
						{
							if(sc.getId() == targetItem.getObjectId() && sc.getType() == ShortCut.TYPE_ITEM)
								player.sendPacket(new ShortCutRegister(player, sc));
						}
						player.sendChanges();
					}
				}
				else
					player.sendMessage("Error: Augmentation for this item is empty!");
			}
			catch(Exception e)
			{
				e.printStackTrace();
				player.sendMessage("Error.");
			}
		}

		showMainMenu(player, _page, _filter);
	}

	private AugmentationFilter getFilter(int id)
	{
		switch(id)
		{
			case 2:
				return AugmentationFilter.ACTIVE_SKILL;
			case 3:
				return AugmentationFilter.PASSIVE_SKILL;
			case 4:
				return AugmentationFilter.CHANCE_SKILL;
			case 5:
				return AugmentationFilter.STATS;
			default:
				return AugmentationFilter.NONE;
		}
	}

	private void showMainMenu(Player player, int _page, int _filter)
	{
		if(_page < 1)
		{
			HtmlMessage html = new HtmlMessage(5);
			html.setFile("scripts/services/Augmentations/index.htm");
			player.sendPacket(html);
			return;
		}

		Collection<OptionDataTemplate> augmentations = OptionDataHolder.getInstance().getUniqueOptions(getFilter(_filter));
		if(augmentations.isEmpty())
		{
			showMainMenu(player, _page, _filter);
			player.sendMessage("Augmentation list is empty. Try with another filter");
			return;
		}

		HtmlMessage html = new HtmlMessage(5);
		html.setFile("scripts/services/Augmentations/list.htm");

		String template = HtmCache.getInstance().getHtml("scripts/services/Augmentations/template.htm", player);
		String block = "";
		String list = "";

		StringBuilder pagesHtm = new StringBuilder();
		int maxPage = (int) Math.ceil(augmentations.size() / 7.);
		_page = Math.min(_page, maxPage);

		int page = 1;
		int count = 0;
		boolean lastColor = true;

		for(int i = Math.max(maxPage - _page < 3 ? maxPage - 6 : _page - 3, 1); i <= maxPage; i++)
		{
			if(i == _page)
				pagesHtm.append("<td background=L2UI_ct1.button_df><button action=\"\" value=\"" + i + "\" width=38 height=20 back=\"\" fore=\"\"></td>");
			else
				pagesHtm.append("<td><button action=\"bypass -h htmbypass_augment.task page " + i + " " + _filter + "\" value=\"" + i + "\" width=34 height=20 back=L2UI_ct1.button_df fore=L2UI_ct1.button_df></td>");
			
			count++;
			if(count >= 6)
				break;
		}
		count = 0;
		for(OptionDataTemplate augm : augmentations)
		{
			count++;
			if(count >= 7)
			{
				count = 0;
				page++;
			}
			else
			{
				if(page > _page)
					break;
				
				if(page == _page)
				{
					SkillEntry skill = !augm.getTriggerList().isEmpty() ? augm.getTriggerList().get(0).getSkill() : (!augm.getSkills().isEmpty() ? augm.getSkills().get(0) : null);

					block = template;
					block = block.replace("{bypass}", "bypass -h htmbypass_augment.task put " + augm.getId() + " " + _filter);

					String name = "";
					if(skill != null)
						name = skill.getName().length() > 28 ? skill.getName().substring(0, 28) : skill.getName();
					else
					{
						name = "+1 ";
						switch(augm.getId())
						{
							case 16341:
								name += "STR";
								break;
							case 16342:
								name += "CON";
								break;
							case 16343:
								name += "INT";
								break;
							case 16344:
								name += "MEN";
								break;
							default:
								name += "(Id:" + augm.getId() + ")";
								break;
						}
					}

					block = block.replace("{name}", name);
					block = block.replace("{icon}", skill != null ? skill.getTemplate().getIcon() : "icon.skill5041");
					block = block.replace("{color}", lastColor ? "222222" : "333333");
					block = block.replace("{price}", Util.formatAdena(_count) + " " + Util.getItemName(_id));
					list += block;

					lastColor = !lastColor;
				}
			}
		}
		html.replace("%pages%", pagesHtm.toString());
		html.replace("%augs%", list);
		player.sendPacket(html);
	}
}

  • Upvote 1

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


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

 

  Скрыть контент

 



package services;

import java.util.Collection;

import org.mmocore.commons.dao.JdbcEntityState;
import org.mmocore.gameserver.data.htm.HtmCache;
import org.mmocore.gameserver.data.xml.holder.OptionDataHolder;
import org.mmocore.gameserver.model.Player;
import org.mmocore.gameserver.model.actor.instances.player.ShortCut;
import org.mmocore.gameserver.model.instances.NpcInstance;
import org.mmocore.gameserver.model.items.Inventory;
import org.mmocore.gameserver.model.items.ItemInstance;
import org.mmocore.gameserver.network.l2.components.HtmlMessage;
import org.mmocore.gameserver.network.l2.s2c.InventoryUpdate;
import org.mmocore.gameserver.network.l2.s2c.ShortCutRegister;
import org.mmocore.gameserver.skills.SkillEntry;
import org.mmocore.gameserver.templates.OptionDataTemplate;
import org.mmocore.gameserver.templates.augmentation.AugmentationFilter;
import org.mmocore.gameserver.templates.augmentation.AugmentationInfo;
import org.mmocore.gameserver.utils.Util;
import org.mmocore.gameserver.handler.bypass.Bypass;
import org.napile.primitive.maps.IntObjectMap;

public class Augmentation
{
	private static final int _id = 4356;
	private static final long _count = 50;

	@Bypass("augment.task")
	public void task(Player player, NpcInstance npc, String[] arg)
	{
		if(arg.length < 1)
		{
			showMainMenu(player, 0, 0);
			return;
		}

		String command = arg[0];
		int _page = 0;
		int _filter = 0;
		if(command.equals("menu"))
		{
			_page = 1;
			_filter = Integer.parseInt(arg[1]);
		}
		else if(command.equals("page"))
		{
			_page = Integer.parseInt(arg[1]);
			_filter = Integer.parseInt(arg[2]);
		}
		else if(command.equals("put"))
		{
			try
			{
				if(player.isInStoreMode() || player.isProcessingRequest() || player.isInTrade())
				{
					player.sendMessage("You cannot edit augmentation because you are on store mode");
					return;
				}

				ItemInstance targetItem = player.getInventory().getItemByObjectId(player.getInventory().getPaperdollObjectId(Inventory.PAPERDOLL_RHAND));
				if(targetItem == null)
				{
					player.sendMessage("You doesn't have any weapon equipped");
					return;
				}
				if(!targetItem.getTemplate().getAugmentationInfos().isEmpty())
				{
					int augId = Integer.parseInt(arg[1]);
					OptionDataTemplate augment = OptionDataHolder.getInstance().getTemplate(augId);
					if(augment != null && Util.getPay(player, _id, _count, true))
					{
						IntObjectMap<AugmentationInfo> augmentationInfos = targetItem.getTemplate().getAugmentationInfos();
						AugmentationInfo augmentationInfo = augmentationInfos.get(16167);
						int[] options = new int[2];
						options[0] = augmentationInfo.randomOption(targetItem.getTemplate())[0];
						options[1] = augment.getId();

						player.getInventory().unEquipItem(targetItem);
						targetItem.setAugmentation(augId, options);
						targetItem.setJdbcState(JdbcEntityState.UPDATED);
						targetItem.update();

						player.getInventory().equipItem(targetItem);

						player.sendPacket(new InventoryUpdate().addModifiedItem(targetItem));

						for(ShortCut sc : player.getAllShortCuts())
						{
							if(sc.getId() == targetItem.getObjectId() && sc.getType() == ShortCut.TYPE_ITEM)
								player.sendPacket(new ShortCutRegister(player, sc));
						}
						player.sendChanges();
					}
				}
				else
					player.sendMessage("Error: Augmentation for this item is empty!");
			}
			catch(Exception e)
			{
				e.printStackTrace();
				player.sendMessage("Error.");
			}
		}

		showMainMenu(player, _page, _filter);
	}

	private AugmentationFilter getFilter(int id)
	{
		switch(id)
		{
			case 2:
				return AugmentationFilter.ACTIVE_SKILL;
			case 3:
				return AugmentationFilter.PASSIVE_SKILL;
			case 4:
				return AugmentationFilter.CHANCE_SKILL;
			case 5:
				return AugmentationFilter.STATS;
			default:
				return AugmentationFilter.NONE;
		}
	}

	private void showMainMenu(Player player, int _page, int _filter)
	{
		if(_page < 1)
		{
			HtmlMessage html = new HtmlMessage(5);
			html.setFile("scripts/services/Augmentations/index.htm");
			player.sendPacket(html);
			return;
		}

		Collection<OptionDataTemplate> augmentations = OptionDataHolder.getInstance().getUniqueOptions(getFilter(_filter));
		if(augmentations.isEmpty())
		{
			showMainMenu(player, _page, _filter);
			player.sendMessage("Augmentation list is empty. Try with another filter");
			return;
		}

		HtmlMessage html = new HtmlMessage(5);
		html.setFile("scripts/services/Augmentations/list.htm");

		String template = HtmCache.getInstance().getHtml("scripts/services/Augmentations/template.htm", player);
		String block = "";
		String list = "";

		StringBuilder pagesHtm = new StringBuilder();
		int maxPage = (int) Math.ceil(augmentations.size() / 7.);
		_page = Math.min(_page, maxPage);

		int page = 1;
		int count = 0;
		boolean lastColor = true;

		for(int i = Math.max(maxPage - _page < 3 ? maxPage - 6 : _page - 3, 1); i <= maxPage; i++)
		{
			if(i == _page)
				pagesHtm.append("<td background=L2UI_ct1.button_df><button action=\"\" value=\"" + i + "\" width=38 height=20 back=\"\" fore=\"\"></td>");
			else
				pagesHtm.append("<td><button action=\"bypass -h htmbypass_augment.task page " + i + " " + _filter + "\" value=\"" + i + "\" width=34 height=20 back=L2UI_ct1.button_df fore=L2UI_ct1.button_df></td>");
			
			count++;
			if(count >= 6)
				break;
		}
		count = 0;
		for(OptionDataTemplate augm : augmentations)
		{
			count++;
			if(count >= 7)
			{
				count = 0;
				page++;
			}
			else
			{
				if(page > _page)
					break;
				
				if(page == _page)
				{
					SkillEntry skill = !augm.getTriggerList().isEmpty() ? augm.getTriggerList().get(0).getSkill() : (!augm.getSkills().isEmpty() ? augm.getSkills().get(0) : null);

					block = template;
					block = block.replace("{bypass}", "bypass -h htmbypass_augment.task put " + augm.getId() + " " + _filter);

					String name = "";
					if(skill != null)
						name = skill.getName().length() > 28 ? skill.getName().substring(0, 28) : skill.getName();
					else
					{
						name = "+1 ";
						switch(augm.getId())
						{
							case 16341:
								name += "STR";
								break;
							case 16342:
								name += "CON";
								break;
							case 16343:
								name += "INT";
								break;
							case 16344:
								name += "MEN";
								break;
							default:
								name += "(Id:" + augm.getId() + ")";
								break;
						}
					}

					block = block.replace("{name}", name);
					block = block.replace("{icon}", skill != null ? skill.getTemplate().getIcon() : "icon.skill5041");
					block = block.replace("{color}", lastColor ? "222222" : "333333");
					block = block.replace("{price}", Util.formatAdena(_count) + " " + Util.getItemName(_id));
					list += block;

					lastColor = !lastColor;
				}
			}
		}
		html.replace("%pages%", pagesHtm.toString());
		html.replace("%augs%", list);
		player.sendPacket(html);
	}
}

 

 

Спасибо, а можешь скинуть AugmentationFilter.java, который тут import org.mmocore.gameserver.templates.augmentation.AugmentationFilter ?
У меня в augmentation есть AugmentationInfo, а Filter нет

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


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

там скорее всего обычный энум из 

			case 2:
				return AugmentationFilter.ACTIVE_SKILL;
			case 3:
				return AugmentationFilter.PASSIVE_SKILL;
			case 4:
				return AugmentationFilter.CHANCE_SKILL;
			case 5:
				return AugmentationFilter.STATS;
			default:
				return AugmentationFilter.NONE;

 

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


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

там скорее всего обычный энум из 


			case 2:
				return AugmentationFilter.ACTIVE_SKILL;
			case 3:
				return AugmentationFilter.PASSIVE_SKILL;
			case 4:
				return AugmentationFilter.CHANCE_SKILL;
			case 5:
				return AugmentationFilter.STATS;
			default:
				return AugmentationFilter.NONE;

 

все верно

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


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

все верно

а что в нем? Скинь свой если можешь, или пример
И еще, Util.getItemName() ты дописывал? У меня в Util нет такого метода

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


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

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

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

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

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

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

Войти

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

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

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

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

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