Загрузка данных
import tkinter as tk
from tkinter import ttk
import random
import math
import time
# ==================== ГЛАВНОЕ ОКНО ====================
root = tk.Tk()
root.title("Nursultan Client | Inspired")
root.geometry("800x500")
root.configure(bg="#0a0a0f")
root.overrideredirect(True) # Убираем стандартную рамку
# ==================== GLOBAL VARS ====================
particles = []
snowflakes = []
matrix_columns = []
glitch_active = False
glitch_offset = 0
# ==================== КАНВАС ДЛЯ ВИЗУАЛОВ ====================
canvas = tk.Canvas(root, bg="#0a0a0f", highlightthickness=0)
canvas.pack(fill="both", expand=True)
# ==================== СОЗДАНИЕ КАСТОМНОЙ РАМКИ ====================
# Верхняя панель перетаскивания
title_bar = tk.Frame(canvas, bg="#0d0d18", height=30)
title_bar.pack(fill="x", side="top")
title_label = tk.Label(
title_bar,
text="◆ NURSULTAN CLIENT [MM2 INSPIRED]",
fg="#00d4ff",
bg="#0d0d18",
font=("Courier New", 10, "bold"),
)
title_label.pack(side="left", padx=10)
close_btn = tk.Label(
title_bar,
text="✕",
fg="#ff4444",
bg="#0d0d18",
font=("Arial", 12, "bold"),
cursor="hand2",
)
close_btn.pack(side="right", padx=10)
close_btn.bind("<Button-1>", lambda e: root.destroy())
# Перетаскивание окна
def start_move(event):
root.x = event.x
root.y = event.y
def do_move(event):
deltax = event.x - root.x
deltay = event.y - root.y
x = root.winfo_x() + deltax
y = root.winfo_y() + deltay
root.geometry(f"+{x}+{y}")
title_bar.bind("<Button-1>", start_move)
title_bar.bind("<B1-Motion>", do_move)
title_label.bind("<Button-1>", start_move)
title_label.bind("<B1-Motion>", do_move)
# ==================== ОСНОВНОЙ КОНТЕНТ ====================
main_frame = tk.Frame(canvas, bg="#0a0a0f")
main_frame.pack(fill="both", expand=True, padx=2, pady=2)
# Левая панель (категории)
left_panel = tk.Frame(main_frame, bg="#0d0d18", width=160)
left_panel.pack(side="left", fill="y")
left_panel.pack_propagate(False)
# Заголовок категорий
cat_header = tk.Label(
left_panel,
text="◆ CATEGORIES",
fg="#00d4ff",
bg="#0d0d18",
font=("Courier New", 10, "bold"),
anchor="w",
)
cat_header.pack(fill="x", padx=10, pady=(15, 10))
# Категории
categories = ["AIMBOT", "ESP", "VISUALS", "MISC", "SETTINGS"]
cat_buttons = []
for cat in categories:
btn = tk.Label(
left_panel,
text=f" › {cat}",
fg="#8899aa",
bg="#0d0d18",
font=("Courier New", 9),
anchor="w",
cursor="hand2",
padx=10,
pady=5,
)
btn.pack(fill="x", padx=5, pady=1)
btn.bind("<Enter>", lambda e, b=btn: b.configure(fg="#00d4ff", bg="#12122a"))
btn.bind("<Leave>", lambda e, b=btn: b.configure(fg="#8899aa", bg="#0d0d18"))
cat_buttons.append(btn)
# Версия и статус снизу
status_label = tk.Label(
left_panel,
text="● STATUS: UNDETECTED",
fg="#00ff88",
bg="#0d0d18",
font=("Courier New", 7),
anchor="w",
)
status_label.pack(side="bottom", fill="x", padx=10, pady=10)
# Правая панель (функции)
right_panel = tk.Frame(main_frame, bg="#0f0f1c")
right_panel.pack(side="left", fill="both", expand=True)
# Заголовок функций
func_header = tk.Label(
right_panel,
text="◆ FUNCTIONS — AIMBOT",
fg="#00d4ff",
bg="#0f0f1c",
font=("Courier New", 10, "bold"),
anchor="w",
)
func_header.pack(fill="x", padx=15, pady=(15, 10))
# Область с переключателями
toggle_frame = tk.Frame(right_panel, bg="#0f0f1c")
toggle_frame.pack(fill="both", expand=True, padx=15, pady=5)
# Функции-переключатели
functions_aimbot = [
("Silent Aim", True),
("Aim Lock", False),
("Trigger Bot", True),
("Smooth Aim", False),
("FOV Circle", True),
("Auto Shoot", False),
]
toggle_vars = []
for i, (name, default) in enumerate(functions_aimbot):
var = tk.BooleanVar(value=default)
toggle_vars.append(var)
frame = tk.Frame(toggle_frame, bg="#0f0f1c")
frame.pack(fill="x", pady=3)
# Полосатый индикатор
indicator = tk.Label(
frame,
text="▎",
fg="#00d4ff" if default else "#334455",
bg="#0f0f1c",
font=("Courier New", 8),
)
indicator.pack(side="left", padx=(0, 5))
# Название функции
func_label = tk.Label(
frame,
text=name,
fg="#ccddff" if default else "#667788",
bg="#0f0f1c",
font=("Courier New", 9),
anchor="w",
width=18,
)
func_label.pack(side="left")
# Кнопка-переключатель
toggle_btn = tk.Label(
frame,
text="● ON" if default else "○ OFF",
fg="#00ff88" if default else "#ff4444",
bg="#0f0f1c",
font=("Courier New", 9, "bold"),
cursor="hand2",
width=6,
)
toggle_btn.pack(side="right", padx=5)
def make_toggle(var=var, btn=None, ind=None, fl=None):
def toggle():
var.set(not var.get())
if var.get():
btn.configure(text="● ON", fg="#00ff88")
ind.configure(fg="#00d4ff")
fl.configure(fg="#ccddff")
else:
btn.configure(text="○ OFF", fg="#ff4444")
ind.configure(fg="#334455")
fl.configure(fg="#667788")
return toggle
toggle_btn.configure(
command=make_toggle(var, toggle_btn, indicator, func_label)
)
toggle_btn.bind("<Button-1>", lambda e, b=toggle_btn: b.invoke())
# ==================== ВИЗУАЛЬНЫЕ ЭФФЕКТЫ (КАНВАС) ====================
# Частицы
class Particle:
def __init__(self, x, y):
self.x = x
self.y = y
self.vx = random.uniform(-0.5, 0.5)
self.vy = random.uniform(-1.5, -0.2)
self.life = random.randint(30, 80)
self.max_life = self.life
self.size = random.randint(1, 3)
def update(self):
self.x += self.vx
self.y += self.vy
self.life -= 1
return self.life > 0
# Матричный дождь
class MatrixDrop:
def __init__(self, x):
self.x = x
self.y = random.randint(-500, -20)
self.speed = random.randint(3, 8)
self.chars = []
self.length = random.randint(8, 20)
for _ in range(self.length):
self.chars.append(chr(random.randint(0x30A0, 0x30FF)))
def update(self):
self.y += self.speed
return self.y < 550
# Снежинки
class Snowflake:
def __init__(self):
self.x = random.randint(0, 800)
self.y = random.randint(-50, -5)
self.size = random.randint(1, 3)
self.speed = random.uniform(0.5, 2)
self.wind = random.uniform(-0.3, 0.3)
def update(self):
self.y += self.speed
self.x += self.wind
if self.x < 0:
self.x = 800
elif self.x > 800:
self.x = 0
return self.y < 550
# Инициализация визуалов
for _ in range(15):
matrix_columns.append(MatrixDrop(random.randint(0, 800)))
def spawn_particles(x, y):
for _ in range(5):
particles.append(Particle(x, y))
def update_visuals():
global glitch_active, glitch_offset
# Очистка частиц
canvas.delete("particle")
canvas.delete("matrix")
canvas.delete("snow")
# Обновление и отрисовка частиц
for p in particles[:]:
if p.update():
alpha = p.life / p.max_life
color = f"#{int(0x00*alpha):02x}{int(0xd4*alpha):02x}{int(0xff*alpha):02x}"
canvas.create_oval(
p.x - p.size,
p.y - p.size,
p.x + p.size,
p.y + p.size,
fill=color,
outline="",
tags="particle",
)
else:
particles.remove(p)
# Обновление матричного дождя
for col in matrix_columns:
if not col.update():
col.y = random.randint(-500, -20)
for i, char in enumerate(col.chars):
cy = col.y + i * 14
if 0 < cy < 550:
alpha = 1 - (i / col.length)
if i == 0:
color = "#ffffff"
elif i < 3:
color = "#00d4ff"
else:
color = f"#{int(0x00*alpha):02x}{int(0x66*alpha):02x}{int(0x44*alpha):02x}"
canvas.create_text(
col.x,
cy,
text=char,
fill=color,
font=("Courier New", 10),
tags="matrix",
)
# Снежинки
for _ in range(2):
snowflakes.append(Snowflake())
for s in snowflakes[:]:
if s.update():
canvas.create_oval(
s.x - s.size,
s.y - s.size,
s.x + s.size,
s.y + s.size,
fill="#aaddff",
outline="",
tags="snow",
)
else:
snowflakes.remove(s)
# Ограничение количества снежинок
while len(snowflakes) > 80:
snowflakes.pop(0)
# Эффект глитча (случайный)
if random.random() < 0.02:
glitch_active = True
glitch_offset = random.randint(-5, 5)
if glitch_active:
glitch_active = False
# Кратковременное смещение окна
x = root.winfo_x() + glitch_offset
y = root.winfo_y() + random.randint(-2, 2)
root.geometry(f"+{x}+{y}")
glitch_offset = 0
root.after(50, update_visuals)
# ==================== ЗАПУСК ====================
# Спавн частиц при движении мыши
def on_mouse_move(event):
if event.widget == right_panel or event.widget == toggle_frame:
spawn_particles(event.x_root - root.winfo_x(), event.y_root - root.winfo_y())
right_panel.bind("<Motion>", on_mouse_move)
toggle_frame.bind("<Motion>", on_mouse_move)
# Запуск обновления визуалов
update_visuals()
# Центрирование окна
root.update_idletasks()
w = root.winfo_width()
h = root.winfo_height()
sw = root.winfo_screenwidth()
sh = root.winfo_screenheight()
x = (sw - w) // 2
y = (sh - h) // 2
root.geometry(f"+{x}+{y}")
root.mainloop()