void CItemState::TryInterrupt(CBattleEntity * PTarget) { // todo: interrupt on being hit if (PTarget) PTarget = m_PEntity->IsValidTarget(PTarget->targid, m_PItem->getValidTarget(), m_errorMsg); else PTarget = m_PEntity->IsValidTarget(m_targid, m_PItem->getValidTarget(), m_errorMsg); uint16 msg = 445; // you cannot use items at this time if (HasMoved() || m_PEntity->StatusEffectContainer->HasPreventActionEffect()) { m_interrupted = true; } else if (battleutils::IsParalyzed(m_PEntity)) { msg = MSGBASIC_IS_PARALYZED; m_interrupted = true; } else if (!PTarget) { m_interrupted = true; } else if (battleutils::IsIntimidated(m_PEntity, static_cast<CBattleEntity*>(PTarget))) { msg = MSGBASIC_IS_INTIMIDATED; m_interrupted = true; } if (m_interrupted && !m_errorMsg) m_errorMsg = std::make_unique<CMessageBasicPacket>(m_PEntity, m_PEntity, m_PItem->getID(), 0, msg); }
bool CMagicState::Update(time_point tick) { if (tick > GetEntryTime() + m_castTime && !IsCompleted()) { m_interrupted = false; auto PTarget = m_PEntity->IsValidTarget(m_targid, m_PSpell->getValidTarget(), m_errorMsg); MSGBASIC_ID msg = MSGBASIC_IS_INTERRUPTED; action_t action; if (HasMoved() || !CanCastSpell(PTarget)) { m_interrupted = true; } else if (battleutils::IsParalyzed(m_PEntity)) { msg = MSGBASIC_IS_PARALYZED; m_interrupted = true; } else if (battleutils::IsIntimidated(m_PEntity, static_cast<CBattleEntity*>(PTarget))) { msg = MSGBASIC_IS_INTIMIDATED; m_interrupted = true; } if (m_interrupted) { m_PEntity->OnCastInterrupted(*this, action, msg); } else { m_PEntity->OnCastFinished(*this,action); } m_PEntity->PAI->EventHandler.triggerListener("MAGIC_USE", m_PEntity, PTarget, m_PSpell.get(), &action); m_PEntity->loc.zone->PushPacket(m_PEntity, CHAR_INRANGE_SELF, new CActionPacket(action)); Complete(); } else if (IsCompleted() && tick > GetEntryTime() + m_castTime + std::chrono::milliseconds(m_PSpell->getAnimationTime())) { m_PEntity->PAI->EventHandler.triggerListener("MAGIC_STATE_EXIT", m_PEntity, m_PSpell.get()); return true; } return false; }
bool CMagicState::CheckInterrupt() { if(m_interruptSpell) { PushMessage(MSGBASIC_IS_INTERRUPTED); return true; } if(!m_PTargetFind->isWithinRange(&m_PTarget->loc.p, m_maxFinishDistance)) { PushError(MSGBASIC_OUT_OF_RANGE_UNABLE_CAST, m_PSpell->getID()); return true; } // check if in same place if(m_PEntity->objtype == TYPE_PC && HasMoved()) { PushError(MSGBASIC_IS_INTERRUPTED, m_PSpell->getID()); return true; } if(!ValidCast(m_PSpell, m_PTarget)) { return true; } if(battleutils::IsIntimidated(m_PEntity, m_PTarget)) { PushMessage(MSGBASIC_IS_INTIMIDATED); return true; } if(battleutils::IsParalyzed(m_PEntity)) { PushMessage(MSGBASIC_IS_PARALYZED); return true; } return false; }
int FindMotion(CParam *params, int mb_threshold, int pixel_threshold) { static int call_time = 0; int j,i; int counter = 0; global_mb_threshold = mb_threshold; global_pixel_threshold = pixel_threshold; for(j = 0; j < Global.mbr; j++) { for(i = 0; i < Global.mbc; i++) { *(params->EncodeThisBlock + j*Global.mbc + i) = HasMoved(call_time, params->data, params->recon, i,j); counter += *(params->EncodeThisBlock +j*Global.mbc + i); } } call_time = (call_time + 1) % 16; return counter; }