void DoorsDebugUI::Render() { if (!m_showDoorsUI) return; ImGui::SetNextWindowSize(ImVec2(500, 120), ImGuiSetCond_FirstUseEver); if (!ImGui::Begin("EQ Doors", &m_showDoorsUI)) return; PDOORTABLE pDoorTable = (PDOORTABLE)pSwitchMgr; ImGui::Text("%d door objects", pDoorTable->NumEntries); ImGui::Columns(6, "doorcolumns"); ImGui::Separator(); auto header = [this](const char* name, int id) { if (ImGui::Selectable(name, m_doorsSortColumn == id)) { m_sortReverse = (m_doorsSortColumn == id) ? !m_sortReverse : false; m_doorsSortColumn = id; } ImGui::NextColumn(); }; header("ID", Sort_ID); header("Name", Sort_Name); header("Type", Sort_Type); header("State", Sort_State); header("Distance", Sort_Distance); /* buttons */ ImGui::NextColumn(); ImGui::Separator(); std::vector<PDOOR> doors(pDoorTable->NumEntries); for (DWORD count = 0; count < pDoorTable->NumEntries; count++) { doors[count] = pDoorTable->pDoor[count]; } std::sort(doors.begin(), doors.end(), [this](PDOOR a, PDOOR b) -> bool { bool less = false; if (m_doorsSortColumn == Sort_ID) less = a->ID < b->ID; else if (m_doorsSortColumn == Sort_Name) less = strcmp(a->Name, b->Name) < 0; else if (m_doorsSortColumn == Sort_Type) less = a->Type < b->Type; else if (m_doorsSortColumn == Sort_State) less = a->State < b->State; else if (m_doorsSortColumn == Sort_Distance) less = GetDistance(a) < GetDistance(b); return less; }); if (m_sortReverse) std::reverse(doors.begin(), doors.end()); for (auto iter = doors.begin(); iter != doors.end(); ++iter) { PDOOR door = *iter; ImGui::PushID(door->ID); bool targetted = (m_lastDoorTargetId == door->ID); if (targetted) ImGui::PushStyleColor(ImGuiCol_Text, ImColor(0, 255, 0)); ImGui::Text("%d", door->ID); ImGui::NextColumn(); if (ImGui::Selectable(door->Name, targetted)) { CHAR temp[256]; sprintf_s(temp, "/doortarget id %d", door->ID); // would be nice if there was an easier way to do this. EzCommand(temp); } ImGui::NextColumn(); ImGui::Text("%d", door->Type); ImGui::NextColumn(); ImGui::Text("%d", door->State); ImGui::NextColumn(); ImGui::Text("%.2f", GetDistance(door)); ImGui::NextColumn(); if (targetted) ImGui::PopStyleColor(); if (ImGui::Button("Click")) ClickDoor(door); if (targetted) { ImGui::SameLine(); ImGui::Text("<Target>"); } if (IsSwitchStationary(door)) { ImGui::SameLine(); ImGui::Text("*stationary*"); } ImGui::NextColumn(); ImGui::PopID(); } ImGui::Separator(); ImGui::Columns(1); ImGui::Separator(); ImGui::End(); }
void ModelLoader::RenderDoorObjectUI(PDOOR door, bool target) { auto model = m_modelData[door->ID]; if (model) { bool visible = model->IsVisible(); ImGui::Checkbox("Render", &visible); ImGui::SameLine(); model->SetVisible(visible); bool highlight = model->IsHighlighted(); ImGui::Checkbox("Highlight", &highlight); model->SetHighlight(highlight); } else { ImGui::TextColored(ImColor(255, 0, 0), "No Model Data"); } if (target) { if (ImGui::TreeNode("Door Data")) { DumpDataUI(door, sizeof(_DOOR)); ImGui::TreePop(); } if (ImGui::TreeNode("Switch Data")) { DumpDataUI(door->pSwitch, sizeof(EQSWITCH)); ImGui::TreePop(); } } ImGui::Separator(); ImGui::Text("ID: %d Type: %d State: %d", door->ID, door->Type, door->State); if (door->ZonePoint != -1) { const char* zone = GetTeleportName(door->ZonePoint); ImGui::TextColored(ImColor(255, 255, 0), "Zone Point: %s (%d)", zone, door->ZonePoint); } ImGui::DragFloat3("Position", &door->Y); ImGui::DragFloat("Heading", &door->Heading); ImGui::DragFloat("Angle", &door->DoorAngle); ImGui::LabelText("Scale", "%.2f", GetDoorScale(door)); ImGui::DragFloat2("Top Speed 1", &door->TopSpeed1); ImGui::DragFloat3("Default Position", &door->DefaultY); ImGui::DragFloat("Default Heading", &door->DefaultHeading); ImGui::DragFloat("Default Angle", &door->DefaultDoorAngle); if (ImGui::Button("Target")) { CHAR temp[256]; sprintf_s(temp, "/doortarget id %d", door->ID); // would be nice if there was an easier way to do this. EzCommand(temp); } ImGui::SameLine(); if (ImGui::Button("Reset Position")) { door->X = door->DefaultX; door->Y = door->DefaultY; door->Z = door->DefaultZ; door->Heading = door->DefaultHeading; } ImGui::SameLine(); if (ImGui::Button("Click")) { ClickDoor(door); } }
void MQ2NavigationPlugin::Command_Navigate(PSPAWNINFO pChar, PCHAR szLine) { CHAR buffer[MAX_STRING] = { 0 }; int i = 0; GetArg(buffer, szLine, 1); if (!stricmp(buffer, "ui")) { mq2nav::GetSettings().show_ui = !mq2nav::GetSettings().show_ui; mq2nav::SaveSettings(false); return; } else if (!stricmp(buffer, "pause")) { m_isPaused = !m_isPaused; return; } m_pEndingDoor = nullptr; m_pEndingItem = nullptr; //DebugSpewAlways("MQ2Nav::NavigateCommand - start with arg: %s", szLine); glm::vec3 destination; bool haveDestination = ParseDestination(szLine, destination); //DebugSpewAlways("MQ2Nav::NavigateCommand - have destination: %d", haveDestination ? 1 : 0); if (!haveDestination) { // reload nav mesh if (!strcmp(buffer, "reload")) { Get<NavMeshLoader>()->LoadNavMesh(); } else if (!stricmp(buffer, "recordwaypoint") || !stricmp(buffer, "rwp")) { GetArg(buffer, szLine, 2); if (0 == *buffer) { WriteChatf(PLUGIN_MSG "Usage: /navigate recordwaypoint <waypoint name> <waypoint tag>"); } else { std::string waypointName(buffer); GetArg(buffer, szLine, 3); std::string waypointTag(buffer); WriteChatf(PLUGIN_MSG "Recording waypoint: '%s' with tag: %s", waypointName.c_str(), waypointTag.c_str()); if (mq2nav::AddWaypoint(waypointName, waypointTag)) { WriteChatf(PLUGIN_MSG "Overwrote previous waypoint: '%s'", waypointName.c_str()); } } } else if (!stricmp(buffer, "help")) { WriteChatf(PLUGIN_MSG "Usage:"); WriteChatf(PLUGIN_MSG "\ag/navigate [save | load]\ax - save/load settings"); WriteChatf(PLUGIN_MSG "\ag/navigate reload\ax - reload navmesh"); WriteChatf(PLUGIN_MSG "\ag/navigate recordwaypoint <waypoint name> <waypoint tag>\ax - create a waypoint"); WriteChatf(PLUGIN_MSG "\aoNavigation Options:\ax"); WriteChatf(PLUGIN_MSG "\ag/navigate target\ax - navigate to target"); WriteChatf(PLUGIN_MSG "\ag/navigate X Y Z\ax - navigate to coordinates"); WriteChatf(PLUGIN_MSG "\ag/navigate item [click] [once]\ax - navigate to item (and click it)"); WriteChatf(PLUGIN_MSG "\ag/navigate door [click] [once]\ax - navigate to door/object (and click it)"); WriteChatf(PLUGIN_MSG "\ag/navigate waypoint <waypoint>\ax - navigate to waypoint"); WriteChatf(PLUGIN_MSG "\ag/navigate stop\ax - stop navigation"); WriteChatf(PLUGIN_MSG "\ag/navigate pause\ax - pause navigation"); } else if (!stricmp(buffer, "load")) { mq2nav::LoadSettings(true); } else if (!stricmp(buffer, "save")) { mq2nav::SaveSettings(true); } Stop(); return; } // we were given a destination. Check if we should click once at the end. GetArg(buffer, szLine, 3); m_bSpamClick = strcmp(buffer, "once"); BeginNavigation(destination); if (m_isActive) EzCommand("/squelch /stick off"); }