Anladım, yapman gereken şey şu:
Mob'a direk ışınlanmak yerine, önce characterstate packet'i yollaman gerekmektedir. Character state packetini yolladıktan sonra mob'a ışınlanabilirsin. Bu sayede seni normaldeki gibi direkt geri atmaz.
Ama eğer mesafe çok uzak olursa, bu sefer state packet'i yollasan bile yine seni geri atacaktır. Bundan dolayı target mob'unun pozisyonuyla senin pozisyonun arasındaki noktaları belirli mesafede itere edip her nokta için state packet'i yollayıp teker teker ışınlanman gerekmekte.
Kafanda fikir oluşması için bugün attığım şu posta bakabilirsin:
https://memoryhackers.org/konular/olympos2-basit-teleport-bot-source.251804/post-4920114
İki nokta arasındaki noktaları hesaplamak için
kullanabilirsin.
C++:
__forceinline std::vector<TPixelPosition> DivideTwoPointsByDistanceBresenham(int distance, TPixelPosition pointStart, TPixelPosition pointEnd)
{
std::vector<TPixelPosition> points;
int x1 = pointStart.x, y1 = pointStart.y;
int x2 = pointEnd.x, y2 = pointEnd.y;
int dx = abs(x2 - x1);
int dy = abs(y2 - y1);
int x = x1, y = y1;
int px = x2 > x1 ? 1 : -1, py = y2 > y1 ? 1 : -1;
int dist = 0;
if (dx >= dy) {
for (int i = 0; i <= dx; i++) {
if (dist >= distance) {
dist = 0;
points.push_back({ (float)x, (float)y });
}
x += px;
dist += dy;
if (dist >= dx) {
dist -= dx;
y += py;
}
}
}
else {
for (int i = 0; i <= dy; i++) {
if (dist >= distance) {
dist = 0;
points.push_back({ (float)x, (float)y });
}
y += py;
dist += dx;
if (dist >= dy) {
dist -= dy;
x += px;
}
}
}
points.push_back({ (float)x2, (float)y2 });
return points;
}
C# kullandığından ve muhtemelen portlarken sıkıntı yaşayacağından, buyur seni bu dertten kurtarayım.
@baba4507
C#:
using System.Collections.Generic;
class TPixelPosition {
public float x, y, z;
public TPixelPosition(float x, float y, float z) {
this.x = x;
this.y = y;
this.z = z;
}
}
class LineDivider {
public static List<TPixelPosition> DivideTwoPointsByDistanceBresenham(int distance, TPixelPosition pointStart, TPixelPosition pointEnd) {
List<TPixelPosition> points = new List<TPixelPosition>();
int x1 = (int)pointStart.x, y1 = (int)pointStart.y;
int x2 = (int)pointEnd.x, y2 = (int)pointEnd.y;
int dx = Math.Abs(x2 - x1);
int dy = Math.Abs(y2 - y1);
int x = x1, y = y1;
int px = x2 > x1 ? 1 : -1, py = y2 > y1 ? 1 : -1;
int dist = 0;
if (dx >= dy) {
for (int i = 0; i <= dx; i++) {
if (dist >= distance) {
dist = 0;
points.Add(new TPixelPosition(x, y, 0));
}
x += px;
dist += dy;
if (dist >= dx) {
dist -= dx;
y += py;
}
}
} else {
for (int i = 0; i <= dy; i++) {
if (dist >= distance) {
dist = 0;
points.Add(new TPixelPosition(x, y, 0));
}
y += py;
dist += dx;
if (dist >= dy) {
dist -= dy;
x += px;
}
}
}
points.Add(new TPixelPosition(x2, y2, 0));
return points;
}
}