📄 idbot.cpp
字号:
#include "external\ClientCore.cpp"
#include "item.h"
#include "TextPatch.h"
#include "botfunc.h"
#include <list>
using namespace std;
#define VERSION_MAJOR 0
#define VERSION_MINOR 8
char _player_name[30];
char _logfile[MAX_PATH];
int _debug=0;
BOOL _is_ingame=FALSE;
BOOL _is_scaning=FALSE;
BOOL _is_droping=FALSE;
BOOL _is_stashing=FALSE;
//BOOL _stash_opened=FALSE;
CD2Item _item_on_cursor;
POINT _move_dest_p;
BOOL _is_move_to_cube;
list<CD2Item> _items;
BOOL _is_scaned[10][4];
//BOOL _invent_map[10][4];
BOOL _stash_map[6][8];
BOOL _cube_map[3][4];
BOOL _cube_id=0;
//RECT _id_area={0,0,5,3};
int _id_col_left=0;
int _id_col_right=5;
char _callback_cmd[256]="";
//char _notify_cmd[256]="";
BOOL _d2c_mode=FALSE;
BOOL _stash_item=TRUE;
int _game_count=0;
BOOL LoadConfig()
{
char filename[MAX_PATH];
if(!server->GetIniFileName("IDBot",filename,MAX_PATH))
return FALSE;
GetPrivateProfileString("Bot Setting","callback_cmd","",_callback_cmd,sizeof(_callback_cmd),filename);
// GetPrivateProfileString("Bot Setting","notify_cmd","",_notify_cmd,sizeof(_notify_cmd),filename);
_id_col_left=GetPrivateProfileInt("Bot Setting","id_col_left",0,filename);
_id_col_right=GetPrivateProfileInt("Bot Setting","id_col_right",5,filename);
// _auto_skip=GetPrivateProfileInt("Bot Setting","auto_skip",1,filename);
_stash_item=GetPrivateProfileInt("Bot Setting","stash_item",1,filename);
_d2c_mode=GetPrivateProfileInt("Bot Setting","d2c_mode",0,filename);
return TRUE;
}
BOOL FindFreeCellInStash(POINT& p,SIZE &size)
{
for(p.x=0;p.x<6;p.x++)
for(p.y=0;p.y<(_d2c_mode?4:8);p.y++)
{
int i,j;
BOOL enough=TRUE;
for(i=p.x;i<p.x+size.cx;i++)
for(j=p.y;j<p.y+size.cy;j++)
{
if(i>=6||j>=(_d2c_mode?4:8))
{
enough=FALSE;
break;
}
if(_stash_map[i][j])
{
enough=FALSE;
break;
}
}
if(enough) return TRUE;
}
return FALSE;
}
BOOL FindFreeCellInCube(POINT& p,SIZE &size)
{
if(!_cube_id) return FALSE;
for(p.x=0;p.x<3;p.x++)
for(p.y=0;p.y<4;p.y++)
{
int i,j;
BOOL enough=TRUE;
for(i=p.x;i<p.x+size.cx;i++)
for(j=p.y;j<p.y+size.cy;j++)
{
if(i>=3||j>=4)
{
enough=FALSE;
break;
}
if(_cube_map[i][j])
{
enough=FALSE;
break;
}
}
if(enough) return TRUE;
}
return FALSE;
}
BOOL IsStashFull()
{
int i,j;
for(i=0;i<6;i++)
{
for(j=0;j<(_d2c_mode?4:8);j++)
{
if(!_stash_map[i][j])
{
return FALSE;
}
}
}
if(_cube_id)
{
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
if(!_cube_map[i][j])
{
return FALSE;
}
}
}
}
return TRUE;
}
/*
int FreeInventoryCol()
{
int i,j;
int free=0;
for(i=_id_col_left;i<=_id_col_right;i++)
{
BOOL hi;
hi=FALSE;
for(j=0;j<4;j++)
{
if(_invent_map[i][j])
{
hi=TRUE;
break;
}
}
if(hi)continue;
free++;
}
return free;
}
*/
void do_move_item_to_stash()
{
if(!_is_stashing) return;
if(!_item_on_cursor.id)
{
//选一个可以放进stash的物品
list<CD2Item>::iterator i;
for(i=_items.begin();i!=_items.end();i++)
{
if( i->storage_id!=1) continue;
if( i->IsPotion()) continue;
if(i->pos_x<_id_col_left|| i->pos_x>_id_col_right) continue;
if(i->code_id!=7892834 && FindFreeCellInCube(_move_dest_p,i->GetItemSize()))
{
//D2Print("move to cube");
_is_move_to_cube=TRUE;
PickStorageItem(i->id);
return;
}
else if(FindFreeCellInStash(_move_dest_p,i->GetItemSize()))
{
// D2Print("move to stash(%d,%d)",_move_dest_p.x,_move_dest_p.y);
_is_move_to_cube=FALSE;
PickStorageItem(i->id);
return;
}
}
// D2PressKey(VK_ESCAPE,FALSE);
// PostMessage(server->FindMyD2WndHandle(), WM_KEYDOWN, VK_ESCAPE,0 );
// _stash_opened=FALSE;
_is_stashing=FALSE;
//交出控制权
if(_callback_cmd[0])
{
D2Print("----------------------------");
D2Print(_callback_cmd);
server->GameCommandLine(_callback_cmd);
}
}
else
{
Sleep(100);
if(_is_move_to_cube) PutCursorItemInCube(_cube_id,_item_on_cursor.id);
else PutCursorItemInStash(_item_on_cursor.id,_move_dest_p);
}
}
void do_drop_useless_items()
{
// D2Print("do_drop_useless_items()");
if(!_is_droping) return;
if(!_item_on_cursor.id)
{
list<CD2Item>::iterator i;
for(i=_items.begin();i!=_items.end();i++)
{
if(i->storage_id!=1) continue;
if(i->code_id==7892834) continue;//cube
if(i->pos_x<_id_col_left|| i->pos_x>_id_col_right) continue;
if(!i->isUselessItem) continue;
PickStorageItem(i->id);
return;
}
_is_droping=FALSE;
if(_stash_item&& !IsStashFull())
{
_is_stashing=TRUE;
do_move_item_to_stash();
}
else
{
//交出控制权
D2Print("----------------------------");
if(_callback_cmd[0])
{
D2Print(_callback_cmd);
server->GameCommandLine(_callback_cmd);
}
}
}
else
{
Sleep(100);
DropCursorItem(_item_on_cursor.id);
}
}
void do_scan_items()
{
// D2Print("do_scan_items()");
if(!_is_scaning) return;
if(!_item_on_cursor.id)
{
// D2Print("!_item_on_cursor.id");
list<CD2Item>::iterator i;
for(i=_items.begin();i!=_items.end();i++)
{
if( i->storage_id!=1) continue;
if(i->code_id==7892834) continue;//cube
if(_is_scaned[i->pos_x][i->pos_y])continue;
if(i->IsPotion())continue;
if(i->pos_x<_id_col_left|| i->pos_x>_id_col_right) continue;
PickStorageItem(i->id);
return;
}
_is_scaning=FALSE;
_is_droping=TRUE;
do_drop_useless_items();
}
else
{
Sleep(100);
//标记已经检视过
_is_scaned[_item_on_cursor.pos_x][_item_on_cursor.pos_y]=1;
//将物品放回原处
PutCursorItemInInventory(_item_on_cursor.id,_item_on_cursor.pos_x,_item_on_cursor.pos_y);
}
}
//////////////////////////////////////////////////////////////////////
// CLIENTINFO
// -------------------------------------------------------------------
// Tell us a little about this module.
//////////////////////////////////////////////////////////////////////
CLIENTINFO
(
VERSION_MAJOR,VERSION_MINOR, // Module version (Major, Minor)
"Niren", // Author
"bbs.battlecn.net", // url (http:// is appended)
"Drop useless items automatically.", // Short module description
"stove@eyou.com" // Author eMail
)
BOOL PRIVATE OnGameCommandDump(char** argv, int argc)
{
BotWriteLog("# ITEM LIST (%s):",_player_name);
list<CD2Item>::iterator i;
for(i=_items.begin();i!=_items.end();i++)
i->WriteToLog();
BotWriteLog("# END OF ITEM LIST (%s).",_player_name);
return TRUE;
}
BOOL PRIVATE OnGameCommandDebug(char** argv, int argc)
{
if(argc==3)
{
_debug=atoi(argv[2]);
}
else _debug=!_debug;
if(_debug) D2Print("Debug on.");
else D2Print("Debug off.");
return TRUE;
}
/*BOOL PRIVATE OnGameCommandD2c(char** argv, int argc)
{
if(argc==3)
{
_d2c_mode=atoi(argv[2]);
}
else _d2c_mode=1;
if(_d2c_mode) D2Print("Set to D2C mode(6*4 stash).");
else D2Print("Set to D2X mode(6*8 stash).");
return TRUE;
}
*/
BOOL PRIVATE OnGameCommandId(char** argv, int argc)
{
if(_is_scaning||_is_droping||_is_scaning)
{
D2Print("$$1 IDBot is busy.");
return FALSE;
}
_item_on_cursor.id=0;
memset(_is_scaned,0,sizeof(_is_scaned));
_is_scaning=TRUE;
// D2Print("d2c=%d",_d2c_mode);
//memset(_callback_cmd,0,sizeof(_callback_cmd));//[0]=0;
// _callback_cmd[0]=0;
// D2Print("argc=%d",argc);
switch(argc)
{
case 4:
_id_col_left=atoi(argv[2]);
_id_col_right=atoi(argv[3]);
break;
}
// D2Print("{%d,%d,%d,%d} %s",_id_area.left,_id_area.top,_id_area.right,_id_area.bottom,_callback_cmd);
D2Print("$$4IDBot v%d.%02d: $$0Id {$$3%d,%d$$0} $$3%s",VERSION_MAJOR,VERSION_MINOR
,_id_col_left,_id_col_right,_callback_cmd);
// D2Print("----------------------------");
// Deposit(_gold);
do_scan_items();
return TRUE;
}
MODULECOMMANDSTRUCT ModuleCommands[]=
{
{ // The 'help' command is implemented in ClientCore.cpp and
// should not need to be changed.
"help",
OnGameCommandHelp,
"help
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -