void CInMapDraw::LocalLine(const float3& constPos1, const float3& constPos2, int playerID) { if ((playerID < 0) || (playerID >= playerHandler->ActivePlayers())) return; GML_STDMUTEX_LOCK(inmap); // LocalLine const CPlayer* sender = playerHandler->Player(playerID); float3 pos1 = constPos1; float3 pos2 = constPos2; pos1.CheckInBounds(); pos2.CheckInBounds(); pos1.y = ground->GetHeight(pos1.x, pos1.z) + 2.0f; pos2.y = ground->GetHeight(pos2.x, pos2.z) + 2.0f; if (AllowedMsg(sender) && eventHandler.MapDrawCmd(playerID, MAPDRAW_LINE, &pos1, &pos2, NULL)) { return; } MapLine line; line.pos = pos1; line.pos2 = pos2; line.color = sender->spectator ? color4::white : teamHandler->Team(sender->team)->color; line.senderAllyTeam = teamHandler->AllyTeam(sender->team); line.senderSpectator = sender->spectator; const int quad = int(pos1.z * quadScale) * drawQuadsX + int(pos1.x * quadScale); drawQuads[quad].lines.push_back(line); }
bool CInMapDrawModel::AddLine(const float3& constPos1, const float3& constPos2, int playerID) { if (!playerHandler->IsValidPlayer(playerID)) { return false; } GML_STDMUTEX_LOCK(inmap); // LocalLine const CPlayer* sender = playerHandler->Player(playerID); float3 pos1 = constPos1; float3 pos2 = constPos2; pos1.ClampInBounds(); pos2.ClampInBounds(); pos1.y = ground->GetHeightAboveWater(pos1.x, pos1.z, false) + 2.0f; pos2.y = ground->GetHeightAboveWater(pos2.x, pos2.z, false) + 2.0f; if (AllowedMsg(sender) && eventHandler.MapDrawCmd(playerID, MAPDRAW_LINE, &pos1, &pos2, NULL)) { return false; } MapLine line(sender->spectator, sender->team, sender, pos1, pos2); const int quad = int(pos1.z * QUAD_SCALE) * drawQuadsX + int(pos1.x * QUAD_SCALE); drawQuads[quad].lines.push_back(line); numLines++; return true; }
bool CInMapDrawModel::AddPoint(const float3& constPos, const std::string& label, int playerID) { if (!playerHandler->IsValidPlayer(playerID)) { return false; } GML_STDMUTEX_LOCK(inmap); // LocalPoint // GotNetMsg() alreadys checks validity of playerID const CPlayer* sender = playerHandler->Player(playerID); const bool allowed = AllowedMsg(sender); float3 pos = constPos; pos.ClampInBounds(); pos.y = ground->GetHeightAboveWater(pos.x, pos.z, false) + 2.0f; // event clients may process the point // if their owner is allowed to see it if (allowed && eventHandler.MapDrawCmd(playerID, MAPDRAW_POINT, &pos, NULL, &label)) { return false; } // let the engine handle it (disallowed // points added here are filtered while // rendering the quads) MapPoint point(sender->spectator, sender->team, sender, pos, label); const int quad = int(pos.z * QUAD_SCALE) * drawQuadsX + int(pos.x * QUAD_SCALE); drawQuads[quad].points.push_back(point); numPoints++; return true; }
void CInMapDrawModel::EraseNear(const float3& constPos, int playerID) { if (!playerHandler->IsValidPlayer(playerID)) return; GML_STDMUTEX_LOCK(inmap); // LocalErase const CPlayer* sender = playerHandler->Player(playerID); float3 pos = constPos; pos.ClampInBounds(); pos.y = ground->GetHeightAboveWater(pos.x, pos.z, false) + 2.0f; if (AllowedMsg(sender) && eventHandler.MapDrawCmd(playerID, MAPDRAW_ERASE, &pos, NULL, NULL)) { return; } const float radius = 100.0f; const int maxY = drawQuadsY - 1; const int maxX = drawQuadsX - 1; const int yStart = (int) std::max(0, int((pos.z - radius) * QUAD_SCALE)); const int xStart = (int) std::max(0, int((pos.x - radius) * QUAD_SCALE)); const int yEnd = (int) std::min(maxY, int((pos.z + radius) * QUAD_SCALE)); const int xEnd = (int) std::min(maxX, int((pos.x + radius) * QUAD_SCALE)); for (int y = yStart; y <= yEnd; ++y) { for (int x = xStart; x <= xEnd; ++x) { DrawQuad* dq = &drawQuads[(y * drawQuadsX) + x]; std::list<MapPoint>::iterator pi; for (pi = dq->points.begin(); pi != dq->points.end(); /* none */) { if (pi->GetPos().SqDistance2D(pos) < (radius*radius) && (pi->IsBySpectator() == sender->spectator)) { pi = dq->points.erase(pi); numPoints--; } else { ++pi; } } std::list<MapLine>::iterator li; for (li = dq->lines.begin(); li != dq->lines.end(); /* none */) { // TODO maybe erase on pos2 too? if (li->GetPos1().SqDistance2D(pos) < (radius*radius) && (li->IsBySpectator() == sender->spectator)) { li = dq->lines.erase(li); numLines--; } else { ++li; } } } } }
void CInMapDraw::LocalErase(const float3& constPos, int playerID) { if ((playerID < 0) || (playerID >= playerHandler->ActivePlayers())) return; GML_STDMUTEX_LOCK(inmap); // LocalErase const CPlayer* sender = playerHandler->Player(playerID); float3 pos = constPos; pos.CheckInBounds(); pos.y = ground->GetHeight(pos.x, pos.z) + 2.0f; if (AllowedMsg(sender) && eventHandler.MapDrawCmd(playerID, MAPDRAW_ERASE, &pos, NULL, NULL)) { return; } const float radius = 100.0f; const int maxY = drawQuadsY - 1; const int maxX = drawQuadsX - 1; const int yStart = (int) std::max(0, int((pos.z - radius) * quadScale)); const int xStart = (int) std::max(0, int((pos.x - radius) * quadScale)); const int yEnd = (int) std::min(maxY, int((pos.z + radius) * quadScale)); const int xEnd = (int) std::min(maxX, int((pos.x + radius) * quadScale)); for (int y = yStart; y <= yEnd; ++y) { for (int x = xStart; x <= xEnd; ++x) { DrawQuad* dq = &drawQuads[(y * drawQuadsX) + x]; std::list<MapPoint>::iterator pi; for (pi = dq->points.begin(); pi != dq->points.end(); /* none */) { if (pi->pos.SqDistance2D(pos) < (radius*radius) && (pi->senderSpectator == sender->spectator)) { pi = dq->points.erase(pi); } else { ++pi; } } std::list<MapLine>::iterator li; for (li = dq->lines.begin(); li != dq->lines.end(); /* none */) { if (li->pos.SqDistance2D(pos) < (radius*radius) && (li->senderSpectator == sender->spectator)) { li = dq->lines.erase(li); } else { ++li; } } } } }
void CInMapDraw::LocalPoint(const float3& constPos, const std::string& label, int playerID) { if ((playerID < 0) || (playerID >= playerHandler->ActivePlayers())) return; GML_STDMUTEX_LOCK(inmap); // LocalPoint // GotNetMsg() alreadys checks validity of playerID const CPlayer* sender = playerHandler->Player(playerID); const bool allowed = AllowedMsg(sender); float3 pos = constPos; pos.CheckInBounds(); pos.y = ground->GetHeight(pos.x, pos.z) + 2.0f; // event clients may process the point // if their owner is allowed to see it if (allowed && eventHandler.MapDrawCmd(playerID, MAPDRAW_POINT, &pos, NULL, &label)) { return; } // let the engine handle it (disallowed // points added here are filtered while // rendering the quads) MapPoint point; point.pos = pos; point.color = sender->spectator ? color4::white : teamHandler->Team(sender->team)->color; point.label = label; point.senderAllyTeam = teamHandler->AllyTeam(sender->team); point.senderSpectator = sender->spectator; const int quad = int(pos.z * quadScale) * drawQuadsX + int(pos.x * quadScale); drawQuads[quad].points.push_back(point); if (allowed || drawAll) { // if we happen to be in drawAll mode, notify us now // even if this message is not intented for our ears logOutput.Print("%s added point: %s", sender->name.c_str(), point.label.c_str()); logOutput.SetLastMsgPos(pos); Channels::UserInterface.PlaySample(blippSound, pos); minimap->AddNotification(pos, float3(1.0f, 1.0f, 1.0f), 1.0f); } }