1
0
Fork 0
forked from Simnation/Main
Main/resources/[freizeit]/XNL-FiveM-Trains-U3/client.lua

489 lines
26 KiB
Lua
Raw Normal View History

2025-08-11 18:58:07 +02:00
--[[
=====================================================================================================================================
License, Credits, Basic information, FAQ
=====================================================================================================================================
Based on/inspired by:
Blumlaut (FiveM Community) / Bluethefurry (Github)
Original Post: https://forum.fivem.net/t/release-trains/28841
Original Script: https://github.com/Bluethefurry/FiveM-Trains/releases
Last Updated: 02-01-2024
(Re-)Created by: VenomXNL
License: Use it as you please but do have decency and respect by crediting the original creators :)
What is it?: A very extensive Train and (well mostely) Metro Addon for FiveM
===================================================================================================================================================================
2024 Update:
===================================================================================================================================================================
This script has been updated ONCE now because suddenly lots of people started making requests for it again, this is however a ONE TIME UPDATE!
I don't script/mod/develop for FiveM anymore, but did wanted to help the community out a bit with this update, because the guy who took over from me
also has left FiveM (as it seems).
I will however NOT provide future support on this script, because I REALLY don't have the time for these games (like FiveM etc) lately.
It is intended to configure and adapt a bit for YOUR OWN server, so please read the comments and instruction to do so :)
NOTE: The code might (is) still a bit messy, but that is because (like mentioned) I seriously lack the time to work on projects like this these days,
I have just scrapped and 're-written' large portions of my old version and modified it to a MUCH simpler approach, and had to do this with lots of 'forgotten
knowledge' after not having scripted for FiveM for many years. So please keep that in mind please :)
===================================================================================================================================================================
Basic Functionality list:
- Activates the 'normal game trains'
- Players can WALK AROUND in the moving Metro, just by walking in :)
- Players HAVE to buy a Metro Ticket to enter (With (ATM) animated Ticket machine handling), otherwise they will get a 1 star wanted level for illegal boarding.
- Ticket will 'invalidate' when they have left the metro (even if it's at the same station!) so they will have to buy a new one
- 'terrorist detection', which means if players shoot while on the train they will get a 4 star wanted level
- Easily configurable with basic variables
- Different Bank Messages (for Maze Bank, Bank of Liberty or Fleeca bank)
Known 'bugs' or 'issues':
- From the inside the doors of the Metro are invisible and you can walk straight through them (and thus also while the train is moving!)
and they even seem to dissapear if you walk through them if they are closed, this seems to be a 'model issue' with the vehicle,
not sure though and don't have time to figure this out sorry!
- The ticket machines above ground (the green/old ones) DO NOT WORK, I tried for several hours to find them in the archives but
with no luck. I however did find one that looks like it, but that one doesn't respond at all.
I MIGHT update that when someone can tell me the model of that ticket machine object, however for now I have left it at that.
Also because the original game-texture says: "Sorry, this machine will NEVER work", so i thought: lets keep it in lore :P (nice excuse huh? haha)
Possible Questions:
- Q: Can I use this on my server?
- A: Sure you can that's why I've uploaded it :)
- Q: Can you please help me add or make my money/banking system?
- A: No, sorry. I'm VERY busy with me job and other projects, I decided to share my code's_m_m_lsmetro_01
to public for others to use, possibly adapt and for others to learn from them (hence the massive commenting!).
I have learned it the same way years ago: Looking at other people's codes and trying what would change things or
make it do what I wanted it to do.
- Q: So you're basically saying I "just need to learn" to script/program?
- A: YES, if you would like to run servers and games like this, and thus use mods, it's DEFINITLY a MUST if you can,
it might look hard in the beginning, but trust me: You will be thankful if you learn it yourself :)
- Q: But you also stated that I can adapt your code right?
- A: Sure, adapt, improve, or even 'strip(remove) stuff from it' to make it suit your needs
NOTE: Please do not just 'destroy the code' by randomly doing stuff and then posting stuff like:
'I "changed" this, and now your code doesn't work anymore'. If that happens I suggest you keep trying
till it DOES what you need, investigate about the Native codes, look on other sites for resources and
information, you can ofcourse ask questions, no problem. Just keep in mind that I'm not going to (not even
able to due to my schedule IF I wanted to)) script all kinds of things for everyone randomly ;) :)
- Q: One more question though: If I can adapt your code, am I also allowed to re-upload it?
- A: Yes you are! :) BUT please do give credits to me and the original creator on whom's idea this
scripted was based and inspired on. (AKA: It's NOT allowed to reupload/publish without credits where due)
General adivce (applies to ALL uploading coders):
If this script/addon doesn't do what you wanted it to do, if you think it's "sh*tty" etc, that's all fine, but
just keep that to yourself and find another one that suits your needs (or even better: Make it yourself) ;)
Keep in mind that people upload code to help/provide others in resources and learning matterial, and that doing so
costs (extra) time. Time they took to provide you (and many others) with resources, code, samples and addons.
Contribute, help, share and evolve together, that's the power of a community :)
(Ofcourse doesn't mean that constructive critisim isn't welcome or desired (since we all will always have points of
improvement :) )
=================================== Money Handling Information ===================================
If the rest if TL;DR, fine, your problem ;) :P (Don't nag either if you can't figure it out haha)
But ATLEAST do read this piece for setup! and IF you have questions, or if want to Adapt or
re-publish/upload it: Don't be stubborn, respect other peoples work, and DO read the above ;)
===================================================================================================
IMPORTANT NOTE: Bellow 'somewhere' in the code you will find these two lines:
BankAmount = 10000 --StatGetInt("BANK_BALANCE",-1)
PlayerCashAm = 10000 --StatGetInt("MP0_WALLET_BALANCE",-1)
Make sure that you adapt them to YOUR OWN SERVER, since like stated there (in the script to),
many servers use a different money management system, and thus it's not quite possible to make
one that is 'general in use' for all. We use one that doesn't uses the game stats at all (since thats
to easy to influence with cheat programs for example). To make sure that people could test/try this
script i have set the INTERNAL SCRIPT money values to very high (those DO NOT affect the player itself though!)
This also means that there is no money being taken from the player when he/she buy's a ticket
To make sure that money is taken from the player when buying a ticked you will need to find the following code part:
if PayWithBank == 1 then
-- Put YOUR code to deduct the amount from the players BANK account here
-- 'Basic Example': PlayerBankMoney = PlayerBankMoney - TicketPrice
else
-- Put YOUR code to deduct the amount from the players CASH money account here
-- 'Basic Example': PlayerCash = PlayerCash - TicketPrice
end
And add your OWN SERVER money handling/taking code here
I hope this code/addon is usefull for some people or that they might learn from it by using parts of it :)
Greets,
VenomXNL
=====================================================================================================================================
]]
--===================================================
-- Variables used BY the script, do NOT modify them
-- unless you know what you are doing!
-- Modifying these might/will result in undesired
-- behaviour and/or script breaking!
--===================================================
IsPlayerNearMetro = false
IsPlayerInMetro = false
PlayerHasMetroTicket = false
IsPlayerUsingTicketMachine = false
ShowingExitMetroMessage = false
--===================================================
-- These are radius locations (multiple per station)
-- to detect if the player can exit the Metro
--===================================================
local XNLMetroScanPoints = {
{XNLStationid=0, x=230.82389831543, y=-1204.0643310547, z=38.902523040771},
{XNLStationid=0, x=249.59216308594, y=-1204.7095947266, z=38.92488861084},
{XNLStationid=0, x=270.33166503906, y=-1204.5366210938, z=38.902912139893},
{XNLStationid=0, x=285.96697998047, y=-1204.2261962891, z=38.929733276367},
{XNLStationid=0, x=304.13528442383, y=-1204.3720703125, z=38.892612457275},
{XNLStationid=1, x=-294.53421020508, y=-353.38571166992, z=10.063089370728},
{XNLStationid=1, x=-294.96997070313, y=-335.69766235352, z=10.06309223175},
{XNLStationid=1, x=-294.66772460938, y=-318.29565429688, z=10.063152313232},
{XNLStationid=1, x=-294.73403930664, y=-303.77200317383, z=10.063160896301},
{XNLStationid=1, x=-294.84133911133, y=-296.04568481445, z=10.063159942627},
{XNLStationid=2, x=-795.28063964844, y=-126.3436050415, z=19.950298309326},
{XNLStationid=2, x=-811.87170410156, y=-136.16409301758, z=19.950319290161},
{XNLStationid=2, x=-819.25689697266, y=-140.25764465332, z=19.95037651062},
{XNLStationid=2, x=-826.06652832031, y=-143.90898132324, z=19.95037651062},
{XNLStationid=2, x=-839.2587890625, y=-151.32421875, z=19.950378417969},
{XNLStationid=2, x=-844.77874755859, y=-154.31440734863, z=19.950380325317},
{XNLStationid=3, x=-1366.642578125, y=-440.04803466797, z=15.045327186584},
{XNLStationid=3, x=-1361.4998779297, y=-446.50497436523, z=15.045324325562},
{XNLStationid=3, x=-1357.4061279297, y=-453.40963745117, z=15.045320510864},
{XNLStationid=3, x=-1353.4593505859, y=-461.88238525391, z=15.045323371887},
{XNLStationid=3, x=-1346.1264648438, y=-474.15142822266, z=15.045383453369},
{XNLStationid=3, x=-1338.1717529297, y=-488.97756958008, z=15.045383453369},
{XNLStationid=3, x=-1335.0261230469, y=-493.50796508789, z=15.045380592346},
{XNLStationid=4, x=-530.67529296875, y=-673.33935546875, z=11.808959960938},
{XNLStationid=4, x=-517.35559082031, y=-672.76635742188, z=11.808965682983},
{XNLStationid=4, x=-499.44836425781, y=-673.37664794922, z=11.808973312378},
{XNLStationid=4, x=-483.1321105957, y=-672.68438720703, z=11.809024810791},
{XNLStationid=4, x=-468.05545043945, y=-672.74371337891, z=11.80902671814},
{XNLStationid=5, x=-206.90379333496, y=-1014.9454345703, z=30.138082504272},
{XNLStationid=5, x=-212.65534973145, y=-1031.6101074219, z=30.208702087402},
{XNLStationid=5, x=-212.65534973145, y=-1031.6101074219, z=30.208702087402},
{XNLStationid=5, x=-217.0216217041, y=-1042.4768066406, z=30.573789596558},
{XNLStationid=5, x=-221.29409790039, y=-1054.5914306641, z=30.13950920105},
{XNLStationid=6, x=101.89681243896, y=-1714.7589111328, z=30.112174987793},
{XNLStationid=6, x=113.05246734619, y=-1724.7247314453, z=30.111650466919},
{XNLStationid=6, x=122.72943878174, y=-1731.7276611328, z=30.54141998291},
{XNLStationid=6, x=132.55198669434, y=-1739.7276611328, z=30.109527587891},
{XNLStationid=7, x=-532.24133300781, y=-1263.6896972656, z=26.901586532593},
{XNLStationid=7, x=-539.62115478516, y=-1280.5207519531, z=26.908163070679},
{XNLStationid=7, x=-545.18548583984, y=-1290.9525146484, z=26.901586532593},
{XNLStationid=7, x=-549.92230224609, y=-1302.8682861328, z=26.901605606079},
{XNLStationid=8, x=-872.75714111328, y=-2289.3198242188, z=-11.732793807983},
{XNLStationid=8, x=-875.53247070313, y=-2297.67578125, z=-11.732793807983},
{XNLStationid=8, x=-880.05035400391, y=-2309.1235351563, z=-11.732788085938},
{XNLStationid=8, x=-883.25482177734, y=-2321.3303222656, z=-11.732738494873},
{XNLStationid=8, x=-890.087890625, y=-2336.2553710938, z=-11.732738494873},
{XNLStationid=8, x=-894.92395019531, y=-2350.4128417969, z=-11.732727050781},
{XNLStationid=9, x=-1062.7882080078, y=-2690.7492675781, z=-7.4116077423096},
{XNLStationid=9, x=-1071.6839599609, y=-2701.8503417969, z=-7.410071849823},
{XNLStationid=9, x=-1079.0869140625, y=-2710.7033691406, z=-7.4100732803345},
{XNLStationid=9, x=-1086.8758544922, y=-2720.0673828125, z=-7.4101362228394},
{XNLStationid=9, x=-1095.3796386719, y=-2729.8442382813, z=-7.4101347923279},
{XNLStationid=9, x=-1103.7401123047, y=-2740.369140625, z=-7.4101300239563}
}
local TicketMachines = {'prop_train_ticket_02', 'prop_train_ticket_02_tu', 'v_serv_tu_statio3_'}
local anim = "mini@atmenter"
Citizen.CreateThread(function()
-- All the code now spawns trains (using the normal ingame engine to do it instead of letting it get handled by one player)
SwitchTrainTrack(0, true) -- Main train track(s) around LS and towards Sandy Shores
SwitchTrainTrack(3, true) -- Metro tracks
-- NOTE: You can lower the 120000 numbers bellow to make the trains spawn more often, but this is NOT recommended!
SetTrainTrackSpawnFrequency(0, 120000) -- The Train spawn frequency set for the game engine
SetTrainTrackSpawnFrequency(3, 120000) -- The Metro spawn frequency set for the game engine
SetRandomTrains(true) -- Telling the game we want to use randomly spawned trains end)
-- 22-07-2024: Added this native which was found and reported to me by: BigHE4d
-- on the FixeM CFX.re forum, thanks mate :)
-- https://forum.cfx.re/t/release-fivem-freight-train-ai-and-enterable-trams-as-passenger-suited-for-roleplay-to/268613/255
-- NOTE: Due to me not playing FiveM for quite a while anymore, and might be quite a while until
-- I will (be able) to return, I have NOT tested this native call!
SetTrainsForceDoorsOpen(false)
end)
local PlayerDetectedInMetro = false
local UnpaidPassenger = 0
Citizen.CreateThread(function()
while true do
Wait(3000)
if IsPedOnVehicle(PlayerPedId()) then
local coordA = GetEntityCoords(GetPlayerPed(-1), 1)
local coordB = GetOffsetFromEntityInWorldCoords(GetPlayerPed(-1), 0.0, 0.0, -1.0)
local Metro = getVehicleInDirection(coordA, coordB)
if DoesEntityExist(Metro) then
if GetEntityModel(Metro) == GetHashKey("metrotrain") then
if PlayerDetectedInMetro == false then
PlayerDetectedInMetro = true
if PlayerHasMetroTicket == true then
SMS_Message("CHAR_LS_TOURIST_BOARD", Message[Language]['los_santos_transit'], Message[Language]['tourist_information'], Message[Language]['travel_metro'], true)
end
end
if PlayerDetectedInMetro == true then
if PlayerHasMetroTicket == false then
if UnpaidPassenger < 3 then
UnpaidPassenger = UnpaidPassenger + 1
-- Warn the player he/she needs a ticket to board and travel the metro
if UnpaidPassenger == 1 then
SMS_Message("CHAR_LS_TOURIST_BOARD", Message[Language]['los_santos_transit'], Message[Language]['tourist_information'], Message[Language]['no_ticket_leave'], true)
end
-- At the 'third tick' while traveling (being in the metro) without a ticket the police message will pop up but only once!
if UnpaidPassenger == 3 then
SMS_Message("CHAR_LS_TOURIST_BOARD", Message[Language]['los_santos_transit'], Message[Language]['tourist_information'], Message[Language]['we_warned_you'], true)
end
end
-- Making sure the player keeps getting a 1 star wanted level if he/she doesn't have a ticket but keeps traveling with the metro
if UnpaidPassenger == 3 then
if GetPlayerWantedLevel(PlayerId()) < 1 then
SetPlayerWantedLevel(PlayerId(), 1, 0)
SetPlayerWantedLevelNow(PlayerId(), 0)
end
end
end
end
end
end
else
if PlayerDetectedInMetro == true then
UnpaidPassenger = 0
PlayerDetectedInMetro = false
if PlayerHasMetroTicket == true then
PlayerHasMetroTicket = false
SMS_Message("CHAR_LS_TOURIST_BOARD", Message[Language]['los_santos_transit'], Message[Language]['tourist_information'], Message[Language]['entered_metro'], true)
end
end
end
end
end)
Citizen.CreateThread(function()
ShowedBuyTicketHelper = false
ShowedLeaveMetroHelper = false
while true do
Wait(10)
if IsPlayerNearTicketMachine then
if not IsPlayerUsingTicketMachine then
if not ShowedBuyTicketHelper then
DisplayHelpText(Message[Language]['buyticket'].." ($" .. TicketPrice .. ")")
ShowedBuyTicketHelper = true
end
else
ClearAllHelpMessages()
DisableControlAction(0, 201, true)
DisableControlAction(1, 201, true)
end
if IsControlJustPressed(0, 51) and PlayerHasMetroTicket then
SMS_Message("CHAR_LS_TOURIST_BOARD", Message[Language]['los_santos_transit'], Message[Language]['tourist_information'], Message[Language]['already_got_ticket'], true)
Wait(3500) -- To avoid people 'spamming themselves' with the message popup (3500ms is 'just enough' to take the fun out of it :P)
end
if IsControlJustPressed(0, 51) and not PlayerHasMetroTicket then
IsPlayerUsingTicketMachine = true
RequestAnimDict("mini@atmbase")
RequestAnimDict(anim)
while not HasAnimDictLoaded(anim) do
Wait(1)
end
SetCurrentPedWeapon(playerPed, GetHashKey("weapon_unarmed"), true)
TaskLookAtEntity(playerPed, currentTicketMachine, 2000, 2048, 2)
Wait(500)
TaskGoStraightToCoord(playerPed, TicketMX, TicketMY, TicketMZ, 0.1, 4000, GetEntityHeading(currentTicketMachine), 0.5)
Wait(2000)
TaskPlayAnim(playerPed, anim, "enter", 8.0, 1.0, -1, 0, 0.0, 0, 0, 0)
RemoveAnimDict(animDict)
Wait(4000)
TaskPlayAnim(playerPed, "mini@atmbase", "base", 8.0, 1.0, -1, 0, 0.0, 0, 0, 0)
RemoveAnimDict("mini@atmbase")
Wait(500)
PlaySoundFrontend(-1, "ATM_WINDOW", "HUD_FRONTEND_DEFAULT_SOUNDSET", true)
RequestAnimDict("mini@atmexit")
while not HasAnimDictLoaded("mini@atmexit") do
Wait(1)
end
TaskPlayAnim(playerPed, "mini@atmexit", "exit", 8.0, 1.0, -1, 0, 0.0, 0, 0, 0)
RemoveAnimDict("mini@atmexit")
Wait(500)
--=====================================================================================
-- Put here the actual 'reader'/function that your server uses
-- to calculate/get the players bank account saldo and cash money!
-- Now they are just set 'hardcoded' to an high amount to make the
-- script work for people whom don't read a single line of code
-- and then instantly post "Hey, i can't even buy a ticket, the script is broken" :P
--
-- Nope it's NOT broken, it just needs a BIT of adapting to your server and it's
-- money handling. Since we use a custom banking system we have much different calls
-- than others might have so i've decided to put it in here like this so that it
-- functions for everyone when they want to test/try the script :)
--=====================================================================================
BankAmount = 10000 --StatGetInt("BANK_BALANCE",-1)
PlayerCashAm = 10000 --StatGetInt("MP0_WALLET_BALANCE",-1)
if PayWithBank == 1 then
XNLUserMoney = BankAmount
else
XNLUserMoney = PlayerCashAm
end
--===================================================================
-- Please note, that despite if you make your players pay with
-- cash or by bank, it will always show the selected bank popup
-- if the player doesn't have enough cash (this is NOT a bug!)
-- if you want/need it differently you can adapt the code bellow ;)
--==================================================================
if XNLUserMoney < TicketPrice then
if UserBankIDi == 1 then -- Maze Bank
BankIcon = "CHAR_BANK_MAZE"
BankName = "Maze Bank"
end
if UserBankIDi == 2 then -- Bank Of Liberty
BankIcon = "CHAR_BANK_BOL"
BankName = "Bank Of Liberty"
end
if UserBankIDi == 3 then -- Fleeca (Default Fallback to!)
BankIcon = "CHAR_BANK_FLEECA"
BankName = "Fleeca Bank"
end
SMS_Message(BankIcon, BankName, Message[Language]['account_information'], Message[Language]['account_nomoney'], true)
else
if PayWithBank == 1 then
-- Put YOUR code to deduct the amount from the players BANK account here
-- 'Basic Example': PlayerBankMoney = PlayerBankMoney - TicketPrice
else
-- Put YOUR code to deduct the amount from the players CASH money account here
-- 'Basic Example': PlayerCash = PlayerCash - TicketPrice
end
SMS_Message("CHAR_LS_TOURIST_BOARD", Message[Language]['los_santos_transit'], Message[Language]['tourist_information'], Message[Language]['ticket_purchased'], true)
PlayerHasMetroTicket = true
end
IsPlayerUsingTicketMachine = false
end
else
ShowedBuyTicketHelper = false
end
if PlayerDetectedInMetro then
if ReportTerroristOnMetro == true then
if GetPlayerWantedLevel(PlayerId()) < 4 then
if IsPedShooting(GetPlayerPed(-1)) then
SetPlayerWantedLevel(PlayerId(), 4, 0)
SetPlayerWantedLevelNow(PlayerId(), 0)
SMS_Message("CHAR_LS_TOURIST_BOARD", Message[Language]['los_santos_transit'], Message[Language]['tourist_information'], Message[Language]['terrorist'], true)
end
end
end
end
end
end)
Citizen.CreateThread(function()
--=======================================================================================
-- Note only do this 'check' every 550ms to prevent
-- to much load in the game (taking in account many other scripts also running of course)
--=======================================================================================
while true do
Wait(550)
-- We only have to check this part if the player is NOT on the metro.
if not PlayerDetectedInMetro then
playerPed = PlayerPedId()
IsPlayerInVehicle = IsPedInAnyVehicle(playerPed, true)
if not IsPlayerInVehicle then
-- Only show the "Press [E] to buy...." message near the ticket machine if the player does NOT own a ticket already
-- Do note that it IS possible to 'activate' the ticket machine again though (but will give a different message ;) )
x,y,z = table.unpack(GetEntityCoords(playerPed, true))
-- And then only need to keep checking (scanning cords) if the player is not near the Ticket Machine (anymore)
if not IsPlayerNearTicketMachine then
for k,v in pairs(TicketMachines) do
TicketMachine = GetClosestObjectOfType(x, y, z, 0.75, GetHashKey(v), false)
if DoesEntityExist(TicketMachine) then
currentTicketMachine = TicketMachine
TicketMX, TicketMY, TicketMZ = table.unpack(GetOffsetFromEntityInWorldCoords(TicketMachine, 0.0, -.85, 0.0))
IsPlayerNearTicketMachine = true
end
end
else
if not DoesEntityExist(currentTicketMachine) then
IsPlayerNearTicketMachine = false -- If for some (weird) reasons the ticked machine (suddenly)
else --doesn't exist anymore, tell the script that the player isn't near one anymore
if GetDistanceBetweenCoords(x,y,z, TicketMX, TicketMY, TicketMZ, true) > 2.0 then
IsPlayerNearTicketMachine = false -- And do the same if the player is more than a radius of 2.0 away from the ticket machine
end
end
end
end
end
end
end)
-- This is the function which is used to display 'SMS Style messages'
-- If you need more/other icons to display, then make sure to check out:
-- https://wiki.gtanet.work/index.php?title=Notification_Pictures
-- YES YES, I KNOW! it's 'a competitor' :P but it's definitly a good
-- resource for fellow modders :)
function SMS_Message(NotiPic, SenderName, Subject, MessageText, PlaySound)
SetNotificationTextEntry("STRING")
AddTextComponentString(MessageText)
SetNotificationBackgroundColor(140)
SetNotificationMessage(NotiPic, NotiPic, true, 4, SenderName, Subject, MessageText)
DrawNotification(false, true)
if PlaySound then
PlaySoundFrontend(GetSoundId(), "Text_Arrive_Tone", "Phone_SoundSet_Default", true)
end
end
-- This is the text 'helper' which is used at the top left for messages like 'Press [E] to buy ticket ($25)'
function DisplayHelpText(str)
SetTextComponentFormat("STRING")
AddTextComponentString(str)
DisplayHelpTextFromStringLabel(0, 0, 1, -1)
EndTextCommandDisplayHelp(0, 0, true, 2000)
end
-- Using a RayCast to detect if the player is trying to get into the train
-- This is needed since it's not possible (yet) to detect the train model with
-- the normal native calls
function getVehicleInDirection(coordFrom, coordTo)
local rayHandle = CastRayPointToPoint(coordFrom.x, coordFrom.y, coordFrom.z, coordTo.x, coordTo.y, coordTo.z, 10, GetPlayerPed(-1), 0)
local a, b, c, d, vehicle = GetRaycastResult(rayHandle)
return vehicle
end
--==============================================
-- Simple yet effective function to check if
-- player is female or male (sine we only use
-- mp_f_freemode_01 and mp_m_freemode_01 on our
-- server) We need(ed) this function because for
-- some weird reason IsPedMale had some issues
-- with some scripts.
--==============================================
function XNLIsPedFemale(ped)
return IsPedModel(ped, 'mp_f_freemode_01')
end