Skip to content
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Donate
Collapse

Plutonium

paco_1undefined

paco_1

@paco_1
About
Posts
4
Topics
2
Shares
0
Groups
0
Followers
1
Following
1

Posts

Recent Best Controversial

  • (Not Mod Related) --- Aircraft Tracker
    paco_1undefined paco_1

    i didnt make this for a "call of duty mod community" i made this for myself and realized its not a widely open source thing so forgive me for posting it here but i dont care how you benefit from it. at bare minimum i posted it because i can and wanted to for those of similar ambition.

    General Discussion

  • (Not Mod Related) --- Aircraft Tracker
    paco_1undefined paco_1
    I started exploring different things and dont really do the whole forum thing often but figured I'll start sharing my codes for programs, i feel dont get enough open source code for people to learn.This is a fairly simple python aircraft tracker using ads-b and other thangs(im drunk and dont wanna explain it right now, will maybe update with "//" explanations if i dont start another random project)
    
    import requests
    import tkinter as tk
    from tkinter import ttk
    import threading
    import time
    import math
    from datetime import datetime, timedelta, timezone
    import numpy as np
    from skyfield.api import load, Topos, wgs84
    
    # ==============================
    # LOCATION (MULTI-SOURCE)
    # ==============================
    def get_best_location():
        sources = []
    
        try:
            r = requests.get("http://ip-api.com/json/", timeout=2).json()
            if r.get("status") == "success":
                sources.append((r["lat"], r["lon"]))
        except: pass
    
        try:
            r = requests.get("https://ipinfo.io/json", timeout=2).json()
            if "loc" in r:
                lat, lon = map(float, r["loc"].split(","))
                sources.append((lat, lon))
        except: pass
    
        try:
            r = requests.get("https://ipwho.is/", timeout=2).json()
            if r.get("success"):
                sources.append((r["latitude"], r["longitude"]))
        except: pass
    
        try:
            r = requests.get("https://freegeoip.app/json/", timeout=2).json()
            sources.append((r["latitude"], r["longitude"]))
        except: pass
    
        if not sources:
            return 40.7128, -74.0060, 1
    
        lats, lons = zip(*sources)
        return float(np.mean(lats)), float(np.mean(lons)), len(sources)
    
    LAT, LON, CONF = get_best_location()
    print(f"Location: {LAT:.4f}, {LON:.4f} (Confidence: {CONF} sources)")
    
    # ==============================
    # SATELLITES
    # ==============================
    sat_data = {}
    
    try:
        print("Fetching satellite data...")
        TLE_URL = "https://celestrak.com/NORAD/elements/active.txt"
        tle = requests.get(TLE_URL, timeout=5).text.splitlines()
        i = 0
        count = 0
        while i + 2 < len(tle):
            name = tle[i].strip()
            line1 = tle[i+1].strip()
            line2 = tle[i+2].strip()
            if name and line1.startswith("1") and line2.startswith("2"):
                sat_data[name] = (line1, line2)
                count += 1
            i += 3
        print(f"Loaded {count} satellites")
    except Exception as e:
        print(f"Warning: Could not fetch satellite data - {e}")
    
    ts = load.timescale()
    observer = Topos(latitude_degrees=LAT, longitude_degrees=LON)
    
    # ==============================
    # ADS-B EXCHANGE
    # ==============================
    def get_aircraft():
        """Fetch aircraft from OpenSky Network API"""
        try:
            url = f"https://opensky-network.org/api/states/all?lamin={LAT-2}&lomin={LON-2}&lamax={LAT+2}&lomax={LON+2}"
            r = requests.get(url, timeout=5)
            if r.status_code == 200:
                data = r.json()
                aircraft = []
                for ac in data.get("states", []):
                    if ac[2] is not None and ac[5] is not None and ac[6] is not None:
                        aircraft.append({
                            "icao": ac[0] if ac[0] else "????",
                            "callsign": (ac[1] if ac[1] else "N/A").strip(),
                            "lat": ac[6],
                            "lon": ac[5],
                            "alt": ac[7] if ac[7] else 0,
                            "speed": ac[9] if ac[9] else 0,
                            "track": ac[10] if ac[10] else 0,
                        })
                return aircraft
        except Exception as e:
            print(f"Aircraft fetch error: {e}")
        return []
    
    # ==============================
    # AIRCRAFT DATABASE (ICAO LOOKUP)
    # ==============================
    AIRCRAFT_TYPES = {
        "A380": "Airbus A380",
        "A350": "Airbus A350",
        "A330": "Airbus A330",
        "A320": "Airbus A320",
        "A319": "Airbus A319",
        "B787": "Boeing 787",
        "B777": "Boeing 777",
        "B747": "Boeing 747",
        "B737": "Boeing 737",
        "B757": "Boeing 757",
        "B767": "Boeing 767",
        "CRJ": "Bombardier CRJ",
        "E190": "Embraer E190",
    }
    
    AIRLINES = {
        "UAL": "United Airlines",
        "AAL": "American Airlines",
        "DAL": "Delta Air Lines",
        "SWA": "Southwest Airlines",
        "JBU": "JetBlue",
        "SKW": "SkyWest",
        "FFT": "Frontier",
        "ACA": "Air Canada",
        "BAW": "British Airways",
        "DLH": "Lufthansa",
        "AFR": "Air France",
        "KLM": "KLM",
    }
    
    def get_aircraft_type(callsign):
        """Estimate aircraft type from callsign"""
        for code, aircraft_type in AIRCRAFT_TYPES.items():
            if code in callsign:
                return aircraft_type
        return "Unknown Aircraft"
    
    def get_airline_name(callsign):
        """Get airline name from callsign"""
        if len(callsign) >= 3:
            airline_code = callsign[:3].upper()
            return AIRLINES.get(airline_code, "Unknown Airline")
        return "Unknown Airline"
    
    def bearing_to_direction(bearing):
        """Convert bearing (0-360) to cardinal direction"""
        directions = ["N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE",
                      "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"]
        idx = int((bearing + 11.25) / 22.5) % 16
        return directions[idx]
    
    # ==============================
    # DISTANCE & BEARING CALCULATIONS
    # ==============================
    def haversine(lat1, lon1, lat2, lon2):
        """Calculate distance (km) and bearing between two points"""
        R = 6371
        
        dlat = math.radians(lat2 - lat1)
        dlon = math.radians(lon2 - lon1)
        
        a = math.sin(dlat/2)**2 + math.cos(math.radians(lat1)) * math.cos(math.radians(lat2)) * math.sin(dlon/2)**2
        c = 2 * math.asin(math.sqrt(a))
        dist = R * c
        
        y = math.sin(dlon) * math.cos(math.radians(lat2))
        x = math.cos(math.radians(lat1)) * math.sin(math.radians(lat2)) - math.sin(math.radians(lat1)) * math.cos(math.radians(lat2)) * math.cos(dlon)
        bearing = math.degrees(math.atan2(y, x)) % 360
        
        return dist, bearing
    
    def feet_to_km(feet):
        return feet * 0.0003048
    
    # ==============================
    # GUI SETUP - MAIN MENU
    # ==============================
    root = tk.Tk()
    root.title("Radar Tracker - Select Mode")
    root.geometry("600x400")
    root.configure(bg="black")
    
    FONT = ("Consolas", 12)
    FONT_LARGE = ("Consolas", 16, "bold")
    GREEN = "#00ff66"
    RED = "#ff3333"
    YELLOW = "#ffff00"
    CYAN = "#00ffff"
    
    def open_aircraft_tracker():
        root.withdraw()
        create_aircraft_window()
    
    def open_satellite_tracker():
        root.withdraw()
        create_satellite_window()
    
    # Main menu frame
    menu_frame = tk.Frame(root, bg="black")
    menu_frame.pack(expand=True, fill="both", padx=20, pady=20)
    
    title = tk.Label(menu_frame, text="RADAR HUD TRACKER", fg=GREEN, bg="black", font=("Consolas", 20, "bold"))
    title.pack(pady=30)
    
    subtitle = tk.Label(menu_frame, text=f"Location: {LAT:.4f}, {LON:.4f}", fg=CYAN, bg="black", font=FONT)
    subtitle.pack(pady=10)
    
    divider = tk.Frame(menu_frame, bg=GREEN, height=2)
    divider.pack(fill="x", pady=20)
    
    button_frame = tk.Frame(menu_frame, bg="black")
    button_frame.pack(expand=True, fill="both")
    
    # Aircraft button
    aircraft_btn = tk.Button(button_frame, text="✈ AIRCRAFT TRACKER", command=open_aircraft_tracker,
                             bg=RED, fg="black", font=FONT_LARGE, relief="raised", bd=3,
                             padx=40, pady=20, cursor="hand2", activebackground=YELLOW)
    aircraft_btn.pack(pady=15, fill="x")
    
    aircraft_desc = tk.Label(button_frame, text="Track aircraft in real-time using ADS-B data",
                             fg=GREEN, bg="black", font=("Consolas", 10))
    aircraft_desc.pack(pady=5)
    
    divider2 = tk.Frame(button_frame, bg=YELLOW, height=1)
    divider2.pack(fill="x", pady=15)
    
    # Satellite button
    satellite_btn = tk.Button(button_frame, text="🛰 SATELLITE TRACKER", command=open_satellite_tracker,
                              bg=GREEN, fg="black", font=FONT_LARGE, relief="raised", bd=3,
                              padx=40, pady=20, cursor="hand2", activebackground=YELLOW)
    satellite_btn.pack(pady=15, fill="x")
    
    satellite_desc = tk.Label(button_frame, text="Track satellites and space objects in orbit",
                              fg=GREEN, bg="black", font=("Consolas", 10))
    satellite_desc.pack(pady=5)
    
    # ==============================
    # AIRCRAFT TRACKER WINDOW
    # ==============================
    def create_aircraft_window():
        aircraft_window = tk.Tk()
        aircraft_window.title("Aircraft Tracker")
        aircraft_window.geometry("1300x750")
        aircraft_window.configure(bg="black")
    
        current_objects = []
    
        def on_closing():
            aircraft_window.destroy()
            root.deiconify()
    
        aircraft_window.protocol("WM_DELETE_WINDOW", on_closing)
    
        # Top info panel
        top_frame = tk.Frame(aircraft_window, bg="black")
        top_frame.pack(fill="x")
    
        info = tk.Label(top_frame, fg=GREEN, bg="black", font=FONT,
                        text=f"Lat {LAT:.4f} | Lon {LON:.4f}")
        info.pack(side="left", padx=5)
    
        clock = tk.Label(top_frame, fg=GREEN, bg="black", font=FONT)
        clock.pack(side="left", padx=5)
    
        refresh_btn = tk.Button(top_frame, text="REFRESH", bg=GREEN, fg="black", font=("Consolas", 10, "bold"),
                                 relief="raised", bd=2, width=15)
        refresh_btn.pack(side="left", padx=10)
    
        status = tk.Label(top_frame, fg=YELLOW, bg="black", font=("Consolas", 8))
        status.pack(side="left", padx=5)
    
        # Main content frame
        content_frame = tk.Frame(aircraft_window, bg="black")
        content_frame.pack(fill="both", expand=True)
    
        # Left side - Radar
        left_frame = tk.Frame(content_frame, bg="black")
        left_frame.pack(side="left", fill="both", expand=True)
    
        debug = tk.Label(left_frame, fg=CYAN, bg="black", font=("Consolas", 8))
        debug.pack()
    
        SIZE = 500
        CENTER = SIZE // 2
        canvas = tk.Canvas(left_frame, width=SIZE, height=SIZE, bg="black", highlightthickness=0)
        canvas.pack(pady=10)
    
        def draw_radar():
            canvas.delete("radar")
            canvas.create_oval(10, 10, SIZE-10, SIZE-10, outline=GREEN, tags="radar", width=2)
            canvas.create_line(CENTER, 10, CENTER, SIZE-10, fill=GREEN, tags="radar")
            canvas.create_line(10, CENTER, SIZE-10, CENTER, fill=GREEN, tags="radar")
            
            for km, ratio in [(50, 0.2), (100, 0.4), (150, 0.6), (200, 0.8), (250, 1.0)]:
                ring_px = ratio * (CENTER - 20)
                canvas.create_oval(CENTER-ring_px, CENTER-ring_px, CENTER+ring_px, CENTER+ring_px, 
                                  outline=GREEN, dash=(2, 2), tags="radar", width=1)
                canvas.create_text(CENTER + ring_px, CENTER, text=f"{km}km", fill=GREEN, font=("Consolas", 8), tags="radar")
    
        draw_radar()
    
        map_canvas = tk.Canvas(left_frame, width=360, height=180, bg="black", highlightthickness=1, relief="solid")
        map_canvas.pack()
        map_canvas.create_rectangle(0, 0, 360, 180, outline=GREEN, width=2)
        map_canvas.create_text(180, 10, text="World Map", fill=GREEN, font=("Consolas", 8))
    
        # Right side - Sidebar
        sidebar_frame = tk.Frame(content_frame, bg="black", width=350)
        sidebar_frame.pack(side="right", fill="both", padx=10, pady=10)
        sidebar_frame.pack_propagate(False)
    
        sidebar_title = tk.Label(sidebar_frame, text="AIRCRAFT DATA", fg=GREEN, bg="black", 
                                 font=("Consolas", 11, "bold"))
        sidebar_title.pack(fill="x", pady=5)
    
        sidebar_divider = tk.Frame(sidebar_frame, bg=GREEN, height=2)
        sidebar_divider.pack(fill="x", pady=5)
    
        sidebar_content = tk.Frame(sidebar_frame, bg="black")
        sidebar_content.pack(fill="both", expand=True)
    
        scrollbar = ttk.Scrollbar(sidebar_content)
        scrollbar.pack(side="right", fill="y")
    
        aircraft_listbox = tk.Listbox(sidebar_content, bg="#001100", fg=GREEN, font=("Consolas", 8),
                                      yscrollcommand=scrollbar.set, relief="flat", bd=0)
        aircraft_listbox.pack(side="left", fill="both", expand=True)
        scrollbar.config(command=aircraft_listbox.yview)
    
        def perform_update():
            nonlocal current_objects
            try:
                now = datetime.now(timezone.utc)
                clock.config(text=f"UTC {now.strftime('%H:%M:%S')}")
                
                canvas.delete("all")
                draw_radar()
                map_canvas.delete("all")
                map_canvas.create_rectangle(0, 0, 360, 180, outline=GREEN, width=2)
                map_canvas.create_text(180, 10, text="World Map", fill=GREEN, font=("Consolas", 8))
                
                objects = []
                aircraft = get_aircraft()
                
                for ac in aircraft:
                    dist, bearing = haversine(LAT, LON, ac["lat"], ac["lon"])
                    alt_km = feet_to_km(ac["alt"])
                    
                    if dist > 0:
                        elev = math.degrees(math.atan2(alt_km, dist))
                    else:
                        elev = 90
                    
                    if dist < 250 and elev > -10:
                        objects.append({
                            "type": "aircraft",
                            "name": ac["callsign"] if ac["callsign"] != "N/A" else ac["icao"][:8],
                            "distance": dist,
                            "altitude": elev,
                            "azimuth": bearing,
                            "speed": ac["speed"],
                            "lat": ac["lat"],
                            "lon": ac["lon"],
                            "visible": elev > 0,
                            "track": ac["track"],
                            "icao": ac["icao"],
                        })
                
                objects.sort(key=lambda x: x["distance"])
                objects = objects[:20]
                current_objects = objects
                
                for obj in objects:
                    az = obj["azimuth"]
                    alt = obj["altitude"]
                    dist = obj["distance"]
                    name = obj["name"]
                    
                    if alt > 90:
                        alt = 90
                    if alt < -90:
                        alt = -90
                    
                    r = max(0, (90 - alt) / 90.0 * (CENTER - 30))
                    a = math.radians(az)
                    x = CENTER + r * math.sin(a)
                    y = CENTER - r * math.cos(a)
                    
                    x = max(20, min(SIZE - 20, x))
                    y = max(20, min(SIZE - 20, y))
                    
                    canvas.create_oval(x-6, y-6, x+6, y+6, fill=RED, outline="white", width=2)
                    label_text = f"{name[:12]} {dist:.0f}km {alt:.0f}°"
                    canvas.create_text(x+12, y-10, text=label_text, fill=RED, anchor="w", font=("Consolas", 8))
                    
                    mx = int((obj["lon"] + 180) / 360 * 360)
                    my = int((90 - obj["lat"]) / 180 * 180)
                    
                    if 0 <= mx < 360 and 0 <= my < 180:
                        map_canvas.create_oval(mx-3, my-3, mx+3, my+3, fill=RED, outline="white")
                
                aircraft_listbox.delete(0, tk.END)
                for obj in objects:
                    aircraft_type = get_aircraft_type(obj["name"])
                    airline = get_airline_name(obj["name"])
                    direction = bearing_to_direction(obj["azimuth"])
                    speed = f"{obj['speed']:.0f} kts" if obj["speed"] else "N/A"
                    
                    header = f"✈ {obj['name']} ({obj['icao']})"
                    aircraft_listbox.insert(tk.END, header)
                    aircraft_listbox.insert(tk.END, f"  Aircraft:  {aircraft_type}")
                    aircraft_listbox.insert(tk.END, f"  Airline:   {airline}")
                    aircraft_listbox.insert(tk.END, f"  Direction: {direction} ({obj['azimuth']:.0f}°)")
                    aircraft_listbox.insert(tk.END, f"  Speed:     {speed}")
                    aircraft_listbox.insert(tk.END, f"  Distance:  {obj['distance']:.1f} km")
                    aircraft_listbox.insert(tk.END, f"  Altitude:  {int(obj['altitude']*1000):.0f} ft")
                    aircraft_listbox.insert(tk.END, "")
                
                visible_aircraft = len([o for o in objects if o.get("visible")])
                status.config(text=f"Tracking: {visible_aircraft} aircraft visible")
                debug.config(text=f"Total aircraft: {len(objects)}")
                
            except Exception as e:
                debug.config(text=f"Error: {str(e)[:60]}")
    
        def on_refresh():
            refresh_btn.config(state="disabled", bg=YELLOW)
            refresh_btn.update()
            perform_update()
            refresh_btn.config(state="normal", bg=RED)
    
        refresh_btn.config(command=on_refresh)
    
    # ==============================
    # SATELLITE TRACKER WINDOW
    # ==============================
    def create_satellite_window():
        satellite_window = tk.Tk()
        satellite_window.title("Satellite Tracker")
        satellite_window.geometry("1300x750")
        satellite_window.configure(bg="black")
    
        def on_closing():
            satellite_window.destroy()
            root.deiconify()
    
        satellite_window.protocol("WM_DELETE_WINDOW", on_closing)
    
        # Top info panel
        top_frame = tk.Frame(satellite_window, bg="black")
        top_frame.pack(fill="x")
    
        info = tk.Label(top_frame, fg=GREEN, bg="black", font=FONT,
                        text=f"Lat {LAT:.4f} | Lon {LON:.4f}")
        info.pack(side="left", padx=5)
    
        clock = tk.Label(top_frame, fg=GREEN, bg="black", font=FONT)
        clock.pack(side="left", padx=5)
    
        refresh_btn = tk.Button(top_frame, text="REFRESH", bg=GREEN, fg="black", font=("Consolas", 10, "bold"),
                                 relief="raised", bd=2, width=15)
        refresh_btn.pack(side="left", padx=10)
    
        status = tk.Label(top_frame, fg=YELLOW, bg="black", font=("Consolas", 8))
        status.pack(side="left", padx=5)
    
        # Main content frame
        content_frame = tk.Frame(satellite_window, bg="black")
        content_frame.pack(fill="both", expand=True)
    
        # Left side - Radar
        left_frame = tk.Frame(content_frame, bg="black")
        left_frame.pack(side="left", fill="both", expand=True)
    
        debug = tk.Label(left_frame, fg=CYAN, bg="black", font=("Consolas", 8))
        debug.pack()
    
        SIZE = 500
        CENTER = SIZE // 2
        canvas = tk.Canvas(left_frame, width=SIZE, height=SIZE, bg="black", highlightthickness=0)
        canvas.pack(pady=10)
    
        def draw_radar():
            canvas.delete("radar")
            canvas.create_oval(10, 10, SIZE-10, SIZE-10, outline=GREEN, tags="radar", width=2)
            canvas.create_line(CENTER, 10, CENTER, SIZE-10, fill=GREEN, tags="radar")
            canvas.create_line(10, CENTER, SIZE-10, CENTER, fill=GREEN, tags="radar")
            
            for km, ratio in [(500, 0.2), (1000, 0.4), (1500, 0.6), (2000, 0.8), (2500, 1.0)]:
                ring_px = ratio / 2500.0 * (CENTER - 20)
                canvas.create_oval(CENTER-ring_px, CENTER-ring_px, CENTER+ring_px, CENTER+ring_px, 
                                  outline=GREEN, dash=(2, 2), tags="radar", width=1)
                canvas.create_text(CENTER + ring_px, CENTER, text=f"{km}km", fill=GREEN, font=("Consolas", 8), tags="radar")
    
        draw_radar()
    
        map_canvas = tk.Canvas(left_frame, width=360, height=180, bg="black", highlightthickness=1, relief="solid")
        map_canvas.pack()
        map_canvas.create_rectangle(0, 0, 360, 180, outline=GREEN, width=2)
        map_canvas.create_text(180, 10, text="World Map", fill=GREEN, font=("Consolas", 8))
    
        # Right side - Sidebar
        sidebar_frame = tk.Frame(content_frame, bg="black", width=350)
        sidebar_frame.pack(side="right", fill="both", padx=10, pady=10)
        sidebar_frame.pack_propagate(False)
    
        sidebar_title = tk.Label(sidebar_frame, text="SATELLITE DATA", fg=GREEN, bg="black", 
                                 font=("Consolas", 11, "bold"))
        sidebar_title.pack(fill="x", pady=5)
    
        sidebar_divider = tk.Frame(sidebar_frame, bg=GREEN, height=2)
        sidebar_divider.pack(fill="x", pady=5)
    
        sidebar_content = tk.Frame(sidebar_frame, bg="black")
        sidebar_content.pack(fill="both", expand=True)
    
        scrollbar = ttk.Scrollbar(sidebar_content)
        scrollbar.pack(side="right", fill="y")
    
        sat_listbox = tk.Listbox(sidebar_content, bg="#001100", fg=GREEN, font=("Consolas", 8),
                                 yscrollcommand=scrollbar.set, relief="flat", bd=0)
        sat_listbox.pack(side="left", fill="both", expand=True)
        scrollbar.config(command=sat_listbox.yview)
    
        sat_objs = {}
    
        def perform_update():
            try:
                now = datetime.now(timezone.utc)
                clock.config(text=f"UTC {now.strftime('%H:%M:%S')}")
                
                canvas.delete("all")
                draw_radar()
                map_canvas.delete("all")
                map_canvas.create_rectangle(0, 0, 360, 180, outline=GREEN, width=2)
                map_canvas.create_text(180, 10, text="World Map", fill=GREEN, font=("Consolas", 8))
                
                t = ts.now()
                objects = []
                
                sat_count = 0
                for name, (l1, l2) in sat_data.items():
                    try:
                        sat = sat_objs.setdefault(name, load.tle(l1, l2, name))
                        astrometric = sat.at(t)
                        alt, az, dist = astrometric.apparent().relative_to(observer).altaz()
                        
                        if alt.degrees > -5:
                            objects.append({
                                "type": "satellite",
                                "name": name[:20],
                                "distance": dist.km,
                                "altitude": alt.degrees,
                                "azimuth": az.degrees,
                                "speed": 7.8,
                                "visible": alt.degrees > 0,
                            })
                            sat_count += 1
                            if sat_count >= 100:
                                break
                    except:
                        pass
                
                objects.sort(key=lambda x: x["distance"])
                objects = objects[:20]
                
                for obj in objects:
                    az = obj["azimuth"]
                    alt = obj["altitude"]
                    dist = obj["distance"]
                    name = obj["name"]
                    
                    if alt > 90:
                        alt = 90
                    if alt < -90:
                        alt = -90
                    
                    r = max(0, (90 - alt) / 90.0 * (CENTER - 30))
                    a = math.radians(az)
                    x = CENTER + r * math.sin(a)
                    y = CENTER - r * math.cos(a)
                    
                    x = max(20, min(SIZE - 20, x))
                    y = max(20, min(SIZE - 20, y))
                    
                    canvas.create_oval(x-6, y-6, x+6, y+6, fill=GREEN, outline="white", width=2)
                    label_text = f"{name[:12]} {dist:.0f}km {alt:.0f}°"
                    canvas.create_text(x+12, y-10, text=label_text, fill=GREEN, anchor="w", font=("Consolas", 8))
                    
                    try:
                        sat = sat_objs.get(name)
                        if sat:
                            sub = sat.at(t).subpoint()
                            mx = int((sub.longitude.degrees + 180) / 360 * 360)
                            my = int((90 - sub.latitude.degrees) / 180 * 180)
                            if 0 <= mx < 360 and 0 <= my < 180:
                                map_canvas.create_oval(mx-3, my-3, mx+3, my+3, fill=GREEN, outline="white")
                    except:
                        pass
                
                sat_listbox.delete(0, tk.END)
                for obj in objects:
                    direction = bearing_to_direction(obj["azimuth"])
                    
                    header = f"🛰 {obj['name']}"
                    sat_listbox.insert(tk.END, header)
                    sat_listbox.insert(tk.END, f"  Distance:  {obj['distance']:.1f} km")
                    sat_listbox.insert(tk.END, f"  Altitude:  {obj['altitude']:.2f}°")
                    sat_listbox.insert(tk.END, f"  Direction: {direction} ({obj['azimuth']:.0f}°)")
                    sat_listbox.insert(tk.END, f"  Speed:     {obj['speed']:.1f} km/s")
                    sat_listbox.insert(tk.END, f"  Status:    {'VISIBLE' if obj['visible'] else 'Below Horizon'}")
                    sat_listbox.insert(tk.END, "")
                
                visible_sats = len([o for o in objects if o.get("visible")])
                status.config(text=f"Tracking: {visible_sats} satellites visible")
                debug.config(text=f"Total satellites: {len(objects)} | Catalog: {len(sat_data)}")
                
            except Exception as e:
                debug.config(text=f"Error: {str(e)[:60]}")
    
        def on_refresh():
            refresh_btn.config(state="disabled", bg=YELLOW)
            refresh_btn.update()
            perform_update()
            refresh_btn.config(state="normal", bg=GREEN)
    
        refresh_btn.config(command=on_refresh)
    
    root.mainloop()
    
    
    General Discussion

  • GSC MP-Menu Base
    paco_1undefined paco_1

    SORRY EVERYONE! Updated UI, Mods with better explanations, and better UI Controls will be posted soon! I code random things when im drunk and/or bored so posting is dependent on my motive.

    BO2 Modding Support & Discussion

  • GSC MP-Menu Base
    paco_1undefined paco_1

    Here Is a Simple MP-Mod Menu Base Made By Me 🙂

    It took me a few days to learn some things as this is my first GSC Mod Menu/ Script as a whole but feel free to copy, edit, learn, etc.

    I will post improved versions as I continue to learn.

    I will also continue to label lines of code with semi-descriptive "//" lines as to help with the code

    /*
    * BO2 Plutonium Mod Menu with Background, Border & Full Submenu System
    * C++ syntax compatible
    */
    
    #include maps\mp\_utility;
    #include common_scripts\utility;
    #include maps\mp\gametypes\_hud_util;
    
    init()
    {
        level thread onPlayerConnect();
    }
    
    onPlayerConnect()
    {
        for(;;)
        {
            level waittill("connected", player);
            player thread onPlayerSpawned();
        }
    }
    
    onPlayerSpawned()
    {
        self endon("disconnect");
        
        for(;;)
        {
            self waittill("spawned_player");
            
            if(!isDefined(self.menuInit))
            {
                self.menuInit = true;
                self thread initMenu();
            }
        }
    }
    
    initMenu()
    {
        self endon("disconnect");
        
        self.menuOpen = false;
        self.menuCursor = 0;
        self.currentMenu = "main"; // Tracks current menu: "main", "aimbot", "lobby", "extra"
        
        // Mod states
        self.godMode = false;
        self.superSpeed = false;
        self.infiniteAmmo = false;
        self.aimbot = false;
        self.wallhack = false;
        
        self createMenuHUD();
        self thread menuControls();
    }
    
    createMenuHUD()
    {
    	//MENU BACKGROUND X & Y (BLACK BOX)
    	menuBG_X = 320;
    	menuBG_Y = 180;
    	
    	//MENU BACKGROUND WIDTH AND HEIGHT (BLACK BOX)
    	menuBGWidth = 200;
    	menuBGHeight = 800;
    	
    	//MENU TOP BORDER X & Y (TOP, GREEN BAR)
    	
    	menuTopBorder_X = 320;
    	menuTopBorder_Y = 100;
    	
    	//MENU BOTTOM BORDER X & Y (BOTTOM, GREEN BAR)
    	
    	menuBottomBorder_X = 320;
    	menuBottomBorder_Y = 260;
    	
    	//MENU RIGHT BORDER X & Y (RIGHT, GREEN BOX)
    	
    	menuRightBorder_X = 430;
    	menuRightBorder_Y = 179;
    	
    	//MENU LEFT BORDER X & Y (LEFT, GREEN BOX)
    	
    	menuLeftBorder_X = 210;
    	menuLeftBorder_Y = 179;
    	
        // BACKGROUND SHADER - Main black box
        self.menuBG = newClientHudElem(self);
        self.menuBG.elemType = "icon";
        self.menuBG.x = menuBG_X; // X position - 0 = center horizontally
        self.menuBG.y = menuBG_Y; // Y position - INCREASE to move DOWN, DECREASE to move UP
        self.menuBG.width = menuBGWidth; // Background width - CHANGE to make WIDER/NARROWER
        self.menuBG.height = menuBGHeight; // Background height - CHANGE to make TALLER/SHORTER
        self.menuBG.alignX = "center";
        self.menuBG.alignY = "middle";
        self.menuBG.color = (0, 0, 0); // RGB: (0,0,0)=black - CHANGE for different color
        self.menuBG.alpha = 0;
        self.menuBG setShader("white", 220, 160);
        self.menuBG.sort = -2;
        
        // BORDER - Top
        self.menuBorderTop = newClientHudElem(self);
        self.menuBorderTop.elemType = "icon";
        self.menuBorderTop.x = menuTopBorder_X;
        self.menuBorderTop.y = menuTopBorder_Y; // Top border Y position - same as (menuBG.y - menuBG.height/2)
        self.menuBorderTop.width = 220; // Same as background width
        self.menuBorderTop.height = 20; // Border thickness - CHANGE for thicker/thinner border
        self.menuBorderTop.alignX = "center";
        self.menuBorderTop.alignY = "middle";
        self.menuBorderTop.color = (0, 1, 0); // RGB: (0,1,0)=green - CHANGE border color
        self.menuBorderTop.alpha = 0;
        self.menuBorderTop setShader("white", 220, 2);
        self.menuBorderTop.sort = -1;
        
        // BORDER - Bottom
        self.menuBorderBottom = newClientHudElem(self);
        self.menuBorderBottom.elemType = "icon";
        self.menuBorderBottom.x = menuBottomBorder_X;
        self.menuBorderBottom.y = menuBottomBorder_Y; // Bottom border Y position
        self.menuBorderBottom.width = 222;
        self.menuBorderBottom.height = 5;
        self.menuBorderBottom.alignX = "center";
        self.menuBorderBottom.alignY = "middle";
        self.menuBorderBottom.color = (0, 1, 0); // Green border
        self.menuBorderBottom.alpha = 0;
        self.menuBorderBottom setShader("white", 220, 2);
        self.menuBorderBottom.sort = -1;
        
        // BORDER - Left
        self.menuBorderLeft = newClientHudElem(self);
        self.menuBorderLeft.elemType = "icon";
        self.menuBorderLeft.x = menuLeftBorder_X; // Left border X position
        self.menuBorderLeft.y = menuLeftBorder_Y;
        self.menuBorderLeft.width = 5;
        self.menuBorderLeft.height = 160;
        self.menuBorderLeft.alignX = "center";
        self.menuBorderLeft.alignY = "middle";
        self.menuBorderLeft.color = (0, 1, 0);
        self.menuBorderLeft.alpha = 0;
        self.menuBorderLeft setShader("white", 2, 160);
        self.menuBorderLeft.sort = -1;
        
        // BORDER - Right
        self.menuBorderRight = newClientHudElem(self);
        self.menuBorderRight.elemType = "icon";
        self.menuBorderRight.x = menuRightBorder_X; // Right border X position
        self.menuBorderRight.y = menuRightBorder_Y;
        self.menuBorderRight.width = 5;
        self.menuBorderRight.height = 180;
        self.menuBorderRight.alignX = "center";
        self.menuBorderRight.alignY = "middle";
        self.menuBorderRight.color = (0, 1, 0);
        self.menuBorderRight.alpha = 0;
        self.menuBorderRight setShader("white", 2, 160);
        self.menuBorderRight.sort = -1;
        
        // MENU TITLE
        self.menuTitle = self createFontString("objective", 1.5);
        self.menuTitle.x = 0;
        self.menuTitle.y = 100; // Title Y position - INCREASE to move DOWN
        self.menuTitle.alignX = "center";
        self.menuTitle.alignY = "middle";
        self.menuTitle.alpha = 0;
        self.menuTitle.sort = 1;
        self.menuTitle.label = &"MAIN MENU";
        
        // MENU OPTION 1
        self.menuText0 = self createFontString("objective", 1.2);
        self.menuText0.x = 0;
        self.menuText0.y = 140; // Option 1 Y position
        self.menuText0.alignX = "center";
        self.menuText0.alignY = "middle";
        self.menuText0.alpha = 0;
        self.menuText0.sort = 1;
        
        // MENU OPTION 2
        self.menuText1 = self createFontString("objective", 1.2);
        self.menuText1.x = 0;
        self.menuText1.y = 160; // Option 2 Y position
        self.menuText1.alignX = "center";
        self.menuText1.alignY = "middle";
        self.menuText1.alpha = 0;
        self.menuText1.sort = 1;
        
        // MENU OPTION 3
        self.menuText2 = self createFontString("objective", 1.2);
        self.menuText2.x = 0;
        self.menuText2.y = 180; // Option 3 Y position
        self.menuText2.alignX = "center";
        self.menuText2.alignY = "middle";
        self.menuText2.alpha = 0;
        self.menuText2.sort = 1;
        
        // MENU OPTION 4
        self.menuText3 = self createFontString("objective", 1.2);
        self.menuText3.x = 0;
        self.menuText3.y = 200; // Option 4 Y position
        self.menuText3.alignX = "center";
        self.menuText3.alignY = "middle";
        self.menuText3.alpha = 0;
        self.menuText3.sort = 1;
    }
    
    menuControls()
    {
        self endon("disconnect");
        
        for(;;)
        {
            if(!self.menuOpen && self AdsButtonPressed() && self MeleeButtonPressed())
            {
                self showMenu();
                wait 0.3;
            }
            
            if(self.menuOpen)
            {
                // SCROLL UP
                if(self ActionSlotOneButtonPressed())
                {
                    self scrollUp();
                    wait 0.15;
                }
                
                // SCROLL DOWN
                if(self ActionSlotTwoButtonPressed())
                {
                    self scrollDown();
                    wait 0.15;
                }
                
                // SELECT OPTION
                if(self UseButtonPressed())
                {
                    self selectOption();
                    wait 0.2;
                }
                
                // CLOSE MENU or GO BACK
                if(self MeleeButtonPressed())
                {
                    if(self.currentMenu == "main")
                    {
                        self hideMenu();
                    }
                    else
                    {
                        self goBack();
                    }
                    wait 0.05;
                }
            }
            
            wait 0.05;
        }
    }
    
    showMenu()
    {
        self.menuOpen = true;
        self.menuCursor = 0;
        self.currentMenu = "main";
        
        // Show background and borders
        self.menuBG.alpha = 0.7; // Background transparency - CHANGE for more/less transparent
        self.menuBorderTop.alpha = 1;
        self.menuBorderBottom.alpha = 1;
        self.menuBorderLeft.alpha = 1;
        self.menuBorderRight.alpha = 1;
        self.menuTitle.alpha = 1;
        
        self updateMenu();
    }
    
    hideMenu()
    {
        self.menuOpen = false;
        
        // Hide all elements
        self.menuBG.alpha = 0;
        self.menuBorderTop.alpha = 0;
        self.menuBorderBottom.alpha = 0;
        self.menuBorderLeft.alpha = 0;
        self.menuBorderRight.alpha = 0;
        self.menuTitle.alpha = 0;
        self.menuText0.alpha = 0;
        self.menuText1.alpha = 0;
        self.menuText2.alpha = 0;
        self.menuText3.alpha = 0;
    }
    
    updateMenu()
    {
        self.menuText0.alpha = 1;
        self.menuText1.alpha = 1;
        self.menuText2.alpha = 1;
        self.menuText3.alpha = 1;
        
        // Display different menus based on currentMenu
        if(self.currentMenu == "main")
        {
            // MAIN MENU - 4 options to access submenus
            self.menuTitle.label = &"Test Menu v1.0";
            
            if(self.menuCursor == 0)
                self.menuText0.label = &"-> Aimbot Menu";
            else
                self.menuText0.label = &"   Aimbot Menu";
            
            if(self.menuCursor == 1)
                self.menuText1.label = &"-> Lobby Menu";
            else
                self.menuText1.label = &"   Lobby Menu";
            
            if(self.menuCursor == 2)
                self.menuText2.label = &"-> Extra Mods";
            else
                self.menuText2.label = &"   Extra Mods";
            
            if(self.menuCursor == 3)
                self.menuText3.label = &"-> Exit Menu";
            else
                self.menuText3.label = &"   Exit Menu";
        }
        else if(self.currentMenu == "aimbot")
        {
            // AIMBOT MENU
            self.menuTitle.label = &"AIMBOT MENU";
            
            if(self.menuCursor == 0)
                self.menuText0.label = &"-> Aimbot";
            else
                self.menuText0.label = &"   Aimbot";
            
            if(self.menuCursor == 1)
                self.menuText1.label = &"-> Wallhack";
            else
                self.menuText1.label = &"   Wallhack";
            
            if(self.menuCursor == 2)
                self.menuText2.label = &"-> Auto Aim";
            else
                self.menuText2.label = &"   Auto Aim";
            
            if(self.menuCursor == 3)
                self.menuText3.label = &"-> Back";
            else
                self.menuText3.label = &"   Back";
        }
        else if(self.currentMenu == "lobby")
        {
            // LOBBY MENU
            self.menuTitle.label = &"LOBBY MENU";
            
            if(self.menuCursor == 0)
                self.menuText0.label = &"-> God Mode";
            else
                self.menuText0.label = &"   God Mode";
            
            if(self.menuCursor == 1)
                self.menuText1.label = &"-> Super Speed";
            else
                self.menuText1.label = &"   Super Speed";
            
            if(self.menuCursor == 2)
                self.menuText2.label = &"-> Infinite Ammo";
            else
                self.menuText2.label = &"   Infinite Ammo";
            
            if(self.menuCursor == 3)
                self.menuText3.label = &"-> Back";
            else
                self.menuText3.label = &"   Back";
        }
        else if(self.currentMenu == "extra")
        {
            // EXTRA MODS MENU
            self.menuTitle.label = &"EXTRA MODS";
            
            if(self.menuCursor == 0)
                self.menuText0.label = &"-> Unlimited Sprint";
            else
                self.menuText0.label = &"   Unlimited Sprint";
            
            if(self.menuCursor == 1)
                self.menuText1.label = &"-> No Recoil";
            else
                self.menuText1.label = &"   No Recoil";
            
            if(self.menuCursor == 2)
                self.menuText2.label = &"-> Third Person";
            else
                self.menuText2.label = &"   Third Person";
            
            if(self.menuCursor == 3)
                self.menuText3.label = &"-> Back";
            else
                self.menuText3.label = &"   Back";
        }
    }
    
    scrollUp()
    {
        self.menuCursor--;
        if(self.menuCursor < 0)
        {
            self.menuCursor = 1; // We have 4 options (0, 1, 2, 3)
        }
        self updateMenu();
    }
    
    scrollDown()
    {
        self.menuCursor++;
        if(self.menuCursor > 3) // 4 options total
        {
            self.menuCursor = 1;
        }
        self updateMenu();
    }
    
    selectOption()
    {
        if(self.currentMenu == "main")
        {
            // MAIN MENU SELECTIONS
            if(self.menuCursor == 0)
            {
                // Open Aimbot Menu
                self.currentMenu = "aimbot";
                self.menuCursor = 1;
                self updateMenu();
            }
            else if(self.menuCursor == 1)
            {
                // Open Lobby Menu
                self.currentMenu = "lobby";
                self.menuCursor = 0;
                self updateMenu();
            }
            else if(self.menuCursor == 2)
            {
                // Open Extra Mods
                self.currentMenu = "extra";
                self.menuCursor = 0;
                self updateMenu();
            }
            else if(self.menuCursor == 3)
            {
                self hideMenu(); // Exit
            }
        }
        else if(self.currentMenu == "aimbot")
        {
            // AIMBOT MENU SELECTIONS
            if(self.menuCursor == 0)
            {
                self toggleAimbot();
                
            }
            else if(self.menuCursor == 1)
            {
                self toggleWallhack();
          
            }
            else if(self.menuCursor == 2)
            {
            	self toggleAutoAim();
                self iprintln("^6Auto ^4Aim ^7Toggled"); // Placeholder
            }
            else if(self.menuCursor == 3)
            {
                self goBack();
            }
        }
        else if(self.currentMenu == "lobby")
        {
            // LOBBY MENU SELECTIONS
            if(self.menuCursor == 0)
            {
                self toggleGodMode();
            }
            else if(self.menuCursor == 1)
            {
                self toggleSuperSpeed();
            }
            else if(self.menuCursor == 2)
            {
                self toggleInfiniteAmmo();
            }
            else if(self.menuCursor == 3)
            {
                self goBack();
            }
        }
        else if(self.currentMenu == "extra")
        {
            // EXTRA MODS SELECTIONS
            if(self.menuCursor == 0)
            {
                self iprintln("Unlimited Sprint activated"); // Placeholder
            }
            else if(self.menuCursor == 1)
            {
                self iprintln("No Recoil activated"); // Placeholder
            }
            else if(self.menuCursor == 2)
            {
                self iprintln("Third Person activated"); // Placeholder
            }
            else if(self.menuCursor == 3)
            {
                self goBack();
            }
        }
    }
    
    goBack()
    {
        // Return to main menu
        self.currentMenu = "main";
        self.menuCursor = 1;
        self updateMenu();
    }
    
    // ========== MOD FUNCTIONS ==========
    
    toggleGodMode()
    {
        if(self.godMode)
        {
            self.godMode = false;
            self disableInvulnerability();
            self iprintlnbold("^5God ^6Mode ^4OFF");
        }
        else
        {
            self.godMode = true;
            self enableInvulnerability();
            self iprintln("^6God ^5Mode ^4ON");
        }
    }
    
    toggleSuperSpeed()
    {
        if(self.superSpeed)
        {
            self.superSpeed = false;
            self setMoveSpeedScale(1.0);
            self iprintln("Super Speed OFF");
        }
        else
        {
            self.superSpeed = true;
            self setMoveSpeedScale(2.0);
            self iprintln("Super Speed ON");
        }
    }
    
    toggleInfiniteAmmo()
    {
        if(self.infiniteAmmo)
        {
            self.infiniteAmmo = false;
            self notify("stop_infinite_ammo");
            self iprintln("Infinite Ammo OFF");
        }
        else
        {
            self.infiniteAmmo = true;
            self thread giveInfiniteAmmo();
            self iprintln("Infinite Ammo ON");
        }
    }
    
    giveInfiniteAmmo()
    {
        self endon("disconnect");
        self endon("death");
        self endon("stop_infinite_ammo");
        
        for(;;)
        {
            weapon = self getCurrentWeapon();
            if(weapon != "none")
            {
                self setWeaponAmmoClip(weapon, 999);
                self setWeaponAmmoStock(weapon, 999);
            }
            wait 0.05;
        }
    }
    
    toggleAimbot()
    {
    	self endon("death");
    	self endon("disconnect");
    	
    
    	if(self.aimbot)
    	{
    		self.aimbot = false;
    		self iprintlnbold("^6Aimbot ^4OFF");
    		}
    		else
    		{
    		self.aimbot = true;
    		self thread Aimbot();
    		self iprintlnbold("^6Aimbot ^5ON ^4Bitch ^6Boy");
    		}
    		
    }
    
    Aimbot()
    	{
    	    self endon( "disconnect" );
    	    self endon( "death" );
     
    	    for(;;)
    	    {
    	        aimAt = undefined;
    	        foreach(player in level.players)
            	{
            	    if((player == self) || (!isAlive(player)) || (level.teamBased 	&& self.pers["team"] == player.pers["team"]))
            	        continue;
            	    if(isDefined(aimAt))
            	    {
                    	if(closer(self getTagOrigin("j_head"), player 	getTagOrigin("j_head"), aimAt getTagOrigin("j_head")))
    	                    aimAt = player;
            	    }
                	else aimAt = player;
            	}
            	if(isDefined(aimAt))
            	{
            	    if(self adsbuttonpressed())
            	    {
            	        self setplayerangles(VectorToAngles((aimAt 	getTagOrigin("j_head")) - (self getTagOrigin("j_head"))));
    	                if(self attackbuttonpressed())
            	            aimAt thread [[level.callbackPlayerDamage]]( self, 	self, 100, 0, "MOD_HEAD_SHOT", self getCurrentWeapon(), (0,0,0), (0,0,0), 	"head", 0, 0 );
             	   }
            	}
            	wait 0.1;
        	}
    	}
    
    toggleWallhack()
    {
        if(self.wallhack)
        {
            self.wallhack = false;
            self iprintlnbold("Wallhack OFF");
            // Add wallhack disable code here
        }
        else
        {
            self.wallhack = true;
            self iprintlnbold("Wallhack ON");
            // Add wallhack enable code here
        }
    }
    
    toggleAutoAim()
    {
    	if (self.autoaim)
    	{
    		self.autoaim = true;
    		self iprintlnbold("^6White ^2Boy^5.^7.^4.^3. ^6Why^5?");
    		}
    		else
    		{
    			self.autoaim = false;
    			self iprintlnbold("^5Good ^7Boy");
    			
    		}
    	}
    	
    
    BO2 Modding Support & Discussion
  • 1 / 1
  • Login

  • Don't have an account? Register

  • Login or register to search.
  • First post
    Last post
0
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Donate