mirror of
				https://github.com/DarkflameUniverse/DarkflameServer.git
				synced 2025-11-04 14:42:02 +00:00 
			
		
		
		
	Merge pull request #1326 from DarkflameUniverse/use-more-tacarc-vars
fix: tacarc not using offset or checking upper/lower bounds
This commit is contained in:
		@@ -104,7 +104,7 @@ void TacArcBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitS
 | 
			
		||||
 | 
			
		||||
	const auto casterPosition = self->GetPosition();
 | 
			
		||||
 | 
			
		||||
	auto reference = self->GetPosition(); //+ m_offset;
 | 
			
		||||
	auto reference = self->GetPosition() + m_offset;
 | 
			
		||||
 | 
			
		||||
	targets.clear();
 | 
			
		||||
 | 
			
		||||
@@ -114,46 +114,34 @@ void TacArcBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitS
 | 
			
		||||
	context->FilterTargets(validTargets, this->m_ignoreFactionList, this->m_includeFactionList, this->m_targetSelf, this->m_targetEnemy, this->m_targetFriend, this->m_targetTeam);
 | 
			
		||||
 | 
			
		||||
	for (auto validTarget : validTargets) {
 | 
			
		||||
		if (targets.size() >= this->m_maxTargets) {
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (std::find(targets.begin(), targets.end(), validTarget) != targets.end()) {
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (targets.size() >= this->m_maxTargets) break;
 | 
			
		||||
		if (std::find(targets.begin(), targets.end(), validTarget) != targets.end()) continue;
 | 
			
		||||
		if (validTarget->GetIsDead()) continue;
 | 
			
		||||
 | 
			
		||||
		const auto otherPosition = validTarget->GetPosition();
 | 
			
		||||
		const auto targetPos = validTarget->GetPosition();
 | 
			
		||||
 | 
			
		||||
		const auto heightDifference = std::abs(otherPosition.y - casterPosition.y);
 | 
			
		||||
 | 
			
		||||
		/*if (otherPosition.y > reference.y && heightDifference > this->m_upperBound || otherPosition.y < reference.y && heightDifference > this->m_lowerBound)
 | 
			
		||||
		{
 | 
			
		||||
		// make sure we aren't too high or low in comparison to the targer
 | 
			
		||||
		const auto heightDifference = std::abs(reference.y - targetPos.y);
 | 
			
		||||
		if (targetPos.y > reference.y && heightDifference > this->m_upperBound || targetPos.y < reference.y && heightDifference > this->m_lowerBound)
 | 
			
		||||
			continue;
 | 
			
		||||
		}*/
 | 
			
		||||
 | 
			
		||||
		const auto forward = self->GetRotation().GetForwardVector();
 | 
			
		||||
 | 
			
		||||
		// forward is a normalized vector of where the caster is facing.
 | 
			
		||||
		// otherPosition is the position of the target.
 | 
			
		||||
		// targetPos is the position of the target.
 | 
			
		||||
		// reference is the position of the caster.
 | 
			
		||||
		// If we cast a ray forward from the caster, does it come within m_farWidth of the target?
 | 
			
		||||
 | 
			
		||||
		const auto distance = Vector3::Distance(reference, otherPosition);
 | 
			
		||||
		const auto distance = Vector3::Distance(reference, targetPos);
 | 
			
		||||
 | 
			
		||||
		if (m_method == 2) {
 | 
			
		||||
			NiPoint3 rayPoint = casterPosition + forward * distance;
 | 
			
		||||
 | 
			
		||||
			if (m_farWidth > 0 && Vector3::DistanceSquared(rayPoint, otherPosition) > this->m_farWidth * this->m_farWidth) {
 | 
			
		||||
			if (m_farWidth > 0 && Vector3::DistanceSquared(rayPoint, targetPos) > this->m_farWidth * this->m_farWidth)
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		auto normalized = (reference - otherPosition) / distance;
 | 
			
		||||
 | 
			
		||||
		auto normalized = (reference - targetPos) / distance;
 | 
			
		||||
		const float degreeAngle = std::abs(Vector3::Angle(forward, normalized) * (180 / 3.14) - 180);
 | 
			
		||||
 | 
			
		||||
		if (distance >= this->m_minRange && this->m_maxRange >= distance && degreeAngle <= 2 * this->m_angle) {
 | 
			
		||||
			targets.push_back(validTarget);
 | 
			
		||||
		}
 | 
			
		||||
@@ -167,33 +155,26 @@ void TacArcBehavior::Calculate(BehaviorContext* context, RakNet::BitStream* bitS
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
	const auto hit = !targets.empty();
 | 
			
		||||
 | 
			
		||||
	bitStream->Write(hit);
 | 
			
		||||
 | 
			
		||||
	if (this->m_checkEnv) {
 | 
			
		||||
		const auto blocked = false; // TODO
 | 
			
		||||
 | 
			
		||||
		bitStream->Write(blocked);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (hit) {
 | 
			
		||||
		if (combatAi != nullptr) {
 | 
			
		||||
			combatAi->LookAt(targets[0]->GetPosition());
 | 
			
		||||
		}
 | 
			
		||||
		if (combatAi) combatAi->LookAt(targets[0]->GetPosition());
 | 
			
		||||
 | 
			
		||||
		context->foundTarget = true; // We want to continue with this behavior
 | 
			
		||||
 | 
			
		||||
		const auto count = static_cast<uint32_t>(targets.size());
 | 
			
		||||
 | 
			
		||||
		bitStream->Write(count);
 | 
			
		||||
 | 
			
		||||
		for (auto* target : targets) {
 | 
			
		||||
			bitStream->Write(target->GetObjectID());
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for (auto* target : targets) {
 | 
			
		||||
			branch.target = target->GetObjectID();
 | 
			
		||||
 | 
			
		||||
			this->m_action->Calculate(context, bitStream, branch);
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
@@ -214,8 +195,8 @@ void TacArcBehavior::Load() {
 | 
			
		||||
		GetFloat("offset_z", 0.0f)
 | 
			
		||||
	);
 | 
			
		||||
	this->m_method = GetInt("method", 1);
 | 
			
		||||
	this->m_upperBound = GetFloat("upper_bound", 4.4f);
 | 
			
		||||
	this->m_lowerBound = GetFloat("lower_bound", 0.4f);
 | 
			
		||||
	this->m_upperBound = std::abs(GetFloat("upper_bound", 4.4f));
 | 
			
		||||
	this->m_lowerBound = std::abs(GetFloat("lower_bound", 0.4f));
 | 
			
		||||
	this->m_usePickedTarget = GetBoolean("use_picked_target", false);
 | 
			
		||||
	this->m_useTargetPostion = GetBoolean("use_target_position", false);
 | 
			
		||||
	this->m_checkEnv = GetBoolean("check_env", false);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user