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; } }
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; } }
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; } }
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; } }
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; }