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

ACP для PWSOFT

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

Всем добра! Сборка ласт PW,  подскажите кому не сложно с меня +

1) нужно реализовать ACP, знаю оно есть через ctrl, MP/CP прекрасно работают, но там когда умирает персонаж банка НР юзается быстро без останки

Кто может в этом разобрался или как исправить посоветуйте пожалуйста....

 Выдернул скрипт из другой сборки pwsoft, там прекрасно работает! У меня выдает эти ошибки 

Как исправить эти ошибки ниже?

 

2) Есть ли в PW фишка ??? выскакивает приглашение на эвенты или на РБ видел на l2code реализован.

3) Снимается CP когда убивает моб, не критично но есть ли решение ??

----------
1. ERROR in \AutoCombatPotions.java (at line 107)
        handler.useItem(player, potions);
                ^^^^^^^
The method useItem(L2PlayableInstance, L2ItemInstance, boolean) in the type IIte
mHandler is not applicable for the arguments (L2PcInstance, L2ItemInstance)
----------
2. ERROR in \AutoCombatPotions.java (at line 121)
        handler.useItem(player, potions);
                ^^^^^^^
The method useItem(L2PlayableInstance, L2ItemInstance, boolean) in the type IIte
mHandler is not applicable for the arguments (L2PcInstance, L2ItemInstance)
----------
3. ERROR in \AutoCombatPotions.java (at line 135)
        handler.useItem(player, potions);
                ^^^^^^^
The method useItem(L2PlayableInstance, L2ItemInstance, boolean) in the type IIte
mHandler is not applicable for the arguments (L2PcInstance, L2ItemInstance)
----------
3 problems (3 errors)
The method useItem(net.sf.l2j.gameserver.model.actor.instance.L2PlayableInstance
, net.sf.l2j.gameserver.model.L2ItemInstance, boolean) in the type scripts.items
.IItemHandler is not applicable for the arguments (net.sf.l2j.gameserver.model.a
ctor.instance.L2PcInstance, net.sf.l2j.gameserver.model.L2ItemInstance)
The method useItem(net.sf.l2j.gameserver.model.actor.instance.L2PlayableInstance
, net.sf.l2j.gameserver.model.L2ItemInstance, boolean) in the type scripts.items
.IItemHandler is not applicable for the arguments (net.sf.l2j.gameserver.model.a
ctor.instance.L2PcInstance, net.sf.l2j.gameserver.model.L2ItemInstance)
The method useItem(net.sf.l2j.gameserver.model.actor.instance.L2PlayableInstance
, net.sf.l2j.gameserver.model.L2ItemInstance, boolean) in the type scripts.items
.IItemHandler is not applicable for the arguments (net.sf.l2j.gameserver.model.a
ctor.instance.L2PcInstance, net.sf.l2j.gameserver.model.L2ItemInstance)
Failed executing script: C:\12345\server\gameserver\data\scripts\calypso\AutoCom
batPotions.java. See AutoCombatPotions.java.error.log for details.
##############################

 

Вот сам скрипт 

package calypso;

import java.util.HashMap;
import java.util.concurrent.ScheduledFuture;
import java.util.logging.Logger;

import net.sf.l2j.gameserver.ThreadPoolManager;
import net.sf.l2j.gameserver.model.L2ItemInstance;
import net.sf.l2j.gameserver.model.PcInventory;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import scripts.commands.IVoicedCommandHandler;
import scripts.commands.VoicedCommandHandler;
import scripts.items.IItemHandler;
import scripts.items.ItemHandler;

/**
 * 
 * @author Calypso
 *
 */

public class AutoCombatPotions implements IVoicedCommandHandler {

	private final static Logger _log = Logger.getLogger(AutoCombatPotions.class.getName());

	// разрешить юз банок
	private static boolean ALLOW_CP = true, ALLOW_HP = true, ALLOW_MP = true;
	// проценты для юза
	private static int PERCENT_CP = 90, PERCENT_HP = 90, PERCENT_MP = 90;
	// банки, ищутся в сумке чара, юзается первая попавшаяся
	private static final int[] CP_POTIONS = { 5592 }, HP_POTIONS = { 1539 }, MP_POTIONS = { 728 };
	// как часто запускать поток для юза всех банок (это значение будет максимальной погрешностью)
	private static long RUN_DELAY = 500;
	// реюз каждого типа банок (нет смысла устанавливать менее RUN_DELAY)
	private static long CP_DELAY = 500, HP_DELAY = 15000, MP_DELAY = 1000;
	// только для премиумов
	private static boolean ONLY_PREMIUM = false;

	private static HashMap<Integer, ScheduledFuture<?>> runnedAcps = new HashMap<Integer, ScheduledFuture<?>>();
	private static HashMap<String, Long> reuses = new HashMap<String, Long>();

	@Override
	public String[] getVoicedCommandList() {
		return new String[] { "acpon", "acpoff", "acpof" };
	}

	@Override
	public boolean useVoicedCommand(String command, L2PcInstance player, String target) {
		if (player == null)
			return false;

		if (command.toLowerCase().equals("acpon")) {
			if (ONLY_PREMIUM && !player.isPremium()) {
				player.sendMessage("Only for Premium-players!");
				return false;
			}
			if (runnedAcps.containsKey(player.getObjectId())) {
				player.sendMessage("ACP already started!");
				return false;
			}
			runnedAcps.put(player.getObjectId(), ThreadPoolManager.getInstance()
					.scheduleAiAtFixedRate(new PotionUseTask(player), RUN_DELAY, RUN_DELAY));
			player.sendMessage("ACP success started!");
		} else if (command.toLowerCase().equals("acpoff") || command.toLowerCase().equals("acpof")) {
			if (runnedAcps.containsKey(player.getObjectId())) {
				cancelTask(player.getObjectId());
				player.sendMessage("ACP is stoped!");
				return false;
			} else
				player.sendMessage("ACP already stoped!");
		}
		return false;
	}

	private class PotionUseTask implements Runnable {
		private L2PcInstance player;
		private int safeObjId;

		public PotionUseTask(L2PcInstance player) {
			this.player = player;
			safeObjId = player.getObjectId();
		}

		@Override
		public void run() {
			try {
				if (player == null) {
					_log.info("ACP: player is null!!! WTF? ObjID " + safeObjId);
					cancelTask(safeObjId);
					return;
				}
				if (player.isOnline() != 1) {
					cancelTask(safeObjId);
					return;
				}

				PcInventory inv = player.getInventory();
				IItemHandler handler = null;
				L2ItemInstance potions = null;
				if (ALLOW_CP && checkReuse(safeObjId, "CP")) {
					potions = getPotionFromInv(inv, "CP");
					if (potions != null) {
						if ((player.getCurrentCp() / player.getMaxCp()) * 100 < PERCENT_CP) {
							handler = ItemHandler.getInstance().getItemHandler(potions.getItemId());
							if (handler != null)
							{
								handler.useItem(player, potions);
								setReuse(safeObjId, "CP");
							}
						}
					}
				}

				if (ALLOW_HP && checkReuse(safeObjId, "HP")) {
					potions = getPotionFromInv(inv, "HP");
					if (potions != null) {
						if ((player.getCurrentHp() / player.getMaxHp()) * 100 < PERCENT_HP) {
							handler = ItemHandler.getInstance().getItemHandler(potions.getItemId());
							if (handler != null)
							{
								handler.useItem(player, potions);
								setReuse(safeObjId, "HP");
							}
						}
					}
				}

				if (ALLOW_MP && checkReuse(safeObjId, "MP")) {
					potions = getPotionFromInv(inv, "MP");
					if (potions != null) {
						if ((player.getCurrentMp() / player.getMaxMp()) * 100 < PERCENT_MP) {
							handler = ItemHandler.getInstance().getItemHandler(potions.getItemId());
							if (handler != null)
							{
								handler.useItem(player, potions);
								setReuse(safeObjId, "MP");
							}
						}
					}
				}
			} catch (Exception e) {
				runnedAcps.get(safeObjId).cancel(false);
			}
		}
	}

	private boolean checkReuse(int objId, String type)
	{
		String pair = String.valueOf(objId) + ":" + type;
		if(!reuses.containsKey(pair))
			return true;
		long lastUse = reuses.get(pair);
		if(System.currentTimeMillis() - lastUse >= getReuseForPotion(type))
			return true;
		return false;
	}

	private void setReuse(int objId, String type)
	{
		String pair = String.valueOf(objId) + ":" + type;
		reuses.put(pair, System.currentTimeMillis());
	}

	private long getReuseForPotion(String type)
	{
		type = type.toLowerCase();
		if(type.equals("cp"))
			return CP_DELAY;
		if(type.equals("hp"))
			return HP_DELAY;
		if(type.equals("mp"))
			return MP_DELAY;
		return 0;
	}

	private L2ItemInstance getPotionFromInv(PcInventory inv, String type) {
		L2ItemInstance result = null;
		int[] search = null;

		if (type.toLowerCase().equals("cp"))
			search = CP_POTIONS;
		if (type.toLowerCase().equals("hp"))
			search = HP_POTIONS;
		if (type.toLowerCase().equals("mp"))
			search = MP_POTIONS;

		if (search == null)
			_log.warning(
					"ACP: getPotionFromInv() == null, invalid potion type or unsetted id of potions! Type: " + type);

		for (int id : search) {
			result = inv.getItemByItemId(id);
			if (result != null)
				break;
		}
		return result;
	}

	private void cancelTask(int objId) {
		runnedAcps.remove(objId).cancel(false);
	}

	public static void main(String... arguments) {
		VoicedCommandHandler.getInstance().registerVoicedCommandHandler(new AutoCombatPotions());
		_log.info("### ACP service by Calypso loaded!");
	}
}

 

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


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

по идее все что нужно, вот это

if ((player.getCurrentHp() / player.getMaxHp()) * 100 < PERCENT_HP)

заменить на это

if (!player.isDead() && (player.getCurrentHp() / player.getMaxHp()) * 100 < PERCENT_HP)

по аналогии можно и для CP/MP на всякий случай добавить

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

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


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

в какой то версии (новой ли старой) для метода useItem нужно 3 аргумента (игрок, итем, ctrl) , т.е. добавить false в вызов метода. Ну и скрипт хоть и мой, но древний, нуждается в оптимизации (а вообще лучше всё это через ядро сделать)

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


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

Частично решил все

1) Спасибо за скрипт CalypsoToolz,  сам разобрался, но плюс дал, надо добавить false. Более того нашел ядро с отдельным HP/MP/CP !

2) Есть приглашение на эвенты EventRegPopUp = True

3) Не нашел решения (

появился вопрос

4) Реально ли добавить проф окно при 20/40/76 без npc, как понял это в ядро надо, нельзя его без ядра реализовать ? или если есть скрипт поделитесь 

Спойлер

package scripts.commands.voicedcommandhandlers;

import net.sf.l2j.Config;
import net.sf.l2j.gameserver.datatables.SkillTable;
import net.sf.l2j.gameserver.model.L2Skill;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.gameserver.datatables.xml.CharTemplateData;
import net.sf.l2j.gameserver.model.base.ClassId;
import net.sf.l2j.gameserver.model.base.ClassLevel;
import net.sf.l2j.gameserver.model.base.PlayerClass;
import net.sf.l2j.gameserver.model.quest.Quest;
import net.sf.l2j.gameserver.network.SystemMessageId;
import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
import net.sf.l2j.gameserver.network.serverpackets.MagicSkillUse;
import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;

public class ClassMass  implements IVoicedCommandHandler

{

  private static final String[] VOICED_COMMANDS = { "classmaster","change_class"};

 

  public boolean useVoicedCommand(String command, L2PcInstance player, String target)

  {

  if (command.equalsIgnoreCase("classmaster"))

  {

    ClassId classId = player.getClassId();

    int jobLevel = 0;

    int level = player.getLevel();

    ClassLevel lvl = PlayerClass.values()[classId.getId()].getLevel();

    switch (lvl)

    {

     case First:jobLevel = 1;break;

     case Second:jobLevel = 2;break;

     case Third:jobLevel = 3;break;

     default:jobLevel = 4;

    }

    if (player.isGM()) showChatWindowChooseClass(player);

    else if (((level >= 20 && jobLevel == 1) || (level >= 40 && jobLevel == 2)) && Config.ALLOW_CLASS_MASTER)

     showChatWindow(player, classId.getId());

    else if (level >= 76 && Config.ALLOW_CLASS_MASTER && classId.getId() < 88)

    {

     for (int i = 0; i < SECONDN_CLASS_IDS.length; i++)

     {

      if (classId.getId() == SECONDN_CLASS_IDS)

      {

       NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());

       StringBuilder sb = new StringBuilder();

       sb.append("<html><body<table width=200>");

       sb.append("<tr><td><center>" + CharTemplateData.getInstance().getClassNameById(player.getClassId().getId()) + " Class Master:</center></td></tr>");

       sb.append("<tr><td><br></td></tr>");

       sb.append("<tr><td><a action=\"bypass -h npc_" + getObjectId() + "_change_class " + (88 + i) + "\">Advance to " + CharTemplateData.getInstance().getClassNameById(88 + i) + "</a></td></tr>");

       sb.append("<tr><td><br></td></tr>");

       sb.append("</table></body></html>");

       html.setHtml(sb.toString());

       player.sendPacket(html);

       break;

      }

     }

    }

    else

    {

     NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());

     StringBuilder sb = new StringBuilder();

     sb.append("<html><body>");

     switch (jobLevel)

     {

      case 1:

       sb.append("Come back here when you reach level 20 to change your class.<br>");

      break;

      case 2:

       sb.append("Come back here when you reach level 40 to change your class.<br>");

      break;

      case 3:

       sb.append("There are no more class changes for you.<br>");

      break;

     }

     for (Quest q : Quest.findAllEvents())

      sb.append("Event: <a action=\"bypass -h Quest " + q.getName() + "\">" + q.getDescr() + "</a><br>");

     sb.append("</body></html>");

     html.setHtml(sb.toString());

     player.sendPacket(html);

    }

    player.sendPacket(ActionFailed.STATIC_PACKET);

  }

  else if (command.startsWith("change_class"))

  {

   int val = Integer.parseInt(command.substring(13));

   ClassId classId = player.getClassId();

   int level = player.getLevel();

   int jobLevel = 0;

   int newJobLevel = 0;

   ClassLevel lvlnow = PlayerClass.values()[classId.getId()].getLevel();

   if (player.isGM())

   {

    changeClass(player, val);

    player.rewardSkills();

    if (val >= 88)

     player.sendPacket(SystemMessageId.THIRD_CLASS_TRANSFER);

    else

     player.sendPacket(SystemMessageId.CLASS_TRANSFER);

    NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());

    StringBuilder sb = new StringBuilder();

    sb.append("<html><body>");

    sb.append("You have now become a <font color=\"LEVEL\">" + CharTemplateData.getInstance().getClassNameById(player.getClassId().getId()) + "</font>.");

    sb.append("</body></html>");

    html.setHtml(sb.toString());

    player.sendPacket(html);

    return;

   }

   switch (lvlnow)

   {

    case First:

     jobLevel = 1;

    break;

    case Second:

     jobLevel = 2;

    break;

    case Third:

     jobLevel = 3;

    break;

    default:

     jobLevel = 4;

   }

   if (jobLevel == 4)

    return; // no more job changes

   ClassLevel lvlnext = PlayerClass.values()[val].getLevel();

   switch (lvlnext)

   {

    case First:

     newJobLevel = 1;

    break;

    case Second:

     newJobLevel = 2;

    break;

    case Third:

     newJobLevel = 3;

    break;

    default:

     newJobLevel = 4;

   }

   // prevents changing between same level jobs

   if (newJobLevel != jobLevel + 1)

    return;

   if (level < 20 && newJobLevel > 1)

    return;

   if (level < 40 && newJobLevel > 2)

    return;

   if (level < 75 && newJobLevel > 3)

    return;

   changeClass(player, val);

   player.rewardSkills();

   if (val >= 88)

    player.sendPacket(SystemMessageId.THIRD_CLASS_TRANSFER); // system sound 3rd occupation

   else

    player.sendPacket(SystemMessageId.CLASS_TRANSFER); // system sound for 1st and 2nd occupation

   player.broadcastPacket(new MagicSkillUse(player, player, 5103, 1, 1000, 0));

   HtmlShow(player);

   checks(player);

   checkAutoEq(player,newJobLevel);

  }

    return true;

  }

private void changeClass(L2PcInstance player, int val)

{

  final ClassId currentClassId = player.getClassId();

  if (getMinLevel(currentClassId.level()) > player.getLevel())

   return;

  if (!validateClassId(currentClassId, val))

   return;

  player.setClassId(val);

  if (player.isSubClassActive()){player.getSubClasses().get(player.getClassIndex()).setClassId(player.getActiveClass());}

  else

  {

   ClassId classId = ClassId.getClassIdByOrdinal(player.getActiveClass());

            if (classId.getParent() != null){while (classId.level() == 0){classId = classId.getParent();}}

            player.setBaseClass(classId);

  }

  player.broadcastUserInfo();

} 

  public String[] getVoicedCommandList(){return VOICED_COMMANDS;}

}

 

 

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

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


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

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

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

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

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

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

Войти

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

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

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

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

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