Jump to content

Kst

Advanced members
  • Content Count

    49
  • Joined

  • Last visited

  • Days Won

    5

Everything posted by Kst

  1. оно многопоточное?
  2. Новая версия 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; } //} } Также для более "деревянного" фикса можно поработать с сетевым интерфейсом оборудования, любой начинающий сетевик может проанализировать и ввести правила, который не дадут сильно зафлудить
  3. Пересмотрел историю переписки, проблема в том, что выполняя первый вход в игру эффекты не отображаются. Таблицы действительно тут не причем. Мы исправляли это модифицируя мод в 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; } Я не помню почему так, но было связано с загрузкой эффектов. При чем это только при первом входе в игру
  4. Для таких "особенных личностей" рекомендую добавить модуль, который к каждому изображению подкрепляет вводный знак. Либо рекомендовать авторам на все изображение размещать их самостоятельно, в частности тебе.
  5. Если после использования данного апдейта у вас появятся проблемы с отображением квестов/эффектов и других данных из таблиц. Имейте ввиду это связано с слишком быстрым входом в игру, все таблицы не успевают прогрузится.
  6. В дополнение собирали и тестировали хоткеи, мб поможет. 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 - Обновляет карту высот (не работает)
  7. Насколько я помню в редакторе проверки на выделенный объект делаются по названию ноды. В чтобы установить "кисть" для редактирования поверхности земли, нужно чтобы название выбранной ноды совпадало с названием указанным в 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
  8. Судя по коду, проблема связана с матрицами самой модели (часть тела). Есть функция 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; } Вероятнее всего проблема связана с тем что модель экспортировали не той версией, которую использует игра (разная структуру) исправить это можно если только переделать модель или пере экспортировать.
  9. #define SHOWRSIZE 40 g_pGameApp->GetCurScene()->GetTerrain()->SetShowSize(SHOWRSIZE + 5, SHOWRSIZE + 5);
  10. денег нет, но вы держитесь
  11. I would not work with him, I cheated our players for money (google translate)
  12. Не актуально, найдено.
  13. Оставим последнее слово за тобой, чтобы твоё опущенное ЭГО хоть капельку поднять)
  14. Без причина безусловно, но если учитывать то что он слил нашу и не только нашу работу, то думаю иначе)
  15. А кто угрожал приехать к тебе? Не выдумал ли ты себе это?
  16. Да знаю, там нечего скрывать всё равно гулять начнёт
  17. Сливаю в шару сайт Kara-Online, так как в ближайшее время основной сайт будет переработан и этот потеряет актуальность. Автор данного сайта, он же бывший разработчик проект является e1mer, который недавно покинул проект когда мы поняли что его меркантильность нам не по душе. Совместно придя к сумме, после выплаты которого он обещал уйти из пиратии и оставить наш проект в покое дав возможность развиваться, но воспользовавшись некоторыми дырками взломал игроков и начал продавать предметы за реальные деньги (очень бессовестный поступок мужчины), по этому мы приняли решение слить его работу в шару. Не рекомендую ставить данный сайт, потому что в нём есть дырки и автор может попытаться вас взломать (это в его характере заложено), там много интересных наработок, которые можно использовать. Если кто-то сможет подробнее описать все механики приложив скриншоты готов скинуть .psd макет (если этого не делает автор). небольшой описание можно посмотреть тут: https://pkodev.net/index.php?/topic/4316 #
  18. Пожелал бы удачи продаже, но из-за некоторых факторов: Выложу в шару после первой проданной копии, а тот кто купит положу через API "за подробностями в личной беседе"
×
×
  • Create New...