Jump to content

Welcome to [ iT ] Forums
Register now to gain access to all of our features. Once registered and logged in, you will be able to create topics, post replies to existing threads, give reputation to your fellow members, get your own private messenger, post status updates, manage your profile and so much more. If you already have an account, login here - otherwise create an account for free today!
Cộng đồng Âm nhạc Việt Nam

Hình ảnh

Support AUTO TGHM

- - - - -

  • Please log in to reply
332 replies to this topic

#61
KAKO

KAKO

    Trình độ A CSTH

  • Advance Member
  • PipPip
  • 160 Bài Viết:
bác nào biet VC 2008 có thể sửa cho em đoạn code này dc ko?

static bool LetMeReadMonterMapInfo(LPCWSTR strWinTitle,prtMonsterInfo ptr,int &countMob)
	{
		
		HWND windowHandle = FindWindow(0,strWinTitle);
		DWORD dwProcessID;
		GetWindowThreadProcessId(windowHandle,&dwProcessID);
		int m_iMonTotal = 0;


		MonsterInfo tempMonster;
		prtMonsterInfo tmpMonster = new MonsterInfo[500];
		
		HANDLE m_hProcess = OpenProcess(PROCESS_VM_READ, FALSE, dwProcessID);
		if (!m_hProcess)
			return false;

		LPBYTE ECXI, tmp2, eax;
		int tmp1, MonsterCount;
		if(!ReadProcessMemory ( m_hProcess,(LPCVOID)PWO_BASE_ADD,(LPVOID)&ECXI,4,NULL))
			return false;
		if(!ReadProcessMemory ( m_hProcess,(LPCVOID)(ECXI + 0x8),(LPVOID)&eax,4,NULL))
			return false;
		if(!ReadProcessMemory ( m_hProcess,(LPCVOID)(eax + 0x24),(LPVOID)&ECXI,4,NULL))
			return false;
		if(!ReadProcessMemory ( m_hProcess,(LPCVOID)(ECXI + 0x24),(LPVOID)&tmp1,4,NULL))
			return false;
		if(!ReadProcessMemory ( m_hProcess,(LPCVOID)(ECXI + 0x18),(LPVOID)&tmp2,4,NULL))
			return false;
		if(!ReadProcessMemory ( m_hProcess,(LPCVOID)(ECXI + 0x14),(LPVOID)&MonsterCount,4,NULL))
			return false;
		int i=0;
		while (i<768)
		{

		   if(!ReadProcessMemory(m_hProcess,(LPCVOID)(tmp2 + 4 * i),(LPVOID)&eax,4,NULL))
			   return false;
			if(eax > 0)
			{
				if(!ReadProcessMemory(m_hProcess, (LPCVOID) (eax + 0x4), (LPVOID)&eax, 4, 0))
					return false;
				tempMonster.MonsterAdd = eax;
				
				if(!ReadProcessMemory(m_hProcess, (LPCVOID) (eax + 0x12C), (LPVOID)&(tempMonster.MonsterHP), 4, 0))
					return false;
				if(!ReadProcessMemory(m_hProcess, (LPCVOID) (eax + 0x154), (LPVOID)&(tempMonster.MonsterMaxHP), 4, 0))
					return false;
				if(!ReadProcessMemory(m_hProcess, (LPCVOID) (eax + 0x124), (LPVOID)&(tempMonster.MonsterLV), 4, 0))
					return false;
				if(!ReadProcessMemory(m_hProcess, (LPCVOID) (eax + 0x3C), (LPVOID)&(tempMonster.MonsterX), 4, 0))
					return false;
				if(!ReadProcessMemory(m_hProcess, (LPCVOID) (eax + 0x44), (LPVOID)&(tempMonster.MonsterY), 4, 0))
					return false;
				if(!ReadProcessMemory(m_hProcess, (LPCVOID) (eax + 0x40), (LPVOID)&(tempMonster.MonsterZ), 4, 0))
					return false;
				if(!ReadProcessMemory(m_hProcess, (LPCVOID) (eax + 0x25c), (LPVOID)&(tempMonster.MonsterDistance), 4, 0))
					return false;
				if(!ReadProcessMemory(m_hProcess, (LPCVOID) (eax + 0x120), (LPVOID)&(tempMonster.MonsterClass), 4, 0))
					return false;
				if(!ReadProcessMemory(m_hProcess, (LPCVOID) (eax + 0xB4), (LPVOID)&(tempMonster.MonsterType), 4, 0))
					return false;
				if(!ReadProcessMemory(m_hProcess, (LPCVOID) (eax + 0x11C), (LPVOID)&(tempMonster.MonsterID), 4, 0))
					return false;
				if(!ReadProcessMemory(m_hProcess, (LPCVOID) (eax + 0x238), (LPVOID)&ECXI, 4, 0))
					return false;
				if(!ReadProcessMemory(m_hProcess, (LPCVOID) (ECXI), (LPVOID)&(tempMonster.MonsterName), 64 , 0))
					return false;
				
				if (tempMonster.MonsterLV != 0 )
				{
					tmpMonster[m_iMonTotal] = tempMonster;					
					m_iMonTotal++;
				}
			  }
			 i++;
			 if(i >= tmp1)
				 break;
		}
	
		CloseHandle(m_hProcess);
		
		//---------------Sort Monster List (Distance)--------------------------------
		
		float minDis=1000;
		int indextmp=0;
		for (int id=0;id< m_iMonTotal;id++){
			for (int a =0; a<m_iMonTotal; a++ ){
				if((minDis > tmpMonster[a].MonsterDistance) && tmpMonster[a].blsort ){
					minDis=tmpMonster[a].MonsterDistance;			
					indextmp=a;
				}
					
			}
			ptr[id]=tmpMonster[indextmp];
			tmpMonster[indextmp].blsort = false;
			minDis=1000;
			indextmp=0;		
		}
		delete(tmpMonster);
		
		
		countMob=m_iMonTotal;
		return true;
	}


#62
KAKO

KAKO

    Trình độ A CSTH

  • Advance Member
  • PipPip
  • 160 Bài Viết:
ko ai giúp em sửa đoạn code trên sao?

#63
autoeasy

autoeasy

    Trung cấp CSTH

  • Advance Member
  • PipPipPip
  • 285 Bài Viết:
- Thứ 1 : đưa ra bài toán mà thiếu yêu cầu hok biết cần sửa cái gì
- Thứ 2 : phân tích thử thì đây là hàm tìm list thông tin mob, lưu vào 1 mảng, sắp xếp mảng, đồng thời trả về tổng số con mob
Tuy nhiên giải thuật này chậm ở phần sắp xếp và theo thực tế thì mob di chuyển lung tung nên có thể kg target con gần nhất

Bài viết này được chỉnh sửa bởi autoeasy: 07 February 2009 - 04:33 PM

my auto : autotghm

*^.^*

#64
jollyjoker

jollyjoker

    Aishiteru P mochiron

  • Advance Member
  • PipPipPipPipPip
  • 1287 Bài Viết:
Tình hình là ko read dc mặc dù các ofset va base ko sai. jolly vừa send cho mèo rồi, hy vọng là có kết quả :jeje:
Love will grow and nothing come in the way
It's true that love is here to stay
All we have to do to face tomorrow

#65
jollyjoker

jollyjoker

    Aishiteru P mochiron

  • Advance Member
  • PipPipPipPipPip
  • 1287 Bài Viết:
Đây là hàm Call NPC trên VC++, jolly post hộ TuiDayNe

@TuiDayNe: jolly đã thông báo để admin đưa bạn lên làm member, bạn có thể post bài rùi đấy

//---------------------------------------------------------------------------------
//Hàm gọi NPC để mở hộp thoại, ngôn ngữ VC++ 6.0, đã test, chạy tốt.
//Rất giống SelectTarget, chỉ khác địa chỉ Call
//Đúng với phiên bản TGHM 44/46
//---------------------------------------------------------------------------------
static DWORD WINAPI NPC_OpenMenu(LPCVOID lpParam)
{
DWORD *Param = (DWORD*)lpParam;
DWORD NpcId = *(Param + 0);// ==> NPC ID

__try
{
_asm
{
mov edx, 0x0095b404;
mov edx, dword ptr[edx];
push NpcId;
mov ecx, dword ptr[edx+0x20];
add ecx, 0xEC;
mov edx, 0x0059E890;
call edx;
}
}
__except(1)
{
}
return 0;
}
//---------------------------------------------------------------------------------

Love will grow and nothing come in the way
It's true that love is here to stay
All we have to do to face tomorrow

#66
meokhung1980

meokhung1980

    Trình độ A CSTH

  • Advance Member
  • PipPip
  • 142 Bài Viết:

- Thứ 1 : đưa ra bài toán mà thiếu yêu cầu hok biết cần sửa cái gì
- Thứ 2 : phân tích thử thì đây là hàm tìm list thông tin mob, lưu vào 1 mảng, sắp xếp mảng, đồng thời trả về tổng số con mob
Tuy nhiên giải thuật này chậm ở phần sắp xếp và theo thực tế thì mob di chuyển lung tung nên có thể kg target con gần nhất


Về phần này mình xin giải thích như sau:
Về doan sort mob là rất cần thiết và vì thực tế khi bãi train thì số lượng mob đếm được không vượt quá 20-30 con cho nên về tốc độ là hầu như ko bị ảnh hưởng
Thứ nữa là hàm này call trước khi hàm target mob nên sẽ luôn target dc mob thỏa điều kiện và có dis nhỏ nhất.
Về chuyện KAKO ko hiển thị dc mob thì do hàm này đọc thông tin mob sau đó trả về một mảng
có thể do KAKO declare mảng mob trạng thái cục bộ do vậy khi rời khỏi function sẽ kô lưu lại dc giá trị, KAKO cần phải dec mảng này trạng thái toàn cục.
YM!: [email protected]
Email: [email protected]
GAME CHAR: ThiênXứng (Thích Khách - Kim Bảo)
-------------------------------
-= Luôn luôn lắng nghe... lâu lâu mới hiểu =-

#67
TuiDayNe

TuiDayNe

    Căn bản tin học tốt

  • Advance Member
  • Pip
  • 63 Bài Viết:
@KAKO:
A/Đoạn code này chạy chậm (nếu chạy được, chưa test :jeje:) vì lý do sau:
-Trong vòng lặp:
i=0;
while(i<768)
{
.....
.....

i++;
}
mình đã duyệt qua tất cả Monster hiện có để đưa vào bảng tmpMonster[].
-Sau đó lại duyệt lại để chọn ra Monster có minDis bằng 2 vòng lặp lồng nhau:
for(id=0; id<m_iMonTotal; id++)
{
for(a=0; a<m_iMonTotal; a++)
{
.......
}
}

B/Cách tốt hơn là:
-Mỗi khi cần tìm một mục tiêu mới thì gọi hàm này.
-Nhưng ngay trong vòng lặp while(i<768) chỉ ghi nhớ 1 monster có MonsterDistance nhỏ nhất.
-Chọn Monster đó làm mục tiêu,
-Không cần lưu các kết quả vào bảng tmpMonster[],
-Và do vậy cũng không cần chạy tiếp 2 vòng for lồng nhau (để short và chọn ra minDis).

C/Lỗi kỹ thuật tại dòng lệnh ở cuối phần short:
....
countMob = m_iMonTotal;
return true;

Vì tham số truyền cho hàm là (......, int &countMob)
nên lệnh đúng phải là:
*countMob = m_iMonTotal;

#68
KAKO

KAKO

    Trình độ A CSTH

  • Advance Member
  • PipPip
  • 160 Bài Viết:
mình chỉ mới tự tìm hiểu lập trình thôi.
nên kô thể biết làm cách nào để dec toàn cục. mèo hay jolly chỉ dùm mình với.

#69
TuiDayNe

TuiDayNe

    Căn bản tin học tốt

  • Advance Member
  • Pip
  • 63 Bài Viết:

mình chỉ mới tự tìm hiểu lập trình thôi.
nên kô thể biết làm cách nào để dec toàn cục. mèo hay jolly chỉ dùm mình với.


//Các biến khai báo bên ngoài hàm là biến toàn cục, hàm nào cũng nhìn thấy
//Ví dụ:
int Bien1,Bien2;
long Bien3, Bien4;
DWORD Bien5, Bien6;
float Bien7;
//-------------------------------
//Các biến khai báo bên trong một hàm nào đó, là biến ko toàn cục, chỉ trong nội bộ hàm đó nhìn thấy
//Ví dụ:
void HamSo1()
{
int Bien8;
DWORD Bien9;

return;
}
//-------------------------------

#70
TuiDayNe

TuiDayNe

    Căn bản tin học tốt

  • Advance Member
  • Pip
  • 63 Bài Viết:
//Tiếp theo bài trước tôi đã nói về tìm mục tiêu gần nhất chỉ bằng một vòng lặp while(i<768),
//đây là logic chi tiết hơn:
DWORD LayMonsterIDGanNhat()
{
short i;
float minDist;
DWORD MucTieuID;//Là ID của mục tiêu gần nhất sẽ được chọn ra khi vòng while kết thúc
//----------------------

minDist = MinDistMax;
//MinDistMax là trị do người sử dụng nhập vào, giới hạn phạm vi cần tìm mục tiêu, ví dụ là 60 mét

i = 0;
MucTieuID = 0;
while(i<768)
{
//1.Đọc bộ nhớ để lấy thông tin về Monster: MonsterID, MonsterDistance,...
....

//2.So sánh MonsterDistance với minDist, ghi nhớ một (chỉ một) ID
if(MonsterDistance <= minDist)
{
//Ghi nhớ ID:
MucTieuID = MonsterID;

//Hiệu chỉnh lại minDist
minDist = MonsterDistance;
}

++i;
}

//Chỉ có vậy thôi. Khi vòng while này kết thúc, ta sẽ trả về trị MucTieuID.
//Nếu MucTieuID bằng 0 thì có nghĩa là trong vùng cần tìm MinDistMax không có mục tiêu nào hết.

return MucTieuID;
}

#71
bhduong

bhduong

    Right here waiting for you

  • Mod Giải Trí
  • PipPipPip
  • 432 Bài Viết:
Có ai biết được làm cách nào để lấy được mã Unicode không nhỉ. Mình search CE tìm ra được ô nhớ chứa các kí tự chat nhưng khi xài mặt chat thì nó ra ? chẳng biêt được nó là cái gì nữa.

#72
KAKO

KAKO

    Trình độ A CSTH

  • Advance Member
  • PipPip
  • 160 Bài Viết:

mình chỉ mới tự tìm hiểu lập trình thôi.
nên kô thể biết làm cách nào để dec toàn cục. mèo hay jolly chỉ dùm mình với.


//Các biến khai báo bên ngoài hàm là biến toàn cục, hàm nào cũng nhìn thấy
//Ví dụ:
int Bien1,Bien2;
long Bien3, Bien4;
DWORD Bien5, Bien6;
float Bien7;
//-------------------------------
//Các biến khai báo bên trong một hàm nào đó, là biến ko toàn cục, chỉ trong nội bộ hàm đó nhìn thấy
//Ví dụ:
void HamSo1()
{
int Bien8;
DWORD Bien9;

return;
}
//-------------------------------

vậy đoạn code trên phải sửa như thế nào để thành biến toàn cục, mình sửa hoài mà ko đc.
biến chính phải là "int m_iMonTotal = 0" hay còn nữa?

#73
TuiDayNe

TuiDayNe

    Căn bản tin học tốt

  • Advance Member
  • Pip
  • 63 Bài Viết:
vậy đoạn code trên phải sửa như thế nào để thành biến toàn cục, mình sửa hoài mà ko đc.
biến chính phải là "int m_iMonTotal = 0" hay còn nữa?
---------

Hàm này được truyền tham số "prtMonsterInfo ptr" là một kiểu dữ liệu do người lập trình khai báo,
(..., prtMonsterInfo ptr,int &countMob)
Nhưng khai báo đó cụ thể như thế nào thì không thấy ở đây.

Cục bộ hay toàn cục là do sự khai báo đó quyết định.
Phải tìm nơi, và cách khai báo tham số này, mới biết được nó toàn cục hay cục bộ.

Cũng tương tự như vậy với tham số countMob.

#74
KAKO

KAKO

    Trình độ A CSTH

  • Advance Member
  • PipPip
  • 160 Bài Viết:
đây là toàn bộ file header, cậu xem giúp nhé, tớ bó tay rùi

jolly : up file dài thế này KK cho vào file text đi, để code dài quá khó đọc topic, jolly cho vào file .h nhé

Tệp Đính Kèm


Bài viết này được chỉnh sửa bởi jollyjoker: 13 February 2009 - 11:47 AM


#75
TuiDayNe

TuiDayNe

    Căn bản tin học tốt

  • Advance Member
  • Pip
  • 63 Bài Viết:
//==========================
typedef struct TMonsterInfo
{
LPBYTE MonsterAdd;
int MonsterID;
int MonsterHP;
int MonsterMaxHP;
float MonsterX;
float MonsterY;
float MonsterZ;
int MonsterLV;
float MonsterDistance;
int MonsterClass;
int MonsterType;
wchar_t MonsterName[50];
bool blsort;
}MonsterInfo, *prtMonsterInfo;
//==========================
Khai báo như thế này tại file header làm MonsterInfo và contrỏ *prtMonsterInfo trở thành một kiểu cấu trúc (struct) toàn cục. Nhưng đoạn code này chưa khởi tạo ra một cấu trúc nào, nó chỉ là một khai báo kiểu dữ liệu (của người lập trình đưa ra).

Phải xem tại nơi gọi hàm LetMeReadMonterMapInfo(...).
Trước khi gọi, cấu trúc MonsterInfo được khởi tạo như thế nào để có thể truyền được cho hàm LetMeReadMonterMapInfo(...).

#76
CoffeeShop

CoffeeShop

    Thành viên mới

  • Newbies
  • 1 Bài Viết:
phù đọc hết mấy cái topic code auto này đi từ ass -->C+ -->autoIT. chắc tối này tẩu hỏa nhập ma quá :P

có bác nào có code viết =VB6 ko, đang ngâm cứu viết cho tru tiên. (nếu có source =autoIT cũng được, vì dù sao vb.script đọc cũng dễ theo dõi).

Bài viết này được chỉnh sửa bởi CoffeeShop: 17 February 2009 - 10:09 PM


#77
TuiDayNe

TuiDayNe

    Căn bản tin học tốt

  • Advance Member
  • Pip
  • 63 Bài Viết:
Cách cài đặt giải thuật tìm đường đi ngắn nhất giữa các NPC di chuyển trong game TGHM.
Ở đây tôi sẽ trình bày cách cài đặt đã thực hiện trong chương trình Ak_KBC V 1.08, bằng ngôn ngữ C++, các bạn có thể tham khảo. Đây cũng là ví dụ cụ thể về biến toàn cục và cách khởi tạo chúng đã đề cập đến trong bài trả lời cho KAKO.

Bước 1:
(Mất khá nhiều thời gian và công sức, khá nhiều gold để trả phí di chuyển)
-Bay lần lượt đến tất cả NPC di chuyển trong bản đồ TGHM. Tại mỗi NPC di chuyển ghi nhận các thông tin sau:
-ID của NPC: tôi dùng ký hiệu là pID (có thể ghi nhận cả tên NPC nếu muốn)
-Tọa độ trên thực địa của NPC đó: xTd, yTd, zTd
-Tọa độ click chuột trên bản đồ để di chuyển đến NPC đó: xMp, yMp
-ID của tất cả các NPC lận cận, có thể bay trực tiếp đến NPC đang xét.
Có tối đa khoảng hơn 10 ID như vậy.

Bước 2:
-Khai báo kiểu dữ liệu (cấu trúc) để lưu các số liệu này:
struct TdDiChuyens {
DWORD pID;
float xTd;
float yTd;
float zTd;
short xMp;
short yMp;
DWORD nID[SoDiemNext];//SoDiemNext = 10
};

-Khởi tạo một mảng gồm 46 cấu trúc như vậy:
struct TdDiChuyens TdDiChuyen[SoDiemDiCh];//SoDiemDiCh = 46

Mảng này được khai báo và khởi tạo bên ngoài tất cả các hàm nên nó có tính toàn cục, tất cả mọi hàm sẽ nhìn thấy mảng cấu trúc này. Ở đây tạm giới hạn SoDiemDiCh=46 và SoDiemNext=10. Trên thực tế có nhiều hơn 46 điểm di chuyển, và số điểm next có thể lớn hơn 10.

Bước 3:
Nhập toàn bộ số liệu đã thu thập được tại bước 1 vào mảng cấu trúc TdDiChuyen[46]. Thứ tự nhập không quan trọng, bạn có số liệu của NPC nào trước thì nhập trước. Ví dụ:
//ToLongThanh
TdDiChuyen[ 0].pID = 0x801042d8;//NinhNgocLien
TdDiChuyen[ 0].xTd = (float)549.68;//
TdDiChuyen[ 0].yTd = (float)670.00;//
TdDiChuyen[ 0].zTd = (float) 22.33;//
TdDiChuyen[ 0].xMp = 481;//
TdDiChuyen[ 0].yMp = 261;//
TdDiChuyen[ 0].nID[0] = 0x80106dc5;
TdDiChuyen[ 0].nID[1] = 0x8010596a;
TdDiChuyen[ 0].nID[2] = 0x80100d77;
TdDiChuyen[ 0].nID[3] = 0x80103c35;
TdDiChuyen[ 0].nID[4] = 0x801015a0;
TdDiChuyen[ 0].nID[5] = 0x80103175;
TdDiChuyen[ 0].nID[6] = 0x8010318b;
TdDiChuyen[ 0].nID[7] = 0x80105147;
TdDiChuyen[ 0].nID[8] = 0x80104c6a;
TdDiChuyen[ 0].nID[9] = 0x80102dbc;//

TdDiChuyen[ 1].pID = 0x801042e4;//LeHoaVu
TdDiChuyen[ 1].xTd = (float)563.89;//
TdDiChuyen[ 1].yTd = (float)631.61;//
TdDiChuyen[ 1].zTd = (float) 22.33;//
TdDiChuyen[ 1].xMp = 489;//
TdDiChuyen[ 1].yMp = 280;//
TdDiChuyen[ 1].nID[0] = 0x80106dc5;
TdDiChuyen[ 1].nID[1] = 0x8010596a;
TdDiChuyen[ 1].nID[2] = 0x80100d77;
TdDiChuyen[ 1].nID[3] = 0x80103c35;
TdDiChuyen[ 1].nID[4] = 0x801015a0;
TdDiChuyen[ 1].nID[5] = 0x80103175;
TdDiChuyen[ 1].nID[6] = 0x8010318b;
TdDiChuyen[ 1].nID[7] = 0x80105147;
TdDiChuyen[ 1].nID[8] = 0x80104c6a;
TdDiChuyen[ 1].nID[9] = 0x80102dbc;

Cứ như vậy nhập cho tất cả 46 NPC.

#78
TuiDayNe

TuiDayNe

    Căn bản tin học tốt

  • Advance Member
  • Pip
  • 63 Bài Viết:
Bước 4: Ý tưởng của giải thuật trình bày ở đây
Để tìm đường đi ngắn nhất từ NPC_A đến NPC_B, ta sẽ:
-Bắt đầu từ NPC_B (không phải bắt đầu từ NPC_A), xét tất cả các NPC lân cận của nó
-Nếu trong các NPC lân cận này có NPC_A, kết thúc giải thuật, trả về ID của NPC_B
-Nếu không có: chuyển lần lượt sang tất cả NPC lân cận của NPC_B, xét các NPC lân cận của các NPC lân cận này,...
-Cứ như vậy cho tới khi tìm thấy NPC_A
-Hoặc là gặp giới hạn số lần di chuyển tối đa cho phép
-Thì kết thúc giải thuật.

Bước 5: Thiết kế hàm chính
//Đầu vào:
//-FromID là ID của NPC_A
//-TmpIds1[] là tập các ID cần xét lân cận
//-TmpCnt1 là số phần tử trong tập TmpIds1[]
//Đầu ra:
//-TmpIds2[] là tập các ID lân cận mới được hàm này tạo ra
//-pTmpCnt là địa chỉ của biến chứa số phần tử trong tập ra TmpIds2[]
//-Trả về GateId là ID của NPC lân cận của NPC_A.
//-Nếu GateId khác 0 thì có nghĩa là bước di chuyển đầu tiên sẽ là di chuyển trực tiếp từ NPC_A đến NPC có ID là GateId.
//--------------------------------------------------------------------------
//Hàm này xét tập TmpIds1[], tạo tập TmpIds2[]
//Có gọi đến hàm GateIsVisited(GateId) để kiểm tra xem NPC hiện tại đã được xét chưa (được "đến thăm" chưa)
//Và gọi đến hàm SetGateVisited(GateId) để đánh dấu NPC đã được xét (đã được "đến thăm")
//--------------------------------------------------------------------------
DWORD XetCacDiemLanCan(DWORD FromID,DWORD TmpIds1[],short TmpCnt1,DWORD TmpIds2[],short* pTmpCnt)
{
DWORD GateId;
DWORD NextId;

short i,j,k;
DWORD XetTId;
short XetIdx;
short TmpCnt2;
short Found;
short IdIsNew;

TmpCnt2 = 0;
GateId = 0;
Found = 0;
for(j=0;j<TmpCnt1;j++)
{
//Lay XetIdx tu TmpIds1
XetTId = TmpIds1[j];
XetIdx = -1;
i = 0;
while(i<SoDiemDiCh)
{
if(TdDiChuyen[i].pID == XetTId)
{
XetIdx = i;
break;
}
++i;
}

if(XetIdx >= 0)
{
GateId = TdDiChuyen[XetIdx].pID;
if(!GateIsVisited(GateId))
{
i = 0;
while(i<SoDiemNext)
{
if(TdDiChuyen[XetIdx].nID[i] == 0)
break;

NextId = TdDiChuyen[XetIdx].nID[i];
if(NextId == FromID)
{
Found = 1;
break;
}
else
{
IdIsNew = 1;
k = 0;
while(k<TmpCnt2)
{
if(TmpIds2[k] == NextId)
{
IdIsNew = 0;
break;
}
++k;
}

if(IdIsNew)
{
TmpIds2[TmpCnt2] = NextId;
++TmpCnt2;
}
}

++i;
}

SetGateVisited(GateId);
}
}

if(Found)
break;
}

*pTmpCnt = TmpCnt2;

if(Found)
return GateId;

return 0;
}

#79
TuiDayNe

TuiDayNe

    Căn bản tin học tốt

  • Advance Member
  • Pip
  • 63 Bài Viết:
Bước 6: Thiết kế hàm quản lý hàm chính
//Đầu vào:
//-FrIdx là chỉ số của NPC điểm nguồn
//-ToIdx là chỉ số của NPC điểm đích
//Đầu ra:
//-NextId, nếu khác 0, là ID của NPC cần di chuyển trực tiếp đến tại thời điểm hiện tại
//--------------------------------------------
//Khai báo và khởi tạo hai mảng chứa dữ liệu tạm thời
DWORD TmpIds1[SoDiemDiCh];
short TmpCnt1;

DWORD TmpIds2[SoDiemDiCh];
short TmpCnt2;
//--------------------------------------------
//Bản thân hàm
DWORD TimDuongNganNhat(short FrIdx, short ToIdx)
{
short i;

DWORD FromID;
DWORD NextId;

//Xóa tất cả flag đã đến thăm
ClearVisitedFlag();

//Lấy ID của NPC điểm nguồn
FromID = TdDiChuyen[FrIdx].pID;

//Khởi tạo tập TmpIds1[] chỉ có một phần tử là ID của NPC điểm đến
TmpIds1[0] = TdDiChuyen[ToIdx].pID;
TmpCnt1 = 1;

//Vòng lặp gọi hàm chính, iMax là số lần di chuyển tối đa cho phép
//Để tiết kiệm bộ nhớ, ta chỉ sử dụng hai mảng TmpIds1 và TmpIds2
//nhưng vai trò của chúng được đảo qua lại, lúc là số liệu vào, lúc là số liệu ra
NextId = 0;
for(i=0;i<iMax;i++)
{
if(i%2 == 0)// i = 0,2,4,6,...
NextId = XetCacDiemLanCan(FromID,TmpIds1,TmpCnt1,TmpIds2,&TmpCnt2);
else // i = 1,3,5,...
NextId = XetCacDiemLanCan(FromID,TmpIds2,TmpCnt2,TmpIds1,&TmpCnt1);

if(NextId != 0)
break;
}

return NextId;
}

#80
TuiDayNe

TuiDayNe

    Căn bản tin học tốt

  • Advance Member
  • Pip
  • 63 Bài Viết:
Cách sử dụng hàm TimDuongNganNhat(FrIdx,ToIdx):
-Lấy tọa độ của nhân vật tại thời điểm hiện tại (xs,ys,zs)
-Tìm xem NPC nào gần tọa độ (xs,ys,zs) nhất, lấy NPC đó làm điểm nguồn
-Lấy tọa độ điểm trả Q (xd,yd,zd)
-Tìm xem NPC nào gần điểm (xd,yd,zd) nhất, lấy NPC đó làm điểm đích
-Gọi hàm TimDuongNganNhat(FrIdx,ToIdx) để lấy GateId
-Bay đến NPC nguồn, mở hộp thoại di chuyển của nó
-Sử dụng GateId do hàm trả về để suy ra tọa độ x,y phải click vào bản đồ di chuyển.
===== Hết =====






Perfumista - Thong tin nuoc hoa

Stars Counter Game

Balloon vs. Thorns

MU Phuc Hung

Làm Việc Tài Nhà

Mu Da Nang

Tuyển Nhân Viên Bán Hàng

Tư vấn sức khỏe trực tuyến

Close [X]