Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation since 09/25/25 in all areas

  1. Поиск монстров по картам Вы когда-нибудь задумывались о том, что в игре сотни монстров? Сегодня и я задумался об этом... Потом решил, что хочу знать, какие монстры на каких картах расстановлены.. И тут мне стало грустно перебирать все руками. Поэтому написал программу (net. Core 8). Видео: Видео-17-10-2025 191622.mp4 VirusTotal (https://www.virustotal.com/gui/file/5861fb385921a729f877345e645aa3957c86ba9ce42dd555221f231b37ba5602?nocache=1😞 Почему так выглядит VirusTotal: Скачать (Google Drive)
    1 point
  2. UIStateForm.cpp 1) Находим строку: using namespace GUI; Под ней вставляем: namespace { enum class EStatBtn { NONE, STR, AGI, CON, STA, DEX }; static bool s_holdActive = false; static EStatBtn s_activeBtn = EStatBtn::NONE; static int s_stage = 0; static DWORD s_intervalMs = 300; static DWORD s_nextTick = 0; static EStatBtn ResolveStatBtnByName(const std::string& n) { if (n == "btnStr") return EStatBtn::STR; if (n == "btnAgi") return EStatBtn::AGI; if (n == "btnCon") return EStatBtn::CON; if (n == "btnSta") return EStatBtn::STA; if (n == "btnDex") return EStatBtn::DEX; return EStatBtn::NONE; } static int AttrIdFromBtn(EStatBtn b) { switch (b) { case EStatBtn::STR: return ATTR_STR; case EStatBtn::AGI: return ATTR_AGI; case EStatBtn::CON: return ATTR_CON; case EStatBtn::STA: return ATTR_STA; case EStatBtn::DEX: return ATTR_DEX; default: return -1; } } static void DoAddOne(EStatBtn btn) { const int attrId = AttrIdFromBtn(btn); if (attrId < 0) return; CCharacter* pCha = g_stUIBoat.GetHuman(); if (!pCha) return; SGameAttr* ga = pCha->getGameAttr(); if (!ga || ga->get(ATTR_AP) <= 0) return; CChaAttr attr; attr.ResetChangeFlag(); attr.DirectSetAttr(attrId, 1); attr.SetChangeBitFlag(attrId); if (auto* proCir = (CProCirculateCS*)g_NetIF->GetProCir()) proCir->SynBaseAttribute(&attr); } static POINT GetClientCursor(HWND hwnd) { POINT p; ::GetCursorPos(&p); if (hwnd) ::ScreenToClient(hwnd, &p); return p; } static bool IsMouseOverBtn(HWND hwnd, CForm* frm, CGuiData* btn) { if (!frm || !btn || !btn->GetIsShow()) return false; POINT c = GetClientCursor(hwnd); const int x = frm->GetLeft() + btn->GetLeft(); const int y = frm->GetTop() + btn->GetTop(); const int w = btn->GetWidth(); const int h = btn->GetHeight(); return (c.x >= x && c.x < x + w && c.y >= y && c.y < y + h); } static CGuiData* ButtonByEnum(CTextButton* btnStr, CTextButton* btnAgi, CTextButton* btnCon, CTextButton* btnSta, CTextButton* btnDex, EStatBtn b) { switch (b) { case EStatBtn::STR: return btnStr; case EStatBtn::AGI: return btnAgi; case EStatBtn::CON: return btnCon; case EStatBtn::STA: return btnSta; case EStatBtn::DEX: return btnDex; default: return nullptr; } } static void StartHold(EStatBtn b) { s_activeBtn = b; s_holdActive = (b != EStatBtn::NONE); s_stage = 0; s_intervalMs = 300; s_nextTick = ::GetTickCount() + s_intervalMs; } static void StopHold() { s_holdActive = false; s_activeBtn = EStatBtn::NONE; } } 2) Находим существующую функцию: void CStateMgr::FrameMove(DWORD dwTime) { if( frmState->GetIsShow() ) { static CTimeWork time(100); if( time.IsTimeOut( dwTime ) ) RefreshStateFrm(); } } Заменяем целиком функцию на: void CStateMgr::FrameMove(DWORD dwTime) { if (frmState->GetIsShow()) { static CTimeWork time(100); if (time.IsTimeOut(dwTime)) RefreshStateFrm(); } HWND hwnd = ::GetActiveWindow(); const bool lmbDown = (::GetAsyncKeyState(VK_LBUTTON) & 0x8000) != 0; if (lmbDown && !s_holdActive) { if (IsMouseOverBtn(hwnd, frmState, btnStr)) StartHold(EStatBtn::STR); else if (IsMouseOverBtn(hwnd, frmState, btnAgi)) StartHold(EStatBtn::AGI); else if (IsMouseOverBtn(hwnd, frmState, btnCon)) StartHold(EStatBtn::CON); else if (IsMouseOverBtn(hwnd, frmState, btnSta)) StartHold(EStatBtn::STA); else if (IsMouseOverBtn(hwnd, frmState, btnDex)) StartHold(EStatBtn::DEX); } if (s_holdActive) { CGuiData* activeBtnPtr = ButtonByEnum(btnStr, btnAgi, btnCon, btnSta, btnDex, s_activeBtn); const bool stillOver = IsMouseOverBtn(hwnd, frmState, activeBtnPtr); if (!lmbDown || !stillOver) { StopHold(); } } if (s_holdActive) { DWORD now = ::GetTickCount(); if (now >= s_nextTick) { DoAddOne(s_activeBtn); if (s_stage == 0) s_intervalMs = 150; else if (s_stage == 1) s_intervalMs = 100; else s_intervalMs = 80; ++s_stage; s_nextTick = now + s_intervalMs; } } } 3) Найти функцию: void CStateMgr::MainMouseDown(CGuiData *pSender, int x, int y, DWORD key) Если в функции есть строки ниже, их удалить или замутить, остальное без изменения: s_activeBtn = ResolveStatBtnByName(name); // ← ЭТО УДАЛИТЬ, если было s_holdActive = true; // ← ТАКОГО ТОЖЕ БЫТЬ НЕ ДОЛЖНО Это все!
    1 point
  3. Да, GUI взять с Pirates Fortune, разработчиком которого является Graf
    1 point
  4. Добрый день! Поправил, сделал просто замены функции по шагам, не трогая целый код!
    1 point
  5. @Grim4ik Добрый вечер. Не уверен в корректности "заменить весь код". Хотя бы комментарии добавьте, чтобы люди могли нужные части кода себе перетащить.
    1 point
  6. Пример сундука с 3 ключами. function ItemUse_LockedChest1 (role, Item) local Cha_Boat = GetCtrlBoat ( role ) if Cha_Boat ~= nil then SystemNotice( role , "Нельзя использовать в море!" ) UseItemFailed ( role ) return end local Item_CanGet = GetChaFreeBagGridNum ( role ) if Item_CanGet < 4 then SystemNotice(role ,"Нужно 5 свободных ячеек") UseItemFailed ( role ) return end local key1 = CheckBagItem( role, 7500 )--Ключи local key2 = CheckBagItem( role, 7501 ) local key3 = CheckBagItem( role, 7502 ) if key1 <= 0 then SystemNotice( role , "Не хватает ключа!" ) UseItemFailed ( role ) return LUA_FALSE end if key2 <= 0 then SystemNotice( role , "Не хватает ключа!" ) UseItemFailed ( role ) return LUA_FALSE end if key3 <= 0 then SystemNotice( role , "Не хватает ключа!" ) UseItemFailed ( role ) return LUA_FALSE end DelBagItem ( role , 7500 , 1 )--ключи DelBagItem ( role , 7501 , 1 ) DelBagItem ( role , 7502 , 1 ) GiveItem ( role , 0 , 7062 , 1 , 20 )--Предметы GiveItem ( role , 0 , 6997 , 1 , 20 ) GiveItem ( role , 0 , 6996 , 1 , 20 ) GiveItem ( role , 0 , 6998 , 1 , 20 ) end
    1 point

Chat

Chat

Please enter your display name

×
×
  • Create New...