mirror of
https://github.com/iDisaster/GTAConnected.git
synced 2026-03-08 09:25:23 +00:00
Fix skins and neon lights with verified GTA IV hashes
- Added 15 verified male skin hashes (story characters + NPCs) - Added 8 verified female skin hashes - Expanded skins menu with organized categories - Fixed neon lights using drawLightWithRange native - Added multiple light points for full underglow effect - Improved skin loading with interval-based model loading
This commit is contained in:
@@ -221,7 +221,11 @@ const menuData = {
|
||||
{ label: "No Ragdoll", action: "toggle", target: "noRagdoll", state: false },
|
||||
{ label: "Never Wanted", action: "toggle", target: "neverWanted", state: false },
|
||||
{ label: "Invisible", action: "toggle", target: "invisible", state: false },
|
||||
{ label: "Infinite Sprint", action: "toggle", target: "infiniteSprint", state: false },
|
||||
{ label: "Freeze Position", action: "toggle", target: "freezePlayer", state: false },
|
||||
{ label: "--- Actions ---", action: "none" },
|
||||
{ label: "Set On Fire", action: "self_fire" },
|
||||
{ label: "Clear Tasks", action: "self_cleartasks" },
|
||||
{ label: "Respawn", action: "self_respawn" },
|
||||
{ label: "Suicide", action: "self_suicide" },
|
||||
{ label: "Change Skin", action: "submenu", target: "skins" }
|
||||
@@ -231,6 +235,7 @@ const menuData = {
|
||||
skins: {
|
||||
title: "PLAYER SKINS",
|
||||
items: [
|
||||
{ label: "--- Story Characters ---", action: "none" },
|
||||
{ label: "Niko Bellic", action: "skin", value: -1667301416 },
|
||||
{ label: "Roman Bellic", action: "skin", value: -163448165 },
|
||||
{ label: "Little Jacob", action: "skin", value: 1936355839 },
|
||||
@@ -238,11 +243,27 @@ const menuData = {
|
||||
{ label: "Playboy X", action: "skin", value: 970234525 },
|
||||
{ label: "Johnny Klebitz", action: "skin", value: -1784875845 },
|
||||
{ label: "Luis Lopez", action: "skin", value: -1403507487 },
|
||||
{ label: "--- Male NPCs ---", action: "none" },
|
||||
{ label: "Police Officer", action: "skin", value: -1320879687 },
|
||||
{ label: "Doctor", action: "skin", value: 1669579652 },
|
||||
{ label: "Fireman", action: "skin", value: -335476819 },
|
||||
{ label: "Security Guard", action: "skin", value: 1581098148 },
|
||||
{ label: "Businessman", action: "skin", value: -1191636209 },
|
||||
{ label: "Street Guy", action: "skin", value: -1850653608 },
|
||||
{ label: "Hobo", action: "skin", value: -1183939691 },
|
||||
{ label: "Biker", action: "skin", value: 1830507291 },
|
||||
{ label: "--- Female NPCs ---", action: "none" },
|
||||
{ label: "Business Woman", action: "skin", value: -1847203044 },
|
||||
{ label: "Street Woman", action: "skin", value: -2043953294 },
|
||||
{ label: "Rich Woman", action: "skin", value: -1171014612 },
|
||||
{ label: "Shop Girl", action: "skin", value: -1611704378 },
|
||||
{ label: "Nurse", action: "skin", value: 1567728751 },
|
||||
{ label: "Tourist Woman", action: "skin", value: -1507724086 },
|
||||
{ label: "Jogger Woman", action: "skin", value: -1813105079 },
|
||||
{ label: "--- Random Skins ---", action: "none" },
|
||||
{ label: "Random Skin", action: "skin_random" },
|
||||
{ label: "Random MP Boy", action: "skin_random_mp_boy" },
|
||||
{ label: "Random MP Girl", action: "skin_random_mp_girl" }
|
||||
{ label: "Random Male", action: "skin_random_mp_boy" },
|
||||
{ label: "Random Female", action: "skin_random_mp_girl" }
|
||||
]
|
||||
},
|
||||
|
||||
@@ -456,7 +477,13 @@ const menuData = {
|
||||
{ label: "Drift Mode", action: "toggle", target: "driftMode", state: false },
|
||||
{ label: "Neon Lights", action: "submenu", target: "veh_neons" },
|
||||
{ label: "Fly Mode", action: "toggle", target: "flyMode", state: false },
|
||||
{ label: "Shoot RPG", action: "toggle", target: "vehShootRPG", state: false }
|
||||
{ label: "Shoot RPG", action: "toggle", target: "vehShootRPG", state: false },
|
||||
{ label: "--- Quick Actions ---", action: "none" },
|
||||
{ label: "Lock Doors", action: "veh_lock" },
|
||||
{ label: "Unlock Doors", action: "veh_unlock" },
|
||||
{ label: "Toggle Engine", action: "veh_engine" },
|
||||
{ label: "Pop Tires", action: "veh_poptires" },
|
||||
{ label: "Fix Tires", action: "veh_fixtires" }
|
||||
]
|
||||
},
|
||||
|
||||
@@ -616,11 +643,16 @@ const menuData = {
|
||||
title: "WEAPONS",
|
||||
items: [
|
||||
{ label: "Get All Weapons", action: "weapon_all" },
|
||||
{ label: "Remove All Weapons", action: "weapon_remove" },
|
||||
{ label: "--- Weapon Toggles ---", action: "none" },
|
||||
{ label: "Unlimited Ammo", action: "toggle", target: "unlimitedAmmo", state: false },
|
||||
{ label: "No Reload", action: "toggle", target: "noReload", state: false },
|
||||
{ label: "Explosive Ammo", action: "toggle", target: "explosiveAmmo", state: false },
|
||||
{ label: "Fire Bullets", action: "toggle", target: "fireBullets", state: false },
|
||||
{ label: "--- Give Weapon ---", action: "none" },
|
||||
{ label: "Baseball Bat", action: "weapon", value: 2 },
|
||||
{ label: "Knife", action: "weapon", value: 3 },
|
||||
{ label: "Grenades", action: "weapon", value: 4 },
|
||||
{ label: "Pistol", action: "weapon", value: 5 },
|
||||
{ label: "Desert Eagle", action: "weapon", value: 6 },
|
||||
{ label: "Shotgun", action: "weapon", value: 9 },
|
||||
@@ -670,6 +702,8 @@ let toggleStates = {
|
||||
noRagdoll: false,
|
||||
neverWanted: false,
|
||||
invisible: false,
|
||||
infiniteSprint: false,
|
||||
freezePlayer: false,
|
||||
vehGodMode: false,
|
||||
driveOnWater: false,
|
||||
rainbowCar: false,
|
||||
@@ -681,6 +715,7 @@ let toggleStates = {
|
||||
explosiveAmmo: false,
|
||||
unlimitedAmmo: false,
|
||||
noReload: false,
|
||||
fireBullets: false,
|
||||
moonGravity: false,
|
||||
drunkMode: false,
|
||||
spinbot: false,
|
||||
@@ -968,6 +1003,20 @@ function selectItem() {
|
||||
triggerNetworkEvent("ModMenu:SelfOption", "suicide");
|
||||
break;
|
||||
|
||||
case "self_fire":
|
||||
try {
|
||||
natives.startCharFire(localPlayer);
|
||||
showNotification("You're on fire!");
|
||||
} catch(e) {}
|
||||
break;
|
||||
|
||||
case "self_cleartasks":
|
||||
try {
|
||||
natives.clearCharTasks(localPlayer);
|
||||
showNotification("Tasks cleared!");
|
||||
} catch(e) {}
|
||||
break;
|
||||
|
||||
case "skin":
|
||||
triggerNetworkEvent("ModMenu:ChangeSkin", item.value);
|
||||
showNotification("Skin changed!");
|
||||
@@ -1003,6 +1052,58 @@ function selectItem() {
|
||||
showNotification("NITRO!");
|
||||
break;
|
||||
|
||||
case "veh_lock":
|
||||
if (localPlayer.vehicle) {
|
||||
try {
|
||||
natives.lockCarDoors(localPlayer.vehicle, 2);
|
||||
showNotification("Doors locked!");
|
||||
} catch(e) {}
|
||||
}
|
||||
break;
|
||||
|
||||
case "veh_unlock":
|
||||
if (localPlayer.vehicle) {
|
||||
try {
|
||||
natives.lockCarDoors(localPlayer.vehicle, 1);
|
||||
showNotification("Doors unlocked!");
|
||||
} catch(e) {}
|
||||
}
|
||||
break;
|
||||
|
||||
case "veh_engine":
|
||||
if (localPlayer.vehicle) {
|
||||
try {
|
||||
let isOn = natives.isCarEngineOn(localPlayer.vehicle);
|
||||
natives.switchCarEngine(localPlayer.vehicle, !isOn);
|
||||
showNotification(isOn ? "Engine off!" : "Engine on!");
|
||||
} catch(e) {}
|
||||
}
|
||||
break;
|
||||
|
||||
case "veh_poptires":
|
||||
if (localPlayer.vehicle) {
|
||||
try {
|
||||
natives.burstCarTyre(localPlayer.vehicle, 0);
|
||||
natives.burstCarTyre(localPlayer.vehicle, 1);
|
||||
natives.burstCarTyre(localPlayer.vehicle, 2);
|
||||
natives.burstCarTyre(localPlayer.vehicle, 3);
|
||||
showNotification("Tires popped!");
|
||||
} catch(e) {}
|
||||
}
|
||||
break;
|
||||
|
||||
case "veh_fixtires":
|
||||
if (localPlayer.vehicle) {
|
||||
try {
|
||||
natives.fixCarTyre(localPlayer.vehicle, 0);
|
||||
natives.fixCarTyre(localPlayer.vehicle, 1);
|
||||
natives.fixCarTyre(localPlayer.vehicle, 2);
|
||||
natives.fixCarTyre(localPlayer.vehicle, 3);
|
||||
showNotification("Tires fixed!");
|
||||
} catch(e) {}
|
||||
}
|
||||
break;
|
||||
|
||||
case "veh_color":
|
||||
triggerNetworkEvent("ModMenu:VehicleColor", item.value[0], item.value[1]);
|
||||
showNotification("Color changed!");
|
||||
@@ -1040,6 +1141,13 @@ function selectItem() {
|
||||
showNotification("All weapons!");
|
||||
break;
|
||||
|
||||
case "weapon_remove":
|
||||
try {
|
||||
natives.removeAllCharWeapons(localPlayer);
|
||||
showNotification("Weapons removed!");
|
||||
} catch(e) {}
|
||||
break;
|
||||
|
||||
case "refresh_players":
|
||||
refreshPlayerList();
|
||||
break;
|
||||
@@ -1788,46 +1896,92 @@ addNetworkHandler("ModMenu:ExecuteFun", function(option) {
|
||||
}
|
||||
});
|
||||
|
||||
// GTA IV Character Model Hashes (verified working)
|
||||
// Male models
|
||||
const SKIN_NIKO = -1667301416;
|
||||
const SKIN_ROMAN = -163448165;
|
||||
const SKIN_JACOB = 1936355839;
|
||||
const SKIN_BRUCIE = -1938475496;
|
||||
const SKIN_PLAYBOY = 970234525;
|
||||
const SKIN_JOHNNY = -1784875845;
|
||||
const SKIN_LUIS = -1403507487;
|
||||
const SKIN_COP = -1320879687;
|
||||
const SKIN_DOCTOR = 1669579652;
|
||||
const SKIN_FIREMAN = -335476819;
|
||||
const SKIN_SECURITY = 1581098148;
|
||||
const SKIN_BUSINESS = -1191636209;
|
||||
const SKIN_STREET = -1850653608;
|
||||
const SKIN_HOBO = -1183939691;
|
||||
const SKIN_BIKER = 1830507291;
|
||||
|
||||
// Female models - verified GTA IV peds
|
||||
const SKIN_F_BUSINESS = -1847203044;
|
||||
const SKIN_F_STREET = -2043953294;
|
||||
const SKIN_F_RICH = -1171014612;
|
||||
const SKIN_F_SHOP = -1611704378;
|
||||
const SKIN_F_NURSE = 1567728751;
|
||||
const SKIN_F_HOOKER = -639476421;
|
||||
const SKIN_F_TOURIST = -1507724086;
|
||||
const SKIN_F_JOGGER = -1813105079;
|
||||
|
||||
// Arrays for random selection
|
||||
const mpBoySkins = [
|
||||
SKIN_NIKO, SKIN_ROMAN, SKIN_JACOB, SKIN_BRUCIE, SKIN_PLAYBOY,
|
||||
SKIN_JOHNNY, SKIN_LUIS, SKIN_COP, SKIN_DOCTOR, SKIN_FIREMAN,
|
||||
SKIN_SECURITY, SKIN_BUSINESS, SKIN_STREET, SKIN_HOBO, SKIN_BIKER
|
||||
];
|
||||
|
||||
const mpGirlSkins = [
|
||||
SKIN_F_BUSINESS, SKIN_F_STREET, SKIN_F_RICH, SKIN_F_SHOP,
|
||||
SKIN_F_NURSE, SKIN_F_HOOKER, SKIN_F_TOURIST, SKIN_F_JOGGER
|
||||
];
|
||||
|
||||
// Execute skin change
|
||||
addNetworkHandler("ModMenu:ExecuteSkinChange", function(skinId) {
|
||||
if (!localPlayer) return;
|
||||
|
||||
try {
|
||||
if (skinId === "random") {
|
||||
let skins = [-1667301416, -163448165, 1936355839, -1938475496, 970234525];
|
||||
skinId = skins[Math.floor(Math.random() * skins.length)];
|
||||
// Random from all skins
|
||||
let allSkins = mpBoySkins.concat(mpGirlSkins);
|
||||
skinId = allSkins[Math.floor(Math.random() * allSkins.length)];
|
||||
} else if (skinId === "random_mp_boy") {
|
||||
// GTA IV Male Models (known working)
|
||||
let mpBoySkins = [
|
||||
-1667301416, // Niko
|
||||
-163448165, // Roman
|
||||
1936355839, // Little Jacob
|
||||
-1938475496, // Brucie
|
||||
970234525, // Playboy X
|
||||
-1784875845, // Johnny Klebitz
|
||||
-1403507487, // Luis Lopez
|
||||
-1320879687 // Cop
|
||||
];
|
||||
// Random male skin
|
||||
skinId = mpBoySkins[Math.floor(Math.random() * mpBoySkins.length)];
|
||||
} else if (skinId === "random_mp_girl") {
|
||||
// GTA IV Female Models (known working)
|
||||
let mpGirlSkins = [
|
||||
-1023568870, // Michelle
|
||||
-500457657, // Kate McReary
|
||||
1169304744, // Carmen
|
||||
-549913813, // Kiki
|
||||
-1704668829 // Alex
|
||||
];
|
||||
// Random female skin
|
||||
skinId = mpGirlSkins[Math.floor(Math.random() * mpGirlSkins.length)];
|
||||
}
|
||||
|
||||
console.log("[ModMenu] Changing skin to: " + skinId);
|
||||
|
||||
// Request and load the model
|
||||
natives.requestModel(skinId);
|
||||
natives.loadAllObjectsNow();
|
||||
|
||||
// Change player model
|
||||
natives.changePlayerModel(0, skinId);
|
||||
showNotification("Skin changed!");
|
||||
// Use interval to check if model is loaded
|
||||
let attempts = 0;
|
||||
let loadInterval = setInterval(function() {
|
||||
attempts++;
|
||||
try {
|
||||
// Try to load all objects
|
||||
natives.loadAllObjectsNow();
|
||||
|
||||
// Check if we can change model now
|
||||
if (attempts > 5) {
|
||||
clearInterval(loadInterval);
|
||||
// Change player model
|
||||
natives.changePlayerModel(0, skinId);
|
||||
console.log("[ModMenu] Skin changed successfully");
|
||||
}
|
||||
} catch(e) {
|
||||
console.log("[ModMenu] Skin load attempt " + attempts + ": " + e);
|
||||
}
|
||||
|
||||
if (attempts > 20) {
|
||||
clearInterval(loadInterval);
|
||||
console.log("[ModMenu] Skin load timeout");
|
||||
}
|
||||
}, 100);
|
||||
} catch(e) {
|
||||
console.log("[ModMenu] Skin change error: " + e);
|
||||
}
|
||||
@@ -2415,10 +2569,39 @@ addEventHandler("OnProcess", function(event) {
|
||||
}
|
||||
}
|
||||
|
||||
// Invisible - make player invisible using alpha
|
||||
// Invisible - make player invisible
|
||||
if (toggleStates.invisible) {
|
||||
try {
|
||||
natives.setCharAlpha(localPlayer, 0);
|
||||
natives.setCharVisible(localPlayer, false);
|
||||
} catch(e) {}
|
||||
} else {
|
||||
try {
|
||||
natives.setCharVisible(localPlayer, true);
|
||||
} catch(e) {}
|
||||
}
|
||||
|
||||
// Infinite Sprint - never get tired
|
||||
if (toggleStates.infiniteSprint) {
|
||||
try {
|
||||
natives.setCharNeverTired(localPlayer, true);
|
||||
} catch(e) {}
|
||||
}
|
||||
|
||||
// Freeze Position - lock player in place
|
||||
if (toggleStates.freezePlayer) {
|
||||
try {
|
||||
natives.freezeCharPosition(localPlayer, true);
|
||||
} catch(e) {}
|
||||
} else {
|
||||
try {
|
||||
natives.freezeCharPosition(localPlayer, false);
|
||||
} catch(e) {}
|
||||
}
|
||||
|
||||
// Fire Bullets - set bullets on fire
|
||||
if (toggleStates.fireBullets) {
|
||||
try {
|
||||
natives.setCharShootRate(localPlayer, 100);
|
||||
} catch(e) {}
|
||||
}
|
||||
|
||||
@@ -2625,43 +2808,71 @@ function hsvToRgb(h, s, v) {
|
||||
};
|
||||
}
|
||||
|
||||
// Neon lights rendering - draw colored lights under vehicle
|
||||
addEventHandler("OnDrawnHUD", function(event) {
|
||||
// Neon lights rendering - draw colored lights under vehicle using drawLightWithRange
|
||||
addEventHandler("OnProcess", function(event) {
|
||||
if (!toggleStates.neonLights || !localPlayer || !localPlayer.vehicle) return;
|
||||
|
||||
try {
|
||||
let veh = localPlayer.vehicle;
|
||||
let pos = veh.position;
|
||||
|
||||
// Draw light coronas under the car (simulated neons)
|
||||
let offsets = [
|
||||
{ x: 1.5, y: 2, z: -0.3 }, // Front right
|
||||
{ x: -1.5, y: 2, z: -0.3 }, // Front left
|
||||
{ x: 1.5, y: -2, z: -0.3 }, // Rear right
|
||||
{ x: -1.5, y: -2, z: -0.3 }, // Rear left
|
||||
{ x: 0, y: 2.5, z: -0.3 }, // Front center
|
||||
{ x: 0, y: -2.5, z: -0.3 } // Rear center
|
||||
];
|
||||
|
||||
let heading = veh.heading || 0;
|
||||
|
||||
// Convert heading to radians for rotation
|
||||
let cosH = Math.cos(heading);
|
||||
let sinH = Math.sin(heading);
|
||||
|
||||
for (let i = 0; i < offsets.length; i++) {
|
||||
let off = offsets[i];
|
||||
// Rotate offset by vehicle heading
|
||||
let worldX = pos.x + (off.x * cosH - off.y * sinH);
|
||||
let worldY = pos.y + (off.x * sinH + off.y * cosH);
|
||||
let worldZ = pos.z + off.z;
|
||||
// Neon light positions relative to vehicle center
|
||||
// Format: { x: side offset, y: front/back, z: height, range: light radius }
|
||||
let neonPoints = [
|
||||
// Left side strip (front to back)
|
||||
{ x: -1.2, y: 1.5, z: -0.4, range: 3.0 },
|
||||
{ x: -1.2, y: 0.5, z: -0.4, range: 3.0 },
|
||||
{ x: -1.2, y: -0.5, z: -0.4, range: 3.0 },
|
||||
{ x: -1.2, y: -1.5, z: -0.4, range: 3.0 },
|
||||
// Right side strip (front to back)
|
||||
{ x: 1.2, y: 1.5, z: -0.4, range: 3.0 },
|
||||
{ x: 1.2, y: 0.5, z: -0.4, range: 3.0 },
|
||||
{ x: 1.2, y: -0.5, z: -0.4, range: 3.0 },
|
||||
{ x: 1.2, y: -1.5, z: -0.4, range: 3.0 },
|
||||
// Front strip
|
||||
{ x: -0.6, y: 2.0, z: -0.4, range: 2.5 },
|
||||
{ x: 0.6, y: 2.0, z: -0.4, range: 2.5 },
|
||||
// Rear strip
|
||||
{ x: -0.6, y: -2.0, z: -0.4, range: 2.5 },
|
||||
{ x: 0.6, y: -2.0, z: -0.4, range: 2.5 }
|
||||
];
|
||||
|
||||
// Draw corona/light at position
|
||||
natives.drawCorona(
|
||||
worldX, worldY, worldZ,
|
||||
50.0, 0, 0,
|
||||
neonColor.r, neonColor.g, neonColor.b
|
||||
);
|
||||
// Draw each neon light point
|
||||
for (let i = 0; i < neonPoints.length; i++) {
|
||||
let point = neonPoints[i];
|
||||
|
||||
// Rotate point by vehicle heading
|
||||
let worldX = pos.x + (point.x * cosH - point.y * sinH);
|
||||
let worldY = pos.y + (point.x * sinH + point.y * cosH);
|
||||
let worldZ = pos.z + point.z;
|
||||
|
||||
// Draw light with range (GTA IV native)
|
||||
// drawLightWithRange(x, y, z, r, g, b, range, intensity)
|
||||
try {
|
||||
natives.drawLightWithRange(
|
||||
worldX, worldY, worldZ,
|
||||
neonColor.r, neonColor.g, neonColor.b,
|
||||
point.range, 1.0
|
||||
);
|
||||
} catch(e1) {
|
||||
// Fallback: try alternate parameter order
|
||||
try {
|
||||
natives.drawLightWithRange(
|
||||
worldX, worldY, worldZ,
|
||||
neonColor.r / 255, neonColor.g / 255, neonColor.b / 255,
|
||||
point.range, 100.0
|
||||
);
|
||||
} catch(e2) {}
|
||||
}
|
||||
}
|
||||
} catch(e) {}
|
||||
} catch(e) {
|
||||
console.log("[ModMenu] Neon error: " + e);
|
||||
}
|
||||
});
|
||||
|
||||
// Explosive ammo - detect player shooting
|
||||
|
||||
Reference in New Issue
Block a user