Начинающий
- Статус
- Оффлайн
- Регистрация
- 15 Окт 2023
- Сообщения
- 51
- Реакции
- 5
Zombix Online - Может кто-то играл, ходит по заранее заданным кордам. X - Y. Может кому надо, тут уж думайте сами. А так очередная херня, за мусор похер
Обзор -
Библиотеки:
(Вписывать в cmd)
Код:
Обзор -
Библиотеки:
pip install tk
pip install pymem keyboard ttkbootstrap
(Вписывать в cmd)
Код:
Python:
from pymem import Pymem
import logging
import time
import keyboard
import random
import tkinter as tk
from ttkbootstrap import Style, ttk
from tkinter import messagebox
import threading
# Настройка логирования
logging.basicConfig(
filename=r'C:\Users\Ирина\Desktop\pet\coord_recognition.log',
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
logging.info("Скрипт запущен")
# Заданные целевые координаты
TARGET_COORDS = [
(305, 307), (303, 309), (306, 314), (309, 317), (311, 320),
(307, 325), (318, 312), (319, 310), (321, 314), (325, 318),
(333, 297), (328, 297), (304, 279)
]
# Адреса для X и Y
X_ADDRESS = 0x5EDBC498 # X (float)
Y_ADDRESS = 0x9C2CE568 # Y (int32)
# Настройки
PROCESS_NAME = "NoxVMHandle.exe"
SPEED_PER_COORD = 0.20576131687
TOLERANCE = 0
STUCK_TIMEOUT = 3.0
BYPASS_DISTANCE = 6
# Глобальные переменные
last_direction = None
running = False
main_thread = None
def get_current_coords(max_attempts=3):
"""Считывает координаты из памяти."""
logging.info("Starting get_current_coords")
print("Запуск get_current_coords...")
try:
pm = Pymem(PROCESS_NAME)
logging.info(f"Попытка получить процесс: {PROCESS_NAME}")
print(f"Проверка процесса: {PROCESS_NAME}")
for attempt in range(max_attempts):
logging.info(f"Попытка {attempt+1}...")
try:
x = pm.read_float(X_ADDRESS)
y = pm.read_int(Y_ADDRESS)
logging.info(f"Считаны значения: x={x}, y={y}")
x_int = round(x)
print(f"Считаны координаты: x={x_int}, y={y}")
logging.info(f"Считаны координаты: x={x_int}, y={y}")
return x_int, y
except Exception as e:
logging.error(f"Ошибка чтения памяти: {e}")
print(f"Ошибка чтения памяти: {e}")
time.sleep(0.5)
logging.error("Не удалось считать координаты")
raise ValueError("Не удалось считать координаты")
except Exception as e:
logging.error(f"Ошибка доступа к процессу: {e}")
print(f"Ошибка доступа к процессу: {e}")
raise
finally:
try:
pm.close_process()
except:
pass
def bypass_obstacle():
"""Обходит препятствие, исключая противоположное направление."""
global last_direction
directions = ['up', 'down', 'left', 'right']
opposite_directions = {
'left': 'right', 'right': 'left', 'up': 'down', 'down': 'up'
}
if last_direction in opposite_directions:
opposite = opposite_directions[last_direction]
if opposite in directions:
directions.remove(opposite)
print(f"Исключено направление: {opposite}")
logging.info(f"Исключено направление: {opposite}")
direction = random.choice(directions)
hold_duration = BYPASS_DISTANCE * SPEED_PER_COORD
print(f"Обход: '{direction}' на {BYPASS_DISTANCE} координат ({hold_duration:.2f} сек)")
logging.info(f"Обход: направление={direction}, время={hold_duration:.2f} сек")
keyboard.press(direction)
time.sleep(hold_duration)
keyboard.release(direction)
print(f"Отпустил '{direction}'")
time.sleep(0.5)
def move_to_target(target_x, target_y):
"""Перемещает персонажа к координатам."""
global last_direction
logging.info(f"Перемещение к x={target_x}, y={target_y}")
print(f"Перемещение к x={target_x}, y={target_y}")
try:
start_time = time.time()
last_x, last_y = get_current_coords()
while True:
current_x, current_y = get_current_coords()
if current_x == last_x and current_y == last_y:
elapsed_time = time.time() - start_time
if elapsed_time >= STUCK_TIMEOUT:
bypass_obstacle()
start_time = time.time()
last_x, last_y = get_current_coords()
continue
else:
start_time = time.time()
last_x, last_y = current_x, current_y
dx = target_x - current_x
if abs(dx) > TOLERANCE:
x_key = 'right' if dx > 0 else 'left'
hold_duration = abs(dx) * SPEED_PER_COORD
print(f"X: '{x_key}' на {hold_duration:.2f} сек")
logging.info(f"X: ключ={x_key}, время={hold_duration:.2f} сек")
keyboard.press(x_key)
time.sleep(hold_duration)
keyboard.release(x_key)
print(f"Отпустил '{x_key}'")
last_direction = x_key
time.sleep(0.5)
current_x, current_y = get_current_coords()
dy = target_y - current_y
if abs(dy) > TOLERANCE:
y_key = 'up' if dy > 0 else 'down'
hold_duration = abs(dy) * SPEED_PER_COORD
print(f"Y: '{y_key}' на {hold_duration:.2f} сек")
logging.info(f"Y: ключ={y_key}, время={hold_duration:.2f} сек")
keyboard.press(y_key)
time.sleep(hold_duration)
keyboard.release(y_key)
print(f"Отпустил '{y_key}'")
last_direction = y_key
time.sleep(0.5)
current_x, current_y = get_current_coords()
dx = target_x - current_x
dy = target_y - current_y
if abs(dx) <= TOLERANCE and abs(dy) <= TOLERANCE:
print(f"Цель достигнута: x={target_x}, y={target_y}")
logging.info(f"Цель достигнута: x={target_x}, y={target_y}")
return
else:
print(f"Цель не достигнута: x={current_x}, y={current_y}")
logging.warning(f"Цель не достигнута: x={current_x}, y={current_y}")
except Exception as e:
print(f"Ошибка в move_to_target: {e}")
logging.error(f"Ошибка в move_to_target: {e}")
time.sleep(0.5)
def main():
"""Основная функция для перемещения."""
global running
logging.info("Запуск main")
print("Запуск программы. Старт через 5 секунд...")
time.sleep(5)
while running:
for target_x, target_y in TARGET_COORDS:
if not running:
break
move_to_target(target_x, target_y)
if running:
print("Цикл завершён, начинаю заново...")
logging.info("Цикл завершён")
time.sleep(1)
def create_menu():
"""Создаёт меню в стиле NeverLose."""
global running, main_thread, X_ADDRESS, Y_ADDRESS, TARGET_COORDS
style = Style(theme='darkly')
window = style.master
window.title("Zombix Bot")
window.geometry("250x220")
window.resizable(False, False)
# Стили
style.configure('TLabel', font=('Arial', 10))
style.configure('TEntry', font=('Arial', 10))
style.configure('Success.TButton', font=('Arial', 10, 'bold'))
style.configure('Danger.TButton', font=('Arial', 10, 'bold'))
# Контейнер
frame = ttk.Frame(window, padding="10")
frame.pack(fill='both', expand=True)
# Поля адресов
ttk.Label(frame, text="X Address:").grid(row=0, column=0, sticky="w", pady=2)
x_addr_entry = ttk.Entry(frame, width=12)
x_addr_entry.insert(0, f"{X_ADDRESS:08X}")
x_addr_entry.grid(row=0, column=1, sticky="e", pady=2)
ttk.Label(frame, text="Y Address:").grid(row=1, column=0, sticky="w", pady=2)
y_addr_entry = ttk.Entry(frame, width=12)
y_addr_entry.insert(0, f"{Y_ADDRESS:08X}")
y_addr_entry.grid(row=1, column=1, sticky="e", pady=2)
# Поле координат
ttk.Label(frame, text="Coord (X,Y):").grid(row=2, column=0, sticky="w", pady=2)
coord_entry = ttk.Entry(frame, width=12)
coord_entry.grid(row=2, column=1, sticky="e", pady=2)
def add_coord():
"""Добавляет координаты."""
try:
x, y = map(int, coord_entry.get().split(','))
TARGET_COORDS.append((x, y))
messagebox.showinfo("Успех", f"Добавлены: ({x}, {y})")
coord_entry.delete(0, tk.END)
logging.info(f"Добавлены: ({x}, {y})")
except ValueError:
messagebox.showerror("Ошибка", "Формат: X,Y (напр., 305,307)")
logging.error("Неверный формат координат")
add_button = ttk.Button(frame, text="Добавить", command=add_coord, style='TButton')
add_button.grid(row=3, column=0, columnspan=2, pady=5)
# Кнопка Вкл/Выкл
def toggle_bot():
"""Запускает/останавливает бота."""
global running, main_thread
try:
global X_ADDRESS, Y_ADDRESS
X_ADDRESS = int(x_addr_entry.get(), 16)
Y_ADDRESS = int(y_addr_entry.get(), 16)
logging.info(f"Адреса: X={hex(X_ADDRESS)}, Y={hex(Y_ADDRESS)}")
except ValueError:
messagebox.showerror("Ошибка", "Введите корректные адреса")
return
if not running:
if not TARGET_COORDS:
messagebox.showerror("Ошибка", "Добавьте координаты")
return
running = True
toggle_button.configure(text="Выкл", style='Danger.TButton')
main_thread = threading.Thread(target=main)
main_thread.daemon = True
main_thread.start()
print("Бот запущен")
logging.info("Бот запущен")
else:
running = False
toggle_button.configure(text="Вкл", style='Success.TButton')
print("Бот остановлен")
logging.info("Бот остановлен")
toggle_button = ttk.Button(frame, text="Вкл", command=toggle_bot, style='Success.TButton', width=10)
toggle_button.grid(row=4, column=0, columnspan=2, pady=10)
window.mainloop()
if __name__ == "__main__":
print("Запуск меню...")
logging.info("Программа запущена")
try:
create_menu()
except Exception as e:
print(f"Ошибка: {e}")
logging.error(f"Ошибка: {e}")
input("Нажмите Enter для выхода...")