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 ) );	
			}
		}
	}
}