Сообщений: 36
Тем: 8
Зарегистрирован: Jun 2011
Репутация:
0
Azagthtot, Вы правы, проще будет, если "озвучу" свою предконечную цель.
Хотел реализовать похожее на GvE мод. Тобишь если у чаров совпадают SpiritId то они не могут атаковать друг друга, если разные, то могут.
У меня получалось похожее реализовать в PcInstance, но получалось так, что схожие ID просто не могут убить друг друга, а атаковать могут.
Мои догадки привели меня к файлу AttackRequest - что там нужно делать ту самую проверку на SpiritId. Будте добры, подскажите прав я или нет и где нужно делать эту саму проверку на SpiritId ?
Сообщений: 6,450
Тем: 262
Зарегистрирован: Nov 2007
Репутация:
44,165
Array;128190 Написал:Так наверное отмечается Приватный или защищенный метод\свойство.
Сообщений: 1,326
Тем: 10
Зарегистрирован: Apr 2010
Репутация:
2,078
Aaron Написал:Azagthtot, Вы правы, проще будет, если "озвучу" свою предконечную цель.
Хотел реализовать похожее на GvE мод. Тобишь если у чаров совпадают SpiritId то они не могут атаковать друг друга, если разные, то могут.
У меня получалось похожее реализовать в PcInstance, но получалось так, что схожие ID просто не могут убить друг друга, а атаковать могут.
Мои догадки привели меня к файлу AttackRequest - что там нужно делать ту самую проверку на SpiritId. Будте добры, подскажите прав я или нет и где нужно делать эту саму проверку на SpiritId ? Ну я так и думал. Однако, вы не правы. Точнее правы, но частично.
Вам надо проверку ставить "ниже", а конкретно в методе isAutoAttackable() и второе в методе addDamageHate() класса L2PcInstance
В первом за то можно ли атаковать чара, а во втором, что бы случайно ему скиллом не снесло жизнь.
Сообщений: 36
Тем: 8
Зарегистрирован: Jun 2011
Репутация:
0
06-27-2011, 03:11 AM
(Сообщение последний раз редактировалось: 06-27-2011, 05:04 PM Aaron.)
Господа, подскажите, из-за чего может быть такое :
При создании чара сервер выдаёт такую ошибку -
Unknown Packet : d0:3d on State : AUTHED Client
* Всё, разобрался сам. Клиент не подходил ))
Добавлено через 13 часов 53 минуты
Azagthtot Написал:Ну я так и думал. Однако, вы не правы. Точнее правы, но частично.
Вам надо проверку ставить "ниже", а конкретно в методе isAutoAttackable() и второе в методе addDamageHate() класса L2PcInstance
В первом за то можно ли атаковать чара, а во втором, что бы случайно ему скиллом не снесло жизнь.
Уважаемый Azagthtot, в сервере L2j T2.4 , есть только такой isAutoAttackable. ( В IT находил ещё один isAutoAttackable(player) ).
PHP код: <?php
public boolean isAutoAttackable(L2Character attacker)
{
// Check if the attacker isn't the L2PcInstance Pet
if (attacker == this || attacker == getPet())
return false;
// TODO: check for friendly mobs
// Check if the attacker is a L2MonsterInstance
if (attacker instanceof L2MonsterInstance)
return true;
// Check if the attacker is not in the same party
if (getParty() != null && getParty().getPartyMembers().contains(attacker))
return false;
// Check if the attacker is in olympia and olympia start
if (attacker instanceof L2PcInstance && ((L2PcInstance)attacker).isInOlympiadMode() ){
if (isInOlympiadMode() && isOlympiadStart() && ((L2PcInstance)attacker).getOlympiadGameId()==getOlympiadGameId())
return true;
else
return false;
}
// Check if the attacker is in TvT and TvT is started
if (TvTEvent.isStarted() && TvTEvent.isPlayerParticipant(getObjectId()))
return true;
// Check if the attacker is not in the same clan
if (getClan() != null && attacker != null && getClan().isMember(attacker.getObjectId()))
return false;
if(attacker instanceof L2Playable && isInsideZone(ZONE_PEACE))
return false;
// Check if the L2PcInstance has Karma
if (getKarma() > 0 || getPvpFlag() > 0)
return true;
// Check if the attacker is a L2Playable
if (attacker instanceof L2Playable)
{
// Get L2PcInstance
L2PcInstance cha = attacker.getActingPlayer();
// is AutoAttackable if both players are in the same duel and the duel is still going on
if ( getDuelState() == Duel.DUELSTATE_DUELLING
&& getDuelId() == cha.getDuelId())
return true;
// Check if the L2PcInstance is in an arena or a siege area
if (isInsideZone(ZONE_PVP) && cha.isInsideZone(ZONE_PVP))
return true;
if (getClan() != null)
{
Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ());
if (siege != null)
{
// Check if a siege is in progress and if attacker and the L2PcInstance aren't in the Defender clan
if (siege.checkIsDefender(cha.getClan()) &&
siege.checkIsDefender(getClan()))
return false;
// Check if a siege is in progress and if attacker and the L2PcInstance aren't in the Attacker clan
if (siege.checkIsAttacker(cha.getClan()) &&
siege.checkIsAttacker(getClan()))
return false;
}
// Check if clan is at war
if (getClan() != null && cha.getClan() != null
&& getClan().isAtWarWith(cha.getClanId())
&& cha.getClan().isAtWarWith(getClanId())
&& getWantsPeace() == 0
&& cha.getWantsPeace() == 0
&& !isAcademyMember())
return true;
}
}
else if (attacker instanceof L2DefenderInstance)
{
if (getClan() != null)
{
Siege siege = SiegeManager.getInstance().getSiege(this);
return (siege != null && siege.checkIsAttacker(getClan()));
}
}
return false;
}
Не могу разобраться, как при выполнении проверки, сравнивать getSpiritId игрока и чара выбранного по таргету ?
Я пытался сделать таким образом :
PHP код: <?php
if (getSpiritId() != target.getSpiritId())
Пробывал и targetPlayer... Либо я не туда вписываю, либо таргет не предусмотрен в isAutoAttackable. Прошу, подскажите в чём я заблуждаюсь и по возможности укажите выход из "тупика".
Благодарю.
Сообщений: 983
Тем: 11
Зарегистрирован: Mar 2010
Репутация:
11,535
06-27-2011, 05:47 PM
(Сообщение последний раз редактировалось: 06-27-2011, 06:31 PM Array.)
В функцию передается не target, а attacker.
[src=java]public boolean isAutoAttackable(L2Character attacker)[/src]
Тогда будет:
[src=java]if (getSpiritId() == attacker.getSpiritId())
return false;[/src]
Эту проверку поставить лучше после проверки на TvT.
Фэйл, не тот класс =\
Сообщений: 1,326
Тем: 10
Зарегистрирован: Apr 2010
Репутация:
2,078
Aaron,
оффтоп
А может все-таки сначала выучить хотя бы основы программирования, а потом браться? А то напоминает перевод слепого через минное поле.
Сообщений: 36
Тем: 8
Зарегистрирован: Jun 2011
Репутация:
0
Array Написал:В функцию передается не target, а attacker.
[src=java]public boolean isAutoAttackable(L2Character attacker)[/src]
Тогда будет:
[src=java]if (getSpiritId() == attacker.getSpiritId())
return false;[/src]
Эту проверку поставить лучше после проверки на TvT.
Сделал после проверки на TvT, но снова выдаёт ошибку, что SpiritId не найден. Хотя я его прописал.
Цитата:C:\Server-Amadeus\Amadeus_L2jGraciaFinal(2.4)\L2J_2.4-WorkMe\Source\java\com\l2jserver\gameserver\model\actor\instance\L2PcInstance.java (8587:34) cannot find symbol
C:\Server-Amadeus\Amadeus_L2jGraciaFinal(2.4)\L2J_2.4-WorkMe\Source\java\com\l2jserver\gameserver\model\actor\instance\L2PcInstance.java:8587: cannot find symbol
symbol : method getSpiritId()
location: class com.l2jserver.gameserver.model.actor.L2Character
PHP код: <?php
// Check if the attacker is in TvT and TvT is started
if (TvTEvent.isStarted() && TvTEvent.isPlayerParticipant(getObjectId()))
return true;
// Attack SpiritId
if (getSpiritId() == attacker.getSpiritId())
return false;
// Check if the attacker is not in the same clan
if (getClan() != null && attacker != null && getClan().isMember(attacker.getObjectId()))
return false;
if(attacker instanceof L2Playable && isInsideZone(ZONE_PEACE))
return false;
Azagthtot, я конечно же с Вами согласен, изучаю. Просто это последнее что мне нужно, остальное я реализовал. Поэтому и спешу побыстрей с этим разобраться.
Спасибо всем за терпение, адекватные ответы и помощь. Очень благодарен.
Сообщений: 1,326
Тем: 10
Зарегистрирован: Apr 2010
Репутация:
2,078
Вы понимаете простейшую вещь?
Аксиома 1. Вы определили getSpiritId() в L2PcInstance
Аксиома 2. В isAutoAttackable() передается L2Character
Вы пытаетесь получить getSpiritId() от attacker, который является L2Character
Следствие. Компилятор сомневается в ваших способностях
Сообщений: 36
Тем: 8
Зарегистрирован: Jun 2011
Репутация:
0
Спасибо всем огромное. Всё получилось.
В L2Character прописал
PHP код: <?php
private int _SpiritId;
public int getSpiritId()
{
return _SpiritId;
}
public int setSpiritId(int SpiritId)
{
_SpiritID = SpiritId;
}
Этого было достаточно. Спасибо ещё раз - добра и счастья
Сообщений: 1,326
Тем: 10
Зарегистрирован: Apr 2010
Репутация:
2,078
:facepalm:
Вы уж простите за откровенность, но вы пошли по принципу "Если что-то можно сделать через ж... то надо именно так и делать"
С вашим методом саммоны будут грызть кого угодно.
И так, как стоит сделать
Код: public boolean isAutoAttackable(L2Character attacker)
{
// Check if the attacker isn't the L2PcInstance Pet
if (attacker == this || attacker == getPet())
return false;
// TODO: check for friendly mobs
// Check if the attacker is a L2MonsterInstance
if (attacker instanceof L2MonsterInstance)
return true;
// Check if the attacker is not in the same party
if (getParty() != null && getParty().getPartyMembers().contains(attacker))
return false;
// Check if the attacker is in olympia and olympia start
if (attacker instanceof L2PcInstance && ((L2PcInstance)attacker).isInOlympiadMode() ){
if (isInOlympiadMode() && isOlympiadStart() && ((L2PcInstance)attacker).getOlympiadGameId()==getOlympiadGameId())
return true;
else
return false;
}
// Check if the attacker is in TvT and TvT is started
if (TvTEvent.isStarted() && TvTEvent.isPlayerParticipant(getObjectId()))
return true;
[COLOR="Red"]
if(attacker instanceof L2Playable) {
L2Player cha = attacker.getActingPlayer();
if(getSpiritId() == ((L2PcInstance)cha).getSpiritId())
return false;
}
[/COLOR] // Check if clan is at war
// Check if the attacker is not in the same clan
if (getClan() != null && attacker != null && getClan().isMember(attacker.getObjectId()))
return false;
if(attacker instanceof L2Playable && isInsideZone(ZONE_PEACE))
return false;
// Check if the L2PcInstance has Karma
if (getKarma() > 0 || getPvpFlag() > 0)
return true;
// Check if the attacker is a L2Playable
if (attacker instanceof L2Playable)
{
// Get L2PcInstance
L2PcInstance cha = attacker.getActingPlayer();
// is AutoAttackable if both players are in the same duel and the duel is still going on
if ( getDuelState() == Duel.DUELSTATE_DUELLING
&& getDuelId() == cha.getDuelId())
return true;
// Check if the L2PcInstance is in an arena or a siege area
if (isInsideZone(ZONE_PVP) && cha.isInsideZone(ZONE_PVP))
return true;
if (getClan() != null)
{
Siege siege = SiegeManager.getInstance().getSiege(getX(), getY(), getZ());
if (siege != null)
{
// Check if a siege is in progress and if attacker and the L2PcInstance aren't in the Defender clan
if (siege.checkIsDefender(cha.getClan()) &&
siege.checkIsDefender(getClan()))
return false;
// Check if a siege is in progress and if attacker and the L2PcInstance aren't in the Attacker clan
if (siege.checkIsAttacker(cha.getClan()) &&
siege.checkIsAttacker(getClan()))
return false;
}
if (getClan() != null && cha.getClan() != null
&& getClan().isAtWarWith(cha.getClanId())
&& cha.getClan().isAtWarWith(getClanId())
&& getWantsPeace() == 0
&& cha.getWantsPeace() == 0
&& !isAcademyMember())
return true;
}
}
else if (attacker instanceof L2DefenderInstance)
{
if (getClan() != null)
{
Siege siege = SiegeManager.getInstance().getSiege(this);
return (siege != null && siege.checkIsAttacker(getClan()));
}
}
return false;
}
|