All Activity
- Today
-
MatthewtwEve joined the community
-
MartinMoult started following [Разработка] Piratia Tech
-
Всем Привет! Сегодня современные проекты используют рекламу у блогеров, чтобы повысить узнаваемость. Это направление быстро развивается, и результаты часто превосходят классический таргет. Этот подход показывается существенные результаты Подробнее о том, как устроен рынок блогеров, можно прочитать в нашем материале — в нашем блоге Будем рады узнать ваше мнение о продвижении через блогеров!
- Last week
-
MartinMoult joined the community
-
Что хочется еще видеть и что уже в процессе реализации, но пока на паузе: 1. Экспорт готовой модели; 2. Перевод на Net Core 8; 3. Импорт готовой модели.
-
Просмотр моделей Зачем же я это начал дорабатывать.. Для того, чтобы не копировать скрины мобов с чьей-либо Базы Данных, а иметь свои скриншоты для своего проекта. И вывести всех монстров, а не только тех, которые есть у "кого-то там на другом проекте". Что изменено: Расположение "пола" под моделями; Добавлена возможность выводить текстуру "пола"; Добавлена возможность выводить "задний фон"; Добавлена возможность выбора текстуры "заднего фона"; Убраны стандартные нопки управления; Добавлено параномирование (движение камеры); Исправлена ошибка в DrawDesert: OpenTK.Graphics.GraphicsErrorException: "StackOverflow"; Левая кнопка мыши теперь отвечает только за перемещение камеры; Правая кнопка мишы теперь отвечает за поворот камеры; Колесико мышки отвечает за зум; Исправлена ошибка "System.IO.EndOfStreamException: "Чтение после конца потока невозможно."; Переписано наложение текстур на модель. Visual Studio 2022 Community. Net Framework 4.8. Цена: 500 USDT. (за исходник). P.S. Если руки дойдут, хочу все таки сделать экспорт хотя бы в какой-нибудь современный аналог для редактирования модели. За покупкой обращаться или в телеграм (https://t.me/ggdevelop) или в Discord (grafulya)
-
Обновил до версии 0.2. Изменения: Исправлена ошибка парсинга ChaSpn файлов; Добавлен вывод пути до выбранного каталога resource; Добавлен вывод версии; Небольшая перестановка (буквально несколько пикселей) интерфейса; Добавил парсинг файла mlist.lua (то есть всех монстров из resource/script/monster/*); Выведен подсчет количества проверенных файлов (для проверки самого себя). Ссылку обновил
- Earlier
-
Поиск монстров по картам Вы когда-нибудь задумывались о том, что в игре сотни монстров? Сегодня и я задумался об этом... Потом решил, что хочу знать, какие монстры на каких картах расстановлены.. И тут мне стало грустно перебирать все руками. Поэтому написал программу (net. Core 8). Видео: Видео-17-10-2025 191622.mp4 VirusTotal (https://www.virustotal.com/gui/file/5861fb385921a729f877345e645aa3957c86ba9ce42dd555221f231b37ba5602?nocache=1😞 Почему так выглядит VirusTotal: Скачать (Google Drive)
- 1 reply
-
- 1
-
-
- 10 replies
-
- збт
- разработка
-
(and 1 more)
Tagged with:
-
Небольшой 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
-
Добрый день! Поправил, сделал просто замены функции по шагам, не трогая целый код!
-
-
@Grim4ik Добрый вечер. Не уверен в корректности "заменить весь код". Хотя бы комментарии добавьте, чтобы люди могли нужные части кода себе перетащить.
-
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]); }
-
Пример сундука с 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
-
Вот ещё интересный вариант, с ключом (Пурпурный сундук) function ItemUse_TestCest1 (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 < 1 then SystemNotice(role ,"Недостаточно места в инвентаре") UseItemFailed ( role ) return end local i= CheckBagItem( role, 7101 ) --ID ключа if i <=0 then SystemNotice( role , "Нужен ключ соответствующего цвета!") UseItemFailed ( role ) return LUA_FALSE end local s = DelBagItem ( role , 7101 , 1 ) --ID ключа local sc = math.random(1,100) local itemname = "" if sc <=50 then GiveItem ( role , 0 , 7114 , 1 , 4 ) itemname = "Зеленый сундук" elseif sc <=65 then GiveItem ( role , 0 , 7102 , 1 , 4 ) itemname = "Зеленый ключ" elseif sc <=80 then GiveItem ( role , 0 , 7085 , 5 , 4 ) itemname = "Загадочная коробка" elseif sc <=95 then GiveItem ( role , 0 , 7084 , 5 , 4 ) itemname = "Сундук королевы феи" else GiveItem ( role , 0 , 7099 , 3 , 4 ) itemname = "Пиастра" end local cha_name = GetChaDefaultName ( role ) Notice ( "Игрок" ..cha_name.." открыл Пурпурный сундук и получил "..itemname ) end
-
Важные новости от команды 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-фарме на метеорите.
-
Grim4ik changed their profile photo
-
Здравствуйте, капитан! 🏴☠️ В Magicsea Online произошло много интересного — и мы приглашаем вас вернуться в обновлённый мир приключений! ✨ Что нового в игре? • Добавлен Battle Pass с уникальными наградами • Новый режим — Рыбалка • Новые PvP-локации: Ледяная пещера и Хаос • Новые PvE-зоны: Шахты и Ледяная пещера • Более 200 новых заданий с озвучкой • Полностью переработанное обучение 🎯 А в следующем обновлении появится Аукцион и новые эпические локации! 🎁 Подарки ждут вас прямо сейчас! • VIP-статус на 7 дней • Набор зелий • Бесплатный скин Просто напишите нам ваш ник в игре в Telegram, и мы отправим вам подарок: 👉 https://t.me/magicsea_support 🔥 Наш ЧАТ => https://t.me/magicsea_chat Скачать игру: https://promo.magicseaonline.com/go-piratia Сотни игроков уже вернулись. Пора и вам снова выйти в море! 🌊 До встречи в Magicsea Online!
-
-
- 10 replies
-
- збт
- разработка
-
(and 1 more)
Tagged with:
-
Hi. Discord - grafulya
-
- 10 replies
-
- збт
- разработка
-
(and 1 more)
Tagged with:
-
sLeia started following Looking For Fixed Sources
-
Im buying source code! I want to use fixed srcs for my new project. I want include with some mods like mounts, 60fps and etc.