Kst
Advanced members-
Content Count
49 -
Joined
-
Last visited
-
Days Won
5
Everything posted by Kst
-
Новая версия GateServer'a сурсы которой в шаре, решают данную проблему, там установлена зашита от флуда пакетами. // DDOS Protection if (g_ddos && l_cmd != CMD_CM_BEGINACTION) { //Player *l_ply = (Player*)datasock->GetPointer(); //if (l_ply) //{ uLong l_tick = GetCurrentTick(); if (l_tick - datasock->m_lashTick < 1000 * m_checkSpan) { datasock->m_cmdNum++; if (datasock->m_cmdNum > m_checkError) { printf("[%s] ddos suspected... ", datasock->GetPeerIP()); dbc::WPacket l_wpk = GetWPacket(); l_wpk.WriteCmd(CMD_MC_LOGIN); l_wpk.WriteShort(ERR_MC_NETEXCP); SendData(datasock,l_wpk); C_PRINT("disconnected!\n"); this->Disconnect(datasock, 100, -31); } else if (datasock->m_cmdNum > m_checkWaring) { datasock->m_waringNum++; if (datasock->m_waringNum > 2) { printf("[%s] ddos suspected... ", datasock->GetPeerIP()); dbc::WPacket l_wpk = GetWPacket(); l_wpk.WriteCmd(CMD_MC_LOGIN); l_wpk.WriteShort(ERR_MC_NETEXCP); SendData(datasock,l_wpk); C_PRINT("disconnected!\n"); this->Disconnect(datasock, 100, -31); } } else if (datasock->m_recvbyteps > 1024){ printf("[%s] ddos suspected... ", datasock->GetPeerIP()); dbc::WPacket l_wpk = GetWPacket(); l_wpk.WriteCmd(CMD_MC_LOGIN); l_wpk.WriteShort(ERR_MC_NETEXCP); SendData(datasock, l_wpk); C_PRINT("disconnected!\n"); this->Disconnect(datasock, 100, -31); } } else { if (datasock->m_cmdNum < m_checkWaring) datasock->m_waringNum = 0; datasock->m_cmdNum = 0; datasock->m_lashTick = l_tick; } //} } Также для более "деревянного" фикса можно поработать с сетевым интерфейсом оборудования, любой начинающий сетевик может проанализировать и ввести правила, который не дадут сильно зафлудить
-
Пересмотрел историю переписки, проблема в том, что выполняя первый вход в игру эффекты не отображаются. Таблицы действительно тут не причем. Мы исправляли это модифицируя мод в SC_HookedLogin после выполнения SC_Login ждали 2 секунды и выполняли CS_BeginPlay. Автору темы предлагал решение bool CS_HookedConnect(const char* server_ip, unsigned short port, unsigned int timeout) { #ifdef _DEBUG std::cout << "CS_HookedConnect(" << server_ip << "," << port << "," << timeout << ")" << std::endl; #endif // DEBUG unsigned short portAddr = 0; std::string server_ipAddr = ""; std::string param = TrimString(server_ip); size_t p = param.find(':'); if (p != std::string::npos) { std::string name = TrimString(param.substr(0, p)); // IP Adress if (name.length()) { server_ipAddr = name; } std::string value = TrimString(param.substr(p + 1, param.length() - (p + 1))); // PORT if (value.length()) { try { port = static_cast<unsigned short>(std::stoul(value)); } catch (...) { } } } #ifdef _DEBUG std::cout << "* connection to IP: " << server_ipAddr.c_str() << " port: " << port << std::endl; #endif // DEBUG return CS_Connect(server_ipAddr.c_str(), port, timeout); } DWORD WINAPI CheckLoadRes(LPVOID lpThreadParameter) { #ifdef _DEBUG std::cout << "Waiting(true)" << std::endl; #endif Waiting(true); Sleep(g_ResumeTime); #ifdef _DEBUG std::cout << "Waiting(false)" << std::endl; #endif Waiting(false); CS_BeginPlay(g_ChaName.c_str()); g_Login = ""; g_Password = ""; return 0; } Я не помню почему так, но было связано с загрузкой эффектов. При чем это только при первом входе в игру
- 5 replies
-
- 1
-
- pkodev.mod.loader
- подключение
-
(and 4 more)
Tagged with:
-
Для таких "особенных личностей" рекомендую добавить модуль, который к каждому изображению подкрепляет вводный знак. Либо рекомендовать авторам на все изображение размещать их самостоятельно, в частности тебе.
-
Если после использования данного апдейта у вас появятся проблемы с отображением квестов/эффектов и других данных из таблиц. Имейте ввиду это связано с слишком быстрым входом в игру, все таблицы не успевают прогрузится.
- 5 replies
-
- 1
-
- pkodev.mod.loader
- подключение
-
(and 4 more)
Tagged with:
-
@patrick13 гц
- 3 replies
-
- 3
-
- форум
- сообщество
-
(and 1 more)
Tagged with:
-
В дополнение собирали и тестировали хоткеи, мб поможет. CTRL+D - скрыть/отобразить диалог (тот непонятный с вопросительными знаками) TAB - скрыть/отобразить функции редактора (слева панель) CTRL+F1 - Включить функциональность клавиш (без него не работают клавиши) CTRL+F3 - перемещение по сценами C - сбросить камеру для свободного перемещения HOME - Вернуть камеру к персонажу CTRL+INSERT - записывать видео (не работает) CTRL+P - включается какой-то режим patrol при зажатым CTRL бегает за мышкой CTRL+F4 - скрыть/отобразить весь интерфейс CTRL+K - отключает полностью рендер карты и объектов (после идёт краш) - хз зачем нужно CTRL+N - Меняет отображение CHeadSay (то что отображается над игроком) на "LogName" CTRL+L - Включает/отключает показ маршрута игрока (не работает) CTRL+T - При выполнении команд пишет красным по центру, так вот это отключает и включает. V - Что-то отображает/скрывает связано с объектами (похоже их сетку, но оно у нас не работает) F5 - открывает DEBUG LOG, но оно у нас не ботает F6 - сброс камеры (но оно не работает так как закомментировано) F7 - подсвечивает видимые объекты (похоже работает не так как нужно) F8 - скрывает/отображает все объекты на сцене 9 - Уменьшает зону видимости 0 - Увеличивает зону видимости F11 - включает/выключает отображение каких-то CharObj (не работает) X - Включить отображение пути (не знаю как работает) F2 - Выдаёт что-то секции (не знаю как работает) DELETE - удаляет выбранный объект H - скрывает выбранный объект F5 - скрывает/отображает высоту блоков (не работает) G - блокирует и снимает блокировку на выбор объектов (не знаю для чего) Q - Параметры окружающих (не работает) F9 - Обновляет карту высот (не работает)
-
Насколько я помню в редакторе проверки на выделенный объект делаются по названию ноды. В чтобы установить "кисть" для редактирования поверхности земли, нужно чтобы название выбранной ноды совпадало с названием указанным в StringSet. * Вырезка из собственных исходников, код может отличаться от публичного CTreeNode* parent = dynamic_cast<CTreeNode*>(select->GetParent()); if (!parent) return; item = dynamic_cast<CItem*>(parent->GetItem()); if (!item) return; if (std::strcmp(item->GetString(), CLanguageRecord::inst()->GetString(539)) == 0) // [539] "поверхность" { CGraph* p = dynamic_cast<CGraph*>(tree->GetSelect()->GetItem()); if (p) g_Editor.SetTerr(press, p->nTag); return; } if (std::strcmp(item->GetString(), CLanguageRecord::inst()->GetString(540)) == 0) // [540] "Строительство" { CGraph* p = dynamic_cast<CGraph*>(tree->GetSelect()->GetItem()); if (p) g_Editor.SetObj(press, p->nTag); } Судя по первому скриншоту название ноды установлено как "поверхность земли". Попробуй в StringSet изменить [539] "поверхность" на [540] "поверхность земли", должно помочь. Либо найти в scripts\lua\forms файл editor.clu там поищи там: поверхность земли \239\238\226\229\240\245\237\238\241\242\252 \231\229\236\235\232 замени на поверхность \239\238\226\229\240\245\237\238\241\242\252
-
Инструмент Инструмент для обрезания и склеивания карт
Kst replied to V3ct0r's topic in Пиратия: Разработка
lucky -> fortune lucky.load("C:\\pkodev\\Client\\map\\fortune"); -
Судя по коду, проблема связана с матрицами самой модели (часть тела). Есть функция CWorldScene::CursorFrame, она вызывается раз в фрейм (30 раз в секунду) и отвечает за определение действия при наведении на цель. Вырезка из собственных исходников с комментариями: CCharacter* pCha = HitSelectCharacter(nMouseX, nMouseY, enumSC_ALL); // Ищет актера в позициях мышки (любого) if (pCha) { if (GetMainCha() != pCha) { CSkillRecord* pSkill = GetMainCha()->GetDefaultSkillInfo(); // Если используется дефолтный скилл (бить рукой) if (pCha->getEvent()) { // с целью можно взаимодействовать CancelHoverFrame(); if (_HaveEventCursor(pCha->getEvent(), GetMainCha()->GetMainType())) { // у цели есть свой курсор _cMouseDown.SetEvent(pCha, pCha->getEvent()); } else { CCursor::I()->SetFrame(CCursor::stStop); } return; } if (pCha->IsNPC()) { // Если выбранная цель NPC CancelHoverFrame(); CCursor::I()->SetFrame(CCursor::stChat); pCha->SetColor(_bAttackRed, _bAttackGreen, _bAttackBlue); _cMouseDown.SetNpc(pCha); return; } if (pSkill && g_SkillUse.IsAttack(pSkill, GetMainCha(), pCha) || g_pGameApp->IsCtrlPress()) { // Цель можно атаковать или зажат CTRL if (pCha->IsMonster() && !g_pGameApp->IsCtrlPress() || !pCha->IsMonster()) { // Если это монстр, то только если CTRL не зажат HoverFrame(pCha); CCursor::I()->SetFrame(CCursor::stAttack); pCha->SetColor(_bAttackRed, _bAttackGreen, _bAttackBlue); _cMouseDown.SetAttackCha(pSkill, pCha, CGameApp::GetCurTick()); return; } } if (pCha->IsPlayer()) { // Если выбранная цель игрок HoverFrame(pCha); CCursor::I()->SetFrame(CCursor::stMouse); pCha->SetColor(_bAttackRed, _bAttackGreen, _bAttackBlue); if (g_pGameApp->IsAltPress()) { CCursor::I()->SetFrame(CCursor::stActive); _cMouseDown.SetFollow(pCha); } return; } } return; } Тут нас интересует CCharacter* pCha = HitSelectCharacter(nMouseX, nMouseY, enumSC_ALL); // Ищет актера в позициях мышки (любого) Внутри которой идёт поиск цели в указанных координатах nMouseX и MouseY и срабатывает метод LW_RESULT MPCharacter::HitTestPrimitive(lwPickInfo* info, const lwVector3* org, const lwVector3* ray) { return _physique->HitTestPrimitive(info, org, ray); } А сам метод _physique->HitTestPrimitive пробегает по максимальному количеству примитив у модели и смотрит вхождение в каждую. lwPhysique::HitTestPrimitive(lwPickInfo* info, const lwVector3* org, const lwVector3* ray) LW_MAX_SUBSKIN_NUM равен 10 for (DWORD i = 0; i < LW_MAX_SUBSKIN_NUM; i++) { if ((imp_generic = _obj_seq[i]) == 0) continue; if (LW_SUCCEEDED(imp_generic->HitTest(&x, org, ray))) { if ((obj_id == LW_INVALID_INDEX) || (xx.dis > x.dis)) { xx = x; obj_id = i; } } } Исходя из этого можно сделать вывод, что проблема в том что imp_generic->HitTest возвращает отрицательный результат => не может найти вхождение nMouseX и nMouseY (относительно модели персонажа) в матрицу модели (часть тела). LW_RESULT lwPrimitive::HitTest(lwPickInfo* info, const lwVector3* org, const lwVector3* ray) { LW_RESULT ret = LW_RET_FAILED; if (_helper_object == 0) goto __ret; lwIBoundingSphere* bs = 0; lwIBoundingBox* bb = 0; lwMatrix44* mat = _render_agent->GetGlobalMatrix(); if ((bs = _helper_object->GetBoundingSphere()) != 0) { if (LW_SUCCEEDED(bs->HitTest(info, org, ray, mat))) goto __addr_ret_ok; } if ((bb = _helper_object->GetBoundingBox()) != 0) { if (LW_SUCCEEDED(bb->HitTest(info, org, ray, mat))) goto __addr_ret_ok; } goto __ret; __addr_ret_ok: ret = LW_RET_OK; __ret: return ret; } Вероятнее всего проблема связана с тем что модель экспортировали не той версией, которую использует игра (разная структуру) исправить это можно если только переделать модель или пере экспортировать.
-
#define SHOWRSIZE 40 g_pGameApp->GetCurScene()->GetTerrain()->SetShowSize(SHOWRSIZE + 5, SHOWRSIZE + 5);
-
денег нет, но вы держитесь
-
I would not work with him, I cheated our players for money (google translate)
-
Оставим последнее слово за тобой, чтобы твоё опущенное ЭГО хоть капельку поднять)
-
Без причина безусловно, но если учитывать то что он слил нашу и не только нашу работу, то думаю иначе)
-
А кто угрожал приехать к тебе? Не выдумал ли ты себе это?
-
Да знаю, там нечего скрывать всё равно гулять начнёт
-
Слито в шару
-
Сливаю в шару сайт Kara-Online, так как в ближайшее время основной сайт будет переработан и этот потеряет актуальность. Автор данного сайта, он же бывший разработчик проект является e1mer, который недавно покинул проект когда мы поняли что его меркантильность нам не по душе. Совместно придя к сумме, после выплаты которого он обещал уйти из пиратии и оставить наш проект в покое дав возможность развиваться, но воспользовавшись некоторыми дырками взломал игроков и начал продавать предметы за реальные деньги (очень бессовестный поступок мужчины), по этому мы приняли решение слить его работу в шару. Не рекомендую ставить данный сайт, потому что в нём есть дырки и автор может попытаться вас взломать (это в его характере заложено), там много интересных наработок, которые можно использовать. Если кто-то сможет подробнее описать все механики приложив скриншоты готов скинуть .psd макет (если этого не делает автор). небольшой описание можно посмотреть тут: https://pkodev.net/index.php?/topic/4316 #
-
Пожелал бы удачи продаже, но из-за некоторых факторов: Выложу в шару после первой проданной копии, а тот кто купит положу через API "за подробностями в личной беседе"