[Release] Safe Zone(s) Updated 9/10/18

So basically you have to have the part that is calling your distance from any one of the coords in the table in a separate function, is what I was missing? Is that what was casuing the horrendous spam(looping i assume?)

Also I see you added a blip as well, niceee. I assume I can just do the same with markers as well. Basically copy paste that block and change up the natives?

Lastly, could you still have used that - for k,v in pairs - in this situation as well? Or is it a different use case all together? What is the difference in the one I was trying to use and the i = 1, #tablename? Ive only seen for k,v in alot of the scripts I have on my server I look through.

Alright, I think this may be the final version :smiley:
Thank you so much for all your help!!!

I think Im also going to rework this into a sort of “No Go Zone” ordeal. Where, instead of doing the FF, it will teleport your back to a specific location if you enter a zone, or maybe even just leave a zone. :smiley:

Maybe be able to just read a players Y coords and trigger when above or below a certain value. Thus keeping players either in the north(what I want :stuck_out_tongue: ) or down in the city. Keep that RP control XD

The first thread executes once and creates the map blips, then it finishes and does not run again.

The second thread loops once every 15 seconds and determines which of the zones in your table is closest to the player coords and then sets that as the closest zone for use by the third thread. I took this approach for performance reasons so you don’t need to loop through the table on every tick. Others may put a big list of coords in there and it becomes a waste of resource.

The third thread is nearly identical to your original single safe zone script with the difference being that it is only looking to see whether the player is within 50 distance of the coords that were defined as closest coords in the prior thread and only runs once a second instead of once per tick.

I only use for k,v loops on tables that are not indexed. If you have a table whose keys are say ped ID’s, vehicle ID’s, names, etc, you have to loop these by key/value. For tables that are indexed like this script has performance is better if you iterate through them by index like I have above. Hope that makes sense.

If you want to have markers in here you have to add the marker in the third thread where it can be run on every tick and change the Citizen.Wait from 1000 to either 0 or 1. If you don’t do that then you will have blinking markers on the screen. You would add the create marker line right after the Citizen.Wait, not inside the if statement(s). Alternatively you could create a fourth thread that does infinite loop with Citizen.Wait 0 or 1 and have that draw the marker for the coords defined by the closestZone variable.

zones[closestZone].x, zones[closestZone].y, zones[closestZone].z

You have some cool ideas, I look forward to seeing where you go with this, has potential to be used in unique game modes :slight_smile:

Damn dood. Thank you again so much for all your help! That explanation was crisp :slight_smile: And thanks! Im just now starting to get an actual grasp this and Im loving it :slight_smile:

how can I do this to this script I saw some server have it

1 Like

Change this part:

TriggerEvent("pNotify:SendNotification",{
					text = "<b style='color:#1E90FF'>You are in a SafeZone</b>",
					type = "success",
					timeout = (3000),
					layout = "bottomcenter",
					queue = "global"
				})

to

DrawMissionText2("Your text", 5000)

( You can use ~r~, ~g~, ~b~, etc. for colors.
So like "You ~r~ ARE NOT ~w~ in a ~g~Safe Zone~w~!
Would be “You” in white | “ARE NOT” in red | " in a " in white | “safe zone” in green | and the ’ ! ’ in white. )

and add this to the bottom of the script:

function DrawMissionText2(m_text, showtime)
	ClearPrints()
	SetTextEntry_2("STRING")
	AddTextComponentString(m_text)
	DrawSubtitleTimed(showtime, 1)
end

Edit: Is that at the bottom of your screen or pNotify?

If its pNotify disregard all of what I said., you will have to refer to the pNoty post:

you can do the writing I gave you in the picture on the bottom left

and post the entire script here?

in the car you can take the gun and shoot and kill someone
get out of the car with your gun and you can kill
you still have working on

Hm, didnt even think to test that! Ill work on that later today or tonight. I assume there is a native for dealing with the ingame DriveBy function. Ill look into it! Thanks for the report!

Edit tested it out and yes, bug indeed.

1 Like

I still dont know what you mean, man. Is that a pNotification or is that just text on your screen at the bottom

Updated with a workaround, for now, to the Issue provided by @kheire007 .

– It disables firing all together now if in the zone.
–If they are able to pull out a gun, pressing the FIRE(LMB) button will cause you to go unarmed and trigger a notification.
–If they have a weapon out and try to access the weapon wheel(TAB) again in the zone it will un-arm them.

1 Like

many thanks :slight_smile:

1 Like

working fine :slight_smile:


1 Like

can you please help me?

Again, I still dont know what you mean because you are not giving me any information.
bottomLeft

I assume you are just asking to move what I have now to the bottom left. So here:

--------------------------------------------------------------------------------------------------------------
------------First off, many thanks to @anders for help with the majority of this script. ---------------------
------------Also shout out to @setro for helping understand pNotify better.              ---------------------
--------------------------------------------------------------------------------------------------------------
------------To configure: Add/replace your own coords in the sectiong directly below.    ---------------------
------------        Goto LINE 90 and change "50" to your desired SafeZone Radius.        ---------------------
------------        Goto LINE 130 to edit the Marker( Holographic circle.)               ---------------------
--------------------------------------------------------------------------------------------------------------
-- Place your own coords here!
local zones = {
	{ ['x'] = 1847.916015625, ['y'] = 3675.8190917968, ['z'] = 33.767009735108},
	{ ['x'] = -1688.43811035156, ['y'] = -1073.62536621094, ['z'] = 13.1521873474121 },
	{ ['x'] = -2195.1352539063, ['y'] = 4288.7290039063, ['z'] = 49.173923492432 }
}

local notifIn = false
local notifOut = false
local closestZone = 1


--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
-------                              Creating Blips at the locations. 							--------------
-------You can comment out this section if you dont want any blips showing the zones on the map.--------------
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------

Citizen.CreateThread(function()
	while not NetworkIsPlayerActive(PlayerId()) do
		Citizen.Wait(0)
	end
	
	for i = 1, #zones, 1 do
		local szBlip = AddBlipForCoord(zones[i].x, zones[i].y, zones[i].z)
		SetBlipAsShortRange(szBlip, true)
		SetBlipColour(szBlip, 2)  --Change the blip color: https://gtaforums.com/topic/864881-all-blip-color-ids-pictured/
		SetBlipSprite(szBlip, 398) -- Change the blip itself: https://marekkraus.sk/gtav/blips/list.html
		BeginTextCommandSetBlipName("STRING")
		AddTextComponentString("SAFE ZONE") -- What it will say when you hover over the blip on your map.
		EndTextCommandSetBlipName(szBlip)
	end
end)

--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
----------------   Getting your distance from any one of the locations  --------------------------------------
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------

Citizen.CreateThread(function()
	while not NetworkIsPlayerActive(PlayerId()) do
		Citizen.Wait(0)
	end
	
	while true do
		local playerPed = GetPlayerPed(-1)
		local x, y, z = table.unpack(GetEntityCoords(playerPed, true))
		local minDistance = 100000
		for i = 1, #zones, 1 do
			dist = Vdist(zones[i].x, zones[i].y, zones[i].z, x, y, z)
			if dist < minDistance then
				minDistance = dist
				closestZone = i
			end
		end
		Citizen.Wait(15000)
	end
end)

--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
---------   Setting of friendly fire on and off, disabling your weapons, and sending pNoty   -----------------
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------

Citizen.CreateThread(function()
	while not NetworkIsPlayerActive(PlayerId()) do
		Citizen.Wait(0)
	end
	
	while true do
		Citizen.Wait(0)
		local player = GetPlayerPed(-1)
		local x,y,z = table.unpack(GetEntityCoords(player, true))
		local dist = Vdist(zones[closestZone].x, zones[closestZone].y, zones[closestZone].z, x, y, z)
	
		if dist <= 50.0 then  ------------------------------------------------------------------------------ Here you can change the RADIUS of the Safe Zone. Remember, whatever you put here will DOUBLE because 
			if not notifIn then																			  -- it is a sphere. So 50 will actually result in a diameter of 100. I assume it is meters. No clue to be honest.
				NetworkSetFriendlyFireOption(false)
				ClearPlayerWantedLevel(PlayerId())
				SetCurrentPedWeapon(player,GetHashKey("WEAPON_UNARMED"),true)
				TriggerEvent("pNotify:SendNotification",{
					text = "<b style='color:#1E90FF'>Esti in SafeZone</b>",
					type = "success",
					timeout = (3000),
					layout = "bottomLeft",
					queue = "global"
				})
				notifIn = true
				notifOut = false
			end
		else
			if not notifOut then
				NetworkSetFriendlyFireOption(true)
				TriggerEvent("pNotify:SendNotification",{
					text = "<b style='color:#1E90FF'>You are in NO LONGER a SafeZone</b>",
					type = "error",
					timeout = (3000),
					layout = "bottomLeft",
					queue = "global"
				})
				notifOut = true
				notifIn = false
			end
		end
		if notifIn then
		DisableControlAction(2, 37, true) -- disable weapon wheel (Tab)
		DisablePlayerFiring(player,true) -- Disables firing all together if they somehow bypass inzone Mouse Disable
      	DisableControlAction(0, 106, true) -- Disable in-game mouse controls
			if IsDisabledControlJustPressed(2, 37) then --if Tab is pressed, send error message
				SetCurrentPedWeapon(player,GetHashKey("WEAPON_UNARMED"),true) -- if tab is pressed it will set them to unarmed (this is to cover the vehicle glitch until I sort that all out)
				TriggerEvent("pNotify:SendNotification",{
					text = "<b style='color:#1E90FF'>You can not use weapons in a Safe Zone</b>",
					type = "error",
					timeout = (3000),
					layout = "bottomLeft",
					queue = "global"
				})
			end
			if IsDisabledControlJustPressed(0, 106) then --if LeftClick is pressed, send error message
				SetCurrentPedWeapon(player,GetHashKey("WEAPON_UNARMED"),true) -- If they click it will set them to unarmed
				TriggerEvent("pNotify:SendNotification",{
					text = "<b style='color:#1E90FF'>You can not do that in a Safe Zone</b>",
					type = "error",
					timeout = (3000),
					layout = "bottomLeft",
					queue = "global"
				})
			end
		end
		-- Comment out lines 142 - 145 if you dont want a marker.
	 	if DoesEntityExist(player) then	      --The -1.0001 will place it on the ground flush		-- SIZING CIRCLE |  x    y    z | R   G    B   alpha| *more alpha more transparent*
	 		DrawMarker(1, zones[closestZone].x, zones[closestZone].y, zones[closestZone].z-1.0001, 0, 0, 0, 0, 0, 0, 100.0, 100.0, 2.0, 13, 232, 255, 155, 0, 0, 2, 0, 0, 0, 0) -- heres what all these numbers are. Honestly you dont really need to mess with any other than what isnt 0.
	 		--DrawMarker(type, float posX, float posY, float posZ, float dirX, float dirY, float dirZ, float rotX, float rotY, float rotZ, float scaleX, float scaleY, float scaleZ, int red, int green, int blue, int alpha, BOOL bobUpAndDown, BOOL faceCamera, int p19(LEAVE AS 2), BOOL rotate, char* textureDict, char* textureName, BOOL drawOnEnts)
	 	end

You will have to change the other lines to whatever language you are using.

how can I make it appear in the picture when in SafeZone without notification, I have a letter like that on the left of the screen

when I’m in safe zone

You could try to use


                SetTextFont(0)
                SetTextProportional(1)
                SetTextScale(0.0, 0.3)
                SetTextColour(128, 128, 128, 255)
                SetTextDropshadow(0, 0, 0, 0, 255)
                SetTextEdge(1, 0, 0, 0, 255)
                SetTextDropShadow()
                SetTextOutline()
                SetTextEntry("STRING")
                AddTextComponentString("YOUR TEXT HERE")
                DrawText(0.005, 0.005)

and

“DrawText(0.005, 0.005)” are the X and Y position on the screen

if you can insert what you gave me in your script without the other notifications?

Try and replace

TriggerEvent("pNotify:SendNotification",{
					text = "<b style='color:#1E90FF'>You can not do that in a Safe Zone</b>",
					type = "error",
					timeout = (3000),
					layout = "bottomLeft",
					queue = "global"
				})
			end

with the stuff above. Learn by doing my man. Youll never learn if you dont mess around with it.

Ive never used them I just searched “Draw Text on Scren Five M”

Explains this draws the text on screen permanently if you put it in a loop. So if have it when you are in the zone, or out of the zone it should draw what you put in “YOUR TEXT HERE”

hey friend
we can still fight in the safezone if you press other key to fight it works for exemple key, mine is r i think we have two keys to fight
and can you make the peoples like in godmod because they can die if i shot them outside the circle.



you must close the fight