SetElementPosition: Difference between revisions

From Multi Theft Auto: Wiki
Jump to navigation Jump to search
m (fix oop syntax)
m (Undo revision 79831 by AliiAm (talk))
Tag: Undo
 
(22 intermediate revisions by 13 users not shown)
Line 1: Line 1:
__NOTOC__
__NOTOC__
{{Server client function}}
{{Shared function}}
This function sets the position of an element to the specified coordinates.
This function sets the position of an element to the specified coordinates.
 
{{Warning|Do not use this function to spawn a [[player]]. It will cause problems with other functions like [[warpPedIntoVehicle]]. Use [[spawnPlayer]] instead.}}
<div style="background: #FF7070; border: 3px solid #FF0000;">
'''Attention:''' Do not use this function to spawn a [[ped]]/[[player]]. It will cause problems with other functions like [[warpPedIntoVehicle]]. <br>
Use [[spawnPlayer]] and [[createPed]] instead.
</div>


==Syntax==  
==Syntax==  
Line 12: Line 8:
bool setElementPosition ( element theElement, float x, float y, float z [, bool warp = true ] )   
bool setElementPosition ( element theElement, float x, float y, float z [, bool warp = true ] )   
</syntaxhighlight>  
</syntaxhighlight>  
{{OOP||[[element]]:setPosition|position|}}
{{OOP||[[element]]:setPosition|position|getElementPosition}}


===Required Arguments===  
===Required Arguments===  
Line 26: Line 22:
Returns ''true'' if the function was successful, ''false'' otherwise.
Returns ''true'' if the function was successful, ''false'' otherwise.


==Example==  
==Example==
<section name="Example 1" class="server" show="true">
<section name="Server" class="server" show="true">
This example adds a "setpos" command to console, which allows setting of a player's position.
This example lets admins teleport 5 random players to themselves
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
function consoleSetPlayerPosition ( source, commandName, posX, posY, posZ )
function randomPlayersToLocation(p)
setElementPosition ( source, posX, posY, posZ )
    if not isPlayerStaff(p) then return end
 
local playersOnline = getElementsByType("player")
local amount = #playersOnline
 
if amount == 0 then return end
 
for index = 1,(amount > 5 and 5 or amount) do
local player = playersOnline[index]
setElementPosition(player, getElementPosition(p))
end
end
end
addCommandHandler ( "setpos", consoleSetPlayerPosition  )
addCommandHandler("randomtp", randomPlayersToLocation)
</syntaxhighlight>
addCommandHandler("playershere", randomPlayersToLocation)
</section>
 
<section name="Example 2" class="client" show="false">
-- Utility function
This example adds a "setpos" command to console, which allows setting of the local player's position.
local staffACLs = {
<syntaxhighlight lang="lua">
    aclGetGroup("Admin"),
function consoleSetPlayerPosition ( commandName, posX, posY, posZ )
    aclGetGroup("Moderator")
setElementPosition ( getLocalPlayer(), posX, posY, posZ )
}
end
 
addCommandHandler ( "setpos", consoleSetPlayerPosition  )
function isPlayerStaff(p)
</syntaxhighlight>
if isElement(p) and getElementType(p) == "player" and not isGuestAccount(getPlayerAccount(p)) then
</section>
local object = getAccountName(getPlayerAccount(p))
<section name="Example 3" class="server" show="false">
 
This example enables a player to type /warpto <playername> to warp to them. If the player being warped to is in a vehicle with a free passenger seat, it will warp into the vehicle.
for _, group in ipairs(staffACLs) do
<syntaxhighlight lang="lua">
if isObjectInACLGroup("user." .. object, group) then
function consoleWarpTo ( sourcePlayer, commandName, player2nick )
return true
-- Make sure required parameters are set
if ( not sourcePlayer or not player2nick ) then return end
-- Setup the variables we will be using for teleportation
local x, y, z, r, d = 0, 0, 0, 0, 2.5
-- Grab the element identifier of the player we are trying to warp to
local player2 = getPlayerFromNick ( player2nick )
-- Make sure it exists!
if ( player2 ) then
-- Is the player we're warping to in a vehicle?
if ( isPlayerInVehicle ( player2 ) ) then
-- Indeed they are, let's get the vehicle information such as the vehicle element itself, and the seats it's got.
local player2vehicle = getPlayerOccupiedVehicle ( player2 )
local numseats = getVehicleMaxPassengers ( player2vehicle )
local i = 0
-- Loop over the seats to see if there's a free one
while ( i < numseats ) do
if ( getVehicleOccupant ( player2vehicle, i ) ) then
-- This seat isn't free, go ahead and check the next one
i = i + 1
else
-- This seat is free, get out of the loop
break
end
end
end
-- Check if 'i' is lower than the number of seats. If it is, it means it's the number of a free seat
if ( i < numseats ) then
-- Teleport the player into the seat
warpPlayerIntoVehicle ( sourcePlayer, player2vehicle, i )
else
-- There are no free seats, tell the player that.
outputChatBox ( "Sorry, the player's vehicle is full (" .. getVehicleName ( player2vehicle ) .. " " .. i .. "/" .. numseats .. ")", sourcePlayer )
end
else
-- The player isn't in a vehicle, let's get the player's position and warp to them.
x, y, z = getElementPosition ( player2 )
r = getPlayerRotation ( player2 )
-- Make sure we get interior data, they might be inside one!
interior = getElementInterior ( player2 )
dimension = getElementDimension ( player2 )
-- Do some funky math to make sure that we dont teleport inside of them (get us both stuck inside each other)
x = x - ( ( math.cos ( math.rad ( r + 90 ) ) ) * d )
y = y - ( ( math.sin ( math.rad ( r + 90 ) ) ) * d )
-- Set a few timers for setting interiors, dimensions and positions
setTimer ( setElementInterior, 800, 1, sourcePlayer, interior )
setTimer ( setElementDimension, 900, 1, sourcePlayer, dimension )
setTimer ( setElementPosition, 1000, 1, sourcePlayer, x, y, z )
setTimer ( setPlayerRotation, 1000, 1, sourcePlayer, r )
-- Fade the camera to make it look nicer
fadeCamera ( sourcePlayer, false, 1, 0, 0, 0 )
-- Fade it back once it's all complete!
setTimer ( fadeCamera, 1000, 1, sourcePlayer, true, 1 )
end
end
else
-- No player by the specified name was found, tell the warper this.
outputChatBox ( "No such player.", sourcePlayer )
end
end
return false
end
end
addCommandHandler ( "warpto", consoleWarpTo )
</syntaxhighlight>
</syntaxhighlight>
</section>
</section>
If you want to put a vehicle or player out of the water or simulate the position-resetting behaviour if CJ goes below the ground too far, then you need to retrieve a recommended coordinate on ground to place the element at. Take a look at [https://forum.mtasa.com/topic/132891-important-helprespawn-vehicle/?do=findComment&comment=1003198 this MTA forums post] for steps in the right direction.
==Issues==
{{Issues|
{{Issue|539|Changing player position when he/she has a jetpack will remove the jetpack and bug when skin is changed}}
{{Issue|529|Player falls from his bike when its teleported by setElementPosition}}
}}


==See Also==
==See Also==
{{Element functions}}
{{Element functions}}
[[hu:setElementPosition]]
[[ru:setElementPosition]]

Latest revision as of 18:59, 11 July 2024

This function sets the position of an element to the specified coordinates.

[[|link=|]] Warning: Do not use this function to spawn a player. It will cause problems with other functions like warpPedIntoVehicle. Use spawnPlayer instead.

Syntax

bool setElementPosition ( element theElement, float x, float y, float z [, bool warp = true ] )  

OOP Syntax Help! I don't understand this!

Method: element:setPosition(...)
Variable: .position
Counterpart: getElementPosition


Required Arguments

  • theElement: A valid element to be moved.
  • x: The x coordinate of the destination.
  • y: The y coordinate of the destination.
  • z: The z coordinate of the destination.

Optional Arguments

  • warp: teleports players, resetting any animations they were doing. Setting this to false preserves the current animation.

Returns

Returns true if the function was successful, false otherwise.

Example

Click to collapse [-]
Server

This example lets admins teleport 5 random players to themselves

function randomPlayersToLocation(p)
    if not isPlayerStaff(p) then return end

	local playersOnline = getElementsByType("player")
	local amount = #playersOnline

	if amount == 0 then return end

	for index = 1,(amount > 5 and 5 or amount) do
		local player = playersOnline[index]
		setElementPosition(player, getElementPosition(p))
	end
end
addCommandHandler("randomtp", randomPlayersToLocation)
addCommandHandler("playershere", randomPlayersToLocation)

-- Utility function
local staffACLs = {
    aclGetGroup("Admin"),
    aclGetGroup("Moderator")
}

function isPlayerStaff(p)
	if isElement(p) and getElementType(p) == "player" and not isGuestAccount(getPlayerAccount(p)) then
		local object = getAccountName(getPlayerAccount(p))

		for _, group in ipairs(staffACLs) do
			if isObjectInACLGroup("user." .. object, group) then
				return true
			end
		end
	end
	return false
end

If you want to put a vehicle or player out of the water or simulate the position-resetting behaviour if CJ goes below the ground too far, then you need to retrieve a recommended coordinate on ground to place the element at. Take a look at this MTA forums post for steps in the right direction.

Issues

Issue ID Description
#539 Changing player position when he/she has a jetpack will remove the jetpack and bug when skin is changed
#529 Player falls from his bike when its teleported by setElementPosition

See Also