Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation since 04/05/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
  7. Важные новости от команды Piratia Tech Дорогие игроки! Сегодня мы хотим поделиться с вами очень важным решением, которое определит дальнейшую судьбу проекта. 🎯 После долгих обсуждений и анализа мы пришли к выводу: будущее сервера — за полноценным переходом на исходные коды. И мы с радостью сообщаем, что исходники уже приобретены и успешно запущены! 🚀 🔧 Что это значит для вас? 💠 Стабильность и надёжность 💠 Плавный геймплей — стабильные 60 FPS без визуальных багов 💠 Система ездовых маунтов 💠 Полноценная система браслетов, появсов и наручей ⏳ Конечно, перенос и доработка займут больше времени, чем мы изначально планировали. Но мы уверены — это решение верное. Оно позволит нам создать по-настоящему качественный и стабильный сервер, в который будет приятно играть вам, нашим дорогим игрокам. 💙 Спасибо за вашу поддержку, веру и терпение. Мы продолжаем развиваться — вместе с вами и для вас! С уважением, Администрация Piratia Tech ⚓ 🛠️ Dev-Blog 2 (улучшение предметов): Дорогие игроки! Работа над сервером активно продолжается, и мы хотим рассказать вам о важных изменениях, которые уже добавлены и протестированы. 🔨 Улучшения предметов Теперь все предметы улучшаются в Очаге Бессмертия. ⚙️ При улучшении форж сохраняется, что делает процесс прокачки более стабильным и честным. 🔹 Плащ Адмирала теперь можно улучшать только специальным предметом. 🔹 Маунты тоже требуют отдельный предмет для улучшения. 💰 Новая система золота Теперь все мобы дают золото при убийстве. 📈 Чем выше уровень моба — тем больше он даёт. 💸 На выходных (суббота и воскресенье) автоматически включаются рейты x2 на золото. Если у вас есть VIP, он даёт ещё +1x сверху. 👉 В итоге: с VIP и в выходные — у вас x3 золота с мобов и предметов! Это только начало — впереди много интересного! Спасибо, что следите за разработкой и поддерживаете проект. Мы делаем этот сервер для вас! ❤️ 🛠️ Dev-Blog 3: Обновление VIP-системы Привет, пираты! ⚓ У нас для вас хорошие новости — мы обновили и улучшили VIP-систему на сервере! 👑 Что нового? 🔹 Теперь, если у вас уже есть активный VIP, вы можете использовать ещё один VIP-предмет, и дни просто суммируются! Больше не нужно ждать окончания — продлевайте заранее! 🔹 При активации или продлении VIP теперь появляется уведомление в чате, чтобы вы точно знали, что всё прошло успешно. 🔹 Добавлен новый предмет "VIP Info", который позволяет посмотреть, сколько дней VIP у вас осталось. 🔹 В ближайшее время на сайте появится поиск по никам, где любой желающий сможет ввести имя персонажа и узнать, сколько дней VIP у него осталось. Удобно и прозрачно! Спасибо за поддержку! Команда Piratia Tech
    1 point
  8. Version 1.0.0

    5 downloads

    ...
    0 points

Chat

Chat

Please enter your display name

×
×
  • Create New...