Exception processing bypass from Player:Amobus[268489484]: FindPvP Cannot invoke "org.l2jmobius.gameserver.model.actor.Creature.isNpc()" because "target" is null
WARNING 83 org.l2jmobius.gameserver.network.PacketLogger Exception processing bypass from Player:Amobus[268489484]: FindPvP Cannot invoke "org.l2jmobius.gameserver.model.actor.Creature.isNpc()" because "target" is null
handlers.communityboard
закиньте и байпас вот такой вот bypass FindPvP
и в masterhandler
не забудь-те прописать package handlers.communityboard;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.l2jmobius.Config;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.enums.ChatType;
import org.l2jmobius.gameserver.handler.IParseBoardHandler;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.network.serverpackets.CreatureSay;
/**
* @author Mobius (based on Tenkai pvpzone)
*/
public class...
Это так и есть.Я аналогично не силен, лишь встал на дорогу познания
.
Или же оно ругается на то что я добавил байпас в альт б, а не к НПС к примеру?
package handlers.bypasshandlers;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.l2jmobius.Config;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.enums.ChatType;
import org.l2jmobius.gameserver.handler.IBypassHandler;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.network.serverpackets.CreatureSay;
/**
* @author Mobius (based on Tenkai pvpzone)
*/
public class FindPvP implements IBypassHandler
{
private static final String[] COMMANDS =
{
"FindPvP"
};
@Override
public boolean useBypass(String command, Player player, Creature target)
{
if (!Config.ENABLE_FIND_PVP || !target.isNpc())
{
return false;
}
Player mostPvP = null;
int max = -1;
for (Player plr : World.getInstance().getPlayers())
{
if ((plr == null) //
|| (plr.getPvpFlag() == 0) //
|| (plr.getInstanceId() != 0) //
|| plr.isGM() //
|| plr.isInsideZone(ZoneId.PEACE) //
|| plr.isInsideZone(ZoneId.SIEGE) //
|| plr.isInsideZone(ZoneId.NO_SUMMON_FRIEND))
{
continue;
}
int count = 0;
for (Player pl : World.getInstance().getVisibleObjects(plr, Player.class))
{
if ((pl.getPvpFlag() > 0) && !pl.isInsideZone(ZoneId.PEACE))
{
count++;
}
}
if (count > max)
{
max = count;
mostPvP = plr;
}
}
if (mostPvP != null)
{
// Check if the player's clan is already outnumbering the PvP
if (player.getClan() != null)
{
final Map<Integer, Integer> clanNumbers = new HashMap<>();
int allyId = player.getAllyId();
if (allyId == 0)
{
allyId = player.getClanId();
}
clanNumbers.put(allyId, 1);
for (Player known : World.getInstance().getVisibleObjects(mostPvP, Player.class))
{
int knownAllyId = known.getAllyId();
if (knownAllyId == 0)
{
knownAllyId = known.getClanId();
}
if (knownAllyId != 0)
{
if (clanNumbers.containsKey(knownAllyId))
{
clanNumbers.put(knownAllyId, clanNumbers.get(knownAllyId) + 1);
}
else
{
clanNumbers.put(knownAllyId, 1);
}
}
}
int biggestAllyId = 0;
int biggestAmount = 2;
for (Entry<Integer, Integer> clanNumber : clanNumbers.entrySet())
{
if (clanNumber.getValue() > biggestAmount)
{
biggestAllyId = clanNumber.getKey();
biggestAmount = clanNumber.getValue();
}
}
if (biggestAllyId == allyId)
{
player.sendPacket(new CreatureSay(null, ChatType.WHISPER, target.getName(), "Sorry, your clan/ally is outnumbering the place already so you can't move there."));
return true;
}
}
player.teleToLocation((mostPvP.getX() + Rnd.get(300)) - 150, (mostPvP.getY() + Rnd.get(300)) - 150, mostPvP.getZ());
player.setSpawnProtection(true);
if (!player.isGM())
{
player.setPvpFlagLasts(System.currentTimeMillis() + Config.PVP_PVP_TIME);
player.startPvPFlag();
}
}
else
{
player.sendPacket(new CreatureSay(null, ChatType.WHISPER, target.getName(), "Sorry, I can't find anyone in flag status right now."));
}
return false;
}
@Override
public String[] getBypassList()
{
return COMMANDS;
}
}
Самый главный вопрос - а какой у вас байпас ?Да проблема оказалась в том что стоит проверка на таргет НПС.
Тогда прошу помочь еще с одним, как от нее избавиться или же переделать на Альт Б. Тыкните носом куда смотреть. Моих знаний пока не хватает с такой элементарной проблемой разобраться
Код:package handlers.bypasshandlers; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import org.l2jmobius.Config; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.enums.ChatType; import org.l2jmobius.gameserver.handler.IBypassHandler; import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.zone.ZoneId; import org.l2jmobius.gameserver.network.serverpackets.CreatureSay; /** * @author Mobius (based on Tenkai pvpzone) */ public class FindPvP implements IBypassHandler { private static final String[] COMMANDS = { "FindPvP" }; @Override public boolean useBypass(String command, Player player, Creature target) { if (!Config.ENABLE_FIND_PVP || !target.isNpc()) { return false; } Player mostPvP = null; int max = -1; for (Player plr : World.getInstance().getPlayers()) { if ((plr == null) // || (plr.getPvpFlag() == 0) // || (plr.getInstanceId() != 0) // || plr.isGM() // || plr.isInsideZone(ZoneId.PEACE) // || plr.isInsideZone(ZoneId.SIEGE) // || plr.isInsideZone(ZoneId.NO_SUMMON_FRIEND)) { continue; } int count = 0; for (Player pl : World.getInstance().getVisibleObjects(plr, Player.class)) { if ((pl.getPvpFlag() > 0) && !pl.isInsideZone(ZoneId.PEACE)) { count++; } } if (count > max) { max = count; mostPvP = plr; } } if (mostPvP != null) { // Check if the player's clan is already outnumbering the PvP if (player.getClan() != null) { final Map<Integer, Integer> clanNumbers = new HashMap<>(); int allyId = player.getAllyId(); if (allyId == 0) { allyId = player.getClanId(); } clanNumbers.put(allyId, 1); for (Player known : World.getInstance().getVisibleObjects(mostPvP, Player.class)) { int knownAllyId = known.getAllyId(); if (knownAllyId == 0) { knownAllyId = known.getClanId(); } if (knownAllyId != 0) { if (clanNumbers.containsKey(knownAllyId)) { clanNumbers.put(knownAllyId, clanNumbers.get(knownAllyId) + 1); } else { clanNumbers.put(knownAllyId, 1); } } } int biggestAllyId = 0; int biggestAmount = 2; for (Entry<Integer, Integer> clanNumber : clanNumbers.entrySet()) { if (clanNumber.getValue() > biggestAmount) { biggestAllyId = clanNumber.getKey(); biggestAmount = clanNumber.getValue(); } } if (biggestAllyId == allyId) { player.sendPacket(new CreatureSay(null, ChatType.WHISPER, target.getName(), "Sorry, your clan/ally is outnumbering the place already so you can't move there.")); return true; } } player.teleToLocation((mostPvP.getX() + Rnd.get(300)) - 150, (mostPvP.getY() + Rnd.get(300)) - 150, mostPvP.getZ()); player.setSpawnProtection(true); if (!player.isGM()) { player.setPvpFlagLasts(System.currentTimeMillis() + Config.PVP_PVP_TIME); player.startPvPFlag(); } } else { player.sendPacket(new CreatureSay(null, ChatType.WHISPER, target.getName(), "Sorry, I can't find anyone in flag status right now.")); } return false; } @Override public String[] getBypassList() { return COMMANDS; } }
public boolean useBypass(String command, Player player, Creature target)
{
if (!Config.ENABLE_FIND_PVP || !target.isNpc())
{
return false;
}
Вы это имеете ввиду ?Самый главный вопрос - а какой у вас байпас ?
bypass -h FindPvP
Логику скрипта с вашей помощью я понял, вопрос у меня заключается в том каким образом его изменить чтобы убрать привязку даного скрипта к НПС, а получить возможность вызывать данный скрипт при нажатии на "кнопку" в Альт Б.Функция принимает стринг команды, объект игрока и обьект таргет существа, далее идёт проверка включено ли событие в конфиге и НЕ является ли таргет нпс-омC++:public boolean useBypass(String command, Player player, Creature target) { if (!Config.ENABLE_FIND_PVP || !target.isNpc()) { return false; }
да и второй вопрос - зачем используете НПС bypass если есть parseCommunityBoardCommand ?
Посмотреть вложение 45175
папочка, которая команды в Коммунити Борде даже отдельно выделена
Спасибо вам ребята, помогли! понял смысл и логику где смотретреть дальше.Самый простой, удалить принимаемый параметр таргет из функции и удалить проверку является ли таргет НПЦ, более разумный, довести до ума передачу аргументов так, чтобы объект таргет все таки передавался, при нажатии кнопки из альт б. Для этого надо копнуть именно в том направлении, откуда вызывается функция финдпвп. был бы это исходник птс, я бы вам помог, но с архитектурой л2дж я не знаком, мистера кирилла ждите, он в мобиусе как рыба в воде))
handlers.communityboard
закиньте и байпас вот такой вот bypass FindPvP
и в masterhandler
не забудь-те прописать package handlers.communityboard;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.l2jmobius.Config;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.enums.ChatType;
import org.l2jmobius.gameserver.handler.IParseBoardHandler;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.network.serverpackets.CreatureSay;
/**
* @author Mobius (based on Tenkai pvpzone)
*/
public class FindPvP implements IParseBoardHandler
{
private static final String[] COMMANDS =
{
"FindPvP"
};
@Override
public String[] getCommunityBoardCommands()
{
return COMMANDS;
}
@Override
public boolean parseCommunityBoardCommand(String command, Player player)
{
if (!Config.ENABLE_FIND_PVP)
{
return false;
}
Player mostPvP = null;
int max = -1;
for (Player plr : World.getInstance().getPlayers())
{
if ((plr == null) //
|| (plr.getPvpFlag() == 0) //
|| (plr.getInstanceId() != 0) //
|| plr.isGM() //
|| plr.isInsideZone(ZoneId.PEACE) //
|| plr.isInsideZone(ZoneId.SIEGE) //
|| plr.isInsideZone(ZoneId.NO_SUMMON_FRIEND))
{
continue;
}
int count = 0;
for (Player pl : World.getInstance().getVisibleObjects(plr, Player.class))
{
if ((pl.getPvpFlag() > 0) && !pl.isInsideZone(ZoneId.PEACE))
{
count++;
}
}
if (count > max)
{
max = count;
mostPvP = plr;
}
}
if (mostPvP != null)
{
// Check if the player's clan is already outnumbering the PvP
if (player.getClan() != null)
{
final Map<Integer, Integer> clanNumbers = new HashMap<>();
int allyId = player.getAllyId();
if (allyId == 0)
{
allyId = player.getClanId();
}
clanNumbers.put(allyId, 1);
for (Player known : World.getInstance().getVisibleObjects(mostPvP, Player.class))
{
int knownAllyId = known.getAllyId();
if (knownAllyId == 0)
{
knownAllyId = known.getClanId();
}
if (knownAllyId != 0)
{
if (clanNumbers.containsKey(knownAllyId))
{
clanNumbers.put(knownAllyId, clanNumbers.get(knownAllyId) + 1);
}
else
{
clanNumbers.put(knownAllyId, 1);
}
}
}
int biggestAllyId = 0;
int biggestAmount = 2;
for (Entry<Integer, Integer> clanNumber : clanNumbers.entrySet())
{
if (clanNumber.getValue() > biggestAmount)
{
biggestAllyId = clanNumber.getKey();
biggestAmount = clanNumber.getValue();
}
}
if (biggestAllyId == allyId)
{
player.sendPacket(new CreatureSay(null, ChatType.WHISPER, player.getName(), "Sorry, your clan/ally is outnumbering the place already so you can't move there."));
return true;
}
}
player.teleToLocation((mostPvP.getX() + Rnd.get(300)) - 150, (mostPvP.getY() + Rnd.get(300)) - 150, mostPvP.getZ());
player.setSpawnProtection(true);
if (!player.isGM())
{
player.setPvpFlagLasts(System.currentTimeMillis() + Config.PVP_PVP_TIME);
player.startPvPFlag();
}
}
else
{
player.sendPacket(new CreatureSay(null, ChatType.WHISPER, player.getName(), "Sorry, I can't find anyone in flag status right now."));
}
return false;
}
}
Попробуйте вот так... только в папочкуhandlers.communityboard
закиньте и байпас вот такой вотbypass FindPvP
и вmasterhandler
не забудь-те прописать
Java:package handlers.communityboard; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import org.l2jmobius.Config; import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.gameserver.enums.ChatType; import org.l2jmobius.gameserver.handler.IParseBoardHandler; import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.actor.Player; import org.l2jmobius.gameserver.model.zone.ZoneId; import org.l2jmobius.gameserver.network.serverpackets.CreatureSay; /** * @author Mobius (based on Tenkai pvpzone) */ public class FindPvP implements IParseBoardHandler { private static final String[] COMMANDS = { "FindPvP" }; @Override public String[] getCommunityBoardCommands() { return COMMANDS; } @Override public boolean parseCommunityBoardCommand(String command, Player player) { if (!Config.ENABLE_FIND_PVP) { return false; } Player mostPvP = null; int max = -1; for (Player plr : World.getInstance().getPlayers()) { if ((plr == null) // || (plr.getPvpFlag() == 0) // || (plr.getInstanceId() != 0) // || plr.isGM() // || plr.isInsideZone(ZoneId.PEACE) // || plr.isInsideZone(ZoneId.SIEGE) // || plr.isInsideZone(ZoneId.NO_SUMMON_FRIEND)) { continue; } int count = 0; for (Player pl : World.getInstance().getVisibleObjects(plr, Player.class)) { if ((pl.getPvpFlag() > 0) && !pl.isInsideZone(ZoneId.PEACE)) { count++; } } if (count > max) { max = count; mostPvP = plr; } } if (mostPvP != null) { // Check if the player's clan is already outnumbering the PvP if (player.getClan() != null) { final Map<Integer, Integer> clanNumbers = new HashMap<>(); int allyId = player.getAllyId(); if (allyId == 0) { allyId = player.getClanId(); } clanNumbers.put(allyId, 1); for (Player known : World.getInstance().getVisibleObjects(mostPvP, Player.class)) { int knownAllyId = known.getAllyId(); if (knownAllyId == 0) { knownAllyId = known.getClanId(); } if (knownAllyId != 0) { if (clanNumbers.containsKey(knownAllyId)) { clanNumbers.put(knownAllyId, clanNumbers.get(knownAllyId) + 1); } else { clanNumbers.put(knownAllyId, 1); } } } int biggestAllyId = 0; int biggestAmount = 2; for (Entry<Integer, Integer> clanNumber : clanNumbers.entrySet()) { if (clanNumber.getValue() > biggestAmount) { biggestAllyId = clanNumber.getKey(); biggestAmount = clanNumber.getValue(); } } if (biggestAllyId == allyId) { player.sendPacket(new CreatureSay(null, ChatType.WHISPER, player.getName(), "Sorry, your clan/ally is outnumbering the place already so you can't move there.")); return true; } } player.teleToLocation((mostPvP.getX() + Rnd.get(300)) - 150, (mostPvP.getY() + Rnd.get(300)) - 150, mostPvP.getZ()); player.setSpawnProtection(true); if (!player.isGM()) { player.setPvpFlagLasts(System.currentTimeMillis() + Config.PVP_PVP_TIME); player.startPvPFlag(); } } else { player.sendPacket(new CreatureSay(null, ChatType.WHISPER, player.getName(), "Sorry, I can't find anyone in flag status right now.")); } return false; } }
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?