CreateColPolygon: Difference between revisions
Jump to navigation
Jump to search
mNo edit summary |
Zangomangu (talk | contribs) (Removed old issue) |
||
(26 intermediate revisions by 16 users not shown) | |||
Line 1: | Line 1: | ||
__NOTOC__ | __NOTOC__ | ||
{{Server client function}} | {{Server client function}} | ||
This function creates a collision polygon. See [http://en.wikipedia.org/wiki/Polygon Wikipedia] for a definition of a polygon. The first set of X Y of this shape is not part of the colshape bounds, so can set anywhere in the game world, however for performance, place it | {{Note|For this function to work correctly, get/set your bound points in an anti-clockwise fashion.}} | ||
{{Note|Even though this is a 2D colshape, [[isElementWithinColShape]] returns false if an element is in the area but below 0 Z height.}} | |||
This function creates a collision polygon. See [http://en.wikipedia.org/wiki/Polygon Wikipedia] for a definition of a polygon. The first set of X Y of this shape is not part of the colshape bounds, so can set anywhere in the game world, however for performance, place it as close to the centre of the polygon as you can. It should be noted this shape is '''2D'''. There should be at least 3 bound points set. | |||
{{VisualizeColshape}} | |||
==Syntax== | ==Syntax== | ||
<syntaxhighlight lang="lua"> | <syntaxhighlight lang="lua"> | ||
colshape createColPolygon ( float | colshape createColPolygon ( float fCenterX, float fCenterY, float fX1, float fY1, float fX2, float fY2, float fX3, float fY3, ... ) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
[[File:colpolygon_example.png|thumb|example]] | |||
{{OOP| |ColShape.Polygon||}} | |||
===Required Arguments=== | ===Required Arguments=== | ||
*''' | *'''fCenterX:''' The X position of the collision polygon's position - the position that will be returned from [[getElementPosition]]. | ||
*''' | *'''fCenterY:''' The Y position of the collision polygon's position - the position that will be returned from [[getElementPosition]]. | ||
*''' | *'''fX1:''' The 1st X position of the collision polygon's bound point | ||
*'''fX2:''' The | *'''fY1:''' The 1st Y position of the collision polygon's bound point | ||
*'''fX3:''' The | *'''fX2:''' The 2nd X position of the collision polygon's bound point | ||
*'''...''' From the 3rd position you can have as many points as you require to create the colshape. | *'''fY2:''' The 2nd Y position of the collision polygon's bound point | ||
*'''fX3:''' The 3rd X position of the collision polygon's bound point | |||
*'''fY3:''' The 3rd Y position of the collision polygon's bound point | |||
*'''... :''' From the 3rd position you can have as many points as you require to create the colshape. | |||
===Returns=== | ===Returns=== | ||
Line 21: | Line 27: | ||
==Example== | ==Example== | ||
<section name="Server" class="server" show="true"> | <section name="Server" class="server" show="true"> | ||
This example displays a chat message when any element hits the colshape and allows the colshape to be created using a console function ''set_zone''. | |||
<syntaxhighlight lang="lua"> | |||
local theZone = false | |||
function shapeHit( element ) | |||
local descriptor = "undefined" | |||
if getElementType( element ) == "player" then | |||
-- Use the player's name | |||
descriptor = getPlayerName( element ) | |||
elseif getElementType( element ) == "vehicle" then | |||
-- Use the vehicle's model name | |||
descriptor = getVehicleName( element ) or descriptor | |||
end | |||
-- Output a message in the chat box for everyone on the server | |||
outputChatBox( descriptor .. " is in the zone!" ) | |||
end | |||
function createZoneCommandHandler( playerSource, commandName, fX, fY, fX1, fY1, fX2, fY2, fX3, fY3, ... ) | |||
-- Verify the player has given us the minimum amount of bound points | |||
if not ( fY and fX and fX1 and fY1 and fX2 and fX3 and fY3 ) then | |||
return outputChatBox( "Syntax: set_zone <X> <Y> <X1> <Y1> <X2> <Y2> <X3> <Y3> [<Xn> <Yn> ...]", playerSource, 255, 100, 100 ) | |||
end | |||
-- Create the collision shape with the numbers from the arguments | |||
local tempCol = createColPolygon( fX, fY, fX1, fY1, fX2, fY2, fX3, fY3, ... ) | |||
if not tempCol then | |||
return outputChatBox( "Error: Couldn't create collision polygon", playerSource, 255, 100, 100 ) | |||
end | |||
-- Destroy the previous collision polygon shape in case we already have one | |||
if isElement( theZone ) then | |||
destroyElement( theZone ) | |||
end | |||
-- Use a variable out-of-scope to keep track of the most recently created collision shape element | |||
theZone = tempCol | |||
-- Attach an event handler to the element to get notified whenever an element hits our collision shape | |||
addEventHandler( "onColShapeHit", tempCol, shapeHit, false ) | |||
outputChatBox( "Success: Collision shape has been created!", playerSource, 100, 255, 100 ) | |||
end | |||
addCommandHandler( "set_zone", createZoneCommandHandler ) | |||
</syntaxhighlight> | |||
</section> | |||
<section name="Server" class="server" show="hide"> | |||
This example displays a chat message when any element hits the colshape and allows the colshape to be created using a console function ''set_wall''. | |||
<syntaxhighlight lang="lua"> | |||
local theWall = false | |||
function shapeHit( element ) | |||
local descriptor = "undefined" | |||
if getElementType( element ) == "player" then | |||
-- Use the player's name | |||
descriptor = getPlayerName( element ) | |||
elseif getElementType( element ) == "vehicle" then | |||
-- Use the vehicle's model name | |||
descriptor = getVehicleName( element ) or descriptor | |||
end | |||
-- Output a message in the chat box for everyone on the server | |||
outputChatBox( descriptor .. " is in the zone!" ) | |||
end | |||
function createWallCommandHandler( playerSource, commandName, fromX, fromY, toX, toY ) | |||
-- Verify the player has given us the minimum amount of bound points | |||
if not ( fromX and fromY and toX and toY ) then | |||
return outputChatBox( "Syntax: set_wall <fromX> <fromY> <toX> <toY>", playerSource, 255, 100, 100 ) | |||
end | |||
-- Calculate the 90° angle for the line between the two coordinates from the arguments | |||
local radian90DegreeAngle = math.atan2(toY - fromY, toX - fromX) + math.pi / 2 | |||
-- Depth/width of the wall | |||
local depth = 1 | |||
-- Pre-calculate the cosinus/sinus distances | |||
local cosinusDepth = math.cos(radian90DegreeAngle) * depth / 2 | |||
local sinusDepth = math.sin(radian90DegreeAngle) * depth / 2 | |||
-- Calculate the points in the game world | |||
local x1, y1 = fromX - cosinusDepth, fromY - sinusDepth | |||
local x2, y2 = toX - cosinusDepth, toY - sinusDepth | |||
local x3, y3 = toX + cosinusDepth, toY + sinusDepth | |||
local x4, y4 = fromX + cosinusDepth, fromY + sinusDepth | |||
-- Create the collision shape with the calculated numbers | |||
local tempCol = createColPolygon( fromX + (toX - fromX) / 2, fromY + (toY - fromY) / 2, x1, y1, x2, y2, x3, y3, x4, y4 ) | |||
if not tempCol then | |||
return outputChatBox( "Error: Couldn't create collision polygon", playerSource, 255, 100, 100 ) | |||
end | |||
-- Destroy the previous collision polygon shape in case we already have one | |||
if isElement( theWall ) then | |||
destroyElement( theWall ) | |||
end | |||
-- Use a variable out-of-scope to keep track of the most recently created collision shape element | |||
theWall = tempCol | |||
-- Attach an event handler to the element to get notified whenever an element hits our collision shape | |||
addEventHandler( "onColShapeHit", tempCol, shapeHit, false ) | |||
outputChatBox( "Success: Collision shape has been created!", playerSource, 100, 255, 100 ) | |||
end | |||
addCommandHandler( "set_wall", createWallCommandHandler ) | |||
</syntaxhighlight> | |||
</section> | </section> | ||
==See Also== | ==See Also== | ||
{{Collision shape functions}} | {{Collision shape functions}} | ||
[[hu:createColPolygon]] |
Latest revision as of 09:51, 30 January 2022
This function creates a collision polygon. See Wikipedia for a definition of a polygon. The first set of X Y of this shape is not part of the colshape bounds, so can set anywhere in the game world, however for performance, place it as close to the centre of the polygon as you can. It should be noted this shape is 2D. There should be at least 3 bound points set.
Tip: To visualize a colshape when writing scripts, use the client console command showcol |
Syntax
colshape createColPolygon ( float fCenterX, float fCenterY, float fX1, float fY1, float fX2, float fY2, float fX3, float fY3, ... )
OOP Syntax Help! I don't understand this!
- Method: ColShape.Polygon(...)
Required Arguments
- fCenterX: The X position of the collision polygon's position - the position that will be returned from getElementPosition.
- fCenterY: The Y position of the collision polygon's position - the position that will be returned from getElementPosition.
- fX1: The 1st X position of the collision polygon's bound point
- fY1: The 1st Y position of the collision polygon's bound point
- fX2: The 2nd X position of the collision polygon's bound point
- fY2: The 2nd Y position of the collision polygon's bound point
- fX3: The 3rd X position of the collision polygon's bound point
- fY3: The 3rd Y position of the collision polygon's bound point
- ... : From the 3rd position you can have as many points as you require to create the colshape.
Returns
Returns a colshape element if successful, false if invalid arguments were passed to the function.
Example
Click to collapse [-]
ServerThis example displays a chat message when any element hits the colshape and allows the colshape to be created using a console function set_zone.
local theZone = false function shapeHit( element ) local descriptor = "undefined" if getElementType( element ) == "player" then -- Use the player's name descriptor = getPlayerName( element ) elseif getElementType( element ) == "vehicle" then -- Use the vehicle's model name descriptor = getVehicleName( element ) or descriptor end -- Output a message in the chat box for everyone on the server outputChatBox( descriptor .. " is in the zone!" ) end function createZoneCommandHandler( playerSource, commandName, fX, fY, fX1, fY1, fX2, fY2, fX3, fY3, ... ) -- Verify the player has given us the minimum amount of bound points if not ( fY and fX and fX1 and fY1 and fX2 and fX3 and fY3 ) then return outputChatBox( "Syntax: set_zone <X> <Y> <X1> <Y1> <X2> <Y2> <X3> <Y3> [<Xn> <Yn> ...]", playerSource, 255, 100, 100 ) end -- Create the collision shape with the numbers from the arguments local tempCol = createColPolygon( fX, fY, fX1, fY1, fX2, fY2, fX3, fY3, ... ) if not tempCol then return outputChatBox( "Error: Couldn't create collision polygon", playerSource, 255, 100, 100 ) end -- Destroy the previous collision polygon shape in case we already have one if isElement( theZone ) then destroyElement( theZone ) end -- Use a variable out-of-scope to keep track of the most recently created collision shape element theZone = tempCol -- Attach an event handler to the element to get notified whenever an element hits our collision shape addEventHandler( "onColShapeHit", tempCol, shapeHit, false ) outputChatBox( "Success: Collision shape has been created!", playerSource, 100, 255, 100 ) end addCommandHandler( "set_zone", createZoneCommandHandler )
Click to expand [+]
ServerSee Also
- addColPolygonPoint
- createColCircle
- createColCuboid
- createColPolygon
- createColRectangle
- createColSphere
- createColTube
- getColPolygonHeight
- getColPolygonPoints
- getColPolygonPointPosition
- getColShapeType
- getColShapeRadius
- getColShapeSize
- getElementColShape
- getElementsWithinColShape
- isElementWithinColShape
- isInsideColShape
- removeColPolygonPoint
- setColPolygonHeight
- setColPolygonPointPosition
- setColShapeRadius
- setColShapeSize