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

Cтранное Явление

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

Заморочился с перекидыванием баффа на призываемых суммонов.

 

На первой ветке работает идеально.

 

Суть в том, что при призыве суммонов, должен передаваться бафф суммонера, но, баффы, странным образом, не только не ложаться на суммонов, но еще и снимается весь бафф с суммонера.

 

по коду:

@Override
protected void onSpawn()
{
super.onSpawn();
_spawnAnimation = 0;
Player owner = getPlayer();
Party party = owner.getParty();
if (party != null)
{
party.broadcastToPartyMembers(owner, new ExPartyPetWindowAdd(this));
}
if (owner.isInOlympiadMode())
{
getEffectList().stopAllEffects();
}
if (owner.getEffectList().getEffectByStackType("ServitorShare") != null)
{
final Creature SummonEffect = this;
ThreadPoolManager.getInstance().execute(new RunnableImpl()
{
@Override
public void runImpl()
{
 final Player owner = getPlayer();
 final Skill skl = owner.getEffectList().getEffectByStackType("ServitorShare").getSkill();
 long currenttime = owner.getEffectList().getEffectByStackType("ServitorShare").getTime();
 long duration = owner.getEffectList().getEffectByStackType("ServitorShare").getDuration();
 for(EffectTemplate et : skl.getEffectTemplates())
 {
 if(et == null || et.getEffectType() != EffectType.ServitorShare)
 {
 continue;
 }
 Env env = new Env(owner,SummonEffect,skl);
 final Effect effect = et.getEffect(env);
 if(effect == null)
 {
 continue;
 }
 effect.setCount(1);
 effect.setPeriod(duration - currenttime);
 effect.schedule();
 }
}
});
}
getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE);
transferOwnerBuffs(owner);
}

 

где transferOwnerBuffs(owner); передает бафф хозяина суммонеру:

 

public void transferOwnerBuffs(Player _owner)
{
List<Effect> effects = _owner.getEffectList().getAllEffects();
for(Effect ef : effects)
{
getEffectList().addEffect(ef);
}
}

 

И до кучи метод добавления эффекта:

 

public void addEffect(Effect effect)
{
double hp = _actor.getCurrentHp();
double mp = _actor.getCurrentMp();
double cp = _actor.getCurrentCp();

boolean add = false;
lock.lock();
try
{
if (_effects == null)
{
_effects = new CopyOnWriteArrayList<>();
}
if (effect.getStackType().contains(EffectTemplate.NO_STACK))
{
for (Effect e : _effects)
{
 if (!e.isInUse())
 {
 continue;
 }
 if (e.getStackType().contains(EffectTemplate.NO_STACK) && (e.getSkill().getId() == effect.getSkill().getId()) && (e.getEffectType() == effect.getEffectType()))
 {
 if (effect.getTimeLeft() > e.getTimeLeft())
 {
 e.exit();
 }
 else
 {
 return;
 }
 }
}
}
else
{
for (Effect e : _effects)
{
 if (!e.isInUse())
 {
 continue;
 }
 if (!checkStackType(e.getTemplate(), effect.getTemplate()))
 {
 continue;
 }
 if ((e.getSkill().getId() == effect.getSkill().getId()) && (e.getEffectType() != effect.getEffectType()))
 {
 break;
 }
 if (e.getStackOrder() == -1)
 {
 return;
 }
 if (!e.maybeScheduleNext(effect))
 {
 return;
 }
}
}
checkSlotLimit(effect);
add = _effects.add(effect);
if (add)
{
effect.setInUse(true);
}
}
finally
{
lock.unlock();
}
if (!add)
{
return;
}
effect.start();
for (FuncTemplate ft : effect.getTemplate().getAttachedFuncs())
{
if (ft._stat == Stats.MAX_HP)
{
_actor.setCurrentHp(hp, false);
}
else if (ft._stat == Stats.MAX_MP)
{
_actor.setCurrentMp(mp);
}
else if (ft._stat == Stats.MAX_CP)
{
_actor.setCurrentCp(cp);
}
}
_actor.updateStats();
_actor.updateEffectIcons();
}

 

В чём ошибка?

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

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


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

Косяк именно с методом transferOwnerBuffs? Если его закоментить, то с саммонера не будут слетать бафы?

Изменено пользователем Naik
  • Upvote 1

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


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

Если его убрать, то не будут слетать.

 

Но и на суммона не ложаться.

 

До кучи getAllEffects

 

private List<Effect> _effects;

 

public List<Effect> getAllEffects()
{
 if (isEmpty())
 {
  return Collections.emptyList();
 }
 return new ArrayList<>(_effects);
}

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


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

Явного ничего не вижу, но только одно предположение. _actor.updateEffectIcons(); - я так понимаю, что обновляем иконки еффектов саммонера, а не сумона. Хоть я и не вижу метода обновления, но смутные сомнения, что нужно обновлять только иконки сумона. Возможно лишь визуальный баг происходит.

  • Upvote 1

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


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

Явного ничего не вижу, но только одно предположение. _actor.updateEffectIcons(); - я так понимаю, что обновляем иконки еффектов саммонера, а не сумона. Хоть я и не вижу метода обновления, но смутные сомнения, что нужно обновлять только иконки сумона. Возможно лишь визуальный баг происходит.

 

а там особо и нечего смотреть :D

 

public void updateEffectIcons()
{
}

 

 

тут косяк чуть в другом я думаю. Ты подкинул мне мыслишку, за что низкий поклон :)

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

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


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

Нет, идея не сработала. И, плюс баг не визуальный :D Апдейт иконок стаскивает бафф вместе с его эффектами.

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


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

попробуйте взять за основу скилл Кража Божественности у курицы...

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

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


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

попробуйте взять за основу скилл Кража Божественности у курицы...

 

Сейчас суть используется та же самая.

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


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

Заморочился с перекидыванием баффа на призываемых суммонов.

 

На первой ветке работает идеально.

 

Суть в том, что при призыве суммонов, должен передаваться бафф суммонера, но, баффы, странным образом, не только не ложаться на суммонов, но еще и снимается весь бафф с суммонера.

 

по коду:

@Override
protected void onSpawn()
{
super.onSpawn();
_spawnAnimation = 0;
Player owner = getPlayer();
Party party = owner.getParty();
if (party != null)
{
party.broadcastToPartyMembers(owner, new ExPartyPetWindowAdd(this));
}
if (owner.isInOlympiadMode())
{
getEffectList().stopAllEffects();
}
if (owner.getEffectList().getEffectByStackType("ServitorShare") != null)
{
final Creature SummonEffect = this;
ThreadPoolManager.getInstance().execute(new RunnableImpl()
{
@Override
public void runImpl()
{
    final Player owner = getPlayer();
    final Skill skl = owner.getEffectList().getEffectByStackType("ServitorShare").getSkill();
    long currenttime = owner.getEffectList().getEffectByStackType("ServitorShare").getTime();
    long duration = owner.getEffectList().getEffectByStackType("ServitorShare").getDuration();
    for(EffectTemplate et : skl.getEffectTemplates())
    {
    if(et == null || et.getEffectType() != EffectType.ServitorShare)
    {
    continue;
    }
    Env env = new Env(owner,SummonEffect,skl);
    final Effect effect = et.getEffect(env);
    if(effect == null)
    {
    continue;
    }
    effect.setCount(1);
    effect.setPeriod(duration - currenttime);
    effect.schedule();
    }
}
});
}
getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE);
transferOwnerBuffs(owner);
}

 

где transferOwnerBuffs(owner); передает бафф хозяина суммонеру:

 

public void transferOwnerBuffs(Player _owner)
{
List<Effect> effects = _owner.getEffectList().getAllEffects();
for(Effect ef : effects)
{
getEffectList().addEffect(ef);
}
}

 

И до кучи метод добавления эффекта:

 

public void addEffect(Effect effect)
{
double hp = _actor.getCurrentHp();
double mp = _actor.getCurrentMp();
double cp = _actor.getCurrentCp();

boolean add = false;
lock.lock();
try
{
if (_effects == null)
{
_effects = new CopyOnWriteArrayList<>();
}
if (effect.getStackType().contains(EffectTemplate.NO_STACK))
{
for (Effect e : _effects)
{
    if (!e.isInUse())
    {
    continue;
    }
    if (e.getStackType().contains(EffectTemplate.NO_STACK) && (e.getSkill().getId() == effect.getSkill().getId()) && (e.getEffectType() == effect.getEffectType()))
    {
    if (effect.getTimeLeft() > e.getTimeLeft())
    {
    e.exit();
    }
    else
    {
    return;
    }
    }
}
}
else
{
for (Effect e : _effects)
{
    if (!e.isInUse())
    {
    continue;
    }
    if (!checkStackType(e.getTemplate(), effect.getTemplate()))
    {
    continue;
    }
    if ((e.getSkill().getId() == effect.getSkill().getId()) && (e.getEffectType() != effect.getEffectType()))
    {
    break;
    }
    if (e.getStackOrder() == -1)
    {
    return;
    }
    if (!e.maybeScheduleNext(effect))
    {
    return;
    }
}
}
checkSlotLimit(effect);
add = _effects.add(effect);
if (add)
{
effect.setInUse(true);
}
}
finally
{
lock.unlock();
}
if (!add)
{
return;
}
effect.start();
for (FuncTemplate ft : effect.getTemplate().getAttachedFuncs())
{
if (ft._stat == Stats.MAX_HP)
{
_actor.setCurrentHp(hp, false);
}
else if (ft._stat == Stats.MAX_MP)
{
_actor.setCurrentMp(mp);
}
else if (ft._stat == Stats.MAX_CP)
{
_actor.setCurrentCp(cp);
}
}
_actor.updateStats();
_actor.updateEffectIcons();
}

 

В чём ошибка?

Еду домой с учебы помогу.

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


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

Делай по типу канцела у сб :\

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


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

Делай по типу канцела у сб :\

 

Для невнимательных:

 

попробуйте взять за основу скилл Кража Божественности у курицы...

Сейчас суть используется та же самая.

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


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

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

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

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

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

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

Войти

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

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

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

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

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