Server-Side Bots
Server-Side Bots은 AI로 구동되는 플레이어입니다. 때문에 게임 내에서 NPC가 아닌 일반 플레이어와 동등한 취급을 받습니다.
Contents
구성
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
game/server/hl2mp_bot_temp.cpp
Source SDK 2013버전 코드
파일 상단에 있는 #ifdef DEBUG
와 #endif
를 주석처리 하십시오.
dlls/hl2mp_dll/hl2mp_client.cpp
game/server/hl2mp_client.cpp
Source SDK 2013버전 코드
188행과 191행에 있는 #ifdef DEBUG
and #endif
코드를 주석처리 하십시오.
아마 편집해야할 부분은 다음과 같을 것입니다.:
#ifdef DEBUG extern void Bot_RunAll(); Bot_RunAll(); #endif
game_shared/hl2mp/hl2mp_gamerules.cpp
game/shared/hl2mp/hl2mp_gamerules.cpp
Source SDK 2013버전 코드
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.cpp
의 BotPutInServer
입니다. 주요 기능은 봇에 대한 규칙을 만들고, 봇이 있을 수 있도록 함께 포괄해주는 역할을 해줍니다. 대부분 당신은 이 곳에 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 은 플레이어가 봇들과 함께 놀 수 있는 플러그인입니다.