int CAICallback::HandleCommand (int commandId, void *data) { switch (commandId) { case AIHCQuerySubVersionId: return 1; // current version of Handle Command interface case AIHCAddMapPointId: net->Send(CBaseNetProtocol::Get().SendMapDrawPoint(team, (short)((AIHCAddMapPoint *)data)->pos.x, (short)((AIHCAddMapPoint *)data)->pos.z, std::string(((AIHCAddMapPoint *)data)->label))); return 1; case AIHCAddMapLineId: net->Send(CBaseNetProtocol::Get().SendMapDrawLine(team, (short)((AIHCAddMapLine *)data)->posfrom.x, (short)((AIHCAddMapLine *)data)->posfrom.z, (short)((AIHCAddMapLine *)data)->posto.x, (short)((AIHCAddMapLine *)data)->posto.z)); return 1; case AIHCRemoveMapPointId: net->Send(CBaseNetProtocol::Get().SendMapErase(team, (short)((AIHCRemoveMapPoint *)data)->pos.x, (short)((AIHCRemoveMapPoint *)data)->pos.z)); return 1; case AIHCSendStartPosId: SendStartPos(((AIHCSendStartPos *)data)->ready,((AIHCSendStartPos *)data)->pos); return 1; case AIHCGetUnitDefByIdId: { AIHCGetUnitDefById* cmdData = (AIHCGetUnitDefById*) data; cmdData->ret = GetUnitDefById(cmdData->unitDefId); return 1; } case AIHCGetWeaponDefByIdId: { AIHCGetWeaponDefById* cmdData = (AIHCGetWeaponDefById*) data; cmdData->ret = GetWeaponDefById(cmdData->weaponDefId); return 1; } case AIHCGetFeatureDefByIdId: { AIHCGetFeatureDefById* cmdData = (AIHCGetFeatureDefById*) data; cmdData->ret = GetFeatureDefById(cmdData->featureDefId); return 1; } default: return 0; } }
int CAICallback::HandleCommand(int commandId, void* data) { switch (commandId) { case AIHCQuerySubVersionId: { return 1; // current version of Handle Command interface } break; case AIHCAddMapPointId: { const AIHCAddMapPoint* cmdData = static_cast<AIHCAddMapPoint*>(data); net->Send(CBaseNetProtocol::Get().SendMapDrawPoint(team, (short)cmdData->pos.x, (short)cmdData->pos.z, std::string(cmdData->label), false)); return 1; } break; case AIHCAddMapLineId: { const AIHCAddMapLine* cmdData = static_cast<AIHCAddMapLine*>(data); net->Send(CBaseNetProtocol::Get().SendMapDrawLine(team, (short)cmdData->posfrom.x, (short)cmdData->posfrom.z, (short)cmdData->posto.x, (short)cmdData->posto.z, false)); return 1; } break; case AIHCRemoveMapPointId: { const AIHCRemoveMapPoint* cmdData = static_cast<AIHCRemoveMapPoint*>(data); net->Send(CBaseNetProtocol::Get().SendMapErase(team, (short)cmdData->pos.x, (short)cmdData->pos.z)); return 1; } break; case AIHCSendStartPosId: { const AIHCSendStartPos* cmdData = static_cast<AIHCSendStartPos*>(data); SendStartPos(cmdData->ready, cmdData->pos); return 1; } break; case AIHCGetUnitDefByIdId: { // NOTE: this command should never arrive, handled in SSkirmishAICallbackImpl return 0; } break; case AIHCGetWeaponDefByIdId: { // NOTE: this command should never arrive, handled in SSkirmishAICallbackImpl return 0; } break; case AIHCGetFeatureDefByIdId: { // NOTE: this command should never arrive, handled in SSkirmishAICallbackImpl return 0; } break; case AIHCTraceRayId: { AIHCTraceRay* cmdData = static_cast<AIHCTraceRay*>(data); if (CHECK_UNITID(cmdData->srcUID)) { const CUnit* srcUnit = unitHandler->units[cmdData->srcUID]; if (srcUnit != NULL) { CUnit* hitUnit = NULL; CFeature* hitFeature = NULL; //FIXME add COLLISION_NOFEATURE? const float realLen = TraceRay::TraceRay(cmdData->rayPos, cmdData->rayDir, cmdData->rayLen, cmdData->flags, srcUnit, hitUnit, hitFeature); if (hitUnit != NULL) { myAllyTeamId = teamHandler->AllyTeam(team); const bool isUnitVisible = unit_IsInLos(hitUnit); if (isUnitVisible) { cmdData->rayLen = realLen; cmdData->hitUID = hitUnit->id; } } } } return 1; } break; case AIHCFeatureTraceRayId: { AIHCFeatureTraceRay* cmdData = static_cast<AIHCFeatureTraceRay*>(data); if (CHECK_UNITID(cmdData->srcUID)) { const CUnit* srcUnit = unitHandler->units[cmdData->srcUID]; if (srcUnit != NULL) { CUnit* hitUnit = NULL; CFeature* hitFeature = NULL; //FIXME add COLLISION_NOENEMIES || COLLISION_NOFRIENDLIES || COLLISION_NONEUTRALS? const float realLen = TraceRay::TraceRay(cmdData->rayPos, cmdData->rayDir, cmdData->rayLen, cmdData->flags, srcUnit, hitUnit, hitFeature); if (hitFeature != NULL) { const bool isFeatureVisible = hitFeature->IsInLosForAllyTeam(teamHandler->AllyTeam(team)); if (isFeatureVisible) { cmdData->rayLen = realLen; cmdData->hitFID = hitFeature->id; } } } } return 1; } break; case AIHCPauseId: { AIHCPause* cmdData = static_cast<AIHCPause*>(data); net->Send(CBaseNetProtocol::Get().SendPause(gu->myPlayerNum, cmdData->enable)); LOG("Skirmish AI controlling team %i paused the game, reason: %s", team, cmdData->reason != NULL ? cmdData->reason : "UNSPECIFIED"); return 1; } break; case AIHCGetDataDirId: { // do nothing // this event will never end up here, as // it is handled in the C layer directly // see Clb_DataDirs_allocatePath in rts/ExternalAI/Interface/SSkirmishAICallback.h return 0; } break; case AIHCDebugDrawId: { AIHCDebugDraw* cmdData = static_cast<AIHCDebugDraw*>(data); switch (cmdData->cmdMode) { case AIHCDebugDraw::AIHC_DEBUGDRAWER_MODE_ADD_GRAPH_POINT: { debugDrawerAI->AddGraphPoint(this->team, cmdData->lineId, cmdData->x, cmdData->y); } break; case AIHCDebugDraw::AIHC_DEBUGDRAWER_MODE_DEL_GRAPH_POINTS: { debugDrawerAI->DelGraphPoints(this->team, cmdData->lineId, cmdData->numPoints); } break; case AIHCDebugDraw::AIHC_DEBUGDRAWER_MODE_SET_GRAPH_POS: { debugDrawerAI->SetGraphPos(this->team, cmdData->x, cmdData->y); } break; case AIHCDebugDraw::AIHC_DEBUGDRAWER_MODE_SET_GRAPH_SIZE: { debugDrawerAI->SetGraphSize(this->team, cmdData->w, cmdData->h); } break; case AIHCDebugDraw::AIHC_DEBUGDRAWER_MODE_SET_GRAPH_LINE_COLOR: { debugDrawerAI->SetGraphLineColor(this->team, cmdData->lineId, cmdData->color); } break; case AIHCDebugDraw::AIHC_DEBUGDRAWER_MODE_SET_GRAPH_LINE_LABEL: { debugDrawerAI->SetGraphLineLabel(this->team, cmdData->lineId, cmdData->label); } break; case AIHCDebugDraw::AIHC_DEBUGDRAWER_MODE_ADD_OVERLAY_TEXTURE: { cmdData->texHandle = debugDrawerAI->AddOverlayTexture( this->team, cmdData->texData, int(cmdData->w), // interpret as absolute width int(cmdData->h) // interpret as absolute height ); } break; case AIHCDebugDraw::AIHC_DEBUGDRAWER_MODE_UPDATE_OVERLAY_TEXTURE: { debugDrawerAI->UpdateOverlayTexture( this->team, cmdData->texHandle, cmdData->texData, int(cmdData->x), // interpret as absolute pixel col int(cmdData->y), // interpret as absolute pixel row int(cmdData->w), // interpret as absolute width int(cmdData->h) // interpret as absolute height ); } break; case AIHCDebugDraw::AIHC_DEBUGDRAWER_MODE_DEL_OVERLAY_TEXTURE: { debugDrawerAI->DelOverlayTexture(this->team, cmdData->texHandle); } break; case AIHCDebugDraw::AIHC_DEBUGDRAWER_MODE_SET_OVERLAY_TEXTURE_POS: { debugDrawerAI->SetOverlayTexturePos(this->team, cmdData->texHandle, cmdData->x, cmdData->y); } break; case AIHCDebugDraw::AIHC_DEBUGDRAWER_MODE_SET_OVERLAY_TEXTURE_SIZE: { debugDrawerAI->SetOverlayTextureSize(this->team, cmdData->texHandle, cmdData->w, cmdData->h); } break; case AIHCDebugDraw::AIHC_DEBUGDRAWER_MODE_SET_OVERLAY_TEXTURE_LABEL: { debugDrawerAI->SetOverlayTextureLabel(this->team, cmdData->texHandle, cmdData->label); } break; default: { } break; } return 1; } break; default: { return 0; } } }
int CAICallback::HandleCommand(int commandId, void* data) { switch (commandId) { case AIHCQuerySubVersionId: return 1; // current version of Handle Command interface case AIHCAddMapPointId: net->Send(CBaseNetProtocol::Get().SendMapDrawPoint(team, (short)((AIHCAddMapPoint *)data)->pos.x, (short)((AIHCAddMapPoint *)data)->pos.z, std::string(((AIHCAddMapPoint *)data)->label))); return 1; case AIHCAddMapLineId: net->Send(CBaseNetProtocol::Get().SendMapDrawLine(team, (short)((AIHCAddMapLine *)data)->posfrom.x, (short)((AIHCAddMapLine *)data)->posfrom.z, (short)((AIHCAddMapLine *)data)->posto.x, (short)((AIHCAddMapLine *)data)->posto.z)); return 1; case AIHCRemoveMapPointId: net->Send(CBaseNetProtocol::Get().SendMapErase(team, (short)((AIHCRemoveMapPoint *)data)->pos.x, (short)((AIHCRemoveMapPoint *)data)->pos.z)); return 1; case AIHCSendStartPosId: SendStartPos(((AIHCSendStartPos *)data)->ready,((AIHCSendStartPos *)data)->pos); return 1; case AIHCGetUnitDefByIdId: { AIHCGetUnitDefById* cmdData = (AIHCGetUnitDefById*) data; cmdData->ret = GetUnitDefById(cmdData->unitDefId); return 1; } case AIHCGetWeaponDefByIdId: { AIHCGetWeaponDefById* cmdData = (AIHCGetWeaponDefById*) data; cmdData->ret = GetWeaponDefById(cmdData->weaponDefId); return 1; } case AIHCGetFeatureDefByIdId: { AIHCGetFeatureDefById* cmdData = (AIHCGetFeatureDefById*) data; cmdData->ret = GetFeatureDefById(cmdData->featureDefId); return 1; } case AIHCTraceRayId: { AIHCTraceRay* cmdData = (AIHCTraceRay*) data; if (CHECK_UNITID(cmdData->srcUID)) { CUnit* srcUnit = uh->units[cmdData->srcUID]; CUnit* hitUnit = NULL; float realLen = 0.0f; bool haveHit = false; bool visible = true; if (srcUnit != NULL) { realLen = helper->TraceRay(cmdData->rayPos, cmdData->rayDir, cmdData->rayLen, 0.0f, srcUnit, hitUnit, cmdData->flags); if (hitUnit != NULL) { haveHit = true; visible = (hitUnit->losStatus[teamHandler->AllyTeam(team)] & LOS_INLOS); } cmdData->rayLen = ( visible)? realLen: cmdData->rayLen; cmdData->hitUID = (haveHit && visible)? hitUnit->id: cmdData->hitUID; } } return 1; } case AIHCPauseId: { AIHCPause* cmdData = (AIHCPause*) data; net->Send(CBaseNetProtocol::Get().SendPause(gu->myPlayerNum, cmdData->enable)); logOutput.Print( "Skirmish AI controlling team %i paused the game, reason: %s", team, cmdData->reason != NULL ? cmdData->reason : "UNSPECIFIED"); return 1; } default: return 0; } }