void CGuildWarManager::AddUnionEnemyToGuild( CGuildUnion* friendlyUnion, CGuild* friendlyGuild ) { MSG_GUILD_LIST messageToFriendly; MSG_GUILD_LIST messageToEnemey; { messageToFriendly.Category = MP_GUILD_WAR; messageToFriendly.Protocol = MP_GUILD_WAR_START; messageToFriendly.mSize = 0; messageToEnemey.Category = MP_GUILD_WAR; messageToEnemey.Protocol = MP_GUILD_WAR_START; messageToEnemey.mSize = 1; MSG_GUILD_LIST::Data& dest = messageToEnemey.mData[ 0 ]; const GUILDINFO& source = friendlyGuild->GetInfo(); // 올바로 복사되는지 꼭 검사할 것 memcpy( &dest, &source, sizeof( source ) ); // 중간에 참전했으므로 선포금이 없다 dest.MarkName = 0; CGuildUnion* alliance = GUILDUNIONMGR->GetUnion( source.UnionIdx ); if( alliance ) { SafeStrCpy( dest.mUnionName, alliance->GetName(), sizeof( dest.mUnionName ) ); } else { dest.mUnionName[ 0 ] = 0; } } const DWORD friendlyGuildIndex = friendlyGuild->GetIdx(); std::list< sGFWENEMY* > enemeyList; GetEnemy( friendlyUnion->GetMasterGuildIdx(), enemeyList ); // 적대 길드 목록을 메시지에 담고, 신입 길드 또한 적 길드로 하여금 등록하게 한다. for( std::list< sGFWENEMY* >::const_iterator it = enemeyList.begin(); enemeyList.end() != it; ++it ) { const sGFWENEMY* enemyData = *it; const DWORD enemyGuildIndex = enemyData->dwEnemyGuildIdx; CGuild* enemyGuild = GUILDMGR->GetGuild( enemyGuildIndex ); if( ! enemyGuild ) { ASSERT( 0 ); continue; } // 적대 길드 정보를 담는다 // 신입 길드를 적으로 등록하도록 모든 적대 길드에게 보낸다. { MSG_GUILD_LIST::Data& dest = messageToFriendly.mData[ messageToFriendly.mSize++ ]; const GUILDINFO& source = enemyGuild->GetInfo(); // 제대로 복사되나 테스트할 것 memcpy( &dest, &source, sizeof( source ) ); // 중간에 참전하여 선포금이 없다 dest.MarkName = 0; CGuildUnion* alliance = GUILDUNIONMGR->GetUnion( source.UnionIdx ); if( alliance ) { SafeStrCpy( dest.mUnionName, alliance->GetName(), sizeof( dest.mUnionName ) ); } else { dest.mUnionName[ 0 ] = 0; } enemyGuild->SendMsgToAll( &messageToEnemey, messageToEnemey.GetSize() ); } // DB와 메모리에도 저장한다 { InsertGuildWar( friendlyGuildIndex, enemyGuildIndex, 0 ); RegistGuildWar( friendlyGuildIndex, enemyGuildIndex, 0 ); } // 다른 맵에도 등록하게 한다. { MSG_DWORD3 message; message.Category = MP_GUILD_WAR; message.Protocol = MP_GUILD_WAR_START_NOTIFY_TOMAP; message.dwData1 = friendlyGuildIndex; message.dwData2 = enemyGuildIndex; message.dwData3 = 0; g_Network.Send2AgentServer( ( char* )&message, sizeof( message ) ); } } if( messageToFriendly.mSize ) { // 적대 길드 목록을 다 담은 후 신입 길드에게도 보낸다 friendlyGuild->SendMsgToAll( &messageToFriendly, messageToFriendly.GetSize() ); } }
void CGuildWarManager::AddEnemyToFriendly( Alliance& friendlyMap, Alliance& enemyMap ) { MSG_GUILD_LIST messageToClient; messageToClient.Category = MP_GUILD_WAR; messageToClient.Protocol = MP_GUILD_WAR_START; messageToClient.mSize = 0; // 길드 1의 적(길드2) 전체 정보를 넣는다 for( Alliance::iterator it = enemyMap.begin(); enemyMap.end() != it; ++it ) { CGuild* enemy = it->first; const MONEYTYPE money = it->second; if( ! enemy ) { ASSERT( 0 ); continue; } MSG_GUILD_LIST::Data& dest = messageToClient.mData[ messageToClient.mSize++ ]; const GUILDINFO& source = enemy->GetInfo(); // 제대로 복사되나 꼭 확인하자. 좀 위험한 코드 memcpy( &dest, &source, sizeof( source ) ); dest.MarkName = money; CGuildUnion* allianace = GUILDUNIONMGR->GetUnion( source.UnionIdx ); if( allianace ) { SafeStrCpy( dest.mUnionName, allianace->GetName(), sizeof( dest.mUnionName ) ); } else { dest.mUnionName[ 0 ] = 0; } } MSG_DWORD3 messageToAgent; messageToAgent.Category = MP_GUILD_WAR; messageToAgent.Protocol = MP_GUILD_WAR_START_NOTIFY_TOMAP; // 길드 2의 적, 즉 길드 1의 편 전부에게 보낸다. for( Alliance::iterator it = friendlyMap.begin(); friendlyMap.end() != it; ++it ) { CGuild* friendly = it->first; const MONEYTYPE friendlyMoney = it->second; if( ! friendly ) { ASSERT( 0 ); continue; } friendly->SendMsgToAll( &messageToClient, messageToClient.GetSize() ); // 아군 길드 각각이 상대 길드들을 적으로 등록하게 한다. for( Alliance::iterator inner = enemyMap.begin(); enemyMap.end() != inner; ++inner ) { CGuild* enemy = inner->first; const MONEYTYPE enemyMoney = inner->second; if( ! enemy ) { ASSERT( 0 ); continue; } // 두 길드 모두 선포금을 지니고 있을때만 돈을 업데이트해야한다. 그렇지 않은 길드는 선포금을 건 당사자가 아니다. const MONEYTYPE money = ( friendlyMoney && enemyMoney ? friendlyMoney : 0 ) ; InsertGuildWar( friendly->GetIdx(), enemy->GetIdx(), money ); RegistGuildWar( friendly->GetIdx(), enemy->GetIdx(), money ); // 다른 맵에도 등록하게 한다. { messageToAgent.dwData1 = friendly->GetIdx(); messageToAgent.dwData2 = enemy->GetIdx(); messageToAgent.dwData3 = money; g_Network.Send2AgentServer( (char*)&messageToAgent, sizeof( messageToAgent ) ); } } } }