1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
#include "StdAfx.h"
#include "mmgr.h"
#include "MoveType.h"
#include "MoveMath/MoveMath.h"
#include "Sim/Units/Unit.h"
#include "Sim/Units/UnitDef.h"
#include <assert.h>
CR_BIND_DERIVED_INTERFACE(AMoveType, CObject);
CR_REG_METADATA(AMoveType, (
CR_MEMBER(forceTurn),
CR_MEMBER(forceTurnTo),
CR_MEMBER(owner),
CR_MEMBER(goalPos),
CR_MEMBER(maxSpeed),
CR_MEMBER(maxWantedSpeed),
CR_MEMBER(reservedPad),
CR_MEMBER(padStatus),
CR_MEMBER(repairBelowHealth),
CR_MEMBER(useHeading),
CR_ENUM_MEMBER(progressState),
CR_RESERVED(32)
));
AMoveType::AMoveType(CUnit* owner):
forceTurn(0),
forceTurnTo(0),
owner(owner),
goalPos(owner ? owner->pos : float3(0.0f, 0.0f, 0.0f)),
maxSpeed(0.2f),
maxWantedSpeed(0.2f),
reservedPad(0),
padStatus(0),
repairBelowHealth(0.3f),
useHeading(true),
progressState(Done)
{
}
AMoveType::~AMoveType(void)
{
}
void AMoveType::SetMaxSpeed(float speed)
{
assert(speed > 0);
maxSpeed = speed;
}
void AMoveType::SetWantedMaxSpeed(float speed)
{
if(speed > maxSpeed) {
maxWantedSpeed = maxSpeed;
} else if(speed < 0.001f) {
maxWantedSpeed = 0;
} else {
maxWantedSpeed = speed;
}
}
void AMoveType::ImpulseAdded(void)
{
}
void AMoveType::SlowUpdate()
{
//! note static buildings don't have any unitDef->moveData, that's why CStaticMoveType uses its own method
owner->pos.y = owner->unitDef->movedata->moveMath->yLevel(owner->pos.x, owner->pos.z);
owner->midPos.y = owner->pos.y + owner->relMidPos.y;
};
void AMoveType::LeaveTransport(void)
{
}
void AMoveType::KeepPointingTo(CUnit* unit, float distance, bool aggressive)
{
KeepPointingTo(float3(unit->pos), distance, aggressive);
}
void AMoveType::SetGoal(float3 pos)
{
goalPos = pos;
}
void AMoveType::DependentDied(CObject* o)
{
if(o == reservedPad){
reservedPad=0;
}
}
void AMoveType::ReservePad(CAirBaseHandler::LandingPad* lp)
{
AddDeathDependence(lp);
reservedPad = lp;
padStatus = 0;
SetGoal(lp->GetUnit()->pos);
}
|