Jump to content

Grim4ik

Server owner
  • Posts

    12
  • Joined

  • Last visited

  • Days Won

    2

Grim4ik last won the day on October 16 2025

Grim4ik had the most liked content!

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

Grim4ik's Achievements

4

Reputation

  1. С радостью представляем вам первую линейку премиум-маунтов с обновлённой системой окраски! Будьте стильными, выделяйтесь из толпы и катайтесь с шиком!
  2. Небольшой UPDATE Словил баг, что защита сервера выкидывает, при добавлении большого количества статов за раз. По этому добавление внизу, делает мини паузу через каждые 25 статов и с сервера больше не выбрасывает. 1) В функции namespace после static DWORD s_nextTick = 0; вставляем: static int s_holdCount = 0; 2) В static void StartHold(EStatBtn b) после s_nextTick = ::GetTickCount() + s_intervalMs; вставляем: s_holdCount = 0; 3) В FrameMove заменить кусок функции if (now >= s_nextTick) { ... } на: if (now >= s_nextTick) { if (s_holdCount >= 25) { StopHold(); return; } CCharacter* pCha = g_stUIBoat.GetHuman(); if (!pCha) { StopHold(); return; } SGameAttr* ga = pCha->getGameAttr(); if (!ga || ga->get(ATTR_AP) <= 0) { StopHold(); return; } DoAddOne(s_activeBtn); ++s_holdCount; 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. Да, GUI взять с Pirates Fortune, разработчиком которого является Graf
  4. Добрый день! Поправил, сделал просто замены функции по шагам, не трогая целый код!
  5. 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; // ← ТАКОГО ТОЖЕ БЫТЬ НЕ ДОЛЖНО Это все!
  6. Открываем UIHeadSay.cpp Находим: for (int i(0); i<NAME_PART_NUM; i++) { if( s_dwNamePartsColors[i][1] ) { CGuiFont::s_Font.BRender(s_sNamePart[i], x + iStartPosX, y - iNameHeightStep, s_dwNamePartsColors[i][0], s_dwNamePartsColors[i][1] ); } else { CGuiFont::s_Font.Render(s_sNamePart[i], x + iStartPosX, y - iNameHeightStep, s_dwNamePartsColors[i][0] ); } iStartPosX += CGuiFont::s_Font.GetWidth(s_sNamePart[i]); } Заменяем на: const bool drawLevelLeft = _pOwn->IsPlayer(); const int gap = 6; char lvl[32] = {0}; int lvlW = 0; if (drawLevelLeft) { SGameAttr* ga = _pOwn->getGameAttr(); #ifdef _MSC_VER _snprintf(lvl, sizeof(lvl), "[Lv.%d]", ga ? ga->get(ATTR_LV) : 0); #else snprintf(lvl, sizeof(lvl), "[Lv.%d]", ga ? ga->get(ATTR_LV) : 0); #endif lvlW = CGuiFont::s_Font.GetWidth(lvl); } const int nameW = CGuiFont::s_Font.GetWidth(s_szName); const int leftCombined = x - ((drawLevelLeft ? (lvlW + gap) : 0) + nameW) / 2; if (drawLevelLeft) { const int lvlX = leftCombined; const int lvlY = y - iNameHeightStep; CGuiFont::s_Font.Render(lvl, lvlX, lvlY, COLOR_BLACK); CGuiFont::s_Font.Render(lvl, lvlX - 1, lvlY - 1, 0xFF00FFFF); } iStartPosX = (leftCombined + (drawLevelLeft ? (lvlW + gap) : 0)) - x; for (int i = 0; i < NAME_PART_NUM; ++i) { if (s_dwNamePartsColors[i][1]) { CGuiFont::s_Font.BRender( s_sNamePart[i], x + iStartPosX, y - iNameHeightStep, s_dwNamePartsColors[i][0], s_dwNamePartsColors[i][1] ); } else { CGuiFont::s_Font.Render( s_sNamePart[i], x + iStartPosX, y - iNameHeightStep, s_dwNamePartsColors[i][0] ); } iStartPosX += CGuiFont::s_Font.GetWidth(s_sNamePart[i]); }
  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
  8. Сайт Discord VK Telegram 🔥 Тип сервера: Фан ⚔️ Макс. уровень персонажа: 150 🧚 Макс. уровень феи: 500 💎 Макс. заточка: lv40 / 210% одним кристалом 🎯 Классы героев Ланс – Мечник/Шарп Чамп – Чемпион Филлис – Шарп Ами – Знахарка 🛡️ Экипировка и бонусы Стартовый шмот у NPC — чтобы уверенно влиться в игру с первых минут. Tech-экипировка [+0] - [+3]: броня, оружие, бижутерия и кольца с возможностью постепенного апгрейда. 6 Аур со статами — занимают 3-й и 4-й слоты рюкзака и дают мощные бусты под ваши нужды. VIP-система: дополнительные бонусы к статам и эксклюзивный значок VIP над головой. Плащ адмирала: 1-4 уровень, дополнительные бонусы к статам и внешний вид 💎 Самоцветы +10 | +20 | +40 к базовым характеристикам +30 к статам (в кольца и бижутерию) 🏪 Система ларьков Уникальная площадка для торговли: Открывайте свой ларёк в любой безопасной зоне. Продавайте за любую серверную валюту или обменивайте на любой предмет в игре. Настраивайте ассортимент и рулите своим бизнесом вместе с друзьями! 💰 Валюты В мире Piratia Tech – пять ключевых ресурсов! 4 из 5 имеется каждый в трёх фасонах (бронза → серебро → золото): Золото (обычные деньги) Жетоны (бронза → серебро → золото) Монеты (бронза → серебро → золото) Ключи (бронза → серебро → золото) Доллары (бронза → серебро → золото) Меняйте бронзовые на серебряные, серебряные на золотые и используйте для прокачки, апгрейда экипировки и покупки редких штук. Валюту можно добывать с обычных мобов, боссов и в AFK-фарме на метеорите.

Chat

Chat

Please enter your display name

×
×
  • Create New...