// vim: set ts=4 sw=4 tw=99 noet: // // AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO"). // Copyright (C) The AMX Mod X Development Team. // // This software is licensed under the GNU General Public License, version 3 or higher. // Additional exceptions apply. For full license details, see LICENSE.txt or visit: // https://alliedmods.net/amxmodx-license // // Engine Module // #include "engine.h" bool incmd = false; int DispatchUseForward = 0; int SpawnForward = 0; int PlaybackForward = 0; int DispatchKeyForward = 0; int pfnTouchForward = 0; int pfnThinkForward = 0; int PlayerPreThinkForward = 0; int PlayerPostThinkForward = 0; int ClientKillForward = 0; int ClientImpulseForward = 0; int CmdStartForward = 0; int StartFrameForward = 0; int VexdTouchForward = 0; int VexdServerForward = 0; ke::Vector Impulses; ke::Vector Thinks; ke::Vector Touches; KeyValueData *g_pkvd; bool g_inKeyValue=false; bool g_precachedStuff = false; int fstrcmp(const char *s1, const char *s2) { int i=0; int len1 = strlen(s1); int len2 = strlen(s2); if (len1 != len2) return 0; for (i=0; iimpulse; // incase a plugin alters it auto index = TypeConversion.edict_to_id(pEntity); for (i=0; iCheck == g_cmd->impulse) { retVal = MF_ExecuteForward(Impulses[i]->Forward, (cell)index, (cell)origImpulse); // don't return SUPERCEDE in any way here, // we don't want to break client_impulse forward and access to cmd with [g/s]et_usercmd if (retVal) g_cmd->impulse = 0; } } // client_impulse if (ClientImpulseForward != -1 && origImpulse != 0) { retVal = MF_ExecuteForward(ClientImpulseForward, (cell)index, (cell)origImpulse); if (retVal) g_cmd->impulse = 0; } // client_CmdStart if (CmdStartForward != -1) { incmd = true; retVal = MF_ExecuteForward(CmdStartForward, (cell)index); incmd = false; if (retVal) RETURN_META(MRES_SUPERCEDE); } RETURN_META(MRES_IGNORED); } void ClientKill(edict_t *pEntity) { if (ClientKillForward != -1) { if (MF_ExecuteForward(ClientKillForward, (cell)TypeConversion.edict_to_id(pEntity))) { RETURN_META(MRES_SUPERCEDE); } } RETURN_META(MRES_IGNORED); } void PlayerPreThink(edict_t *pEntity) { if (PlayerPreThinkForward != -1) { MF_ExecuteForward(PlayerPreThinkForward, (cell)TypeConversion.edict_to_id(pEntity)); } RETURN_META(MRES_IGNORED); } void PlayerPostThink_Post(edict_t *pEntity) { auto index = TypeConversion.edict_to_id(pEntity); if(plinfo[index].pViewEnt) { edict_t *pCamEnt = plinfo[index].pViewEnt; MAKE_VECTORS(pEntity->v.v_angle + pEntity->v.punchangle); Vector vecSrc = pEntity->v.origin + pEntity->v.view_ofs; Vector vecAiming = gpGlobals->v_forward; TraceResult tr; switch(plinfo[index].iViewType) { case CAMERA_3RDPERSON: TRACE_LINE(vecSrc, vecSrc - (vecAiming * 128), ignore_monsters, ENT(pEntity), &tr); SET_VIEW(pEntity, pCamEnt); pCamEnt->v.origin = tr.vecEndPos; pCamEnt->v.angles = pEntity->v.v_angle; break; case CAMERA_UPLEFT: TRACE_LINE(vecSrc, vecSrc - ((vecAiming * 32) - ((gpGlobals->v_right * 15) + (gpGlobals->v_up * 15))), ignore_monsters, ENT(pEntity), &tr); SET_VIEW(pEntity, pCamEnt); pCamEnt->v.origin = tr.vecEndPos; pCamEnt->v.angles = pEntity->v.v_angle; break; case CAMERA_TOPDOWN: TRACE_LINE(vecSrc, vecSrc + Vector(0,0,2048), dont_ignore_monsters, ENT(pEntity), &tr); SET_VIEW(pEntity, pCamEnt); pCamEnt->v.origin = tr.vecEndPos; pCamEnt->v.origin.z -= 40; pCamEnt->v.angles = Vector(90,pEntity->v.v_angle.y,0); break; default: SET_VIEW(pEntity, pEntity); REMOVE_ENTITY(plinfo[index].pViewEnt); plinfo[index].iViewType = CAMERA_NONE; plinfo[index].pViewEnt = NULL; break; } } if (PlayerPostThinkForward != -1) { if (MF_ExecuteForward(PlayerPostThinkForward, (cell)index)) RETURN_META(MRES_SUPERCEDE); } RETURN_META(MRES_IGNORED); } void pfnTouch(edict_t *pToucher, edict_t *pTouched) { unsigned int i = 0; int retVal = 0; const char *ptrClass = STRING(pToucher->v.classname); const char *ptdClass = STRING(pTouched->v.classname); int ptrIndex = TypeConversion.edict_to_id(pToucher); int ptdIndex = TypeConversion.edict_to_id(pTouched); META_RES res=MRES_IGNORED; for (i=0; iToucher.length() == 0) { if (Touches[i]->Touched.length() == 0) { retVal = MF_ExecuteForward(Touches[i]->Forward, (cell)ptrIndex, (cell)ptdIndex); if (retVal & 2/*PLUGIN_HANDLED_MAIN*/) RETURN_META(MRES_SUPERCEDE); else if (retVal) res=MRES_SUPERCEDE; } else if (Touches[i]->Touched.compare(ptdClass)==0) { retVal = MF_ExecuteForward(Touches[i]->Forward, (cell)ptrIndex, (cell)ptdIndex); if (retVal & 2/*PLUGIN_HANDLED_MAIN*/) RETURN_META(MRES_SUPERCEDE); else if (retVal) res=MRES_SUPERCEDE; } } else if (Touches[i]->Toucher.compare(ptrClass)==0) { if (Touches[i]->Touched.length() == 0) { retVal = MF_ExecuteForward(Touches[i]->Forward, (cell)ptrIndex, (cell)ptdIndex); if (retVal & 2/*PLUGIN_HANDLED_MAIN*/) RETURN_META(MRES_SUPERCEDE); else if (retVal) res=MRES_SUPERCEDE; } else if (Touches[i]->Touched.compare(ptdClass)==0) { retVal = MF_ExecuteForward(Touches[i]->Forward, (cell)ptrIndex, (cell)ptdIndex); if (retVal & 2/*PLUGIN_HANDLED_MAIN*/) RETURN_META(MRES_SUPERCEDE); else if (retVal) res=MRES_SUPERCEDE; } } } /* Execute pfnTouch forwards */ if (pfnTouchForward != -1) { retVal = MF_ExecuteForward(pfnTouchForward, (cell)ptrIndex, (cell)ptdIndex); if (retVal) RETURN_META(MRES_SUPERCEDE); } if (VexdTouchForward != -1) { retVal = MF_ExecuteForward(VexdTouchForward, (cell)ptrIndex, (cell)ptdIndex); if (retVal) RETURN_META(MRES_SUPERCEDE); } RETURN_META(res); } void Think(edict_t *pent) { unsigned int i = 0; const char *cls = STRING(pent->v.classname); META_RES res=MRES_IGNORED; int retVal=0; for (i=0; iClass.compare(cls)==0) { retVal=MF_ExecuteForward(Thinks[i]->Forward, (cell)TypeConversion.edict_to_id(pent)); if (retVal & 2/*PLUGIN_HANDLED_MAIN*/) RETURN_META(MRES_SUPERCEDE); else if (retVal) res=MRES_SUPERCEDE; } } retVal=MF_ExecuteForward(pfnThinkForward, (cell)TypeConversion.edict_to_id(pent)); if (retVal) res=MRES_SUPERCEDE; RETURN_META(res); }