
Key Required

--//====================================================
--// OPTIMIERTES PARTICLE + MODEL/MESH + TNT ESP + ORE AUTO-FARM GUI
--//====================================================
--//
--// F4 = ESP ein/aus
--// F5 = Exportfenster öffnen/schließen
--// F6 = aktuellen Block debuggen
--// F7 = zuletzt gelernte Blockart kopieren
--// F8 = alle Presets als TXT speichern/kopieren
--// F9 = alle Mesh-Signaturen im Umkreis kopieren
--// F10 = Ore Auto-Farm ein/aus
--// Rechte Umschalttaste = Ore-Auswahl öffnen/schließen
--//
--// WICHTIG:
--// Nur dieses eine ESP-Script gleichzeitig benutzen.
--// Kein Server-Hopping. Zielauswahl, Bewegung und Mining laufen clientseitig.
--//
--//====================================================
--//====================================================
--// SETTINGS
--//====================================================
local SETTINGS = {
ENABLED = true,
ROOT = workspace:WaitForChild("Blocks"),
BREAKING_NAME = "Breaking",
-- Performance
SCAN_RADIUS = 500,
CELL_SIZE = 128,
REFRESH_INTERVAL = 0.75,
MOVE_THRESHOLD = 10,
-- Sehr wichtig gegen FPS-Einbrüche:
MAX_ACTIVE_HIGHLIGHTS = 120,
MAX_ACTIVE_LABELS = 55,
INITIAL_SCAN_BATCH_SIZE = 250,
REINDEX_DELAY = 0.20,
-- Rare und alles darüber anzeigen
MINIMUM_RARITY = "Rare",
-- Darstellung
SHOW_HIGHLIGHT = true,
SHOW_TEXT = true,
-- Outline-only ist deutlich leichter als eine gefüllte Markierung.
FILL_TRANSPARENCY = 1,
OUTLINE_TRANSPARENCY = 0,
BILLBOARD_SIZE = UDim2.fromOffset(210, 28),
BILLBOARD_OFFSET = Vector3.new(0, 4, 0),
LABEL_TEXT_SIZE = 14,
-- Tasten
TOGGLE_KEY = Enum.KeyCode.F4,
EXPORT_PANEL_KEY = Enum.KeyCode.F5,
DEBUG_KEY = Enum.KeyCode.F6,
COPY_LAST_KEY = Enum.KeyCode.F7,
EXPORT_ALL_KEY = Enum.KeyCode.F8,
MESH_CATALOG_KEY = Enum.KeyCode.F9,
-- Ore Auto-Farm
AUTO_FARM_ENABLED = false,
AUTO_FARM_SCAN_RADIUS = 1500,
AUTO_FARM_MINE_DISTANCE = 14,
AUTO_FARM_STOP_DISTANCE = 5,
AUTO_FARM_GLIDE_SPEED = 300,
AUTO_FARM_TARGET_REFRESH_INTERVAL = 0.22,
AUTO_FARM_STUCK_TIMEOUT = 20,
AUTO_FARM_IGNORE_TIME = 12,
-- "HighestRarity" oder "Nearest"
AUTO_FARM_PRIORITY = "HighestRarity",
-- Bewegungs-/Zieleinstellungen
AUTO_FARM_GLIDE_ENABLED = true,
AUTO_FARM_NOCLIP_WHILE_GLIDING = true,
AUTO_FARM_ROTATE_CHARACTER = true,
-- Für das Mining-System aus deinem Beispiel muss die echte Kamera
-- standardmäßig auf den Block zeigen. Im GUI kann dies abgeschaltet
-- werden; MouseOnly funktioniert nur, wenn der Block bereits im Bild ist.
AUTO_FARM_AIM_CAMERA = true,
AUTO_FARM_RESTORE_CAMERA_AFTER_TARGET = false,
-- Beim ersten Start werden Rare und höher ausgewählt.
-- Werte: "RarePlus", "All" oder "None"
AUTO_FARM_DEFAULT_SELECTION = "RarePlus",
AUTO_FARM_TOGGLE_KEY = Enum.KeyCode.F10,
AUTO_FARM_GUI_KEY = Enum.KeyCode.RightShift,
-- Partikelerkennung
REQUIRE_PARTICLE_ENABLED = false,
PARTICLE_MAX_COLOR_DISTANCE = 0.45,
PARTICLE_COLORS = {
Uncommon = Color3.fromRGB(0, 255, 40),
Rare = Color3.fromRGB(20, 80, 255),
Epic = Color3.fromRGB(170, 20, 255),
Legendary = Color3.fromRGB(255, 235, 0),
Mythic = Color3.fromRGB(255, 25, 35),
},
-- Ziel-/Lernerkennung
LEARN_STABILITY_TIME = 0.22,
TARGET_SEARCH_SIZE = Vector3.new(12, 12, 12),
TARGET_MAX_CENTER_DISTANCE = 3,
-- Export
AUTO_COPY_NEW_NAMED_BLOCK = true,
EXPORT_GENERIC_PARTICLE_TYPES = true,
EXPORT_ONLY_RARE_OR_HIGHER = false,
EXPORT_FILE_PREFIX = "RareESP_Presets",
MESH_CATALOG_FILE_PREFIX = "Nearby_Mesh_Catalog",
AUTO_COPY_MESH_CATALOG_AFTER_INITIAL_SCAN = true,
MESH_CATALOG_BATCH_SIZE = 250,
INCLUDE_KNOWN_MESHES_IN_CATALOG = true,
RARITY_ORDER = {
"Common",
"Uncommon",
"Rare",
"Epic",
"Legendary",
"Mythic",
"Celestial",
"Divine",
"Godly",
"Secret",
"Exotic",
"Unique",
},
RARITY_COLORS = {
Common = Color3.fromRGB(180, 180, 180),
Uncommon = Color3.fromRGB(40, 255, 40),
Rare = Color3.fromRGB(25, 125, 255),
Epic = Color3.fromRGB(180, 50, 255),
Legendary = Color3.fromRGB(255, 225, 20),
Mythic = Color3.fromRGB(255, 35, 65),
Celestial = Color3.fromRGB(0, 255, 230),
Divine = Color3.fromRGB(255, 255, 120),
Godly = Color3.fromRGB(255, 210, 50),
Secret = Color3.fromRGB(255, 255, 255),
Exotic = Color3.fromRGB(255, 70, 210),
Unique = Color3.fromRGB(255, 105, 120),
},
-- Bereits bekannte Schlüssel
PRESETS = {
-- Auto_Mythic_6236733 [Mythic]
["C:A:120350511430348|75926406236733"] = {Name = "Auto_Mythic_6236733", Rarity = "Mythic"},
["A:120350511430348|75926406236733"] = {Name = "Auto_Mythic_6236733", Rarity = "Mythic"},
["M:120350511430348"] = {Name = "Auto_Mythic_6236733", Rarity = "Mythic"},
-- Auto_Legendary_0035224 [Legendary]
["C:A:76248862374417|106695970035224"] = {Name = "Auto_Legendary_0035224", Rarity = "Legendary"},
["A:76248862374417|106695970035224"] = {Name = "Auto_Legendary_0035224", Rarity = "Legendary"},
["M:76248862374417"] = {Name = "Auto_Legendary_0035224", Rarity = "Legendary"},
-- Auto_Legendary_2167288 [Legendary]
["C:A:12742167171|12742167288"] = {Name = "Auto_Legendary_2167288", Rarity = "Legendary"},
["A:12742167171|12742167288"] = {Name = "Auto_Legendary_2167288", Rarity = "Legendary"},
["M:12742167171"] = {Name = "Auto_Legendary_2167288", Rarity = "Legendary"},
-- Kryptonite [Legendary]
["C:A:85722211082056|73516819819176"] = {Name = "Kryptonite", Rarity = "Legendary"},
["A:85722211082056|73516819819176"] = {Name = "Kryptonite", Rarity = "Legendary"},
["M:85722211082056"] = {Name = "Kryptonite", Rarity = "Legendary"},
-- Legenium [Legendary]
["C:A:12668276833|;A:12668277632|"] = {Name = "Legenium", Rarity = "Legendary"},
["A:12668276833|"] = {Name = "Legenium", Rarity = "Legendary"},
["A:12668277632|"] = {Name = "Legenium", Rarity = "Legendary"},
["M:12668276833"] = {Name = "Legenium", Rarity = "Legendary"},
["M:12668277632"] = {Name = "Legenium", Rarity = "Legendary"},
-- TNT [Legendary]
["C:A:103944260415105|119829601923664"] = {Name = "TNT", Rarity = "Legendary"},
["A:103944260415105|119829601923664"] = {Name = "TNT", Rarity = "Legendary"},
["M:103944260415105"] = {Name = "TNT", Rarity = "Legendary"},
-- Actinium [Epic]
["C:A:139910347587420|114977117680281"] = {Name = "Actinium", Rarity = "Epic"},
["A:139910347587420|114977117680281"] = {Name = "Actinium", Rarity = "Epic"},
["M:139910347587420"] = {Name = "Actinium", Rarity = "Epic"},
-- Adsimite [Epic]
["C:A:12668283152|12668283419;A:12668283729|"] = {Name = "Adsimite", Rarity = "Epic"},
["A:12668283152|12668283419"] = {Name = "Adsimite", Rarity = "Epic"},
["A:12668283729|"] = {Name = "Adsimite", Rarity = "Epic"},
["M:12668283152"] = {Name = "Adsimite", Rarity = "Epic"},
["M:12668283729"] = {Name = "Adsimite", Rarity = "Epic"},
-- Aridisols [Epic]
["M:9580210470"] = {Name = "Aridisols", Rarity = "Epic"},
-- Auto_Epic_2845098 [Epic]
["C:A:12652840507|12652845098"] = {Name = "Auto_Epic_2845098", Rarity = "Epic"},
["C:A:12653102696|12652845098"] = {Name = "Auto_Epic_2845098", Rarity = "Epic"},
["C:A:12653102697|12652845098"] = {Name = "Auto_Epic_2845098", Rarity = "Epic"},
["A:12652840507|12652845098"] = {Name = "Auto_Epic_2845098", Rarity = "Epic"},
["A:12653102696|12652845098"] = {Name = "Auto_Epic_2845098", Rarity = "Epic"},
["A:12653102697|12652845098"] = {Name = "Auto_Epic_2845098", Rarity = "Epic"},
["M:12652840507"] = {Name = "Auto_Epic_2845098", Rarity = "Epic"},
["M:12653102696"] = {Name = "Auto_Epic_2845098", Rarity = "Epic"},
["M:12653102697"] = {Name = "Auto_Epic_2845098", Rarity = "Epic"},
-- Auto_Epic_4994185 [Epic] – automatisch erkannt
["C:A:134488664704515|109404194994185"] = {Name = "Auto_Epic_4994185", Rarity = "Epic"},
["A:134488664704515|109404194994185"] = {Name = "Auto_Epic_4994185", Rarity = "Epic"},
["M:134488664704515"] = {Name = "Auto_Epic_4994185", Rarity = "Epic"},
-- Centromodor [Epic]
["C:A:13063872749|;A:13063875332|13063875788;A:13063878026|;A:13063885053|;A:13063890452|"] = {Name = "Centromodor", Rarity = "Epic"},
["A:13063872749|"] = {Name = "Centromodor", Rarity = "Epic"},
["A:13063875332|13063875788"] = {Name = "Centromodor", Rarity = "Epic"},
["A:13063878026|"] = {Name = "Centromodor", Rarity = "Epic"},
["A:13063885053|"] = {Name = "Centromodor", Rarity = "Epic"},
["A:13063890452|"] = {Name = "Centromodor", Rarity = "Epic"},
["M:13063872749"] = {Name = "Centromodor", Rarity = "Epic"},
["M:13063875332"] = {Name = "Centromodor", Rarity = "Epic"},
["M:13063878026"] = {Name = "Centromodor", Rarity = "Epic"},
["M:13063885053"] = {Name = "Centromodor", Rarity = "Epic"},
["M:13063890452"] = {Name = "Centromodor", Rarity = "Epic"},
-- Rohoccaim [Epic]
["C:A:100274047022355|84684532261334"] = {Name = "Rohoccaim", Rarity = "Epic"},
["A:100274047022355|84684532261334"] = {Name = "Rohoccaim", Rarity = "Epic"},
["M:100274047022355"] = {Name = "Rohoccaim", Rarity = "Epic"},
-- Sandstone [Epic]
["C:A:12886223803|12886223929"] = {Name = "Sandstone", Rarity = "Epic"},
["A:12886223803|12886223929"] = {Name = "Sandstone", Rarity = "Epic"},
["M:12886223803"] = {Name = "Sandstone", Rarity = "Epic"},
-- TNT [Epic]
["C:A:97885003736109|130380890874250"] = {Name = "TNT", Rarity = "Epic"},
["A:97885003736109|130380890874250"] = {Name = "TNT", Rarity = "Epic"},
["M:97885003736109"] = {Name = "TNT", Rarity = "Epic"},
-- Vaporeyester [Epic]
["C:A:13063919006|13063919402"] = {Name = "Vaporeyester", Rarity = "Epic"},
["A:13063919006|13063919402"] = {Name = "Vaporeyester", Rarity = "Epic"},
["M:13063919006"] = {Name = "Vaporeyester", Rarity = "Epic"},
-- Whihite [Epic]
["C:A:12668274552|12668274813;A:12668275044|"] = {Name = "Whihite", Rarity = "Epic"},
["A:12668274552|12668274813"] = {Name = "Whihite", Rarity = "Epic"},
["A:12668275044|"] = {Name = "Whihite", Rarity = "Epic"},
["M:12668274552"] = {Name = "Whihite", Rarity = "Epic"},
["M:12668275044"] = {Name = "Whihite", Rarity = "Epic"},
-- Wijkuled [Epic]
["C:A:111403477018732|129898682647368"] = {Name = "Wijkuled", Rarity = "Epic"},
["A:111403477018732|129898682647368"] = {Name = "Wijkuled", Rarity = "Epic"},
["M:111403477018732"] = {Name = "Wijkuled", Rarity = "Epic"},
-- Astral Fire [Rare]
["C:A:125242264007895|97373159886943"] = {Name = "Astral Fire", Rarity = "Rare"},
["A:125242264007895|97373159886943"] = {Name = "Astral Fire", Rarity = "Rare"},
["M:125242264007895"] = {Name = "Astral Fire", Rarity = "Rare"},
-- Auto_Rare_0233411 [Rare] – automatisch erkannt
["C:A:134082039520636|117157580233411"] = {Name = "Auto_Rare_0233411", Rarity = "Rare"},
["A:134082039520636|117157580233411"] = {Name = "Auto_Rare_0233411", Rarity = "Rare"},
["M:134082039520636"] = {Name = "Auto_Rare_0233411", Rarity = "Rare"},
-- Auto_Rare_0240139 [Rare] – automatisch erkannt
["C:A:72779891558093|135717520240139"] = {Name = "Auto_Rare_0240139", Rarity = "Rare"},
["A:72779891558093|135717520240139"] = {Name = "Auto_Rare_0240139", Rarity = "Rare"},
["M:72779891558093"] = {Name = "Auto_Rare_0240139", Rarity = "Rare"},
-- Auto_Rare_0601679 [Rare] – automatisch erkannt
["C:A:137643791181455|75656910601679"] = {Name = "Auto_Rare_0601679", Rarity = "Rare"},
["A:137643791181455|75656910601679"] = {Name = "Auto_Rare_0601679", Rarity = "Rare"},
["M:137643791181455"] = {Name = "Auto_Rare_0601679", Rarity = "Rare"},
-- Auto_Rare_0746993 [Rare] – automatisch erkannt
["C:A:140566947873176|74815140746993"] = {Name = "Auto_Rare_0746993", Rarity = "Rare"},
["A:140566947873176|74815140746993"] = {Name = "Auto_Rare_0746993", Rarity = "Rare"},
["M:140566947873176"] = {Name = "Auto_Rare_0746993", Rarity = "Rare"},
-- Auto_Rare_0849077 [Rare] – automatisch erkannt
["C:A:92087522038157|87320170849077"] = {Name = "Auto_Rare_0849077", Rarity = "Rare"},
["A:92087522038157|87320170849077"] = {Name = "Auto_Rare_0849077", Rarity = "Rare"},
["M:92087522038157"] = {Name = "Auto_Rare_0849077", Rarity = "Rare"},
-- Auto_Rare_2845098 [Rare]
["C:A:12652840431|12652845098"] = {Name = "Auto_Rare_2845098", Rarity = "Rare"},
["A:12652840431|12652845098"] = {Name = "Auto_Rare_2845098", Rarity = "Rare"},
["M:12652840431"] = {Name = "Auto_Rare_2845098", Rarity = "Rare"},
-- Auto_Rare_4219290 [Rare] – automatisch erkannt
["C:A:107423985770360|125063304219290"] = {Name = "Auto_Rare_4219290", Rarity = "Rare"},
["A:107423985770360|125063304219290"] = {Name = "Auto_Rare_4219290", Rarity = "Rare"},
["M:107423985770360"] = {Name = "Auto_Rare_4219290", Rarity = "Rare"},
-- Auto_Rare_4390009 [Rare] – automatisch erkannt
["C:A:120892299413808|123600984390009"] = {Name = "Auto_Rare_4390009", Rarity = "Rare"},
["A:120892299413808|123600984390009"] = {Name = "Auto_Rare_4390009", Rarity = "Rare"},
["M:120892299413808"] = {Name = "Auto_Rare_4390009", Rarity = "Rare"},
-- Auto_Rare_5700203 [Rare] – automatisch erkannt
["C:A:137069588226924|127034325700203"] = {Name = "Auto_Rare_5700203", Rarity = "Rare"},
["A:137069588226924|127034325700203"] = {Name = "Auto_Rare_5700203", Rarity = "Rare"},
["M:137069588226924"] = {Name = "Auto_Rare_5700203", Rarity = "Rare"},
-- Auto_Rare_6406997 [Rare] – automatisch erkannt
["C:A:112644729587301|90954886406997"] = {Name = "Auto_Rare_6406997", Rarity = "Rare"},
["A:112644729587301|90954886406997"] = {Name = "Auto_Rare_6406997", Rarity = "Rare"},
["M:112644729587301"] = {Name = "Auto_Rare_6406997", Rarity = "Rare"},
-- Auto_Rare_8228427 [Rare]
["C:A:12358190837|12358228427"] = {Name = "Auto_Rare_8228427", Rarity = "Rare"},
["A:12358190837|12358228427"] = {Name = "Auto_Rare_8228427", Rarity = "Rare"},
["M:12358190837"] = {Name = "Auto_Rare_8228427", Rarity = "Rare"},
-- Auto_Rare_8824073 [Rare] – automatisch erkannt
["C:A:108925664768254|78184738824073"] = {Name = "Auto_Rare_8824073", Rarity = "Rare"},
["A:108925664768254|78184738824073"] = {Name = "Auto_Rare_8824073", Rarity = "Rare"},
["M:108925664768254"] = {Name = "Auto_Rare_8824073", Rarity = "Rare"},
-- Auto_Rare_9098688 [Rare] – automatisch erkannt
["C:A:95886161883237|75031979098688"] = {Name = "Auto_Rare_9098688", Rarity = "Rare"},
["A:95886161883237|75031979098688"] = {Name = "Auto_Rare_9098688", Rarity = "Rare"},
["M:95886161883237"] = {Name = "Auto_Rare_9098688", Rarity = "Rare"},
-- Caliche [Rare]
["C:A:12886224217|12886224354"] = {Name = "Caliche", Rarity = "Rare"},
["A:12886224217|12886224354"] = {Name = "Caliche", Rarity = "Rare"},
["M:12886224217"] = {Name = "Caliche", Rarity = "Rare"},
-- Compost [Rare]
["M:9579901695"] = {Name = "Compost", Rarity = "Rare"},
-- Conglomerate [Rare]
["C:A:12886225915|12886226011"] = {Name = "Conglomerate", Rarity = "Rare"},
["A:12886225915|12886226011"] = {Name = "Conglomerate", Rarity = "Rare"},
["M:12886225915"] = {Name = "Conglomerate", Rarity = "Rare"},
-- Dotorite [Rare]
["C:A:13063879215|13063947606;A:13069125646|13069126336"] = {Name = "Dotorite", Rarity = "Rare"},
["A:13063879215|13063947606"] = {Name = "Dotorite", Rarity = "Rare"},
["A:13069125646|13069126336"] = {Name = "Dotorite", Rarity = "Rare"},
["M:13063879215"] = {Name = "Dotorite", Rarity = "Rare"},
["M:13069125646"] = {Name = "Dotorite", Rarity = "Rare"},
-- Flaming Hate [Rare]
["C:A:134692958805210|77449849328610"] = {Name = "Flaming Hate", Rarity = "Rare"},
["A:134692958805210|77449849328610"] = {Name = "Flaming Hate", Rarity = "Rare"},
["M:134692958805210"] = {Name = "Flaming Hate", Rarity = "Rare"},
-- Lava Shards [Rare]
["C:A:12652840423|12652845098"] = {Name = "Lava Shards", Rarity = "Rare"},
["A:12652840423|12652845098"] = {Name = "Lava Shards", Rarity = "Rare"},
["M:12652840423"] = {Name = "Lava Shards", Rarity = "Rare"},
-- Malacitea [Rare]
["C:A:129876199640635|91880738170685"] = {Name = "Malacitea", Rarity = "Rare"},
["A:129876199640635|91880738170685"] = {Name = "Malacitea", Rarity = "Rare"},
["M:129876199640635"] = {Name = "Malacitea", Rarity = "Rare"},
-- Molten Debris [Rare]
["C:A:12653102669|12652845098"] = {Name = "Molten Debris", Rarity = "Rare"},
["A:12653102669|12652845098"] = {Name = "Molten Debris", Rarity = "Rare"},
["M:12653102669"] = {Name = "Molten Debris", Rarity = "Rare"},
-- Pyrrhomomite [Rare]
["C:A:13063886004|13063914193"] = {Name = "Pyrrhomomite", Rarity = "Rare"},
["A:13063886004|13063914193"] = {Name = "Pyrrhomomite", Rarity = "Rare"},
-- Radium [Rare]
["C:A:124193659902922|105007020059492"] = {Name = "Radium", Rarity = "Rare"},
["A:124193659902922|105007020059492"] = {Name = "Radium", Rarity = "Rare"},
["M:124193659902922"] = {Name = "Radium", Rarity = "Rare"},
-- Red Beryl [Rare]
["C:A:12653102729|12652845098"] = {Name = "Red Beryl", Rarity = "Rare"},
["A:12653102729|12652845098"] = {Name = "Red Beryl", Rarity = "Rare"},
["M:12653102729"] = {Name = "Red Beryl", Rarity = "Rare"},
-- TNT [Rare]
["C:A:130746239003755|124961572735961"] = {Name = "TNT", Rarity = "Rare"},
["A:130746239003755|124961572735961"] = {Name = "TNT", Rarity = "Rare"},
["M:130746239003755"] = {Name = "TNT", Rarity = "Rare"},
-- Xapotote [Rare]
["C:A:12652840395|12652845098"] = {Name = "Xapotote", Rarity = "Rare"},
["A:12652840395|12652845098"] = {Name = "Xapotote", Rarity = "Rare"},
["M:12652840395"] = {Name = "Xapotote", Rarity = "Rare"},
-- Zoniumite [Rare]
["C:A:12668276298|12668276589;A:12668277136|12668277414"] = {Name = "Zoniumite", Rarity = "Rare"},
["A:12668276298|12668276589"] = {Name = "Zoniumite", Rarity = "Rare"},
["A:12668277136|12668277414"] = {Name = "Zoniumite", Rarity = "Rare"},
["M:12668276298"] = {Name = "Zoniumite", Rarity = "Rare"},
["M:12668277136"] = {Name = "Zoniumite", Rarity = "Rare"},
-- Artificial Cube [Uncommon]
["C:A:12653102631|12652845098"] = {Name = "Artificial Cube", Rarity = "Uncommon"},
["A:12653102631|12652845098"] = {Name = "Artificial Cube", Rarity = "Uncommon"},
["M:12653102631"] = {Name = "Artificial Cube", Rarity = "Uncommon"},
-- Auto_Uncommon_0328260 [Uncommon] – automatisch erkannt
["C:A:100056644333200|95914030328260"] = {Name = "Auto_Uncommon_0328260", Rarity = "Uncommon"},
["A:100056644333200|95914030328260"] = {Name = "Auto_Uncommon_0328260", Rarity = "Uncommon"},
["M:100056644333200"] = {Name = "Auto_Uncommon_0328260", Rarity = "Uncommon"},
-- Auto_Uncommon_1596934 [Uncommon] – automatisch erkannt
["C:A:128895384421737|123488431596934"] = {Name = "Auto_Uncommon_1596934", Rarity = "Uncommon"},
["A:128895384421737|123488431596934"] = {Name = "Auto_Uncommon_1596934", Rarity = "Uncommon"},
["M:128895384421737"] = {Name = "Auto_Uncommon_1596934", Rarity = "Uncommon"},
-- Auto_Uncommon_1617885 [Uncommon] – automatisch erkannt
["C:A:126776521696833|138015221617885"] = {Name = "Auto_Uncommon_1617885", Rarity = "Uncommon"},
["A:126776521696833|138015221617885"] = {Name = "Auto_Uncommon_1617885", Rarity = "Uncommon"},
["M:126776521696833"] = {Name = "Auto_Uncommon_1617885", Rarity = "Uncommon"},
-- Auto_Uncommon_1777934 [Uncommon]
["C:A:78332404521065|105123551777934"] = {Name = "Auto_Uncommon_1777934", Rarity = "Uncommon"},
["A:78332404521065|105123551777934"] = {Name = "Auto_Uncommon_1777934", Rarity = "Uncommon"},
["M:78332404521065"] = {Name = "Auto_Uncommon_1777934", Rarity = "Uncommon"},
-- Auto_Uncommon_2744017 [Uncommon] – automatisch erkannt
["C:A:139660167827218|106831662744017"] = {Name = "Auto_Uncommon_2744017", Rarity = "Uncommon"},
["A:139660167827218|106831662744017"] = {Name = "Auto_Uncommon_2744017", Rarity = "Uncommon"},
["M:139660167827218"] = {Name = "Auto_Uncommon_2744017", Rarity = "Uncommon"},
-- Auto_Uncommon_2805260 [Uncommon]
["C:A:93190452777443|120394192805260"] = {Name = "Auto_Uncommon_2805260", Rarity = "Uncommon"},
["A:93190452777443|120394192805260"] = {Name = "Auto_Uncommon_2805260", Rarity = "Uncommon"},
["M:93190452777443"] = {Name = "Auto_Uncommon_2805260", Rarity = "Uncommon"},
-- Auto_Uncommon_2845098 [Uncommon]
["C:A:12652840329|12652845098"] = {Name = "Auto_Uncommon_2845098", Rarity = "Uncommon"},
["C:A:12652840443|12652845098"] = {Name = "Auto_Uncommon_2845098", Rarity = "Uncommon"},
["C:A:12653102765|12652845098"] = {Name = "Auto_Uncommon_2845098", Rarity = "Uncommon"},
["A:12652840329|12652845098"] = {Name = "Auto_Uncommon_2845098", Rarity = "Uncommon"},
["A:12652840443|12652845098"] = {Name = "Auto_Uncommon_2845098", Rarity = "Uncommon"},
["A:12653102765|12652845098"] = {Name = "Auto_Uncommon_2845098", Rarity = "Uncommon"},
["M:12652840329"] = {Name = "Auto_Uncommon_2845098", Rarity = "Uncommon"},
["M:12652840443"] = {Name = "Auto_Uncommon_2845098", Rarity = "Uncommon"},
["M:12653102765"] = {Name = "Auto_Uncommon_2845098", Rarity = "Uncommon"},
-- Auto_Uncommon_3607290 [Uncommon] – automatisch erkannt
["C:A:128006682011565|96070513607290"] = {Name = "Auto_Uncommon_3607290", Rarity = "Uncommon"},
["A:128006682011565|96070513607290"] = {Name = "Auto_Uncommon_3607290", Rarity = "Uncommon"},
["M:128006682011565"] = {Name = "Auto_Uncommon_3607290", Rarity = "Uncommon"},
-- Auto_Uncommon_5021236 [Uncommon] – automatisch erkannt
["C:A:80886366118411|136338495021236"] = {Name = "Auto_Uncommon_5021236", Rarity = "Uncommon"},
["A:80886366118411|136338495021236"] = {Name = "Auto_Uncommon_5021236", Rarity = "Uncommon"},
["M:80886366118411"] = {Name = "Auto_Uncommon_5021236", Rarity = "Uncommon"},
-- Auto_Uncommon_5859557 [Uncommon] – automatisch erkannt
["C:A:130781492960049|95120547133986;A:95361935859557|"] = {Name = "Auto_Uncommon_5859557", Rarity = "Uncommon"},
["A:130781492960049|95120547133986"] = {Name = "Auto_Uncommon_5859557", Rarity = "Uncommon"},
["A:95361935859557|"] = {Name = "Auto_Uncommon_5859557", Rarity = "Uncommon"},
["M:130781492960049"] = {Name = "Auto_Uncommon_5859557", Rarity = "Uncommon"},
["M:95361935859557"] = {Name = "Auto_Uncommon_5859557", Rarity = "Uncommon"},
-- Auto_Uncommon_6054411 [Uncommon] – automatisch erkannt
["C:A:75319093946158|136932556054411"] = {Name = "Auto_Uncommon_6054411", Rarity = "Uncommon"},
["A:75319093946158|136932556054411"] = {Name = "Auto_Uncommon_6054411", Rarity = "Uncommon"},
["M:75319093946158"] = {Name = "Auto_Uncommon_6054411", Rarity = "Uncommon"},
-- Auto_Uncommon_6076855 [Uncommon] – automatisch erkannt
["C:A:76526171133879|72787136076855"] = {Name = "Auto_Uncommon_6076855", Rarity = "Uncommon"},
["A:76526171133879|72787136076855"] = {Name = "Auto_Uncommon_6076855", Rarity = "Uncommon"},
["M:76526171133879"] = {Name = "Auto_Uncommon_6076855", Rarity = "Uncommon"},
-- Auto_Uncommon_6285845 [Uncommon] – automatisch erkannt
["C:A:125570261520326|74442716285845"] = {Name = "Auto_Uncommon_6285845", Rarity = "Uncommon"},
["A:125570261520326|74442716285845"] = {Name = "Auto_Uncommon_6285845", Rarity = "Uncommon"},
["M:125570261520326"] = {Name = "Auto_Uncommon_6285845", Rarity = "Uncommon"},
-- Auto_Uncommon_7555974 [Uncommon] – automatisch erkannt
["C:A:86185181873503|94609717555974"] = {Name = "Auto_Uncommon_7555974", Rarity = "Uncommon"},
["A:86185181873503|94609717555974"] = {Name = "Auto_Uncommon_7555974", Rarity = "Uncommon"},
["M:86185181873503"] = {Name = "Auto_Uncommon_7555974", Rarity = "Uncommon"},
-- Auto_Uncommon_8208737 [Uncommon] – automatisch erkannt
["C:A:108180040343053|118110088208737"] = {Name = "Auto_Uncommon_8208737", Rarity = "Uncommon"},
["A:108180040343053|118110088208737"] = {Name = "Auto_Uncommon_8208737", Rarity = "Uncommon"},
["M:108180040343053"] = {Name = "Auto_Uncommon_8208737", Rarity = "Uncommon"},
-- Auto_Uncommon_8211460 [Uncommon]
["C:A:12358190876|12358211460"] = {Name = "Auto_Uncommon_8211460", Rarity = "Uncommon"},
["A:12358190876|12358211460"] = {Name = "Auto_Uncommon_8211460", Rarity = "Uncommon"},
["M:12358190876"] = {Name = "Auto_Uncommon_8211460", Rarity = "Uncommon"},
-- Auto_Uncommon_8212907 [Uncommon]
["C:A:12358191012|12358212907"] = {Name = "Auto_Uncommon_8212907", Rarity = "Uncommon"},
["A:12358191012|12358212907"] = {Name = "Auto_Uncommon_8212907", Rarity = "Uncommon"},
["M:12358191012"] = {Name = "Auto_Uncommon_8212907", Rarity = "Uncommon"},
-- Auto_Uncommon_8215661 [Uncommon]
["C:A:12358191029|12358215661"] = {Name = "Auto_Uncommon_8215661", Rarity = "Uncommon"},
["A:12358191029|12358215661"] = {Name = "Auto_Uncommon_8215661", Rarity = "Uncommon"},
["M:12358191029"] = {Name = "Auto_Uncommon_8215661", Rarity = "Uncommon"},
-- Auto_Uncommon_8618754 [Uncommon] – automatisch erkannt
["C:A:123321051970192|128184928618754"] = {Name = "Auto_Uncommon_8618754", Rarity = "Uncommon"},
["A:123321051970192|128184928618754"] = {Name = "Auto_Uncommon_8618754", Rarity = "Uncommon"},
["M:123321051970192"] = {Name = "Auto_Uncommon_8618754", Rarity = "Uncommon"},
-- Auto_Uncommon_9073645 [Uncommon] – automatisch erkannt
["C:A:92819536052664|85098059073645"] = {Name = "Auto_Uncommon_9073645", Rarity = "Uncommon"},
["A:92819536052664|85098059073645"] = {Name = "Auto_Uncommon_9073645", Rarity = "Uncommon"},
["M:92819536052664"] = {Name = "Auto_Uncommon_9073645", Rarity = "Uncommon"},
-- Brecca [Uncommon]
["C:A:12886223389|12886223502"] = {Name = "Brecca", Rarity = "Uncommon"},
["A:12886223389|12886223502"] = {Name = "Brecca", Rarity = "Uncommon"},
["M:12886223389"] = {Name = "Brecca", Rarity = "Uncommon"},
-- Calcynite [Uncommon]
["C:A:101006617944408|109553203535107"] = {Name = "Calcynite", Rarity = "Uncommon"},
["A:101006617944408|109553203535107"] = {Name = "Calcynite", Rarity = "Uncommon"},
["M:101006617944408"] = {Name = "Calcynite", Rarity = "Uncommon"},
-- Cracked Waste [Uncommon]
["C:A:12652840391|12652845098"] = {Name = "Cracked Waste", Rarity = "Uncommon"},
["A:12652840391|12652845098"] = {Name = "Cracked Waste", Rarity = "Uncommon"},
["M:12652840391"] = {Name = "Cracked Waste", Rarity = "Uncommon"},
-- Geris [Uncommon]
["C:A:13063886004|13063886393"] = {Name = "Geris", Rarity = "Uncommon"},
["A:13063886004|13063886393"] = {Name = "Geris", Rarity = "Uncommon"},
-- Graeconogaron [Uncommon]
["C:A:13063887922|13063888350"] = {Name = "Graeconogaron", Rarity = "Uncommon"},
["A:13063887922|13063888350"] = {Name = "Graeconogaron", Rarity = "Uncommon"},
["M:13063887922"] = {Name = "Graeconogaron", Rarity = "Uncommon"},
-- Ignarion [Uncommon]
["C:A:138719582249238|125536023672648"] = {Name = "Ignarion", Rarity = "Uncommon"},
["A:138719582249238|125536023672648"] = {Name = "Ignarion", Rarity = "Uncommon"},
["M:138719582249238"] = {Name = "Ignarion", Rarity = "Uncommon"},
-- IriBit [Uncommon]
["C:A:119560252765201|132778655427699"] = {Name = "IriBit", Rarity = "Uncommon"},
["A:119560252765201|132778655427699"] = {Name = "IriBit", Rarity = "Uncommon"},
["M:119560252765201"] = {Name = "IriBit", Rarity = "Uncommon"},
-- Kiteanium [Uncommon]
["C:A:72440733125431|109003192586674"] = {Name = "Kiteanium", Rarity = "Uncommon"},
["A:72440733125431|109003192586674"] = {Name = "Kiteanium", Rarity = "Uncommon"},
["M:72440733125431"] = {Name = "Kiteanium", Rarity = "Uncommon"},
-- Limioactive [Uncommon]
["C:A:12668277912|12668278196;A:12668278556|12668278843"] = {Name = "Limioactive", Rarity = "Uncommon"},
["A:12668277912|12668278196"] = {Name = "Limioactive", Rarity = "Uncommon"},
["A:12668278556|12668278843"] = {Name = "Limioactive", Rarity = "Uncommon"},
["M:12668277912"] = {Name = "Limioactive", Rarity = "Uncommon"},
["M:12668278556"] = {Name = "Limioactive", Rarity = "Uncommon"},
-- Moptazik [Uncommon]
["C:A:12668285296|12668285490;A:12668285756|"] = {Name = "Moptazik", Rarity = "Uncommon"},
["A:12668285296|12668285490"] = {Name = "Moptazik", Rarity = "Uncommon"},
["A:12668285756|"] = {Name = "Moptazik", Rarity = "Uncommon"},
["M:12668285296"] = {Name = "Moptazik", Rarity = "Uncommon"},
["M:12668285756"] = {Name = "Moptazik", Rarity = "Uncommon"},
-- Oolite [Uncommon]
["C:A:12886223006|12886223173"] = {Name = "Oolite", Rarity = "Uncommon"},
["A:12886223006|12886223173"] = {Name = "Oolite", Rarity = "Uncommon"},
["M:12886223006"] = {Name = "Oolite", Rarity = "Uncommon"},
-- Opix [Uncommon]
["C:A:85954320447314|82197802914389"] = {Name = "Opix", Rarity = "Uncommon"},
["A:85954320447314|82197802914389"] = {Name = "Opix", Rarity = "Uncommon"},
["M:85954320447314"] = {Name = "Opix", Rarity = "Uncommon"},
-- Ovalium [Uncommon]
["C:A:73590961225578|107438041135912"] = {Name = "Ovalium", Rarity = "Uncommon"},
["A:73590961225578|107438041135912"] = {Name = "Ovalium", Rarity = "Uncommon"},
["M:73590961225578"] = {Name = "Ovalium", Rarity = "Uncommon"},
-- Paretium [Uncommon]
["C:A:12668281192|12668281481;A:12668281781|"] = {Name = "Paretium", Rarity = "Uncommon"},
["A:12668281192|12668281481"] = {Name = "Paretium", Rarity = "Uncommon"},
["A:12668281781|"] = {Name = "Paretium", Rarity = "Uncommon"},
["M:12668281192"] = {Name = "Paretium", Rarity = "Uncommon"},
["M:12668281781"] = {Name = "Paretium", Rarity = "Uncommon"},
-- Plumbryn [Uncommon]
["C:A:133734976408210|124518365174430"] = {Name = "Plumbryn", Rarity = "Uncommon"},
["A:133734976408210|124518365174430"] = {Name = "Plumbryn", Rarity = "Uncommon"},
["M:133734976408210"] = {Name = "Plumbryn", Rarity = "Uncommon"},
-- Prehistoric Bot Remnant [Uncommon]
["C:A:12742166954|12742167017"] = {Name = "Prehistoric Bot Remnant", Rarity = "Uncommon"},
["A:12742166954|12742167017"] = {Name = "Prehistoric Bot Remnant", Rarity = "Uncommon"},
["M:12742166954"] = {Name = "Prehistoric Bot Remnant", Rarity = "Uncommon"},
-- Shimicala [Uncommon]
["C:A:13069125583|13063909062"] = {Name = "Shimicala", Rarity = "Uncommon"},
["A:13069125583|13063909062"] = {Name = "Shimicala", Rarity = "Uncommon"},
["M:13069125583"] = {Name = "Shimicala", Rarity = "Uncommon"},
-- Tufa [Uncommon]
["C:A:12886222689|12886222813"] = {Name = "Tufa", Rarity = "Uncommon"},
["A:12886222689|12886222813"] = {Name = "Tufa", Rarity = "Uncommon"},
["M:12886222689"] = {Name = "Tufa", Rarity = "Uncommon"},
-- Uvyrite [Uncommon]
["C:A:126622910755306|82679397478251"] = {Name = "Uvyrite", Rarity = "Uncommon"},
["A:126622910755306|82679397478251"] = {Name = "Uvyrite", Rarity = "Uncommon"},
["M:126622910755306"] = {Name = "Uvyrite", Rarity = "Uncommon"},
-- Venomyth [Uncommon]
["C:A:123215418713801|73632361545965"] = {Name = "Venomyth", Rarity = "Uncommon"},
["A:123215418713801|73632361545965"] = {Name = "Venomyth", Rarity = "Uncommon"},
["M:123215418713801"] = {Name = "Venomyth", Rarity = "Uncommon"},
-- Charbit [Common]
["C:A:136061306028050|110765726253852"] = {Name = "Charbit", Rarity = "Common"},
["A:136061306028050|110765726253852"] = {Name = "Charbit", Rarity = "Common"},
["M:136061306028050"] = {Name = "Charbit", Rarity = "Common"},
-- Coquina [Common]
["C:A:12886221737|12886221873"] = {Name = "Coquina", Rarity = "Common"},
["A:12886221737|12886221873"] = {Name = "Coquina", Rarity = "Common"},
["M:12886221737"] = {Name = "Coquina", Rarity = "Common"},
-- Cracked Bones [Common]
["C:A:12652840440|12652845098"] = {Name = "Cracked Bones", Rarity = "Common"},
["A:12652840440|12652845098"] = {Name = "Cracked Bones", Rarity = "Common"},
["M:12652840440"] = {Name = "Cracked Bones", Rarity = "Common"},
-- Emberium [Common]
["C:A:13069125591|13064471481"] = {Name = "Emberium", Rarity = "Common"},
["A:13069125591|13064471481"] = {Name = "Emberium", Rarity = "Common"},
["M:13069125591"] = {Name = "Emberium", Rarity = "Common"},
-- Flamespawn [Common]
["C:A:13063877130|;A:13063883570|;A:13069125687|13069126724"] = {Name = "Flamespawn", Rarity = "Common"},
["A:13063877130|"] = {Name = "Flamespawn", Rarity = "Common"},
["A:13063883570|"] = {Name = "Flamespawn", Rarity = "Common"},
["A:13069125687|13069126724"] = {Name = "Flamespawn", Rarity = "Common"},
["M:13063877130"] = {Name = "Flamespawn", Rarity = "Common"},
["M:13063883570"] = {Name = "Flamespawn", Rarity = "Common"},
["M:13069125687"] = {Name = "Flamespawn", Rarity = "Common"},
-- Flint [Common]
["C:A:12886221345|12886221476"] = {Name = "Flint", Rarity = "Common"},
["A:12886221345|12886221476"] = {Name = "Flint", Rarity = "Common"},
["M:12886221345"] = {Name = "Flint", Rarity = "Common"},
-- Gamite [Common]
["C:A:12668281993|12668282299;A:12668282565|12668282872"] = {Name = "Gamite", Rarity = "Common"},
["A:12668281993|12668282299"] = {Name = "Gamite", Rarity = "Common"},
["A:12668282565|12668282872"] = {Name = "Gamite", Rarity = "Common"},
["M:12668281993"] = {Name = "Gamite", Rarity = "Common"},
["M:12668282565"] = {Name = "Gamite", Rarity = "Common"},
-- Magmoryx [Common]
["C:A:85374111100261|94792408779881"] = {Name = "Magmoryx", Rarity = "Common"},
["A:85374111100261|94792408779881"] = {Name = "Magmoryx", Rarity = "Common"},
["M:85374111100261"] = {Name = "Magmoryx", Rarity = "Common"},
-- Oil Waste [Common]
["C:A:12652840371|12652845098"] = {Name = "Oil Waste", Rarity = "Common"},
["A:12652840371|12652845098"] = {Name = "Oil Waste", Rarity = "Common"},
["M:12652840371"] = {Name = "Oil Waste", Rarity = "Common"},
-- Plumbit [Common]
["C:A:135145385142821|124811282588863"] = {Name = "Plumbit", Rarity = "Common"},
["A:135145385142821|124811282588863"] = {Name = "Plumbit", Rarity = "Common"},
["M:135145385142821"] = {Name = "Plumbit", Rarity = "Common"},
-- Pumice [Common]
["C:A:12652840558|12652845098"] = {Name = "Pumice", Rarity = "Common"},
["A:12652840558|12652845098"] = {Name = "Pumice", Rarity = "Common"},
["M:12652840558"] = {Name = "Pumice", Rarity = "Common"},
-- Pyrelith [Common]
["C:A:122108929414247|124714364589675"] = {Name = "Pyrelith", Rarity = "Common"},
["A:122108929414247|124714364589675"] = {Name = "Pyrelith", Rarity = "Common"},
["M:122108929414247"] = {Name = "Pyrelith", Rarity = "Common"},
-- Radionyx [Common]
["C:A:79434340836195|85719510728514"] = {Name = "Radionyx", Rarity = "Common"},
["A:79434340836195|85719510728514"] = {Name = "Radionyx", Rarity = "Common"},
["M:79434340836195"] = {Name = "Radionyx", Rarity = "Common"},
-- Reinforced Basalt [Common]
["C:A:12652840554|12652845098"] = {Name = "Reinforced Basalt", Rarity = "Common"},
["A:12652840554|12652845098"] = {Name = "Reinforced Basalt", Rarity = "Common"},
["M:12652840554"] = {Name = "Reinforced Basalt", Rarity = "Common"},
-- Silbit [Common]
["C:A:105882609043952|102575372172322"] = {Name = "Silbit", Rarity = "Common"},
["A:105882609043952|102575372172322"] = {Name = "Silbit", Rarity = "Common"},
["M:105882609043952"] = {Name = "Silbit", Rarity = "Common"},
-- Squarite [Common]
["C:A:105796040065135|138098006031599"] = {Name = "Squarite", Rarity = "Common"},
["A:105796040065135|138098006031599"] = {Name = "Squarite", Rarity = "Common"},
["M:105796040065135"] = {Name = "Squarite", Rarity = "Common"},
-- TNT [Common]
["C:A:88911303348714|134126540648490"] = {Name = "TNT", Rarity = "Common"},
["A:88911303348714|134126540648490"] = {Name = "TNT", Rarity = "Common"},
["M:88911303348714"] = {Name = "TNT", Rarity = "Common"},
-- Trianglium [Common]
["C:A:101409784230204|127195133830804"] = {Name = "Trianglium", Rarity = "Common"},
["A:101409784230204|127195133830804"] = {Name = "Trianglium", Rarity = "Common"},
["M:101409784230204"] = {Name = "Trianglium", Rarity = "Common"},
-- Uraniumite [Common]
["C:A:12668279093|12668279407;A:12668279941|"] = {Name = "Uraniumite", Rarity = "Common"},
["A:12668279093|12668279407"] = {Name = "Uraniumite", Rarity = "Common"},
["A:12668279941|"] = {Name = "Uraniumite", Rarity = "Common"},
["M:12668279093"] = {Name = "Uraniumite", Rarity = "Common"},
["M:12668279941"] = {Name = "Uraniumite", Rarity = "Common"},
},
}
--//====================================================
--// SERVICES UND GUI
--//====================================================
local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local TweenService = game:GetService("TweenService")
local VirtualInputManager = game:GetService("VirtualInputManager")
local LocalPlayer = Players.LocalPlayer
local PlayerGui = LocalPlayer:WaitForChild("PlayerGui")
local GameGui = PlayerGui:WaitForChild("Game")
local BlockGui = GameGui:WaitForChild("BlockGui")
local BlockTextObject = BlockGui:WaitForChild("Block")
--//====================================================
--// OPTIONALE CLIPBOARD-/DATEIFUNKTIONEN
--//====================================================
local function findGlobalFunction(names)
local environments = {
_G,
}
if type(getgenv) == "function" then
local success, environment = pcall(getgenv)
if success and type(environment) == "table" then
table.insert(environments, environment)
end
end
if type(getfenv) == "function" then
local success, environment = pcall(getfenv)
if success and type(environment) == "table" then
table.insert(environments, environment)
end
end
for _, environment in ipairs(environments) do
for _, name in ipairs(names) do
local value = rawget(environment, name)
if type(value) == "function" then
return value
end
end
end
return nil
end
local ClipboardWriter = findGlobalFunction({
"setclipboard",
"toclipboard",
})
local FileWriter = findGlobalFunction({
"writefile",
})
local function copyToClipboard(text)
if not ClipboardWriter then
return false, "Keine direkte Zwischenablage verfügbar."
end
local success, result = pcall(ClipboardWriter, text)
if not success then
return false, tostring(result)
end
return true
end
--//====================================================
--// ALTE ESP-OBJEKTE ENTFERNEN
--//====================================================
local OLD_FOLDER_NAMES = {
"_OptimizedRareESP",
"_ExportModelMeshESP",
"_ModelParticleMeshESP",
"_HybridParticleMeshESP",
"_ParticleRarityESP",
"_HybridMeshESP",
"_MeshRareESP",
"_NearbyRareESP",
"_ObservedRareESP",
"_AccurateRareESP",
"_LearnedRareESP",
"_BlockRarityESP",
}
for _, folderName in ipairs(OLD_FOLDER_NAMES) do
local worldFolder = workspace:FindFirstChild(folderName)
if worldFolder then
worldFolder:Destroy()
end
local guiFolder = PlayerGui:FindFirstChild(folderName)
if guiFolder then
guiFolder:Destroy()
end
end
local oldExportGui = PlayerGui:FindFirstChild("_OptimizedRareESPExport")
if oldExportGui then
oldExportGui:Destroy()
end
local HighlightFolder = Instance.new("Folder")
HighlightFolder.Name = "_OptimizedRareESP"
HighlightFolder.Parent = workspace
local BillboardFolder = Instance.new("Folder")
BillboardFolder.Name = "_OptimizedRareESP"
BillboardFolder.Parent = PlayerGui
--//====================================================
--// RARITY-SYSTEM
--//====================================================
local RarityRanks = {}
local CanonicalRarities = {}
for index, rarityName in ipairs(SETTINGS.RARITY_ORDER) do
local lowerName = string.lower(rarityName)
RarityRanks[lowerName] = index
CanonicalRarities[lowerName] = rarityName
end
local RarityAliases = {
uncommen = "Uncommon",
uncomon = "Uncommon",
mythical = "Mythic",
legend = "Legendary",
}
local function normalizeRarity(value)
if value == nil then
return nil
end
local text = string.lower(tostring(value))
text = text:gsub("^%s+", "")
text = text:gsub("%s+$", "")
return RarityAliases[text]
or CanonicalRarities[text]
end
local function getRarityRank(rarity)
rarity = normalizeRarity(rarity)
if not rarity then
return 0
end
return RarityRanks[string.lower(rarity)] or 0
end
local function isRareEnough(rarity)
return getRarityRank(rarity)
>= getRarityRank(SETTINGS.MINIMUM_RARITY)
end
local function getRarityColor(rarity)
return SETTINGS.RARITY_COLORS[rarity]
or Color3.fromRGB(255, 255, 255)
end
--//====================================================
--// BLOCK-GUI AUSLESEN
--//====================================================
local function parseCurrentBlockText()
local fullText = BlockTextObject.Text
if type(fullText) ~= "string"
or fullText == ""
then
return nil
end
local blockName, rawRarity =
fullText:match("^%s*(.-)%s*%((.-)%)%s*$")
local rarity = normalizeRarity(rawRarity)
-- TNT-Sonderobjekte werden im Spiel als „Unique“ angezeigt.
-- Der Fallback greift auch dann, wenn die GUI den Text einmal
-- ohne sauber lesbare Klammern aktualisiert.
if (
not rarity
or not blockName
or blockName == ""
)
and string.find(
string.lower(fullText),
"tnt",
1,
true
)
then
blockName = blockName
or fullText:gsub("%s*%b()%s*$", "")
rarity = "Unique"
end
if not blockName
or blockName == ""
or not rarity
then
return nil
end
return {
FullText = fullText,
Name = blockName,
Rarity = rarity,
Generic = false,
}
end
--//====================================================
--// BLOCK-/MODEL-HILFSFUNKTIONEN
--//====================================================
local function getBlockTarget(part)
if not part or not part:IsA("BasePart") then
return nil
end
local current = part.Parent
local nearestModel = nil
while current and current ~= SETTINGS.ROOT do
if current:IsA("Model") and not nearestModel then
nearestModel = current
end
current = current.Parent
end
return nearestModel or part
end
local function getTargetBaseParts(target)
if target:IsA("BasePart") then
return {
target,
}
end
local parts = {}
if target:IsA("Model") then
for _, descendant in ipairs(target:GetDescendants()) do
if descendant:IsA("BasePart") then
table.insert(parts, descendant)
end
end
end
return parts
end
local function getTargetPosition(target)
if target:IsA("BasePart") then
return target.Position
end
if target:IsA("Model") then
return target:GetPivot().Position
end
return Vector3.zero
end
local function getTargetLabelPart(target)
if target:IsA("BasePart") then
return target
end
if not target:IsA("Model") then
return nil
end
local pivotPosition = target:GetPivot().Position
local nearestPart = nil
local nearestDistance = math.huge
for _, descendant in ipairs(target:GetDescendants()) do
if descendant:IsA("BasePart") then
local distance =
(descendant.Position - pivotPosition).Magnitude
if distance < nearestDistance then
nearestDistance = distance
nearestPart = descendant
end
end
end
return target.PrimaryPart or nearestPart
end
--//====================================================
--// ASSET-SIGNATUREN
--//====================================================
local function normalizeAssetId(value)
local text = tostring(value or "")
local numericId = text:match("(%d+)")
if not numericId or numericId == "0" then
return nil
end
return numericId
end
local function addUnique(list, lookup, value)
if not value or lookup[value] then
return
end
lookup[value] = true
table.insert(list, value)
end
local function getPartAssetData(part)
local meshId = nil
local textures = {}
local textureLookup = {}
if part:IsA("MeshPart") then
meshId = normalizeAssetId(part.MeshId)
addUnique(
textures,
textureLookup,
normalizeAssetId(part.TextureID)
)
end
local specialMesh =
part:FindFirstChildOfClass("SpecialMesh")
if specialMesh then
meshId = meshId
or normalizeAssetId(specialMesh.MeshId)
addUnique(
textures,
textureLookup,
normalizeAssetId(specialMesh.TextureId)
)
end
local surfaceAppearance =
part:FindFirstChildOfClass("SurfaceAppearance")
if surfaceAppearance then
addUnique(
textures,
textureLookup,
normalizeAssetId(surfaceAppearance.ColorMap)
)
addUnique(
textures,
textureLookup,
normalizeAssetId(surfaceAppearance.NormalMap)
)
addUnique(
textures,
textureLookup,
normalizeAssetId(surfaceAppearance.MetalnessMap)
)
addUnique(
textures,
textureLookup,
normalizeAssetId(surfaceAppearance.RoughnessMap)
)
end
for _, child in ipairs(part:GetChildren()) do
if child:IsA("Decal")
or child:IsA("Texture")
then
addUnique(
textures,
textureLookup,
normalizeAssetId(child.Texture)
)
end
end
table.sort(textures)
return meshId, textures
end
local function getTargetAssetKeys(target)
local keys = {}
local keyLookup = {}
local compositeEntries = {}
for _, part in ipairs(getTargetBaseParts(target)) do
local meshId, textures =
getPartAssetData(part)
if meshId then
local meshKey = "M:" .. meshId
addUnique(
keys,
keyLookup,
meshKey
)
local exactKey =
"A:"
.. meshId
.. "|"
.. table.concat(textures, ",")
addUnique(
keys,
keyLookup,
exactKey
)
table.insert(compositeEntries, exactKey)
end
end
if #compositeEntries > 0 then
table.sort(compositeEntries)
addUnique(
keys,
keyLookup,
"C:"
.. table.concat(
compositeEntries,
";"
)
)
end
return keys
end
local function getKeyPriority(key)
local prefix = string.sub(key, 1, 2)
if prefix == "C:" then
return 3
end
if prefix == "A:" then
return 2
end
if prefix == "M:" then
return 1
end
return 0
end
--//====================================================
--// SPATIAL HASH
--//====================================================
local SpatialCells = {}
local function getCellCoordinates(position)
local cellSize = SETTINGS.CELL_SIZE
return math.floor(position.X / cellSize),
math.floor(position.Y / cellSize),
math.floor(position.Z / cellSize)
end
local function makeCellKey(x, y, z)
return tostring(x)
.. ":"
.. tostring(y)
.. ":"
.. tostring(z)
end
local function removeFromCell(data)
if not data.CellKey then
return
end
local bucket = SpatialCells[data.CellKey]
if bucket then
bucket[data.Target] = nil
if next(bucket) == nil then
SpatialCells[data.CellKey] = nil
end
end
data.CellKey = nil
end
local function updateTargetCell(data, position)
local x, y, z = getCellCoordinates(position)
local cellKey = makeCellKey(x, y, z)
if data.CellKey == cellKey then
return
end
removeFromCell(data)
local bucket = SpatialCells[cellKey]
if not bucket then
bucket = {}
SpatialCells[cellKey] = bucket
end
bucket[data.Target] = true
data.CellKey = cellKey
end
--//====================================================
--// TARGET-INDEX
--//====================================================
local TargetData = {}
local ReindexScheduled = {}
local ForceRefresh = true
local function removeTarget(target)
local data = TargetData[target]
if not data then
return
end
removeFromCell(data)
for emitter in pairs(data.Emitters) do
data.Emitters[emitter] = nil
end
TargetData[target] = nil
ReindexScheduled[target] = nil
ForceRefresh = true
end
local function reindexTarget(target)
ReindexScheduled[target] = nil
if not target
or not target.Parent
or not target:IsDescendantOf(SETTINGS.ROOT)
then
removeTarget(target)
return
end
local data = TargetData[target]
if not data then
data = {
Target = target,
Keys = {},
Emitters = {},
ParticleRarity = nil,
NamedInfo = nil,
LabelPart = nil,
Position = Vector3.zero,
CellKey = nil,
}
TargetData[target] = data
target.Destroying:Connect(function()
removeTarget(target)
end)
end
data.LabelPart = getTargetLabelPart(target)
data.Position = getTargetPosition(target)
data.Keys = getTargetAssetKeys(target)
updateTargetCell(data, data.Position)
ForceRefresh = true
end
local function queueReindex(target, delaySeconds)
if not target or ReindexScheduled[target] then
return
end
ReindexScheduled[target] = true
task.delay(
delaySeconds or SETTINGS.REINDEX_DELAY,
function()
if ReindexScheduled[target] then
reindexTarget(target)
end
end
)
end
local function registerTarget(target)
if not target then
return nil
end
if not TargetData[target] then
TargetData[target] = {
Target = target,
Keys = {},
Emitters = {},
ParticleRarity = nil,
NamedInfo = nil,
LabelPart = nil,
Position = Vector3.zero,
CellKey = nil,
}
target.Destroying:Connect(function()
removeTarget(target)
end)
end
reindexTarget(target)
return TargetData[target]
end
--//====================================================
--// BEKANNTE MESH-SCHLÜSSEL
--//====================================================
local KnownKeys = {}
local ConflictingKeys = {}
local LastExportGroupId = nil
local OreListDirty = true
local function makeGenericName(rarity, key)
local suffix =
key:match("(%d+)[^%d]*$")
or tostring(#key * 7919)
if #suffix > 7 then
suffix = string.sub(suffix, #suffix - 6)
end
return "Auto_"
.. rarity
.. "_"
.. suffix
end
local function sameInformation(a, b)
if a.Rarity ~= b.Rarity then
return false
end
if a.Generic or b.Generic then
return true
end
return a.Name == b.Name
end
local function registerKnownKey(key, information)
if ConflictingKeys[key] then
return false
end
local previous = KnownKeys[key]
if previous then
if sameInformation(previous, information) then
if previous.Generic
and not information.Generic
then
previous.Name = information.Name
previous.Generic = false
ForceRefresh = true
OreListDirty = true
return true
end
return false
end
KnownKeys[key] = nil
ConflictingKeys[key] = true
ForceRefresh = true
OreListDirty = true
warn(
"[ESP KONFLIKT]",
key,
"gehört zu mehreren Blockarten/Raritäten "
.. "und wird nicht mehr verwendet."
)
return false
end
KnownKeys[key] = {
Name = information.Name,
Rarity = information.Rarity,
Generic = information.Generic == true,
}
ForceRefresh = true
OreListDirty = true
return true
end
local function registerTargetKeys(data, information)
if not data or #data.Keys == 0 then
return false
end
local changed = false
for _, key in ipairs(data.Keys) do
if registerKnownKey(key, information) then
changed = true
end
end
return changed
end
local function getMeshInformation(data)
local selected = nil
local selectedPriority = -1
for _, key in ipairs(data.Keys) do
local information = KnownKeys[key]
if information
and not ConflictingKeys[key]
then
local priority = getKeyPriority(key)
if priority > selectedPriority then
selected = information
selectedPriority = priority
elseif priority == selectedPriority
and selected
and (
selected.Rarity ~= information.Rarity
or (
not selected.Generic
and not information.Generic
and selected.Name ~= information.Name
)
)
then
return nil
end
end
end
return selected
end
for key, information in pairs(SETTINGS.PRESETS) do
local rarity = normalizeRarity(information.Rarity)
if rarity then
KnownKeys[key] = {
Name = tostring(information.Name or ""),
Rarity = rarity,
Generic = false,
}
end
end
--//====================================================
--// PARTICLE-ERKENNUNG
--//====================================================
local EmitterState = {}
local function getEmitterPart(emitter)
local current = emitter.Parent
while current and current ~= SETTINGS.ROOT do
if current:IsA("BasePart") then
return current
end
current = current.Parent
end
return nil
end
local function getColorSaturation(color)
local maximum = math.max(
color.R,
color.G,
color.B
)
local minimum = math.min(
color.R,
color.G,
color.B
)
return maximum - minimum
end
local function getEmitterColor(emitter)
local keypoints = emitter.Color.Keypoints
if #keypoints == 0 then
return Color3.new(1, 1, 1)
end
local selectedColor = keypoints[1].Value
local selectedSaturation =
getColorSaturation(selectedColor)
for _, keypoint in ipairs(keypoints) do
local color = keypoint.Value
local saturation =
getColorSaturation(color)
if saturation > selectedSaturation then
selectedColor = color
selectedSaturation = saturation
end
end
return selectedColor
end
local function colorDistance(colorA, colorB)
local red = colorA.R - colorB.R
local green = colorA.G - colorB.G
local blue = colorA.B - colorB.B
return math.sqrt(
red * red
+ green * green
+ blue * blue
)
end
local function classifyEmitter(emitter)
if SETTINGS.REQUIRE_PARTICLE_ENABLED
and not emitter.Enabled
then
return nil
end
local color = getEmitterColor(emitter)
local nearestRarity = nil
local nearestDistance = math.huge
for rarity, expectedColor in pairs(
SETTINGS.PARTICLE_COLORS
) do
local distance =
colorDistance(color, expectedColor)
if distance < nearestDistance then
nearestDistance = distance
nearestRarity = rarity
end
end
if nearestDistance
> SETTINGS.PARTICLE_MAX_COLOR_DISTANCE
then
return nil
end
return nearestRarity
end
local function recomputeTargetParticle(data)
local bestRarity = nil
local bestRank = 0
for _, rarity in pairs(data.Emitters) do
local rank = getRarityRank(rarity)
if rank > bestRank then
bestRank = rank
bestRarity = rarity
end
end
if data.ParticleRarity == bestRarity then
return
end
data.ParticleRarity = bestRarity
ForceRefresh = true
if bestRarity
and SETTINGS.EXPORT_GENERIC_PARTICLE_TYPES
and #data.Keys > 0
then
local preferredKey = nil
local preferredPriority = -1
for _, key in ipairs(data.Keys) do
local priority = getKeyPriority(key)
if priority > preferredPriority then
preferredPriority = priority
preferredKey = key
end
end
local genericInformation = {
Name = makeGenericName(
bestRarity,
preferredKey or tostring(data.Target)
),
Rarity = bestRarity,
Generic = true,
}
registerTargetKeys(data, genericInformation)
end
end
local function updateEmitter(emitter)
local state = EmitterState[emitter]
if not state then
return
end
if not emitter.Parent then
return
end
local rarity = classifyEmitter(emitter)
state.Rarity = rarity
local data = TargetData[state.Target]
if data then
data.Emitters[emitter] = rarity
recomputeTargetParticle(data)
end
end
local function unregisterEmitter(emitter)
local state = EmitterState[emitter]
if not state then
return
end
local data = TargetData[state.Target]
if data then
data.Emitters[emitter] = nil
recomputeTargetParticle(data)
end
EmitterState[emitter] = nil
end
local function registerEmitter(emitter)
if not emitter:IsA("ParticleEmitter")
or EmitterState[emitter]
then
return
end
local emitterPart = getEmitterPart(emitter)
if not emitterPart then
return
end
local target = getBlockTarget(emitterPart)
if not target then
return
end
local data = TargetData[target]
or registerTarget(target)
if not data then
return
end
EmitterState[emitter] = {
Target = target,
Rarity = nil,
}
data.Emitters[emitter] = nil
emitter:GetPropertyChangedSignal("Color"):Connect(function()
updateEmitter(emitter)
end)
emitter:GetPropertyChangedSignal("Enabled"):Connect(function()
if SETTINGS.REQUIRE_PARTICLE_ENABLED then
updateEmitter(emitter)
end
end)
emitter.Destroying:Connect(function()
unregisterEmitter(emitter)
end)
updateEmitter(emitter)
end
--//====================================================
--// ZIELBLOCK FINDEN
--//====================================================
local TargetOverlap = OverlapParams.new()
TargetOverlap.FilterType =
Enum.RaycastFilterType.Include
TargetOverlap.FilterDescendantsInstances = {
SETTINGS.ROOT,
}
TargetOverlap.MaxParts = 120
local function getBreakingPart()
local breaking =
workspace:FindFirstChild(
SETTINGS.BREAKING_NAME
)
if breaking
and breaking:IsA("BasePart")
then
return breaking
end
return nil
end
local function getCurrentTarget()
local breaking = getBreakingPart()
if not breaking then
return nil, nil
end
local parts = workspace:GetPartBoundsInBox(
CFrame.new(breaking.Position),
SETTINGS.TARGET_SEARCH_SIZE,
TargetOverlap
)
local bestTarget = nil
local bestPart = nil
local bestScore = math.huge
for _, part in ipairs(parts) do
if part:IsA("BasePart") then
local target = getBlockTarget(part)
if target then
local partDistance =
(
part.Position
- breaking.Position
).Magnitude
local targetDistance =
(
getTargetPosition(target)
- breaking.Position
).Magnitude
local score = math.min(
partDistance,
targetDistance
)
if score < bestScore then
bestScore = score
bestTarget = target
bestPart = part
end
end
end
end
if bestTarget
and bestScore
<= SETTINGS.TARGET_MAX_CENTER_DISTANCE
then
return bestTarget, bestPart
end
return nil, nil
end
--//====================================================
--// ZIELINFORMATION AUFLÖSEN
--//====================================================
local function resolveTargetInformation(data)
-- Sobald Partikel vorhanden sind, gelten diese als
-- zuverlässigere Quelle als ein Mesh-Fallback.
if data.ParticleRarity then
if not isRareEnough(data.ParticleRarity) then
return nil
end
local namedInformation = data.NamedInfo
local meshInformation = getMeshInformation(data)
if namedInformation
and namedInformation.Rarity
== data.ParticleRarity
then
return namedInformation
end
if meshInformation
and meshInformation.Rarity
== data.ParticleRarity
then
return meshInformation
end
return {
Name = "",
Rarity = data.ParticleRarity,
Generic = true,
}
end
local meshInformation = getMeshInformation(data)
if meshInformation
and isRareEnough(meshInformation.Rarity)
then
return meshInformation
end
return nil
end
--//====================================================
--// ESP-POOL
--//====================================================
local HighlightPool = {}
local BillboardPool = {}
local ActiveESP = {}
local function acquireHighlight()
local highlight = table.remove(HighlightPool)
if highlight then
return highlight
end
highlight = Instance.new("Highlight")
highlight.Name = "RareHighlight"
highlight.DepthMode =
Enum.HighlightDepthMode.AlwaysOnTop
highlight.FillTransparency =
SETTINGS.FILL_TRANSPARENCY
highlight.OutlineTransparency =
SETTINGS.OUTLINE_TRANSPARENCY
highlight.Enabled = false
highlight.Parent = HighlightFolder
return highlight
end
local function releaseHighlight(highlight)
if not highlight then
return
end
highlight.Enabled = false
highlight.Adornee = nil
if #HighlightPool
< SETTINGS.MAX_ACTIVE_HIGHLIGHTS
then
table.insert(HighlightPool, highlight)
else
highlight:Destroy()
end
end
local function createBillboard()
local billboard = Instance.new("BillboardGui")
billboard.Name = "RareBillboard"
billboard.AlwaysOnTop = true
billboard.LightInfluence = 0
billboard.Size = SETTINGS.BILLBOARD_SIZE
billboard.StudsOffsetWorldSpace =
SETTINGS.BILLBOARD_OFFSET
billboard.MaxDistance = SETTINGS.SCAN_RADIUS
billboard.Enabled = false
billboard.Parent = BillboardFolder
local label = Instance.new("TextLabel")
label.Name = "Text"
label.Size = UDim2.fromScale(1, 1)
label.BackgroundTransparency = 1
label.Font = Enum.Font.GothamBold
label.TextSize = SETTINGS.LABEL_TEXT_SIZE
label.TextWrapped = false
label.TextStrokeColor3 =
Color3.fromRGB(0, 0, 0)
label.TextStrokeTransparency = 0
label.Parent = billboard
return {
Billboard = billboard,
Label = label,
}
end
local function acquireBillboard()
return table.remove(BillboardPool)
or createBillboard()
end
local function releaseBillboard(bundle)
if not bundle then
return
end
bundle.Billboard.Enabled = false
bundle.Billboard.Adornee = nil
bundle.Label.Text = ""
if #BillboardPool
< SETTINGS.MAX_ACTIVE_LABELS
then
table.insert(BillboardPool, bundle)
else
bundle.Billboard:Destroy()
end
end
local function deactivateTarget(target)
local esp = ActiveESP[target]
if not esp then
return
end
releaseHighlight(esp.Highlight)
releaseBillboard(esp.BillboardBundle)
ActiveESP[target] = nil
end
local function clearActiveESP()
local targets = {}
for target in pairs(ActiveESP) do
table.insert(targets, target)
end
for _, target in ipairs(targets) do
deactivateTarget(target)
end
end
local function buildLabelText(information)
if information.Name
and information.Name ~= ""
and not information.Generic
then
return string.format(
"%s [%s]",
information.Name,
information.Rarity
)
end
return "[" .. information.Rarity .. "]"
end
local function activateTarget(
data,
information,
showLabel
)
local target = data.Target
local esp = ActiveESP[target]
if not esp then
esp = {
Highlight = nil,
BillboardBundle = nil,
LastInfoKey = nil,
}
ActiveESP[target] = esp
end
local color =
getRarityColor(information.Rarity)
if SETTINGS.SHOW_HIGHLIGHT then
if not esp.Highlight then
esp.Highlight = acquireHighlight()
end
esp.Highlight.Adornee = target
esp.Highlight.FillColor = color
esp.Highlight.OutlineColor = color
esp.Highlight.Enabled = true
elseif esp.Highlight then
releaseHighlight(esp.Highlight)
esp.Highlight = nil
end
if SETTINGS.SHOW_TEXT
and showLabel
and data.LabelPart
then
if not esp.BillboardBundle then
esp.BillboardBundle =
acquireBillboard()
end
local bundle = esp.BillboardBundle
local infoKey =
tostring(information.Name)
.. "|"
.. tostring(information.Rarity)
.. "|"
.. tostring(information.Generic)
bundle.Billboard.Adornee =
data.LabelPart
bundle.Billboard.Enabled = true
if esp.LastInfoKey ~= infoKey then
bundle.Label.Text =
buildLabelText(information)
bundle.Label.TextColor3 = color
esp.LastInfoKey = infoKey
end
elseif esp.BillboardBundle then
releaseBillboard(esp.BillboardBundle)
esp.BillboardBundle = nil
esp.LastInfoKey = nil
end
end
--//====================================================
--// UMGEBUNGSSCANNER
--//====================================================
local LastCharacterPosition = nil
local function getCharacterRoot()
local character = LocalPlayer.Character
if not character then
return nil
end
return character:FindFirstChild(
"HumanoidRootPart"
)
end
local function collectNearbyCandidates(position)
local candidates = {}
local seenTargets = {}
local radius = SETTINGS.SCAN_RADIUS
local cellSize = SETTINGS.CELL_SIZE
local minimumX =
math.floor((position.X - radius) / cellSize)
local maximumX =
math.floor((position.X + radius) / cellSize)
local minimumY =
math.floor((position.Y - radius) / cellSize)
local maximumY =
math.floor((position.Y + radius) / cellSize)
local minimumZ =
math.floor((position.Z - radius) / cellSize)
local maximumZ =
math.floor((position.Z + radius) / cellSize)
local radiusSquared = radius * radius
for x = minimumX, maximumX do
for y = minimumY, maximumY do
for z = minimumZ, maximumZ do
local bucket =
SpatialCells[
makeCellKey(x, y, z)
]
if bucket then
for target in pairs(bucket) do
if not seenTargets[target] then
seenTargets[target] = true
local data =
TargetData[target]
if data
and target.Parent
then
local offset =
data.Position
- position
local distanceSquared =
offset:Dot(offset)
if distanceSquared
<= radiusSquared
then
local information =
resolveTargetInformation(
data
)
if information then
table.insert(
candidates,
{
Data = data,
Information =
information,
DistanceSquared =
distanceSquared,
}
)
end
end
end
end
end
end
end
end
end
table.sort(candidates, function(a, b)
return a.DistanceSquared
< b.DistanceSquared
end)
return candidates
end
local function refreshVisibleESP(force)
if not SETTINGS.ENABLED then
clearActiveESP()
return
end
local characterRoot = getCharacterRoot()
if not characterRoot then
return
end
local currentPosition =
characterRoot.Position
if not force
and not ForceRefresh
and LastCharacterPosition
and (
currentPosition
- LastCharacterPosition
).Magnitude < SETTINGS.MOVE_THRESHOLD
then
return
end
LastCharacterPosition = currentPosition
ForceRefresh = false
local candidates =
collectNearbyCandidates(currentPosition)
local desiredTargets = {}
local highlightCount = math.min(
#candidates,
SETTINGS.MAX_ACTIVE_HIGHLIGHTS
)
for index = 1, highlightCount do
local candidate = candidates[index]
local data = candidate.Data
desiredTargets[data.Target] = true
activateTarget(
data,
candidate.Information,
index <= SETTINGS.MAX_ACTIVE_LABELS
)
end
local removeList = {}
for target in pairs(ActiveESP) do
if not desiredTargets[target] then
table.insert(removeList, target)
end
end
for _, target in ipairs(removeList) do
deactivateTarget(target)
end
end
--//====================================================
--// ORE AUTO-FARM MIT AUSWAHL-GUI
--//====================================================
local AUTO_FARM_GUI_NAME = "_OptimizedOreAutoFarmGui"
local SelectedOreGroups = {}
local OreSelectionTouched = {}
local OreGroups = {}
local OreRowButtons = {}
local OreSelectionInitialized = false
local AutoFarmGui = nil
local AutoFarmMain = nil
local AutoFarmList = nil
local AutoFarmListLayout = nil
local AutoFarmSearchBox = nil
local AutoFarmToggleButton = nil
local AutoFarmPriorityButton = nil
local AutoFarmGlideButton = nil
local AutoFarmCameraButton = nil
local AutoFarmStatusLabel = nil
local AutoFarmSelectionLabel = nil
local AutoFarmState = {
CurrentData = nil,
CurrentInformation = nil,
CurrentGroupId = nil,
TargetStartedAt = 0,
MiningStartedAt = nil,
LastStatus = "Bereit",
MouseDown = false,
LastMouseX = 0,
LastMouseY = 0,
SavedCameraCFrame = nil,
Moving = false,
MoveTween = nil,
MoveToken = 0,
BodyVelocity = nil,
CollisionStates = nil,
IgnoredUntil = {},
LastCandidateCount = 0,
LastDistance = nil,
InputError = nil,
}
local function getOreGroupId(information)
local name = tostring(information.Name or "")
local rarity = tostring(information.Rarity or "Unknown")
if name == "" then
name = "Auto_" .. rarity
end
return string.lower(name)
.. "|"
.. string.lower(rarity)
end
local function shouldSelectGroupByDefault(group)
if SETTINGS.AUTO_FARM_DEFAULT_SELECTION == "All" then
return true
end
if SETTINGS.AUTO_FARM_DEFAULT_SELECTION == "None" then
return false
end
return getRarityRank(group.Rarity)
>= getRarityRank("Rare")
end
local function buildOreGroups()
local groupsById = {}
for key, information in pairs(KnownKeys) do
if not ConflictingKeys[key] then
local name = tostring(information.Name or "")
local rarity = normalizeRarity(information.Rarity)
if name ~= "" and rarity then
local groupId = getOreGroupId(information)
local group = groupsById[groupId]
if not group then
group = {
Id = groupId,
Name = name,
Rarity = rarity,
Generic = information.Generic == true,
KeyCount = 0,
}
groupsById[groupId] = group
end
group.KeyCount += 1
end
end
end
local groups = {}
for _, group in pairs(groupsById) do
table.insert(groups, group)
end
table.sort(groups, function(a, b)
local rankA = getRarityRank(a.Rarity)
local rankB = getRarityRank(b.Rarity)
if rankA ~= rankB then
return rankA > rankB
end
if a.Name ~= b.Name then
return a.Name < b.Name
end
return a.Id < b.Id
end)
return groups
end
local function ensureOreSelectionInitialized()
if not OreSelectionInitialized or OreListDirty then
OreGroups = buildOreGroups()
for _, group in ipairs(OreGroups) do
if SelectedOreGroups[group.Id] == nil
and not OreSelectionTouched[group.Id]
then
SelectedOreGroups[group.Id] =
shouldSelectGroupByDefault(group)
end
end
OreSelectionInitialized = true
OreListDirty = false
end
end
local function countSelectedOreGroups()
ensureOreSelectionInitialized()
local selected = 0
for _, group in ipairs(OreGroups) do
if SelectedOreGroups[group.Id] then
selected += 1
end
end
return selected, #OreGroups
end
local function isOreInformationSelected(information)
if not information then
return false
end
ensureOreSelectionInitialized()
return SelectedOreGroups[
getOreGroupId(information)
] == true
end
local function setAutoFarmStatus(text)
text = tostring(text or "")
AutoFarmState.LastStatus = text
if AutoFarmStatusLabel
and AutoFarmStatusLabel.Text ~= text
then
AutoFarmStatusLabel.Text = text
end
end
local function safeSendMouseMove(x, y)
local success, result = pcall(function()
VirtualInputManager:SendMouseMoveEvent(
x,
y,
game
)
end)
if not success then
AutoFarmState.InputError = tostring(result)
end
return success
end
local function safeSendMouseButton(x, y, isDown)
local success, result = pcall(function()
VirtualInputManager:SendMouseButtonEvent(
x,
y,
0,
isDown,
game,
1
)
end)
if not success then
AutoFarmState.InputError = tostring(result)
end
return success
end
local function restoreSavedCamera()
if not SETTINGS.AUTO_FARM_RESTORE_CAMERA_AFTER_TARGET
or not AutoFarmState.SavedCameraCFrame
then
AutoFarmState.SavedCameraCFrame = nil
return
end
local camera = workspace.CurrentCamera
if camera then
local rotation =
AutoFarmState.SavedCameraCFrame
- AutoFarmState.SavedCameraCFrame.Position
camera.CFrame =
CFrame.new(camera.CFrame.Position)
* rotation
end
AutoFarmState.SavedCameraCFrame = nil
end
local function releaseMiningInput()
if AutoFarmState.MouseDown then
safeSendMouseButton(
AutoFarmState.LastMouseX,
AutoFarmState.LastMouseY,
false
)
end
AutoFarmState.MouseDown = false
AutoFarmState.MiningStartedAt = nil
restoreSavedCamera()
end
local function restoreCharacterCollisions()
local collisionStates = AutoFarmState.CollisionStates
if collisionStates then
for part, canCollide in pairs(collisionStates) do
if part and part.Parent then
part.CanCollide = canCollide
end
end
end
AutoFarmState.CollisionStates = nil
end
local function stopGlide()
AutoFarmState.MoveToken += 1
if AutoFarmState.MoveTween then
pcall(function()
AutoFarmState.MoveTween:Cancel()
end)
end
AutoFarmState.MoveTween = nil
if AutoFarmState.BodyVelocity then
AutoFarmState.BodyVelocity:Destroy()
AutoFarmState.BodyVelocity = nil
end
restoreCharacterCollisions()
AutoFarmState.Moving = false
end
local function clearAutoFarmTarget(reason)
releaseMiningInput()
stopGlide()
AutoFarmState.CurrentData = nil
AutoFarmState.CurrentInformation = nil
AutoFarmState.CurrentGroupId = nil
AutoFarmState.TargetStartedAt = 0
AutoFarmState.LastDistance = nil
if reason then
setAutoFarmStatus(reason)
end
end
local function getMineAimPart(data, rootPosition)
if data.MineAimPart
and data.MineAimPart.Parent
and data.MineAimPart:IsDescendantOf(data.Target)
then
return data.MineAimPart
end
local target = data.Target
if target:IsA("BasePart") then
data.MineAimPart = target
return target
end
local bestPart = nil
local bestDistance = math.huge
if target:IsA("Model") then
for _, descendant in ipairs(target:GetDescendants()) do
if descendant:IsA("BasePart") then
local distance =
(descendant.Position - rootPosition).Magnitude
if distance < bestDistance then
bestDistance = distance
bestPart = descendant
end
end
end
end
data.MineAimPart = bestPart or data.LabelPart
return data.MineAimPart
end
local function getMineAimPosition(data, rootPosition)
local aimPart = getMineAimPart(data, rootPosition)
if aimPart and aimPart.Parent then
return aimPart.Position, aimPart
end
return data.Position, nil
end
local function isTargetIgnored(target)
local ignoredUntil = AutoFarmState.IgnoredUntil[target]
if not ignoredUntil then
return false
end
if os.clock() >= ignoredUntil then
AutoFarmState.IgnoredUntil[target] = nil
return false
end
return true
end
local function isAutoFarmDataValid(data, rootPosition)
if not data
or not data.Target
or not data.Target.Parent
or not data.Target:IsDescendantOf(SETTINGS.ROOT)
or isTargetIgnored(data.Target)
then
return false, nil, nil
end
local information = resolveTargetInformation(data)
if not information
or not isOreInformationSelected(information)
then
return false, nil, nil
end
local offset = data.Position - rootPosition
local distanceSquared = offset:Dot(offset)
if distanceSquared
> SETTINGS.AUTO_FARM_SCAN_RADIUS
* SETTINGS.AUTO_FARM_SCAN_RADIUS
then
return false, nil, nil
end
if not SETTINGS.AUTO_FARM_GLIDE_ENABLED
and distanceSquared
> SETTINGS.AUTO_FARM_MINE_DISTANCE
* SETTINGS.AUTO_FARM_MINE_DISTANCE
then
return false, nil, nil
end
return true, information, distanceSquared
end
local function chooseAutoFarmTarget(rootPosition)
ensureOreSelectionInitialized()
local bestData = nil
local bestInformation = nil
local bestDistanceSquared = math.huge
local bestRank = -1
local candidateCount = 0
for _, data in pairs(TargetData) do
local valid, information, distanceSquared =
isAutoFarmDataValid(data, rootPosition)
if valid then
candidateCount += 1
local rank = getRarityRank(information.Rarity)
local choose = false
if SETTINGS.AUTO_FARM_PRIORITY == "Nearest" then
choose = distanceSquared < bestDistanceSquared
else
choose = rank > bestRank
or (
rank == bestRank
and distanceSquared < bestDistanceSquared
)
end
if choose then
bestData = data
bestInformation = information
bestDistanceSquared = distanceSquared
bestRank = rank
end
end
end
AutoFarmState.LastCandidateCount = candidateCount
return bestData,
bestInformation,
bestDistanceSquared
end
local function startGlideToCurrentTarget()
if not SETTINGS.AUTO_FARM_GLIDE_ENABLED
or AutoFarmState.Moving
or not AutoFarmState.CurrentData
then
return
end
local character = LocalPlayer.Character
local root = getCharacterRoot()
if not character or not root then
return
end
local targetPosition = getMineAimPosition(
AutoFarmState.CurrentData,
root.Position
)
local away = root.Position - targetPosition
if away.Magnitude < 0.01 then
away = Vector3.new(0, 0, 1)
end
local destination = targetPosition
+ away.Unit * SETTINGS.AUTO_FARM_STOP_DISTANCE
local distance = (destination - root.Position).Magnitude
if distance <= 0.5 then
return
end
stopGlide()
AutoFarmState.MoveToken += 1
local token = AutoFarmState.MoveToken
AutoFarmState.Moving = true
if SETTINGS.AUTO_FARM_NOCLIP_WHILE_GLIDING then
local collisionStates = {}
for _, descendant in ipairs(character:GetDescendants()) do
if descendant:IsA("BasePart") then
collisionStates[descendant] = descendant.CanCollide
descendant.CanCollide = false
end
end
AutoFarmState.CollisionStates = collisionStates
end
local bodyVelocity = Instance.new("BodyVelocity")
bodyVelocity.Name = "_OreAutoFarmVelocity"
bodyVelocity.MaxForce = Vector3.new(
math.huge,
math.huge,
math.huge
)
bodyVelocity.Velocity = Vector3.zero
bodyVelocity.Parent = root
AutoFarmState.BodyVelocity = bodyVelocity
local duration = math.max(
0.05,
distance / SETTINGS.AUTO_FARM_GLIDE_SPEED
)
local destinationCFrame = CFrame.lookAt(
destination,
targetPosition
)
local tween = TweenService:Create(
root,
TweenInfo.new(
duration,
Enum.EasingStyle.Linear,
Enum.EasingDirection.Out
),
{
CFrame = destinationCFrame,
}
)
AutoFarmState.MoveTween = tween
tween.Completed:Connect(function()
if token ~= AutoFarmState.MoveToken then
return
end
AutoFarmState.MoveTween = nil
if AutoFarmState.BodyVelocity then
AutoFarmState.BodyVelocity:Destroy()
AutoFarmState.BodyVelocity = nil
end
restoreCharacterCollisions()
AutoFarmState.Moving = false
end)
tween:Play()
end
local function setAutoFarmEnabled(enabled)
SETTINGS.AUTO_FARM_ENABLED = enabled == true
if not SETTINGS.AUTO_FARM_ENABLED then
clearAutoFarmTarget("Auto-Farm ausgeschaltet")
else
setAutoFarmStatus("Suche ausgewählte Erze …")
end
end
local function updateCurrentAutoFarmTarget()
if not SETTINGS.AUTO_FARM_ENABLED then
return
end
local root = getCharacterRoot()
if not root then
clearAutoFarmTarget("Charakter wird geladen …")
return
end
local data = AutoFarmState.CurrentData
local information = AutoFarmState.CurrentInformation
if data then
local valid, refreshedInformation, distanceSquared =
isAutoFarmDataValid(data, root.Position)
if valid then
information = refreshedInformation
AutoFarmState.CurrentInformation = refreshedInformation
AutoFarmState.LastDistance = math.sqrt(distanceSquared)
else
clearAutoFarmTarget("Suche nächstes Ziel …")
data = nil
end
end
if not data then
local distanceSquared
data, information, distanceSquared =
chooseAutoFarmTarget(root.Position)
if not data then
releaseMiningInput()
stopGlide()
local selectedCount = countSelectedOreGroups()
if selectedCount == 0 then
setAutoFarmStatus("Keine Erzart ausgewählt")
else
setAutoFarmStatus("Kein ausgewähltes Erz im Radius")
end
return
end
AutoFarmState.CurrentData = data
AutoFarmState.CurrentInformation = information
AutoFarmState.CurrentGroupId =
getOreGroupId(information)
AutoFarmState.TargetStartedAt = os.clock()
AutoFarmState.MiningStartedAt = nil
AutoFarmState.LastDistance =
math.sqrt(distanceSquared)
end
if not data.Target.Parent then
clearAutoFarmTarget("Ziel abgebaut")
return
end
local distance =
(data.Position - root.Position).Magnitude
AutoFarmState.LastDistance = distance
if distance > SETTINGS.AUTO_FARM_MINE_DISTANCE then
releaseMiningInput()
if SETTINGS.AUTO_FARM_GLIDE_ENABLED then
setAutoFarmStatus(string.format(
"Fliege zu %s [%s] – %.0f Studs",
information.Name,
information.Rarity,
distance
))
startGlideToCurrentTarget()
else
setAutoFarmStatus(string.format(
"%s ist %.0f Studs entfernt",
information.Name,
distance
))
end
else
stopGlide()
setAutoFarmStatus(string.format(
"Baue %s [%s] ab – %.1f Studs",
information.Name,
information.Rarity,
distance
))
end
if AutoFarmState.MiningStartedAt
and os.clock() - AutoFarmState.MiningStartedAt
>= SETTINGS.AUTO_FARM_STUCK_TIMEOUT
then
AutoFarmState.IgnoredUntil[data.Target] =
os.clock() + SETTINGS.AUTO_FARM_IGNORE_TIME
clearAutoFarmTarget(
"Ziel reagiert nicht – vorübergehend übersprungen"
)
end
end
task.spawn(function()
while task.wait(
SETTINGS.AUTO_FARM_TARGET_REFRESH_INTERVAL
) do
updateCurrentAutoFarmTarget()
end
end)
RunService.RenderStepped:Connect(function()
if not SETTINGS.AUTO_FARM_ENABLED then
return
end
local data = AutoFarmState.CurrentData
local information = AutoFarmState.CurrentInformation
local root = getCharacterRoot()
local camera = workspace.CurrentCamera
if not data
or not information
or not root
or not camera
or not data.Target.Parent
then
releaseMiningInput()
return
end
local targetPosition = getMineAimPosition(
data,
root.Position
)
local distance =
(targetPosition - root.Position).Magnitude
if distance > SETTINGS.AUTO_FARM_MINE_DISTANCE then
releaseMiningInput()
return
end
stopGlide()
if SETTINGS.AUTO_FARM_ROTATE_CHARACTER then
local horizontalTarget = Vector3.new(
targetPosition.X,
root.Position.Y,
targetPosition.Z
)
if (horizontalTarget - root.Position).Magnitude > 0.01 then
root.CFrame = CFrame.lookAt(
root.Position,
horizontalTarget
)
end
end
if SETTINGS.AUTO_FARM_AIM_CAMERA then
if not AutoFarmState.SavedCameraCFrame then
AutoFarmState.SavedCameraCFrame = camera.CFrame
end
camera.CFrame = CFrame.lookAt(
camera.CFrame.Position,
targetPosition
)
end
local screenPosition, onScreen =
camera:WorldToViewportPoint(targetPosition)
if not SETTINGS.AUTO_FARM_AIM_CAMERA
and not onScreen
then
releaseMiningInput()
setAutoFarmStatus(
"MouseOnly: Ziel befindet sich nicht im Bild"
)
return
end
AutoFarmState.LastMouseX = screenPosition.X
AutoFarmState.LastMouseY = screenPosition.Y
safeSendMouseMove(
screenPosition.X,
screenPosition.Y
)
if not AutoFarmState.MouseDown then
local success = safeSendMouseButton(
screenPosition.X,
screenPosition.Y,
true
)
if success then
AutoFarmState.MouseDown = true
AutoFarmState.MiningStartedAt = os.clock()
else
setAutoFarmStatus(
"VirtualInputManager konnte nicht senden"
)
end
end
end)
--//====================================================
--// ORE-AUSWAHL-GUI
--//====================================================
local function setOreGroupSelected(groupId, selected)
SelectedOreGroups[groupId] = selected == true
OreSelectionTouched[groupId] = true
if AutoFarmState.CurrentGroupId == groupId
and not SelectedOreGroups[groupId]
then
clearAutoFarmTarget("Ziel wurde abgewählt")
end
end
local function updateOreRowVisual(groupId)
local row = OreRowButtons[groupId]
if not row then
return
end
local selected = SelectedOreGroups[groupId] == true
row.Button.Text = selected
and " ✓ " .. row.DisplayText
or " " .. row.DisplayText
row.Button.BackgroundColor3 = selected
and Color3.fromRGB(42, 92, 62)
or Color3.fromRGB(43, 43, 51)
end
local function applyOreSearchFilter()
local search = ""
if AutoFarmSearchBox then
search = string.lower(AutoFarmSearchBox.Text)
end
for _, row in pairs(OreRowButtons) do
row.Button.Visible = search == ""
or string.find(
row.SearchText,
search,
1,
true
) ~= nil
end
task.defer(function()
if AutoFarmList
and AutoFarmListLayout
then
AutoFarmList.CanvasSize =
UDim2.fromOffset(
0,
AutoFarmListLayout.AbsoluteContentSize.Y
+ 12
)
end
end)
end
local function refreshOreSelectionLabels()
local selected, total = countSelectedOreGroups()
if AutoFarmSelectionLabel then
AutoFarmSelectionLabel.Text = string.format(
"Ausgewählt: %d/%d | Ziele im Radius: %d",
selected,
total,
AutoFarmState.LastCandidateCount
)
end
if AutoFarmToggleButton then
AutoFarmToggleButton.Text = SETTINGS.AUTO_FARM_ENABLED
and "AUTO-FARM: AN"
or "AUTO-FARM: AUS"
AutoFarmToggleButton.BackgroundColor3 =
SETTINGS.AUTO_FARM_ENABLED
and Color3.fromRGB(38, 130, 74)
or Color3.fromRGB(135, 50, 55)
end
if AutoFarmPriorityButton then
AutoFarmPriorityButton.Text =
SETTINGS.AUTO_FARM_PRIORITY == "Nearest"
and "Priorität: Nächstes"
or "Priorität: Seltenstes"
end
if AutoFarmGlideButton then
AutoFarmGlideButton.Text =
SETTINGS.AUTO_FARM_GLIDE_ENABLED
and "Bewegen: AN"
or "Bewegen: AUS"
end
if AutoFarmCameraButton then
AutoFarmCameraButton.Text =
SETTINGS.AUTO_FARM_AIM_CAMERA
and "Kamera-Ziel: AN"
or "Kamera-Ziel: AUS"
end
if AutoFarmStatusLabel then
AutoFarmStatusLabel.Text =
AutoFarmState.LastStatus
end
end
local function rebuildOreRows()
if not AutoFarmList then
return
end
ensureOreSelectionInitialized()
for _, row in pairs(OreRowButtons) do
if row.Button then
row.Button:Destroy()
end
end
OreRowButtons = {}
for _, group in ipairs(OreGroups) do
local button = Instance.new("TextButton")
button.Name = "Ore_" .. group.Id
button.Size = UDim2.new(1, -8, 0, 34)
button.BackgroundColor3 = Color3.fromRGB(43, 43, 51)
button.BorderSizePixel = 0
button.AutoButtonColor = true
button.Font = Enum.Font.Gotham
button.TextSize = 13
button.TextColor3 = getRarityColor(group.Rarity)
button.TextXAlignment = Enum.TextXAlignment.Left
button.Parent = AutoFarmList
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, 6)
corner.Parent = button
local displayText = string.format(
"%s [%s]",
group.Name,
group.Rarity
)
OreRowButtons[group.Id] = {
Button = button,
DisplayText = displayText,
SearchText = string.lower(displayText),
}
button.MouseButton1Click:Connect(function()
setOreGroupSelected(
group.Id,
not SelectedOreGroups[group.Id]
)
updateOreRowVisual(group.Id)
refreshOreSelectionLabels()
end)
updateOreRowVisual(group.Id)
end
applyOreSearchFilter()
refreshOreSelectionLabels()
end
local function selectOreGroups(mode)
ensureOreSelectionInitialized()
for _, group in ipairs(OreGroups) do
local selected = false
if mode == "All" then
selected = true
elseif mode == "RarePlus" then
selected = getRarityRank(group.Rarity)
>= getRarityRank("Rare")
elseif mode == "TNT" then
selected = string.find(
string.lower(group.Name),
"tnt",
1,
true
) ~= nil
end
setOreGroupSelected(group.Id, selected)
updateOreRowVisual(group.Id)
end
refreshOreSelectionLabels()
end
local function createGuiButton(parent, text, size)
local button = Instance.new("TextButton")
button.Size = size
button.BackgroundColor3 = Color3.fromRGB(54, 75, 126)
button.BorderSizePixel = 0
button.Font = Enum.Font.GothamBold
button.Text = text
button.TextColor3 = Color3.new(1, 1, 1)
button.TextSize = 12
button.Parent = parent
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, 7)
corner.Parent = button
return button
end
local function makeFrameDraggable(frame, dragHandle)
local dragging = false
local dragStart = nil
local startPosition = nil
dragHandle.InputBegan:Connect(function(input)
if input.UserInputType
== Enum.UserInputType.MouseButton1
or input.UserInputType
== Enum.UserInputType.Touch
then
dragging = true
dragStart = input.Position
startPosition = frame.Position
end
end)
UserInputService.InputChanged:Connect(function(input)
if not dragging then
return
end
if input.UserInputType
== Enum.UserInputType.MouseMovement
or input.UserInputType
== Enum.UserInputType.Touch
then
local delta = input.Position - dragStart
frame.Position = UDim2.new(
startPosition.X.Scale,
startPosition.X.Offset + delta.X,
startPosition.Y.Scale,
startPosition.Y.Offset + delta.Y
)
end
end)
UserInputService.InputEnded:Connect(function(input)
if input.UserInputType
== Enum.UserInputType.MouseButton1
or input.UserInputType
== Enum.UserInputType.Touch
then
dragging = false
end
end)
end
local function ensureAutoFarmGui()
if AutoFarmGui then
return
end
local oldGui = PlayerGui:FindFirstChild(
AUTO_FARM_GUI_NAME
)
if oldGui then
oldGui:Destroy()
end
AutoFarmGui = Instance.new("ScreenGui")
AutoFarmGui.Name = AUTO_FARM_GUI_NAME
AutoFarmGui.ResetOnSpawn = false
AutoFarmGui.IgnoreGuiInset = false
AutoFarmGui.DisplayOrder = 1000
AutoFarmGui.Parent = PlayerGui
local main = Instance.new("Frame")
main.Name = "Main"
main.Position = UDim2.new(0, 18, 0.5, -290)
main.Size = UDim2.fromOffset(470, 580)
main.BackgroundColor3 = Color3.fromRGB(25, 25, 31)
main.BorderSizePixel = 0
main.Active = true
main.Parent = AutoFarmGui
AutoFarmMain = main
local mainCorner = Instance.new("UICorner")
mainCorner.CornerRadius = UDim.new(0, 11)
mainCorner.Parent = main
local titleBar = Instance.new("Frame")
titleBar.Name = "TitleBar"
titleBar.Size = UDim2.new(1, 0, 0, 40)
titleBar.BackgroundColor3 = Color3.fromRGB(34, 34, 42)
titleBar.BorderSizePixel = 0
titleBar.Active = true
titleBar.Parent = main
local titleCorner = Instance.new("UICorner")
titleCorner.CornerRadius = UDim.new(0, 11)
titleCorner.Parent = titleBar
local title = Instance.new("TextLabel")
title.BackgroundTransparency = 1
title.Position = UDim2.fromOffset(12, 0)
title.Size = UDim2.new(1, -96, 1, 0)
title.Font = Enum.Font.GothamBold
title.Text = "Ore Auto-Farm"
title.TextColor3 = Color3.new(1, 1, 1)
title.TextSize = 17
title.TextXAlignment = Enum.TextXAlignment.Left
title.Parent = titleBar
local hideButton = createGuiButton(
titleBar,
"—",
UDim2.fromOffset(34, 28)
)
hideButton.Position = UDim2.new(1, -42, 0, 6)
hideButton.BackgroundColor3 = Color3.fromRGB(61, 61, 72)
hideButton.MouseButton1Click:Connect(function()
AutoFarmGui.Enabled = false
end)
makeFrameDraggable(main, titleBar)
local toggleButton = createGuiButton(
main,
"AUTO-FARM: AUS",
UDim2.new(1, -24, 0, 40)
)
toggleButton.Position = UDim2.fromOffset(12, 50)
AutoFarmToggleButton = toggleButton
toggleButton.MouseButton1Click:Connect(function()
setAutoFarmEnabled(
not SETTINGS.AUTO_FARM_ENABLED
)
refreshOreSelectionLabels()
end)
local statusLabel = Instance.new("TextLabel")
statusLabel.BackgroundTransparency = 1
statusLabel.Position = UDim2.fromOffset(12, 94)
statusLabel.Size = UDim2.new(1, -24, 0, 28)
statusLabel.Font = Enum.Font.Gotham
statusLabel.Text = AutoFarmState.LastStatus
statusLabel.TextColor3 = Color3.fromRGB(220, 220, 225)
statusLabel.TextSize = 12
statusLabel.TextWrapped = true
statusLabel.TextXAlignment = Enum.TextXAlignment.Left
statusLabel.Parent = main
AutoFarmStatusLabel = statusLabel
local selectionLabel = Instance.new("TextLabel")
selectionLabel.BackgroundTransparency = 1
selectionLabel.Position = UDim2.fromOffset(12, 121)
selectionLabel.Size = UDim2.new(1, -24, 0, 22)
selectionLabel.Font = Enum.Font.Gotham
selectionLabel.Text = ""
selectionLabel.TextColor3 = Color3.fromRGB(160, 160, 170)
selectionLabel.TextSize = 11
selectionLabel.TextXAlignment = Enum.TextXAlignment.Left
selectionLabel.Parent = main
AutoFarmSelectionLabel = selectionLabel
local searchBox = Instance.new("TextBox")
searchBox.Position = UDim2.fromOffset(12, 148)
searchBox.Size = UDim2.new(1, -24, 0, 34)
searchBox.BackgroundColor3 = Color3.fromRGB(17, 17, 22)
searchBox.BorderSizePixel = 0
searchBox.ClearTextOnFocus = false
searchBox.Font = Enum.Font.Gotham
searchBox.PlaceholderText = "Erz suchen …"
searchBox.Text = ""
searchBox.TextColor3 = Color3.new(1, 1, 1)
searchBox.PlaceholderColor3 = Color3.fromRGB(120, 120, 130)
searchBox.TextSize = 13
searchBox.Parent = main
AutoFarmSearchBox = searchBox
local searchCorner = Instance.new("UICorner")
searchCorner.CornerRadius = UDim.new(0, 7)
searchCorner.Parent = searchBox
searchBox:GetPropertyChangedSignal("Text"):Connect(
applyOreSearchFilter
)
local quickBar = Instance.new("Frame")
quickBar.BackgroundTransparency = 1
quickBar.Position = UDim2.fromOffset(12, 190)
quickBar.Size = UDim2.new(1, -24, 0, 32)
quickBar.Parent = main
local quickLayout = Instance.new("UIListLayout")
quickLayout.FillDirection = Enum.FillDirection.Horizontal
quickLayout.Padding = UDim.new(0, 6)
quickLayout.Parent = quickBar
local allButton = createGuiButton(
quickBar,
"Alle",
UDim2.new(0.25, -5, 1, 0)
)
local noneButton = createGuiButton(
quickBar,
"Keine",
UDim2.new(0.25, -5, 1, 0)
)
local rareButton = createGuiButton(
quickBar,
"Rare+",
UDim2.new(0.25, -5, 1, 0)
)
local tntButton = createGuiButton(
quickBar,
"Nur TNT",
UDim2.new(0.25, -5, 1, 0)
)
allButton.MouseButton1Click:Connect(function()
selectOreGroups("All")
end)
noneButton.MouseButton1Click:Connect(function()
selectOreGroups("None")
end)
rareButton.MouseButton1Click:Connect(function()
selectOreGroups("RarePlus")
end)
tntButton.MouseButton1Click:Connect(function()
selectOreGroups("TNT")
end)
local optionBar = Instance.new("Frame")
optionBar.BackgroundTransparency = 1
optionBar.Position = UDim2.fromOffset(12, 229)
optionBar.Size = UDim2.new(1, -24, 0, 32)
optionBar.Parent = main
local optionLayout = Instance.new("UIListLayout")
optionLayout.FillDirection = Enum.FillDirection.Horizontal
optionLayout.Padding = UDim.new(0, 6)
optionLayout.Parent = optionBar
local priorityButton = createGuiButton(
optionBar,
"Priorität: Seltenstes",
UDim2.new(0.38, -4, 1, 0)
)
AutoFarmPriorityButton = priorityButton
local glideButton = createGuiButton(
optionBar,
"Bewegen: AN",
UDim2.new(0.29, -4, 1, 0)
)
AutoFarmGlideButton = glideButton
local cameraButton = createGuiButton(
optionBar,
"Kamera-Ziel: AN",
UDim2.new(0.33, -4, 1, 0)
)
AutoFarmCameraButton = cameraButton
priorityButton.MouseButton1Click:Connect(function()
SETTINGS.AUTO_FARM_PRIORITY =
SETTINGS.AUTO_FARM_PRIORITY == "Nearest"
and "HighestRarity"
or "Nearest"
clearAutoFarmTarget("Priorität geändert")
refreshOreSelectionLabels()
end)
glideButton.MouseButton1Click:Connect(function()
SETTINGS.AUTO_FARM_GLIDE_ENABLED =
not SETTINGS.AUTO_FARM_GLIDE_ENABLED
stopGlide()
clearAutoFarmTarget("Bewegungsmodus geändert")
refreshOreSelectionLabels()
end)
cameraButton.MouseButton1Click:Connect(function()
SETTINGS.AUTO_FARM_AIM_CAMERA =
not SETTINGS.AUTO_FARM_AIM_CAMERA
releaseMiningInput()
refreshOreSelectionLabels()
end)
local list = Instance.new("ScrollingFrame")
list.Name = "OreList"
list.Position = UDim2.fromOffset(12, 270)
list.Size = UDim2.new(1, -24, 1, -282)
list.BackgroundColor3 = Color3.fromRGB(17, 17, 22)
list.BorderSizePixel = 0
list.ScrollBarThickness = 7
list.CanvasSize = UDim2.fromOffset(0, 0)
list.Parent = main
AutoFarmList = list
local listCorner = Instance.new("UICorner")
listCorner.CornerRadius = UDim.new(0, 8)
listCorner.Parent = list
local listPadding = Instance.new("UIPadding")
listPadding.PaddingTop = UDim.new(0, 6)
listPadding.PaddingBottom = UDim.new(0, 6)
listPadding.PaddingLeft = UDim.new(0, 6)
listPadding.PaddingRight = UDim.new(0, 6)
listPadding.Parent = list
local listLayout = Instance.new("UIListLayout")
listLayout.Padding = UDim.new(0, 5)
listLayout.Parent = list
AutoFarmListLayout = listLayout
listLayout:GetPropertyChangedSignal(
"AbsoluteContentSize"
):Connect(function()
list.CanvasSize = UDim2.fromOffset(
0,
listLayout.AbsoluteContentSize.Y + 12
)
end)
rebuildOreRows()
end
local function toggleAutoFarmGui()
ensureAutoFarmGui()
AutoFarmGui.Enabled = not AutoFarmGui.Enabled
if AutoFarmGui.Enabled then
if OreListDirty then
rebuildOreRows()
else
refreshOreSelectionLabels()
end
end
end
task.spawn(function()
while task.wait(0.35) do
if AutoFarmGui and AutoFarmGui.Enabled then
if OreListDirty then
rebuildOreRows()
else
refreshOreSelectionLabels()
end
end
end
end)
--//====================================================
--// EXPORT
--//====================================================
local function buildExportGroups()
local groups = {}
for key, information in pairs(KnownKeys) do
if not ConflictingKeys[key]
and (
not SETTINGS.EXPORT_ONLY_RARE_OR_HIGHER
or isRareEnough(information.Rarity)
)
then
local name = information.Name
if not name or name == "" then
name = makeGenericName(
information.Rarity,
key
)
end
local groupId =
string.lower(name)
.. "|"
.. information.Rarity
local group = groups[groupId]
if not group then
group = {
Id = groupId,
Name = name,
Rarity = information.Rarity,
Generic = information.Generic,
Keys = {},
}
groups[groupId] = group
end
table.insert(group.Keys, key)
end
end
local ordered = {}
for _, group in pairs(groups) do
table.sort(group.Keys, function(a, b)
local priorityA = getKeyPriority(a)
local priorityB = getKeyPriority(b)
if priorityA == priorityB then
return a < b
end
return priorityA > priorityB
end)
table.insert(ordered, group)
end
table.sort(ordered, function(a, b)
local rankA = getRarityRank(a.Rarity)
local rankB = getRarityRank(b.Rarity)
if rankA ~= rankB then
return rankA > rankB
end
return a.Name < b.Name
end)
return ordered
end
local function findExportGroup(groupId)
for _, group in ipairs(buildExportGroups()) do
if group.Id == groupId then
return group
end
end
return nil
end
local function buildGroupSnippet(group)
if not group then
return ""
end
local lines = {
string.format(
"-- %s [%s]%s",
group.Name,
group.Rarity,
group.Generic
and " – automatisch erkannt"
or ""
),
}
for _, key in ipairs(group.Keys) do
table.insert(
lines,
string.format(
"[%q] = {Name = %q, Rarity = %q},",
key,
group.Name,
group.Rarity
)
)
end
return table.concat(lines, "\n")
end
local function buildAllExportText()
local lines = {
"-- Automatisch erzeugte Rare-ESP-Presets",
"-- Erstellt: "
.. os.date("%Y-%m-%d %H:%M:%S"),
"",
"PRESETS = {",
}
for _, group in ipairs(buildExportGroups()) do
local snippet = buildGroupSnippet(group)
for line in string.gmatch(
snippet,
"[^\n]+"
) do
table.insert(lines, "\t" .. line)
end
table.insert(lines, "")
end
table.insert(lines, "}")
return table.concat(lines, "\n")
end
local function writeExportFile()
if not FileWriter then
return false,
"Kein direkter Dateizugriff verfügbar."
end
local filename =
SETTINGS.EXPORT_FILE_PREFIX
.. "_"
.. os.date("%Y%m%d_%H%M%S")
.. ".txt"
local success, result = pcall(
FileWriter,
filename,
buildAllExportText()
)
if not success then
return false, tostring(result)
end
return true, filename
end
local ExportGui = nil
local ExportState = {
Groups = {},
Index = 1,
Output = nil,
Status = nil,
}
local function selectExportText()
if not ExportState.Output then
return
end
ExportState.Output:CaptureFocus()
task.defer(function()
if ExportState.Output then
ExportState.Output.SelectionStart = 1
ExportState.Output.CursorPosition =
#ExportState.Output.Text + 1
end
end)
end
local function renderCurrentExportGroup()
ExportState.Groups = buildExportGroups()
if #ExportState.Groups == 0 then
ExportState.Index = 1
ExportState.Output.Text = ""
ExportState.Status.Text =
"Noch keine Blockart gespeichert."
return
end
ExportState.Index = math.clamp(
ExportState.Index,
1,
#ExportState.Groups
)
local group =
ExportState.Groups[ExportState.Index]
ExportState.Output.Text =
buildGroupSnippet(group)
ExportState.Status.Text = string.format(
"%d/%d – %s [%s]",
ExportState.Index,
#ExportState.Groups,
group.Name,
group.Rarity
)
end
local function ensureExportGui()
if ExportGui then
return
end
ExportGui = Instance.new("ScreenGui")
ExportGui.Name = "_OptimizedRareESPExport"
ExportGui.ResetOnSpawn = false
ExportGui.Enabled = false
ExportGui.Parent = PlayerGui
local frame = Instance.new("Frame")
frame.AnchorPoint = Vector2.new(0.5, 0.5)
frame.Position = UDim2.fromScale(0.5, 0.5)
frame.Size = UDim2.fromOffset(680, 410)
frame.BackgroundColor3 =
Color3.fromRGB(25, 25, 30)
frame.BorderSizePixel = 0
frame.Parent = ExportGui
local frameCorner = Instance.new("UICorner")
frameCorner.CornerRadius = UDim.new(0, 10)
frameCorner.Parent = frame
local title = Instance.new("TextLabel")
title.BackgroundTransparency = 1
title.Position = UDim2.fromOffset(14, 8)
title.Size = UDim2.new(1, -60, 0, 30)
title.Font = Enum.Font.GothamBold
title.Text = "Rare ESP – Export"
title.TextColor3 = Color3.new(1, 1, 1)
title.TextSize = 19
title.TextXAlignment =
Enum.TextXAlignment.Left
title.Parent = frame
local closeButton = Instance.new("TextButton")
closeButton.Position =
UDim2.new(1, -42, 0, 8)
closeButton.Size = UDim2.fromOffset(30, 30)
closeButton.BackgroundColor3 =
Color3.fromRGB(55, 55, 65)
closeButton.BorderSizePixel = 0
closeButton.Font = Enum.Font.GothamBold
closeButton.Text = "X"
closeButton.TextColor3 =
Color3.new(1, 1, 1)
closeButton.TextSize = 15
closeButton.Parent = frame
local closeCorner = Instance.new("UICorner")
closeCorner.CornerRadius = UDim.new(0, 7)
closeCorner.Parent = closeButton
local buttonBar = Instance.new("Frame")
buttonBar.BackgroundTransparency = 1
buttonBar.Position = UDim2.fromOffset(14, 46)
buttonBar.Size = UDim2.new(1, -28, 0, 34)
buttonBar.Parent = frame
local buttonLayout = Instance.new("UIListLayout")
buttonLayout.FillDirection =
Enum.FillDirection.Horizontal
buttonLayout.Padding = UDim.new(0, 6)
buttonLayout.Parent = buttonBar
local function createButton(text, width)
local button = Instance.new("TextButton")
button.Size = UDim2.fromOffset(width, 32)
button.BackgroundColor3 =
Color3.fromRGB(50, 85, 160)
button.BorderSizePixel = 0
button.Font = Enum.Font.GothamBold
button.Text = text
button.TextColor3 =
Color3.new(1, 1, 1)
button.TextSize = 13
button.Parent = buttonBar
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, 7)
corner.Parent = button
return button
end
local previousButton =
createButton("Zurück", 75)
local nextButton =
createButton("Weiter", 75)
local copyCurrentButton =
createButton("Aktuellen kopieren", 145)
local copyAllButton =
createButton("Alles kopieren", 120)
local saveButton =
createButton("TXT speichern", 115)
local output = Instance.new("TextBox")
output.Position = UDim2.fromOffset(14, 90)
output.Size = UDim2.new(1, -28, 1, -132)
output.BackgroundColor3 =
Color3.fromRGB(17, 17, 21)
output.BorderSizePixel = 0
output.ClearTextOnFocus = false
output.MultiLine = true
output.Font = Enum.Font.Code
output.Text = ""
output.TextColor3 =
Color3.fromRGB(235, 235, 235)
output.TextSize = 14
output.TextWrapped = false
output.TextXAlignment =
Enum.TextXAlignment.Left
output.TextYAlignment =
Enum.TextYAlignment.Top
output.Parent = frame
local outputCorner = Instance.new("UICorner")
outputCorner.CornerRadius = UDim.new(0, 8)
outputCorner.Parent = output
local outputPadding = Instance.new("UIPadding")
outputPadding.PaddingTop = UDim.new(0, 8)
outputPadding.PaddingBottom = UDim.new(0, 8)
outputPadding.PaddingLeft = UDim.new(0, 8)
outputPadding.PaddingRight = UDim.new(0, 8)
outputPadding.Parent = output
local status = Instance.new("TextLabel")
status.BackgroundTransparency = 1
status.Position = UDim2.new(0, 14, 1, -34)
status.Size = UDim2.new(1, -28, 0, 24)
status.Font = Enum.Font.Gotham
status.Text = ""
status.TextColor3 =
Color3.fromRGB(190, 190, 195)
status.TextSize = 13
status.TextXAlignment =
Enum.TextXAlignment.Left
status.Parent = frame
ExportState.Output = output
ExportState.Status = status
closeButton.MouseButton1Click:Connect(function()
ExportGui.Enabled = false
end)
previousButton.MouseButton1Click:Connect(function()
ExportState.Index -= 1
if ExportState.Index < 1 then
ExportState.Index =
math.max(1, #ExportState.Groups)
end
renderCurrentExportGroup()
end)
nextButton.MouseButton1Click:Connect(function()
ExportState.Index += 1
if ExportState.Index
> math.max(1, #ExportState.Groups)
then
ExportState.Index = 1
end
renderCurrentExportGroup()
end)
copyCurrentButton.MouseButton1Click:Connect(function()
local group =
ExportState.Groups[
ExportState.Index
]
if not group then
status.Text =
"Noch keine Blockart vorhanden."
return
end
local text = buildGroupSnippet(group)
local success = copyToClipboard(text)
if success then
status.Text =
group.Name .. " wurde kopiert."
else
output.Text = text
status.Text =
"Text markiert – Strg + C drücken."
selectExportText()
end
end)
copyAllButton.MouseButton1Click:Connect(function()
local text = buildAllExportText()
local success = copyToClipboard(text)
if success then
status.Text =
"Alle Presets wurden kopiert."
else
output.Text = text
status.Text =
"Text markiert – Strg + C drücken."
selectExportText()
end
end)
saveButton.MouseButton1Click:Connect(function()
local success, result =
writeExportFile()
if success then
status.Text =
"TXT gespeichert: " .. result
else
output.Text = buildAllExportText()
status.Text =
"Dateiexport nicht verfügbar – "
.. "Strg + C verwenden."
selectExportText()
end
end)
end
local function copyLastExportGroup()
if not LastExportGroupId then
print(
"[EXPORT] Noch keine benannte Blockart gelernt."
)
return
end
local group =
findExportGroup(LastExportGroupId)
if not group then
print(
"[EXPORT] Letzter Block ist nicht mehr verfügbar."
)
return
end
local text = buildGroupSnippet(group)
local success = copyToClipboard(text)
if success then
print(
"[EXPORT] Kopiert:",
group.Name,
"[" .. group.Rarity .. "]"
)
return
end
ensureExportGui()
ExportGui.Enabled = true
ExportState.Output.Text = text
ExportState.Status.Text =
"Text markiert – Strg + C drücken."
selectExportText()
end
local function exportAllPresets()
local success, result = writeExportFile()
if success then
print(
"[EXPORT] TXT gespeichert:",
result
)
return
end
local text = buildAllExportText()
local copied = copyToClipboard(text)
if copied then
print(
"[EXPORT] Alle Presets wurden kopiert."
)
return
end
ensureExportGui()
ExportGui.Enabled = true
ExportState.Output.Text = text
ExportState.Status.Text =
"Text markiert – Strg + C drücken."
selectExportText()
end
--//====================================================
--// ROHER MESH-KATALOG OHNE ANSCHAUEN
--//====================================================
--//
--// Alle bereits geladenen Block-Modelle im SCAN_RADIUS
--// werden aus dem räumlichen Index gelesen. Dafür muss
-- kein Block anvisiert werden.
--//
--// Wichtig:
--// MeshId/Texturen lassen sich automatisch auslesen.
--// Name und Rarität sind nur sicher bekannt, wenn:
--// 1. der Schlüssel bereits in PRESETS steht,
--// 2. Partikel eine Rarität liefern oder
--// 3. der Block irgendwann über das GUI gelernt wurde.
--//
--// Unbekannte Einträge bleiben deshalb als "Unknown".
--//====================================================
local MeshCatalogExportRunning = false
local function getPreferredCatalogKey(keys)
local preferredKey = nil
local preferredPriority = -1
for _, key in ipairs(keys) do
local priority = getKeyPriority(key)
if priority > preferredPriority
or (
priority == preferredPriority
and (
not preferredKey
or key < preferredKey
)
)
then
preferredPriority = priority
preferredKey = key
end
end
return preferredKey
end
local function getCatalogInformation(data, identityKey)
if data.NamedInfo then
return {
Name = data.NamedInfo.Name,
Rarity = data.NamedInfo.Rarity,
Known = true,
Source = "GUI",
}
end
local meshInformation = getMeshInformation(data)
if meshInformation then
return {
Name = meshInformation.Name,
Rarity = meshInformation.Rarity,
Known = true,
Source = "Preset/Mesh",
}
end
if data.ParticleRarity then
return {
Name = makeGenericName(
data.ParticleRarity,
identityKey
),
Rarity = data.ParticleRarity,
Known = false,
Source = "Particle",
}
end
return {
Name = "UnknownMesh_"
.. (
identityKey:match("(%d+)[^%d]*$")
or tostring(#identityKey * 7919)
),
Rarity = "Unknown",
Known = false,
Source = "MeshOnly",
}
end
local function buildNearbyMeshCatalogText()
local characterRoot = getCharacterRoot()
if not characterRoot then
return nil, "HumanoidRootPart nicht gefunden."
end
local origin = characterRoot.Position
local radiusSquared =
SETTINGS.SCAN_RADIUS * SETTINGS.SCAN_RADIUS
local groups = {}
local checked = 0
local includedTargets = 0
for target, data in pairs(TargetData) do
if target.Parent
and #data.Keys > 0
then
local offset = data.Position - origin
local distanceSquared = offset:Dot(offset)
if distanceSquared <= radiusSquared then
local identityKey =
getPreferredCatalogKey(data.Keys)
if identityKey then
local information =
getCatalogInformation(
data,
identityKey
)
if SETTINGS.INCLUDE_KNOWN_MESHES_IN_CATALOG
or not information.Known
then
local group = groups[identityKey]
if not group then
group = {
IdentityKey = identityKey,
Name = information.Name,
Rarity = information.Rarity,
Known = information.Known,
Source = information.Source,
Count = 0,
NearestDistanceSquared =
distanceSquared,
Keys = {},
}
groups[identityKey] = group
end
group.Count += 1
includedTargets += 1
if distanceSquared
< group.NearestDistanceSquared
then
group.NearestDistanceSquared =
distanceSquared
end
for _, key in ipairs(data.Keys) do
group.Keys[key] = true
end
end
end
end
end
checked += 1
if checked
% SETTINGS.MESH_CATALOG_BATCH_SIZE
== 0
then
task.wait()
end
end
local ordered = {}
for _, group in pairs(groups) do
local keys = {}
for key in pairs(group.Keys) do
table.insert(keys, key)
end
table.sort(keys, function(a, b)
local priorityA = getKeyPriority(a)
local priorityB = getKeyPriority(b)
if priorityA == priorityB then
return a < b
end
return priorityA > priorityB
end)
group.Keys = keys
table.insert(ordered, group)
end
table.sort(ordered, function(a, b)
if a.Known ~= b.Known then
return not a.Known
end
local rankA = getRarityRank(a.Rarity)
local rankB = getRarityRank(b.Rarity)
if rankA ~= rankB then
return rankA > rankB
end
return a.IdentityKey < b.IdentityKey
end)
local lines = {
"-- Automatisch ausgelesener Mesh-Katalog",
"-- Kein Anvisieren der Blöcke erforderlich",
"-- Erstellt: "
.. os.date("%Y-%m-%d %H:%M:%S"),
"-- Radius: "
.. tostring(SETTINGS.SCAN_RADIUS),
"-- Erfasste Exemplare: "
.. tostring(includedTargets),
"-- Einzigartige Model-/Mesh-Signaturen: "
.. tostring(#ordered),
"--",
"-- Unknown bedeutet nur: Name/Rarität sind nicht",
"-- aus MeshId und Textur allein bestimmbar.",
"",
"RAW_MESH_CATALOG = {",
}
for _, group in ipairs(ordered) do
table.insert(
lines,
string.format(
"\t-- %s | %s | %dx | %.0f Studs | %s",
group.Name,
group.Rarity,
group.Count,
math.sqrt(
group.NearestDistanceSquared
),
group.Source
)
)
table.insert(
lines,
string.format(
"\t[%q] = {",
group.IdentityKey
)
)
table.insert(
lines,
string.format(
"\t\tName = %q,",
group.Name
)
)
table.insert(
lines,
string.format(
"\t\tRarity = %q,",
group.Rarity
)
)
table.insert(
lines,
string.format(
"\t\tKnown = %s,",
tostring(group.Known)
)
)
table.insert(
lines,
string.format(
"\t\tCount = %d,",
group.Count
)
)
table.insert(lines, "\t\tKeys = {")
for _, key in ipairs(group.Keys) do
table.insert(
lines,
string.format(
"\t\t\t%q,",
key
)
)
end
table.insert(lines, "\t\t},")
table.insert(lines, "\t},")
table.insert(lines, "")
end
table.insert(lines, "}")
return table.concat(lines, "\n"), nil
end
local function copyNearbyMeshCatalog(
isAutomatic
)
if MeshCatalogExportRunning then
if not isAutomatic then
print(
"[MESH CATALOG] Export läuft bereits."
)
end
return
end
MeshCatalogExportRunning = true
task.spawn(function()
local text, errorMessage =
buildNearbyMeshCatalogText()
if not text then
warn(
"[MESH CATALOG]",
errorMessage
)
MeshCatalogExportRunning = false
return
end
local copied, copyError =
copyToClipboard(text)
if copied then
print(
"[MESH CATALOG] Alle Meshes im Umkreis "
.. "wurden als ein Text kopiert."
)
else
ensureExportGui()
ExportGui.Enabled = true
ExportState.Output.Text = text
ExportState.Status.Text =
"Mesh-Katalog markiert – Strg + C drücken."
selectExportText()
print(
"[MESH CATALOG]",
copyError
)
end
if FileWriter then
local filename =
SETTINGS.MESH_CATALOG_FILE_PREFIX
.. "_"
.. os.date("%Y%m%d_%H%M%S")
.. ".txt"
local success = pcall(
FileWriter,
filename,
text
)
if success then
print(
"[MESH CATALOG] TXT gespeichert:",
filename
)
end
end
MeshCatalogExportRunning = false
end)
end
--//====================================================
--// EVENTBASIERTES LERNEN
--//====================================================
local LearnToken = 0
local BreakingPositionConnection = nil
local function attemptLearn()
local information = parseCurrentBlockText()
if not information then
return
end
local target = getCurrentTarget()
if not target then
return
end
local data = TargetData[target]
or registerTarget(target)
if not data then
return
end
data.NamedInfo = information
local changed =
registerTargetKeys(data, information)
LastExportGroupId =
string.lower(information.Name)
.. "|"
.. information.Rarity
if changed then
print("")
print(
"[BLOCK GELERNT]",
information.Name,
"[" .. information.Rarity .. "]"
)
for _, key in ipairs(data.Keys) do
print(
"Schlüssel:",
key,
ConflictingKeys[key]
and "GESPERRT"
or "AKTIV"
)
end
if SETTINGS.AUTO_COPY_NEW_NAMED_BLOCK then
local group =
findExportGroup(
LastExportGroupId
)
if group then
local success =
copyToClipboard(
buildGroupSnippet(group)
)
if success then
print(
"[EXPORT] Automatisch kopiert."
)
end
end
end
end
ForceRefresh = true
end
local function scheduleLearn()
LearnToken += 1
local token = LearnToken
task.delay(
SETTINGS.LEARN_STABILITY_TIME,
function()
if token == LearnToken then
attemptLearn()
end
end
)
end
local function connectBreakingPart(breaking)
if BreakingPositionConnection then
BreakingPositionConnection:Disconnect()
BreakingPositionConnection = nil
end
if breaking
and breaking:IsA("BasePart")
then
BreakingPositionConnection =
breaking:GetPropertyChangedSignal(
"Position"
):Connect(scheduleLearn)
scheduleLearn()
end
end
BlockTextObject:GetPropertyChangedSignal(
"Text"
):Connect(scheduleLearn)
workspace.ChildAdded:Connect(function(instance)
if instance.Name == SETTINGS.BREAKING_NAME
and instance:IsA("BasePart")
then
connectBreakingPart(instance)
end
end)
workspace.ChildRemoved:Connect(function(instance)
if instance.Name == SETTINGS.BREAKING_NAME then
connectBreakingPart(nil)
end
end)
connectBreakingPart(getBreakingPart())
--//====================================================
--// ROOT-ÄNDERUNGEN
--//====================================================
SETTINGS.ROOT.DescendantAdded:Connect(function(instance)
if instance:IsA("ParticleEmitter") then
task.defer(registerEmitter, instance)
return
end
task.defer(function()
local basePart = nil
if instance:IsA("BasePart") then
basePart = instance
else
local current = instance.Parent
while current and current ~= SETTINGS.ROOT do
if current:IsA("BasePart") then
basePart = current
break
end
current = current.Parent
end
end
if basePart then
local target = getBlockTarget(basePart)
if target then
if not TargetData[target] then
registerTarget(target)
else
queueReindex(target)
end
end
end
end)
end)
SETTINGS.ROOT.DescendantRemoving:Connect(function(instance)
if instance:IsA("ParticleEmitter") then
unregisterEmitter(instance)
return
end
local target = nil
if instance:IsA("Model")
or instance:IsA("BasePart")
then
target = TargetData[instance]
and instance
or nil
end
if target then
removeTarget(target)
deactivateTarget(target)
return
end
local parent = instance.Parent
while parent and parent ~= SETTINGS.ROOT do
if TargetData[parent] then
queueReindex(parent)
break
end
parent = parent.Parent
end
end)
--//====================================================
--// INITIALER SCAN
--//====================================================
task.spawn(function()
local descendants =
SETTINGS.ROOT:GetDescendants()
local seenTargets = {}
local processed = 0
-- Erst alle Modelle/Blöcke einmalig indexieren.
for _, descendant in ipairs(descendants) do
if descendant:IsA("BasePart") then
local target =
getBlockTarget(descendant)
if target and not seenTargets[target] then
seenTargets[target] = true
registerTarget(target)
end
end
processed += 1
if processed
% SETTINGS.INITIAL_SCAN_BATCH_SIZE
== 0
then
task.wait()
end
end
local targetCount = 0
for _ in pairs(TargetData) do
targetCount += 1
end
processed = 0
local emitterCount = 0
-- Danach Partikel zuordnen.
for _, descendant in ipairs(descendants) do
if descendant:IsA("ParticleEmitter") then
registerEmitter(descendant)
emitterCount += 1
end
processed += 1
if processed
% SETTINGS.INITIAL_SCAN_BATCH_SIZE
== 0
then
task.wait()
end
end
print("")
print(
"[OPTIMIZED ESP] Scan abgeschlossen:",
targetCount,
"Blöcke/Modelle und",
emitterCount,
"ParticleEmitter."
)
ForceRefresh = true
refreshVisibleESP(true)
if SETTINGS.AUTO_COPY_MESH_CATALOG_AFTER_INITIAL_SCAN then
task.delay(0.5, function()
copyNearbyMeshCatalog(true)
end)
end
end)
--//====================================================
--// REFRESH-LOOP
--//====================================================
task.spawn(function()
while task.wait(
SETTINGS.REFRESH_INTERVAL
) do
refreshVisibleESP(false)
end
end)
--//====================================================
--// DEBUG
--//====================================================
local function printDebug()
print("")
print(
"============================================================"
)
print("[OPTIMIZED ESP DEBUG]")
print(
"============================================================"
)
print("GUI-Text:", BlockTextObject.Text)
local breaking = getBreakingPart()
if breaking then
print(
"Breaking.Position:",
breaking.Position
)
else
print("Breaking: nicht gefunden")
end
local target, hitPart = getCurrentTarget()
if not target then
print("Zielblock: nicht gefunden")
return
end
local data = TargetData[target]
or registerTarget(target)
print(
"Getroffener Part:",
hitPart and hitPart:GetFullName()
or "nil"
)
print("Block-Ziel:", target:GetFullName())
print("Position:", data.Position)
print(
"Particle-Rarity:",
data.ParticleRarity or "keine"
)
local resolved =
resolveTargetInformation(data)
if resolved then
print(
"ESP-Ergebnis:",
resolved.Name,
resolved.Rarity,
resolved.Generic
and "(generisch)"
or ""
)
else
print("ESP-Ergebnis: keines")
end
print("Schlüssel:")
for _, key in ipairs(data.Keys) do
local known = KnownKeys[key]
print(
" ",
key,
ConflictingKeys[key]
and "GESPERRT"
or (
known
and (
"BEKANNT – "
.. known.Name
.. " ["
.. known.Rarity
.. "]"
)
or "UNBEKANNT"
)
)
end
print(
"============================================================"
)
end
--//====================================================
--// TASTEN
--//====================================================
UserInputService.InputBegan:Connect(function(
input,
processed
)
if processed then
return
end
if input.KeyCode == SETTINGS.TOGGLE_KEY then
SETTINGS.ENABLED =
not SETTINGS.ENABLED
print(
"[OPTIMIZED ESP]",
SETTINGS.ENABLED
and "AKTIVIERT"
or "DEAKTIVIERT"
)
ForceRefresh = true
refreshVisibleESP(true)
elseif input.KeyCode
== SETTINGS.EXPORT_PANEL_KEY
then
ensureExportGui()
ExportGui.Enabled =
not ExportGui.Enabled
if ExportGui.Enabled then
ExportState.Index = 1
renderCurrentExportGroup()
end
elseif input.KeyCode == SETTINGS.DEBUG_KEY then
task.spawn(printDebug)
elseif input.KeyCode
== SETTINGS.COPY_LAST_KEY
then
copyLastExportGroup()
elseif input.KeyCode
== SETTINGS.EXPORT_ALL_KEY
then
exportAllPresets()
elseif input.KeyCode
== SETTINGS.MESH_CATALOG_KEY
then
copyNearbyMeshCatalog(false)
elseif input.KeyCode
== SETTINGS.AUTO_FARM_TOGGLE_KEY
then
setAutoFarmEnabled(
not SETTINGS.AUTO_FARM_ENABLED
)
print(
"[ORE AUTO-FARM]",
SETTINGS.AUTO_FARM_ENABLED
and "AKTIVIERT"
or "DEAKTIVIERT"
)
refreshOreSelectionLabels()
elseif input.KeyCode
== SETTINGS.AUTO_FARM_GUI_KEY
then
toggleAutoFarmGui()
end
end)
-- GUI direkt beim Start öffnen.
ensureAutoFarmGui()
AutoFarmGui.Enabled = true
refreshOreSelectionLabels()
--//====================================================
--// STARTAUSGABE
--//====================================================
print("")
print("[OPTIMIZED ESP] Script geladen.")
print("[OPTIMIZED ESP] Eventbasiertes Lernen aktiv.")
print("[OPTIMIZED ESP] Unique-/TNT-Erkennung aktiv.")
print("[OPTIMIZED ESP] Räumlicher Index aktiv.")
print("[OPTIMIZED ESP] Roh-Mesh-Katalog ohne Anvisieren aktiv.")
print("[OPTIMIZED ESP] Highlight-/Billboard-Pooling aktiv.")
print("[OPTIMIZED ESP] F4 = ESP ein-/ausschalten.")
print("[OPTIMIZED ESP] F5 = Exportfenster.")
print("[OPTIMIZED ESP] F6 = aktuellen Block debuggen.")
print("[OPTIMIZED ESP] F7 = letzten Block kopieren.")
print("[OPTIMIZED ESP] F8 = alle Presets exportieren.")
print("[OPTIMIZED ESP] F9 = alle Meshes im Umkreis kopieren.")
print("[OPTIMIZED ESP] F10 = Ore Auto-Farm ein-/ausschalten.")
print("[OPTIMIZED ESP] Rechte Umschalttaste = Ore-Auswahl-GUI.")
print("[OPTIMIZED ESP] Kein Server-Hopping enthalten.")
print("[OPTIMIZED ESP] Kamera-Ziel ist im GUI abschaltbar.")
print("[OPTIMIZED ESP] Keine Studs-Anzeige.")



insta ban