void CFactoryCAI::DrawCommands(void) { lineDrawer.StartPath(owner->midPos, cmdColors.start); if (owner->selfDCountdown != 0) { lineDrawer.DrawIconAtLastPos(CMD_SELFD); } if (!commandQue.empty() && (commandQue.front().id == CMD_WAIT)) { DrawWaitIcon(commandQue.front()); } CCommandQueue::iterator ci; for(ci=newUnitCommands.begin();ci!=newUnitCommands.end();++ci){ switch(ci->id){ case CMD_MOVE:{ const float3 endPos(ci->params[0],ci->params[1]+3,ci->params[2]); lineDrawer.DrawLineAndIcon(ci->id, endPos, cmdColors.move); break; } case CMD_FIGHT:{ const float3 endPos(ci->params[0],ci->params[1]+3,ci->params[2]); lineDrawer.DrawLineAndIcon(ci->id, endPos, cmdColors.fight); break; } case CMD_PATROL:{ const float3 endPos(ci->params[0],ci->params[1]+3,ci->params[2]); lineDrawer.DrawLineAndIcon(ci->id, endPos, cmdColors.patrol); break; } case CMD_ATTACK:{ if(ci->params.size()==1){ const CUnit* unit = uh->units[int(ci->params[0])]; if((unit != NULL) && isTrackable(unit)) { const float3 endPos = helper->GetUnitErrorPos(unit, owner->allyteam); lineDrawer.DrawLineAndIcon(ci->id, endPos, cmdColors.attack); } } else { const float3 endPos(ci->params[0],ci->params[1]+3,ci->params[2]); lineDrawer.DrawLineAndIcon(ci->id, endPos, cmdColors.attack); } break; } case CMD_GUARD:{ const CUnit* unit = uh->units[int(ci->params[0])]; if ((unit != NULL) && isTrackable(unit)) { const float3 endPos = helper->GetUnitErrorPos(unit, owner->allyteam); lineDrawer.DrawLineAndIcon(ci->id, endPos, cmdColors.guard); } break; } case CMD_WAIT:{ DrawWaitIcon(*ci); break; } case CMD_SELFD:{ lineDrawer.DrawIconAtLastPos(ci->id); break; } default: DrawDefaultCommand(*ci); break; } if ((ci->id < 0) && (ci->params.size() >= 3)) { BuildInfo bi; bi.def = unitDefHandler->GetUnitByID(-(ci->id)); if (ci->params.size() == 4) { bi.buildFacing = int(ci->params[3]); } bi.pos = float3(ci->params[0], ci->params[1], ci->params[2]); bi.pos = helper->Pos2BuildPos(bi); cursorIcons.AddBuildIcon(ci->id, bi.pos, owner->team, bi.buildFacing); lineDrawer.DrawLine(bi.pos, cmdColors.build); // draw metal extraction range if (bi.def->extractRange > 0) { lineDrawer.Break(bi.pos, cmdColors.build); glColor4fv(cmdColors.rangeExtract); if (bi.def->extractSquare) { glSurfaceSquare(bi.pos, bi.def->extractRange, bi.def->extractRange); } else { glSurfaceCircle(bi.pos, bi.def->extractRange, 40); } lineDrawer.Restart(); } } } lineDrawer.FinishPath(); }
void CommandDrawer::DrawFactoryCAICommands(const CFactoryCAI* cai) const { const CUnit* owner = cai->owner; const CCommandQueue& commandQue = cai->commandQue; const CCommandQueue& newUnitCommands = cai->newUnitCommands; lineDrawer.StartPath(owner->drawMidPos, cmdColors.start); if (owner->selfDCountdown != 0) { lineDrawer.DrawIconAtLastPos(CMD_SELFD); } if (!commandQue.empty() && (commandQue.front().GetID() == CMD_WAIT)) { DrawWaitIcon(commandQue.front()); } CCommandQueue::const_iterator ci; for (ci = newUnitCommands.begin(); ci != newUnitCommands.end(); ++ci) { const int& cmdID = ci->GetID(); switch (cmdID) { case CMD_MOVE: { const float3 endPos(ci->params[0], ci->params[1] + 3, ci->params[2]); lineDrawer.DrawLineAndIcon(cmdID, endPos, cmdColors.move); break; } case CMD_FIGHT: { const float3 endPos(ci->params[0], ci->params[1] + 3, ci->params[2]); lineDrawer.DrawLineAndIcon(cmdID, endPos, cmdColors.fight); break; } case CMD_PATROL: { const float3 endPos(ci->params[0], ci->params[1] + 3, ci->params[2]); lineDrawer.DrawLineAndIcon(cmdID, endPos, cmdColors.patrol); break; } case CMD_ATTACK: { if (ci->params.size() == 1) { const CUnit* unit = uh->GetUnit(ci->params[0]); if ((unit != NULL) && IsUnitTrackable(unit, owner)) { const float3& endPos = helper->GetUnitErrorPos(unit, owner->allyteam); lineDrawer.DrawLineAndIcon(cmdID, endPos, cmdColors.attack); } } else { const float x = ci->params[0]; const float z = ci->params[2]; const float y = ground->GetHeightReal(x, z, false) + 3.0f; lineDrawer.DrawLineAndIcon(cmdID, float3(x, y, z), cmdColors.attack); } break; } case CMD_GUARD: { const CUnit* unit = uh->GetUnit(ci->params[0]); if ((unit != NULL) && IsUnitTrackable(unit, owner)) { const float3& endPos = helper->GetUnitErrorPos(unit, owner->allyteam); lineDrawer.DrawLineAndIcon(cmdID, endPos, cmdColors.guard); } break; } case CMD_WAIT: { DrawWaitIcon(*ci); break; } case CMD_SELFD: { lineDrawer.DrawIconAtLastPos(cmdID); break; } default: DrawDefaultCommand(*ci, owner); break; } if ((cmdID < 0) && (ci->params.size() >= 3)) { BuildInfo bi; bi.def = unitDefHandler->GetUnitDefByID(-(cmdID)); if (ci->params.size() == 4) { bi.buildFacing = int(ci->params[3]); } bi.pos = float3(ci->params[0], ci->params[1], ci->params[2]); bi.pos = helper->Pos2BuildPos(bi, false); cursorIcons.AddBuildIcon(cmdID, bi.pos, owner->team, bi.buildFacing); lineDrawer.DrawLine(bi.pos, cmdColors.build); // draw metal extraction range if (bi.def->extractRange > 0) { lineDrawer.Break(bi.pos, cmdColors.build); glColor4fv(cmdColors.rangeExtract); if (bi.def->extractSquare) { glSurfaceSquare(bi.pos, bi.def->extractRange, bi.def->extractRange); } else { glSurfaceCircle(bi.pos, bi.def->extractRange, 40); } lineDrawer.Restart(); } } } lineDrawer.FinishPath(); }
void CBuilderCAI::DrawCommands(void) { if(uh->limitDgun && owner->unitDef->isCommander) { glColor4f(1.0f, 1.0f, 1.0f, 0.6f); glSurfaceCircle(teamHandler->Team(owner->team)->startPos, uh->dgunRadius, 40); } lineDrawer.StartPath(owner->drawMidPos, cmdColors.start); if (owner->selfDCountdown != 0) { lineDrawer.DrawIconAtLastPos(CMD_SELFD); } CCommandQueue::iterator ci; for (ci = commandQue.begin(); ci != commandQue.end(); ++ci) { switch(ci->id) { case CMD_MOVE: { const float3 endPos(ci->params[0], ci->params[1], ci->params[2]); lineDrawer.DrawLineAndIcon(ci->id, endPos, cmdColors.move); break; } case CMD_FIGHT:{ const float3 endPos(ci->params[0], ci->params[1], ci->params[2]); lineDrawer.DrawLineAndIcon(ci->id, endPos, cmdColors.fight); break; } case CMD_PATROL: { const float3 endPos(ci->params[0], ci->params[1], ci->params[2]); lineDrawer.DrawLineAndIcon(ci->id, endPos, cmdColors.patrol); break; } case CMD_GUARD: { const CUnit* unit = uh->units[int(ci->params[0])]; if((unit != NULL) && isTrackable(unit)) { const float3 endPos = helper->GetUnitErrorPos(unit, owner->allyteam); lineDrawer.DrawLineAndIcon(ci->id, endPos, cmdColors.guard); } break; } case CMD_RESTORE: { const float3 endPos(ci->params[0], ci->params[1], ci->params[2]); lineDrawer.DrawLineAndIcon(ci->id, endPos, cmdColors.restore); lineDrawer.Break(endPos, cmdColors.restore); glSurfaceCircle(endPos, ci->params[3], 20); lineDrawer.RestartSameColor(); break; } case CMD_ATTACK: case CMD_DGUN: { if (ci->params.size() == 1) { const CUnit* unit = uh->units[int(ci->params[0])]; if((unit != NULL) && isTrackable(unit)) { const float3 endPos = helper->GetUnitErrorPos(unit, owner->allyteam); lineDrawer.DrawLineAndIcon(ci->id, endPos, cmdColors.attack); } } else { const float3 endPos(ci->params[0], ci->params[1], ci->params[2]); lineDrawer.DrawLineAndIcon(ci->id, endPos, cmdColors.attack); } break; } case CMD_RECLAIM: case CMD_RESURRECT: { const float* color = (ci->id == CMD_RECLAIM) ? cmdColors.reclaim : cmdColors.resurrect; if (ci->params.size() == 4) { const float3 endPos(ci->params[0], ci->params[1], ci->params[2]); lineDrawer.DrawLineAndIcon(ci->id, endPos, color); lineDrawer.Break(endPos, color); glSurfaceCircle(endPos, ci->params[3], 20); lineDrawer.RestartSameColor(); } else { int id = (int)ci->params[0]; if (id >= MAX_UNITS) { const CFeatureSet& fset = featureHandler->GetActiveFeatures(); CFeatureSet::const_iterator it = fset.find(id - MAX_UNITS); if (it != fset.end()) { const float3 endPos = (*it)->midPos; lineDrawer.DrawLineAndIcon(ci->id, endPos, color); } } else { const CUnit* unit = uh->units[id]; if((unit != NULL) && (unit != owner) && isTrackable(unit)) { const float3 endPos = helper->GetUnitErrorPos(unit, owner->allyteam); lineDrawer.DrawLineAndIcon(ci->id, endPos, color); } } } break; } case CMD_REPAIR: case CMD_CAPTURE: { const float* color = (ci->id == CMD_REPAIR) ? cmdColors.repair : cmdColors.capture; if (ci->params.size() == 4) { const float3 endPos(ci->params[0], ci->params[1], ci->params[2]); lineDrawer.DrawLineAndIcon(ci->id, endPos, color); lineDrawer.Break(endPos, color); glSurfaceCircle(endPos, ci->params[3], 20); lineDrawer.RestartSameColor(); } else { const CUnit* unit = uh->units[int(ci->params[0])]; if((unit != NULL) && isTrackable(unit)) { const float3 endPos = helper->GetUnitErrorPos(unit, owner->allyteam); lineDrawer.DrawLineAndIcon(ci->id, endPos, color); } } break; } case CMD_LOAD_ONTO:{ const CUnit* unit = uh->units[int(ci->params[0])]; lineDrawer.DrawLineAndIcon(ci->id, unit->pos, cmdColors.load); break; } case CMD_WAIT:{ DrawWaitIcon(*ci); break; } case CMD_SELFD:{ lineDrawer.DrawIconAtLastPos(ci->id); break; } default: { DrawDefaultCommand(*ci); break; } } if (ci->id < 0) { map<int, string>::const_iterator boi = buildOptions.find(ci->id); if (boi != buildOptions.end()) { BuildInfo bi; bi.def = unitDefHandler->GetUnitByID(-(ci->id)); if (ci->params.size() == 4) { bi.buildFacing = int(ci->params[3]); } bi.pos = float3(ci->params[0], ci->params[1], ci->params[2]); bi.pos = helper->Pos2BuildPos(bi); cursorIcons.AddBuildIcon(ci->id, bi.pos, owner->team, bi.buildFacing); lineDrawer.DrawLine(bi.pos, cmdColors.build); // draw metal extraction range if (bi.def->extractRange > 0) { lineDrawer.Break(bi.pos, cmdColors.build); glColor4fv(cmdColors.rangeExtract); if (bi.def->extractSquare) { glSurfaceSquare(bi.pos, bi.def->extractRange, bi.def->extractRange); } else { glSurfaceCircle(bi.pos, bi.def->extractRange, 40); } lineDrawer.Restart(); } } } } lineDrawer.FinishPath(); }
void CommandDrawer::DrawBuilderCAICommands(const CBuilderCAI* cai) const { const CUnit* owner = cai->owner; const CCommandQueue& commandQue = cai->commandQue; lineDrawer.StartPath(owner->drawMidPos, cmdColors.start); if (owner->selfDCountdown != 0) { lineDrawer.DrawIconAtLastPos(CMD_SELFD); } CCommandQueue::const_iterator ci; for (ci = commandQue.begin(); ci != commandQue.end(); ++ci) { const int& cmdID = ci->GetID(); if (cmdID < 0) { const std::map<int, string>& buildOptions = cai->buildOptions; const std::map<int, string>::const_iterator boi = buildOptions.find(cmdID); if (boi != buildOptions.end()) { BuildInfo bi; bi.def = unitDefHandler->GetUnitDefByID(-(cmdID)); if (ci->params.size() == 4) { bi.buildFacing = int(abs(ci->params[3])) % NUM_FACINGS; } bi.pos = float3(ci->params[0], ci->params[1], ci->params[2]); bi.pos = helper->Pos2BuildPos(bi, false); cursorIcons.AddBuildIcon(cmdID, bi.pos, owner->team, bi.buildFacing); lineDrawer.DrawLine(bi.pos, cmdColors.build); // draw metal extraction range if (bi.def->extractRange > 0) { lineDrawer.Break(bi.pos, cmdColors.build); glColor4fv(cmdColors.rangeExtract); if (bi.def->extractSquare) { glSurfaceSquare(bi.pos, bi.def->extractRange, bi.def->extractRange); } else { glSurfaceCircle(bi.pos, bi.def->extractRange, 40); } lineDrawer.Restart(); } } continue; } switch (cmdID) { case CMD_MOVE: { const float3 endPos(ci->params[0], ci->params[1], ci->params[2]); lineDrawer.DrawLineAndIcon(cmdID, endPos, cmdColors.move); break; } case CMD_FIGHT:{ const float3 endPos(ci->params[0], ci->params[1], ci->params[2]); lineDrawer.DrawLineAndIcon(cmdID, endPos, cmdColors.fight); break; } case CMD_PATROL: { const float3 endPos(ci->params[0], ci->params[1], ci->params[2]); lineDrawer.DrawLineAndIcon(cmdID, endPos, cmdColors.patrol); break; } case CMD_GUARD: { const CUnit* unit = uh->GetUnit(ci->params[0]); if ((unit != NULL) && IsUnitTrackable(unit, owner)) { const float3& endPos = helper->GetUnitErrorPos(unit, owner->allyteam); lineDrawer.DrawLineAndIcon(cmdID, endPos, cmdColors.guard); } break; } case CMD_RESTORE: { const float3 endPos(ci->params[0], ci->params[1], ci->params[2]); lineDrawer.DrawLineAndIcon(cmdID, endPos, cmdColors.restore); lineDrawer.Break(endPos, cmdColors.restore); glColor4fv(cmdColors.restore); glSurfaceCircle(endPos, ci->params[3], 20); lineDrawer.RestartWithColor(cmdColors.restore); break; } case CMD_ATTACK: case CMD_MANUALFIRE: { if (ci->params.size() == 1) { const CUnit* unit = uh->GetUnit(ci->params[0]); if ((unit != NULL) && IsUnitTrackable(unit, owner)) { const float3& endPos = helper->GetUnitErrorPos(unit, owner->allyteam); lineDrawer.DrawLineAndIcon(cmdID, endPos, cmdColors.attack); } } else { const float x = ci->params[0]; const float z = ci->params[2]; const float y = ground->GetHeightReal(x, z, false) + 3.0f; lineDrawer.DrawLineAndIcon(cmdID, float3(x, y, z), cmdColors.attack); } break; } case CMD_RECLAIM: case CMD_RESURRECT: { const float* color = (cmdID == CMD_RECLAIM) ? cmdColors.reclaim : cmdColors.resurrect; if (ci->params.size() == 4) { const float3 endPos(ci->params[0], ci->params[1], ci->params[2]); lineDrawer.DrawLineAndIcon(cmdID, endPos, color); lineDrawer.Break(endPos, color); glColor4fv(color); glSurfaceCircle(endPos, ci->params[3], 20); lineDrawer.RestartWithColor(color); } else { const int signedId = (int)ci->params[0]; if (signedId < 0) { LOG_L(L_WARNING, "Trying to %s a feature or unit with id < 0 (%i), aborting.", (cmdID == CMD_RECLAIM) ? "reclaim" : "resurrect", signedId); break; } const unsigned int id = signedId; if (id >= uh->MaxUnits()) { GML_RECMUTEX_LOCK(feat); // DrawCommands CFeature* feature = featureHandler->GetFeature(id - uh->MaxUnits()); if (feature) { const float3 endPos = feature->midPos; lineDrawer.DrawLineAndIcon(cmdID, endPos, color); } } else { const CUnit* unit = uh->GetUnitUnsafe(id); if ((unit != NULL) && (unit != owner) && IsUnitTrackable(unit, owner)) { const float3& endPos = helper->GetUnitErrorPos(unit, owner->allyteam); lineDrawer.DrawLineAndIcon(cmdID, endPos, color); } } } break; } case CMD_REPAIR: case CMD_CAPTURE: { const float* color = (ci->GetID() == CMD_REPAIR) ? cmdColors.repair : cmdColors.capture; if (ci->params.size() == 4) { const float3 endPos(ci->params[0], ci->params[1], ci->params[2]); lineDrawer.DrawLineAndIcon(cmdID, endPos, color); lineDrawer.Break(endPos, color); glColor4fv(color); glSurfaceCircle(endPos, ci->params[3], 20); lineDrawer.RestartWithColor(color); } else { if (ci->params.size() >= 1) { const CUnit* unit = uh->GetUnit(ci->params[0]); if ((unit != NULL) && IsUnitTrackable(unit, owner)) { const float3& endPos = helper->GetUnitErrorPos(unit, owner->allyteam); lineDrawer.DrawLineAndIcon(cmdID, endPos, color); } } } break; } case CMD_LOAD_ONTO: { const CUnit* unit = uh->GetUnitUnsafe(ci->params[0]); lineDrawer.DrawLineAndIcon(cmdID, unit->pos, cmdColors.load); break; } case CMD_WAIT: { DrawWaitIcon(*ci); break; } case CMD_SELFD: { lineDrawer.DrawIconAtLastPos(ci->GetID()); break; } default: { DrawDefaultCommand(*ci, owner); break; } } } lineDrawer.FinishPath(); }