Server Side Bots:ko

From Valve Developer Community
Jump to: navigation, search
Note:이것은 Source SDK Base 2013 Multiplayer에서 완벽하게 구동됩니다.

Server-Side Bots은 AI로 구동되는 플레이어입니다. 때문에 게임 내에서 NPC가 아닌 일반 플레이어와 동등한 취급을 받습니다.

구성

server-side bot가 해야할 중요한 일은 각각의 서비 틱마다 플레이어 엔티티에 대한 사용자 입력을 시뮬레이션 해야한다는 것입니다. 때문에 CUserCmd구조를 채우고 CBasePlayer::PlayerRunCommand로 전송합니다. 이 CUserCmd 구조에는 일반 플레이어가 할 수 있는 모든 입력(이동방식, 누르고 있는 버튼, 바라볼 각도{시점})을 포함됩니다.

CUserCmd가 만들어지는동안 봇은 지능적으로 게임 내부에서 상호작용을 할 수 있는 코드가 있습니다. 예를 들어 다른 플레이어를 볼 수 있는지의 여부를 결정하기 위해 근처 플레이어 개체에 광선을 추가할 수도 있습니다. 이런 상호작용이 뭐가 됐든 이 코드가 해야할 것은 CUserCmd에게 "이것을 내가 하고 있는것"이라고 말해주어야 한다는 것입니다.

만들어 봅시다

방법 1

Source SDK에는 기본 봇 샘플이 제공됩니다. 작동 방식은 벽에 부딪힐 때까지 직진하고 부딪힌 이후에는 임의 방향으로 회전합니다. 이것은 플레이어 애니메이션을 테스트해야 할 경우에도 매우 유용합니다. 이를 활성화 시킬려면 SDK 실행화면에서 Create a Mod를 선택하고 Start a mod from scratch을 선택합시다.

방법 2

만약 당신이 Mod Half Life 2 MultiPlayer를 사용해야할 경우 3개의 파일을 수정해야합니다.

  • dlls/hl2mp_dll/hl2mp_bot_temp.cpp

파일 상단에 있는 #ifdef DEBUG#endif를 주석처리 하십시오.


  • dlls/hl2mp_dll/hl2mp_client.cpp

188행과 191행에 있는 #ifdef DEBUG and #endif코드를 주석처리 하십시오. 아마 편집해야할 부분은 다음과 같을 것입니다.:

#ifdef DEBUG
	extern void Bot_RunAll();
	Bot_RunAll();
#endif


  • game_shared/hl2mp/hl2mp_gamerules.cpp

38행과 40행, 그리고 835행과 859행(Source SDK 2007에서 HL2DM을 이용하는 경우에는 968행-990행)에 있는 #ifdef DEBUG#endif 코드를 주석처리 해줍시다.

아마 편집해야할 부분은 다음과 같을 것입니다.:

#ifdef DEBUG	
	#include "hl2mp_bot_temp.h"
#endif
#ifdef DEBUG

	// Handler for the "bot" command.
	void Bot_f()
	{		
		// Look at -count.
		int count = 1;
		count = clamp( count, 1, 16 );

		int iTeam = TEAM_COMBINE;
				
		// Look at -frozen.
		bool bFrozen = false;
			
		// Ok, spawn all the bots.
		while ( --count >= 0 )
		{
			BotPutInServer( bFrozen, iTeam );
		}
	}


	ConCommand cc_Bot( "bot", Bot_f, "Add a bot.", FCVAR_CHEAT );

#endif

다음 행을 검색합시다.

	ConCommand cc_Bot( "bot", Bot_f, "Add a bot.", FCVAR_CHEAT);

위에 있는 기존 코드를 밑에 있는 코드로 교체합시다.

	ConCommand cc_Bot( "bot", Bot_f, "Add a bot."/*, FCVAR_CHEAT */);


코드 수정은 완료했습니다. 이제 컴파일을 하고 생성된 Server.dll과 Client.dll파일을 당신의 모드 Bin폴더에 넣어주고 모드 콘솔창에 'bot'을 입력해 봇을 소환해보십시오.

명령어들

Server-Side Bots을 적용시킨 모드에서 다음과 같은 명령어들을 사용할 수 있습니다.:

bot_add 혹은 bot 봇을 소환시킵니다. (bot은 방법 2로 구현해야만 사용할 수 있습니다.)
bot_mimic <entity index> 0이 아닌 값으로 설정하면 모든 봇들이 지정된 엔티티의 CUserCmd를 모방합니다. (일반적으로 1의 값은 로컬 플레이어(본인)을 지정함). 어떤 방식으로든 움직이고 쏘면 봇들도 그렇게 할 것입니다.
bot_mimic_yaw_offset <angle> bot_mimic을 사용한 상태에서 해당 명령어를 사용하면 봇이 바라보는 관점을 설정할 수 있습니다. 180의 값은 플레이어를 마주하게끔 해주는 설정값이며 이외의 값은 각각 다른 곳을 바라볼 것입니다.

당신은 dlls\sdk\sdk_bot_temp.cpp에서 샘플 봇 코드를 찾을 수 있을 것입니다. 이 파일의 주요 기능은 Bot_Think입니다. 이를 봇 엔티티에 대한 각각의 서버 틱이라고 합니다. 이곳에는 봇이 벽에 부딪혔는지 감지해주는 코드가 포함되어 있습니다. 또한 다양한 콘솔 명령에 응답합니다. (여기 문서에는 없음). 맨 마지막에는 RunPlayerMove 명령어를 실행하면 CUserCmd 및 calls CBasePlayer::PlayerRunCommand를 호출합니다.

다른 흥미로운 기능으로는 sdk_bot_temp.cppBotPutInServer입니다. 주요 기능은 봇에 대한 규칙을 만들고, 봇이 있을 수 있도록 함께 포괄해주는 역할을 해줍니다. 대부분 당신은 이 곳에 CBotManager 코드를 복사하고 싶을 것이라 생각됩니다. 이 코드는 항상 적용할 수 있는 코드이기 때문입니다.(자신의 봇 클래스 이름으로)

더 유용한 코드

이것은 Tjoppen의 코드로써, 봇들을 리소폰 시키거나, 기존에 가야할 곳을 엉망으로 바꿔버릴 수도 있습니다.

void Bot_HandleRespawn( CSDKBot *pBot, CUserCmd &cmd )
{
	// try hitting my buttons occasionally
	if ( !pBot->IsAlive() && random->RandomInt( 0, 100 ) > 80 )
	{
		// flip button state
		cmd.buttons = (!random->RandomInt( 0, 1 ) == 0)?(cmd.buttons|IN_JUMP):0;
	}
}

Source Engine 2007 SDK의 HL2DM 모드에서는 hl2dm_bot_temp.cpp에 자동으로 구현되어 있을 것입니다.

무언가 더 필요하십니까?

더 많은 정보를 보실려면 AI Programming를 참조하십시오.

Botrix은 플레이어가 봇들과 함께 놀 수 있는 플러그인입니다.