bool MQ2NavigationPlugin::ClickNearestClosedDoor(float cDistance) { if (!ppSwitchMgr || !pSwitchMgr) return false; PDOORTABLE pDoorTable = (PDOORTABLE)pSwitchMgr; PDOOR pDoor = NULL; PSPAWNINFO pChar = GetCharInfo()->pSpawn; for (DWORD index = 0; index < pDoorTable->NumEntries; index++) { if (pDoorTable->pDoor[index]->Z <= pChar->Z + gZFilter && pDoorTable->pDoor[index]->Z >= pChar->Z - gZFilter) { FLOAT Distance = GetDistance(pDoorTable->pDoor[index]->X, pDoorTable->pDoor[index]->Y); if (Distance < cDistance) { pDoor = pDoorTable->pDoor[index]; cDistance = Distance; } } } if (pDoor) { ClickDoor(pDoor); return true; } return false; }
void MQ2NavigationPlugin::AttemptClick() { if (!m_isActive && !m_bSpamClick) return; // don't execute if we've got an item on the cursor. if (GetCharInfo2()->pInventoryArray && GetCharInfo2()->pInventoryArray->Inventory.Cursor) return; clock::time_point now = clock::now(); // only execute every 500 milliseconds if (now < m_lastClick + std::chrono::milliseconds(500)) return; m_lastClick = now; if (m_pEndingDoor && GetDistance(m_pEndingDoor->X, m_pEndingDoor->Y) < 25) { ClickDoor(m_pEndingDoor); } else if (m_pEndingItem && GetDistance(m_pEndingItem->X, m_pEndingItem->Y) < 25) { ClickGroundItem(m_pEndingItem); } }
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 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(); }