struct PlayerInfo
{
public float HP;
public float Distance;
}
List<PlayerInfo> pInfo = new List<PlayerInfo>();
float MaxDistance(List<PlayerInfo> pInfo)
{
float[] Distance_to_players = new float[pInfo.Count];
for (int index = 0; index < pInfo.Count; ++index)
Distance_to_players[index] = pInfo[index].Distance;
return Distance_to_players.Max();
}
float MinDistance(List<PlayerInfo> pInfo)
{
float[] Distance_to_players = new float[pInfo.Count];
for (int index = 0; index < pInfo.Count; ++index)
Distance_to_players[index] = pInfo[index].Distance;
return Distance_to_players.Min();
}
А не подскажешь как сделать так чтобы после убийства одного на второго не переводилось (вроде nearest, но везде по разгному), а так СпасибоПро тагерт:
misDist - это я так понимаю, максимальная дистанция, или угол до цели...
лучше юзать коллекцию структур. почему не моссив? по тому что число игроков которые будут в комнате заранее угадать затруднительно, а если кто-то выйдет из боя?
в том же мосиве, собирать данные об игроках в стиле
Далее делаем коллекциюКод:struct PlayerInfo { public float HP; public float Distance; }
и тут становится ясно, как максимально точно определить максимальную и минимальную дистанцию к игроку.Код:List<PlayerInfo> pInfo = new List<PlayerInfo>();
Разумеется контейнер pInfo необходимо заполнять и очищать регулярно.Код:float MaxDistance(List<PlayerInfo> pInfo) { float[] Distance_to_players = new float[pInfo.Count]; for (int index = 0; index < pInfo.Count; ++index) Distance_to_players[index] = pInfo[index].Distance; return Distance_to_players.Max(); } float MinDistance(List<PlayerInfo> pInfo) { float[] Distance_to_players = new float[pInfo.Count]; for (int index = 0; index < pInfo.Count; ++index) Distance_to_players[index] = pInfo[index].Distance; return Distance_to_players.Min(); }
так же можно определить максимальное и минимальное хп и рассчитать в тагерте учет хп, чтобы сперва добивало тех у кого меньше жизни, или аттаковало тех у кого больше по желанию. суть думаю ясна.
Про остальное, в целом, судить нет смысла, можно написать так, можно интересней, но вариант интересней не схавает паблик аудитория, по тому что не поймет как оно работает.
обычно, это происходит, когда тагерт определяет более 1 подходящей цели. в данном случае, математические операции Max и Min, позволят наиболее точно определить конкретную цель для наведения среди всех перечисленных. Вероятно, твоя концепция тагерта, целиком не идеальна.А не подскажешь как сделать так чтобы после убийства одного на второго не переводилось (вроде nearest, но везде по разгному), а так Спасибо
Блин, огромное тебе спасибо, сегодня буду делать и последний вопрос:обычно, это происходит, когда тагерт определяет более 1 подходящей цели. в данном случае, математические операции Max и Min, позволят наиболее точно определить конкретную цель для наведения среди всех перечисленных. Вероятно, твоя концепция тагерта, целиком не идеальна.
обычно, таргерт пишут следующим образом:
1) собрать список всех пользователей в бою
2) отсеять из этого списка тимейтов и мертвых игроков
3) при необходимости, отсеять по дистанции к себе
4) отсеять по видимости (видимый / за стеной)
5) Далее выбирать из тех кто остался в списке по любому удобному критерию:
5.1) Min/Max HP - по минимальному или моксимальному хп, чтобы выбрать саму потенциально опасную или уязвимую цель.
5.2) Min/Max Distance - по наиболее ближнему или дальнему, на пример при игре с дробовиком, наиболее эффективно стрелять в первую очередь в наиболее близкую по дистанции цель *(по очевидным причинам)
5.3) Min/Max Angle - по врагу наиболее ближнему/дальнему к твоему прицелу (угол до цели).
5.4) Danger/LOL - по оружию в руках если у тебя выбор между двумя врагами и они в равных условиях, на равной дистанции и стоят чуть ли не друг за другом, можно выбрать: если у одного в руке автомат, а у другого нож - сразу понятно, кто опасней и на кого наводится стоит в первую очередь.
Upd: так же, стоит чуть чуть увеличивать скорость наведения на игроков с ножем в руках, так как с ножем вроде в кс быстрее бегают.
получить окно игры (FindWindow) далее, проверить, является ли окно игры впереди остальных, т.е смотрит ли на него юзверь if(GetForegroundWindow() == FindWindow(игра, игра)), далее определить размеры окна игры GetWindowRect, как вычислить центр окна, думаю понятно.Блин, огромное тебе спасибо, сегодня буду делать и последний вопрос:
Как сделать доводку на противника по расстоянию от прицела (у меня по расстоянию), у меня такая идея (взять центр экрана и перевести положение кости игрока на экран и там уже найти расстояние между ними) так или можно по другому?
ну я так же хотел, ОК, спасибополучить окно игры (FindWindow) далее, проверить, является ли окно игры впереди остальных, т.е смотрит ли на него юзверь if(GetForegroundWindow() == FindWindow(игра, игра)), далее определить размеры окна игры GetWindowRect, как вычислить центр окна, думаю понятно.
далее, определяешь нужного игрока и тянешь позицию нужной кости, далее дергаешь дистанцию до кости обычным алгоритмом получения дистанции, просто считаешь, от центра окна, до кости, по X и Y.
А чему у тебя равен bClient ? Не уж то базовый адресс Client.dll ?Кароч сделал что-то похожее на silent aim:
undind mouse1
Silent aim:
Все функции:Код:if (WinApi.GetAsyncKeyState(1) != 0) { int target = GetTarget(); if (target != -1 && mem.Read<bool>(target + 0x97C) && mem.Read<bool>(target + Offsets.oSpotted)) { int EngineBase = mem.Read<int>(bEngine + Offsets.oClientState); Vector3 dst = AngleToTarget(target, 8); Vector3 CurrentViewAngles = CheatData.mem.Read<Vector3>(EngineBase + Offsets.oViewAngles); mem.Write<byte>(bClient + Offsets.dwbSendPackets, 0); SetViewAngle(dst); mem.Write<byte>(bClient + Offsets.dwbSendPackets, 1); Shoot(); mem.Write<byte>(bClient + Offsets.dwbSendPackets, 0); SetViewAngle(CurrentViewAngles); mem.Write<byte>(bClient + Offsets.dwbSendPackets, 1); } }
GetTarget()
Код:public static int GetTarget() { int currentTarget = -1; float misDist = 9999999999999999999999999999999999f; int clientState = mem.Read<int>(.bEngine + Offsets.oClientState); int _localPlayer = mem.Read<int>(bClient + Offsets.oLocalPlayer); Vector3 _viewAngles = mem.Read<Vector3>(clientState + Offsets.oViewAngles); int playerTeam = mem.Read<int>(_localPlayer + Offsets.oTeam); for (int i = 0; i <= 64; i++) { Vector3 _playerPos = mem.Read<Vector3>(_localPlayer + Offsets.oPosition); int target = mem.Read<int>(bClient + Offsets.oEntityList + (i - 1) * 0x10); Vector3 targetPos = mem.Read<Vector3>(target + Offsets.oPosition); int targetTeam = mem.Read<int>(target + Offsets.oTeam); int targetHealth = mem.Read<int>(target + Offsets.oHealth); bool targetDomant = mem.Read<bool>(target + Offsets.oDormant); if (targetTeam != playerTeam && targetTeam != 0 && !targetDomant && targetHealth != 0 && Vector3.Distance(targetPos, _playerPos) < misDist) { Vector3 angleToTarget = AngleToTarget(target, 8); var fov = MathTools.Fov(_viewAngles, angleToTarget); if (fov <= (Offsets.FOV / Math.Abs(Vector3.Distance(targetPos, _playerPos)/700) )) { misDist = Vector3.Distance(targetPos, _playerPos); currentTarget = target; } } } return currentTarget; }
AngleToTarget:
Код:public static Vector3 AngleToTarget(int pTargetIn, int boneIndex) { int PlayerBase = mem.Read<int>(bClient + Offsets.oLocalPlayer); int EngineBase = mem.Read<int>(bEngine + Offsets.oClientState); int Bullet = mem.Read<int>(PlayerBase + Offsets.oShootFired); int _localPlayer = mem.Read<int>(CheatData.bClient + Offsets.oLocalPlayer); Vector3 position = mem.Read<Vector3>(_localPlayer + Offsets.oPosition); Vector3 vecView = .mem.Read<Vector3>(_localPlayer + Offsets.oVecViewOffset); Vector3 myView = position + vecView; Vector3 aimView = GetBonePos(pTargetIn, boneIndex); Vector3 dst = myView.CalcAngle(aimView); if (!Offsets.rcsON) { dst = dst.NormalizeAngle(); return dst; } else { if (Bullet > -1) { Vector3 mypunch = mem.Read<Vector3>(PlayerBase + Offsets.oAimPunchAngle); Vector3 cangle = startAngle - mypunch * 2f; cangle = cangle.ClampAngele(); dst = dst + cangle; dst = dst.NormalizeAngle(); } return dst; }
Shoot()
Код:mem.Write(bClient + Offsets.oForceAttack, 5); Thread.Sleep(0x40); mem.Write(bClient + Offsets.oForceAttack, 4);
// Правильное решение
Core.Memory.Write<Byte>(Core.EngineBase + Offsets.Misc.SendPackets, 0);
// Твое решение
Core.Memory.Write<Byte>(Core.ClientBase + Offsets.Misc.SendPackets, 0);
как бы не это было странно но у меня да было bClient - client.dll, я поменял на engine base и результат один и тот же. ЛОЛ wtF???А чему у тебя равен bClient ? Не уж то базовый адресс Client.dll ?
А это нормально, что clientdll никак не работает с пакетами?..
Только, когда будешь тестить правильное решение, незабудь вернуть отправку пакетов, а то придется перезапускать игру.Код:// Правильное решение Core.Memory.Write<Byte>(Core.EngineBase + Offsets.Misc.SendPackets, 0); // Твое решение Core.Memory.Write<Byte>(Core.ClientBase + Offsets.Misc.SendPackets, 0);
Убери везде отправку пакетов и оставь только с 0 (false) и тогда проверь по очереди то, что я написла выше и поймешькак бы не это было странно но у меня да было bClient - client.dll, я поменял на engine base и результат один и тот же. ЛОЛ wtF???
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz