plugins/include/sdktools_trace.inc
author David Anderson <dvander@alliedmods.net>
Wed Feb 27 13:46:41 2008 +0000 (2008-02-27)
changeset 1899 65e152e87873
parent 1860 6bf7b6d49686
child 1947 e73a1e51833b
permissions -rw-r--r--
fixed amb1487 (sm_slap for negative damage)
dvander@1859
     1
/**
dvander@1859
     2
 * vim: set ts=4 :
dvander@1859
     3
 * =============================================================================
dvander@1859
     4
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@1859
     5
 * =============================================================================
dvander@1859
     6
 *
dvander@1859
     7
 * This file is part of the SourceMod/SourcePawn SDK.
dvander@1859
     8
 *
dvander@1859
     9
 * This program is free software; you can redistribute it and/or modify it under
dvander@1859
    10
 * the terms of the GNU General Public License, version 3.0, as published by the
dvander@1859
    11
 * Free Software Foundation.
dvander@1859
    12
 * 
dvander@1859
    13
 * This program is distributed in the hope that it will be useful, but WITHOUT
dvander@1859
    14
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@1859
    15
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
dvander@1859
    16
 * details.
dvander@1859
    17
 *
dvander@1859
    18
 * You should have received a copy of the GNU General Public License along with
dvander@1859
    19
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@1859
    20
 *
dvander@1859
    21
 * As a special exception, AlliedModders LLC gives you permission to link the
dvander@1859
    22
 * code of this program (as well as its derivative works) to "Half-Life 2," the
dvander@1859
    23
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
dvander@1859
    24
 * by the Valve Corporation.  You must obey the GNU General Public License in
dvander@1859
    25
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
dvander@1859
    26
 * this exception to all derivative works.  AlliedModders LLC defines further
dvander@1859
    27
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
dvander@1859
    28
 * or <http://www.sourcemod.net/license.php>.
dvander@1859
    29
 *
dvander@1859
    30
 * Version: $Id$
dvander@1859
    31
 */
dvander@1859
    32
dvander@1859
    33
#if defined _sdktools_trace_included
dvander@1859
    34
 #endinput
dvander@1859
    35
#endif
dvander@1859
    36
#define _sdktools_trace_included
dvander@1859
    37
dvander@1859
    38
#define	CONTENTS_EMPTY			0		/**< No contents. */
dvander@1859
    39
#define	CONTENTS_SOLID			0x1		/**< an eye is never valid in a solid . */
dvander@1859
    40
#define	CONTENTS_WINDOW			0x2		/**< translucent, but not watery (glass). */
dvander@1859
    41
#define	CONTENTS_AUX			0x4
dvander@1859
    42
#define	CONTENTS_GRATE			0x8		/**< alpha-tested "grate" textures.  Bullets/sight pass through, but solids don't. */
dvander@1859
    43
#define	CONTENTS_SLIME			0x10
dvander@1859
    44
#define	CONTENTS_WATER			0x20
dvander@1859
    45
#define	CONTENTS_MIST			0x40
dvander@1859
    46
#define CONTENTS_OPAQUE			0x80		/**< things that cannot be seen through (may be non-solid though). */
dvander@1859
    47
#define	LAST_VISIBLE_CONTENTS	0x80
dvander@1859
    48
#define ALL_VISIBLE_CONTENTS 	(LAST_VISIBLE_CONTENTS | (LAST_VISIBLE_CONTENTS-1))
dvander@1859
    49
#define CONTENTS_TESTFOGVOLUME	0x100
dvander@1859
    50
#define CONTENTS_UNUSED5		0x200
dvander@1859
    51
#define CONTENTS_UNUSED6		0x4000
dvander@1859
    52
#define CONTENTS_TEAM1			0x800		/**< per team contents used to differentiate collisions. */
dvander@1859
    53
#define CONTENTS_TEAM2			0x1000		/**< between players and objects on different teams. */
dvander@1859
    54
#define CONTENTS_IGNORE_NODRAW_OPAQUE	0x2000		/**< ignore CONTENTS_OPAQUE on surfaces that have SURF_NODRAW. */
dvander@1859
    55
#define CONTENTS_MOVEABLE		0x4000		/**< hits entities which are MOVETYPE_PUSH (doors, plats, etc) */
dvander@1859
    56
#define	CONTENTS_AREAPORTAL		0x8000		/**< remaining contents are non-visible, and don't eat brushes. */
dvander@1859
    57
#define	CONTENTS_PLAYERCLIP		0x10000
dvander@1859
    58
#define	CONTENTS_MONSTERCLIP	0x20000
dvander@1859
    59
dvander@1859
    60
/**
dvander@1859
    61
 * @section currents can be added to any other contents, and may be mixed
dvander@1859
    62
 */
dvander@1859
    63
#define	CONTENTS_CURRENT_0		0x40000
dvander@1859
    64
#define	CONTENTS_CURRENT_90		0x80000
dvander@1859
    65
#define	CONTENTS_CURRENT_180	0x100000
dvander@1859
    66
#define	CONTENTS_CURRENT_270	0x200000
dvander@1859
    67
#define	CONTENTS_CURRENT_UP		0x400000
dvander@1859
    68
#define	CONTENTS_CURRENT_DOWN	0x800000
dvander@1859
    69
dvander@1859
    70
/**
dvander@1859
    71
 * @endsection
dvander@1859
    72
 */
dvander@1859
    73
dvander@1859
    74
#define	CONTENTS_ORIGIN			0x1000000	/**< removed before bsping an entity. */
dvander@1859
    75
#define	CONTENTS_MONSTER		0x2000000	/**< should never be on a brush, only in game. */
dvander@1859
    76
#define	CONTENTS_DEBRIS			0x4000000
dvander@1859
    77
#define	CONTENTS_DETAIL			0x8000000	/**< brushes to be added after vis leafs. */
dvander@1859
    78
#define	CONTENTS_TRANSLUCENT	0x10000000	/**< auto set if any surface has trans. */
dvander@1859
    79
#define	CONTENTS_LADDER			0x20000000
dvander@1859
    80
#define CONTENTS_HITBOX			0x40000000	/**< use accurate hitboxes on trace. */
dvander@1859
    81
dvander@1859
    82
/**
dvander@1859
    83
 * @section Trace masks.
dvander@1859
    84
 */
dvander@1859
    85
#define	MASK_ALL				(0xFFFFFFFF)
dvander@1859
    86
#define	MASK_SOLID				(CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) 			/**< everything that is normally solid */
dvander@1859
    87
#define	MASK_PLAYERSOLID		(CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_PLAYERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) 	/**< everything that blocks player movement */
dvander@1859
    88
#define	MASK_NPCSOLID			(CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTERCLIP|CONTENTS_WINDOW|CONTENTS_MONSTER|CONTENTS_GRATE) /**< blocks npc movement */
dvander@1859
    89
#define	MASK_WATER				(CONTENTS_WATER|CONTENTS_MOVEABLE|CONTENTS_SLIME) 							/**< water physics in these contents */
dvander@1859
    90
#define	MASK_OPAQUE				(CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_OPAQUE) 							/**< everything that blocks line of sight for AI, lighting, etc */
dvander@1859
    91
#define MASK_OPAQUE_AND_NPCS	(MASK_OPAQUE|CONTENTS_MONSTER)										/**< everything that blocks line of sight for AI, lighting, etc, but with monsters added. */
dvander@1859
    92
#define	MASK_VISIBLE			(MASK_OPAQUE|CONTENTS_IGNORE_NODRAW_OPAQUE) 								/**< everything that blocks line of sight for players */
dvander@1859
    93
#define MASK_VISIBLE_AND_NPCS	(MASK_OPAQUE_AND_NPCS|CONTENTS_IGNORE_NODRAW_OPAQUE) 							/**< everything that blocks line of sight for players, but with monsters added. */
dvander@1859
    94
#define	MASK_SHOT				(CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTER|CONTENTS_WINDOW|CONTENTS_DEBRIS|CONTENTS_HITBOX) 	/**< bullets see these as solid */
dvander@1859
    95
#define MASK_SHOT_HULL			(CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTER|CONTENTS_WINDOW|CONTENTS_DEBRIS|CONTENTS_GRATE) 	/**< non-raycasted weapons see this as solid (includes grates) */
dvander@1859
    96
#define MASK_SHOT_PORTAL		(CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW) 							/**< hits solids (not grates) and passes through everything else */
dvander@1859
    97
#define MASK_SOLID_BRUSHONLY	(CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_GRATE) 					/**< everything normally solid, except monsters (world+brush only) */
dvander@1859
    98
#define MASK_PLAYERSOLID_BRUSHONLY	(CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_PLAYERCLIP|CONTENTS_GRATE) 			/**< everything normally solid for player movement, except monsters (world+brush only) */
dvander@1859
    99
#define MASK_NPCSOLID_BRUSHONLY	(CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_WINDOW|CONTENTS_MONSTERCLIP|CONTENTS_GRATE) 			/**< everything normally solid for npc movement, except monsters (world+brush only) */
dvander@1859
   100
#define MASK_NPCWORLDSTATIC		(CONTENTS_SOLID|CONTENTS_WINDOW|CONTENTS_MONSTERCLIP|CONTENTS_GRATE) 					/**< just the world, used for route rebuilding */
dvander@1859
   101
#define MASK_SPLITAREAPORTAL	(CONTENTS_WATER|CONTENTS_SLIME) 									/**< These are things that can split areaportals */
dvander@1859
   102
dvander@1859
   103
/**
dvander@1859
   104
 * @endsection
dvander@1859
   105
 */
dvander@1859
   106
dvander@1859
   107
enum RayType
dvander@1859
   108
{
dvander@1859
   109
	RayType_EndPoint,	/**< The trace ray will go from the start position to the end position. */
dvander@1859
   110
	RayType_Infinite	/**< The trace ray will go from the start position to infinity using a direction vector. */
dvander@1859
   111
};
dvander@1859
   112
dvander@1859
   113
funcenum TraceEntityFilter
dvander@1859
   114
{
dvander@1859
   115
	/**
dvander@1859
   116
	 * Called on entity filtering.
dvander@1859
   117
	 *
dvander@1859
   118
	 * @param entity		Entity index.
dvander@1859
   119
 	 * @param contentsMask	Contents Mask.
dvander@1859
   120
 	 * @return				True to allow the current entity to be hit, otherwise false.
dvander@1859
   121
 	 */
dvander@1859
   122
	bool:public(entity, contentsMask),
dvander@1859
   123
	
dvander@1859
   124
	/**
dvander@1859
   125
	 * Called on entity filtering.
dvander@1859
   126
	 *
dvander@1859
   127
	 * @param entity		Entity index.
dvander@1859
   128
 	 * @param contentsMask	Contents Mask.
dvander@1859
   129
 	 * @param data			Data value, if used.
dvander@1859
   130
 	 * @return				True to allow the current entity to be hit, otherwise false.
dvander@1859
   131
 	 */
dvander@1859
   132
	bool:public(entity, contentsMask, any:data),
dvander@1859
   133
};
dvander@1859
   134
dvander@1859
   135
/**
dvander@1859
   136
 * Get the contents mask and the entity index at the given position.
dvander@1859
   137
 *
dvander@1859
   138
 * @param pos			World position to test.
dvander@1859
   139
 * @param entindex		Entity index found at the given position (by reference).
dvander@1859
   140
 * @return				Contents mask.
dvander@1859
   141
 */
dvander@1859
   142
native TR_GetPointContents(const Float:pos[3], &entindex=-1);
dvander@1859
   143
dvander@1859
   144
/**
dvander@1859
   145
 * Get the point contents testing only the given entity index.
dvander@1859
   146
 *
dvander@1859
   147
 * @param entindex		Entity index to test.
dvander@1859
   148
 * @param pos			World position.
dvander@1859
   149
 * @return				Contents mask.
dvander@1859
   150
 */
dvander@1859
   151
native TR_GetPointContentsEnt(entindex, const Float:pos[3]);
dvander@1859
   152
dvander@1859
   153
/**
dvander@1859
   154
 * Starts up a new trace ray using a global trace result.
dvander@1859
   155
 *
dvander@1859
   156
 * @param pos			Starting position of the ray.
dvander@1859
   157
 * @param vec			Depending on RayType, it will be used as the ending point, or the direction angle.
dvander@1859
   158
 * @param flags			Trace flags.
dvander@1859
   159
 * @param rtype			Method to calculate the ray direction.
dvander@1859
   160
 * @noreturn
dvander@1859
   161
 */
dvander@1859
   162
native TR_TraceRay(const Float:pos[3], const Float:vec[3], flags, RayType:rtype);
dvander@1859
   163
dvander@1859
   164
/**
dvander@1859
   165
 * Starts up a new trace ray using a global trace result and a customized trace ray filter.
dvander@1859
   166
 *
dvander@1859
   167
 * Calling TR_TraceRayFilter or TR_TraceRayFilterEx from inside a filter function is 
dvander@1859
   168
 * currently not allowed and may not work.
dvander@1859
   169
 *
dvander@1859
   170
 * @param pos			Starting position of the ray.
dvander@1859
   171
 * @param vec			Depending on RayType, it will be used as the ending point, or the direction angle.
dvander@1859
   172
 * @param flags			Trace flags.
dvander@1859
   173
 * @param rtype			Method to calculate the ray direction.
dvander@1859
   174
 * @param filter		Function to use as a filter.
dvander@1859
   175
 * @param data			Arbitrary data value to pass through to the filter function.
dvander@1859
   176
 * @noreturn
dvander@1859
   177
 */
dvander@1859
   178
native TR_TraceRayFilter(const Float:pos[3],
dvander@1859
   179
						 const Float:vec[3],
dvander@1859
   180
						 flags,
dvander@1859
   181
						 RayType:rtype,
dvander@1859
   182
						 TraceEntityFilter:filter,
dvander@1859
   183
						 any:data=0);
dvander@1859
   184
dvander@1859
   185
/**
dvander@1859
   186
 * Starts up a new trace ray using a new trace result.
dvander@1859
   187
 *
dvander@1859
   188
 * @param pos			Starting position of the ray.
dvander@1859
   189
 * @param vec			Depending on RayType, it will be used as the ending point, or the direction angle.
dvander@1859
   190
 * @param flags			Trace flags.
dvander@1859
   191
 * @param rtype			Method to calculate the ray direction.
dvander@1859
   192
 * @return				Ray trace handle, which must be closed via CloseHandle().
dvander@1859
   193
 */
dvander@1859
   194
native Handle:TR_TraceRayEx(const Float:pos[3], const Float:vec[3], flags, RayType:rtype);
dvander@1859
   195
dvander@1859
   196
/**
dvander@1859
   197
 * Starts up a new trace ray using a new trace result and a customized trace ray filter.
dvander@1859
   198
 *
dvander@1859
   199
 * Calling TR_TraceRayFilter or TR_TraceRayFilterEx from inside a filter function is 
dvander@1859
   200
 * currently not allowed and may not work.
dvander@1859
   201
 *
dvander@1859
   202
 * @param pos			Starting position of the ray.
dvander@1859
   203
 * @param vec			Depending on RayType, it will be used as the ending point, or the direction angle.
dvander@1859
   204
 * @param flags			Trace flags.
dvander@1859
   205
 * @param rtype			Method to calculate the ray direction.
dvander@1859
   206
 * @param filter		Function to use as a filter.
dvander@1859
   207
 * @param data			Arbitrary data value to pass through to the filter function.
dvander@1859
   208
 * @return				Ray trace handle, which must be closed via CloseHandle().
dvander@1859
   209
 */
dvander@1859
   210
native Handle:TR_TraceRayFilterEx(const Float:pos[3], 
dvander@1859
   211
								  const Float:vec[3],
dvander@1859
   212
								  flags, 
dvander@1859
   213
								  RayType:rtype, 
dvander@1859
   214
								  TraceEntityFilter:filter,
dvander@1859
   215
								  any:data=0);
dvander@1859
   216
dvander@1859
   217
/**
dvander@1859
   218
 * Returns the time fraction from a trace result (1.0 means no collision).
dvander@1859
   219
 *
dvander@1859
   220
 * @param hndl			A trace Handle, or INVALID_HANDLE to use a global trace result.
dvander@1859
   221
 * @return				Time fraction value of the trace.
dvander@1859
   222
 * @error				Invalid Handle.
dvander@1859
   223
 */
dvander@1859
   224
native Float:TR_GetFraction(Handle:hndl=INVALID_HANDLE);
dvander@1859
   225
dvander@1859
   226
/**
dvander@1859
   227
 * Returns the collision position of a trace result.
dvander@1859
   228
 *
dvander@1859
   229
 * @param pos			Vector buffer to store data in.
dvander@1859
   230
 * @param hndl			A trace Handle, or INVALID_HANDLE to use a global trace result.
dvander@1859
   231
 * @noreturn
dvander@1859
   232
 * @error				Invalid Handle.
dvander@1859
   233
 */
dvander@1859
   234
native TR_GetEndPosition(Float:pos[3], Handle:hndl=INVALID_HANDLE);
dvander@1859
   235
dvander@1859
   236
/**
dvander@1859
   237
 * Returns the entity index that collided with the trace.
dvander@1859
   238
 *
dvander@1859
   239
 * @param hndl			A trace Handle, or INVALID_HANDLE to use a global trace result.
dvander@1859
   240
 * @return				Entity index or -1 for no collision.
dvander@1859
   241
 * @error				Invalid Handle.
dvander@1859
   242
 */
dvander@1859
   243
native TR_GetEntityIndex(Handle:hndl=INVALID_HANDLE);
dvander@1859
   244
dvander@1859
   245
/**
dvander@1859
   246
 * Returns if there was any kind of collision along the trace ray.
dvander@1859
   247
 *
dvander@1859
   248
 * @param hndl			A trace Handle, or INVALID_HANDLE to use a global trace result.
dvander@1859
   249
 * @return				True if any collision found, otherwise false.
dvander@1859
   250
 * @error				Invalid Handle.
dvander@1859
   251
 */
dvander@1859
   252
native bool:TR_DidHit(Handle:hndl=INVALID_HANDLE);
dvander@1859
   253
dvander@1859
   254
/**
dvander@1859
   255
 * Returns in which body hit group the trace collided if any.
dvander@1859
   256
 *
dvander@1859
   257
 * @param hndl			A trace Handle, or INVALID_HANDLE to use a global trace result.
dvander@1859
   258
 * @return				Body hit group.
dvander@1859
   259
 * @error				Invalid Handle.
dvander@1859
   260
 */
dvander@1859
   261
native TR_GetHitGroup(Handle:hndl=INVALID_HANDLE);
dvander@1859
   262
dvander@1859
   263
/**
dvander@1859
   264
 * Find the normal vector to the collison plane of a trace.
dvander@1859
   265
 *
dvander@1859
   266
 * @param hndl		A trace Handle, or INVALID_HANDLE to use a global trace result.
dvander@1859
   267
 * @param normal	Vector buffer to store the vector normal to the collision plane
dvander@1859
   268
 * @noreturn
dvander@1859
   269
 * @error			Invalid Handle
dvander@1859
   270
 */
dvander@1860
   271
native TR_GetPlaneNormal(Handle:hndl, Float:normal[3]);
dvander@1860
   272