diff -r c7b4237fff50 -r 03a67e41afbc extensions/sdktools/trnatives.cpp --- a/extensions/sdktools/trnatives.cpp Fri Mar 28 06:21:34 2008 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,394 +0,0 @@ -/** - * vim: set ts=4 : - * ============================================================================= - * SourceMod SDKTools Extension - * Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved. - * ============================================================================= - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, version 3.0, as published by the - * Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. - * - * You should have received a copy of the GNU General Public License along with - * this program. If not, see . - * - * As a special exception, AlliedModders LLC gives you permission to link the - * code of this program (as well as its derivative works) to "Half-Life 2," the - * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software - * by the Valve Corporation. You must obey the GNU General Public License in - * all respects for all other code used. Additionally, AlliedModders LLC grants - * this exception to all derivative works. AlliedModders LLC defines further - * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), - * or . - * - * Version: $Id$ - */ - -#include "extension.h" -#include - -class CSMTraceFilter : public CTraceFilter -{ -public: - bool ShouldHitEntity(IHandleEntity *pEntity, int contentsMask) - { - cell_t res = 1; - edict_t *pEdict = gameents->BaseEntityToEdict(reinterpret_cast(pEntity)); - m_pFunc->PushCell(engine->IndexOfEdict(pEdict)); - m_pFunc->PushCell(contentsMask); - m_pFunc->Execute(&res); - - return (res) ? true : false; - } - void SetFunctionPtr(IPluginFunction *pFunc) - { - m_pFunc = pFunc; - } -private: - IPluginFunction *m_pFunc; -}; - -/* Used for the global trace version */ -Ray_t g_Ray; -trace_t g_Trace; -Vector g_StartVec; -Vector g_EndVec; -QAngle g_DirAngles; -CTraceFilterHitAll g_HitAllFilter; -CSMTraceFilter g_SMTraceFilter; - -enum -{ - RayType_EndPoint, - RayType_Infinite -}; - -static cell_t smn_TRTraceRay(IPluginContext *pContext, const cell_t *params) -{ - cell_t *startaddr, *endaddr; - pContext->LocalToPhysAddr(params[1], &startaddr); - pContext->LocalToPhysAddr(params[2], &endaddr); - - g_StartVec.Init(sp_ctof(startaddr[0]), sp_ctof(startaddr[1]), sp_ctof(startaddr[2])); - - switch (params[4]) - { - case RayType_EndPoint: - { - g_EndVec.Init(sp_ctof(endaddr[0]), sp_ctof(endaddr[1]), sp_ctof(endaddr[2])); - break; - } - case RayType_Infinite: - { - g_DirAngles.Init(sp_ctof(endaddr[0]), sp_ctof(endaddr[1]), sp_ctof(endaddr[2])); - AngleVectors(g_DirAngles, &g_EndVec); - - /* Make it unitary and get the ending point */ - g_EndVec.NormalizeInPlace(); - g_EndVec = g_StartVec + g_EndVec * MAX_TRACE_LENGTH; - break; - } - } - - g_Ray.Init(g_StartVec, g_EndVec); - enginetrace->TraceRay(g_Ray, params[3], &g_HitAllFilter, &g_Trace); - - return 1; -} - -static cell_t smn_TRTraceRayFilter(IPluginContext *pContext, const cell_t *params) -{ - cell_t *startaddr, *endaddr; - IPluginFunction *pFunc; - - pFunc = pContext->GetFunctionById(params[5]); - if (!pFunc) - { - return pContext->ThrowNativeError("Invalid function id (%X)", params[5]); - } - g_SMTraceFilter.SetFunctionPtr(pFunc); - pContext->LocalToPhysAddr(params[1], &startaddr); - pContext->LocalToPhysAddr(params[2], &endaddr); - - g_StartVec.Init(sp_ctof(startaddr[0]), sp_ctof(startaddr[1]), sp_ctof(startaddr[2])); - - switch (params[4]) - { - case RayType_EndPoint: - { - g_EndVec.Init(sp_ctof(endaddr[0]), sp_ctof(endaddr[1]), sp_ctof(endaddr[2])); - break; - } - case RayType_Infinite: - { - g_DirAngles.Init(sp_ctof(endaddr[0]), sp_ctof(endaddr[1]), sp_ctof(endaddr[2])); - AngleVectors(g_DirAngles, &g_EndVec); - - /* Make it unitary and get the ending point */ - g_EndVec.NormalizeInPlace(); - g_EndVec = g_StartVec + g_EndVec * MAX_TRACE_LENGTH; - break; - } - } - - g_Ray.Init(g_StartVec, g_EndVec); - enginetrace->TraceRay(g_Ray, params[3], &g_SMTraceFilter, &g_Trace); - - return 1; -} - -static cell_t smn_TRTraceRayEx(IPluginContext *pContext, const cell_t *params) -{ - cell_t *startaddr, *endaddr; - pContext->LocalToPhysAddr(params[1], &startaddr); - pContext->LocalToPhysAddr(params[2], &endaddr); - - Vector StartVec, EndVec; - Ray_t ray; - - StartVec.Init(sp_ctof(startaddr[0]), sp_ctof(startaddr[1]), sp_ctof(startaddr[2])); - - switch (params[4]) - { - case RayType_EndPoint: - { - EndVec.Init(sp_ctof(endaddr[0]), sp_ctof(endaddr[1]), sp_ctof(endaddr[2])); - break; - } - case RayType_Infinite: - { - QAngle DirAngles; - DirAngles.Init(sp_ctof(endaddr[0]), sp_ctof(endaddr[1]), sp_ctof(endaddr[2])); - AngleVectors(DirAngles, &EndVec); - - /* Make it unitary and get the ending point */ - EndVec.NormalizeInPlace(); - EndVec = StartVec + EndVec * MAX_TRACE_LENGTH; - break; - } - } - - trace_t *tr = new trace_t; - ray.Init(StartVec, EndVec); - enginetrace->TraceRay(ray, params[3], &g_HitAllFilter, tr); - - HandleError herr; - Handle_t hndl; - if (!(hndl=handlesys->CreateHandle(g_TraceHandle, tr, pContext->GetIdentity(), myself->GetIdentity(), &herr))) - { - delete tr; - return pContext->ThrowNativeError("Unable to create a new trace handle (error %d)", herr); - } - - return hndl; -} - -static cell_t smn_TRTraceRayFilterEx(IPluginContext *pContext, const cell_t *params) -{ - IPluginFunction *pFunc; - cell_t *startaddr, *endaddr; - - pFunc = pContext->GetFunctionById(params[5]); - if (!pFunc) - { - return pContext->ThrowNativeError("Invalid function id (%X)", params[5]); - } - pContext->LocalToPhysAddr(params[1], &startaddr); - pContext->LocalToPhysAddr(params[2], &endaddr); - - Vector StartVec, EndVec; - CSMTraceFilter smfilter; - Ray_t ray; - - smfilter.SetFunctionPtr(pFunc); - StartVec.Init(sp_ctof(startaddr[0]), sp_ctof(startaddr[1]), sp_ctof(startaddr[2])); - - switch (params[4]) - { - case RayType_EndPoint: - { - EndVec.Init(sp_ctof(endaddr[0]), sp_ctof(endaddr[1]), sp_ctof(endaddr[2])); - break; - } - case RayType_Infinite: - { - QAngle DirAngles; - DirAngles.Init(sp_ctof(endaddr[0]), sp_ctof(endaddr[1]), sp_ctof(endaddr[2])); - AngleVectors(DirAngles, &EndVec); - - /* Make it unitary and get the ending point */ - EndVec.NormalizeInPlace(); - EndVec = StartVec + EndVec * MAX_TRACE_LENGTH; - break; - } - } - - trace_t *tr = new trace_t; - ray.Init(StartVec, EndVec); - enginetrace->TraceRay(ray, params[3], &smfilter, tr); - - HandleError herr; - Handle_t hndl; - if (!(hndl=handlesys->CreateHandle(g_TraceHandle, tr, pContext->GetIdentity(), myself->GetIdentity(), &herr))) - { - delete tr; - return pContext->ThrowNativeError("Unable to create a new trace handle (error %d)", herr); - } - - return hndl; -} - -static cell_t smn_TRGetFraction(IPluginContext *pContext, const cell_t *params) -{ - trace_t *tr; - HandleError err; - HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); - - if (params[1] == BAD_HANDLE) - { - tr = &g_Trace; - } else if ((err = handlesys->ReadHandle(params[1], g_TraceHandle, &sec, (void **)&tr)) != HandleError_None) { - return pContext->ThrowNativeError("Invalid Handle %x (error %d)", params[1], err); - } - - return sp_ftoc(tr->fraction); -} - -static cell_t smn_TRGetEndPosition(IPluginContext *pContext, const cell_t *params) -{ - trace_t *tr; - HandleError err; - HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); - - if (params[2] == BAD_HANDLE) - { - tr = &g_Trace; - } else if ((err = handlesys->ReadHandle(params[2], g_TraceHandle, &sec, (void **)&tr)) != HandleError_None) { - return pContext->ThrowNativeError("Invalid Handle %x (error %d)", params[2], err); - } - - cell_t *addr; - pContext->LocalToPhysAddr(params[1], &addr); - - addr[0] = sp_ftoc(tr->endpos.x); - addr[1] = sp_ftoc(tr->endpos.y); - addr[2] = sp_ftoc(tr->endpos.z); - - return 1; -} - -static cell_t smn_TRDidHit(IPluginContext *pContext, const cell_t *params) -{ - trace_t *tr; - HandleError err; - HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); - - if (params[1] == BAD_HANDLE) - { - tr = &g_Trace; - } else if ((err = handlesys->ReadHandle(params[1], g_TraceHandle, &sec, (void **)&tr)) != HandleError_None) { - return pContext->ThrowNativeError("Invalid Handle %x (error %d)", params[1], err); - } - - return tr->DidHit() ? 1 : 0; -} - -static cell_t smn_TRGetHitGroup(IPluginContext *pContext, const cell_t *params) -{ - trace_t *tr; - HandleError err; - HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); - - if (params[1] == BAD_HANDLE) - { - tr = &g_Trace; - } else if ((err = handlesys->ReadHandle(params[1], g_TraceHandle, &sec, (void **)&tr)) != HandleError_None) { - return pContext->ThrowNativeError("Invalid Handle %x (error %d)", params[1], err); - } - - return tr->hitgroup; -} - -static cell_t smn_TRGetEntityIndex(IPluginContext *pContext, const cell_t *params) -{ - trace_t *tr; - HandleError err; - HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); - - if (params[1] == BAD_HANDLE) - { - tr = &g_Trace; - } else if ((err = handlesys->ReadHandle(params[1], g_TraceHandle, &sec, (void **)&tr)) != HandleError_None) { - return pContext->ThrowNativeError("Invalid Handle %x (error %d)", params[1], err); - } - - edict_t *pEdict = gameents->BaseEntityToEdict(tr->m_pEnt); - return engine->IndexOfEdict(pEdict); -} - -static cell_t smn_TRGetPointContents(IPluginContext *pContext, const cell_t *params) -{ - cell_t *vec, *ent; - IHandleEntity *hentity; - Vector pos; - int mask; - - pContext->LocalToPhysAddr(params[1], &vec); - pContext->LocalToPhysAddr(params[2], &ent); - - pos.x = sp_ctof(vec[0]); - pos.y = sp_ctof(vec[1]); - pos.z = sp_ctof(vec[2]); - - if (*ent == -1) - { - mask = enginetrace->GetPointContents(pos); - } else { - mask = enginetrace->GetPointContents(pos, &hentity); - edict_t *pEdict = gameents->BaseEntityToEdict(reinterpret_cast(hentity)); - *ent = engine->IndexOfEdict(pEdict); - } - - return mask; -} - -static cell_t smn_TRGetPointContentsEnt(IPluginContext *pContext, const cell_t *params) -{ - edict_t *pEdict = engine->PEntityOfEntIndex(params[1]); - if (!pEdict || pEdict->IsFree()) - { - return pContext->ThrowNativeError("Entity %d is invalid", params[1]); - } - - cell_t *addr; - Vector pos; - - pContext->LocalToPhysAddr(params[2], &addr); - - pos.x = sp_ctof(addr[0]); - pos.y = sp_ctof(addr[1]); - pos.z = sp_ctof(addr[2]); - - return enginetrace->GetPointContents_Collideable(pEdict->GetCollideable(), pos); -} - -sp_nativeinfo_t g_TRNatives[] = -{ - {"TR_TraceRay", smn_TRTraceRay}, - {"TR_TraceRayEx", smn_TRTraceRayEx}, - {"TR_GetFraction", smn_TRGetFraction}, - {"TR_GetEndPosition", smn_TRGetEndPosition}, - {"TR_GetEntityIndex", smn_TRGetEntityIndex}, - {"TR_DidHit", smn_TRDidHit}, - {"TR_GetHitGroup", smn_TRGetHitGroup}, - {"TR_GetPointContents", smn_TRGetPointContents}, - {"TR_GetPointContentsEnt", smn_TRGetPointContentsEnt}, - {"TR_TraceRayFilter", smn_TRTraceRayFilter}, - {"TR_TraceRayFilterEx", smn_TRTraceRayFilterEx}, - {NULL, NULL} -};