static bool ModGetLine( a_window *wnd, int row, int piece, wnd_line_piece *line ) { mod_handle handle; mod_window *mod = WndMod( wnd ); modinfo *info; if( row >= ModListNumRows( ModList( mod ) ) ) return( FALSE ); handle = ModListMod( ModList( mod ), row ); line->tabstop = FALSE; switch( piece ) { case PIECE_SOURCE: info = &mod->info[ row ]; info->source = ModHasSourceInfo( handle ); info->open = OpenGadget( wnd, line, handle, info->source ); return( TRUE ); case PIECE_MODULE: line->indent = MaxGadgetLength; line->tabstop = TRUE; ModListName( ModList( mod ), row, TxtBuff ); line->text = TxtBuff; return( TRUE ); case PIECE_IMAGE: line->indent = mod->max_modlen + MaxGadgetLength; line->text = ModImageName( handle ); return( TRUE ); default: return( FALSE ); } }
static void ModMenuItem( a_window *wnd, unsigned id, int row, int piece ) { address addr; mod_handle handle; mod_window *mod = WndMod( wnd ); piece=piece; handle = NO_MOD; addr = NilAddr; if( ModListNumRows( ModList( mod ) ) != 0 && row >= 0 ) { handle = ModListMod( ModList( mod ), row ); if( handle != NO_MOD ) { addr = ModFirstAddr( handle ); } } switch( id ) { case MENU_INITIALIZE: WndMenuGrayAll( wnd ); if( handle != NO_MOD ) { WndMenuEnable( wnd, MENU_MODULES_BREAK_SET_ALL, TRUE ); WndMenuEnable( wnd, MENU_MODULES_BREAK_CLEAR_ALL, TRUE ); WndMenuEnable( wnd, MENU_MODULES_ASSEMBLY, !IS_NIL_ADDR( addr ) ); WndMenuEnable( wnd, MENU_MODULES_FUNCTIONS, TRUE ); if( ModHasSourceInfo( handle ) ) { WndMenuEnable( wnd, MENU_MODULES_SOURCE, TRUE ); } } WndMenuEnable( wnd, MENU_MODULES_SHOW_ALL, TRUE ); WndMenuCheck( wnd, MENU_MODULES_SHOW_ALL, mod->all_modules ); break; case MENU_MODULES_BREAK_SET_ALL: BreakAllModEntries( handle ); break; case MENU_MODULES_BREAK_CLEAR_ALL: ClearAllModBreaks( handle ); break; case MENU_MODULES_SOURCE: if( IS_NIL_ADDR( addr ) ) { ModName( handle, TxtBuff, TXT_LEN ); WndFileInspect( TxtBuff, FALSE ); } else { WndSrcInspect( addr ); } break; case MENU_MODULES_ASSEMBLY: WndAsmInspect( addr ); break; case MENU_MODULES_FUNCTIONS: WndFuncInspect( handle ); break; case MENU_MODULES_SHOW_ALL: mod->all_modules = !mod->all_modules; ModInit( wnd ); break; } }
// 客户端,收到了某个用户的请求,说明与此用户已经直通 bool CSrv_NAT::PU_HelloRequest(DWORD dwIP, WORD wPort, PPACK pPack) { if (pPack->wCheckSum != pPack->GetCheckNum()) { TRACE("PU_HelloRequest checknum Error %d\n", pPack->dwId); m_BuffPool.Free(pPack); return false; } USER_MAP::iterator user_iter = m_UserMap.find(pPack->dwAckId); if (m_UserMap.end() != user_iter) { (*user_iter).second.byCommState = COMMUNICED; ModList(pPack->dwAckId, 5, _T("直通")); // 回复应答 pPack->dwId = m_PackId.GetPackId(); pPack->wProtoNum = PT_U_U_HELLO_ANSWER; pPack->dwAckId = m_dwMyId; m_QueueOut.AddPack(m_pMyUdpCC, dwIP, wPort, pPack->GetPackLen(), pPack); return true; } else { m_BuffPool.Free(pPack); return false; } }
static void ModInit( a_window *wnd ) { mod_window *mod = WndMod( wnd ); int size; ModListFree( ModList( mod ) ); ModListAddModules( ModList( mod ), mod->handle, mod->all_modules ); WndFree( mod->info ); mod->info = NULL; size = sizeof( modinfo ) * ModListNumRows( ModList( mod ) ); if( size != 0 ) { mod->info = WndAlloc( size ); memset( mod->info, 0, size ); } ModCalcIndent( wnd ); }
void cForgeHandshake::AugmentServerListPing(Json::Value & a_ResponseValue) { auto ProtocolVersion = m_Client->GetProtocolVersion(); auto & Mods = cRoot::Get()->GetServer()->GetRegisteredForgeMods(ProtocolVersion); if (Mods.empty()) { return; } LOGD("Received server ping from version: %d", ProtocolVersion); Json::Value Modinfo; Modinfo["type"] = "FML"; Json::Value ModList(Json::arrayValue); for (auto & item: Mods) { Json::Value Mod; Mod["modid"] = item.first; Mod["version"] = item.second; ModList.append(Mod); } Modinfo["modList"] = ModList; a_ResponseValue["modinfo"] = Modinfo; }
static void ModCalcIndent( a_window *wnd ) { gui_ord extent,max_extent; int i,size; mod_window *mod = WndMod( wnd ); size = ModListNumRows( ModList( mod ) ); max_extent = 0; for( i = 0; i < size; ++i ) { ModListName( ModList( mod ), i, TxtBuff ); extent = WndExtentX( wnd, TxtBuff ); if( extent > max_extent ) max_extent = extent; } mod->max_modlen = max_extent + WndMidCharX( wnd ); WndNoSelect( wnd ); WndRepaint( wnd ); }
static void ModSetCurrent( a_window *wnd ) { int i; mod_window *mod = WndMod( wnd ); wnd_row row; int piece; WndGetCurrent( wnd, &row, &piece ); if( row != WND_NO_ROW && ModListMod( ModList( mod ), row ) == ContextMod ) { return; } for( i = 0; i < ModListNumRows( ModList( mod ) ); ++i ) { if( ModListMod( ModList( mod ), i ) == ContextMod ) { WndMoveCurrent( wnd, i, PIECE_MODULE ); } } }
static void ModRefresh( a_window *wnd ) { int i; mod_window *mod = WndMod( wnd ); modinfo *info; if( WndFlags & UP_SYM_CHANGE ) { ModInit( wnd ); } if( WndFlags & UP_OPEN_CHANGE ) { for( i = 0; i < ModListNumRows( ModList( mod ) ); ++i ) { info = &mod->info[ i ]; info->open = CheckOpenGadget( wnd, i, info->open, ModListMod( ModList( mod ), i ), info->source, PIECE_SOURCE ); } } if( WndFlags & (UP_CSIP_CHANGE+UP_STACKPOS_CHANGE) ) { ModSetCurrent( wnd ); } }
static void ModModify( a_window *wnd, int row, int piece ) { if( piece == PIECE_SOURCE ) { if( ModHasSourceInfo( ModListMod( ModList( WndMod( wnd ) ), row ) ) ) { ModMenuItem( wnd, MENU_MODULES_SOURCE, row, piece ); } else { ModMenuItem( wnd, MENU_MODULES_ASSEMBLY, row, piece ); } WndDirtyCurr( wnd ); WndNewCurrent( wnd, row, PIECE_TABSTOP ); } else { WndFirstMenuItem( wnd, row, piece ); } }
static bool ModEventProc( a_window * wnd, gui_event gui_ev, void *parm ) { mod_window *mod = WndMod( wnd ); parm=parm; switch( gui_ev ) { case GUI_INIT_WINDOW: ModListInit( ModList( mod ), NULL ); mod->info = NULL; WndSetKey( wnd, PIECE_MODULE ); ModSetOptions( wnd ); ModSetCurrent( wnd ); return( TRUE ); case GUI_RESIZE: ModCalcIndent( wnd ); return( TRUE ); case GUI_DESTROY : ModListFree( ModList( mod ) ); WndFree( mod->info ); WndFree( mod ); return( TRUE ); } return( FALSE ); }
// 服务器,通知各个客户端有用户退出 bool CSrv_NAT::PS_NotfiyUserOutRoom(PPACK pPack) { if (pPack->wCheckSum != pPack->GetCheckNum()) { TRACE("PS_NotfiyUserOutRoom checknum Error %d\n", pPack->dwId); m_BuffPool.Free(pPack); return false; } USERID_ROOMNUM *pUserIdRoomNum = (USERID_ROOMNUM*)&(pPack->szData[0]); pPack->wProtoNum = PT_S_U_OUT_ROOM_USER; ModList(pUserIdRoomNum->dwUserId, 5, _T("掉线")); S_Broadcast(pUserIdRoomNum->wRoomNum, 1, pPack); return false; }
// 服务器,通知各个客户端有用户退出(由心跳线程调用,用户数据由心跳线程删除) bool CSrv_NAT::S_NotfiyUserOutRoom(DWORD dwUserId, WORD wRoomNum, USER_MAP* pUserMap) { if (NULL == pUserMap) return false; PPACK pPack = (PPACK)m_BuffPool.GetBuff(); pPack->dwFlag = PACKFLAG; pPack->dwAckId = 0; pPack->dwId = m_PackId.GetPackId(); pPack->wProtoNum = PT_S_U_OUT_ROOM_USER; pPack->dwDataLen = (WORD)sizeof(USERID_ROOMNUM); USERID_ROOMNUM *pUserIdRoomNum = (USERID_ROOMNUM*)&(pPack->szData[0]); pUserIdRoomNum->dwUserId = dwUserId; pUserIdRoomNum->wRoomNum = wRoomNum; pPack->SetCheckNum(); ModList(dwUserId, 5, _T("掉线")); int nCount = (int)pUserMap->size(); USER_MAP::iterator delete_user_iter; if (0 != nCount) { // 向房间内的所有人通知此用户退出 USER_MAP::iterator user_iter = pUserMap->begin(); for (; user_iter != pUserMap->end(); ++user_iter) { pPack->dwId = m_PackId.GetPackId(); for (int i = 0; i < 2; i++) { m_QueueOut.AddPack(m_pMyUdpCC, (*user_iter).second.lPublicIp, (*user_iter).second.wPublicPort, pPack->GetPackLen(), pPack); ::Sleep(2); } } return true; } else { m_BuffPool.Free(pPack); return false; } }
// 客户端,连接应答,说明已经直通 bool CSrv_NAT::PU_HelloAnswer(DWORD dwIP, WORD wPort, PPACK pPack) { if (pPack->wCheckSum != pPack->GetCheckNum()) { TRACE("PU_HelloRequest checknum Error %d\n", pPack->dwId); m_BuffPool.Free(pPack); return false; } USER_MAP::iterator user_iter = m_UserMap.find(pPack->dwAckId); if (m_UserMap.end() != user_iter) { (*user_iter).second.byCommState = COMMUNICED; ModList(pPack->dwAckId, 5, _T("直通")); } m_BuffPool.Free(pPack); return true; }
// 客户端,收到某用户退出 bool CSrv_NAT::PU_UserOutRoom(DWORD dwIP, WORD wPort, PPACK pPack) { if (pPack->wCheckSum != pPack->GetCheckNum()) { TRACE("PU_UserOutRoom checknum Error %d\n", pPack->dwId); m_BuffPool.Free(pPack); return false; } USERID_ROOMNUM *pUserIdRoomNum = (USERID_ROOMNUM*)&(pPack->szData[0]); m_UserMap.erase(pUserIdRoomNum->dwUserId); ModList(pUserIdRoomNum->dwUserId, 5, _T("掉线")); m_RecvMap.DelUser(pUserIdRoomNum->dwUserId); m_BuffPool.Free(pPack); return true; }
static int ModNumRows( a_window *wnd ) { return( ModListNumRows( ModList( WndMod( wnd ) ) ) ); }