we shooting
This commit is contained in:
@@ -93,7 +93,17 @@ namespace BT_Action
|
||||
}
|
||||
|
||||
BT::State EnableSpin(Blackboard* blackboardPtr) {
|
||||
IExamInterface* interfacePtr{};
|
||||
SteeringPlugin_Output steering{};
|
||||
|
||||
blackboardPtr->GetData("Interface", interfacePtr);
|
||||
blackboardPtr->GetData("Steering", steering);
|
||||
|
||||
steering.AutoOrient = true;
|
||||
steering.AngularVelocity = interfacePtr->Agent_GetInfo().MaxAngularSpeed;
|
||||
|
||||
blackboardPtr->ChangeData("Spin", true);
|
||||
blackboardPtr->ChangeData("Steering", steering);
|
||||
|
||||
return BT::State::Success;
|
||||
}
|
||||
@@ -104,6 +114,7 @@ namespace BT_Action
|
||||
return BT::State::Success;
|
||||
}
|
||||
|
||||
|
||||
BT::State FindClosestEdge(Blackboard* blackboardPtr, int degree) {
|
||||
IExamInterface* interfacePtr{};
|
||||
blackboardPtr->GetData("Interface", interfacePtr);
|
||||
@@ -138,6 +149,106 @@ namespace BT_Action
|
||||
return BT::State::Success;
|
||||
}
|
||||
|
||||
BT::State SetZombieTarget(Blackboard* blackboardPtr) {
|
||||
IExamInterface* interfacePtr{};
|
||||
blackboardPtr->GetData("Interface", interfacePtr);
|
||||
|
||||
if (interfacePtr->GetEnemiesInFOV().capacity() == 0) {
|
||||
return BT::State::Failure;
|
||||
}
|
||||
|
||||
EnemyInfo zombieInfo{};
|
||||
float closestZombie{ FLT_MAX };
|
||||
|
||||
for (const auto zombie : interfacePtr->GetEnemiesInFOV()) {
|
||||
const float distance{ interfacePtr->Agent_GetInfo().Position.DistanceSquared(zombie.Location) };
|
||||
|
||||
if (closestZombie < distance)
|
||||
continue;
|
||||
|
||||
closestZombie = distance;
|
||||
zombieInfo = zombie;
|
||||
}
|
||||
|
||||
blackboardPtr->ChangeData("TargetZombie", zombieInfo);
|
||||
|
||||
return BT::State::Success;
|
||||
}
|
||||
|
||||
BT::State AvoidingZombie(Blackboard* blackboardPtr) {
|
||||
IExamInterface* interfacePtr{};
|
||||
SteeringPlugin_Output steering{};
|
||||
|
||||
blackboardPtr->GetData("Interface", interfacePtr);
|
||||
blackboardPtr->GetData("Steering", steering);
|
||||
|
||||
Elite::Vector2 evadeDirection{};
|
||||
|
||||
for (auto zombie : interfacePtr->GetEnemiesInFOV()) {
|
||||
Elite::Vector2 currentPos{ interfacePtr->Agent_GetInfo().Position };
|
||||
Elite::Vector2 targetPos{ zombie.Location };
|
||||
Elite::Vector2 goingAwayVec{ currentPos - targetPos };
|
||||
float distance = goingAwayVec.MagnitudeSquared();
|
||||
|
||||
evadeDirection += goingAwayVec / distance;
|
||||
}
|
||||
|
||||
steering.LinearVelocity = evadeDirection.GetNormalized() * interfacePtr->Agent_GetInfo().MaxLinearSpeed;
|
||||
|
||||
blackboardPtr->ChangeData("Steering", steering);
|
||||
|
||||
return BT::State::Success;
|
||||
}
|
||||
|
||||
BT::State RotateToZombie(Blackboard* blackboardPtr) {
|
||||
IExamInterface* interfacePtr{};
|
||||
EnemyInfo zombieInfo{};
|
||||
SteeringPlugin_Output steering{};
|
||||
|
||||
blackboardPtr->GetData("Interface", interfacePtr);
|
||||
blackboardPtr->GetData("TargetZombie", zombieInfo);
|
||||
blackboardPtr->GetData("Steering", steering);
|
||||
|
||||
const float maxAngularVelocity{ interfacePtr->Agent_GetInfo().MaxAngularSpeed };
|
||||
const float targetAngle{ VectorToOrientation((zombieInfo.Location - interfacePtr->Agent_GetInfo().Position).GetNormalized()) };
|
||||
const float angleDiff{ targetAngle - interfacePtr->Agent_GetInfo().Orientation };
|
||||
|
||||
steering.AngularVelocity = angleDiff * maxAngularVelocity;
|
||||
|
||||
blackboardPtr->ChangeData("Steering", steering);
|
||||
blackboardPtr->ChangeData("angleDiff", angleDiff);
|
||||
|
||||
return BT::State::Success;
|
||||
}
|
||||
|
||||
BT::State ReadyToShoot(Blackboard* blackboardPtr, float minAngleDiff) {
|
||||
float angleDiff{};
|
||||
|
||||
blackboardPtr->GetData("angleDiff", angleDiff);
|
||||
|
||||
return (std::abs(angleDiff) < minAngleDiff) ? BT::State::Success : BT::State::Failure;
|
||||
}
|
||||
|
||||
BT::State Shoot(Blackboard* blackboardPtr, eItemType type) {
|
||||
IExamInterface* interfacePtr{};
|
||||
Thinker* thinkerPtr{};
|
||||
|
||||
blackboardPtr->GetData("Interface", interfacePtr);
|
||||
blackboardPtr->GetData("Brain", thinkerPtr);
|
||||
|
||||
const auto item = thinkerPtr->FindLeastValueItem(type);
|
||||
|
||||
if (item->ItemInfo.Value <= 0)
|
||||
return BT::State::Failure;
|
||||
|
||||
if (interfacePtr->Inventory_UseItem(item->invIndex)) {
|
||||
--item->ItemInfo.Value;
|
||||
return BT::State::Success;
|
||||
}
|
||||
|
||||
return BT::State::Failure;
|
||||
}
|
||||
|
||||
BT::State SetItemAsTarget(Blackboard* blackboardPtr) {
|
||||
IExamInterface* interfacePtr{};
|
||||
blackboardPtr->GetData("Interface", interfacePtr);
|
||||
@@ -150,12 +261,12 @@ namespace BT_Action
|
||||
float closestItem{ FLT_MAX };
|
||||
|
||||
for (const auto item : interfacePtr->GetItemsInFOV()) {
|
||||
const float itemDistance{ interfacePtr->Agent_GetInfo().Position.DistanceSquared(item.Location) };
|
||||
const float distance{ interfacePtr->Agent_GetInfo().Position.DistanceSquared(item.Location) };
|
||||
|
||||
if (closestItem < itemDistance)
|
||||
if (closestItem < distance)
|
||||
continue;
|
||||
|
||||
closestItem = itemDistance;
|
||||
closestItem = distance;
|
||||
targetItem = item;
|
||||
}
|
||||
|
||||
@@ -304,6 +415,11 @@ namespace BT_Action
|
||||
const Elite::Vector2 pointOnCircle{ playerPos.x + searchRadius * std::cosf(TO_RAD(i)), playerPos.y + searchRadius * std::sinf(TO_RAD(i)) };
|
||||
const Elite::Vector2 target = interfacePtr->NavMesh_GetClosestPathPoint(pointOnCircle);
|
||||
|
||||
|
||||
if (target == Elite::Vector2(400, 400)) {
|
||||
std::cout << pointOnCircle << std::endl;
|
||||
}
|
||||
|
||||
if (pointOnCircle != target) {
|
||||
constexpr float houseOffset{ 5.f };
|
||||
if (thinkerPtr->CheckIfTargetIsExplored(target, houseOffset))
|
||||
@@ -319,8 +435,7 @@ namespace BT_Action
|
||||
}
|
||||
|
||||
if (finalTarget == Elite::Vector2{}) {
|
||||
finalTarget = Elite::Vector2(randNumRange(-searchRadius, searchRadius),
|
||||
randNumRange(-searchRadius, searchRadius));
|
||||
return BT::State::Failure;
|
||||
}
|
||||
|
||||
blackboardPtr->ChangeData("Target", finalTarget);
|
||||
@@ -328,6 +443,19 @@ namespace BT_Action
|
||||
return BT::State::Success;
|
||||
}
|
||||
|
||||
BT::State FindRandomLocation(Blackboard* blackboardPtr, float randomRadius) {
|
||||
IExamInterface* interfacePtr{};
|
||||
blackboardPtr->GetData("Interface", interfacePtr);
|
||||
|
||||
const Elite::Vector2 playerPos{ interfacePtr->Agent_GetInfo().Position };
|
||||
Elite::Vector2 target = Elite::Vector2(playerPos.x + randNumRange(-randomRadius, randomRadius),
|
||||
playerPos.y + randNumRange(-randomRadius, randomRadius));
|
||||
|
||||
blackboardPtr->ChangeData("Target", target);
|
||||
|
||||
return BT::State::Success;
|
||||
}
|
||||
|
||||
BT::State GetHouseAsTarget(Blackboard* blackboardPtr, float maxTravelDistance) {
|
||||
IExamInterface* interfacePtr{};
|
||||
Thinker* thinkerPtr{};
|
||||
@@ -418,6 +546,29 @@ namespace BT_Condition
|
||||
return false;
|
||||
}
|
||||
|
||||
bool SeeZombie(Blackboard* blackboardPtr) {
|
||||
IExamInterface* interfacePtr{};
|
||||
blackboardPtr->GetData("Interface", interfacePtr);
|
||||
|
||||
return interfacePtr->GetEnemiesInFOV().capacity() > 0;
|
||||
}
|
||||
|
||||
bool HasWeapon(Blackboard* blackboardPtr) {
|
||||
return ItemInInv(blackboardPtr, eItemType::SHOTGUN) || ItemInInv(blackboardPtr, eItemType::PISTOL);
|
||||
}
|
||||
|
||||
bool InRange(Blackboard* blackboardPtr, float maxRange) {
|
||||
IExamInterface* interfacePtr{};
|
||||
EnemyInfo zombieInfo{};
|
||||
|
||||
blackboardPtr->GetData("Interface", interfacePtr);
|
||||
blackboardPtr->GetData("TargetZombie", zombieInfo);
|
||||
|
||||
const float dist2{ (zombieInfo.Location - interfacePtr->Agent_GetInfo().Position).MagnitudeSquared() };
|
||||
|
||||
return dist2 <= maxRange * maxRange;
|
||||
}
|
||||
|
||||
bool SeePurgeZone(Blackboard* blackboardPtr) {
|
||||
IExamInterface* interfacePtr{};
|
||||
blackboardPtr->GetData("Interface", interfacePtr);
|
||||
|
||||
Reference in New Issue
Block a user