예제 #1
0
파일: CMob.cpp 프로젝트: CAIOVA7X/W2PP
void CMob::GetTargetPos(int tz)
{
	if(MOB.Equip[0].sIndex == 219 || MOB.Equip[0].sIndex == 220)
	{
		NextX = TargetX;
		NextY = TargetY;
		return;
	}

	if ((MOB.BaseScore.AttackRun & 15) == 0)
	{

		NextX = pMob[tz].TargetX-1;
		NextY = pMob[tz].TargetY-1;

		return;
	}

	int speed = BASE_GetSpeed(&MOB.CurrentScore) + 2;
	int distance = speed * SECBATTLE / 4;

	if (distance >= MAX_ROUTE)
		distance = MAX_ROUTE - 1;

	LastX = TargetX;
	LastY = TargetY;
	NextX = pMob[tz].TargetX - 1;
	NextY = pMob[tz].TargetY - 1;

	GetEmptyMobGrid(0, &NextX, &NextY);


	int i = 0;

	for (i = distance; i >= 0; i--)
	{
		BASE_GetRoute(LastX, LastY, &NextX, &NextY, Route, i, (char*)pHeightGrid);

		if (pMobGrid[NextY][NextX] == 0)
			break;

		if (i != distance)
		{
			int t = GetEmptyMobGrid(0, &NextX, &NextY);

			BASE_GetRoute(LastX, LastY, &NextX, &NextY, Route, i, (char*)pHeightGrid);

			if (pMobGrid[NextY][NextX] == 0)
				break;
		}
	}

	if (i == -1 || Route[0] == 0)
	{
		NextX = TargetX;
		NextY = TargetY;

		Route[0] = 0;
	}
}
예제 #2
0
파일: CMob.cpp 프로젝트: CAIOVA7X/W2PP
void CMob::GetRandomPos()
{
	if ((MOB.BaseScore.AttackRun & 15) == 0)
	{
		NextX = TargetX;
		NextY = TargetY;

		return;
	}

	int speed = BASE_GetSpeed(&MOB.CurrentScore);
	int distance = speed * SECBATTLE / 4;

	if (distance >= MAX_ROUTE)
		distance = MAX_ROUTE - 1;

	LastX = TargetX;
	LastY = TargetY;
	NextX = LastX + rand() % 5 - 3;
	NextY = LastY + rand() % 5 - 3;

	GetEmptyMobGrid(0, &NextX, &NextY);

	int i = 0;

	for (i = distance; i >= 0; i--)
	{
		BASE_GetRoute(LastX, LastY, &NextX, &NextY, Route, i, (char*)pHeightGrid);

		if (pMobGrid[NextY][NextX] == 0)
			break;

		if (i != distance)
		{
			GetEmptyMobGrid(0, &NextX, &NextY);

			BASE_GetRoute(LastX, LastY, &NextX, &NextY, Route, i, (char*)pHeightGrid);

			if (pMobGrid[NextY][NextX] == 0)
				break;
		}
	}

	if (i == -1 || Route[0] == 0)
	{
		NextX = TargetX + rand() % 5 - 3;
		NextY = TargetY + rand() % 5 - 3;

		Route[0] = 0;
	}
}
예제 #3
0
파일: CMob.cpp 프로젝트: CAIOVA7X/W2PP
void CMob::GetNextPos(int battle)
{
	if(MOB.Equip[0].sIndex == 219 || MOB.Equip[0].sIndex == 220 || GenerateIndex == KEFRA_BOSS)
	{
		NextX = TargetX;
		NextY = TargetY;
		return;
	}

	if ((MOB.BaseScore.AttackRun & 0xF) == 0)
	{
		NextX = TargetX;
		NextY = TargetY;
		return;
	}

	int speed = BASE_GetSpeed(&MOB.CurrentScore);
	int distance = speed * SECBATTLE / 4;

	if (distance >= MAX_ROUTE)
		distance = MAX_ROUTE - 1;

	if (battle)
	{
		int str = MOB.BaseScore.Str + 1;
		int res = str;
		
		if (res > distance)
			res = distance;
	}
	else
	{
		if (distance > MOB.BaseScore.Str)
			distance = MOB.BaseScore.Str;
	}

	LastX = TargetX;
	LastY = TargetY;
	NextX = SegmentX;
	NextY = SegmentY;

	GetEmptyMobGrid(0, &NextX, &NextY);
	
	if(NextX == -1)
		return;

	int i = 0;

	for (i = distance; i >= 0; i--)
	{
		BASE_GetRoute(LastX, LastY, &NextX, &NextY, Route, i, (char*)pHeightGrid);

		if (pMobGrid[NextY][NextX] == 0)
			break;

		if (i != distance)
		{
			GetEmptyMobGrid(0, &NextX, &NextY);

			BASE_GetRoute(LastX, LastY, &NextX, &NextY, Route, i, (char*)pHeightGrid);

			if (pMobGrid[NextY][NextX] == 0)
				break;
		}
	}

	if (i == -1 || Route[0] == 0)
	{
		NextX = TargetX;
		NextY = TargetY;

		Route[0] = 0;
	}
}
예제 #4
0
파일: CMob.cpp 프로젝트: CAIOVA7X/W2PP
void CMob::GetTargetPosDistance(int tz)
{
	if ((MOB.BaseScore.AttackRun & 0xF) == 0)
	{
		NextX = TargetX;
		NextY = TargetY;

		return;
	}

	int speed = BASE_GetSpeed(&MOB.CurrentScore);
	int distance = (speed * SECBATTLE) / 4; // SECBATTLE(?) = 8

	if (distance >= MAX_ROUTE)
		distance = MAX_ROUTE - 1;

	LastX = TargetX;
	LastY = TargetY;
	NextX = LastX;
	NextY = LastY;

	if (pMob[tz].TargetX > LastX)
		NextX = NextX - (1 + rand() % 2);

	else if (pMob[tz].TargetX < LastX)
		NextX = NextX + (1 + rand() % 2);

	if (pMob[tz].TargetY > LastY)
		NextY = NextY - (1 + rand() % 2);
	else if (pMob[tz].TargetY < LastY)
		NextY = NextY + (1 + rand() % 2);

	GetEmptyMobGrid(0, &NextX, &NextY);


	int dis = 0;

	for (dis = distance; dis >= 0; dis--)
	{
		BASE_GetRoute(LastX, LastY, &NextX, &NextY, Route, dis, (char*)pHeightGrid);

		if (pMobGrid[NextY][NextX] == 0)
			break;

		if (dis != distance)
		{
			GetEmptyMobGrid(0, &NextX, &NextY);

			BASE_GetRoute(LastX, LastY, &NextX, &NextY, Route, dis, (char*)pHeightGrid);

			if (pMobGrid[NextY][NextX] == 0)
				break;
		}
	}

	if (dis == -1 || Route[0] == 0)
	{
		NextX = TargetX;
		NextY = TargetY;

		Route[0] = 0;
	}
}
예제 #5
0
void GridMulticast(int conn, int tx, int ty, MSG_STANDARD *msg)
{
	if (conn == 0 || pMob[conn].TargetX == 0)
	{
		Log("err,GridMulticast mobidx,pos", "-system", 0);

		return;
	}

	int tmob = pMobGrid[pMob[conn].TargetY][pMob[conn].TargetX];

	if (tmob != conn && tmob)
		GetEmptyMobGrid(conn, &pMob[conn].TargetX, &pMob[conn].TargetY);
 
	if (tmob != conn && tmob)
	{
		if (conn < MAX_USER)
			Log("PC do not have his own grid", "-system", 0);

		else
			Log("NPC do not have his own grid", "-system", 0);

	}
	pMobGrid[pMob[conn].TargetY][pMob[conn].TargetX] = 0;

	if (pMobGrid[ty][tx] != conn && pMobGrid[ty][tx] != 0)
		GetEmptyMobGrid(conn, &pMob[conn].TargetX, &pMob[conn].TargetY);

	if (pMobGrid[ty][tx] != conn && pMobGrid[ty][tx] != 0)
	{
		if (conn < MAX_USER)
			Log("PC step in other mob's grid", "-system", 0);

		else
			Log("NPC charge other mob's grid", "-system", 0);
	}

	pMobGrid[ty][tx] = conn;

	int SizeY = VIEWGRIDY;
	int SizeX = VIEWGRIDX;
	int StartX = pMob[conn].TargetX - HALFGRIDX;
	int StartY = pMob[conn].TargetY - HALFGRIDY;

	if (StartX + SizeX >= MAX_GRIDX)
		SizeX = SizeX - (StartX + SizeX - MAX_GRIDX);

	if (SizeY + StartY >= MAX_GRIDY)
		SizeY = SizeY - (StartY + SizeY - MAX_GRIDY);

	if (StartX < 0)
		StartX = 0;

	if (StartY < 0)
		StartY = 0;

	int sx1 = StartX;
	int sy1 = StartY;
	int sx2 = StartX + SizeX;
	int sy2 = StartY + SizeY;


	SizeY = VIEWGRIDY;
	SizeX = VIEWGRIDX;
	StartX = tx - HALFGRIDX;
	StartY = ty - HALFGRIDY;

	if (StartX + SizeX >= MAX_GRIDX)
		SizeX = SizeX - (StartX + SizeX - MAX_GRIDX);

	if (SizeY + StartY >= MAX_GRIDY)
		SizeY = SizeY - (StartY + SizeY - MAX_GRIDY);

	if (StartX < 0)
		StartX = 0;

	if (StartY < 0)
		StartY = 0;

	int tx1 = StartX;
	int ty1 = StartY;
	int tx2 = StartX + SizeX;
	int ty2 = StartY + SizeY;

	for (int y = sy1; y < sy2; y++)
	{
		for (int x = sx1; x < sx2; x++)
		{
			tmob = pMobGrid[y][x];

			if (tmob == 0 || tmob == conn)
				continue;

			if (msg != NULL && tmob < MAX_USER)
				pUser[tmob].cSock.AddMessage((char*)msg, msg->Size);

			if (x < tx1 || x >= tx2 || y < ty1 || y >= ty2 && tx)
			{
				if (tmob < MAX_USER)
					SendRemoveMob(tmob, conn, 0, 0);

				if (conn < MAX_USER)
					SendRemoveMob(conn, tmob, 0, 0);
			}
		}
	}


	for (int y = sy1; y < sy2; y++)
	{
		for (int x = sx1; x < sx2; x++)
		{
			int titem = pItemGrid[y][x];

			if (titem == 0)
				continue;

			if (x < tx1 || x >= tx2 || y < ty1 || y >= ty2 && tx)
			{
				if (titem > 0 && titem < MAX_ITEM && pItem[titem].Mode && pItem[titem].ITEM.sIndex && conn > 0 && conn < MAX_USER)
					SendRemoveItem(conn, titem, 0);
			}
		}
	}

	for (int y = ty1; y < ty2; y++)
	{
		for (int x = tx1; x < tx2; x++)
		{
			int titem = pItemGrid[y][x];
			tmob = pMobGrid[y][x];

			if (x < sx1 || x >= sx2 || y < sy1 || y >= sy2)
			{
				if (titem > 0 && titem < MAX_ITEM && pItem[titem].Mode && pItem[titem].ITEM.sIndex && conn < MAX_USER)
				{
					if (pItem[titem].Mode)
						SendCreateItem(conn, titem, 0);

					else
						pItemGrid[y][x] = 0;
				}

				if (tmob != conn && tmob)
				{
					if (pMob[tmob].Mode == MOB_EMPTY)
					{
						pMobGrid[y][x] = 0;

						Log("MOB GRID HAS EMPTY MOB", "-system", 0);
						continue;
					}

					if (tmob < MAX_USER)
					{
						if (pMob[conn].Mode == MOB_EMPTY)
							pMobGrid[y][x] = 0;

						else
						{
							SendCreateMob(tmob, conn, 0);
							SendPKInfo(tmob, conn);
						}
					}

					if (conn < MAX_USER)
					{
						if (pMob[tmob].Mode == MOB_EMPTY)
							pMobGrid[y][x] = 0;

						else
						{
							SendCreateMob(conn, tmob, 0);
							SendPKInfo(conn, tmob);
						}
					}

					if (msg != NULL && tmob > 0 && tmob < MAX_USER)
					{
						if (pUser[tmob].cSock.AddMessage((char*)msg, msg->Size) == 0)
						{
							pUser[tmob].AccountName[ACCOUNTNAME_LENGTH - 1] = 0;
							pUser[tmob].AccountName[ACCOUNTNAME_LENGTH - 2] = 0;

							sprintf(temp, "err,gridmulticast add %d-%d %s", tmob, pUser[tmob].Mode, pUser[tmob].AccountName);
							Log(temp, "-system", 0);
						}
					}
				}
			}
		}
	}

	MSG_Action *sm = (MSG_Action*)msg;

	pMob[conn].LastTime = sm->ClientTick;
	pMob[conn].LastSpeed = sm->Speed;

	pMob[conn].LastX = sm->PosX;
	pMob[conn].LastY = sm->PosY;

	pMob[conn].TargetX = tx;
	pMob[conn].TargetY = ty;
}