本文整理汇总了C++中CUnit::AddDeathDependence方法的典型用法代码示例。如果您正苦于以下问题:C++ CUnit::AddDeathDependence方法的具体用法?C++ CUnit::AddDeathDependence怎么用?C++ CUnit::AddDeathDependence使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CUnit
的用法示例。
在下文中一共展示了CUnit::AddDeathDependence方法的9个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: StartBuild
void CFactory::StartBuild(const UnitDef* buildeeDef) {
const float3& buildPos = CalcBuildPos();
const bool blocked = groundBlockingObjectMap->GroundBlocked(buildPos, this);
// wait until buildPos is no longer blocked (eg. by a previous buildee)
//
// it might rarely be the case that a unit got stuck inside the factory
// or died right after completion and left some wreckage, but that is up
// to players to fix (we no longer broadcast BuggerOff directives, since
// those are indiscriminate and ineffective)
if (blocked)
return;
CUnit* b = unitLoader->LoadUnit(buildeeDef, buildPos, team, true, buildFacing, this);
if (!unitDef->canBeAssisted) {
b->soloBuilder = this;
b->AddDeathDependence(this, DEPENDENCE_BUILDER);
}
AddDeathDependence(b, DEPENDENCE_BUILD);
script->StartBuilding();
// set curBuildDef to NULL to indicate construction
// has started, otherwise we would keep being called
curBuild = b;
curBuildDef = NULL;
#if (PLAY_SOUNDS == 1)
if (losStatus[gu->myAllyTeam] & LOS_INLOS) {
Channels::General.PlayRandomSample(unitDef->sounds.build, buildPos);
}
#endif
}
示例2: StartBuild
bool CBuilder::StartBuild(BuildInfo& buildInfo)
{
StopBuild(false);
// logOutput.Print("start build");
buildInfo.pos=helper->Pos2BuildPos(buildInfo);
CFeature* feature;
// Pass -1 as allyteam to behave like we have maphack.
// This is needed to prevent building on top of cloaked stuff.
int canBuild=uh->TestUnitBuildSquare(buildInfo, feature, -1);
if(canBuild<2){
CUnit* u=helper->GetClosestFriendlyUnit(buildInfo.pos,5,allyteam);
if(u && u->unitDef==buildInfo.def && unitDef->canAssist){
curBuild=u;
AddDeathDependence(u);
SetBuildStanceToward(buildInfo.pos);
return true;
}
return false;
}
if(feature)
return false;
const UnitDef* unitDef = buildInfo.def;
SetBuildStanceToward(buildInfo.pos);
nextBuildType=buildInfo.def->name;
nextBuildPos=buildInfo.pos;
CUnit* b = unitLoader.LoadUnit(nextBuildType, nextBuildPos, team,
true, buildInfo.buildFacing, this);
if (mapDamage->disabled || !unitDef->levelGround || unitDef->floater ||
(unitDef->canmove && (unitDef->speed > 0.0f))) {
// skip the terraforming job.
b->terraformLeft = 0;
b->groundLevelled=true;
}
else {
tx1 = (int)max((float)0,(b->pos.x - (b->unitDef->xsize*0.5f*SQUARE_SIZE))/SQUARE_SIZE);
tx2 = min(gs->mapx,tx1+b->unitDef->xsize);
tz1 = (int)max((float)0,(b->pos.z - (b->unitDef->ysize*0.5f*SQUARE_SIZE))/SQUARE_SIZE);
tz2 = min(gs->mapy,tz1+b->unitDef->ysize);
b->terraformLeft = CalculateBuildTerraformCost(buildInfo);
b->groundLevelled=false;
terraforming=true;
terraformType=Terraform_Building;
terraformRadius=(tx2-tx1)*SQUARE_SIZE;
terraformCenter = b->pos;
}
if (!this->unitDef->canBeAssisted) {
b->soloBuilder = this;
b->AddDeathDependence(this);
}
b->lineage = this->lineage;
AddDeathDependence(b);
curBuild=b;
if (mapDamage->disabled && !(curBuild->floatOnWater)) {
/* The ground isn't going to be terraformed.
* When the building is completed, it'll 'pop'
* into the correct height for the (un-flattened)
* terrain it's on.
*
* To prevent this visual artifact, put the building
* at the 'right' height to begin with.
*
* Duplicated from CMoveType::SlowUpdate(), which
* is why we use the regular code for floating things.
*/
curBuild->pos.y=ground->GetHeight2(curBuild->pos.x,curBuild->pos.z);
curBuild->midPos.y=curBuild->pos.y+curBuild->relMidPos.y;
}
else {
float d=nextBuildPos.y-curBuild->pos.y;
curBuild->pos.y+=d;
curBuild->midPos.y+=d;
}
return true;
}
示例3: Update
//.........这里部分代码省略.........
curBuild->AddBuildPower(0, this);
} else if (adjBuildSpeed > 0 && curBuild->AddBuildPower(adjBuildSpeed, this)) {
CreateNanoParticle(curBuild->midPos, curBuild->radius * 0.5f, false);
} else {
if(!curBuild->beingBuilt && curBuild->health >= curBuild->maxHealth) {
StopBuild();
}
}
}
}
}
else if(curReclaim && f3Dist(curReclaim->pos, pos)<buildDistance+curReclaim->radius && inBuildStance){
if (scriptCloak <= 2) {
if (isCloaked) {
isCloaked = false;
eventHandler.UnitDecloaked(this);
}
curCloakTimeout = gs->frameNum + cloakTimeout;
}
if (curReclaim->AddBuildPower(-reclaimSpeed, this)) {
CreateNanoParticle(curReclaim->midPos, curReclaim->radius * 0.7f, true);
}
}
else if(curResurrect && f3Dist(curResurrect->pos, pos)<buildDistance+curResurrect->radius && inBuildStance){
const UnitDef* ud=unitDefHandler->GetUnitByName(curResurrect->createdFromUnit);
if(ud){
if ((modInfo.reclaimMethod != 1) && (curResurrect->reclaimLeft < 1)) {
// This corpse has been reclaimed a little, need to restore the resources
// before we can let the player resurrect it.
curResurrect->AddBuildPower(repairSpeed, this);
}
else {
// Corpse has been restored, begin resurrection
if (UseEnergy(ud->energyCost * resurrectSpeed / ud->buildTime * modInfo.resurrectEnergyCostFactor)) {
curResurrect->resurrectProgress+=resurrectSpeed/ud->buildTime;
CreateNanoParticle(curResurrect->midPos,curResurrect->radius*0.7f,gs->randInt()&1);
}
if(curResurrect->resurrectProgress>1){ //resurrect finished
curResurrect->UnBlock();
CUnit* u = unitLoader.LoadUnit(curResurrect->createdFromUnit, curResurrect->pos,
team, false, curResurrect->buildFacing, this);
if (!this->unitDef->canBeAssisted) {
u->soloBuilder = this;
u->AddDeathDependence(this);
}
u->health*=0.05f;
u->lineage = this->lineage;
lastResurrected=u->id;
curResurrect->resurrectProgress=0;
featureHandler->DeleteFeature(curResurrect);
StopBuild(true);
}
}
} else {
StopBuild(true);
}
}
else if(curCapture && f3Dist(curCapture->pos, pos)<buildDistance+curCapture->radius && inBuildStance){
if(curCapture->team!=team){
float captureProgressTemp = curCapture->captureProgress + 1.0f/(150+curCapture->buildTime/captureSpeed*(curCapture->health+curCapture->maxHealth)/curCapture->maxHealth*0.4f);
if (captureProgressTemp >= 1.0f) {
captureProgressTemp = 1.0f;
}
const float captureFraction = captureProgressTemp - curCapture->captureProgress;
const float energyUseScaled = curCapture->energyCost * captureFraction * modInfo.captureEnergyCostFactor;
if (!UseEnergy(energyUseScaled)) {
gs->Team(team)->energyPull += energyUseScaled;
} else {
curCapture->captureProgress = captureProgressTemp;
CreateNanoParticle(curCapture->midPos,curCapture->radius*0.7f,false);
if(curCapture->captureProgress >= 1.0f){
if (!curCapture->ChangeTeam(team, CUnit::ChangeCaptured)) {
// capture failed
ENTER_MIXED;
if (team == gu->myTeam) {
logOutput.Print("%s: Capture failed, unit type limit reached", unitDef->humanName.c_str());
logOutput.SetLastMsgPos(pos);
}
ENTER_SYNCED;
} else {
// capture succesful
int oldLineage = curCapture->lineage;
curCapture->lineage = this->lineage;
gs->Team(oldLineage)->LeftLineage(curCapture);
}
curCapture->captureProgress=0.0f;
StopBuild(true);
}
}
} else {
StopBuild(true);
}
}
}
CUnit::Update();
}
示例4: StartBuild
bool CBuilder::StartBuild(BuildInfo& buildInfo, CFeature*& feature, bool& waitstance)
{
StopBuild(false);
buildInfo.pos = helper->Pos2BuildPos(buildInfo, true);
// Pass -1 as allyteam to behave like we have maphack.
// This is needed to prevent building on top of cloaked stuff.
const int canBuild = uh->TestUnitBuildSquare(buildInfo, feature, -1, true);
if (canBuild < 2) {
// the ground is blocked at the position we want
// to build at; check if the blocking object is
// of the same type as our buildee (which means
// another builder has already started it)
// note: even if construction has already started,
// the buildee is *not* guaranteed to be the unit
// closest to us
CSolidObject* o = groundBlockingObjectMap->GroundBlocked(buildInfo.pos);
CUnit* u = NULL;
if (o != NULL) {
u = dynamic_cast<CUnit*>(o);
} else {
// <pos> might map to a non-blocking portion
// of the buildee's yardmap, fallback check
u = helper->GetClosestFriendlyUnit(buildInfo.pos, buildDistance, allyteam);
}
if (u != NULL && u->unitDef == buildInfo.def && unitDef->canAssist) {
curBuild = u;
AddDeathDependence(u);
SetBuildStanceToward(buildInfo.pos);
return true;
}
return false;
}
if (feature)
return false;
const UnitDef* unitDef = buildInfo.def;
SetBuildStanceToward(buildInfo.pos);
if (!inBuildStance) {
waitstance = true;
return false;
}
CUnit* b = unitLoader->LoadUnit(buildInfo.def, buildInfo.pos, team,
true, buildInfo.buildFacing, this);
// floating structures don't terraform the seabed
const float groundheight = ground->GetHeightReal(b->pos.x, b->pos.z);
const bool onWater = (unitDef->floater && groundheight <= 0.0f);
if (mapDamage->disabled || !unitDef->levelGround || onWater ||
(unitDef->canmove && (unitDef->speed > 0.0f))) {
// skip the terraforming job
b->terraformLeft = 0;
b->groundLevelled=true;
}
else {
tx1 = (int)max((float)0,(b->pos.x - (b->unitDef->xsize*0.5f*SQUARE_SIZE))/SQUARE_SIZE);
tx2 = min(gs->mapx,tx1+b->unitDef->xsize);
tz1 = (int)max((float)0,(b->pos.z - (b->unitDef->zsize*0.5f*SQUARE_SIZE))/SQUARE_SIZE);
tz2 = min(gs->mapy,tz1+b->unitDef->zsize);
b->terraformLeft = CalculateBuildTerraformCost(buildInfo);
b->groundLevelled= false;
terraforming = true;
terraformType = Terraform_Building;
terraformRadius = (tx2-tx1)*SQUARE_SIZE;
terraformCenter = b->pos;
}
if (!this->unitDef->canBeAssisted) {
b->soloBuilder = this;
b->AddDeathDependence(this);
}
AddDeathDependence(b);
curBuild=b;
/* The ground isn't going to be terraformed.
* When the building is completed, it'll 'pop'
* into the correct height for the (un-flattened)
* terrain it's on.
*
* To prevent this visual artifact, put the building
* at the 'right' height to begin with.
*/
curBuild->moveType->SlowUpdate();
return true;
}
示例5: Update
//.........这里部分代码省略.........
} else {
if(!curBuild->beingBuilt && curBuild->health >= curBuild->maxHealth) {
StopBuild();
}
}
}
}
}
else if(curReclaim && f3SqDist(curReclaim->pos, pos)<Square(buildDistance+curReclaim->radius) && inBuildStance){
ScriptDecloak(true);
if (curReclaim->AddBuildPower(-reclaimSpeed, this)) {
CreateNanoParticle(curReclaim->midPos, curReclaim->radius * 0.7f, true);
}
}
else if(curResurrect && f3SqDist(curResurrect->pos, pos)<Square(buildDistance+curResurrect->radius) && inBuildStance){
const UnitDef* ud = curResurrect->udef;
if (ud) {
if ((modInfo.reclaimMethod != 1) && (curResurrect->reclaimLeft < 1)) {
// This corpse has been reclaimed a little, need to restore the resources
// before we can let the player resurrect it.
curResurrect->AddBuildPower(repairSpeed, this);
}
else {
// Corpse has been restored, begin resurrection
if (UseEnergy(ud->energyCost * resurrectSpeed / ud->buildTime * modInfo.resurrectEnergyCostFactor)) {
curResurrect->resurrectProgress+=resurrectSpeed/ud->buildTime;
CreateNanoParticle(curResurrect->midPos,curResurrect->radius*0.7f,gs->randInt()&1);
}
if (curResurrect->resurrectProgress > 1) {
// resurrect finished
curResurrect->UnBlock();
CUnit* u = unitLoader->LoadUnit(ud, curResurrect->pos,
team, false, curResurrect->buildFacing, this);
if (!this->unitDef->canBeAssisted) {
u->soloBuilder = this;
u->AddDeathDependence(this);
}
u->health *= 0.05f;
CBuilderCAI *cai = (CBuilderCAI *)commandAI;
for (CUnitSet::iterator it = cai->resurrecters.begin(); it != cai->resurrecters.end(); ++it) {
CBuilder *bld = (CBuilder *)*it;
if (bld->commandAI->commandQue.empty())
continue;
const Command& c = bld->commandAI->commandQue.front();
if (c.GetID() != CMD_RESURRECT || c.params.size() != 1)
continue;
const int cmdFeatureId = (int)c.params[0];
if (cmdFeatureId - uh->MaxUnits() == curResurrect->id && teamHandler->Ally(allyteam, bld->allyteam))
bld->lastResurrected = u->id; // all units that were rezzing shall assist the repair too
}
curResurrect->resurrectProgress=0;
featureHandler->DeleteFeature(curResurrect);
StopBuild(true);
}
}
} else {
StopBuild(true);
}
}
else if(curCapture && f3SqDist(curCapture->pos, pos)<Square(buildDistance+curCapture->radius) && inBuildStance){
if(curCapture->team!=team){
float captureProgressTemp = curCapture->captureProgress + 1.0f/(150+curCapture->buildTime/captureSpeed*(curCapture->health+curCapture->maxHealth)/curCapture->maxHealth*0.4f);
if (captureProgressTemp >= 1.0f) {
captureProgressTemp = 1.0f;
}
const float captureFraction = captureProgressTemp - curCapture->captureProgress;
const float energyUseScaled = curCapture->energyCost * captureFraction * modInfo.captureEnergyCostFactor;
if (!UseEnergy(energyUseScaled)) {
teamHandler->Team(team)->energyPull += energyUseScaled;
} else {
curCapture->captureProgress = captureProgressTemp;
CreateNanoParticle(curCapture->midPos,curCapture->radius*0.7f,false);
if(curCapture->captureProgress >= 1.0f){
if (!curCapture->ChangeTeam(team, CUnit::ChangeCaptured)) {
// capture failed
if (team == gu->myTeam) {
logOutput.Print("%s: Capture failed, unit type limit reached", unitDef->humanName.c_str());
logOutput.SetLastMsgPos(pos);
}
}
curCapture->captureProgress=0.0f;
StopBuild(true);
}
}
} else {
StopBuild(true);
}
}
}
CUnit::Update();
}
示例6: Update
void CFactory::Update()
{
if (beingBuilt) {
// factory under construction
CUnit::Update();
return;
}
if (quedBuild && !opening && !stunned) {
script->Activate();
groundBlockingObjectMap->OpenBlockingYard(this, curYardMap);
opening = true;
}
if (quedBuild && inBuildStance && !stunned) {
// start building a unit
const float3 buildPos = CalcBuildPos();
const CSolidObject* solidObj = groundBlockingObjectMap->GroundBlocked(buildPos);
if (solidObj == NULL || (dynamic_cast<const CUnit*>(solidObj) == this)) {
quedBuild = false;
CUnit* b = unitLoader.LoadUnit(nextBuild, buildPos + float3(0.01f, 0.01f, 0.01f), team,
true, buildFacing, this);
if (!unitDef->canBeAssisted) {
b->soloBuilder = this;
b->AddDeathDependence(this);
}
AddDeathDependence(b);
curBuild = b;
script->StartBuilding();
int soundIdx = unitDef->sounds.build.getRandomIdx();
if (soundIdx >= 0) {
Channels::UnitReply.PlaySample(
unitDef->sounds.build.getID(soundIdx), pos,
unitDef->sounds.build.getVolume(0));
}
} else {
helper->BuggerOff(buildPos - float3(0.01f, 0, 0.02f), radius + 8, true, true, NULL);
}
}
if (curBuild && !beingBuilt) {
if (!stunned) {
// factory not under construction and
// nanolathing unit: continue building
lastBuild = gs->frameNum;
// buildPiece is the rotating platform
const int buildPiece = GetBuildPiece();
const CMatrix44f& mat = script->GetPieceMatrix(buildPiece);
const int h = GetHeadingFromVector(mat[2], mat[10]); //! x.z, z.z
// rotate unit nanoframe with platform
curBuild->heading = (h + GetHeadingFromFacing(buildFacing)) & 65535;
const float3 buildPos = CalcBuildPos(buildPiece);
curBuild->pos = buildPos;
if (curBuild->floatOnWater) {
float waterline = ground->GetHeight(buildPos.x, buildPos.z) - curBuild->unitDef->waterline;
if (waterline > curBuild->pos.y)
curBuild->pos.y = waterline;
}
curBuild->midPos = curBuild->pos + (UpVector * curBuild->relMidPos.y);
const CCommandQueue& queue = commandAI->commandQue;
if(!queue.empty() && (queue.front().id == CMD_WAIT)) {
curBuild->AddBuildPower(0, this);
} else {
if (curBuild->AddBuildPower(buildSpeed, this)) {
CreateNanoParticle();
}
}
}
if (!curBuild->beingBuilt &&
(!unitDef->fullHealthFactory ||
(curBuild->health >= curBuild->maxHealth)))
{
if (group && curBuild->group == 0) {
curBuild->SetGroup(group);
}
bool userOrders = true;
if (curBuild->commandAI->commandQue.empty() ||
(dynamic_cast<CMobileCAI*>(curBuild->commandAI) &&
((CMobileCAI*)curBuild->commandAI)->unimportantMove)) {
userOrders = false;
AssignBuildeeOrders(curBuild);
waitCommandsAI.AddLocalUnit(curBuild, this);
}
eventHandler.UnitFromFactory(curBuild, this, userOrders);
//.........这里部分代码省略.........
示例7: StartBuild
bool CBuilder::StartBuild(BuildInfo& buildInfo, CFeature*& feature, bool& waitStance)
{
StopBuild(false);
buildInfo.pos = CGameHelper::Pos2BuildPos(buildInfo, true);
// Pass -1 as allyteam to behave like we have maphack.
// This is needed to prevent building on top of cloaked stuff.
const CGameHelper::BuildSquareStatus tbs = CGameHelper::TestUnitBuildSquare(buildInfo, feature, -1, true);
switch (tbs) {
case CGameHelper::BUILDSQUARE_OPEN:
break;
case CGameHelper::BUILDSQUARE_BLOCKED:
case CGameHelper::BUILDSQUARE_OCCUPIED: {
// the ground is blocked at the position we want
// to build at; check if the blocking object is
// of the same type as our buildee (which means
// another builder has already started it)
// note: even if construction has already started,
// the buildee is *not* guaranteed to be the unit
// closest to us
CSolidObject* o = groundBlockingObjectMap->GroundBlocked(buildInfo.pos);
CUnit* u = NULL;
if (o != NULL) {
u = dynamic_cast<CUnit*>(o);
} else {
// <pos> might map to a non-blocking portion
// of the buildee's yardmap, fallback check
u = CGameHelper::GetClosestFriendlyUnit(NULL, buildInfo.pos, buildDistance, allyteam);
}
if (u != NULL && CanAssistUnit(u, buildInfo.def)) {
curBuild = u;
AddDeathDependence(u, DEPENDENCE_BUILD);
ScriptStartBuilding(u->pos, false);
return true;
}
return false;
}
case CGameHelper::BUILDSQUARE_RECLAIMABLE:
// caller should handle this
return false;
}
if ((waitStance = !ScriptStartBuilding(buildInfo.pos, true))) {
return false;
}
const UnitDef* buildeeDef = buildInfo.def;
const UnitLoadParams buildeeParams = {buildeeDef, this, buildInfo.pos, ZeroVector, -1, team, buildInfo.buildFacing, true, false};
CUnit* buildee = unitLoader->LoadUnit(buildeeParams);
// floating structures don't terraform the seabed
const float groundheight = ground->GetHeightReal(buildee->pos.x, buildee->pos.z);
const bool onWater = (buildeeDef->floatOnWater && groundheight <= 0.0f);
if (mapDamage->disabled || !buildeeDef->levelGround || onWater ||
(buildeeDef->canmove && (buildeeDef->speed > 0.0f))) {
// skip the terraforming job
buildee->terraformLeft = 0;
buildee->groundLevelled = true;
} else {
tx1 = (int)max( 0.0f, (buildee->pos.x - (buildeeDef->xsize * 0.5f * SQUARE_SIZE)) / SQUARE_SIZE);
tx2 = min(gs->mapx, tx1 + buildeeDef->xsize );
tz1 = (int)max( 0.0f, (buildee->pos.z - (buildeeDef->zsize * 0.5f * SQUARE_SIZE)) / SQUARE_SIZE);
tz2 = min(gs->mapy, tz1 + buildeeDef->zsize );
buildee->terraformLeft = CalculateBuildTerraformCost(buildInfo);
buildee->groundLevelled = false;
terraforming = true;
terraformType = Terraform_Building;
terraformRadius = (tx2 - tx1) * SQUARE_SIZE;
terraformCenter = buildee->pos;
}
if (!this->unitDef->canBeAssisted) {
buildee->soloBuilder = this;
buildee->AddDeathDependence(this, DEPENDENCE_BUILDER);
}
AddDeathDependence(buildee, DEPENDENCE_BUILD);
curBuild = buildee;
/* The ground isn't going to be terraformed.
* When the building is completed, it'll 'pop'
* into the correct height for the (un-flattened)
* terrain it's on.
*
* To prevent this visual artifact, put the building
* at the 'right' height to begin with.
*/
curBuild->moveType->SlowUpdate();
return true;
//.........这里部分代码省略.........
示例8: Update
//.........这里部分代码省略.........
ScriptDecloak(true);
if (curReclaim->AddBuildPower(-reclaimSpeed, this)) {
CreateNanoParticle(curReclaim->midPos, curReclaim->radius * 0.7f, true, (reclaimingUnit && curReclaim->team != team));
}
}
}
else if (curResurrect != NULL && f3SqDist(curResurrect->pos, pos)<Square(buildDistance+curResurrect->radius) && inBuildStance) {
const UnitDef* ud = curResurrect->udef;
if (fCommand.GetID() == CMD_WAIT) {
StopBuild();
} else {
if (ud != NULL) {
if ((modInfo.reclaimMethod != 1) && (curResurrect->reclaimLeft < 1)) {
// This corpse has been reclaimed a little, need to restore the resources
// before we can let the player resurrect it.
curResurrect->AddBuildPower(repairSpeed, this);
} else {
// Corpse has been restored, begin resurrection
if (UseEnergy(ud->energy * resurrectSpeed / ud->buildTime * modInfo.resurrectEnergyCostFactor)) {
curResurrect->resurrectProgress += (resurrectSpeed / ud->buildTime);
CreateNanoParticle(curResurrect->midPos, curResurrect->radius * 0.7f, (gs->randInt() & 1));
}
if (curResurrect->resurrectProgress > 1) {
// resurrect finished
curResurrect->UnBlock();
UnitLoadParams resurrecteeParams = {ud, this, curResurrect->pos, ZeroVector, -1, team, curResurrect->buildFacing, false, false};
CUnit* resurrectee = unitLoader->LoadUnit(resurrecteeParams);
if (!this->unitDef->canBeAssisted) {
resurrectee->soloBuilder = this;
resurrectee->AddDeathDependence(this, DEPENDENCE_BUILDER);
}
// TODO: make configurable if this should happen
resurrectee->health *= 0.05f;
for (CUnitSet::iterator it = cai->resurrecters.begin(); it != cai->resurrecters.end(); ++it) {
CBuilder* bld = (CBuilder*) *it;
CCommandAI* bldCAI = bld->commandAI;
if (bldCAI->commandQue.empty())
continue;
Command& c = bldCAI->commandQue.front();
if (c.GetID() != CMD_RESURRECT || c.params.size() != 1)
continue;
const int cmdFeatureId = c.params[0];
if (cmdFeatureId - unitHandler->MaxUnits() == curResurrect->id && teamHandler->Ally(allyteam, bld->allyteam)) {
bld->lastResurrected = resurrectee->id; // all units that were rezzing shall assist the repair too
c.params[0] = INT_MAX / 2; // prevent FinishCommand from removing this command when the feature is deleted, since it is needed to start the repair
}
}
curResurrect->resurrectProgress = 0;
featureHandler->DeleteFeature(curResurrect);
StopBuild(true);
}
}
} else {
StopBuild(true);
示例9: Update
void CFactory::Update()
{
if (beingBuilt) {
// factory under construction
CUnit::Update();
return;
}
if (quedBuild && !opening && !stunned) {
cob->Call(COBFN_Activate);
groundBlockingObjectMap->OpenBlockingYard(this, yardMap);
opening = true;
}
if (quedBuild && inBuildStance && !stunned) {
// start building a unit
float3 buildPos = CalcBuildPos();
bool canBuild = true;
std::vector<CUnit*> units = qf->GetUnitsExact(buildPos, 16);
for (std::vector<CUnit*>::iterator ui = units.begin(); ui != units.end(); ++ui) {
if ((*ui) != this)
canBuild = false;
}
if (canBuild) {
quedBuild = false;
CUnit* b = unitLoader.LoadUnit(nextBuild, buildPos + float3(0.01f, 0.01f, 0.01f), team,
true, buildFacing, this);
b->lineage = this->lineage;
if (!unitDef->canBeAssisted) {
b->soloBuilder = this;
b->AddDeathDependence(this);
}
AddDeathDependence(b);
curBuild = b;
cob->Call("StartBuilding");
int soundIdx = unitDef->sounds.build.getRandomIdx();
if (soundIdx >= 0) {
sound->PlaySample(
unitDef->sounds.build.getID(soundIdx), pos,
unitDef->sounds.build.getVolume(0));
}
} else {
helper->BuggerOff(buildPos - float3(0.01f, 0, 0.02f), radius + 8);
}
}
if (curBuild && !beingBuilt) {
if (!stunned) {
// factory not under construction and
// nanolathing unit: continue building
lastBuild = gs->frameNum;
// buildPiece is the rotating platform
const int buildPiece = GetBuildPiece();
CMatrix44f mat = localmodel->GetPieceMatrix(buildPiece);
const int h = GetHeadingFromVector(mat[2], mat[10]);
// rotate unit nanoframe with platform
curBuild->heading = (h + GetHeadingFromFacing(buildFacing)) & 65535;
const float3 buildPos = CalcBuildPos(buildPiece);
curBuild->pos = buildPos;
if (curBuild->floatOnWater) {
curBuild->pos.y = ground->GetHeight(buildPos.x, buildPos.z);
curBuild->pos.y -= curBuild->unitDef->waterline;
}
curBuild->midPos = curBuild->pos + (UpVector * curBuild->relMidPos.y);
const CCommandQueue& queue = commandAI->commandQue;
if(!queue.empty() && (queue.front().id == CMD_WAIT)) {
curBuild->AddBuildPower(0, this);
} else {
if (curBuild->AddBuildPower(buildSpeed, this)) {
CreateNanoParticle();
}
}
}
if (!curBuild->beingBuilt &&
(!unitDef->fullHealthFactory ||
(curBuild->health >= curBuild->maxHealth)))
{
if (group && curBuild->group == 0) {
curBuild->SetGroup(group);
}
bool userOrders = true;
if (curBuild->commandAI->commandQue.empty() ||
(dynamic_cast<CMobileCAI*>(curBuild->commandAI) &&
((CMobileCAI*)curBuild->commandAI)->unimportantMove)) {
//.........这里部分代码省略.........