コード例 #1
0
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);
	}
}
コード例 #2
0
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));
}