void DOTHeal::HandleUpdate(StringHash eventType, VariantMap& eventData) { float timeStep = eventData[Update::P_TIMESTEP].GetFloat(); lc_->elapsedTime_ += timeStep; if (lc_->elapsedTime_ >= lc_->cooldown_) { lc_->clientExecuting_ = false; } int targetCount = targets_.Size(); for (int x = 0; x < targetCount; x++) { targets_[x]->elapsedTime_ += timeStep; if (targets_[x]->elapsedTime_ >= targets_[x]->duration_) { if (!lc_->main_->engine_->IsHeadless()) { targets_[x]->particleEndNode_->Remove(); } LCTarget* target = targets_[x]; targets_.Remove(target); delete target; x--; targetCount = targets_.Size(); break; } targets_[x]->intervalElapsedTime_ += timeStep; if (targets_[x]->intervalElapsedTime_ >= targets_[x]->interval_) { targets_[x]->intervalElapsedTime_ = 0.0f; targetSceneNode_ = targets_[x]->sceneNode_; //Get target armor. SubscribeToEvent(E_SETCLIENTARMOR, HANDLER(DOTHeal, HandleSetArmor)); VariantMap vm; vm[GetClientArmor::P_NODE] = targets_[x]->sceneNode_; SendEvent(E_GETCLIENTARMOR, vm); int damage = DOTHeal_ - targetArmor_; if (damage > 0) { vm.Clear(); vm[ModifyClientHealth::P_NODE] = targets_[x]->sceneNode_; vm[ModifyClientHealth::P_HEALTH] = damage; vm[ModifyClientHealth::P_OPERATION] = 1; vm[ModifyClientHealth::P_SENDTOSERVER] = false; SendEvent(E_MODIFYCLIENTHEALTH, vm); } } } if (!lc_->clientExecuting_ && !targets_.Size()) { UnsubscribeFromEvent(E_UPDATE); } }
void Cleanse::Exec(int clientID, float timeRamp, bool sendToServer) { LCTarget* target = new LCTarget(context_); targets_.Push(target); target->sceneNode_ = lc_->main_->GetSceneNode(clientID); target->duration_ = 5.0f; target->GetModelNodeBySceneNode(); target->GetSceneNodeClientID(); if (!lc_->main_->engine_->IsHeadless()) { target->particleEndNode_ = lc_->scene_->CreateChild(0,LOCAL); target->emitterEndFX_ = target->particleEndNode_->CreateComponent<ParticleEmitter>(LOCAL); target->emitterEndFX_->SetEffect(lc_->main_->cache_->GetResource<ParticleEffect>("Particle/cleanse.xml")); target->particleEndNode_->SetWorldScale(Vector3::ONE * 500.0f); target->emitterEndFX_->SetViewMask(1); target->particleEndNode_->CreateComponent<SoundSource3D>(LOCAL); target->modelNode_->AddChild(target->particleEndNode_); Vector3 victoria = target->modelNode_->GetPosition(); victoria.y_ += target->beeBox_.Size().y_; target->particleEndNode_->SetWorldPosition(victoria); target->emitterEndFX_->SetEmitting(true); target->particleEndNode_->GetComponent<SoundSource3D>()->Play(lc_->main_->cache_->GetResource<Sound>("Sounds/cleanse/cleanse.ogg")); VariantMap vm; vm[SoundRequest::P_NODE] = node_; vm[SoundRequest::P_SOUNDTYPE] = SOUNDTYPE_CAST; SendEvent(E_SOUNDREQUEST,vm); } target->elapsedTime_ = timeRamp; lc_->elapsedTime_ = timeRamp; VariantMap vm; vm[AnimateSceneNode::P_NODE] = node_; vm[AnimateSceneNode::P_ANIMATION] = "attack"; vm[AnimateSceneNode::P_LOOP] = false; vm[AnimateSceneNode::P_LAYER] = 1; SendEvent(E_ANIMATESCENENODE, vm); vm.Clear(); vm[CleanseStatus::P_NODE] = target->sceneNode_; SendEvent(E_CLEANSE, vm); if (sendToServer) { lc_->msg_.Clear(); lc_->msg_.WriteInt(lc_->clientID_); lc_->msg_.WriteString("Cleanse"); lc_->msg_.WriteInt(target->clientID_); lc_->msg_.WriteFloat(timeRamp); if (!lc_->isServer_) { lc_->network_->GetServerConnection()->SendMessage(MSG_LCMSG, true, true, lc_->msg_); } else { lc_->network_->BroadcastMessage(MSG_LCMSG, true, true, lc_->msg_); } } SubscribeToEvent(E_UPDATE, HANDLER(Cleanse, HandleUpdate)); }