GorDeveloper 356 Опубликовано 27 ноября, 2013 (изменено) Заморочился с перекидыванием баффа на призываемых суммонов. На первой ветке работает идеально. Суть в том, что при призыве суммонов, должен передаваться бафф суммонера, но, баффы, странным образом, не только не ложаться на суммонов, но еще и снимается весь бафф с суммонера. по коду: @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(); } В чём ошибка? Изменено 27 ноября, 2013 пользователем AwakenDev Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Naik 419 Опубликовано 27 ноября, 2013 (изменено) Косяк именно с методом transferOwnerBuffs? Если его закоментить, то с саммонера не будут слетать бафы? Изменено 27 ноября, 2013 пользователем Naik 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
GorDeveloper 356 Опубликовано 27 ноября, 2013 Если его убрать, то не будут слетать. Но и на суммона не ложаться. До кучи getAllEffects private List<Effect> _effects; public List<Effect> getAllEffects() { if (isEmpty()) { return Collections.emptyList(); } return new ArrayList<>(_effects); } Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Naik 419 Опубликовано 27 ноября, 2013 Явного ничего не вижу, но только одно предположение. _actor.updateEffectIcons(); - я так понимаю, что обновляем иконки еффектов саммонера, а не сумона. Хоть я и не вижу метода обновления, но смутные сомнения, что нужно обновлять только иконки сумона. Возможно лишь визуальный баг происходит. 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
GorDeveloper 356 Опубликовано 27 ноября, 2013 (изменено) Явного ничего не вижу, но только одно предположение. _actor.updateEffectIcons(); - я так понимаю, что обновляем иконки еффектов саммонера, а не сумона. Хоть я и не вижу метода обновления, но смутные сомнения, что нужно обновлять только иконки сумона. Возможно лишь визуальный баг происходит. а там особо и нечего смотреть public void updateEffectIcons() { } тут косяк чуть в другом я думаю. Ты подкинул мне мыслишку, за что низкий поклон Изменено 27 ноября, 2013 пользователем AwakenDev Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
GorDeveloper 356 Опубликовано 27 ноября, 2013 Нет, идея не сработала. И, плюс баг не визуальный Апдейт иконок стаскивает бафф вместе с его эффектами. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
VaskoDaGama 253 Опубликовано 27 ноября, 2013 (изменено) попробуйте взять за основу скилл Кража Божественности у курицы... Изменено 27 ноября, 2013 пользователем VaskoDaGama Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
GorDeveloper 356 Опубликовано 27 ноября, 2013 попробуйте взять за основу скилл Кража Божественности у курицы... Сейчас суть используется та же самая. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
gvb 666 Опубликовано 27 ноября, 2013 Заморочился с перекидыванием баффа на призываемых суммонов. На первой ветке работает идеально. Суть в том, что при призыве суммонов, должен передаваться бафф суммонера, но, баффы, странным образом, не только не ложаться на суммонов, но еще и снимается весь бафф с суммонера. по коду: @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(); } В чём ошибка? Еду домой с учебы помогу. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Quo 12 Опубликовано 27 ноября, 2013 Делай по типу канцела у сб :\ Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
GorDeveloper 356 Опубликовано 27 ноября, 2013 Делай по типу канцела у сб :\ Для невнимательных: попробуйте взять за основу скилл Кража Божественности у курицы... Сейчас суть используется та же самая. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
GorDeveloper 356 Опубликовано 27 ноября, 2013 Разобрано, тему close) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты