417 lines
19 KiB
Lua
417 lines
19 KiB
Lua
-- 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 <http://www.gnu.org/licenses/>.
|
|
|
|
local module = {}
|
|
|
|
module.tconfig =
|
|
{
|
|
memory_data = {},
|
|
misc_data = {},
|
|
path = tcheatmenu.dir .. "json/config.json",
|
|
reset = false,
|
|
read = fcommon.LoadJson("config"),
|
|
stat_data = {},
|
|
save_config = true,
|
|
}
|
|
|
|
|
|
function module.Get(s,default,t)
|
|
if t == nil then t = module.tconfig.read end
|
|
if t == nil then return default end
|
|
|
|
local status, rtn = pcall(function()
|
|
for key in s:gmatch('[^.]+') do
|
|
if t[key] == nil then return default end
|
|
t = t[key]
|
|
end
|
|
|
|
if t == nil then
|
|
return default
|
|
else
|
|
return t
|
|
end
|
|
end)
|
|
|
|
if status then
|
|
return rtn
|
|
else
|
|
print(string.format("Error occured while getting value of %s. Returning default value %s",s,tostring(default)))
|
|
return default
|
|
end
|
|
end
|
|
|
|
function module.Set(t,path,value)
|
|
|
|
local x = 0
|
|
for key in path:gmatch('[^.]+') do
|
|
x = x + 1
|
|
end
|
|
|
|
local y = 0
|
|
for key in path:gmatch('[^.]+') do
|
|
y = y + 1
|
|
if x == y then
|
|
t[key] = value
|
|
else
|
|
if t[key] == nil then t[key] = {} end
|
|
t = t[key]
|
|
end
|
|
end
|
|
end
|
|
|
|
module.tconfig.memory_data = module.Get('tmemory_data',{})
|
|
module.tconfig.misc_data = module.Get('tmisc_data',{})
|
|
module.tconfig.stat_data = module.Get('tstat_data',{})
|
|
|
|
function module.SetConfigData()
|
|
for k,v in pairs(module.tconfig.memory_data) do
|
|
fcommon.RwMemory(tonumber(k),v[1],v[2],nil,v[3],v[4])
|
|
end
|
|
|
|
if fmenu.tmenu.enable_stat_saving[0] then
|
|
for k,v in pairs(module.tconfig.stat_data) do
|
|
setFloatStat(tonumber(k),v)
|
|
end
|
|
|
|
setCharHealth(PLAYER_PED,module.Get("tmisc_data.Health",getCharHealth(PLAYER_PED)))
|
|
|
|
if getCharArmour(PLAYER_PED) < module.Get("tmisc_data.Armour",getCharArmour(PLAYER_PED)) then
|
|
addArmourToChar(PLAYER_PED,module.Get("tmisc_data.Armour",0)-getCharArmour(PLAYER_PED))
|
|
else
|
|
damageChar(PLAYER_PED,getCharArmour(PLAYER_PED)-module.Get("tmisc_data.Armour",0),true)
|
|
end
|
|
|
|
-- Body
|
|
local body = module.Get("tmisc_data.Body",nil)
|
|
if body == 1 then
|
|
callFunction(0x439110,1,1,false)
|
|
end
|
|
if body == 2 then
|
|
callFunction(0x439190,1,1,false)
|
|
callFunction(0x439150,1,1,false)
|
|
end
|
|
if body == 3 then
|
|
callFunction(0x439190,1,1,false)
|
|
end
|
|
end
|
|
|
|
-- Never Wanted
|
|
if readMemory(0x969171,1,false) == 0 and module.Get("tmisc_data.Never Wanted",0) == true then
|
|
callFunction(0x4396C0,1,0,false)
|
|
end
|
|
|
|
-- Car & zone names
|
|
local car_name = module.Get("tmisc_data.Display Car Names",nil)
|
|
|
|
if car_name ~= nil then
|
|
displayCarNames(car_name)
|
|
fvisual.tvisual.car_names[0] = car_name
|
|
end
|
|
|
|
local zone_name = module.Get("tmisc_data.Display Zone Names",nil)
|
|
|
|
if zone_name ~= nil then
|
|
displayZoneNames(zone_name)
|
|
fvisual.tvisual.zone_names[0] = zone_name
|
|
end
|
|
|
|
end
|
|
|
|
function module.Write()
|
|
|
|
if not module.tconfig.save_config then return end
|
|
|
|
local write_table = {}
|
|
|
|
if not fmenu.tmenu.dont_save[0] then
|
|
if not module.tconfig.reset then
|
|
if not fmenu.tmenu.enable_stat_saving[0] then
|
|
fmenu.tmenu.stat_data = {}
|
|
|
|
-- Remove player health & armor too
|
|
module.tconfig.memory_data[string.format("0x%6.6X",getCharPointer(PLAYER_PED)+0x548)] = nil -- player armor
|
|
module.tconfig.memory_data[string.format("0x%6.6X",getCharPointer(PLAYER_PED)+0x540)] = nil -- player health
|
|
module.tconfig.memory_data[tostring(0xB7CE50)] = nil -- money
|
|
module.tconfig.misc_data["Body"] = nil
|
|
end
|
|
write_table =
|
|
{
|
|
tanimation =
|
|
{
|
|
fighting =
|
|
{
|
|
selected = fanimation.tanimation.fighting.selected[0],
|
|
},
|
|
loop = fanimation.tanimation.loop[0],
|
|
ped = fanimation.tanimation.ped[0],
|
|
secondary = fanimation.tanimation.secondary[0],
|
|
walking =
|
|
{
|
|
selected = fanimation.tanimation.walking.selected[0],
|
|
},
|
|
},
|
|
tcheatmenu =
|
|
{
|
|
coord =
|
|
{
|
|
X = tcheatmenu.coord.X,
|
|
Y = tcheatmenu.coord.Y,
|
|
},
|
|
current_menu = tcheatmenu.current_menu,
|
|
size =
|
|
{
|
|
X = tcheatmenu.size.X,
|
|
Y = tcheatmenu.size.Y,
|
|
},
|
|
},
|
|
tgame =
|
|
{
|
|
camera =
|
|
{
|
|
move_player = fgame.tgame.camera.move_player[0],
|
|
fov = fgame.tgame.camera.fov[0],
|
|
movement_speed = fgame.tgame.camera.movement_speed[0],
|
|
},
|
|
disable_cheats = fgame.tgame.disable_cheats[0],
|
|
disable_help_popups = fgame.tgame.disable_help_popups[0],
|
|
disable_replay = fgame.tgame.disable_replay[0],
|
|
forbidden_area_wanted_level = fgame.tgame.forbidden_area_wanted_level[0],
|
|
fps_limit = fgame.tgame.fps_limit[0],
|
|
keep_stuff = fgame.tgame.keep_stuff[0],
|
|
freeze_mission_timer= fgame.tgame.freeze_mission_timer[0],
|
|
freeze_time = fgame.tgame.freeze_time[0],
|
|
object_spawner =
|
|
{
|
|
set_player_coord= fgame.tgame.object_spawner.set_player_coord[0],
|
|
},
|
|
random_cheats =
|
|
{
|
|
cheat_activate_timer = fgame.tgame.random_cheats.cheat_activate_timer[0],
|
|
cheat_deactivate_timer = fgame.tgame.random_cheats.cheat_deactivate_timer[0],
|
|
checkbox = fgame.tgame.random_cheats.checkbox[0],
|
|
disabled_cheats = fgame.tgame.random_cheats.disabled_cheats,
|
|
disable_cheat_checkbox = fgame.tgame.random_cheats.disable_cheat_checkbox[0],
|
|
},
|
|
script_manager =
|
|
{
|
|
scripts = fgame.tgame.script_manager.scripts,
|
|
},
|
|
solid_water = fgame.tgame.solid_water[0],
|
|
ss_shortcut = fgame.tgame.ss_shortcut[0],
|
|
sync_system_time = fgame.tgame.sync_system_time[0],
|
|
},
|
|
tmemory_data = module.tconfig.memory_data,
|
|
tmisc_data = module.tconfig.misc_data,
|
|
tstat_data = module.tconfig.stat_data,
|
|
tmenu =
|
|
{
|
|
auto_update_check = fmenu.tmenu.auto_update_check[0],
|
|
auto_reload = fmenu.tmenu.auto_reload[0],
|
|
dont_save = fmenu.tmenu.dont_save[0],
|
|
enable_stat_saving = fmenu.tmenu.enable_stat_saving[0],
|
|
fast_load_images = fmenu.tmenu.fast_load_images[0],
|
|
font =
|
|
{
|
|
selected = fmenu.tmenu.font.selected,
|
|
size = fmenu.tmenu.font.size[0],
|
|
},
|
|
get_beta_updates = fmenu.tmenu.get_beta_updates[0],
|
|
hot_keys =
|
|
{
|
|
asc_key = fmenu.tmenu.hot_keys.asc_key,
|
|
camera_mode = fmenu.tmenu.hot_keys.camera_mode,
|
|
camera_mode_forward = fmenu.tmenu.hot_keys.camera_mode_forward,
|
|
camera_mode_backward = fmenu.tmenu.hot_keys.camera_mode_backward,
|
|
camera_mode_left = fmenu.tmenu.hot_keys.camera_mode_left,
|
|
camera_mode_right = fmenu.tmenu.hot_keys.camera_mode_right,
|
|
camera_mode_slow = fmenu.tmenu.hot_keys.camera_mode_slow,
|
|
camera_mode_fast = fmenu.tmenu.hot_keys.camera_mode_fast,
|
|
camera_mode_up = fmenu.tmenu.hot_keys.camera_mode_up,
|
|
camera_mode_down = fmenu.tmenu.hot_keys.camera_mode_down,
|
|
command_window = fmenu.tmenu.hot_keys.command_window,
|
|
menu_open = fmenu.tmenu.hot_keys.menu_open,
|
|
quick_screenshot = fmenu.tmenu.hot_keys.quick_screenshot,
|
|
quick_teleport = fmenu.tmenu.hot_keys.quick_teleport,
|
|
},
|
|
lock_player = fmenu.tmenu.lock_player[0],
|
|
overlay =
|
|
{
|
|
coordinates = fmenu.tmenu.overlay.coordinates[0],
|
|
fps = fmenu.tmenu.overlay.fps[0],
|
|
health = fmenu.tmenu.overlay.health[0],
|
|
location = fmenu.tmenu.overlay.location[0],
|
|
position_index = fmenu.tmenu.overlay.position_index[0],
|
|
pos_x = fmenu.tmenu.overlay.pos_x[0],
|
|
pos_y = fmenu.tmenu.overlay.pos_y[0],
|
|
show = fmenu.tmenu.overlay.show[0],
|
|
speed = fmenu.tmenu.overlay.speed[0],
|
|
transparent_bg = fmenu.tmenu.overlay.transparent_bg[0],
|
|
},
|
|
show_tooltips = fmenu.tmenu.show_tooltips[0],
|
|
show_crash_message = fmenu.tmenu.show_crash_message[0],
|
|
},
|
|
tstyle =
|
|
{
|
|
font_size = fstyle.tstyle.font_size,
|
|
selected_name = fstyle.tstyle.selected_name,
|
|
},
|
|
tped =
|
|
{
|
|
gang =
|
|
{
|
|
wars = fped.tped.gang.wars[0],
|
|
},
|
|
ped_health_display = fped.tped.ped_health_display[0],
|
|
spawned_peds =
|
|
{
|
|
ped_bleed = fped.tped.spawned_peds.ped_bleed[0],
|
|
ped_accuracy= fped.tped.spawned_peds.ped_accuracy[0],
|
|
ped_health = fped.tped.spawned_peds.ped_health[0],
|
|
ped_type_selected = fped.tped.spawned_peds.ped_type_selected[0],
|
|
ped_weapon_ammo = fped.tped.spawned_peds.ped_weapon_ammo[0],
|
|
ped_weapon_selected = fped.tped.spawned_peds.ped_weapon_selected,
|
|
ped_weapon_id = fped.tped.spawned_peds.ped_weapon_id[0],
|
|
stand_still = fped.tped.spawned_peds.stand_still[0],
|
|
},
|
|
},
|
|
tplayer =
|
|
{
|
|
aimSkinChanger = fplayer.tplayer.aimSkinChanger[0],
|
|
cjBody = fplayer.tplayer.cjBody[0],
|
|
enable_saving = fplayer.tplayer.enable_saving[0],
|
|
god = fplayer.tplayer.god[0],
|
|
invisible = fplayer.tplayer.invisible[0],
|
|
keep_position = fplayer.tplayer.keep_position[0],
|
|
save_data = fplayer.tplayer.save_data,
|
|
},
|
|
tteleport =
|
|
{
|
|
insert_coords = fteleport.tteleport.insert_coords[0],
|
|
shortcut = fteleport.tteleport.shortcut[0],
|
|
},
|
|
tvehicle =
|
|
{
|
|
aircraft =
|
|
{
|
|
camera = fvehicle.tvehicle.aircraft.camera[0],
|
|
index = fvehicle.tvehicle.aircraft.index,
|
|
spawn_in_air = fvehicle.tvehicle.aircraft.spawn_in_air[0],
|
|
},
|
|
car_engine = fvehicle.tvehicle.car_engine[0],
|
|
color =
|
|
{
|
|
show_all = fvehicle.tvehicle.color.show_all[0],
|
|
},
|
|
components =
|
|
{
|
|
enable_saving = fvehicle.tvehicle.components.enable_saving[0],
|
|
save_data = fvehicle.tvehicle.components.save_data,
|
|
},
|
|
apply_material_filter = fvehicle.tvehicle.apply_material_filter[0],
|
|
first_person_camera =
|
|
{
|
|
bool = fvehicle.tvehicle.first_person_camera.bool[0],
|
|
},
|
|
gxt_name_table = fvehicle.tvehicle.gxt_name_table,
|
|
heavy = fvehicle.tvehicle.heavy[0],
|
|
invisible_car = fvehicle.tvehicle.invisible_car[0],
|
|
license_plate_text = ffi.string(fvehicle.tvehicle.license_plate_text),
|
|
lights = fvehicle.tvehicle.lights[0],
|
|
lock_speed = fvehicle.tvehicle.lock_speed[0],
|
|
neon =
|
|
{
|
|
checkbox = fvehicle.tvehicle.neon.checkbox[0],
|
|
},
|
|
no_damage = fvehicle.tvehicle.no_damage[0],
|
|
no_vehicles = fvehicle.tvehicle.no_vehicles[0],
|
|
paintjobs =
|
|
{
|
|
enable_saving = fvehicle.tvehicle.paintjobs.enable_saving[0],
|
|
save_data = fvehicle.tvehicle.paintjobs.save_data,
|
|
},
|
|
rainbow_colors =
|
|
{ bool = fvehicle.tvehicle.rainbow_colors.bool[0],
|
|
traffic = fvehicle.tvehicle.rainbow_colors.traffic[0],
|
|
speed = fvehicle.tvehicle.rainbow_colors.speed[0],
|
|
},
|
|
rainbow_neons =
|
|
{ bool = fvehicle.tvehicle.rainbow_neons.bool[0],
|
|
traffic = fvehicle.tvehicle.rainbow_neons.traffic[0],
|
|
speed = fvehicle.tvehicle.rainbow_neons.speed[0],
|
|
},
|
|
spawn_inside = fvehicle.tvehicle.spawn_inside[0],
|
|
speed = fvehicle.tvehicle.speed[0],
|
|
stay_on_bike = fvehicle.tvehicle.stay_on_bike[0],
|
|
visual_damage = fvehicle.tvehicle.visual_damage[0],
|
|
unlimited_nitro = fvehicle.tvehicle.unlimited_nitro[0],
|
|
watertight_car = fvehicle.tvehicle.watertight_car[0],
|
|
},
|
|
tvisual =
|
|
{
|
|
lock_weather = fvisual.tvisual.lock_weather[0],
|
|
disable_motion_blur = fvisual.tvisual.disable_motion_blur[0],
|
|
radio_channel_names = fvisual.tvisual.radio_channel_names[0],
|
|
},
|
|
tweapon =
|
|
{
|
|
auto_aim = fweapon.tweapon.auto_aim[0],
|
|
ammo_count = fweapon.tweapon.ammo_count[0],
|
|
gang =
|
|
{
|
|
enable_weapon_editor = fweapon.tweapon.gang.enable_weapon_editor[0],
|
|
},
|
|
fast_reload = fweapon.tweapon.fast_reload[0],
|
|
max_accuracy = fweapon.tweapon.max_accuracy[0],
|
|
max_ammo_clip = fweapon.tweapon.max_ammo_clip[0],
|
|
max_move_speed = fweapon.tweapon.max_move_speed[0],
|
|
huge_damage = fweapon.tweapon.huge_damage[0],
|
|
gang_weapons =
|
|
{
|
|
{fweapon.tweapon.gang.used_weapons[1][1],fweapon.tweapon.gang.used_weapons[1][2],fweapon.tweapon.gang.used_weapons[1][3]}, -- Ballas
|
|
{fweapon.tweapon.gang.used_weapons[2][1],fweapon.tweapon.gang.used_weapons[2][2],fweapon.tweapon.gang.used_weapons[2][3]}, -- Grove
|
|
{fweapon.tweapon.gang.used_weapons[3][1],fweapon.tweapon.gang.used_weapons[3][2],fweapon.tweapon.gang.used_weapons[3][3]}, -- Vagos
|
|
{fweapon.tweapon.gang.used_weapons[4][1],fweapon.tweapon.gang.used_weapons[4][2],fweapon.tweapon.gang.used_weapons[4][3]}, -- SF Rifa
|
|
{fweapon.tweapon.gang.used_weapons[5][1],fweapon.tweapon.gang.used_weapons[5][2],fweapon.tweapon.gang.used_weapons[5][3]}, -- Da Nang Boys
|
|
{fweapon.tweapon.gang.used_weapons[6][1],fweapon.tweapon.gang.used_weapons[6][2],fweapon.tweapon.gang.used_weapons[6][3]}, -- Mafia
|
|
{fweapon.tweapon.gang.used_weapons[7][1],fweapon.tweapon.gang.used_weapons[7][2],fweapon.tweapon.gang.used_weapons[7][3]}, -- Triads
|
|
{fweapon.tweapon.gang.used_weapons[8][1],fweapon.tweapon.gang.used_weapons[8][2],fweapon.tweapon.gang.used_weapons[8][3]}, -- VLA
|
|
{fweapon.tweapon.gang.used_weapons[9][1],fweapon.tweapon.gang.used_weapons[9][2],fweapon.tweapon.gang.used_weapons[9][3]}, -- Gang 9
|
|
{fweapon.tweapon.gang.used_weapons[10][1],fweapon.tweapon.gang.used_weapons[10][2],fweapon.tweapon.gang.used_weapons[10][3]}, -- Gang 10
|
|
},
|
|
long_range = fweapon.tweapon.long_range[0],
|
|
ped = fweapon.tweapon.ped[0],
|
|
},
|
|
}
|
|
end
|
|
else
|
|
write_table =
|
|
{
|
|
tmenu =
|
|
{
|
|
dont_save = true;
|
|
}
|
|
}
|
|
end
|
|
|
|
local file = io.open(module.tconfig.path,'w')
|
|
if file then
|
|
file:write(encodeJson(write_table))
|
|
io.close(file)
|
|
end
|
|
end
|
|
|
|
return module
|