⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 idbot.cpp

📁 idbot08源码
💻 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 + -