void sensor_support_think( gentity_t *self )
{
	if(!self->enabled)
	{
		self->nextthink = level.time + SENSOR_POLL_PERIOD * 5;
		return;
	}

	switch (self->conditions.team) {
		case TEAM_HUMANS:
			self->powered = G_FindPower( self, qfalse );
			break;
		case TEAM_ALIENS:
			self->powered = G_FindCreep( self );
			break;
		case TEAM_ALL:
			self->powered = G_FindPower( self, qfalse );
			if(!self->powered)
				self->powered = G_FindCreep( self );
			break;
		default:
			G_Printf(S_ERROR "missing team field for %s\n", etos( self ));
			G_FreeEntity( self );
			break;
	}

	if(self->powered)
		G_FireEntity( self, self->powerSource );

	self->nextthink = level.time + SENSOR_POLL_PERIOD;
}
void sensor_creep_think( gentity_t *self )
{
	if(!self->enabled)
	{
		self->nextthink = level.time + SENSOR_POLL_PERIOD * 5;
		return;
	}

	self->powered = G_FindCreep( self );

	if(self->powered)
		G_FireEntity( self, self->powerSource );

	self->nextthink = level.time + SENSOR_POLL_PERIOD;
}
void AlienBuildableComponent::Think(int timeDelta) {
	// TODO: Port gentity_t.powered.
	entity.oldEnt->powered = (G_ActiveOvermind() != nullptr);

	// Suicide if creep is gone.
	if (BG_Buildable(entity.oldEnt->s.modelindex)->creepTest && !G_FindCreep(entity.oldEnt)) {
		G_Kill(entity.oldEnt, entity.oldEnt->powerSource ? &g_entities[entity.oldEnt->powerSource->killedBy] : nullptr, MOD_NOCREEP);
	}

	// TODO: Find an elegant way to access per-buildable configuration.
	float creepSize = (float)BG_Buildable((buildable_t)entity.oldEnt->s.modelindex)->creepSize;

	// Slow close humans.
	ForEntities<HumanClassComponent>([&] (Entity& other, HumanClassComponent& humanClassComponent) {
		// TODO: Add LocationComponent.
		if (G_Distance(entity.oldEnt, other.oldEnt) > creepSize) return;

		// TODO: Send (Creep)Slow message instead.
		if (other.oldEnt->flags & FL_NOTARGET) return;
		if (other.oldEnt->client->ps.groundEntityNum == ENTITYNUM_NONE) return;
		other.oldEnt->client->ps.stats[STAT_STATE] |= SS_CREEPSLOWED;
		other.oldEnt->client->lastCreepSlowTime = level.time;
	});
}