namespace BP
{
	namespace Controller
	{
		const int CHAR_PARTICLE_START_ID = 800;
		class WorldChar : BP::ScriptActor
		{
			float offset;
			kVec3 origin;
			kVec3 originOffset;
			kParticle@ particle;
			kActor@ target;
			bool isRemoved = false;
			//------------------------------------------------------------------------------------------------------------------------
			WorldChar(kActor@ actor)
			{
				super(@actor);
			}
			//------------------------------------------------------------------------------------------------------------------------
			~WorldChar()
			{
				if (@particle != null && !particle.IsStale())
				{
					particle.Remove();
				}
			}
			//------------------------------------------------------------------------------------------------------------------------
			void BP_OnSerialize(kDict dict) override
			{
				SERIALIZE_FLOAT(offset);
				SERIALIZE_VECTOR(origin);
				SERIALIZE_VECTOR(originOffset);
				SERIALIZE_BOOL(isRemoved);
			}
			//------------------------------------------------------------------------------------------------------------------------
			void BP_OnDeserialize(kDict& in dict) override
			{
				DESERIALIZE_FLOAT(offset);
				DESERIALIZE_VECTOR(origin);
				DESERIALIZE_VECTOR(originOffset);
				DESERIALIZE_BOOL(isRemoved);
			}
			//------------------------------------------------------------------------------------------------------------------------
			void BP_OnDeserializeStart() override
			{
				if (self.GetTarget() !is null)
				{
					@particle = self.GetTarget().CastToParticle();
				}
				// @target = particle.GetTarget();
			}
			//------------------------------------------------------------------------------------------------------------------------
			void BP_OnTrigger(kActor@ pInstigator, const int msg) override
			{
				switch (self.TriggerMessageID())
				{
					case TRIGGER_MSG_SPAWN:
					{
						int charValue = CHAR_PARTICLE_START_ID + BP::Trigger::argInts[0];
						//kStr text = BP::Trigger::argStrings[0];
						origin = BP::Trigger::argVectors[0];
						originOffset = BP::Trigger::argVectors[1];
						offset = BP::Trigger::argFloats[0];
						@target = @BP::Trigger::argActors[0];
						origin += originOffset;
						//@particle = BP::Spawn::Particle("particles/BP/char/" + text + ".particle", @self, origin);
						@particle = BP::Spawn::Particle(charValue, @self);
						if (@particle == null)
						{
							DebugError("[BP::Controller::WorldChar::OnTrigger] Spawning particle " + charValue + " returned null");
							self.Remove();
						}
						else
						{
							particle.Origin() = origin;
						}
						self.SetTarget(@particle);
						//@BP::Trigger::scriptResult = @this;
						// particle.SetTarget(@target);
						break;
					}
				}
			}
			//------------------------------------------------------------------------------------------------------------------------
			void BP_OnTick() override
			{
				if (@particle == null || particle.IsStale())
				{
					isRemoved = true;
					self.Remove();
					return;
				}
				
				if (@target != null)
				{
					origin = target.Origin() + originOffset;
				}

				kVec3 localDir = kVec3(1, 0, 0) * (kVec3(origin.x, origin.y, BP::LocalPlayer::Actor.Origin().z) - BP::LocalPlayer::Actor.Origin()).ToQuat();
				particle.Origin() = origin + localDir * offset;
			}
			//------------------------------------------------------------------------------------------------------------------------
		};
	}
}
