void SpellShell::timeout() { SpellItem* spell; QValueList<SpellItem*>::Iterator it = m_spellList.begin(); while (it != m_spellList.end()) { spell = *it; int d = spell->duration() - pSEQPrefs->getPrefInt("SpellTimer", "SpellList", 6); if (d > -6) { spell->setDuration(d); emit changeSpell(spell); it++; } else { seqInfo("SpellItem '%s' finished.", (*it)->spellName().latin1()); if (m_lastPlayerSpell == spell) m_lastPlayerSpell = 0; emit delSpell(spell); it = m_spellList.remove(it); delete spell; } } if (m_spellList.count() == 0) m_timer->stop(); }
void SpellShell::selfFinishSpellCast(const memSpellStruct *b) { if (b->param2 != 3) return; printf("selfFinishSpellCast - id=%d, by=%d\n", b->spellId, b->spawnId); SpellItem *item = FindSpell(b->spellId, m_player->getPlayerID(), b->spawnId); if (item) { struct spellInfoStruct *info = spell_info(b->spellId); item->setDuration(info->duration); } }
void SpellShell::buff(const uint8_t* data, size_t, uint8_t dir) { // we only care about the server if (dir == DIR_Client) return; const buffStruct* b = (const buffStruct*)data; // if this is the second server packet then ignore it if (b->spellid == 0xffffffff) return; #ifdef DIAG_SPELLSHELL seqDebug("Changing buff - id=%d from spawn=%d", b->spellid, b->spawnid); #endif // DIAG_SPELLSHELL const Spell* spell = m_spells->spell(b->spellid); // find the spell item SpellItem* item; const Item* s; QString targetName; if (!spell || spell->targetType() != 6) { if (b->spawnid && ((s = m_spawnShell->findID(tSpawn, b->spawnid)))) targetName = s->name(); item = findSpell(b->spellid, b->spawnid, targetName); } else item = findSpell(b->spellid); if (!item) return; if (b->changetype == 0x01) // removing buff deleteSpell(item); else if (b->changetype == 0x02) { // right now we only know how to find the updated duration item->setDuration(b->duration * 6); emit changeSpell(item); } }