-
Posts
12 -
Joined
-
Last visited
-
Days Won
2
Content Type
Profiles
Forums
Downloads
Gallery
Articles
Everything posted by Grim4ik
-
Добавлен эффект к маунтам
-
С радостью представляем вам первую линейку премиум-маунтов с обновлённой системой окраски! Будьте стильными, выделяйтесь из толпы и катайтесь с шиком!
-
Небольшой 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; }
-
Да, GUI взять с Pirates Fortune, разработчиком которого является Graf
-
Добрый день! Поправил, сделал просто замены функции по шагам, не трогая целый код!
-
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; // ← ТАКОГО ТОЖЕ БЫТЬ НЕ ДОЛЖНО Это все!
-
Открываем 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]); }
-
Важные новости от команды 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
-
Сайт 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-фарме на метеорите.