-- Cheat Menu - Cheat menu for Grand Theft Auto SanAndreas -- Copyright (C) 2019-2020 Grinch_ -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . local module = {} module.tgame = { camera = { ped = nil, move_player = imgui.new.bool(fconfig.Get('tgame.camera.move_player',true)), bool = imgui.new.bool(false), fov = imgui.new.int(fconfig.Get('tgame.camera.fov',70)), lock_on_player = imgui.new.bool(false), movement_speed = imgui.new.float(fconfig.Get('tgame.camera.movement_speed',0.4)), shake = imgui.new.float(0.0), }, day_names = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}, disable_cheats = imgui.new.bool(fconfig.Get('tgame.disable_cheats',false)), disable_help_popups = imgui.new.bool(fconfig.Get('tgame.disable_help_popups',false)), disable_replay = imgui.new.bool(fconfig.Get('tgame.disable_replay',false)), fps_limit = imgui.new.int(fconfig.Get('tgame.fps_limit',30)), forbidden_area_wanted_level = imgui.new.bool(fconfig.Get('tgame.forbidden_area_wanted_level',true)), freeze_mission_timer = imgui.new.bool(fconfig.Get('tgame.freeze_mission_timer',false)), freeze_time = imgui.new.bool(fconfig.Get('tgame.freeze_time',false)), gxt_save_name = imgui.new.char[22]("Untitled Save"), keep_stuff = imgui.new.bool(fconfig.Get('tgame.keep_stuff',false)), object_spawner = { coord = { x = imgui.new.float(0), y = imgui.new.float(0), z = imgui.new.float(0), }, categories = {"Group view","Object view"}, selected = imgui.new.int(1), filter = imgui.ImGuiTextFilter(), group_name = imgui.new.char[32]("Group 1"), obj_name = imgui.new.char[32]("New object"), model = imgui.new.int(1427), placed = {}, set_player_coord = imgui.new.bool(fconfig.Get('tgame.object_spawner.set_player_coord',false)), }, random_cheats = { activated_cheats = {}, cheat_activate_timer = imgui.new.int(fconfig.Get('tgame.random_cheats.cheat_activate_timer',10)), cheat_deactivate_timer = imgui.new.int(fconfig.Get('tgame.random_cheats.cheat_deactivate_timer',10)), cheat_name = fcommon.LoadJson("cheat name"), checkbox = imgui.new.bool(fconfig.Get('tgame.random_cheats.checkbox',false)), disable_cheat_checkbox = imgui.new.bool(fconfig.Get('tgame.random_cheats.disable_cheat_checkbox',false)), disabled_cheats = fconfig.Get('tgame.random_cheats.disabled_cheats',{}), }, script_manager = { filter = imgui.ImGuiTextFilter(), categories = {"All","Loaded","Not loaded"}, selected = imgui.new.int(1), scripts = fconfig.Get('tgame.script_manager.scripts',{}), skip_auto_reload = false, not_loaded = {}, }, solid_water = imgui.new.bool(fconfig.Get('tgame.solid_water',false)), solid_water_object = nil, ss_shortcut = imgui.new.bool(fconfig.Get('tgame.ss_shortcut',false)), sync_system_time = imgui.new.bool(fconfig.Get('tgame.sync_system_time',false)), } function module.SolidWater() while module.tgame.solid_water[0] do wait(0) local x,y,z = getCharCoordinates(PLAYER_PED) local water_height = getWaterHeightAtCoords(x,y,false) if doesObjectExist(module.tgame.solid_water_object) then deleteObject(module.tgame.solid_water_object) end if z > water_height and water_height ~= -1000 and not isCharInAnyBoat(PLAYER_PED) then -- Don't create the object if player is under water/diving module.tgame.solid_water_object = createObject(3095,x,y,water_height) setObjectVisible(module.tgame.solid_water_object,false) end end if doesObjectExist(module.tgame.solid_water_object) then deleteObject(module.tgame.solid_water_object) end end function module.CameraMode() while module.tgame.camera.bool[0] do local x,y,z = getCharCoordinates(PLAYER_PED) module.tgame.camera.ped = PLAYER_PED if module.tgame.camera.move_player[0] then module.tgame.camera.lock_on_player[0] = false else module.tgame.camera.ped = createRandomChar(x,y,z) setCharVisible(module.tgame.camera.ped,false) end freezeCharPositionAndDontLoadCollision(module.tgame.camera.ped,true) setCharCollision(module.tgame.camera.ped,false) setLoadCollisionForCharFlag(module.tgame.camera.ped,false) setEveryoneIgnorePlayer(0,true) displayRadar(false) displayHud(false) local total_mouse_x = getCharHeading(PLAYER_PED) local total_mouse_y = 0 local total_mouse_delta = 0 setCharCoordinates(module.tgame.camera.ped,x,y,z-20) cameraSetLerpFov(getCameraFov(),module.tgame.camera.fov[0],1000,true) cameraPersistFov(true) while module.tgame.camera.bool[0] do local factor = 1.0 x, y, z = getCharCoordinates(module.tgame.camera.ped) local mouse_x, mouse_y = getPcMouseMovement() total_mouse_x = total_mouse_x - mouse_x/6 total_mouse_y = total_mouse_y + mouse_y/3 if total_mouse_y > 150 then total_mouse_y = 150 end if total_mouse_y < -150 then total_mouse_y = -150 end if isKeyDown(fmenu.tmenu.hot_keys.camera_mode_slow[1] and fmenu.tmenu.hot_keys.camera_mode_slow[2]) then factor = factor*0.5 end if isKeyDown(fmenu.tmenu.hot_keys.camera_mode_fast[1] and fmenu.tmenu.hot_keys.camera_mode_fast[2]) then factor = factor*2 end if isKeyDown(fmenu.tmenu.hot_keys.camera_mode_forward[1] and fmenu.tmenu.hot_keys.camera_mode_forward[2]) then local angle = getCharHeading(module.tgame.camera.ped) + 90 x = x + module.tgame.camera.movement_speed[0] * math.cos(angle * math.pi/180) * factor y = y + module.tgame.camera.movement_speed[0] * math.sin(angle * math.pi/180) * factor z = z + module.tgame.camera.movement_speed[0] * math.sin(total_mouse_y/3* math.pi/180) * factor end if isKeyDown(fmenu.tmenu.hot_keys.camera_mode_backward[1] and fmenu.tmenu.hot_keys.camera_mode_backward[2]) then local angle = getCharHeading(module.tgame.camera.ped) + 90 x = x - module.tgame.camera.movement_speed[0] * math.cos(angle * math.pi/180) * factor y = y - module.tgame.camera.movement_speed[0] * math.sin(angle * math.pi/180) * factor z = z - module.tgame.camera.movement_speed[0] * math.sin(total_mouse_y/3* math.pi/180) * factor end if isKeyDown(fmenu.tmenu.hot_keys.camera_mode_left[1] and fmenu.tmenu.hot_keys.camera_mode_left[2]) then local angle = getCharHeading(module.tgame.camera.ped) x = x - module.tgame.camera.movement_speed[0] * math.cos(angle * math.pi/180) * factor y = y - module.tgame.camera.movement_speed[0] * math.sin(angle * math.pi/180) * factor end if isKeyDown(fmenu.tmenu.hot_keys.camera_mode_right[1] and fmenu.tmenu.hot_keys.camera_mode_right[2]) then local angle = getCharHeading(module.tgame.camera.ped) x = x + module.tgame.camera.movement_speed[0] * math.cos(angle * math.pi/180) * factor y = y + module.tgame.camera.movement_speed[0] * math.sin(angle * math.pi/180) * factor end if module.tgame.camera.lock_on_player[0] then local right = 0 local front = 0 local up = 0 total_mouse_x = 0 total_mouse_y = 0 while module.tgame.camera.lock_on_player[0] and module.tgame.camera.bool[0] do local mouse_x, mouse_y = getPcMouseMovement() total_mouse_x = total_mouse_x - mouse_x/6 total_mouse_y = total_mouse_y + mouse_y/6 if total_mouse_x > 300 then total_mouse_x = 300 end if total_mouse_x < -300 then total_mouse_x = -300 end if total_mouse_y > 170 then total_mouse_y = 170 end if total_mouse_y < -170 then total_mouse_y = -170 end factor = 1 if isKeyDown(fmenu.tmenu.hot_keys.camera_mode_slow[1] and fmenu.tmenu.hot_keys.camera_mode_slow[2]) then factor = factor*0.5 end if isKeyDown(fmenu.tmenu.hot_keys.camera_mode_fast[1] and fmenu.tmenu.hot_keys.camera_mode_fast[2]) then factor = factor*2 end if isKeyDown(fmenu.tmenu.hot_keys.camera_mode_forward[1] and fmenu.tmenu.hot_keys.camera_mode_forward[2]) then front = front + factor * module.tgame.camera.movement_speed[0] end if isKeyDown(fmenu.tmenu.hot_keys.camera_mode_backward[1] and fmenu.tmenu.hot_keys.camera_mode_backward[2]) then front = front - factor * module.tgame.camera.movement_speed[0] end if isKeyDown(fmenu.tmenu.hot_keys.camera_mode_left[1] and fmenu.tmenu.hot_keys.camera_mode_left[2]) then right = right - factor * module.tgame.camera.movement_speed[0] end if isKeyDown(fmenu.tmenu.hot_keys.camera_mode_right[1] and fmenu.tmenu.hot_keys.camera_mode_right[2]) then right = right + factor * module.tgame.camera.movement_speed[0] end if isKeyDown(fmenu.tmenu.hot_keys.camera_mode_up[1] and fmenu.tmenu.hot_keys.camera_mode_up[2]) then up = up - factor * module.tgame.camera.movement_speed[0] end if isKeyDown(fmenu.tmenu.hot_keys.camera_mode_down[1] and fmenu.tmenu.hot_keys.camera_mode_down[2]) then up = up + factor * module.tgame.camera.movement_speed[0] end attachCameraToChar(PLAYER_PED,right, front, up, total_mouse_x*-1, 90.0, total_mouse_y, 0.0, 2) if total_mouse_delta + getMousewheelDelta() ~= total_mouse_delta then total_mouse_delta = total_mouse_delta + getMousewheelDelta() module.tgame.camera.fov[0] = module.tgame.camera.fov[0] - getMousewheelDelta() if module.tgame.camera.fov[0] > 120 then module.tgame.camera.fov[0] = 120 end if module.tgame.camera.fov[0] < 5 then module.tgame.camera.fov[0] = 5 end cameraSetLerpFov(getCameraFov(),module.tgame.camera.fov[0],100,true) cameraPersistFov(true) end wait(0) end else setCharHeading(module.tgame.camera.ped,total_mouse_x) attachCameraToChar(module.tgame.camera.ped,0.0, 0.0, 20.0, 0.0, 180, total_mouse_y, 0.0, 2) setCharCoordinates(module.tgame.camera.ped,x,y,z-1.0) end if total_mouse_delta + getMousewheelDelta() ~= total_mouse_delta then total_mouse_delta = total_mouse_delta + getMousewheelDelta() module.tgame.camera.fov[0] = module.tgame.camera.fov[0] - getMousewheelDelta() if module.tgame.camera.fov[0] > 120 then module.tgame.camera.fov[0] = 120 end if module.tgame.camera.fov[0] < 5 then module.tgame.camera.fov[0] = 5 end cameraSetLerpFov(getCameraFov(),module.tgame.camera.fov[0],100,true) cameraPersistFov(true) end wait(0) end cameraPersistFov(false) displayRadar(true) displayHud(true) freezeCharPositionAndDontLoadCollision(module.tgame.camera.ped,false) setCharCollision(module.tgame.camera.ped,true) setLoadCollisionForCharFlag(module.tgame.camera.ped,true) setEveryoneIgnorePlayer(0,false) if module.tgame.camera.move_player[0] then local x,y,z = getCharCoordinates(PLAYER_PED) z = getGroundZFor3dCoord(x,y,1000) setCharCoordinates(PLAYER_PED,x,y,z) else markCharAsNoLongerNeeded(module.tgame.camera.ped) deleteChar(module.tgame.camera.ped) end module.tgame.camera.ped = nil restoreCameraJumpcut() wait(0) end end function module.SyncSystemTime() while module.tgame.sync_system_time[0] do local time = os.date("*t") setTimeOfDay(time.hour,time.min) wait(30) end end function module.RandomCheatsActivate() while module.tgame.random_cheats.checkbox[0] do wait(module.tgame.random_cheats.cheat_activate_timer[0]*1000) if not module.tgame.random_cheats.checkbox[0] then break end local cheatid = math.random(0,91) callFunction(0x438370,1,1,cheatid) table.insert(module.tgame.random_cheats.activated_cheats,cheatid) printHelpString("~g~" .. module.tgame.random_cheats.cheat_name[tostring(cheatid)][1]) end end function module.RandomCheatsDeactivate() while module.tgame.random_cheats.disable_cheat_checkbox[0] and module.tgame.random_cheats.checkbox[0] do for _,x in ipairs(module.tgame.random_cheats.activated_cheats) do if module.tgame.random_cheats.cheat_name[tostring(x)][2] == "true" then wait(module.tgame.random_cheats.cheat_deactivate_timer[0]*1000) if not (module.tgame.random_cheats.checkbox[0] or module.tgame.random_cheats.checkbox[0]) then break end if module.tgame.random_cheats.disable_cheat_checkbox[0] then callFunction(0x438370,1,1,module.tgame.random_cheats.activated_cheats[x]) printHelpString("~r~" .. module.tgame.random_cheats.cheat_name[tostring(x)][1]) end end end wait(0) end end function module.FreezeTime() while module.tgame.freeze_time[0] do local status = fvisual.tvisual.lock_weather[0] memory.write(0x969168,1,1) -- Freeze time while module.tgame.freeze_time[0] do fvisual.tvisual.lock_weather[0] = true wait(0) end fvisual.tvisual.lock_weather[0] = status memory.write(0x969168,0,1) -- Freeze time wait(0) end end -------------------------------------------------- -- Functions of script manager function module.LoadScriptsOnKeyPress() while true do for name,table in pairs(module.tgame.script_manager.scripts) do fcommon.OnHotKeyPress(table,function() local full_file_path = string.format( "%s\\%s.loadonkeypress",getWorkingDirectory(),name) local is_loaded = false local sc_handle = nil for index, script in ipairs(script.list()) do if full_file_path == script.path then is_loaded = true sc_handle = script end end if is_loaded == false then script.load(full_file_path) printHelpString("Script loaded") else sc_handle:unload() printHelpString("Script unloaded") end module.tgame.script_manager.not_loaded[name .. ".loadonkeypress"] = nil end) end wait(0) end end function module.MonitorScripts() local mainDir = getWorkingDirectory() for file in lfs.dir(mainDir) do local full_file_path = mainDir .. "\\" .. file if doesFileExist(full_file_path) then local file_path,file_name,file_ext = string.match(full_file_path, "(.-)([^\\/]-%.?([^%.\\/]*))$") if (file_ext == "lua" or file_ext == "neverload" or file_ext == "loadonkeypress") and module.tgame.script_manager.not_loaded[file_name] == nil then local is_loaded = false for index, script in ipairs(script.list()) do if full_file_path == script.path then is_loaded = true end end if is_loaded == false then module.tgame.script_manager.not_loaded[file_name] = full_file_path end end end end end function ShowNotLoadedScripts(name,path) local _,file_name,file_ext = string.match(path, "(.-)([^\\/]-%.?([^%.\\/]*))$") fcommon.DropDownMenu(name .. "##" .. path,function() imgui.Spacing() imgui.SameLine() if file_ext == "lua" then imgui.Text("Status: Not loaded") end if file_ext == "neverload" then imgui.Text("Status: Never load") end if file_ext == "loadonkeypress" then imgui.Text("Status: Load on key press") end imgui.Spacing() imgui.SameLine() imgui.TextWrapped("Filepath: " .. path) if imgui.Button("Load##" .. path,imgui.ImVec2(fcommon.GetSize(1))) then if doesFileExist(path) then local load_path = path if file_ext == "neverload" then load_path = string.sub(path,1,-11) os.rename(path,load_path) end if file_ext == "loadonkeypress" then module.tgame.script_manager.scripts[name:sub(1,-16)] = nil load_path = string.sub(path,1,-16) os.rename(path,load_path) end module.tgame.script_manager.not_loaded[name] = nil script.load(load_path) printHelpString("Script loaded") end end end,true) end function ShowLoadedScript(script,index) fcommon.DropDownMenu(script.name .. "##" .. index,function() local _,file_name,file_ext = string.match(script.path, "(.-)([^\\/]-%.?([^%.\\/]*))$") local authors = "" for _,author in ipairs(script.authors) do authors = authors .. author .. ", " end local properties = "" for _,property in ipairs(script.properties) do properties = properties .. property .. ", " end local dependencies = "" for _,dependency in ipairs(script.dependencies) do dependencies = dependencies .. dependency .. ", " end imgui.Columns(2,nil,false) imgui.Text("Authors: ") imgui.SameLine(0.0,0.0) imgui.TextWrapped(string.sub(authors,1,-3)) imgui.Text("Version: " .. tostring(script.version)) imgui.Text("Version num: " .. tostring(script.version_num)) imgui.NextColumn() imgui.Text("Script ID: " .. script.id) imgui.Text("Status: Loaded") imgui.Text("Filename: ") imgui.SameLine(0.0,0.0) imgui.TextWrapped(script.filename) imgui.Columns(1) if properties ~= "" then imgui.Spacing() imgui.SameLine() imgui.Text("Properties: ") imgui.SameLine(0.0,0.0) imgui.TextWrapped(string.sub(properties,1,-3)) end if dependencies ~= "" then imgui.Spacing() imgui.SameLine() imgui.Text("Dependencies: ") imgui.SameLine(0.0,0.0) imgui.TextWrapped(string.sub(dependencies,1,-3)) end if script.description ~= "" then imgui.Spacing() imgui.SameLine() imgui.Text("Description: ") imgui.SameLine(0.0,0.0) imgui.TextWrapped(script.description) end imgui.Spacing() if script.path:match(".loadonkeypress") then file_name = file_name:sub(1,-16) end fmenu.tmenu.hot_keys.script_manager_temp = module.tgame.script_manager.scripts[file_name] or fmenu.tmenu.hot_keys.script_manager_temp fcommon.HotKey("Load on keypress hotkey",fmenu.tmenu.hot_keys.script_manager_temp,fcommon.GetSize(3)) fcommon.InformationTooltip("Load & unload this script\nby pressing this hotkey.") imgui.Spacing() if imgui.Button("Never load##" .. index,imgui.ImVec2(fcommon.GetSize(2))) then printHelpString("Script set to never load") os.rename(script.path,script.path.. ".neverload") script:unload() end imgui.SameLine() if imgui.Button("Load on keypress##" .. index,imgui.ImVec2(fcommon.GetSize(2))) then if script.name == thisScript().name then printHelpString("Can't set for Cheat Menu") else module.tgame.script_manager.scripts[file_name] = {fmenu.tmenu.hot_keys.script_manager_temp[1],fmenu.tmenu.hot_keys.script_manager_temp[2]} printHelpString("Key set for the script.") if not script.path:match(".loadonkeypress") then os.rename(script.path,script.path.. ".loadonkeypress") end script:unload() end end if imgui.Button("Reload##" .. index,imgui.ImVec2(fcommon.GetSize(2))) then if script.name == thisScript().name then module.tgame.script_manager.skip_auto_reload = true end printHelpString("Script reloaded") script:reload() end imgui.SameLine() if imgui.Button("Unload##" .. index,imgui.ImVec2(fcommon.GetSize(2))) then if script.name == thisScript().name then module.tgame.script_manager.skip_auto_reload = true end printHelpString("Script unloaded") script:unload() end end) end function SpawnObject(model,obj_name,grp_name,x,y,z) if isModelAvailable(model) and casts.CBaseModelInfo.GetModelType(model) == fconst.MODEL_TYPE.ATOMIC then requestModel(model) loadAllModelsNow() local obj = createObject(model,x,y,z) setObjectRotation(obj,0,0,0) setObjectCollision(obj,false) if module.tgame.object_spawner.placed[grp_name] == nil then module.tgame.object_spawner.placed[grp_name] = {} end module.tgame.object_spawner.placed[grp_name][string.format("%d##%d",model,obj)] = { name = obj_name, collision = imgui.new.bool(false), rotx = imgui.new.float(0), roty = imgui.new.float(0), rotz = imgui.new.float(0), } markModelAsNoLongerNeeded(model) printHelpString("Model Spawned") else printHelpString("Invalid model") end end function GenerateIPL() local file = io.open("generated.ipl","w") local write_string = "inst\n" for grp,data in pairs(module.tgame.object_spawner.placed) do for key,value in pairs(data) do local model, handle = string.match(key,"(%w+)##(%w+)") local _,posx,posy,posz = getObjectCoordinates(handle) local rotx,roty,rotz,rotw = getObjectQuaternion(handle) local interior = getActiveInterior() local inst_line = string.format("%d, dummy, %d, %f, %f, %f, %f, %f, %f, %f, -1\n",model,interior,posx,posy,posz,rotx,roty,rotz,rotw) write_string = write_string .. inst_line end end write_string = write_string .. "end" file:write(write_string) file:close() printHelpString("IPL generated") end function module.RemoveAllObjects() for grp,data in pairs(module.tgame.object_spawner.placed) do for key,value in pairs(data) do local model, handle = string.match(key,"(%w+)##(%w+)") deleteObject(tonumber(handle)) module.tgame.object_spawner.placed[grp][key] = nil end module.tgame.object_spawner.placed[grp] = nil end end function ApplyToObjects(grp,func) for lgrp,ldata in pairs(module.tgame.object_spawner.placed) do if grp == lgrp then for lkey,value in pairs(ldata) do local model, handle = string.match(lkey,"(%w+)##(%w+)") func(handle,value) end break end end end -------------------------------------------------- -- Main function function module.GameMain() if imgui.Button("Save game",imgui.ImVec2(fcommon.GetSize(1))) then if isCharOnFoot(PLAYER_PED) then activateSaveMenu() else printHelpString("Player is ~r~not~w~ on foot") end end if fcommon.BeginTabBar('Game') then if fcommon.BeginTabItem('Checkboxes') then imgui.Columns(2,nil,false) if fcommon.CheckBoxVar("Camera mode",module.tgame.camera.bool,string.format("Toggle: %s\n\nForward: %s\tBackward: %s\ Left: %s\t\t Right: %s\n\nSlow movement: %s\nFast movement: %s\n\nRotation: Mouse\nZoom in/out : Mouse wheel \n\ Up : %s (Lock on player)\nDown: %s (Lock on player)",fcommon.GetHotKeyNames(fmenu.tmenu.hot_keys.camera_mode), fcommon.GetHotKeyNames(fmenu.tmenu.hot_keys.camera_mode_forward),fcommon.GetHotKeyNames(fmenu.tmenu.hot_keys.camera_mode_backward), fcommon.GetHotKeyNames(fmenu.tmenu.hot_keys.camera_mode_left),fcommon.GetHotKeyNames(fmenu.tmenu.hot_keys.camera_mode_right), fcommon.GetHotKeyNames(fmenu.tmenu.hot_keys.camera_mode_slow),fcommon.GetHotKeyNames(fmenu.tmenu.hot_keys.camera_mode_fast), fcommon.GetHotKeyNames(fmenu.tmenu.hot_keys.camera_mode_up), fcommon.GetHotKeyNames(fmenu.tmenu.hot_keys.camera_mode_down)), function() imgui.Columns(2,nil,false) if fcommon.CheckBoxVar("Move player",module.tgame.camera.move_player,"Moves the player with the camera\nSimilar to how airbreak modes work") then module.tgame.camera.lock_on_player[0] = false -- Update the camera mode stuff while it's running if module.tgame.camera.bool[0] and module.tgame.camera.ped ~= nil then local heading = getCharHeading(module.tgame.camera.ped) local x,y,z = getCharCoordinates(module.tgame.camera.ped) z = z - 1 freezeCharPositionAndDontLoadCollision(module.tgame.camera.ped,false) setCharCollision(module.tgame.camera.ped,true) setLoadCollisionForCharFlag(module.tgame.camera.ped,true) if module.tgame.camera.move_player[0] then markCharAsNoLongerNeeded(module.tgame.camera.ped) deleteChar(module.tgame.camera.ped) module.tgame.camera.ped = PLAYER_PED else module.tgame.camera.ped = createRandomChar(x,y,z) -- place place properly at ground local cx,cy,cz = getActiveCameraCoordinates() cz = getGroundZFor3dCoord(cx,cy,cz) setCharCoordinates(PLAYER_PED,cx,cy,cz) end freezeCharPositionAndDontLoadCollision(module.tgame.camera.ped,true) setCharCollision(module.tgame.camera.ped,false) setLoadCollisionForCharFlag(module.tgame.camera.ped,false) setCharCoordinates(module.tgame.camera.ped,x,y,z) setCharHeading(module.tgame.camera.ped,heading) end end imgui.NextColumn() if not module.tgame.camera.move_player[0] then fcommon.CheckBoxVar("Lock on player",module.tgame.camera.lock_on_player,"Locks camera on player") end imgui.Columns(1) imgui.Spacing() if imgui.SliderInt("FOV", module.tgame.camera.fov, 5,120) then if module.tgame.camera.bool[0] then cameraSetLerpFov(getCameraFov(),module.tgame.camera.fov[0],1000,true) cameraPersistFov(true) end end imgui.SliderFloat("Movement Speed",module.tgame.camera.movement_speed, 0.0, 5.0) if imgui.SliderFloat("Shake", module.tgame.camera.shake, 0.0,100) then if module.tgame.camera.bool[0] then cameraSetShakeSimulationSimple(1,10000,module.tgame.camera.shake[0]) end end if not module.tgame.camera.move_player[0] then imgui.Spacing() if imgui.Button("Warp player to camera location",imgui.ImVec2(fcommon.GetSize(1))) then local cx,cy,cz = getActiveCameraCoordinates() cz = getGroundZFor3dCoord(cx,cy,cz) setCharCoordinates(PLAYER_PED,cx,cy,cz) printHelpString("Player warped") end end end) then fcommon.CreateThread(module.CameraMode) end if fcommon.CheckBoxVar("Disable cheats",module.tgame.disable_cheats) then if module.tgame.disable_cheats[0] then writeMemory(0x4384D0 ,1,0xE9 ,false) writeMemory(0x4384D1 ,4,0xD0 ,false) writeMemory(0x4384D5 ,4,0x90909090 ,false) else writeMemory(0x4384D0 ,1,0x83,false) writeMemory(0x4384D1 ,4,-0x7DF0F908,false) writeMemory(0x4384D5 ,4,0xCC,false) end end if fcommon.CheckBoxVar("Disable help popups",module.tgame.disable_help_popups,"Disables wasted & arrested popups that\nappear in a new game.") then tcheatmenu.restart_required = true end fcommon.CheckBoxValue('Free pay n spray',0x96C009) if fcommon.CheckBoxVar("Freeze misson timer",module.tgame.freeze_mission_timer) then if module.tgame.freeze_mission_timer[0] then freezeOnscreenTimer(true) else freezeOnscreenTimer(false) end end if fcommon.CheckBoxVar("Disable F1 & F3 replay",module.tgame.disable_replay) then if module.tgame.disable_replay[0] then writeMemory(0x460500,4,0xC3,false) else writeMemory(0x460500,4,0xBD844BB,false) end end fcommon.CheckBoxValue("Faster clock",0x96913B) if fcommon.CheckBoxVar("Forbidden area wl",module.tgame.forbidden_area_wanted_level,"Wanted levels that appears outside\ of LS without completing missions") then if module.tgame.forbidden_area_wanted_level[0] then writeMemory(0x441770,1,0x83,false) else writeMemory(0x441770,1,0xC3,false) end end imgui.NextColumn() if fcommon.CheckBoxVar("Freeze time",module.tgame.freeze_time) then fcommon.CreateThread(module.FreezeTime) end if fcommon.CheckBoxVar("Keep stuff",module.tgame.keep_stuff,"Keep stuff after arrest/death") then switchArrestPenalties(module.tgame.keep_stuff[0]) switchDeathPenalties(module.tgame.keep_stuff[0]) end if fcommon.CheckBoxVar("Random cheats",module.tgame.random_cheats.checkbox,"Activates random cheats after certain time", function() if fcommon.CheckBoxVar('Disable cheats',module.tgame.random_cheats.disable_cheat_checkbox,"Disable activated cheats after certain time") then fcommon.CreateThread(fgame.RandomCheatsDeactivate) end imgui.Spacing() imgui.SetNextItemWidth(imgui.GetWindowWidth()/2) imgui.SliderInt("Activate cheat timer", module.tgame.random_cheats.cheat_activate_timer, 10, 100) imgui.SetNextItemWidth(imgui.GetWindowWidth()/2) imgui.SliderInt("Deactivate cheat timer", module.tgame.random_cheats.cheat_deactivate_timer, 10, 100) imgui.Spacing() imgui.TextWrapped("Enabled cheats") imgui.Separator() if imgui.BeginChild("Cheats list") then for i=0,91,1 do -- Cheat ids 0 -> 91 if module.tgame.random_cheats.disabled_cheats[tostring(i)] then selected = false else selected = true end if imgui.MenuItemBool(tostring(module.tgame.random_cheats.cheat_name[tostring(i)][1]),nil,selected) then module.tgame.random_cheats.disabled_cheats[tostring(i)] = selected end end imgui.EndChild() end end) then fcommon.CreateThread(fgame.RandomCheatsActivate) end fcommon.CheckBoxVar('Screenshot shortcut',module.tgame.ss_shortcut,"Take screenshot using" .. fcommon.GetHotKeyNames(fmenu.tmenu.hot_keys.quick_screenshot)) if fcommon.CheckBoxVar('Solid water',module.tgame.solid_water) then fcommon.CreateThread(fgame.SolidWater) end if fcommon.CheckBoxVar('Sync system time',module.tgame.sync_system_time) then fcommon.CreateThread(fgame.SyncSystemTime) end fcommon.CheckBoxValue('Widescreen',0xB6F065) imgui.Columns(1) end if fcommon.BeginTabItem('Menus') then if imgui.BeginChild("MenusChild") then fcommon.DropDownMenu('Current day',function() local current_day = imgui.new.int(readMemory(0xB7014E,1,false)) imgui.SetNextItemWidth(imgui.GetWindowContentRegionWidth()/1.7) if fcommon.DropDownListNumber("Day",module.tgame.day_names,current_day) then writeMemory(0xB7014E,1,current_day[0],false) fcommon.CheatActivated() end end) fcommon.DropDownMenu('Custom save game name',function() imgui.InputText("Name", module.tgame.gxt_save_name,ffi.sizeof(module.tgame.gxt_save_name)) imgui.Spacing() if imgui.Button("Save game with this name",imgui.ImVec2(fcommon.GetSize(1))) then if isCharOnFoot(PLAYER_PED) then registerMissionPassed(setFreeGxtEntry(ffi.string(module.tgame.gxt_save_name))) activateSaveMenu() else printHelpString("Player is ~r~not~w~ on foot") end end end) fcommon.UpdateAddress({name = 'Days passed',address = 0xB79038 ,size = 4,min = 0,max = 9999}) fcommon.DropDownMenu('FPS',function() imgui.Columns(2,nil,false) imgui.Text("Minimum" .. " = 1") imgui.NextColumn() imgui.Text("Maximum" .. " = 999") imgui.Columns(1) imgui.PushItemWidth(imgui.GetWindowWidth()-50) if imgui.InputInt('Set',module.tgame.fps_limit) then memory.write(0xC1704C,(module.tgame.fps_limit[0]+1),1) memory.write(0xBA6794,1,1) fconfig.Set(fconfig.tconfig.memory_data,string.format("0x%6.6X",0xC1704C),{1,module.tgame.fps_limit[0]+1}) fconfig.Set(fconfig.tconfig.memory_data,string.format("0x%6.6X",0xBA6794),{1,1}) end if module.tgame.fps_limit[0] < 1 then module.tgame.fps_limit[0] = 1 end imgui.PopItemWidth() imgui.Spacing() if imgui.Button("Minimum",imgui.ImVec2(fcommon.GetSize(3))) then memory.write(0xC1704C,1,1) memory.write(0xBA6794,1,1) module.tgame.fps_limit[0] = 1 fconfig.Set(fconfig.tconfig.memory_data,string.format("0x%6.6X",0xC1704C),{1,1}) fconfig.Set(fconfig.tconfig.memory_data,string.format("0x%6.6X",0xBA6794),{1,1}) end imgui.SameLine() if imgui.Button("Default",imgui.ImVec2(fcommon.GetSize(3))) then memory.write(0xC1704C,30,1) memory.write(0xBA6794,1,1) module.tgame.fps_limit[0] = 30 fconfig.Set(fconfig.tconfig.memory_data,string.format("0x%6.6X",0xC1704C),{1,30}) fconfig.Set(fconfig.tconfig.memory_data,string.format("0x%6.6X",0xBA6794),{1,1}) end imgui.SameLine() if imgui.Button("Maximum",imgui.ImVec2(fcommon.GetSize(3))) then memory.write(0xBA6794,0,1) memory.write(0xBA6794,1,1) module.tgame.fps_limit[0] = 999 fconfig.Set(fconfig.tconfig.memory_data,string.format("0x%6.6X",0xC1704C),{1,999}) fconfig.Set(fconfig.tconfig.memory_data,string.format("0x%6.6X",0xBA6794),{1,1}) end end) fcommon.UpdateAddress({name = 'Game speed',address = 0xB7CB64,size = 4,max = 10,min = 0, is_float =true, default = 1}) fcommon.UpdateAddress({name = 'Gravity',address = 0x863984,size = 4,max = 1,min = -1, default = 0.008,cvalue = 0.001 ,is_float = true}) fcommon.DropDownMenu("Set time",function() imgui.Spacing() local days_passed = imgui.new.int(memory.read(0xB79038 ,4)) local hour = imgui.new.int(memory.read(0xB70153,1)) local minute = imgui.new.int(memory.read(0xB70152,1)) if imgui.InputInt("Current hour",hour) then memory.write(0xB70153 ,hour[0],1) end if imgui.InputInt("Current minute",minute) then memory.write(0xB70152 ,minute[0],1) end if minute[0] > 59 then hour[0] = hour[0] + 1 minute[0] = 0 end if hour[0] > 23 then memory.write(0xB70153 ,0,1) current_day = memory.read(0xB7014E,1) memory.write(0xB7014E,(current_day+1),1) days_passed = memory.read( 0xB79038,4) memory.write( 0xB79038,(days_passed+1),4) end if minute[0] < 0 then hour[0] = hour[0] - 1 minute[0] = 59 end if hour[0] < 0 then memory.write(0xB70153 ,23,1) current_day = memory.read(0xB7014E,1) memory.write(0xB7014E,(current_day-1),1) days_passed = memory.read( 0xB79038,4) memory.write( 0xB79038,(days_passed-1),4) end end) fcommon.DropDownMenu('Themes',function() fcommon.RadioButtonAddress('Select theme',{'Beach','Country','Fun house','Ninja'},{0x969159,0x96917D,0x969176,0x96915C}) end) fcommon.CallFuncButtons("Weather", {["Very Sunny"] = 0x438F50,["Overcast"] = 0x438F60,["Rainy"] = 0x438F70, ["Foggy"] = 0x438F80,["Thunderstorm"] = 0x439570,["Sandstorm"] = 0x439590}) imgui.EndChild() end end if fcommon.BeginTabItem('Script manager') then if imgui.Button("Reload all scripts",imgui.ImVec2(fcommon.GetSize(1))) then fgame.tgame.script_manager.skip_auto_reload = true reloadScripts() end imgui.Spacing() local width = imgui.GetWindowContentRegionWidth() imgui.SetNextItemWidth(width/2) fcommon.DropDownListNumber("##List",module.tgame.script_manager.categories,module.tgame.script_manager.selected) imgui.SameLine() imgui.SetNextItemWidth(width/2) local filter = module.tgame.script_manager.filter filter:Draw("Search") if filter:PassFilter('') then local min = imgui.GetItemRectMin() local drawlist = imgui.GetWindowDrawList() drawlist:AddText(imgui.ImVec2(min.x+imgui.GetStyle().ItemInnerSpacing.x,min.y+imgui.GetStyle().FramePadding.y), imgui.GetColorU32(imgui.Col.TextDisabled),"Search") end if imgui.BeginChild("Script entries") then module.MonitorScripts() if module.tgame.script_manager.selected[0] ~= 3 then for index, script in ipairs(script.list()) do if filter:PassFilter(script.name) then ShowLoadedScript(script,index) end end end if module.tgame.script_manager.selected[0] ~= 2 then for name,path in pairs(module.tgame.script_manager.not_loaded) do if filter:PassFilter(name) then ShowNotLoadedScripts(name,path) end end end imgui.EndChild() end end if fcommon.BeginTabItem('Object spawner') then if imgui.Button("Browse images",imgui.ImVec2(fcommon.GetSize(3))) then os.execute('explorer "https://dev.prineside.com/en/gtasa_samp_model_id"') end imgui.SameLine() if imgui.Button("Generate IPL",imgui.ImVec2(fcommon.GetSize(3))) then GenerateIPL() end imgui.SameLine() if imgui.Button("Remove all",imgui.ImVec2(fcommon.GetSize(3))) then module.RemoveAllObjects() printHelpString("Objects removed") end if fcommon.BeginTabBar('Object SpawnerBar') then if fcommon.BeginTabItem('Spawn') then fcommon.CheckBoxVar('Insert player coord',module.tgame.object_spawner.set_player_coord) imgui.Spacing() imgui.InputText("Object name", module.tgame.object_spawner.obj_name,ffi.sizeof(module.tgame.object_spawner.obj_name)) imgui.InputText("Group name", module.tgame.object_spawner.group_name,ffi.sizeof(module.tgame.object_spawner.group_name)) if module.tgame.object_spawner.set_player_coord[0] then module.tgame.object_spawner.coord.x[0],module.tgame.object_spawner.coord.y[0],module.tgame.object_spawner.coord.z[0] = getCharCoordinates(PLAYER_PED) end imgui.Spacing() imgui.InputInt("Model",module.tgame.object_spawner.model) imgui.Spacing() imgui.InputFloat("Coord X",module.tgame.object_spawner.coord.x,1.0, 1.0, "%.5f") imgui.InputFloat("Coord Y",module.tgame.object_spawner.coord.y,1.0, 1.0, "%.5f") imgui.InputFloat("Coord Z",module.tgame.object_spawner.coord.z,1.0, 1.0, "%.5f") imgui.Dummy(imgui.ImVec2(0,10)) if imgui.Button("Spawn object",imgui.ImVec2(fcommon.GetSize(1))) then SpawnObject(module.tgame.object_spawner.model[0],ffi.string(module.tgame.object_spawner.obj_name),ffi.string(module.tgame.object_spawner.group_name),module.tgame.object_spawner.coord.x[0],module.tgame.object_spawner.coord.y[0],module.tgame.object_spawner.coord.z[0]) end end if fcommon.BeginTabItem('Placed') then imgui.Spacing() local width = imgui.GetWindowContentRegionWidth() imgui.SetNextItemWidth(width/2) fcommon.DropDownListNumber("##List",module.tgame.object_spawner.categories,module.tgame.object_spawner.selected) imgui.SameLine() imgui.SetNextItemWidth(width/2) local filter = module.tgame.object_spawner.filter filter:Draw("Search") if filter:PassFilter('') then local min = imgui.GetItemRectMin() local drawlist = imgui.GetWindowDrawList() drawlist:AddText(imgui.ImVec2(min.x+imgui.GetStyle().ItemInnerSpacing.x,min.y+imgui.GetStyle().FramePadding.y), imgui.GetColorU32(imgui.Col.TextDisabled),"Search") end imgui.Spacing() if imgui.BeginChild("Placed") then if module.tgame.object_spawner.selected[0] == 1 then local size = imgui.GetFrameHeight() for grp,data in pairs(module.tgame.object_spawner.placed) do fcommon.DropDownMenu(grp,function() if imgui.Button("Set collisions on",imgui.ImVec2(fcommon.GetSize(2))) then ApplyToObjects(grp,function(handle,value) value.collision[0] = true setObjectCollision(handle,true) end) printHelpString("Group collisions on") end imgui.SameLine() if imgui.Button("Set collisions off",imgui.ImVec2(fcommon.GetSize(2))) then ApplyToObjects(grp,function(handle,value) value.collision[0] = false setObjectCollision(handle,false) end) printHelpString("Group collisions off") end imgui.Spacing() imgui.Columns(2,nil,false) if imgui.Button("+##X",imgui.ImVec2(size,size)) then ApplyToObjects(grp,function(handle,value) local _,x,y,z = getObjectCoordinates(handle) x = x + 1 setObjectCoordinates(handle,x,y,z) end) end imgui.SameLine() if imgui.Button("-##X",imgui.ImVec2(size,size)) then ApplyToObjects(grp,function(handle,value) local _,x,y,z = getObjectCoordinates(handle) x = x - 1 setObjectCoordinates(handle,x,y,z) end) end imgui.SameLine() imgui.Text("Move X coord") if imgui.Button("+##Y",imgui.ImVec2(size,size)) then ApplyToObjects(grp,function(handle,value) local _,x,y,z = getObjectCoordinates(handle) y = y + 1 setObjectCoordinates(handle,x,y,z) end) end imgui.SameLine() if imgui.Button("-##Y",imgui.ImVec2(size,size)) then ApplyToObjects(grp,function(handle,value) local _,x,y,z = getObjectCoordinates(handle) y = y - 1 setObjectCoordinates(handle,x,y,z) end) end imgui.SameLine() imgui.Text("Move Y coord") if imgui.Button("+##Z",imgui.ImVec2(size,size)) then ApplyToObjects(grp,function(handle,value) local _,x,y,z = getObjectCoordinates(handle) z = z + 1 setObjectCoordinates(handle,x,y,z) end) end imgui.SameLine() if imgui.Button("-##Z",imgui.ImVec2(size,size)) then ApplyToObjects(grp,function(handle,value) local _,x,y,z = getObjectCoordinates(handle) z = z - 1 setObjectCoordinates(handle,x,y,z) end) end imgui.SameLine() imgui.Text("Move Z coord") imgui.NextColumn() if imgui.Button("+##rotX",imgui.ImVec2(size,size)) then ApplyToObjects(grp,function(handle,value) value.rotx[0] = value.rotx[0] + 1 setObjectRotation(tonumber(handle),value.rotx[0],value.roty[0],value.rotz[0]) end) end imgui.SameLine() if imgui.Button("-##rotX",imgui.ImVec2(size,size)) then ApplyToObjects(grp,function(handle,value) value.rotx[0] = value.rotx[0] - 1 setObjectRotation(tonumber(handle),value.rotx[0],value.roty[0],value.rotz[0]) end) end imgui.SameLine() imgui.Text("Rotate X") if imgui.Button("+##rotY",imgui.ImVec2(size,size)) then ApplyToObjects(grp,function(handle,value) value.roty[0] = value.roty[0] + 1 setObjectRotation(tonumber(handle),value.rotx[0],value.roty[0],value.rotz[0]) end) end imgui.SameLine() if imgui.Button("-##rotY",imgui.ImVec2(size,size)) then ApplyToObjects(grp,function(handle,value) value.roty[0] = value.roty[0] - 1 setObjectRotation(tonumber(handle),value.rotx[0],value.roty[0],value.rotz[0]) end) end imgui.SameLine() imgui.Text("Rotate Y") if imgui.Button("+##rotZ",imgui.ImVec2(size,size)) then ApplyToObjects(grp,function(handle,value) value.rotz[0] = value.rotz[0] + 1 setObjectRotation(tonumber(handle),value.rotx[0],value.roty[0],value.rotz[0]) end) end imgui.SameLine() if imgui.Button("-##rotZ",imgui.ImVec2(size,size)) then ApplyToObjects(grp,function(handle,value) value.rotz[0] = value.rotz[0] - 1 setObjectRotation(tonumber(handle),value.rotx[0],value.roty[0],value.rotz[0]) end) end imgui.SameLine() imgui.Text("Rotate Z") imgui.Columns(1) imgui.Spacing() if imgui.Button("Remove group",imgui.ImVec2(fcommon.GetSize(1))) then for lgrp,ldata in pairs(module.tgame.object_spawner.placed) do if grp == lgrp then for lkey,value in pairs(ldata) do local model, handle = string.match(lkey,"(%w+)##(%w+)") deleteObject(tonumber(handle)) end module.tgame.object_spawner.placed[lgrp] = nil break end end printHelpString("Group removed") end end) end else for grp,data in pairs(module.tgame.object_spawner.placed) do for key,value in pairs(data) do local model, handle = string.match(key,"(%w+)##(%w+)") if filter:PassFilter(tostring(model)) or filter:PassFilter(value.name) then handle = tonumber(handle) fcommon.DropDownMenu(string.format("%s - %s - %s",grp,value.name,key),function() local _,x,y,z = getObjectCoordinates(handle) module.tgame.object_spawner.coord.x[0] = x module.tgame.object_spawner.coord.y[0] = y module.tgame.object_spawner.coord.z[0] = z if imgui.Checkbox("Collision",value.collision) then setObjectCollision(handle,value.collision[0]) end imgui.InputFloat("Coord X",module.tgame.object_spawner.coord.x,1.0, 1.0, "%.5f") imgui.InputFloat("Coord Y",module.tgame.object_spawner.coord.y,1.0, 1.0, "%.5f") imgui.InputFloat("Coord Z",module.tgame.object_spawner.coord.z,1.0, 1.0, "%.5f") setObjectCoordinates(handle,module.tgame.object_spawner.coord.x[0],module.tgame.object_spawner.coord.y[0],module.tgame.object_spawner.coord.z[0]) imgui.Spacing() imgui.SliderFloat("Rotation X",value.rotx,0,360, "%.5f") imgui.SliderFloat("Rotation Y",value.roty,0,360, "%.5f") imgui.SliderFloat("Rotation Z",value.rotz,0,360, "%.5f") setObjectRotation(handle,value.rotx[0],value.roty[0],value.rotz[0]) imgui.Spacing() if imgui.Button("Remove object",imgui.ImVec2(fcommon.GetSize(1))) then for lgrp,data in pairs(module.tgame.object_spawner.placed) do if grp == lgrp then for lkey,value in pairs(data) do if key == lkey then local model, handle = string.match(key,"(%w+)##(%w+)") deleteObject(tonumber(handle)) module.tgame.object_spawner.placed[grp][key] = nil end end break end end printHelpString("Object removed") end end) end end end end imgui.EndChild() end end fcommon.EndTabBar() end end fcommon.EndTabBar() end end return module