Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Вытянуть значение из базы
#11
Azagthtot, Вы правы, проще будет, если "озвучу" свою предконечную цель.
Хотел реализовать похожее на GvE мод. Тобишь если у чаров совпадают SpiritId то они не могут атаковать друг друга, если разные, то могут.

У меня получалось похожее реализовать в PcInstance, но получалось так, что схожие ID просто не могут убить друг друга, а атаковать могут.
Мои догадки привели меня к файлу AttackRequest - что там нужно делать ту самую проверку на SpiritId. Будте добры, подскажите прав я или нет и где нужно делать эту саму проверку на SpiritId ?
Ответ
#12
Array;128190 Написал:Так наверное отмечается
Приватный или защищенный метод\свойство.
Ответ
#13
Aaron Написал:Azagthtot, Вы правы, проще будет, если "озвучу" свою предконечную цель.
Хотел реализовать похожее на GvE мод. Тобишь если у чаров совпадают SpiritId то они не могут атаковать друг друга, если разные, то могут.

У меня получалось похожее реализовать в PcInstance, но получалось так, что схожие ID просто не могут убить друг друга, а атаковать могут.
Мои догадки привели меня к файлу AttackRequest - что там нужно делать ту самую проверку на SpiritId. Будте добры, подскажите прав я или нет и где нужно делать эту саму проверку на SpiritId ?
Ну я так и думал. Однако, вы не правы. Точнее правы, но частично.
Вам надо проверку ставить "ниже", а конкретно в методе isAutoAttackable() и второе в методе addDamageHate() класса L2PcInstance
В первом за то можно ли атаковать чара, а во втором, что бы случайно ему скиллом не снесло жизнь.
Ответ
#14
Господа, подскажите, из-за чего может быть такое :
При создании чара сервер выдаёт такую ошибку -
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. Прошу, подскажите в чём я заблуждаюсь и по возможности укажите выход из "тупика".
Благодарю.
Ответ
#15
В функцию передается не target, а attacker.
[src=java]public boolean isAutoAttackable(L2Character attacker)[/src]
Тогда будет:
[src=java]if (getSpiritId() == attacker.getSpiritId())
return false;[/src]
Эту проверку поставить лучше после проверки на TvT.

Фэйл, не тот класс =\
Ответ
#16
Aaron,
оффтоп
Ответ
#17
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, я конечно же с Вами согласен, изучаю. Просто это последнее что мне нужно, остальное я реализовал. Поэтому и спешу побыстрей с этим разобраться.

Спасибо всем за терпение, адекватные ответы и помощь. Очень благодарен.
Ответ
#18
Вы понимаете простейшую вещь?
Аксиома 1. Вы определили getSpiritId() в L2PcInstance
Аксиома 2. В isAutoAttackable() передается L2Character
Вы пытаетесь получить getSpiritId() от attacker, который является L2Character
Следствие. Компилятор сомневается в ваших способностях Smile
Ответ
#19
Спасибо всем огромное. Всё получилось.
В L2Character прописал

PHP код:
<?php 
private int _SpiritId;


public
int getSpiritId()
{
return
_SpiritId;
}
public
int setSpiritId(int SpiritId)
{
_SpiritID = SpiritId;
}

Этого было достаточно. Спасибо ещё раз - добра и счастья Wink
Ответ
#20
:facepalm:
Вы уж простите за откровенность, но вы пошли по принципу "Если что-то можно сделать через ж... то надо именно так и делать" Sad
С вашим методом саммоны будут грызть кого угодно.
И так, как стоит сделать
Код:
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;
    }
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Удаление остатков Dino сета с базы данных Pro_Stalker 2 2,238 04-24-2012, 01:55 PM
Последний пост: Pro_Stalker
  Параметры базы. FilipMorris 0 1,690 10-25-2011, 04:24 PM
Последний пост: FilipMorris

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)