2
0
mirror of https://github.com/rehlds/metamod-r.git synced 2025-04-24 23:33:38 +03:00

Refactoring

This commit is contained in:
s1lentq 2016-07-26 23:31:47 +07:00
parent 05067b28b5
commit 2e4a5b7c9e
58 changed files with 4059 additions and 6375 deletions

View File

@ -39,7 +39,7 @@ void setupToolchain(NativeBinarySpec b)
{ {
ToolchainConfig cfg = rootProject.createToolchainConfig(b) ToolchainConfig cfg = rootProject.createToolchainConfig(b)
cfg.projectInclude(project, '', '/src', '/include/common', '/include/dlls', '/include/engine', '/include/game_shared', '/include/pm_shared', '/include/public') cfg.projectInclude(project, '', '/src', '/include/common', '/include/dlls', '/include/engine', '/include/game_shared', '/include/pm_shared', '/include/public')
cfg.singleDefines '__METAMOD_BUILD__', '__BUILD_FAST_METAMOD__'; cfg.singleDefines 'METAMOD_CORE';
if (cfg instanceof MsvcToolchainConfig) { if (cfg instanceof MsvcToolchainConfig) {
cfg.compilerOptions.pchConfig = new MsvcToolchainConfig.PrecompiledHeadersConfig( cfg.compilerOptions.pchConfig = new MsvcToolchainConfig.PrecompiledHeadersConfig(
@ -59,8 +59,12 @@ void setupToolchain(NativeBinarySpec b)
'_strnicmp': 'strncasecmp', '_strnicmp': 'strncasecmp',
'_strdup': 'strdup', '_strdup': 'strdup',
'_unlink': 'unlink', '_unlink': 'unlink',
'_write' : 'write',
'_close' : 'close',
'_getcwd' : 'getcwd',
'_vsnprintf': 'vsnprintf', '_vsnprintf': 'vsnprintf',
'_vsnwprintf' : 'vswprintf', '_vsnwprintf': 'vswprintf',
'_snprintf': 'snprintf'
]) ])
cfg.compilerOptions.args '-Qoption,cpp,--treat_func_as_string_literal_cpp', '-msse2', '-fomit-frame-pointer', '-inline-forceinline', '-fvisibility=default', '-fvisibility-inlines-hidden', '-fno-rtti', '-g0', '-s' cfg.compilerOptions.args '-Qoption,cpp,--treat_func_as_string_literal_cpp', '-msse2', '-fomit-frame-pointer', '-inline-forceinline', '-fvisibility=default', '-fvisibility-inlines-hidden', '-fno-rtti', '-g0', '-s'
@ -114,12 +118,6 @@ model {
srcDir "version" srcDir "version"
include "**/*.cpp" include "**/*.cpp"
if (GradleCppUtils.windows) {
exclude "osdep_linkent_linux.cpp"
} else {
exclude "osdep_linkent_win32.cpp"
}
exclude "precompiled.cpp" exclude "precompiled.cpp"
} }

View File

@ -44,6 +44,12 @@
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" /> <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" /> <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<TargetName>$(ProjectName)_mm</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<TargetName>$(ProjectName)_mm</TargetName>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
@ -51,9 +57,9 @@
<PreprocessorDefinitions>METAMOD_CORE;WIN32;_DEBUG;_WINDOWS;_USRDLL;METAMOD_EXPORTS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>METAMOD_CORE;WIN32;_DEBUG;_WINDOWS;_USRDLL;METAMOD_EXPORTS;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<PrecompiledHeader>Use</PrecompiledHeader> <PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderOutputFile>.\debug/metamod.pch</PrecompiledHeaderOutputFile> <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
<AssemblerListingLocation>.\debug/asm/</AssemblerListingLocation> <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
<ObjectFileName>.\debug/obj/</ObjectFileName> <ObjectFileName>$(IntDir)</ObjectFileName>
<ProgramDataBaseFileName>.\debug/inf/</ProgramDataBaseFileName> <ProgramDataBaseFileName>.\debug/inf/</ProgramDataBaseFileName>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<TreatWarningAsError>true</TreatWarningAsError> <TreatWarningAsError>true</TreatWarningAsError>
@ -63,14 +69,15 @@
<PrecompiledHeaderFile>precompiled.h</PrecompiledHeaderFile> <PrecompiledHeaderFile>precompiled.h</PrecompiledHeaderFile>
</ClCompile> </ClCompile>
<Link> <Link>
<OutputFile>.\debug/metamod.dll</OutputFile> <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner> <SuppressStartupBanner>true</SuppressStartupBanner>
<ModuleDefinitionFile>.\metamod.def</ModuleDefinitionFile> <ModuleDefinitionFile>metamod.def</ModuleDefinitionFile>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>.\debug/inf/metamod.pdb</ProgramDatabaseFile> <ProgramDatabaseFile>$(OutDir)$(TargetName).pdb</ProgramDatabaseFile>
<ImportLibrary>.\debug/metamod.lib</ImportLibrary> <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>
<TargetMachine>MachineX86</TargetMachine> <TargetMachine>MachineX86</TargetMachine>
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
<Midl> <Midl>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@ -85,6 +92,24 @@
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<Culture>0x0409</Culture> <Culture>0x0409</Culture>
</ResourceCompile> </ResourceCompile>
<PreBuildEvent>
<Command>IF EXIST "$(ProjectDir)PreBuild.bat" (CALL "$(ProjectDir)PreBuild.bat" "$(ProjectDir)..\version\" "$(ProjectDir)..\")</Command>
</PreBuildEvent>
<PreBuildEvent>
<Message>Setup version from Git revision</Message>
</PreBuildEvent>
<PostBuildEvent>
<Command>IF EXIST "$(ProjectDir)PostBuild.bat" (CALL "$(ProjectDir)PostBuild.bat" "$(TargetDir)" "$(TargetName)" "$(TargetExt)" "$(ProjectDir)")</Command>
</PostBuildEvent>
<PostBuildEvent>
<Message>Automatic deployment script</Message>
</PostBuildEvent>
<CustomBuildStep>
<Command>echo Empty Action</Command>
</CustomBuildStep>
<CustomBuildStep>
<Message>Force build to run Pre-Build event</Message>
</CustomBuildStep>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile> <ClCompile>
@ -96,9 +121,9 @@
<RuntimeLibrary>MultiThreaded</RuntimeLibrary> <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking> <FunctionLevelLinking>true</FunctionLevelLinking>
<PrecompiledHeader>Use</PrecompiledHeader> <PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderOutputFile>.\release/metamod.pch</PrecompiledHeaderOutputFile> <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile>
<AssemblerListingLocation>.\release/</AssemblerListingLocation> <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
<ObjectFileName>.\release/obj/</ObjectFileName> <ObjectFileName>$(IntDir)</ObjectFileName>
<ProgramDataBaseFileName>.\release/inf/</ProgramDataBaseFileName> <ProgramDataBaseFileName>.\release/inf/</ProgramDataBaseFileName>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<TreatWarningAsError>true</TreatWarningAsError> <TreatWarningAsError>true</TreatWarningAsError>
@ -110,10 +135,11 @@
<OutputFile>.\release/metamod.dll</OutputFile> <OutputFile>.\release/metamod.dll</OutputFile>
<SuppressStartupBanner>true</SuppressStartupBanner> <SuppressStartupBanner>true</SuppressStartupBanner>
<ModuleDefinitionFile>.\metamod.def</ModuleDefinitionFile> <ModuleDefinitionFile>.\metamod.def</ModuleDefinitionFile>
<ProgramDatabaseFile>.\release/inf/metamod.pdb</ProgramDatabaseFile> <ProgramDatabaseFile>$(OutDir)$(TargetName).pdb</ProgramDatabaseFile>
<ImportLibrary>.\release/metamod.lib</ImportLibrary> <ImportLibrary>$(OutDir)$(TargetName).lib</ImportLibrary>
<TargetMachine>MachineX86</TargetMachine> <TargetMachine>MachineX86</TargetMachine>
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link> </Link>
<Midl> <Midl>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@ -128,6 +154,24 @@
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<Culture>0x0409</Culture> <Culture>0x0409</Culture>
</ResourceCompile> </ResourceCompile>
<PreBuildEvent>
<Command>IF EXIST "$(ProjectDir)PreBuild.bat" (CALL "$(ProjectDir)PreBuild.bat" "$(ProjectDir)..\version\" "$(ProjectDir)..\")</Command>
</PreBuildEvent>
<PreBuildEvent>
<Message>Setup version from Git revision</Message>
</PreBuildEvent>
<PostBuildEvent>
<Command>IF EXIST "$(ProjectDir)PostBuild.bat" (CALL "$(ProjectDir)PostBuild.bat" "$(TargetDir)" "$(TargetName)" "$(TargetExt)" "$(ProjectDir)")</Command>
</PostBuildEvent>
<PostBuildEvent>
<Message>Automatic deployment script</Message>
</PostBuildEvent>
<CustomBuildStep>
<Command>echo Empty Action</Command>
</CustomBuildStep>
<CustomBuildStep>
<Message>Force build to run Pre-Build event</Message>
</CustomBuildStep>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\src\api_info.cpp" /> <ClCompile Include="..\src\api_info.cpp" />
@ -157,7 +201,6 @@
<ClCompile Include="..\src\studioapi.cpp" /> <ClCompile Include="..\src\studioapi.cpp" />
<ClCompile Include="..\src\support_meta.cpp" /> <ClCompile Include="..\src\support_meta.cpp" />
<ClCompile Include="..\src\utils.cpp" /> <ClCompile Include="..\src\utils.cpp" />
<ClCompile Include="..\src\vdate.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\src\api_info.h" /> <ClInclude Include="..\src\api_info.h" />
@ -191,8 +234,12 @@
<ClInclude Include="..\src\support_meta.h" /> <ClInclude Include="..\src\support_meta.h" />
<ClInclude Include="..\src\types_meta.h" /> <ClInclude Include="..\src\types_meta.h" />
<ClInclude Include="..\src\utils.h" /> <ClInclude Include="..\src\utils.h" />
<ClInclude Include="..\src\vdate.h" /> </ItemGroup>
<ClInclude Include="..\src\vers_meta.h" /> <ItemGroup>
<None Include="metamod.def" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="metamod.rc" />
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">

View File

@ -83,9 +83,6 @@
<ClCompile Include="..\src\utils.cpp"> <ClCompile Include="..\src\utils.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\src\vdate.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\src\api_info.h"> <ClInclude Include="..\src\api_info.h">
@ -181,11 +178,15 @@
<ClInclude Include="..\src\utils.h"> <ClInclude Include="..\src\utils.h">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\src\vdate.h"> </ItemGroup>
<Filter>Source Files</Filter> <ItemGroup>
</ClInclude> <None Include="metamod.def">
<ClInclude Include="..\src\vers_meta.h"> <Filter>Resource Files</Filter>
<Filter>Source Files</Filter> </None>
</ClInclude> </ItemGroup>
<ItemGroup>
<ResourceCompile Include="metamod.rc">
<Filter>Resource Files</Filter>
</ResourceCompile>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -1,272 +1,234 @@
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// api_info.cpp - info for api routines
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#include "precompiled.h" #include "precompiled.h"
// trace flag, loglevel, name // trace flag, loglevel, name
dllapi_info_t dllapi_info = { dllapi_info_t dllapi_info = {
{ mFALSE, 3, "GameDLLInit" }, // pfnGameInit { mFALSE, 3, "GameDLLInit" }, // pfnGameInit
{ mFALSE, 10, "DispatchSpawn" }, // pfnSpawn { mFALSE, 10, "DispatchSpawn" }, // pfnSpawn
{ mFALSE, 16, "DispatchThink" }, // pfnThink { mFALSE, 16, "DispatchThink" }, // pfnThink
{ mFALSE, 9, "DispatchUse" }, // pfnUse { mFALSE, 9, "DispatchUse" }, // pfnUse
{ mFALSE, 11, "DispatchTouch" }, // pfnTouch { mFALSE, 11, "DispatchTouch" }, // pfnTouch
{ mFALSE, 9, "DispatchBlocked" }, // pfnBlocked { mFALSE, 9, "DispatchBlocked" }, // pfnBlocked
{ mFALSE, 10, "DispatchKeyValue" }, // pfnKeyValue { mFALSE, 10, "DispatchKeyValue" }, // pfnKeyValue
{ mFALSE, 9, "DispatchSave" }, // pfnSave { mFALSE, 9, "DispatchSave" }, // pfnSave
{ mFALSE, 9, "DispatchRestore" }, // pfnRestore { mFALSE, 9, "DispatchRestore" }, // pfnRestore
{ mFALSE, 20, "DispatchObjectCollsionBox" }, // pfnSetAbsBox { mFALSE, 20, "DispatchObjectCollsionBox" }, // pfnSetAbsBox
{ mFALSE, 9, "SaveWriteFields" }, // pfnSaveWriteFields { mFALSE, 9, "SaveWriteFields" }, // pfnSaveWriteFields
{ mFALSE, 9, "SaveReadFields" }, // pfnSaveReadFields { mFALSE, 9, "SaveReadFields" }, // pfnSaveReadFields
{ mFALSE, 9, "SaveGlobalState" }, // pfnSaveGlobalState { mFALSE, 9, "SaveGlobalState" }, // pfnSaveGlobalState
{ mFALSE, 9, "RestoreGlobalState" }, // pfnRestoreGlobalState { mFALSE, 9, "RestoreGlobalState" }, // pfnRestoreGlobalState
{ mFALSE, 9, "ResetGlobalState" }, // pfnResetGlobalState { mFALSE, 9, "ResetGlobalState" }, // pfnResetGlobalState
{ mFALSE, 3, "ClientConnect" }, // pfnClientConnect { mFALSE, 3, "ClientConnect" }, // pfnClientConnect
{ mFALSE, 3, "ClientDisconnect" }, // pfnClientDisconnect { mFALSE, 3, "ClientDisconnect" }, // pfnClientDisconnect
{ mFALSE, 3, "ClientKill" }, // pfnClientKill { mFALSE, 3, "ClientKill" }, // pfnClientKill
{ mFALSE, 3, "ClientPutInServer" }, // pfnClientPutInServer { mFALSE, 3, "ClientPutInServer" }, // pfnClientPutInServer
{ mFALSE, 9, "ClientCommand" }, // pfnClientCommand { mFALSE, 9, "ClientCommand" }, // pfnClientCommand
{ mFALSE, 11, "ClientUserInfoChanged" }, // pfnClientUserInfoChanged { mFALSE, 11, "ClientUserInfoChanged" }, // pfnClientUserInfoChanged
{ mFALSE, 3, "ServerActivate" }, // pfnServerActivate { mFALSE, 3, "ServerActivate" }, // pfnServerActivate
{ mFALSE, 3, "ServerDeactivate" }, // pfnServerDeactivate { mFALSE, 3, "ServerDeactivate" }, // pfnServerDeactivate
{ mFALSE, 14, "PlayerPreThink" }, // pfnPlayerPreThink { mFALSE, 14, "PlayerPreThink" }, // pfnPlayerPreThink
{ mFALSE, 14, "PlayerPostThink" }, // pfnPlayerPostThink { mFALSE, 14, "PlayerPostThink" }, // pfnPlayerPostThink
{ mFALSE, 18, "StartFrame" }, // pfnStartFrame { mFALSE, 18, "StartFrame" }, // pfnStartFrame
{ mFALSE, 9, "ParmsNewLevel" }, // pfnParmsNewLevel { mFALSE, 9, "ParmsNewLevel" }, // pfnParmsNewLevel
{ mFALSE, 9, "ParmsChangeLevel" }, // pfnParmsChangeLevel { mFALSE, 9, "ParmsChangeLevel" }, // pfnParmsChangeLevel
{ mFALSE, 9, "GetGameDescription" }, // pfnGetGameDescription { mFALSE, 9, "GetGameDescription" }, // pfnGetGameDescription
{ mFALSE, 9, "PlayerCustomization" }, // pfnPlayerCustomization { mFALSE, 9, "PlayerCustomization" }, // pfnPlayerCustomization
{ mFALSE, 9, "SpectatorConnect" }, // pfnSpectatorConnect { mFALSE, 9, "SpectatorConnect" }, // pfnSpectatorConnect
{ mFALSE, 9, "SpectatorDisconnect" }, // pfnSpectatorDisconnect { mFALSE, 9, "SpectatorDisconnect" }, // pfnSpectatorDisconnect
{ mFALSE, 9, "SpectatorThink" }, // pfnSpectatorThink { mFALSE, 9, "SpectatorThink" }, // pfnSpectatorThink
{ mFALSE, 3, "Sys_Error" }, // pfnSys_Error { mFALSE, 3, "Sys_Error" }, // pfnSys_Error
{ mFALSE, 13, "PM_Move" }, // pfnPM_Move { mFALSE, 13, "PM_Move" }, // pfnPM_Move
{ mFALSE, 9, "PM_Init" }, // pfnPM_Init { mFALSE, 9, "PM_Init" }, // pfnPM_Init
{ mFALSE, 9, "PM_FindTextureType" }, // pfnPM_FindTextureType { mFALSE, 9, "PM_FindTextureType" }, // pfnPM_FindTextureType
{ mFALSE, 12, "SetupVisibility" }, // pfnSetupVisibility { mFALSE, 12, "SetupVisibility" }, // pfnSetupVisibility
{ mFALSE, 12, "UpdateClientData" }, // pfnUpdateClientData { mFALSE, 12, "UpdateClientData" }, // pfnUpdateClientData
{ mFALSE, 16, "AddToFullPack" }, // pfnAddToFullPack { mFALSE, 16, "AddToFullPack" }, // pfnAddToFullPack
{ mFALSE, 9, "CreateBaseline" }, // pfnCreateBaseline { mFALSE, 9, "CreateBaseline" }, // pfnCreateBaseline
{ mFALSE, 9, "RegisterEncoders" }, // pfnRegisterEncoders { mFALSE, 9, "RegisterEncoders" }, // pfnRegisterEncoders
{ mFALSE, 9, "GetWeaponData" }, // pfnGetWeaponData { mFALSE, 9, "GetWeaponData" }, // pfnGetWeaponData
{ mFALSE, 15, "CmdStart" }, // pfnCmdStart { mFALSE, 15, "CmdStart" }, // pfnCmdStart
{ mFALSE, 15, "CmdEnd" }, // pfnCmdEnd { mFALSE, 15, "CmdEnd" }, // pfnCmdEnd
{ mFALSE, 9, "ConnectionlessPacket" }, // pfnConnectionlessPacket { mFALSE, 9, "ConnectionlessPacket" }, // pfnConnectionlessPacket
{ mFALSE, 9, "GetHullBounds" }, // pfnGetHullBounds { mFALSE, 9, "GetHullBounds" }, // pfnGetHullBounds
{ mFALSE, 9, "CreateInstancedBaselines" }, // pfnCreateInstancedBaselines { mFALSE, 9, "CreateInstancedBaselines" }, // pfnCreateInstancedBaselines
{ mFALSE, 3, "InconsistentFile" }, // pfnInconsistentFile { mFALSE, 3, "InconsistentFile" }, // pfnInconsistentFile
{ mFALSE, 20, "AllowLagCompensation" }, // pfnAllowLagCompensation { mFALSE, 20, "AllowLagCompensation" }, // pfnAllowLagCompensation
{ mFALSE, 0, NULL },
{ mFALSE, 0, nullptr },
}; };
newapi_info_t newapi_info = { newapi_info_t newapi_info = {
{ mFALSE, 16, "OnFreeEntPrivateData" }, // pfnOnFreeEntPrivateData { mFALSE, 16, "OnFreeEntPrivateData" }, // pfnOnFreeEntPrivateData
{ mFALSE, 3, "GameShutdown" }, // pfnGameShutdown { mFALSE, 3, "GameShutdown" }, // pfnGameShutdown
{ mFALSE, 14, "ShouldCollide" }, // pfnShouldCollide { mFALSE, 14, "ShouldCollide" }, // pfnShouldCollide
// Added 2005-08-11 (no SDK update) { mFALSE, 3, "CvarValue" }, // pfnCvarValue
{ mFALSE, 3, "CvarValue" }, // pfnCvarValue { mFALSE, 3, "CvarValue2" }, // pfnCvarValue2
// Added 2005-11-22 (no SDK update)
{ mFALSE, 3, "CvarValue2" }, // pfnCvarValue2 { mFALSE, 0, nullptr },
{ mFALSE, 0, NULL },
}; };
engine_info_t engine_info = { engine_info_t engine_info = {
{ mFALSE, 13, "PrecacheModel" }, // pfnPrecacheModel { mFALSE, 13, "PrecacheModel" }, // pfnPrecacheModel
{ mFALSE, 13, "PrecacheSound" }, // pfnPrecacheSound { mFALSE, 13, "PrecacheSound" }, // pfnPrecacheSound
{ mFALSE, 18, "SetModel" }, // pfnSetModel { mFALSE, 18, "SetModel" }, // pfnSetModel
{ mFALSE, 34, "ModelIndex" }, // pfnModelIndex { mFALSE, 34, "ModelIndex" }, // pfnModelIndex
{ mFALSE, 10, "ModelFrames" }, // pfnModelFrames { mFALSE, 10, "ModelFrames" }, // pfnModelFrames
{ mFALSE, 14, "SetSize" }, // pfnSetSize { mFALSE, 14, "SetSize" }, // pfnSetSize
{ mFALSE, 9, "ChangeLevel" }, // pfnChangeLevel { mFALSE, 9, "ChangeLevel" }, // pfnChangeLevel
{ mFALSE, 9, "GetSpawnParms" }, // pfnGetSpawnParms { mFALSE, 9, "GetSpawnParms" }, // pfnGetSpawnParms
{ mFALSE, 9, "SaveSpawnParms" }, // pfnSaveSpawnParms { mFALSE, 9, "SaveSpawnParms" }, // pfnSaveSpawnParms
{ mFALSE, 9, "VecToYaw" }, // pfnVecToYaw { mFALSE, 9, "VecToYaw" }, // pfnVecToYaw
{ mFALSE, 14, "VecToAngles" }, // pfnVecToAngles { mFALSE, 14, "VecToAngles" }, // pfnVecToAngles
{ mFALSE, 9, "MoveToOrigin" }, // pfnMoveToOrigin { mFALSE, 9, "MoveToOrigin" }, // pfnMoveToOrigin
{ mFALSE, 9, "ChangeYaw" }, // pfnChangeYaw { mFALSE, 9, "ChangeYaw" }, // pfnChangeYaw
{ mFALSE, 9, "ChangePitch" }, // pfnChangePitch { mFALSE, 9, "ChangePitch" }, // pfnChangePitch
{ mFALSE, 32, "FindEntityByString" }, // pfnFindEntityByString { mFALSE, 32, "FindEntityByString" }, // pfnFindEntityByString
{ mFALSE, 9, "GetEntityIllum" }, // pfnGetEntityIllum { mFALSE, 9, "GetEntityIllum" }, // pfnGetEntityIllum
{ mFALSE, 9, "FindEntityInSphere" }, // pfnFindEntityInSphere { mFALSE, 9, "FindEntityInSphere" }, // pfnFindEntityInSphere
{ mFALSE, 19, "FindClientInPVS" }, // pfnFindClientInPVS { mFALSE, 19, "FindClientInPVS" }, // pfnFindClientInPVS
{ mFALSE, 9, "EntitiesInPVS" }, // pfnEntitiesInPVS { mFALSE, 9, "EntitiesInPVS" }, // pfnEntitiesInPVS
{ mFALSE, 40, "MakeVectors" }, // pfnMakeVectors { mFALSE, 40, "MakeVectors" }, // pfnMakeVectors
{ mFALSE, 9, "AngleVectors" }, // pfnAngleVectors { mFALSE, 9, "AngleVectors" }, // pfnAngleVectors
{ mFALSE, 13, "CreateEntity" }, // pfnCreateEntity { mFALSE, 13, "CreateEntity" }, // pfnCreateEntity
{ mFALSE, 13, "RemoveEntity" }, // pfnRemoveEntity { mFALSE, 13, "RemoveEntity" }, // pfnRemoveEntity
{ mFALSE, 13, "CreateNamedEntity" }, // pfnCreateNamedEntity { mFALSE, 13, "CreateNamedEntity" }, // pfnCreateNamedEntity
{ mFALSE, 9, "MakeStatic" }, // pfnMakeStatic { mFALSE, 9, "MakeStatic" }, // pfnMakeStatic
{ mFALSE, 9, "EntIsOnFloor" }, // pfnEntIsOnFloor { mFALSE, 9, "EntIsOnFloor" }, // pfnEntIsOnFloor
{ mFALSE, 9, "DropToFloor" }, // pfnDropToFloor { mFALSE, 9, "DropToFloor" }, // pfnDropToFloor
{ mFALSE, 9, "WalkMove" }, // pfnWalkMove { mFALSE, 9, "WalkMove" }, // pfnWalkMove
{ mFALSE, 14, "SetOrigin" }, // pfnSetOrigin { mFALSE, 14, "SetOrigin" }, // pfnSetOrigin
{ mFALSE, 12, "EmitSound" }, // pfnEmitSound { mFALSE, 12, "EmitSound" }, // pfnEmitSound
{ mFALSE, 12, "EmitAmbientSound" }, // pfnEmitAmbientSound { mFALSE, 12, "EmitAmbientSound" }, // pfnEmitAmbientSound
{ mFALSE, 20, "TraceLine" }, // pfnTraceLine { mFALSE, 20, "TraceLine" }, // pfnTraceLine
{ mFALSE, 9, "TraceToss" }, // pfnTraceToss { mFALSE, 9, "TraceToss" }, // pfnTraceToss
{ mFALSE, 9, "TraceMonsterHull" }, // pfnTraceMonsterHull { mFALSE, 9, "TraceMonsterHull" }, // pfnTraceMonsterHull
{ mFALSE, 9, "TraceHull" }, // pfnTraceHull { mFALSE, 9, "TraceHull" }, // pfnTraceHull
{ mFALSE, 9, "TraceModel" }, // pfnTraceModel { mFALSE, 9, "TraceModel" }, // pfnTraceModel
{ mFALSE, 15, "TraceTexture" }, // pfnTraceTexture // CS: when moving { mFALSE, 15, "TraceTexture" }, // pfnTraceTexture // CS: when moving
{ mFALSE, 9, "TraceSphere" }, // pfnTraceSphere { mFALSE, 9, "TraceSphere" }, // pfnTraceSphere
{ mFALSE, 9, "GetAimVector" }, // pfnGetAimVector { mFALSE, 9, "GetAimVector" }, // pfnGetAimVector
{ mFALSE, 9, "ServerCommand" }, // pfnServerCommand { mFALSE, 9, "ServerCommand" }, // pfnServerCommand
{ mFALSE, 9, "ServerExecute" }, // pfnServerExecute { mFALSE, 9, "ServerExecute" }, // pfnServerExecute
{ mFALSE, 11, "engClientCommand" }, // pfnClientCommand // d'oh, ClientCommand in dllapi too { mFALSE, 11, "engClientCommand" }, // pfnClientCommand // d'oh, ClientCommand in dllapi too
{ mFALSE, 9, "ParticleEffect" }, // pfnParticleEffect { mFALSE, 9, "ParticleEffect" }, // pfnParticleEffect
{ mFALSE, 9, "LightStyle" }, // pfnLightStyle { mFALSE, 9, "LightStyle" }, // pfnLightStyle
{ mFALSE, 9, "DecalIndex" }, // pfnDecalIndex { mFALSE, 9, "DecalIndex" }, // pfnDecalIndex
{ mFALSE, 15, "PointContents" }, // pfnPointContents // CS: when moving { mFALSE, 15, "PointContents" }, // pfnPointContents // CS: when moving
{ mFALSE, 22, "MessageBegin" }, // pfnMessageBegin { mFALSE, 22, "MessageBegin" }, // pfnMessageBegin
{ mFALSE, 22, "MessageEnd" }, // pfnMessageEnd { mFALSE, 22, "MessageEnd" }, // pfnMessageEnd
{ mFALSE, 30, "WriteByte" }, // pfnWriteByte { mFALSE, 30, "WriteByte" }, // pfnWriteByte
{ mFALSE, 23, "WriteChar" }, // pfnWriteChar { mFALSE, 23, "WriteChar" }, // pfnWriteChar
{ mFALSE, 24, "WriteShort" }, // pfnWriteShort { mFALSE, 24, "WriteShort" }, // pfnWriteShort
{ mFALSE, 23, "WriteLong" }, // pfnWriteLong { mFALSE, 23, "WriteLong" }, // pfnWriteLong
{ mFALSE, 23, "WriteAngle" }, // pfnWriteAngle { mFALSE, 23, "WriteAngle" }, // pfnWriteAngle
{ mFALSE, 23, "WriteCoord" }, // pfnWriteCoord { mFALSE, 23, "WriteCoord" }, // pfnWriteCoord
{ mFALSE, 25, "WriteString" }, // pfnWriteString { mFALSE, 25, "WriteString" }, // pfnWriteString
{ mFALSE, 23, "WriteEntity" }, // pfnWriteEntity { mFALSE, 23, "WriteEntity" }, // pfnWriteEntity
{ mFALSE, 9, "CVarRegister" }, // pfnCVarRegister { mFALSE, 9, "CVarRegister" }, // pfnCVarRegister
{ mFALSE, 21, "CVarGetFloat" }, // pfnCVarGetFloat { mFALSE, 21, "CVarGetFloat" }, // pfnCVarGetFloat
{ mFALSE, 9, "CVarGetString" }, // pfnCVarGetString { mFALSE, 9, "CVarGetString" }, // pfnCVarGetString
{ mFALSE, 10, "CVarSetFloat" }, // pfnCVarSetFloat { mFALSE, 10, "CVarSetFloat" }, // pfnCVarSetFloat
{ mFALSE, 9, "CVarSetString" }, // pfnCVarSetString { mFALSE, 9, "CVarSetString" }, // pfnCVarSetString
{ mFALSE, 15, "AlertMessage" }, // pfnAlertMessage { mFALSE, 15, "AlertMessage" }, // pfnAlertMessage
{ mFALSE, 17, "EngineFprintf" }, // pfnEngineFprintf { mFALSE, 17, "EngineFprintf" }, // pfnEngineFprintf
{ mFALSE, 14, "PvAllocEntPrivateData" }, // pfnPvAllocEntPrivateData { mFALSE, 14, "PvAllocEntPrivateData" }, // pfnPvAllocEntPrivateData
{ mFALSE, 9, "PvEntPrivateData" }, // pfnPvEntPrivateData { mFALSE, 9, "PvEntPrivateData" }, // pfnPvEntPrivateData
{ mFALSE, 9, "FreeEntPrivateData" }, // pfnFreeEntPrivateData { mFALSE, 9, "FreeEntPrivateData" }, // pfnFreeEntPrivateData
{ mFALSE, 9, "SzFromIndex" }, // pfnSzFromIndex { mFALSE, 9, "SzFromIndex" }, // pfnSzFromIndex
{ mFALSE, 10, "AllocString" }, // pfnAllocString { mFALSE, 10, "AllocString" }, // pfnAllocString
{ mFALSE, 9, "GetVarsOfEnt" }, // pfnGetVarsOfEnt { mFALSE, 9, "GetVarsOfEnt" }, // pfnGetVarsOfEnt
{ mFALSE, 14, "PEntityOfEntOffset" }, // pfnPEntityOfEntOffset { mFALSE, 14, "PEntityOfEntOffset" }, // pfnPEntityOfEntOffset
{ mFALSE, 19, "EntOffsetOfPEntity" }, // pfnEntOffsetOfPEntity { mFALSE, 19, "EntOffsetOfPEntity" }, // pfnEntOffsetOfPEntity
{ mFALSE, 14, "IndexOfEdict" }, // pfnIndexOfEdict { mFALSE, 14, "IndexOfEdict" }, // pfnIndexOfEdict
{ mFALSE, 17, "PEntityOfEntIndex" }, // pfnPEntityOfEntIndex { mFALSE, 17, "PEntityOfEntIndex" }, // pfnPEntityOfEntIndex
{ mFALSE, 9, "FindEntityByVars" }, // pfnFindEntityByVars { mFALSE, 9, "FindEntityByVars" }, // pfnFindEntityByVars
{ mFALSE, 14, "GetModelPtr" }, // pfnGetModelPtr { mFALSE, 14, "GetModelPtr" }, // pfnGetModelPtr
{ mFALSE, 9, "RegUserMsg" }, // pfnRegUserMsg { mFALSE, 9, "RegUserMsg" }, // pfnRegUserMsg
{ mFALSE, 9, "AnimationAutomove" }, // pfnAnimationAutomove { mFALSE, 9, "AnimationAutomove" }, // pfnAnimationAutomove
{ mFALSE, 9, "GetBonePosition" }, // pfnGetBonePosition { mFALSE, 9, "GetBonePosition" }, // pfnGetBonePosition
{ mFALSE, 9, "FunctionFromName" }, // pfnFunctionFromName { mFALSE, 9, "FunctionFromName" }, // pfnFunctionFromName
{ mFALSE, 9, "NameForFunction" }, // pfnNameForFunction { mFALSE, 9, "NameForFunction" }, // pfnNameForFunction
{ mFALSE, 9, "ClientPrintf" }, // pfnClientPrintf { mFALSE, 9, "ClientPrintf" }, // pfnClientPrintf
{ mFALSE, 9, "ServerPrint" }, // pfnServerPrint { mFALSE, 9, "ServerPrint" }, // pfnServerPrint
{ mFALSE, 13, "Cmd_Args" }, // pfnCmd_Args { mFALSE, 13, "Cmd_Args" }, // pfnCmd_Args
{ mFALSE, 13, "Cmd_Argv" }, // pfnCmd_Argv { mFALSE, 13, "Cmd_Argv" }, // pfnCmd_Argv
{ mFALSE, 13, "Cmd_Argc" }, // pfnCmd_Argc { mFALSE, 13, "Cmd_Argc" }, // pfnCmd_Argc
{ mFALSE, 9, "GetAttachment" }, // pfnGetAttachment { mFALSE, 9, "GetAttachment" }, // pfnGetAttachment
{ mFALSE, 9, "CRC32_Init" }, // pfnCRC32_Init { mFALSE, 9, "CRC32_Init" }, // pfnCRC32_Init
{ mFALSE, 9, "CRC32_ProcessBuffer" }, // pfnCRC32_ProcessBuffer { mFALSE, 9, "CRC32_ProcessBuffer" }, // pfnCRC32_ProcessBuffer
{ mFALSE, 9, "CRC32_ProcessByte" }, // pfnCRC32_ProcessByte { mFALSE, 9, "CRC32_ProcessByte" }, // pfnCRC32_ProcessByte
{ mFALSE, 9, "CRC32_Final" }, // pfnCRC32_Final { mFALSE, 9, "CRC32_Final" }, // pfnCRC32_Final
{ mFALSE, 16, "RandomLong" }, // pfnRandomLong { mFALSE, 16, "RandomLong" }, // pfnRandomLong
{ mFALSE, 14, "RandomFloat" }, // pfnRandomFloat // CS: when firing { mFALSE, 14, "RandomFloat" }, // pfnRandomFloat // CS: when firing
{ mFALSE, 14, "SetView" }, // pfnSetView { mFALSE, 14, "SetView" }, // pfnSetView
{ mFALSE, 9, "Time" }, // pfnTime { mFALSE, 9, "Time" }, // pfnTime
{ mFALSE, 9, "CrosshairAngle" }, // pfnCrosshairAngle { mFALSE, 9, "CrosshairAngle" }, // pfnCrosshairAngle
{ mFALSE, 10, "LoadFileForMe" }, // pfnLoadFileForMe { mFALSE, 10, "LoadFileForMe" }, // pfnLoadFileForMe
{ mFALSE, 10, "FreeFile" }, // pfnFreeFile { mFALSE, 10, "FreeFile" }, // pfnFreeFile
{ mFALSE, 9, "EndSection" }, // pfnEndSection { mFALSE, 9, "EndSection" }, // pfnEndSection
{ mFALSE, 9, "CompareFileTime" }, // pfnCompareFileTime { mFALSE, 9, "CompareFileTime" }, // pfnCompareFileTime
{ mFALSE, 9, "GetGameDir" }, // pfnGetGameDir { mFALSE, 9, "GetGameDir" }, // pfnGetGameDir
{ mFALSE, 9, "Cvar_RegisterVariable" }, // pfnCvar_RegisterVariable { mFALSE, 9, "Cvar_RegisterVariable" }, // pfnCvar_RegisterVariable
{ mFALSE, 9, "FadeClientVolume" }, // pfnFadeClientVolume { mFALSE, 9, "FadeClientVolume" }, // pfnFadeClientVolume
{ mFALSE, 14, "SetClientMaxspeed" }, // pfnSetClientMaxspeed { mFALSE, 14, "SetClientMaxspeed" }, // pfnSetClientMaxspeed
{ mFALSE, 9, "CreateFakeClient" }, // pfnCreateFakeClient { mFALSE, 9, "CreateFakeClient" }, // pfnCreateFakeClient
{ mFALSE, 9, "RunPlayerMove" }, // pfnRunPlayerMove { mFALSE, 9, "RunPlayerMove" }, // pfnRunPlayerMove
{ mFALSE, 9, "NumberOfEntities" }, // pfnNumberOfEntities { mFALSE, 9, "NumberOfEntities" }, // pfnNumberOfEntities
{ mFALSE, 17, "GetInfoKeyBuffer" }, // pfnGetInfoKeyBuffer { mFALSE, 17, "GetInfoKeyBuffer" }, // pfnGetInfoKeyBuffer
{ mFALSE, 13, "InfoKeyValue" }, // pfnInfoKeyValue { mFALSE, 13, "InfoKeyValue" }, // pfnInfoKeyValue
{ mFALSE, 9, "SetKeyValue" }, // pfnSetKeyValue { mFALSE, 9, "SetKeyValue" }, // pfnSetKeyValue
{ mFALSE, 12, "SetClientKeyValue" }, // pfnSetClientKeyValue { mFALSE, 12, "SetClientKeyValue" }, // pfnSetClientKeyValue
{ mFALSE, 9, "IsMapValid" }, // pfnIsMapValid { mFALSE, 9, "IsMapValid" }, // pfnIsMapValid
{ mFALSE, 9, "StaticDecal" }, // pfnStaticDecal { mFALSE, 9, "StaticDecal" }, // pfnStaticDecal
{ mFALSE, 9, "PrecacheGeneric" }, // pfnPrecacheGeneric { mFALSE, 9, "PrecacheGeneric" }, // pfnPrecacheGeneric
{ mFALSE, 10, "GetPlayerUserId" }, // pfnGetPlayerUserId { mFALSE, 10, "GetPlayerUserId" }, // pfnGetPlayerUserId
{ mFALSE, 9, "BuildSoundMsg" }, // pfnBuildSoundMsg { mFALSE, 9, "BuildSoundMsg" }, // pfnBuildSoundMsg
{ mFALSE, 9, "IsDedicatedServer" }, // pfnIsDedicatedServer { mFALSE, 9, "IsDedicatedServer" }, // pfnIsDedicatedServer
{ mFALSE, 9, "CVarGetPointer" }, // pfnCVarGetPointer { mFALSE, 9, "CVarGetPointer" }, // pfnCVarGetPointer
{ mFALSE, 9, "GetPlayerWONId" }, // pfnGetPlayerWONId { mFALSE, 9, "GetPlayerWONId" }, // pfnGetPlayerWONId
{ mFALSE, 9, "Info_RemoveKey" }, // pfnInfo_RemoveKey { mFALSE, 9, "Info_RemoveKey" }, // pfnInfo_RemoveKey
{ mFALSE, 15, "GetPhysicsKeyValue" }, // pfnGetPhysicsKeyValue { mFALSE, 15, "GetPhysicsKeyValue" }, // pfnGetPhysicsKeyValue
{ mFALSE, 14, "SetPhysicsKeyValue" }, // pfnSetPhysicsKeyValue { mFALSE, 14, "SetPhysicsKeyValue" }, // pfnSetPhysicsKeyValue
{ mFALSE, 15, "GetPhysicsInfoString" }, // pfnGetPhysicsInfoString { mFALSE, 15, "GetPhysicsInfoString" }, // pfnGetPhysicsInfoString
{ mFALSE, 13, "PrecacheEvent" }, // pfnPrecacheEvent { mFALSE, 13, "PrecacheEvent" }, // pfnPrecacheEvent
{ mFALSE, 9, "PlaybackEvent" }, // pfnPlaybackEvent { mFALSE, 9, "PlaybackEvent" }, // pfnPlaybackEvent
{ mFALSE, 31, "SetFatPVS" }, // pfnSetFatPVS { mFALSE, 31, "SetFatPVS" }, // pfnSetFatPVS
{ mFALSE, 31, "SetFatPAS" }, // pfnSetFatPAS { mFALSE, 31, "SetFatPAS" }, // pfnSetFatPAS
{ mFALSE, 50, "CheckVisibility" }, // pfnCheckVisibility { mFALSE, 50, "CheckVisibility" }, // pfnCheckVisibility
{ mFALSE, 37, "DeltaSetField" }, // pfnDeltaSetField { mFALSE, 37, "DeltaSetField" }, // pfnDeltaSetField
{ mFALSE, 38, "DeltaUnsetField" }, // pfnDeltaUnsetField { mFALSE, 38, "DeltaUnsetField" }, // pfnDeltaUnsetField
{ mFALSE, 9, "DeltaAddEncoder" }, // pfnDeltaAddEncoder { mFALSE, 9, "DeltaAddEncoder" }, // pfnDeltaAddEncoder
{ mFALSE, 45, "GetCurrentPlayer" }, // pfnGetCurrentPlayer { mFALSE, 45, "GetCurrentPlayer" }, // pfnGetCurrentPlayer
{ mFALSE, 14, "CanSkipPlayer" }, // pfnCanSkipPlayer { mFALSE, 14, "CanSkipPlayer" }, // pfnCanSkipPlayer
{ mFALSE, 9, "DeltaFindField" }, // pfnDeltaFindField { mFALSE, 9, "DeltaFindField" }, // pfnDeltaFindField
{ mFALSE, 37, "DeltaSetFieldByIndex" }, // pfnDeltaSetFieldByIndex { mFALSE, 37, "DeltaSetFieldByIndex" }, // pfnDeltaSetFieldByIndex
{ mFALSE, 38, "DeltaUnsetFieldByIndex" }, // pfnDeltaUnsetFieldByIndex { mFALSE, 38, "DeltaUnsetFieldByIndex" }, // pfnDeltaUnsetFieldByIndex
{ mFALSE, 9, "SetGroupMask" }, // pfnSetGroupMask { mFALSE, 9, "SetGroupMask" }, // pfnSetGroupMask
{ mFALSE, 9, "engCreateInstancedBaseline" }, // pfnCreateInstancedBaseline // d'oh, CreateInstancedBaseline in dllapi too { mFALSE, 9, "engCreateInstancedBaseline" }, // pfnCreateInstancedBaseline // d'oh, CreateInstancedBaseline in dllapi too
{ mFALSE, 9, "Cvar_DirectSet" }, // pfnCvar_DirectSet { mFALSE, 9, "Cvar_DirectSet" }, // pfnCvar_DirectSet
{ mFALSE, 9, "ForceUnmodified" }, // pfnForceUnmodified { mFALSE, 9, "ForceUnmodified" }, // pfnForceUnmodified
{ mFALSE, 9, "GetPlayerStats" }, // pfnGetPlayerStats { mFALSE, 9, "GetPlayerStats" }, // pfnGetPlayerStats
{ mFALSE, 3, "AddServerCommand" }, // pfnAddServerCommand { mFALSE, 3, "AddServerCommand" }, // pfnAddServerCommand
// Added in SDK 2.2:
{ mFALSE, 9, "Voice_GetClientListening" }, // Voice_GetClientListening { mFALSE, 9, "Voice_GetClientListening" }, // Voice_GetClientListening
{ mFALSE, 9, "Voice_SetClientListening" }, // Voice_SetClientListening { mFALSE, 9, "Voice_SetClientListening" }, // Voice_SetClientListening
// Added for HL 1109 (no SDK update): { mFALSE, 9, "GetPlayerAuthId" }, // pfnGetPlayerAuthId
{ mFALSE, 9, "GetPlayerAuthId" }, // pfnGetPlayerAuthId { mFALSE, 30, "SequenceGet" }, // pfnSequenceGet
// Added 2003-11-10 (no SDK update):
{ mFALSE, 30, "SequenceGet" }, // pfnSequenceGet { mFALSE, 30, "SequencePickSentence" }, // pfnSequencePickSentence
{ mFALSE, 30, "SequencePickSentence" }, // pfnSequencePickSentence { mFALSE, 30, "GetFileSize" }, // pfnGetFileSize
{ mFALSE, 30, "GetFileSize" }, // pfnGetFileSize { mFALSE, 30, "GetApproxWavePlayLen" }, // pfnGetApproxWavePlayLen
{ mFALSE, 30, "GetApproxWavePlayLen" }, // pfnGetApproxWavePlayLen { mFALSE, 30, "IsCareerMatch" }, // pfnIsCareerMatch
{ mFALSE, 30, "IsCareerMatch" }, // pfnIsCareerMatch { mFALSE, 30, "GetLocalizedStringLength" }, // pfnGetLocalizedStringLength
{ mFALSE, 30, "GetLocalizedStringLength" }, // pfnGetLocalizedStringLength { mFALSE, 30, "RegisterTutorMessageShown" }, // pfnRegisterTutorMessageShown
{ mFALSE, 30, "RegisterTutorMessageShown" }, // pfnRegisterTutorMessageShown { mFALSE, 30, "GetTimesTutorMessageShown" }, // pfnGetTimesTutorMessageShown
{ mFALSE, 30, "GetTimesTutorMessageShown" }, // pfnGetTimesTutorMessageShown { mFALSE, 30, "ProcessTutorMessageDecayBuffer" }, // pfnProcessTutorMessageDecayBuffer
{ mFALSE, 30, "ProcessTutorMessageDecayBuffer" }, // pfnProcessTutorMessageDecayBuffer { mFALSE, 30, "ConstructTutorMessageDecayBuffer" }, // pfnConstructTutorMessageDecayBuffer
{ mFALSE, 30, "ConstructTutorMessageDecayBuffer" }, // pfnConstructTutorMessageDecayBuffer { mFALSE, 9, "ResetTutorMessageDecayData" }, // pfnResetTutorMessageDecayData
{ mFALSE, 9, "ResetTutorMessageDecayData" }, // pfnResetTutorMessageDecayData
// Added 2005-08-11 (no SDK update) { mFALSE, 3, "QueryClientCvarValue" }, //pfnQueryClientCvarValue
{ mFALSE, 3, "QueryClientCvarValue" }, //pfnQueryClientCvarValue { mFALSE, 3, "QueryClientCvarValue2" }, //pfnQueryClientCvarValue2
// Added 2005-11-22 (no SDK update) { mFALSE, 8, "CheckParm" }, //pfnCheckParm
{ mFALSE, 3, "QueryClientCvarValue2" }, //pfnQueryClientCvarValue2
// Added 2009-06-17 (no SDK update)
{ mFALSE, 8, "CheckParm" }, //pfnCheckParm
// end // end
{ mFALSE, 0, NULL }, { mFALSE, 0, NULL },
}; };

View File

@ -1,58 +1,20 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// api_info.h - structures to store info about api routines
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef API_INFO_H
#define API_INFO_H
#include "types_meta.h" // mBOOL
#include "types_meta.h"
#define P_PRE 0 // plugin function called before gamedll #define P_PRE 0 // plugin function called before gamedll
#define P_POST 1 // plugin function called after gamedll #define P_POST 1 // plugin function called after gamedll
struct api_info_t
typedef struct api_info_s { {
mBOOL trace; // if true, log info about this function mBOOL trace; // if true, log info about this function
int loglevel; // level at which to log info about this function int loglevel; // level at which to log info about this function
const char *name; // string representation of function name const char *name; // string representation of function name
} api_info_t; };
// DLL api functions // DLL api functions
typedef struct dllapi_info_s { struct dllapi_info_t
{
api_info_t pfnGameInit; api_info_t pfnGameInit;
api_info_t pfnSpawn; api_info_t pfnSpawn;
api_info_t pfnThink; api_info_t pfnThink;
@ -103,25 +65,27 @@ typedef struct dllapi_info_s {
api_info_t pfnCreateInstancedBaselines; api_info_t pfnCreateInstancedBaselines;
api_info_t pfnInconsistentFile; api_info_t pfnInconsistentFile;
api_info_t pfnAllowLagCompensation; api_info_t pfnAllowLagCompensation;
api_info_t END;
} dllapi_info_t;
// end
api_info_t END;
};
// "New" api functions // "New" api functions
typedef struct newapi_info_s { struct newapi_info_t
{
api_info_t pfnOnFreeEntPrivateData; api_info_t pfnOnFreeEntPrivateData;
api_info_t pfnGameShutdown; api_info_t pfnGameShutdown;
api_info_t pfnShouldCollide; api_info_t pfnShouldCollide;
// Added 2005/08/11 (no SDK update)
api_info_t pfnCvarValue; api_info_t pfnCvarValue;
// Added 2005/11/22 (no SDK update)
api_info_t pfnCvarValue2; api_info_t pfnCvarValue2;
api_info_t END;
} newapi_info_t;
// end
api_info_t END;
};
// g_engine functions // g_engine functions
typedef struct engine_info_s { struct engine_info_t
{
api_info_t pfnPrecacheModel; api_info_t pfnPrecacheModel;
api_info_t pfnPrecacheSound; api_info_t pfnPrecacheSound;
api_info_t pfnSetModel; api_info_t pfnSetModel;
@ -263,12 +227,9 @@ typedef struct engine_info_s {
api_info_t pfnForceUnmodified; api_info_t pfnForceUnmodified;
api_info_t pfnGetPlayerStats; api_info_t pfnGetPlayerStats;
api_info_t pfnAddServerCommand; api_info_t pfnAddServerCommand;
// Added in SDK 2.2:
api_info_t pfnVoice_GetClientListening; api_info_t pfnVoice_GetClientListening;
api_info_t pfnVoice_SetClientListening; api_info_t pfnVoice_SetClientListening;
// Added for HL 1109 (no SDK update):
api_info_t pfnGetPlayerAuthId; api_info_t pfnGetPlayerAuthId;
// Added 2003/11/10 (no SDK update):
api_info_t pfnSequenceGet; api_info_t pfnSequenceGet;
api_info_t pfnSequencePickSentence; api_info_t pfnSequencePickSentence;
api_info_t pfnGetFileSize; api_info_t pfnGetFileSize;
@ -280,19 +241,14 @@ typedef struct engine_info_s {
api_info_t pfnProcessTutorMessageDecayBuffer; api_info_t pfnProcessTutorMessageDecayBuffer;
api_info_t pfnConstructTutorMessageDecayBuffer; api_info_t pfnConstructTutorMessageDecayBuffer;
api_info_t pfnResetTutorMessageDecayData; api_info_t pfnResetTutorMessageDecayData;
// Added 2005/08/11 (no SDK update)
api_info_t pfnQueryClientCvarValue; api_info_t pfnQueryClientCvarValue;
// Added 2005/11/22 (no SDK update)
api_info_t pfnQueryClientCvarValue2; api_info_t pfnQueryClientCvarValue2;
// Added 2009/06/17 (no SDK update)
api_info_t pfnEngCheckParm; api_info_t pfnEngCheckParm;
// end // end
api_info_t END; api_info_t END;
} engine_info_t; };
extern dllapi_info_t dllapi_info; extern dllapi_info_t dllapi_info;
extern newapi_info_t newapi_info; extern newapi_info_t newapi_info;
extern engine_info_t engine_info; extern engine_info_t engine_info;
#endif /* API_INFO_H */

View File

@ -1,39 +1,3 @@
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// commands_meta.cpp - implementation of various console commands
/*
* Copyright (c) 2001-2004 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#include "precompiled.h" #include "precompiled.h"
struct metacmd_t struct metacmd_t
@ -44,26 +8,28 @@ struct metacmd_t
metacmd_t g_meta_cmds[] = metacmd_t g_meta_cmds[] =
{ {
{"version", cmd_meta_version}, {"version", cmd_meta_version},
{"gpl", cmd_meta_gpl}, {"gpl", cmd_meta_gpl},
{"refresh", cmd_meta_refresh}, {"refresh", cmd_meta_refresh},
{"list", cmd_meta_pluginlist}, {"list", cmd_meta_pluginlist},
{"cmds", cmd_meta_cmdlist}, {"cmds", cmd_meta_cmdlist},
{"cvars", cmd_meta_cvarlist}, {"cvars", cmd_meta_cvarlist},
{"game", cmd_meta_game}, {"game", cmd_meta_game},
{"config", cmd_meta_config}, {"config", cmd_meta_config},
// arguments: existing plugin(s) // arguments: existing plugin(s)
{"pause", []() { cmd_doplug(PC_PAUSE); }}, {"pause", []() { cmd_doplug(PC_PAUSE); }},
{"unpause", []() { cmd_doplug(PC_UNPAUSE); }}, {"unpause", []() { cmd_doplug(PC_UNPAUSE); }},
{"unload", []() { cmd_doplug(PC_UNLOAD); }}, {"unload", []() { cmd_doplug(PC_UNLOAD); }},
{"force_unload", []() { cmd_doplug(PC_FORCE_UNLOAD); }}, {"force_unload", []() { cmd_doplug(PC_FORCE_UNLOAD); }},
{"reload", []() { cmd_doplug(PC_RELOAD); }}, {"reload", []() { cmd_doplug(PC_RELOAD); }},
{"retry", []() { cmd_doplug(PC_RETRY); }}, {"retry", []() { cmd_doplug(PC_RETRY); }},
{"clear", []() { cmd_doplug(PC_CLEAR); }}, {"clear", []() { cmd_doplug(PC_CLEAR); }},
{"info", []() { cmd_doplug(PC_INFO); }}, {"info", []() { cmd_doplug(PC_INFO); }},
{"require", []() { cmd_doplug(PC_REQUIRE); }}, {"require", []() { cmd_doplug(PC_REQUIRE); }},
// arguments: filename, description // arguments: filename, description
{"load", cmd_meta_load}, {"load", cmd_meta_load},
}; };
// Register commands and cvars. // Register commands and cvars.
@ -75,12 +41,14 @@ void meta_register_cmdcvar()
} }
// Parse "meta" console command. // Parse "meta" console command.
void server_meta(void) void server_meta()
{ {
const char* cmd = CMD_ARGV(1); const char *cmd = CMD_ARGV(1);
for (auto& meta_cmd : g_meta_cmds) { for (auto& meta_cmd : g_meta_cmds)
if (!strcmp(cmd, meta_cmd.name)) { {
if (!Q_strcmp(cmd, meta_cmd.name))
{
meta_cmd.handler(); meta_cmd.handler();
return; return;
} }
@ -93,24 +61,25 @@ void server_meta(void)
// Parse "meta" client command. // Parse "meta" client command.
void client_meta(edict_t* pEntity) void client_meta(edict_t* pEntity)
{ {
const char* cmd = CMD_ARGV(1); const char *cmd = CMD_ARGV(1);
META_LOG("ClientCommand 'meta %s' from player '%s'", CMD_ARGS(), STRING(pEntity->v.netname)); META_LOG("ClientCommand 'meta %s' from player '%s'", CMD_ARGS(), STRING(pEntity->v.netname));
// arguments: none // arguments: none
if (!strcmp(cmd, "version")) if (!Q_strcmp(cmd, "version"))
client_meta_version(pEntity); client_meta_version(pEntity);
else if (!strcmp(cmd, "list"))
else if (!Q_strcmp(cmd, "list"))
client_meta_pluginlist(pEntity); client_meta_pluginlist(pEntity);
// unrecognized else
else { {
META_CLIENT(pEntity, "Unrecognized meta command: %s", cmd); META_CLIENT(pEntity, "Unrecognized meta command: %s", cmd);
client_meta_usage(pEntity); client_meta_usage(pEntity);
return;
} }
} }
// Print usage for "meta" console command. // Print usage for "meta" console command.
void cmd_meta_usage(void) void cmd_meta_usage()
{ {
META_CONS("usage: meta <command> [<arguments>]"); META_CONS("usage: meta <command> [<arguments>]");
META_CONS("valid commands are:"); META_CONS("valid commands are:");
@ -134,7 +103,7 @@ void cmd_meta_usage(void)
} }
// Print usage for "meta" client command. // Print usage for "meta" client command.
void client_meta_usage(edict_t* pEntity) void client_meta_usage(edict_t *pEntity)
{ {
META_CLIENT(pEntity, "usage: meta <command> [<arguments>]"); META_CLIENT(pEntity, "usage: meta <command> [<arguments>]");
META_CLIENT(pEntity, "valid commands are:"); META_CLIENT(pEntity, "valid commands are:");
@ -143,37 +112,38 @@ void client_meta_usage(edict_t* pEntity)
} }
// "meta version" console command. // "meta version" console command.
void cmd_meta_version(void) void cmd_meta_version()
{ {
if (CMD_ARGC() != 2) { if (CMD_ARGC() != 2)
{
META_CONS("usage: meta version"); META_CONS("usage: meta version");
return; return;
} }
META_CONS("%s v%s %s (%s)", VNAME, VVERSION, VDATE, META_INTERFACE_VERSION);
META_CONS("by %s", VAUTHOR); META_CONS("Metamod v%s, API (%s)", APP_VERSION_STRD, META_INTERFACE_VERSION);
META_CONS(" %s", VURL); META_CONS("Metamod build: " __TIME__ " " __DATE__ " (" APP_VERSION_STRD ")");
META_CONS("compiled: %s %s (%s)", COMPILE_TIME, COMPILE_TZONE, OPT_TYPE); META_CONS("Metamod from: " APP_COMMITS_URL APP_COMMIT_ID " " APP_COMMIT_AUTHOR "");
} }
// "meta version" client command. // "meta version" client command.
void client_meta_version(edict_t* pEntity) void client_meta_version(edict_t *pEntity)
{ {
if (CMD_ARGC() != 2) { if (CMD_ARGC() != 2)
{
META_CLIENT(pEntity, "usage: meta version"); META_CLIENT(pEntity, "usage: meta version");
return; return;
} }
META_CLIENT(pEntity, "%s v%s %s (%s)", VNAME, VVERSION, VDATE, META_INTERFACE_VERSION);
META_CLIENT(pEntity, "by %s", VAUTHOR); META_CONS("Metamod v%s, API (%s)", APP_VERSION_STRD, META_INTERFACE_VERSION);
META_CLIENT(pEntity, " %s", VURL); META_CONS("Metamod build: " __TIME__ " " __DATE__ " (" APP_VERSION_STRD ")");
META_CLIENT(pEntity, "compiled: %s %s (%s)", COMPILE_TIME, COMPILE_TZONE, OPT_TYPE); META_CONS("Metamod from: " APP_COMMITS_URL APP_COMMIT_ID " " APP_COMMIT_AUTHOR "");
META_CLIENT(pEntity, "ifvers: %s", META_INTERFACE_VERSION);
} }
// "meta gpl" console command. // "meta gpl" console command.
void cmd_meta_gpl(void) void cmd_meta_gpl()
{ {
META_CONS("%s version %s %s", VNAME, VVERSION, VDATE); META_CONS("Metamod version " __TIME__ " " __DATE__);
META_CONS("Copyright (c) 2001-%s Will Day <willday@hpgx.net>", COPYRIGHT_YEAR); META_CONS("Copyright (c) 2001-2016 Will Day (modification ReHLDS Team)");
META_CONS(""); META_CONS("");
META_CONS(" Metamod is free software; you can redistribute it and/or"); META_CONS(" Metamod is free software; you can redistribute it and/or");
META_CONS(" modify it under the terms of the GNU General Public License"); META_CONS(" modify it under the terms of the GNU General Public License");
@ -193,10 +163,10 @@ void cmd_meta_gpl(void)
META_CONS(" "); META_CONS(" ");
META_CONS(" In addition, as a special exception, the author gives"); META_CONS(" In addition, as a special exception, the author gives");
META_CONS(" permission to link the code of this program with the"); META_CONS(" permission to link the code of this program with the");
META_CONS(" Half-Life Game g_engine (\"HL g_engine\") and Modified Game"); META_CONS(" Half-Life Game Engine (\"HL Engine\") and Modified Game");
META_CONS(" Libraries (\"MODs\") developed by Valve, L.L.C (\"Valve\")."); META_CONS(" Libraries (\"MODs\") developed by Valve, L.L.C (\"Valve\").");
META_CONS(" You must obey the GNU General Public License in all"); META_CONS(" You must obey the GNU General Public License in all");
META_CONS(" respects for all of the code used other than the HL g_engine"); META_CONS(" respects for all of the code used other than the HL Engine");
META_CONS(" and MODs from Valve. If you modify this file, you may"); META_CONS(" and MODs from Valve. If you modify this file, you may");
META_CONS(" extend this exception to your version of the file, but you"); META_CONS(" extend this exception to your version of the file, but you");
META_CONS(" are not obligated to do so. If you do not wish to do so,"); META_CONS(" are not obligated to do so. If you do not wish to do so,");
@ -204,12 +174,14 @@ void cmd_meta_gpl(void)
} }
// "meta game" console command. // "meta game" console command.
void cmd_meta_game(void) void cmd_meta_game()
{ {
if (CMD_ARGC() != 2) { if (CMD_ARGC() != 2)
{
META_CONS("usage: meta game"); META_CONS("usage: meta game");
return; return;
} }
META_CONS("GameDLL info:"); META_CONS("GameDLL info:");
META_CONS(" name: %s", GameDLL.name); META_CONS(" name: %s", GameDLL.name);
META_CONS(" desc: %s", GameDLL.desc); META_CONS(" desc: %s", GameDLL.desc);
@ -220,67 +192,78 @@ void cmd_meta_game(void)
} }
// "meta refresh" console command. // "meta refresh" console command.
void cmd_meta_refresh(void) void cmd_meta_refresh()
{ {
if (CMD_ARGC() != 2) { if (CMD_ARGC() != 2)
{
META_CONS("usage: meta refresh"); META_CONS("usage: meta refresh");
return; return;
} }
META_LOG("Refreshing the plugins on demand..."); META_LOG("Refreshing the plugins on demand...");
if (g_plugins->refresh(PT_ANYTIME) != mTRUE)
if (g_plugins->refresh(PT_ANYTIME) != mTRUE) { {
META_LOG("Refresh failed."); META_LOG("Refresh failed.");
} }
} }
// "meta list" console command. // "meta list" console command.
void cmd_meta_pluginlist(void) void cmd_meta_pluginlist()
{ {
if (CMD_ARGC() != 2) { if (CMD_ARGC() != 2)
{
META_CONS("usage: meta list"); META_CONS("usage: meta list");
return; return;
} }
g_plugins->show(0); g_plugins->show(0);
} }
// "meta list" client command. // "meta list" client command.
void client_meta_pluginlist(edict_t* pEntity) void client_meta_pluginlist(edict_t* pEntity)
{ {
if (CMD_ARGC() != 2) { if (CMD_ARGC() != 2)
{
META_CLIENT(pEntity, "usage: meta list"); META_CLIENT(pEntity, "usage: meta list");
return; return;
} }
g_plugins->show_client(pEntity); g_plugins->show_client(pEntity);
} }
// "meta cmds" console command. // "meta cmds" console command.
void cmd_meta_cmdlist(void) void cmd_meta_cmdlist()
{ {
if (CMD_ARGC() != 2) { if (CMD_ARGC() != 2)
{
META_CONS("usage: meta cmds"); META_CONS("usage: meta cmds");
return; return;
} }
g_regCmds->show(); g_regCmds->show();
} }
// "meta cvars" console command. // "meta cvars" console command.
void cmd_meta_cvarlist(void) void cmd_meta_cvarlist()
{ {
if (CMD_ARGC() != 2) { if (CMD_ARGC() != 2)
{
META_CONS("usage: meta cvars"); META_CONS("usage: meta cvars");
return; return;
} }
g_regCvars->show(); g_regCvars->show();
} }
// "meta config" console command. // "meta config" console command.
void cmd_meta_config(void) void cmd_meta_config()
{ {
if (CMD_ARGC() != 2) { if (CMD_ARGC() != 2)
{
META_CONS("usage: meta cvars"); META_CONS("usage: meta cvars");
return; return;
} }
g_config->show(); g_config->show();
} }
@ -297,31 +280,26 @@ void cmd_meta_config(void)
// path_i386.so, path_i486.so, etc // path_i386.so, path_i486.so, etc
// "meta load" console command. // "meta load" console command.
void cmd_meta_load(void) void cmd_meta_load()
{ {
int argc = CMD_ARGC(); int argc = CMD_ARGC();
if (argc < 3)
if (argc < 3) { {
META_CONS("usage: meta load <name> [<description>]"); META_CONS("usage: meta load <name> [<description>]");
META_CONS(" where <name> is an identifier used to locate the plugin file."); META_CONS(" where <name> is an identifier used to locate the plugin file.");
META_CONS(" The system will look for a number of files based on this name, including:"); META_CONS(" The system will look for a number of files based on this name, including:");
META_CONS(" name"); META_CONS(" name");
#ifdef linux #ifdef _WIN32
META_CONS(" name.dll");
META_CONS(" name_mm.dll");
META_CONS(" mm_name.dll");
#else
META_CONS(" name.so"); META_CONS(" name.so");
META_CONS(" name_mm.so"); META_CONS(" name_mm.so");
META_CONS(" name_MM.so"); META_CONS(" name_MM.so");
META_CONS(" mm_name.so"); META_CONS(" mm_name.so");
META_CONS(" name_i386.so"); #endif
META_CONS(" name_i686.so");
#elif defined(__APPLE__)
META_CONS(" name.dylib");
META_CONS(" name_mm.dylib");
META_CONS(" mm_name.dylib");
#elif defined(_WIN32)
META_CONS(" name.dll");
META_CONS(" name_mm.dll");
META_CONS(" mm_name.dll");
#endif /* linux */
META_CONS(" in a number of directories, including:"); META_CONS(" in a number of directories, including:");
META_CONS(" <gamedir>"); META_CONS(" <gamedir>");
META_CONS(" <gamedir>/dlls"); META_CONS(" <gamedir>/dlls");
@ -329,7 +307,7 @@ void cmd_meta_load(void)
return; return;
} }
const char* args = CMD_ARGS(); const char *args = CMD_ARGS();
// cmd_addload() handles all the feedback to the console.. // cmd_addload() handles all the feedback to the console..
g_plugins->cmd_addload(args); g_plugins->cmd_addload(args);
} }
@ -338,24 +316,29 @@ void cmd_meta_load(void)
void cmd_doplug(PLUG_CMD pcmd) void cmd_doplug(PLUG_CMD pcmd)
{ {
int argc = CMD_ARGC(); int argc = CMD_ARGC();
const char* cmd = CMD_ARGV(1); const char *cmd = CMD_ARGV(1);
if (argc < 3) { if (argc < 3)
{
META_CONS("usage: meta %s <plugin> [<plugin> ...]", cmd); META_CONS("usage: meta %s <plugin> [<plugin> ...]", cmd);
META_CONS(" where <plugin> can be either the plugin index #"); META_CONS(" where <plugin> can be either the plugin index #");
META_CONS(" or a non-ambiguous prefix string matching name, desc, file, or logtag"); META_CONS(" or a non-ambiguous prefix string matching name, desc, file, or logtag");
return; return;
} }
// i=2 to skip first arg, as that's the "cmd"
for (int i = 2; i < argc; i++) { // i = 2 to skip first arg, as that's the "cmd"
const char* arg = CMD_ARGV(i); for (int i = 2; i < argc; i++)
MPlugin* findp; {
char* endptr; const char *arg = CMD_ARGV(i);
MPlugin *findp;
char *endptr;
// try to match plugin id first // try to match plugin id first
long pindex = strtol(arg, &endptr, 10); int pindex = strtol(arg, &endptr, 10);
if (*arg != '\0' && *endptr == '\0')
if (*arg && !*endptr)
findp = g_plugins->find(pindex); findp = g_plugins->find(pindex);
// else try to match some string (prefix) // else try to match some string (prefix)
else else
findp = g_plugins->find_match(arg); findp = g_plugins->find_match(arg);
@ -364,40 +347,37 @@ void cmd_doplug(PLUG_CMD pcmd)
// - specified plugin was found in the list of current plugins // - specified plugin was found in the list of current plugins
// - plugin successfully loaded and began running // - plugin successfully loaded and began running
// Otherwise, print error and exit. // Otherwise, print error and exit.
if (pcmd == PC_REQUIRE) { if (pcmd == PC_REQUIRE)
if (findp && findp->status >= PL_RUNNING) { {
if (findp && findp->status >= PL_RUNNING)
{
META_DEBUG(3, ("Required plugin '%s' found loaded and running.", arg)); META_DEBUG(3, ("Required plugin '%s' found loaded and running.", arg));
return; return;
} }
// Output to both places, because we don't want the admin // Output to both places, because we don't want the admin
// to miss this.. // to miss this..
if (!findp && meta_errno == ME_NOTUNIQ) { if (!findp && meta_errno == ME_NOTUNIQ)
{
META_ERROR("Unique match for required plugin '%s' was not found! Exiting.", arg); META_ERROR("Unique match for required plugin '%s' was not found! Exiting.", arg);
META_CONS("\nERROR: Unique match for required plugin '%s' was not found! Exiting.\n", arg); META_CONS("\nERROR: Unique match for required plugin '%s' was not found! Exiting.\n", arg);
} }
else if (!findp) { else if (!findp)
{
META_ERROR("Required plugin '%s' was not found! Exiting.", arg); META_ERROR("Required plugin '%s' was not found! Exiting.", arg);
META_CONS("\nERROR: Required plugin '%s' was not found! Exiting.\n", arg); META_CONS("\nERROR: Required plugin '%s' was not found! Exiting.\n", arg);
} }
else { else
{
META_ERROR("Required plugin '%s' did not load successfully! (status=%s) Exiting.", arg, findp->str_status(ST_SIMPLE)); META_ERROR("Required plugin '%s' did not load successfully! (status=%s) Exiting.", arg, findp->str_status(ST_SIMPLE));
META_CONS("\nERROR: Required plugin '%s' did not load successfully! (status=%s) Exiting.\n", arg, findp->str_status(ST_SIMPLE)); META_CONS("\nERROR: Required plugin '%s' did not load successfully! (status=%s) Exiting.\n", arg, findp->str_status(ST_SIMPLE));
} }
// Allow chance to read the message, before any window closes. // Allow chance to read the message, before any window closes.
sleep(1); do_exit(1);
#ifdef linux
// Argh, "quit" appears to segfault the server under linux; I
// was unable to determine why.
exit(1);
#else
// Argh, and exit() appears to generate an "Application Error"
// under MSVC. Interestingly, both seem to work fine with
// mingw32.
SERVER_COMMAND("quit\n");
#endif /* not linux */
} }
if (!findp) { if (!findp)
{
if (meta_errno == ME_NOTUNIQ) if (meta_errno == ME_NOTUNIQ)
META_CONS("Couldn't find unique plugin matching '%s'", arg); META_CONS("Couldn't find unique plugin matching '%s'", arg);
else else
@ -405,39 +385,48 @@ void cmd_doplug(PLUG_CMD pcmd)
return; return;
} }
if (pcmd == PC_PAUSE) { switch (pcmd)
{
case PC_PAUSE:
if (findp->pause()) if (findp->pause())
META_CONS("Paused plugin '%s'", findp->desc); META_CONS("Paused plugin '%s'", findp->desc);
else else
META_CONS("Pause failed for plugin '%s'", findp->desc); META_CONS("Pause failed for plugin '%s'", findp->desc);
} break;
else if (pcmd == PC_UNPAUSE) { case PC_UNPAUSE:
if (findp->unpause()) if (findp->unpause())
META_CONS("Unpaused plugin '%s'", findp->desc); META_CONS("Unpaused plugin '%s'", findp->desc);
else else
META_CONS("Unpause failed for plugin '%s'", findp->desc); META_CONS("Unpause failed for plugin '%s'", findp->desc);
} break;
else if (pcmd == PC_UNLOAD) { case PC_UNLOAD:
{
findp->action = PA_UNLOAD; findp->action = PA_UNLOAD;
if (findp->unload(PT_ANYTIME, PNL_COMMAND, PNL_COMMAND)) { if (findp->unload(PT_ANYTIME, PNL_COMMAND, PNL_COMMAND))
{
META_CONS("Unloaded plugin '%s'", findp->desc); META_CONS("Unloaded plugin '%s'", findp->desc);
g_plugins->show(0); g_plugins->show();
} }
else if (meta_errno == ME_DELAYED) else if (meta_errno == ME_DELAYED)
META_CONS("Unload delayed for plugin '%s'", findp->desc); META_CONS("Unload delayed for plugin '%s'", findp->desc);
else else
META_CONS("Unload failed for plugin '%s'", findp->desc); META_CONS("Unload failed for plugin '%s'", findp->desc);
break;
} }
else if (pcmd == PC_FORCE_UNLOAD) { case PC_FORCE_UNLOAD:
{
findp->action = PA_UNLOAD; findp->action = PA_UNLOAD;
if (findp->unload(PT_ANYTIME, PNL_CMD_FORCED, PNL_CMD_FORCED)) { if (findp->unload(PT_ANYTIME, PNL_CMD_FORCED, PNL_CMD_FORCED))
{
META_CONS("Forced unload plugin '%s'", findp->desc); META_CONS("Forced unload plugin '%s'", findp->desc);
g_plugins->show(0); g_plugins->show();
} }
else else
META_CONS("Forced unload failed for plugin '%s'", findp->desc); META_CONS("Forced unload failed for plugin '%s'", findp->desc);
break;
} }
else if (pcmd == PC_RELOAD) { case PC_RELOAD:
{
findp->action = PA_RELOAD; findp->action = PA_RELOAD;
if (findp->reload(PT_ANYTIME, PNL_COMMAND)) if (findp->reload(PT_ANYTIME, PNL_COMMAND))
META_CONS("Reloaded plugin '%s'", findp->desc); META_CONS("Reloaded plugin '%s'", findp->desc);
@ -447,26 +436,31 @@ void cmd_doplug(PLUG_CMD pcmd)
META_CONS("Reload not allowed for plugin '%s' now, only allowed %s", findp->desc, findp->str_loadable(SL_ALLOWED)); META_CONS("Reload not allowed for plugin '%s' now, only allowed %s", findp->desc, findp->str_loadable(SL_ALLOWED));
else else
META_CONS("Reload failed for plugin '%s'", findp->desc); META_CONS("Reload failed for plugin '%s'", findp->desc);
break;
} }
else if (pcmd == PC_RETRY) { case PC_RETRY:
if (findp->retry(PT_ANYTIME, PNL_COMMAND)) if (findp->retry(PT_ANYTIME, PNL_COMMAND))
META_CONS("Retry succeeded for plugin '%s'", findp->desc); META_CONS("Retry succeeded for plugin '%s'", findp->desc);
else else
META_CONS("Retry failed for plugin '%s'", findp->desc); META_CONS("Retry failed for plugin '%s'", findp->desc);
} break;
else if (pcmd == PC_CLEAR) { case PC_CLEAR:
if (findp->clear()) { if (!findp->clear())
META_CONS("Cleared failed plugin '%s' from list", findp->desc); {
g_plugins->show(0);
}
else
META_CONS("Clear failed for plugin '%s'", findp->desc); META_CONS("Clear failed for plugin '%s'", findp->desc);
} return;
else if (pcmd == PC_INFO) }
META_CONS("Cleared failed plugin '%s' from list", findp->desc);
g_plugins->show();
break;
case PC_INFO:
findp->show(); findp->show();
else { break;
META_ERROR("Unexpected plug_cmd: %d", pcmd); default:
META_WARNING("Unexpected plug_cmd: %d", pcmd);
META_CONS("Command failed; see log"); META_CONS("Command failed; see log");
break;
} }
} }
} }

View File

@ -1,47 +1,11 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// commands_meta.h - prototypes for console commands #include "types_meta.h"
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef COMMANDS_META_H
#define COMMANDS_META_H
#include "types_meta.h" // mBOOL
// Flags to use for meta_cmd_doplug(), to operate on existing plugins; note // Flags to use for meta_cmd_doplug(), to operate on existing plugins; note
// "load" operates on a non-existing plugin thus isn't included here. // "load" operates on a non-existing plugin thus isn't included here.
typedef enum { enum PLUG_CMD
{
PC_NULL = 0, PC_NULL = 0,
PC_PAUSE, // pause the plugin PC_PAUSE, // pause the plugin
PC_UNPAUSE, // unpause the plugin PC_UNPAUSE, // unpause the plugin
@ -52,24 +16,24 @@ typedef enum {
PC_CLEAR, // remove a failed plugin from the list PC_CLEAR, // remove a failed plugin from the list
PC_FORCE_UNLOAD, // forcibly unload the plugin PC_FORCE_UNLOAD, // forcibly unload the plugin
PC_REQUIRE, // require that this plugin is loaded/running PC_REQUIRE, // require that this plugin is loaded/running
} PLUG_CMD; };
void meta_register_cmdcvar(); void meta_register_cmdcvar();
void server_meta(void); void server_meta();
void cmd_meta_usage(void); void cmd_meta_usage();
void cmd_meta_version(void); void cmd_meta_version();
void cmd_meta_gpl(void); void cmd_meta_gpl();
void cmd_meta_game(void); void cmd_meta_game();
void cmd_meta_refresh(void); void cmd_meta_refresh();
void cmd_meta_load(void); void cmd_meta_load();
void cmd_meta_pluginlist(void); void cmd_meta_pluginlist();
void cmd_meta_cmdlist(void); void cmd_meta_cmdlist();
void cmd_meta_cvarlist(void); void cmd_meta_cvarlist();
void cmd_meta_config(void); void cmd_meta_config();
void cmd_doplug(PLUG_CMD pcmd); void cmd_doplug(PLUG_CMD pcmd);
@ -77,5 +41,3 @@ void client_meta(edict_t *pEntity);
void client_meta_usage(edict_t *pEntity); void client_meta_usage(edict_t *pEntity);
void client_meta_version(edict_t *pEntity); void client_meta_version(edict_t *pEntity);
void client_meta_pluginlist(edict_t *pEntity); void client_meta_pluginlist(edict_t *pEntity);
#endif /* COMMANDS_META_H */

View File

@ -1,42 +1,8 @@
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// conf_meta.cpp - configfile reading routines
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#include "precompiled.h" #include "precompiled.h"
MConfig::MConfig() : list(NULL), filename(NULL), debuglevel(0), gamedll(NULL), plugins_file(NULL), exec_cfg(NULL) MConfig::MConfig()
: list(nullptr), filename(nullptr), debuglevel(0),
plugins_file(nullptr), exec_cfg(nullptr)
{ {
} }
@ -49,12 +15,14 @@ void MConfig::init(option_t* global_options)
set(optp, optp->init); set(optp, optp->init);
} }
option_t* MConfig::find(const char* lookup) const option_t *MConfig::find(const char* lookup) const
{ {
for (auto optp = list; optp->name; optp++) for (auto optp = list; optp->name; optp++)
if (!strcmp(optp->name, lookup)) { {
if (!Q_strcmp(optp->name, lookup)) {
return optp; return optp;
} }
}
RETURN_ERRNO(NULL, ME_NOTFOUND); RETURN_ERRNO(NULL, ME_NOTFOUND);
} }
@ -62,7 +30,6 @@ option_t* MConfig::find(const char* lookup) const
mBOOL MConfig::set(const char* key, const char* value) mBOOL MConfig::set(const char* key, const char* value)
{ {
option_t* optp = find(key); option_t* optp = find(key);
if (optp) if (optp)
return set(optp, value); return set(optp, value);
@ -80,23 +47,28 @@ mBOOL MConfig::set(option_t* setp, const char* setstr)
if (!setstr) if (!setstr)
return mTRUE; return mTRUE;
switch (setp->type) { switch (setp->type)
{
case CF_INT: case CF_INT:
if (!isdigit(setstr[0])) { if (!isdigit(setstr[0]))
{
META_ERROR("option '%s' invalid format '%s'", setp->name, setstr); META_ERROR("option '%s' invalid format '%s'", setp->name, setstr);
RETURN_ERRNO(mFALSE, ME_FORMAT); RETURN_ERRNO(mFALSE, ME_FORMAT);
} }
*optval = atoi(setstr); *optval = Q_atoi(setstr);
META_DEBUG(3, ("set config int: %s = %d", setp->name, *optval)); META_DEBUG(3, ("set config int: %s = %d", setp->name, *optval));
break; break;
case CF_BOOL: case CF_BOOL:
if (is_yes(setstr)) { if (is_yes(setstr))
{
*optval = TRUE; *optval = TRUE;
} }
else if (is_no(setstr)) { else if (is_no(setstr))
{
*optval = FALSE; *optval = FALSE;
} }
else { else
{
META_ERROR("option '%s' invalid format '%s'", setp->name, META_ERROR("option '%s' invalid format '%s'", setp->name,
setstr); setstr);
RETURN_ERRNO(mFALSE, ME_FORMAT); RETURN_ERRNO(mFALSE, ME_FORMAT);
@ -105,33 +77,23 @@ mBOOL MConfig::set(option_t* setp, const char* setstr)
break; break;
case CF_STR: case CF_STR:
if (*optstr) if (*optstr)
free(*optstr); Q_free(*optstr);
*optstr = _strdup(setstr); *optstr = Q_strdup(setstr);
META_DEBUG(3, ("set config string: %s = %s", setp->name, *optstr)); META_DEBUG(3, ("set config string: %s = %s", setp->name, *optstr));
break; break;
case CF_PATH: case CF_PATH:
if (*optstr) if (*optstr)
free(*optstr); Q_free(*optstr);
full_gamedir_path(setstr, pathbuf); full_gamedir_path(setstr, pathbuf);
*optstr = _strdup(pathbuf); *optstr = Q_strdup(pathbuf);
META_DEBUG(3, ("set config path: %s = %s", setp->name, *optstr)); META_DEBUG(3, ("set config path: %s = %s", setp->name, *optstr));
break; break;
#if 0
case CF_CVAR:
CVAR_SET_STRING(optcvar->name, setstr);
META_DEBUG(3, ("set config cvar: %s = %s", optcvar->name, setstr));
break;
case CF_CMD:
optcmd(setp->name, setstr);
META_DEBUG(3, ("set config command: %s, %s",
optcvar->name, setstr));
break;
#endif
default: default:
META_ERROR("unrecognized config type '%d'", setp->type); META_ERROR("unrecognized config type '%d'", setp->type);
RETURN_ERRNO(mFALSE, ME_ARGUMENT); RETURN_ERRNO(mFALSE, ME_ARGUMENT);
} }
return (mTRUE);
return mTRUE;
} }
mBOOL MConfig::load(const char* fn) mBOOL MConfig::load(const char* fn)
@ -148,58 +110,61 @@ mBOOL MConfig::load(const char* fn)
full_gamedir_path(fn, loadfile); full_gamedir_path(fn, loadfile);
fp = fopen(loadfile, "r"); fp = fopen(loadfile, "r");
if (!fp) { if (!fp)
META_ERROR("unable to open config file '%s': %s", loadfile, {
strerror(errno)); META_ERROR("unable to open config file '%s': %s", loadfile, strerror(errno));
RETURN_ERRNO(mFALSE, ME_NOFILE); RETURN_ERRNO(mFALSE, ME_NOFILE);
} }
META_DEBUG(2, ("Loading from config file: %s", loadfile)); META_DEBUG(2, ("Loading from config file: %s", loadfile));
for (ln = 1; !feof(fp) && fgets(line, sizeof(line), fp); ln++) { for (ln = 1; !feof(fp) && fgets(line, sizeof(line), fp); ln++)
if (line[0] == '#') {
if (line[0] == '#' || line[0] == ';' || !Q_strncmp(line, "//", 2))
continue; continue;
if (line[0] == ';')
continue; if (!(optname = strtok(line, " \t\r\n")))
if (strnmatch(line, "//", 2)) {
continue; META_ERROR("'%s' line %d: bad config format: missing option", loadfile, ln);
if (!(optname = strtok(line, " \t\r\n"))) {
META_ERROR("'%s' line %d: bad config format: missing option",
loadfile, ln);
continue;
}
if (!(optval = strtok(NULL, "\r\n"))) {
META_ERROR("'%s' line %d: bad config format: missing value",
loadfile, ln);
continue; continue;
} }
if (!(optp = find(optname))) { if (!(optval = strtok(NULL, "\r\n")))
META_ERROR("'%s' line %d: unknown option name '%s'", {
loadfile, ln, optname); META_ERROR("'%s' line %d: bad config format: missing value", loadfile, ln);
continue; continue;
} }
if (!set(optp, optval)) { if (!(optp = find(optname)))
META_ERROR("'%s' line %d: unable to set option '%s' value '%s'", {
loadfile, ln, optname, optval); META_ERROR("'%s' line %d: unknown option name '%s'", loadfile, ln, optname);
continue;
}
if (!set(optp, optval))
{
META_ERROR("'%s' line %d: unable to set option '%s' value '%s'", loadfile, ln, optname, optval);
continue; continue;
} }
} }
filename = _strdup(loadfile);
filename = Q_strdup(loadfile);
fclose(fp); fclose(fp);
return (mTRUE); return mTRUE;
} }
void MConfig::show(void) const void MConfig::show() const
{ {
META_CONS("Config options from localinfo and %s:", filename); META_CONS("Config options from localinfo and %s:", filename);
for (auto optp = list; optp->name; optp++) { for (auto optp = list; optp->name; optp++)
int* optval = (int *) optp->dest; {
char** optstr = (char **) optp->dest; int *optval = (int *)optp->dest;
char **optstr = (char **)optp->dest;
// cvar_t *optcvar = (cvar_t *) optp->dest; // cvar_t *optcvar = (cvar_t *) optp->dest;
// SETOPT_FN optcmd = (SETOPT_FN) optp->dest; // SETOPT_FN optcmd = (SETOPT_FN) optp->dest;
switch (optp->type) { switch (optp->type)
{
case CF_INT: case CF_INT:
printf(" %-20s\t%d\n", optp->name, *optval); printf(" %-20s\t%d\n", optp->name, *optval);
break; break;
@ -210,14 +175,6 @@ void MConfig::show(void) const
case CF_PATH: case CF_PATH:
printf(" %-20s\t%s\n", optp->name, *optstr ? *optstr : ""); printf(" %-20s\t%s\n", optp->name, *optstr ? *optstr : "");
break; break;
#if 0
case CF_CVAR:
printf(" %-20s\tstores in: %s\n", optp->name, optcvar->name);
break;
case CF_CMD:
printf(" %-20s\tparsed by: %d\n", optp->name, (int) optcmd);
break;
#endif
case CF_NONE: case CF_NONE:
break; break;
} }

View File

@ -1,96 +1,49 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// conf_meta.h - configfile reading #include "types_meta.h"
// Modeled after mutt/init.[ch].
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef CONF_META_H
#define CONF_META_H
#include "types_meta.h" // mBOOL
// Max length of line in config file. // Max length of line in config file.
#define MAX_CONF_LEN 1024 #define MAX_CONF_LEN 1024
// Supported config value-types. // Supported config value-types.
typedef enum { enum cf_type_t
CF_NONE=0, {
CF_NONE = 0,
CF_INT, CF_INT,
CF_BOOL, CF_BOOL,
CF_STR, CF_STR,
CF_PATH, CF_PATH,
#if 0
CF_CVAR,
CF_CMD,
#endif
} cf_type_t;
typedef mBOOL (*SETOPT_FN) (char *key, char *value);
typedef struct option_s {
const char *name; // option name
cf_type_t type; // option type
void *dest; // addr of destination variable, or handler function
const char *init; // initial value, as a string, just as config file would
} option_t;
class MConfig {
private:
// data
option_t *list;
char *filename;
// functions
option_t *find(const char *lookup) const;
static mBOOL set(option_t *setp, const char *value);
// Private; to satisfy -Weffc++ "has pointer data members but does
// not override" copy/assignment constructor.
void operator=(const MConfig &src);
MConfig(const MConfig &src);
public:
// contructor
MConfig(void);
// data
int debuglevel; // to use for meta_debug
char *gamedll; // string if specified in config.ini
char *plugins_file; // ie metamod.ini, plugins.ini
char *exec_cfg; // ie metaexec.cfg, exec.cfg
// functions
void init(option_t *global_options);
mBOOL load(const char *filename);
mBOOL set(const char *key, const char *value);
void show(void) const;
}; };
#endif /* CONF_META_H */ struct option_t
{
char *name; // option name
cf_type_t type; // option type
void *dest; // addr of destination variable, or handler function
char *init; // initial value, as a string, just as config file would
};
class MConfig {
public:
MConfig();
int debuglevel; // to use for meta_debug
char *plugins_file; // ie metamod.ini, plugins.ini
char *exec_cfg; // ie metaexec.cfg, exec.cfg
void init(option_t *global_options);
mBOOL load(const char *filename);
mBOOL set(const char *key, const char *value);
void show() const;
private:
option_t *list;
char *filename;
option_t *find(const char *lookup) const;
static mBOOL set(option_t *setp, const char *value);
// Private; to satisfy -Weffc++ "has pointer data members but does
// not override" copy/assignment constructor.
void operator=(const MConfig &src);
MConfig(const MConfig &src);
};

View File

@ -1,39 +1,3 @@
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// dllapi.cpp - implementation of Half-Life DLL routines
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#include "precompiled.h" #include "precompiled.h"
// Original DLL routines, functions returning "void". // Original DLL routines, functions returning "void".
@ -65,110 +29,149 @@
CALL_GAME_API(pfnName, pfn_args, newapi_table); \ CALL_GAME_API(pfnName, pfn_args, newapi_table); \
CALL_PLUGIN_API(P_POST, ret_init, pfnName, pfn_args, MRES_OVERRIDE, newapi_post_table); CALL_PLUGIN_API(P_POST, ret_init, pfnName, pfn_args, MRES_OVERRIDE, newapi_post_table);
void mm_GameDLLInit(void)
// From SDK dlls/game.cpp: {
void mm_GameDLLInit(void) {
META_DLLAPI_HANDLE_void(FN_GAMEINIT, pfnGameInit, ()); META_DLLAPI_HANDLE_void(FN_GAMEINIT, pfnGameInit, ());
RETURN_API_void(); RETURN_API_void();
} }
// From SDK dlls/cbase.cpp: int mm_DispatchSpawn(edict_t *pent)
int mm_DispatchSpawn(edict_t *pent) { {
// 0==Success, -1==Failure ? // Success == 0, Failure == -1 ?
META_DLLAPI_HANDLE(int, 0, FN_DISPATCHSPAWN, pfnSpawn, (pent)); META_DLLAPI_HANDLE(int, 0, FN_DISPATCHSPAWN, pfnSpawn, (pent));
RETURN_API(); RETURN_API();
} }
void mm_DispatchThink(edict_t *pent) {
void mm_DispatchThink(edict_t *pent)
{
META_DLLAPI_HANDLE_void(FN_DISPATCHTHINK, pfnThink, (pent)); META_DLLAPI_HANDLE_void(FN_DISPATCHTHINK, pfnThink, (pent));
RETURN_API_void(); RETURN_API_void();
} }
void mm_DispatchUse(edict_t *pentUsed, edict_t *pentOther) {
void mm_DispatchUse(edict_t *pentUsed, edict_t *pentOther)
{
META_DLLAPI_HANDLE_void(FN_DISPATCHUSE, pfnUse, (pentUsed, pentOther)); META_DLLAPI_HANDLE_void(FN_DISPATCHUSE, pfnUse, (pentUsed, pentOther));
RETURN_API_void(); RETURN_API_void();
} }
void mm_DispatchTouch(edict_t *pentTouched, edict_t *pentOther) {
void mm_DispatchTouch(edict_t *pentTouched, edict_t *pentOther)
{
META_DLLAPI_HANDLE_void(FN_DISPATCHTOUCH, pfnTouch, (pentTouched, pentOther)); META_DLLAPI_HANDLE_void(FN_DISPATCHTOUCH, pfnTouch, (pentTouched, pentOther));
RETURN_API_void(); RETURN_API_void();
} }
void mm_DispatchBlocked(edict_t *pentBlocked, edict_t *pentOther) {
void mm_DispatchBlocked(edict_t *pentBlocked, edict_t *pentOther)
{
META_DLLAPI_HANDLE_void(FN_DISPATCHBLOCKED, pfnBlocked, (pentBlocked, pentOther)); META_DLLAPI_HANDLE_void(FN_DISPATCHBLOCKED, pfnBlocked, (pentBlocked, pentOther));
RETURN_API_void(); RETURN_API_void();
} }
void mm_DispatchKeyValue(edict_t *pentKeyvalue, KeyValueData *pkvd) {
void mm_DispatchKeyValue(edict_t *pentKeyvalue, KeyValueData *pkvd)
{
META_DLLAPI_HANDLE_void(FN_DISPATCHKEYVALUE, pfnKeyValue, (pentKeyvalue, pkvd)); META_DLLAPI_HANDLE_void(FN_DISPATCHKEYVALUE, pfnKeyValue, (pentKeyvalue, pkvd));
RETURN_API_void(); RETURN_API_void();
} }
void mm_DispatchSave(edict_t *pent, SAVERESTOREDATA *pSaveData) {
void mm_DispatchSave(edict_t *pent, SAVERESTOREDATA *pSaveData)
{
META_DLLAPI_HANDLE_void(FN_DISPATCHSAVE, pfnSave, (pent, pSaveData)); META_DLLAPI_HANDLE_void(FN_DISPATCHSAVE, pfnSave, (pent, pSaveData));
RETURN_API_void(); RETURN_API_void();
} }
int mm_DispatchRestore(edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity) {
// 0==Success, -1==Failure ? int mm_DispatchRestore(edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity)
{
// Success == 0, Failure == -1 ?
META_DLLAPI_HANDLE(int, 0, FN_DISPATCHRESTORE, pfnRestore, (pent, pSaveData, globalEntity)); META_DLLAPI_HANDLE(int, 0, FN_DISPATCHRESTORE, pfnRestore, (pent, pSaveData, globalEntity));
RETURN_API(); RETURN_API();
} }
void mm_DispatchObjectCollsionBox(edict_t *pent) {
void mm_DispatchObjectCollsionBox(edict_t *pent)
{
META_DLLAPI_HANDLE_void(FN_DISPATCHOBJECTCOLLISIONBOX, pfnSetAbsBox, (pent)); META_DLLAPI_HANDLE_void(FN_DISPATCHOBJECTCOLLISIONBOX, pfnSetAbsBox, (pent));
RETURN_API_void(); RETURN_API_void();
} }
void mm_SaveWriteFields(SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount) {
void mm_SaveWriteFields(SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount)
{
META_DLLAPI_HANDLE_void(FN_SAVEWRITEFIELDS, pfnSaveWriteFields, (pSaveData, pname, pBaseData, pFields, fieldCount)); META_DLLAPI_HANDLE_void(FN_SAVEWRITEFIELDS, pfnSaveWriteFields, (pSaveData, pname, pBaseData, pFields, fieldCount));
RETURN_API_void(); RETURN_API_void();
} }
void mm_SaveReadFields(SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount) {
void mm_SaveReadFields(SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount)
{
META_DLLAPI_HANDLE_void(FN_SAVEREADFIELDS, pfnSaveReadFields, (pSaveData, pname, pBaseData, pFields, fieldCount)); META_DLLAPI_HANDLE_void(FN_SAVEREADFIELDS, pfnSaveReadFields, (pSaveData, pname, pBaseData, pFields, fieldCount));
RETURN_API_void(); RETURN_API_void();
} }
// From SDK dlls/world.cpp: void mm_SaveGlobalState(SAVERESTOREDATA *pSaveData)
void mm_SaveGlobalState(SAVERESTOREDATA *pSaveData) { {
META_DLLAPI_HANDLE_void(FN_SAVEGLOBALSTATE, pfnSaveGlobalState, (pSaveData)); META_DLLAPI_HANDLE_void(FN_SAVEGLOBALSTATE, pfnSaveGlobalState, (pSaveData));
RETURN_API_void(); RETURN_API_void();
} }
void mm_RestoreGlobalState(SAVERESTOREDATA *pSaveData) {
void mm_RestoreGlobalState(SAVERESTOREDATA *pSaveData)
{
META_DLLAPI_HANDLE_void(FN_RESTOREGLOBALSTATE, pfnRestoreGlobalState, (pSaveData)); META_DLLAPI_HANDLE_void(FN_RESTOREGLOBALSTATE, pfnRestoreGlobalState, (pSaveData));
RETURN_API_void(); RETURN_API_void();
} }
void mm_ResetGlobalState(void) {
void mm_ResetGlobalState(void)
{
META_DLLAPI_HANDLE_void(FN_RESETGLOBALSTATE, pfnResetGlobalState, ()); META_DLLAPI_HANDLE_void(FN_RESETGLOBALSTATE, pfnResetGlobalState, ());
RETURN_API_void(); RETURN_API_void();
} }
// From SDK dlls/client.cpp: BOOL mm_ClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[ 128 ] )
BOOL mm_ClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[ 128 ] ) { {
g_Players.clear_player_cvar_query(pEntity); g_Players.clear_player_cvar_query(pEntity);
META_DLLAPI_HANDLE(BOOL, TRUE, FN_CLIENTCONNECT, pfnClientConnect, (pEntity, pszName, pszAddress, szRejectReason)); META_DLLAPI_HANDLE(BOOL, TRUE, FN_CLIENTCONNECT, pfnClientConnect, (pEntity, pszName, pszAddress, szRejectReason));
RETURN_API(); RETURN_API();
} }
void mm_ClientDisconnect(edict_t *pEntity) {
void mm_ClientDisconnect(edict_t *pEntity)
{
g_Players.clear_player_cvar_query(pEntity); g_Players.clear_player_cvar_query(pEntity);
META_DLLAPI_HANDLE_void(FN_CLIENTDISCONNECT, pfnClientDisconnect, (pEntity)); META_DLLAPI_HANDLE_void(FN_CLIENTDISCONNECT, pfnClientDisconnect, (pEntity));
RETURN_API_void(); RETURN_API_void();
} }
void mm_ClientKill(edict_t *pEntity) {
void mm_ClientKill(edict_t *pEntity)
{
META_DLLAPI_HANDLE_void(FN_CLIENTKILL, pfnClientKill, (pEntity)); META_DLLAPI_HANDLE_void(FN_CLIENTKILL, pfnClientKill, (pEntity));
RETURN_API_void(); RETURN_API_void();
} }
void mm_ClientPutInServer(edict_t *pEntity) {
void mm_ClientPutInServer(edict_t *pEntity)
{
META_DLLAPI_HANDLE_void(FN_CLIENTPUTINSERVER, pfnClientPutInServer, (pEntity)); META_DLLAPI_HANDLE_void(FN_CLIENTPUTINSERVER, pfnClientPutInServer, (pEntity));
RETURN_API_void(); RETURN_API_void();
} }
void mm_ClientCommand(edict_t *pEntity) {
if(!strcmp(CMD_ARGV(0), "meta")) { void mm_ClientCommand(edict_t *pEntity)
{
if (!Q_strcmp(CMD_ARGV(0), "meta"))
{
client_meta(pEntity); client_meta(pEntity);
} }
META_DLLAPI_HANDLE_void(FN_CLIENTCOMMAND, pfnClientCommand, (pEntity)); META_DLLAPI_HANDLE_void(FN_CLIENTCOMMAND, pfnClientCommand, (pEntity));
RETURN_API_void(); RETURN_API_void();
} }
void mm_ClientUserInfoChanged(edict_t *pEntity, char *infobuffer) {
void mm_ClientUserInfoChanged(edict_t *pEntity, char *infobuffer)
{
META_DLLAPI_HANDLE_void(FN_CLIENTUSERINFOCHANGED, pfnClientUserInfoChanged, (pEntity, infobuffer)); META_DLLAPI_HANDLE_void(FN_CLIENTUSERINFOCHANGED, pfnClientUserInfoChanged, (pEntity, infobuffer));
RETURN_API_void(); RETURN_API_void();
} }
void mm_ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) {
void mm_ServerActivate(edict_t *pEdictList, int edictCount, int clientMax)
{
META_DLLAPI_HANDLE_void(FN_SERVERACTIVATE, pfnServerActivate, (pEdictList, edictCount, clientMax)); META_DLLAPI_HANDLE_void(FN_SERVERACTIVATE, pfnServerActivate, (pEdictList, edictCount, clientMax));
RETURN_API_void(); RETURN_API_void();
} }
void mm_ServerDeactivate(void) {
void mm_ServerDeactivate(void)
{
META_DLLAPI_HANDLE_void(FN_SERVERDEACTIVATE, pfnServerDeactivate, ()); META_DLLAPI_HANDLE_void(FN_SERVERDEACTIVATE, pfnServerDeactivate, ());
// Update loaded plugins. Look for new plugins in inifile, as well as // Update loaded plugins. Look for new plugins in inifile, as well as
// any plugins waiting for a changelevel to load. // any plugins waiting for a changelevel to load.
@ -190,211 +193,263 @@ void mm_ServerDeactivate(void) {
requestid_counter = 0; requestid_counter = 0;
RETURN_API_void(); RETURN_API_void();
} }
void mm_PlayerPreThink(edict_t *pEntity) {
void mm_PlayerPreThink(edict_t *pEntity)
{
META_DLLAPI_HANDLE_void(FN_PLAYERPRETHINK, pfnPlayerPreThink, (pEntity)); META_DLLAPI_HANDLE_void(FN_PLAYERPRETHINK, pfnPlayerPreThink, (pEntity));
RETURN_API_void(); RETURN_API_void();
} }
void mm_PlayerPostThink(edict_t *pEntity) {
void mm_PlayerPostThink(edict_t *pEntity)
{
META_DLLAPI_HANDLE_void(FN_PLAYERPOSTTHINK, pfnPlayerPostThink, (pEntity)); META_DLLAPI_HANDLE_void(FN_PLAYERPOSTTHINK, pfnPlayerPostThink, (pEntity));
RETURN_API_void(); RETURN_API_void();
} }
void mm_StartFrame(void) {
void mm_StartFrame(void)
{
META_DLLAPI_HANDLE_void(FN_STARTFRAME, pfnStartFrame, ()); META_DLLAPI_HANDLE_void(FN_STARTFRAME, pfnStartFrame, ());
RETURN_API_void(); RETURN_API_void();
} }
void mm_ParmsNewLevel(void) {
void mm_ParmsNewLevel(void)
{
META_DLLAPI_HANDLE_void(FN_PARMSNEWLEVEL, pfnParmsNewLevel, ()); META_DLLAPI_HANDLE_void(FN_PARMSNEWLEVEL, pfnParmsNewLevel, ());
RETURN_API_void(); RETURN_API_void();
} }
void mm_ParmsChangeLevel(void) {
void mm_ParmsChangeLevel(void)
{
META_DLLAPI_HANDLE_void(FN_PARMSCHANGELEVEL, pfnParmsChangeLevel, ()); META_DLLAPI_HANDLE_void(FN_PARMSCHANGELEVEL, pfnParmsChangeLevel, ());
RETURN_API_void(); RETURN_API_void();
} }
const char *mm_GetGameDescription(void) {
const char *mm_GetGameDescription(void)
{
META_DLLAPI_HANDLE(const char *, NULL, FN_GETGAMEDESCRIPTION, pfnGetGameDescription, ()); META_DLLAPI_HANDLE(const char *, NULL, FN_GETGAMEDESCRIPTION, pfnGetGameDescription, ());
RETURN_API(); RETURN_API();
} }
void mm_PlayerCustomization(edict_t *pEntity, customization_t *pCust) {
void mm_PlayerCustomization(edict_t *pEntity, customization_t *pCust)
{
META_DLLAPI_HANDLE_void(FN_PLAYERCUSTOMIZATION, pfnPlayerCustomization, (pEntity, pCust)); META_DLLAPI_HANDLE_void(FN_PLAYERCUSTOMIZATION, pfnPlayerCustomization, (pEntity, pCust));
RETURN_API_void(); RETURN_API_void();
} }
void mm_SpectatorConnect(edict_t *pEntity) {
void mm_SpectatorConnect(edict_t *pEntity)
{
META_DLLAPI_HANDLE_void(FN_SPECTATORCONNECT, pfnSpectatorConnect, (pEntity)); META_DLLAPI_HANDLE_void(FN_SPECTATORCONNECT, pfnSpectatorConnect, (pEntity));
RETURN_API_void(); RETURN_API_void();
} }
void mm_SpectatorDisconnect(edict_t *pEntity) {
void mm_SpectatorDisconnect(edict_t *pEntity)
{
META_DLLAPI_HANDLE_void(FN_SPECTATORDISCONNECT, pfnSpectatorDisconnect, (pEntity)); META_DLLAPI_HANDLE_void(FN_SPECTATORDISCONNECT, pfnSpectatorDisconnect, (pEntity));
RETURN_API_void(); RETURN_API_void();
} }
void mm_SpectatorThink(edict_t *pEntity) {
void mm_SpectatorThink(edict_t *pEntity)
{
META_DLLAPI_HANDLE_void(FN_SPECTATORTHINK, pfnSpectatorThink, (pEntity)); META_DLLAPI_HANDLE_void(FN_SPECTATORTHINK, pfnSpectatorThink, (pEntity));
RETURN_API_void(); RETURN_API_void();
} }
void mm_Sys_Error(const char *error_string) {
void mm_Sys_Error(const char *error_string)
{
META_DLLAPI_HANDLE_void(FN_SYS_ERROR, pfnSys_Error, (error_string)); META_DLLAPI_HANDLE_void(FN_SYS_ERROR, pfnSys_Error, (error_string));
RETURN_API_void(); RETURN_API_void();
} }
// From SDK pm_shared/pm_shared.c: void mm_PM_Move (struct playermove_s *ppmove, int server)
void mm_PM_Move (struct playermove_s *ppmove, int server) { {
META_DLLAPI_HANDLE_void(FN_PM_MOVE, pfnPM_Move, (ppmove, server)); META_DLLAPI_HANDLE_void(FN_PM_MOVE, pfnPM_Move, (ppmove, server));
RETURN_API_void(); RETURN_API_void();
} }
void mm_PM_Init(struct playermove_s *ppmove) {
void mm_PM_Init(struct playermove_s *ppmove)
{
META_DLLAPI_HANDLE_void(FN_PM_INIT, pfnPM_Init, (ppmove)); META_DLLAPI_HANDLE_void(FN_PM_INIT, pfnPM_Init, (ppmove));
RETURN_API_void(); RETURN_API_void();
} }
char mm_PM_FindTextureType(char *name) {
char mm_PM_FindTextureType(char *name)
{
META_DLLAPI_HANDLE(char, '\0', FN_PM_FINDTEXTURETYPE, pfnPM_FindTextureType, (name)); META_DLLAPI_HANDLE(char, '\0', FN_PM_FINDTEXTURETYPE, pfnPM_FindTextureType, (name));
RETURN_API(); RETURN_API();
} }
// From SDK dlls/client.cpp: void mm_SetupVisibility(edict_t *pViewEntity, edict_t *pClient, unsigned char **pvs, unsigned char **pas)
void mm_SetupVisibility(edict_t *pViewEntity, edict_t *pClient, unsigned char **pvs, unsigned char **pas) { {
META_DLLAPI_HANDLE_void(FN_SETUPVISIBILITY, pfnSetupVisibility, (pViewEntity, pClient, pvs, pas)); META_DLLAPI_HANDLE_void(FN_SETUPVISIBILITY, pfnSetupVisibility, (pViewEntity, pClient, pvs, pas));
RETURN_API_void(); RETURN_API_void();
} }
void mm_UpdateClientData (const struct edict_s *ent, int sendweapons, struct clientdata_s *cd) {
void mm_UpdateClientData (const struct edict_s *ent, int sendweapons, struct clientdata_s *cd)
{
META_DLLAPI_HANDLE_void(FN_UPDATECLIENTDATA, pfnUpdateClientData, (ent, sendweapons, cd)); META_DLLAPI_HANDLE_void(FN_UPDATECLIENTDATA, pfnUpdateClientData, (ent, sendweapons, cd));
RETURN_API_void(); RETURN_API_void();
} }
int mm_AddToFullPack(struct entity_state_s *state, int e, edict_t *ent, edict_t *host, int hostflags, int player, unsigned char *pSet) {
int mm_AddToFullPack(struct entity_state_s *state, int e, edict_t *ent, edict_t *host, int hostflags, int player, unsigned char *pSet)
{
META_DLLAPI_HANDLE(int, 0, FN_ADDTOFULLPACK, pfnAddToFullPack, (state, e, ent, host, hostflags, player, pSet)); META_DLLAPI_HANDLE(int, 0, FN_ADDTOFULLPACK, pfnAddToFullPack, (state, e, ent, host, hostflags, player, pSet));
RETURN_API(); RETURN_API();
} }
void mm_CreateBaseline(int player, int eindex, struct entity_state_s *baseline, struct edict_s *entity, int playermodelindex, vec3_t player_mins, vec3_t player_maxs) {
void mm_CreateBaseline(int player, int eindex, struct entity_state_s *baseline, struct edict_s *entity, int playermodelindex, vec3_t player_mins, vec3_t player_maxs)
{
META_DLLAPI_HANDLE_void(FN_CREATEBASELINE, pfnCreateBaseline, (player, eindex, baseline, entity, playermodelindex, player_mins, player_maxs)); META_DLLAPI_HANDLE_void(FN_CREATEBASELINE, pfnCreateBaseline, (player, eindex, baseline, entity, playermodelindex, player_mins, player_maxs));
RETURN_API_void(); RETURN_API_void();
} }
void mm_RegisterEncoders(void) {
void mm_RegisterEncoders(void)
{
META_DLLAPI_HANDLE_void(FN_REGISTERENCODERS, pfnRegisterEncoders, ()); META_DLLAPI_HANDLE_void(FN_REGISTERENCODERS, pfnRegisterEncoders, ());
RETURN_API_void(); RETURN_API_void();
} }
int mm_GetWeaponData(struct edict_s *player, struct weapon_data_s *info) {
int mm_GetWeaponData(struct edict_s *player, struct weapon_data_s *info)
{
META_DLLAPI_HANDLE(int, 0, FN_GETWEAPONDATA, pfnGetWeaponData, (player, info)); META_DLLAPI_HANDLE(int, 0, FN_GETWEAPONDATA, pfnGetWeaponData, (player, info));
RETURN_API(); RETURN_API();
} }
void mm_CmdStart(const edict_t *player, const struct usercmd_s *cmd, unsigned int random_seed) {
void mm_CmdStart(const edict_t *player, const struct usercmd_s *cmd, unsigned int random_seed)
{
META_DLLAPI_HANDLE_void(FN_CMDSTART, pfnCmdStart, (player, cmd, random_seed)); META_DLLAPI_HANDLE_void(FN_CMDSTART, pfnCmdStart, (player, cmd, random_seed));
RETURN_API_void(); RETURN_API_void();
} }
void mm_CmdEnd (const edict_t *player) {
void mm_CmdEnd (const edict_t *player)
{
META_DLLAPI_HANDLE_void(FN_CMDEND, pfnCmdEnd, (player)); META_DLLAPI_HANDLE_void(FN_CMDEND, pfnCmdEnd, (player));
RETURN_API_void(); RETURN_API_void();
} }
int mm_ConnectionlessPacket(const struct netadr_s *net_from, const char *args, char *response_buffer, int *response_buffer_size) {
int mm_ConnectionlessPacket(const struct netadr_s *net_from, const char *args, char *response_buffer, int *response_buffer_size)
{
META_DLLAPI_HANDLE(int, 0, FN_CONNECTIONLESSPACKET, pfnConnectionlessPacket, (net_from, args, response_buffer, response_buffer_size)); META_DLLAPI_HANDLE(int, 0, FN_CONNECTIONLESSPACKET, pfnConnectionlessPacket, (net_from, args, response_buffer, response_buffer_size));
RETURN_API(); RETURN_API();
} }
int mm_GetHullBounds(int hullnumber, float *mins, float *maxs) {
int mm_GetHullBounds(int hullnumber, float *mins, float *maxs)
{
META_DLLAPI_HANDLE(int, 0, FN_GETHULLBOUNDS, pfnGetHullBounds, (hullnumber, mins, maxs)); META_DLLAPI_HANDLE(int, 0, FN_GETHULLBOUNDS, pfnGetHullBounds, (hullnumber, mins, maxs));
RETURN_API(); RETURN_API();
} }
void mm_CreateInstancedBaselines (void) {
void mm_CreateInstancedBaselines (void)
{
META_DLLAPI_HANDLE_void(FN_CREATEINSTANCEDBASELINES, pfnCreateInstancedBaselines, ()); META_DLLAPI_HANDLE_void(FN_CREATEINSTANCEDBASELINES, pfnCreateInstancedBaselines, ());
RETURN_API_void(); RETURN_API_void();
} }
int mm_InconsistentFile(const edict_t *player, const char *filename, char *disconnect_message) {
int mm_InconsistentFile(const edict_t *player, const char *filename, char *disconnect_message)
{
META_DLLAPI_HANDLE(int, 0, FN_INCONSISTENTFILE, pfnInconsistentFile, (player, filename, disconnect_message)); META_DLLAPI_HANDLE(int, 0, FN_INCONSISTENTFILE, pfnInconsistentFile, (player, filename, disconnect_message));
RETURN_API(); RETURN_API();
} }
int mm_AllowLagCompensation(void) {
int mm_AllowLagCompensation(void)
{
META_DLLAPI_HANDLE(int, 0, FN_ALLOWLAGCOMPENSATION, pfnAllowLagCompensation, ()); META_DLLAPI_HANDLE(int, 0, FN_ALLOWLAGCOMPENSATION, pfnAllowLagCompensation, ());
RETURN_API(); RETURN_API();
} }
void mm_OnFreeEntPrivateData(edict_t *pEnt)
// New API functions {
// From SDK ?
void mm_OnFreeEntPrivateData(edict_t *pEnt) {
META_NEWAPI_HANDLE_void(FN_ONFREEENTPRIVATEDATA, pfnOnFreeEntPrivateData, (pEnt)); META_NEWAPI_HANDLE_void(FN_ONFREEENTPRIVATEDATA, pfnOnFreeEntPrivateData, (pEnt));
RETURN_API_void(); RETURN_API_void();
} }
void mm_GameShutdown(void) {
void mm_GameShutdown(void)
{
META_NEWAPI_HANDLE_void(FN_GAMESHUTDOWN, pfnGameShutdown, ()); META_NEWAPI_HANDLE_void(FN_GAMESHUTDOWN, pfnGameShutdown, ());
RETURN_API_void(); RETURN_API_void();
} }
int mm_ShouldCollide(edict_t *pentTouched, edict_t *pentOther) {
int mm_ShouldCollide(edict_t *pentTouched, edict_t *pentOther)
{
META_NEWAPI_HANDLE(int, 1, FN_SHOULDCOLLIDE, pfnShouldCollide, (pentTouched, pentOther)); META_NEWAPI_HANDLE(int, 1, FN_SHOULDCOLLIDE, pfnShouldCollide, (pentTouched, pentOther));
RETURN_API(); RETURN_API();
} }
// Added 2005-08-11 (no SDK update)
void mm_CvarValue(const edict_t *pEdict, const char *value) { void mm_CvarValue(const edict_t *pEdict, const char *value)
{
g_Players.clear_player_cvar_query(pEdict); g_Players.clear_player_cvar_query(pEdict);
META_NEWAPI_HANDLE_void(FN_CVARVALUE, pfnCvarValue, (pEdict, value)); META_NEWAPI_HANDLE_void(FN_CVARVALUE, pfnCvarValue, (pEdict, value));
RETURN_API_void(); RETURN_API_void();
} }
//Added 2005-11-22 (no SDK update) void mm_CvarValue2(const edict_t *pEdict, int requestID, const char *cvarName, const char *value)
void mm_CvarValue2(const edict_t *pEdict, int requestID, const char *cvarName, const char *value) { {
META_NEWAPI_HANDLE_void(FN_CVARVALUE2, pfnCvarValue2, (pEdict, requestID, cvarName, value)); META_NEWAPI_HANDLE_void(FN_CVARVALUE2, pfnCvarValue2, (pEdict, requestID, cvarName, value));
RETURN_API_void(); RETURN_API_void();
} }
// From SDK dlls/cbase.cpp:
// "(wd)" indicates my comments on the functions // "(wd)" indicates my comments on the functions
static DLL_FUNCTIONS sFunctionTable = DLL_FUNCTIONS sFunctionTable =
{ {
mm_GameDLLInit, //! pfnGameInit() Initialize the game (one-time call after loading of game .dll) mm_GameDLLInit, // pfnGameInit() Initialize the game (one-time call after loading of game .dll)
mm_DispatchSpawn, //! pfnSpawn() mm_DispatchSpawn, // pfnSpawn()
mm_DispatchThink, //! pfnThink() mm_DispatchThink, // pfnThink()
mm_DispatchUse, //! pfnUse() mm_DispatchUse, // pfnUse()
mm_DispatchTouch, //! pfnTouch() mm_DispatchTouch, // pfnTouch()
mm_DispatchBlocked, //! pfnBlocked() mm_DispatchBlocked, // pfnBlocked()
mm_DispatchKeyValue, //! pfnKeyValue() mm_DispatchKeyValue, // pfnKeyValue()
mm_DispatchSave, //! pfnSave() mm_DispatchSave, // pfnSave()
mm_DispatchRestore, //! pfnRestore() mm_DispatchRestore, // pfnRestore()
mm_DispatchObjectCollsionBox, //! pfnSetAbsBox() mm_DispatchObjectCollsionBox, // pfnSetAbsBox()
mm_SaveWriteFields, //! pfnSaveWriteFields() mm_SaveWriteFields, // pfnSaveWriteFields()
mm_SaveReadFields, //! pfnSaveReadFields() mm_SaveReadFields, // pfnSaveReadFields()
mm_SaveGlobalState, //! pfnSaveGlobalState() mm_SaveGlobalState, // pfnSaveGlobalState()
mm_RestoreGlobalState, //! pfnRestoreGlobalState() mm_RestoreGlobalState, // pfnRestoreGlobalState()
mm_ResetGlobalState, //! pfnResetGlobalState() mm_ResetGlobalState, // pfnResetGlobalState()
mm_ClientConnect, //! pfnClientConnect() (wd) Client has connected mm_ClientConnect, // pfnClientConnect() (wd) Client has connected
mm_ClientDisconnect, //! pfnClientDisconnect() (wd) Player has left the game mm_ClientDisconnect, // pfnClientDisconnect() (wd) Player has left the game
mm_ClientKill, //! pfnClientKill() (wd) Player has typed "kill" mm_ClientKill, // pfnClientKill() (wd) Player has typed "kill"
mm_ClientPutInServer, //! pfnClientPutInServer() (wd) Client is entering the game mm_ClientPutInServer, // pfnClientPutInServer() (wd) Client is entering the game
mm_ClientCommand, //! pfnClientCommand() (wd) Player has sent a command (typed, or from a bind) mm_ClientCommand, // pfnClientCommand() (wd) Player has sent a command (typed, or from a bind)
mm_ClientUserInfoChanged, //! pfnClientUserInfoChanged() (wd) Client has updated their setinfo structure mm_ClientUserInfoChanged, // pfnClientUserInfoChanged() (wd) Client has updated their setinfo structure
mm_ServerActivate, //! pfnServerActivate() (wd) Server is starting a new map mm_ServerActivate, // pfnServerActivate() (wd) Server is starting a new map
mm_ServerDeactivate, //! pfnServerDeactivate() (wd) Server is leaving the map (shutdown, or changelevel); SDK2 mm_ServerDeactivate, // pfnServerDeactivate() (wd) Server is leaving the map (shutdown, or changelevel); SDK2
mm_PlayerPreThink, //! pfnPlayerPreThink() mm_PlayerPreThink, // pfnPlayerPreThink()
mm_PlayerPostThink, //! pfnPlayerPostThink() mm_PlayerPostThink, // pfnPlayerPostThink()
mm_StartFrame, //! pfnStartFrame() mm_StartFrame, // pfnStartFrame()
mm_ParmsNewLevel, //! pfnParmsNewLevel() mm_ParmsNewLevel, // pfnParmsNewLevel()
mm_ParmsChangeLevel, //! pfnParmsChangeLevel() mm_ParmsChangeLevel, // pfnParmsChangeLevel()
mm_GetGameDescription, //! pfnGetGameDescription() Returns string describing current .dll. E.g. "TeamFotrress 2", "Half-Life" mm_GetGameDescription, // pfnGetGameDescription() Returns string describing current .dll. E.g. "TeamFotrress 2", "Half-Life"
mm_PlayerCustomization, //! pfnPlayerCustomization() Notifies .dll of new customization for player. mm_PlayerCustomization, // pfnPlayerCustomization() Notifies .dll of new customization for player.
mm_SpectatorConnect, //! pfnSpectatorConnect() Called when spectator joins server mm_SpectatorConnect, // pfnSpectatorConnect() Called when spectator joins server
mm_SpectatorDisconnect, //! pfnSpectatorDisconnect() Called when spectator leaves the server mm_SpectatorDisconnect, // pfnSpectatorDisconnect() Called when spectator leaves the server
mm_SpectatorThink, //! pfnSpectatorThink() Called when spectator sends a command packet (usercmd_t) mm_SpectatorThink, // pfnSpectatorThink() Called when spectator sends a command packet (usercmd_t)
mm_Sys_Error, //! pfnSys_Error() Notify game .dll that engine is going to shut down. Allows mod authors to set a breakpoint. SDK2 mm_Sys_Error, // pfnSys_Error() Notify game .dll that engine is going to shut down. Allows mod authors to set a breakpoint. SDK2
mm_PM_Move, //! pfnPM_Move() (wd) SDK2 mm_PM_Move, // pfnPM_Move() (wd) SDK2
mm_PM_Init, //! pfnPM_Init() Server version of player movement initialization; (wd) SDK2 mm_PM_Init, // pfnPM_Init() Server version of player movement initialization; (wd) SDK2
mm_PM_FindTextureType, //! pfnPM_FindTextureType() (wd) SDK2 mm_PM_FindTextureType, // pfnPM_FindTextureType() (wd) SDK2
mm_SetupVisibility, //! pfnSetupVisibility() Set up PVS and PAS for networking for this client; (wd) SDK2 mm_SetupVisibility, // pfnSetupVisibility() Set up PVS and PAS for networking for this client; (wd) SDK2
mm_UpdateClientData, //! pfnUpdateClientData() Set up data sent only to specific client; (wd) SDK2 mm_UpdateClientData, // pfnUpdateClientData() Set up data sent only to specific client; (wd) SDK2
mm_AddToFullPack, //! pfnAddToFullPack() (wd) SDK2 mm_AddToFullPack, // pfnAddToFullPack() (wd) SDK2
mm_CreateBaseline, //! pfnCreateBaseline() Tweak entity baseline for network encoding, allows setup of player baselines, too.; (wd) SDK2 mm_CreateBaseline, // pfnCreateBaseline() Tweak entity baseline for network encoding, allows setup of player baselines, too.; (wd) SDK2
mm_RegisterEncoders, //! pfnRegisterEncoders() Callbacks for network encoding; (wd) SDK2 mm_RegisterEncoders, // pfnRegisterEncoders() Callbacks for network encoding; (wd) SDK2
mm_GetWeaponData, //! pfnGetWeaponData() (wd) SDK2 mm_GetWeaponData, // pfnGetWeaponData() (wd) SDK2
mm_CmdStart, //! pfnCmdStart() (wd) SDK2 mm_CmdStart, // pfnCmdStart() (wd) SDK2
mm_CmdEnd, //! pfnCmdEnd() (wd) SDK2 mm_CmdEnd, // pfnCmdEnd() (wd) SDK2
mm_ConnectionlessPacket, //! pfnConnectionlessPacket() (wd) SDK2 mm_ConnectionlessPacket, // pfnConnectionlessPacket() (wd) SDK2
mm_GetHullBounds, //! pfnGetHullBounds() (wd) SDK2 mm_GetHullBounds, // pfnGetHullBounds() (wd) SDK2
mm_CreateInstancedBaselines, //! pfnCreateInstancedBaselines() (wd) SDK2 mm_CreateInstancedBaselines, // pfnCreateInstancedBaselines() (wd) SDK2
mm_InconsistentFile, //! pfnInconsistentFile() (wd) SDK2 mm_InconsistentFile, // pfnInconsistentFile() (wd) SDK2
mm_AllowLagCompensation, //! pfnAllowLagCompensation() (wd) SDK2 mm_AllowLagCompensation, // pfnAllowLagCompensation() (wd) SDK2
}; };
DLL_FUNCTIONS *pHookedDllFunctions = &sFunctionTable; DLL_FUNCTIONS *pHookedDllFunctions = &sFunctionTable;
@ -414,52 +469,48 @@ DLL_FUNCTIONS *pHookedDllFunctions = &sFunctionTable;
// //
// It's unclear whether a DLL coded under SDK2 needs to provide the older // It's unclear whether a DLL coded under SDK2 needs to provide the older
// GetAPI or not.. // GetAPI or not..
C_DLLEXPORT int GetEntityAPI(DLL_FUNCTIONS *pFunctionTable, int interfaceVersion) C_DLLEXPORT int GetEntityAPI(DLL_FUNCTIONS *pFunctionTable, int interfaceVersion)
{ {
META_DEBUG(3, ("called: GetEntityAPI; version=%d", interfaceVersion)); META_DEBUG(3, ("called: GetEntityAPI; version=%d", interfaceVersion));
if(!pFunctionTable) { if (!pFunctionTable)
{
META_ERROR("GetEntityAPI called with null pFunctionTable"); META_ERROR("GetEntityAPI called with null pFunctionTable");
return(FALSE); return FALSE;
} }
else if(interfaceVersion != INTERFACE_VERSION) { else if (interfaceVersion != INTERFACE_VERSION)
{
META_ERROR("GetEntityAPI version mismatch; requested=%d ours=%d", interfaceVersion, INTERFACE_VERSION); META_ERROR("GetEntityAPI version mismatch; requested=%d ours=%d", interfaceVersion, INTERFACE_VERSION);
return(FALSE); return FALSE;
} }
Q_memcpy(pFunctionTable, &sFunctionTable, sizeof(DLL_FUNCTIONS));
memcpy(pFunctionTable, &sFunctionTable, sizeof(DLL_FUNCTIONS)); return TRUE;
return(TRUE);
} }
C_DLLEXPORT int GetEntityAPI2(DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion) C_DLLEXPORT int GetEntityAPI2(DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion)
{ {
META_DEBUG(3, ("called: GetEntityAPI2; version=%d", *interfaceVersion)); META_DEBUG(3, ("called: GetEntityAPI2; version=%d", *interfaceVersion));
if(!pFunctionTable) { if (!pFunctionTable)
{
META_ERROR("GetEntityAPI2 called with null pFunctionTable"); META_ERROR("GetEntityAPI2 called with null pFunctionTable");
return(FALSE); return FALSE;
} }
else if(*interfaceVersion != INTERFACE_VERSION) { else if (*interfaceVersion != INTERFACE_VERSION)
{
META_ERROR("GetEntityAPI2 version mismatch; requested=%d ours=%d", *interfaceVersion, INTERFACE_VERSION); META_ERROR("GetEntityAPI2 version mismatch; requested=%d ours=%d", *interfaceVersion, INTERFACE_VERSION);
//! Tell engine what version we had, so it can figure out who is out of date. //! Tell engine what version we had, so it can figure out who is out of date.
*interfaceVersion = INTERFACE_VERSION; *interfaceVersion = INTERFACE_VERSION;
return(FALSE); return FALSE;
} }
Q_memcpy(pFunctionTable, &sFunctionTable, sizeof(DLL_FUNCTIONS));
memcpy(pFunctionTable, &sFunctionTable, sizeof(DLL_FUNCTIONS)); return TRUE;
return(TRUE);
} }
// I could find _no_ documentation or examples for the intended use of // I could find _no_ documentation or examples for the intended use of
// NEW_DLL_FUNCTIONS. I wouldn't have even _known_ about the // NEW_DLL_FUNCTIONS. I wouldn't have even _known_ about the
// GetNewDLLFunctions() function except for the reference in Adminmod.. It // GetNewDLLFunctions() function except for the reference in Adminmod.. It
// appears to be new with SDK 2.0. // appears to be new with SDK 2.0.
// //
// Obviously, it seems to provide additional functions to the engine, but // Obviously, it seems to provide additional functions to the engine, but
@ -468,18 +519,15 @@ C_DLLEXPORT int GetEntityAPI2(DLL_FUNCTIONS *pFunctionTable, int *interfaceVersi
// //
// Interestingly, it appears to be called by the engine _before_ GetAPI. // Interestingly, it appears to be called by the engine _before_ GetAPI.
static meta_new_dll_functions_t sNewFunctionTable ( meta_new_dll_functions_t sNewFunctionTable (
&mm_OnFreeEntPrivateData, //! pfnOnFreeEntPrivateData() Called right before the object's memory is freed. Calls its destructor. &mm_OnFreeEntPrivateData, // pfnOnFreeEntPrivateData() Called right before the object's memory is freed. Calls its destructor.
&mm_GameShutdown, //! pfnGameShutdown() &mm_GameShutdown, // pfnGameShutdown()
&mm_ShouldCollide, //! pfnShouldCollide() &mm_ShouldCollide, // pfnShouldCollide()
// Added 2005-08-11 (no SDK update)
&mm_CvarValue, //! pfnCvarValue() (fz) Obsolete! Use mm_CvarValue2 instead
// Added 2005-11-22 (no SDK update)
&mm_CvarValue2 //! pfnCvarValue2() (fz) When pfnQueryClientCvarValue2() completes it will call
//! pfnCvarValue2() with the request ID supplied earlier, the name of
//! the cvar requested and the value of that cvar.
);
&mm_CvarValue, // pfnCvarValue() (fz) Use mm_CvarValue2 instead
&mm_CvarValue2 // pfnCvarValue2() (fz) When pfnQueryClientCvarValue2() completes it will call
// pfnCvarValue2() with the request ID supplied earlier, the name of the cvar requested and the value of that cvar.
);
NEW_DLL_FUNCTIONS *pHookedNewDllFunctions = &sNewFunctionTable; NEW_DLL_FUNCTIONS *pHookedNewDllFunctions = &sNewFunctionTable;
@ -488,26 +536,25 @@ C_DLLEXPORT int GetNewDLLFunctions(NEW_DLL_FUNCTIONS *pNewFunctionTable, int *in
META_DEBUG(6, ("called: GetNewDLLFunctions; version=%d", *interfaceVersion)); META_DEBUG(6, ("called: GetNewDLLFunctions; version=%d", *interfaceVersion));
#if 0 // ~dvander - but then you can't use cvar querying on many mods... #if 0 // ~dvander - but then you can't use cvar querying on many mods...
// Don't provide these functions to engine if gamedll doesn't provide // Don't provide these functions to engine if gamedll doesn't provide
// them. Otherwise, we're in the position of having to provide answers // them. Otherwise, we're in the position of having to provide answers
// we can't necessarily provide (for instance, ShouldCollide())... // we can't necessarily provide (for instance, ShouldCollide())...
if(!GameDLL.funcs.newapi_table) if (!GameDLL.funcs.newapi_table)
return(FALSE); return FALSE;
#endif #endif
if(!pNewFunctionTable) { if (!pNewFunctionTable)
{
META_ERROR("GetNewDLLFunctions called with null pNewFunctionTable"); META_ERROR("GetNewDLLFunctions called with null pNewFunctionTable");
return(FALSE); return FALSE;
} }
else if(*interfaceVersion != NEW_DLL_FUNCTIONS_VERSION) { else if (*interfaceVersion != NEW_DLL_FUNCTIONS_VERSION)
{
META_ERROR("GetNewDLLFunctions version mismatch; requested=%d ours=%d", *interfaceVersion, NEW_DLL_FUNCTIONS_VERSION); META_ERROR("GetNewDLLFunctions version mismatch; requested=%d ours=%d", *interfaceVersion, NEW_DLL_FUNCTIONS_VERSION);
//! Tell engine what version we had, so it can figure out who is out of date. //! Tell engine what version we had, so it can figure out who is out of date.
*interfaceVersion = NEW_DLL_FUNCTIONS_VERSION; *interfaceVersion = NEW_DLL_FUNCTIONS_VERSION;
return(FALSE); return FALSE;
} }
sNewFunctionTable.copy_to(pNewFunctionTable); sNewFunctionTable.copy_to(pNewFunctionTable);
return TRUE;
return(TRUE);
} }

View File

@ -1,192 +1,126 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// dllapi.h - prototypes and typedefs for Half-Life DLL API routines #include "sdk_util.h"
#include "osdep.h"
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef DLLAPI_H
#define DLLAPI_H
#include "sdk_util.h" // BOOL
#include "osdep.h" // DLLEXPORT, etc
// Typedefs for these are provided in SDK engine/eiface.h, but I didn't // Typedefs for these are provided in SDK engine/eiface.h, but I didn't
// like the names (APIFUNCTION, APIFUNCTION2, NEW_DLL_FUNCTIONS_FN). // like the names (APIFUNCTION, APIFUNCTION2, NEW_DLL_FUNCTIONS_FN).
typedef int (*GETENTITYAPI_FN) (DLL_FUNCTIONS *pFunctionTable, int interfaceVersion); typedef int (*GETENTITYAPI_FN)(DLL_FUNCTIONS *pFunctionTable, int interfaceVersion);
typedef int (*GETENTITYAPI2_FN) (DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion); typedef int (*GETENTITYAPI2_FN)(DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion);
typedef int (*GETNEWDLLFUNCTIONS_FN) (NEW_DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion); typedef int (*GETNEWDLLFUNCTIONS_FN)(NEW_DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion);
// From SDK dlls/cbase.h: C_DLLEXPORT int GetEntityAPI(DLL_FUNCTIONS *pFunctionTable, int interfaceVersion);
C_DLLEXPORT int GetEntityAPI( DLL_FUNCTIONS *pFunctionTable, int interfaceVersion ); C_DLLEXPORT int GetEntityAPI2(DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion);
C_DLLEXPORT int GetEntityAPI2( DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion ); C_DLLEXPORT int GetNewDLLFunctions(NEW_DLL_FUNCTIONS *pNewFunctionTable, int *interfaceVersion);
// No example in SDK.. extern void mm_GameDLLInit();
// From Adminmod dll.cpp: extern int mm_DispatchSpawn(edict_t *pent);
C_DLLEXPORT int GetNewDLLFunctions( NEW_DLL_FUNCTIONS *pNewFunctionTable, int *interfaceVersion ); extern void mm_DispatchThink(edict_t *pent);
extern void mm_DispatchUse(edict_t *pentUsed, edict_t *pentOther);
extern void mm_DispatchTouch(edict_t *pentTouched, edict_t *pentOther);
// From SDK dlls/game.h: extern void mm_DispatchBlocked(edict_t *pentBlocked, edict_t *pentOther);
extern void mm_GameDLLInit( void ); extern void mm_DispatchKeyValue(edict_t *pentKeyvalue, KeyValueData *pkvd);
extern void mm_DispatchSave(edict_t *pent, SAVERESTOREDATA *pSaveData);
// From SDK dlls/cbase.h: extern int mm_DispatchRestore(edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity);
extern int mm_DispatchSpawn( edict_t *pent ); extern void mm_DispatchObjectCollisionBox(edict_t *pent);
extern void mm_DispatchThink( edict_t *pent ); extern void mm_SaveWriteFields(SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount);
extern void mm_DispatchUse( edict_t *pentUsed, edict_t *pentOther ); extern void mm_SaveReadFields(SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount);
extern void mm_DispatchTouch( edict_t *pentTouched, edict_t *pentOther ); extern void mm_SaveGlobalState(SAVERESTOREDATA *pSaveData);
extern void mm_DispatchBlocked( edict_t *pentBlocked, edict_t *pentOther ); extern void mm_RestoreGlobalState(SAVERESTOREDATA *pSaveData);
extern void mm_DispatchKeyValue( edict_t *pentKeyvalue, KeyValueData *pkvd ); extern void mm_ResetGlobalState();
extern void mm_DispatchSave( edict_t *pent, SAVERESTOREDATA *pSaveData ); extern BOOL mm_ClientConnect(edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[ 128 ]);
extern int mm_DispatchRestore( edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity ); extern void mm_ClientDisconnect(edict_t *pEntity);
extern void mm_DispatchObjectCollisionBox( edict_t *pent ); extern void mm_ClientKill(edict_t *pEntity);
extern void mm_SaveWriteFields( SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount ); extern void mm_ClientPutInServer(edict_t *pEntity);
extern void mm_SaveReadFields( SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount ); extern void mm_ClientCommand(edict_t *pEntity);
extern void mm_SaveGlobalState( SAVERESTOREDATA *pSaveData ); extern void mm_ClientUserInfoChanged(edict_t *pEntity, char *infobuffer);
extern void mm_RestoreGlobalState( SAVERESTOREDATA *pSaveData ); extern void mm_ServerActivate(edict_t *pEdictList, int edictCount, int clientMax);
extern void mm_ResetGlobalState( void ); extern void mm_ServerDeactivate();
extern void mm_PlayerPreThink(edict_t *pEntity);
// From SDK dlls/client.h: extern void mm_PlayerPostThink(edict_t *pEntity);
extern BOOL mm_ClientConnect( edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[ 128 ] ); extern void mm_StartFrame();
extern void mm_ClientDisconnect( edict_t *pEntity ); extern void mm_ParmsNewLevel();
extern void mm_ClientKill( edict_t *pEntity ); extern void mm_ParmsChangeLevel();
extern void mm_ClientPutInServer( edict_t *pEntity ); extern const char *mm_GetGameDescription();
extern void mm_ClientCommand( edict_t *pEntity ); extern void mm_PlayerCustomization(edict_t *pEntity, customization_t *pCust);
extern void mm_ClientUserInfoChanged( edict_t *pEntity, char *infobuffer ); extern void mm_SpectatorConnect (edict_t *pEntity);
extern void mm_ServerActivate( edict_t *pEdictList, int edictCount, int clientMax ); extern void mm_SpectatorDisconnect (edict_t *pEntity);
extern void mm_ServerDeactivate( void ); extern void mm_SpectatorThink (edict_t *pEntity);
extern void mm_PlayerPreThink( edict_t *pEntity ); extern void mm_Sys_Error(const char *error_string);
extern void mm_PlayerPostThink( edict_t *pEntity ); extern void mm_PM_Move(struct playermove_s *ppmove, int server);
extern void mm_StartFrame( void ); extern void mm_PM_Init(struct playermove_s *ppmove);
extern void mm_ParmsNewLevel( void ); extern char mm_PM_FindTextureType (const char *name);
extern void mm_ParmsChangeLevel( void ); extern void mm_SetupVisibility(edict_t *pViewEntity, edict_t *pClient, unsigned char **pvs, unsigned char **pas);
extern const char *mm_GetGameDescription( void ); extern void mm_UpdateClientData (const struct edict_s *ent, int sendweapons, struct clientdata_s *cd);
extern void mm_PlayerCustomization( edict_t *pEntity, customization_t *pCust ); extern int mm_AddToFullPack(struct entity_state_s *state, int e, edict_t *ent, edict_t *host, int hostflags, int player, unsigned char *pSet);
extern void mm_SpectatorConnect ( edict_t *pEntity ); extern void mm_CreateBaseline(int player, int eindex, struct entity_state_s *baseline, struct edict_s *entity, int playermodelindex, vec3_t player_mins, vec3_t player_maxs);
extern void mm_SpectatorDisconnect ( edict_t *pEntity ); extern void mm_RegisterEncoders();
extern void mm_SpectatorThink ( edict_t *pEntity ); extern int mm_GetWeaponData(struct edict_s *player, struct weapon_data_s *info);
extern void mm_Sys_Error( const char *error_string ); extern void mm_CmdStart(const edict_t *player, const struct usercmd_s *cmd, unsigned int random_seed);
extern void mm_CmdEnd (const edict_t *player);
// From SDK pm_shared/pm_shared.h: extern int mm_ConnectionlessPacket(const struct netadr_s *net_from, const char *args, char *response_buffer, int *response_buffer_size);
extern void mm_PM_Move ( struct playermove_s *ppmove, int server ); extern int mm_GetHullBounds(int hullnumber, float *mins, float *maxs);
extern void mm_PM_Init ( struct playermove_s *ppmove ); extern void mm_CreateInstancedBaselines ();
extern char mm_PM_FindTextureType ( const char *name ); extern int mm_InconsistentFile(const edict_t *player, const char *filename, char *disconnect_message);
extern int mm_AllowLagCompensation();
// From SDK dlls/client.h:
extern void mm_SetupVisibility( edict_t *pViewEntity, edict_t *pClient, unsigned char **pvs, unsigned char **pas );
extern void mm_UpdateClientData ( const struct edict_s *ent, int sendweapons, struct clientdata_s *cd );
extern int mm_AddToFullPack( struct entity_state_s *state, int e, edict_t *ent, edict_t *host, int hostflags, int player, unsigned char *pSet );
extern void mm_CreateBaseline( int player, int eindex, struct entity_state_s *baseline, struct edict_s *entity, int playermodelindex, vec3_t player_mins, vec3_t player_maxs );
extern void mm_RegisterEncoders( void );
extern int mm_GetWeaponData( struct edict_s *player, struct weapon_data_s *info );
extern void mm_CmdStart( const edict_t *player, const struct usercmd_s *cmd, unsigned int random_seed );
extern void mm_CmdEnd ( const edict_t *player );
extern int mm_ConnectionlessPacket( const struct netadr_s *net_from, const char *args, char *response_buffer, int *response_buffer_size );
extern int mm_GetHullBounds( int hullnumber, float *mins, float *maxs );
extern void mm_CreateInstancedBaselines ( void );
extern int mm_InconsistentFile( const edict_t *player, const char *filename, char *disconnect_message );
extern int mm_AllowLagCompensation( void );
// No example from SDK...
extern void mm_OnFreeEntPrivateData(edict_t pEnt); extern void mm_OnFreeEntPrivateData(edict_t pEnt);
extern void mm_GameShutdown(void); extern void mm_GameShutdown();
extern int mm_ShouldCollide(edict_t *pentTouched, edict_t *pentOther); extern int mm_ShouldCollide(edict_t *pentTouched, edict_t *pentOther);
//Added 2005-08-11 (no SDK update) extern void mm_CvarValue(const edict_t *pEnt, const char *value);
extern void mm_CvarValue(const edict_t *pEnt, const char *value); //! Obsolete! Use mm_CvarValue2 instead
//Added 2005-11-22 (no SDK update)
extern void mm_CvarValue2(const edict_t *pEnt, int requestID, const char *cvarName, const char *value); extern void mm_CvarValue2(const edict_t *pEnt, int requestID, const char *cvarName, const char *value);
typedef void (*FN_GAMEINIT)();
// Typedefs for the above functions: typedef int (*FN_DISPATCHSPAWN)(edict_t *pent);
typedef void (*FN_DISPATCHTHINK)(edict_t *pent);
typedef void (*FN_GAMEINIT) ( void ); typedef void (*FN_DISPATCHUSE)(edict_t *pentUsed, edict_t *pentOther);
typedef int (*FN_DISPATCHSPAWN) ( edict_t *pent ); typedef void (*FN_DISPATCHTOUCH)(edict_t *pentTouched, edict_t *pentOther);
typedef void (*FN_DISPATCHTHINK) ( edict_t *pent ); typedef void (*FN_DISPATCHBLOCKED)(edict_t *pentBlocked, edict_t *pentOther);
typedef void (*FN_DISPATCHUSE) ( edict_t *pentUsed, edict_t *pentOther ); typedef void (*FN_DISPATCHKEYVALUE)(edict_t *pentKeyvalue, KeyValueData *pkvd);
typedef void (*FN_DISPATCHTOUCH) ( edict_t *pentTouched, edict_t *pentOther ); typedef void (*FN_DISPATCHSAVE)(edict_t *pent, SAVERESTOREDATA *pSaveData);
typedef void (*FN_DISPATCHBLOCKED) ( edict_t *pentBlocked, edict_t *pentOther ); typedef int (*FN_DISPATCHRESTORE)(edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity);
typedef void (*FN_DISPATCHKEYVALUE) ( edict_t *pentKeyvalue, KeyValueData *pkvd ); typedef void (*FN_DISPATCHOBJECTCOLLISIONBOX)(edict_t *pent);
typedef void (*FN_DISPATCHSAVE) ( edict_t *pent, SAVERESTOREDATA *pSaveData ); typedef void (*FN_SAVEWRITEFIELDS)(SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount);
typedef int (*FN_DISPATCHRESTORE) ( edict_t *pent, SAVERESTOREDATA *pSaveData, int globalEntity ); typedef void (*FN_SAVEREADFIELDS)(SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount);
typedef void (*FN_DISPATCHOBJECTCOLLISIONBOX) ( edict_t *pent ); typedef void (*FN_SAVEGLOBALSTATE)(SAVERESTOREDATA *pSaveData);
typedef void (*FN_SAVEWRITEFIELDS) ( SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount ); typedef void (*FN_RESTOREGLOBALSTATE)(SAVERESTOREDATA *pSaveData);
typedef void (*FN_SAVEREADFIELDS) ( SAVERESTOREDATA *pSaveData, const char *pname, void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCount ); typedef void (*FN_RESETGLOBALSTATE)();
typedef void (*FN_SAVEGLOBALSTATE) ( SAVERESTOREDATA *pSaveData ); typedef BOOL (*FN_CLIENTCONNECT)(edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[ 128 ]);
typedef void (*FN_RESTOREGLOBALSTATE) ( SAVERESTOREDATA *pSaveData ); typedef void (*FN_CLIENTDISCONNECT)(edict_t *pEntity);
typedef void (*FN_RESETGLOBALSTATE) ( void ); typedef void (*FN_CLIENTKILL)(edict_t *pEntity);
typedef void (*FN_CLIENTPUTINSERVER)(edict_t *pEntity);
typedef BOOL (*FN_CLIENTCONNECT) ( edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[ 128 ] ); typedef void (*FN_CLIENTCOMMAND)(edict_t *pEntity);
typedef void (*FN_CLIENTDISCONNECT) ( edict_t *pEntity ); typedef void (*FN_CLIENTUSERINFOCHANGED)(edict_t *pEntity, char *infobuffer);
typedef void (*FN_CLIENTKILL) ( edict_t *pEntity ); typedef void (*FN_SERVERACTIVATE)(edict_t *pEdictList, int edictCount, int clientMax);
typedef void (*FN_CLIENTPUTINSERVER) ( edict_t *pEntity ); typedef void (*FN_SERVERDEACTIVATE)();
typedef void (*FN_CLIENTCOMMAND) ( edict_t *pEntity ); typedef void (*FN_PLAYERPRETHINK)(edict_t *pEntity);
typedef void (*FN_CLIENTUSERINFOCHANGED) ( edict_t *pEntity, char *infobuffer ); typedef void (*FN_PLAYERPOSTTHINK)(edict_t *pEntity);
typedef void (*FN_SERVERACTIVATE) ( edict_t *pEdictList, int edictCount, int clientMax ); typedef void (*FN_STARTFRAME)();
typedef void (*FN_SERVERDEACTIVATE) ( void ); typedef void (*FN_PARMSNEWLEVEL)();
typedef void (*FN_PLAYERPRETHINK) ( edict_t *pEntity ); typedef void (*FN_PARMSCHANGELEVEL)();
typedef void (*FN_PLAYERPOSTTHINK) ( edict_t *pEntity ); typedef const char *(*FN_GETGAMEDESCRIPTION)();
typedef void (*FN_STARTFRAME) ( void ); typedef void (*FN_PLAYERCUSTOMIZATION)(edict_t *pEntity, customization_t *pCust);
typedef void (*FN_PARMSNEWLEVEL) ( void ); typedef void (*FN_SPECTATORCONNECT) (edict_t *pEntity);
typedef void (*FN_PARMSCHANGELEVEL) ( void ); typedef void (*FN_SPECTATORDISCONNECT) (edict_t *pEntity);
typedef const char *(*FN_GETGAMEDESCRIPTION) ( void ); typedef void (*FN_SPECTATORTHINK) (edict_t *pEntity);
typedef void (*FN_PLAYERCUSTOMIZATION) ( edict_t *pEntity, customization_t *pCust ); typedef void (*FN_SYS_ERROR)(const char *error_string);
typedef void (*FN_SPECTATORCONNECT) ( edict_t *pEntity ); typedef void (*FN_PM_MOVE)(struct playermove_s *ppmove, int server);
typedef void (*FN_SPECTATORDISCONNECT) ( edict_t *pEntity ); typedef void (*FN_PM_INIT)(struct playermove_s *ppmove);
typedef void (*FN_SPECTATORTHINK) ( edict_t *pEntity ); typedef char (*FN_PM_FINDTEXTURETYPE)(char *name);
typedef void (*FN_SYS_ERROR) ( const char *error_string ); typedef void (*FN_SETUPVISIBILITY)(edict_t *pViewEntity, edict_t *pClient, unsigned char **pvs, unsigned char **pas);
typedef void (*FN_UPDATECLIENTDATA) (const struct edict_s *ent, int sendweapons, struct clientdata_s *cd);
typedef void (*FN_PM_MOVE) ( struct playermove_s *ppmove, int server ); typedef int (*FN_ADDTOFULLPACK)(struct entity_state_s *state, int e, edict_t *ent, edict_t *host, int hostflags, int player, unsigned char *pSet);
typedef void (*FN_PM_INIT) ( struct playermove_s *ppmove ); typedef void (*FN_CREATEBASELINE)(int player, int eindex, struct entity_state_s *baseline, struct edict_s *entity, int playermodelindex, vec3_t player_mins, vec3_t player_maxs);
typedef char (*FN_PM_FINDTEXTURETYPE) ( char *name ); typedef void (*FN_REGISTERENCODERS)();
typedef int (*FN_GETWEAPONDATA)(struct edict_s *player, struct weapon_data_s *info);
typedef void (*FN_SETUPVISIBILITY) ( edict_t *pViewEntity, edict_t *pClient, unsigned char **pvs, unsigned char **pas ); typedef void (*FN_CMDSTART)(const edict_t *player, const struct usercmd_s *cmd, unsigned int random_seed);
typedef void (*FN_UPDATECLIENTDATA) ( const struct edict_s *ent, int sendweapons, struct clientdata_s *cd ); typedef void (*FN_CMDEND) (const edict_t *player);
typedef int (*FN_ADDTOFULLPACK) ( struct entity_state_s *state, int e, edict_t *ent, edict_t *host, int hostflags, int player, unsigned char *pSet ); typedef int (*FN_CONNECTIONLESSPACKET)(const struct netadr_s *net_from, const char *args, char *response_buffer, int *response_buffer_size);
typedef void (*FN_CREATEBASELINE) ( int player, int eindex, struct entity_state_s *baseline, struct edict_s *entity, int playermodelindex, vec3_t player_mins, vec3_t player_maxs ); typedef int (*FN_GETHULLBOUNDS)(int hullnumber, float *mins, float *maxs);
typedef void (*FN_REGISTERENCODERS) ( void ); typedef void (*FN_CREATEINSTANCEDBASELINES) ();
typedef int (*FN_GETWEAPONDATA) ( struct edict_s *player, struct weapon_data_s *info ); typedef int (*FN_INCONSISTENTFILE)(const edict_t *player, const char *filename, char *disconnect_message);
typedef void (*FN_CMDSTART) ( const edict_t *player, const struct usercmd_s *cmd, unsigned int random_seed ); typedef int (*FN_ALLOWLAGCOMPENSATION)();
typedef void (*FN_CMDEND) ( const edict_t *player ); typedef void (*FN_ONFREEENTPRIVATEDATA)(edict_t *pEnt);
typedef int (*FN_CONNECTIONLESSPACKET) ( const struct netadr_s *net_from, const char *args, char *response_buffer, int *response_buffer_size ); typedef void (*FN_GAMESHUTDOWN)();
typedef int (*FN_GETHULLBOUNDS) ( int hullnumber, float *mins, float *maxs ); typedef int (*FN_SHOULDCOLLIDE)(edict_t *pentTouched, edict_t *pentOther);
typedef void (*FN_CREATEINSTANCEDBASELINES) ( void );
typedef int (*FN_INCONSISTENTFILE) ( const edict_t *player, const char *filename, char *disconnect_message );
typedef int (*FN_ALLOWLAGCOMPENSATION) ( void );
typedef void (*FN_ONFREEENTPRIVATEDATA) (edict_t *pEnt);
typedef void (*FN_GAMESHUTDOWN) (void);
typedef int (*FN_SHOULDCOLLIDE) (edict_t *pentTouched, edict_t *pentOther);
//Added 2005-08-11 (no SDK update)
typedef void (*FN_CVARVALUE)(const edict_t *pEnt, const char *value); //! Obsolete! Use FN_CVARVALUE2 instead typedef void (*FN_CVARVALUE)(const edict_t *pEnt, const char *value); //! Obsolete! Use FN_CVARVALUE2 instead
//Added 2005-11-22 (no SDK update)
typedef void (*FN_CVARVALUE2)(const edict_t *pEnt, int requestID, const char *cvarName, const char *value); typedef void (*FN_CVARVALUE2)(const edict_t *pEnt, int requestID, const char *cvarName, const char *value);
#endif /* DLLAPI_H */

File diff suppressed because it is too large Load Diff

View File

@ -1,62 +1,23 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// engine_api.h - prototypes and typedefs for Half-Life engine functions
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef ENGINE_API_H
#define ENGINE_API_H
#include <archtypes.h> #include <archtypes.h>
// Plugin's GetEngineFunctions, called by metamod. // Plugin's GetEngineFunctions, called by metamod.
typedef int (*GET_ENGINE_FUNCTIONS_FN) (enginefuncs_t *pengfuncsFromEngine, int *interfaceVersion); typedef int (*GET_ENGINE_FUNCTIONS_FN)(enginefuncs_t *pengfuncsFromEngine, int *interfaceVersion);
// According to SDK engine/eiface.h: // According to SDK engine/eiface.h:
//! enginefuncs_t // ONLY ADD NEW FUNCTIONS TO THE END OF THIS STRUCT. INTERFACE VERSION IS FROZEN AT 138
//! ONLY ADD NEW FUNCTIONS TO THE END OF THIS STRUCT. INTERFACE VERSION IS FROZEN AT 138
#define ENGINE_INTERFACE_VERSION 138 #define ENGINE_INTERFACE_VERSION 138
// Protect against other projects which use this include file but use the // Protect against other projects which use this include file but use the
// normal enginefuncs_t type for their meta_engfuncs. // normal enginefuncs_t type for their meta_engfuncs.
#ifdef METAMOD_CORE #ifdef METAMOD_CORE
# include "meta_eiface.h" // meta_enginefuncs_t #include "meta_eiface.h" // meta_enginefuncs_t
extern meta_enginefuncs_t meta_engfuncs; extern meta_enginefuncs_t meta_engfuncs;
#else #else
extern enginefuncs_t meta_engfuncs; extern enginefuncs_t meta_engfuncs;
#endif #endif
// From SDK engine/eiface.h:
extern int mm_PrecacheModel(const char *s); extern int mm_PrecacheModel(const char *s);
extern int mm_PrecacheSound(const char *s); extern int mm_PrecacheSound(const char *s);
extern void mm_SetModel(edict_t *e, const char *m); extern void mm_SetModel(edict_t *e, const char *m);
@ -83,7 +44,7 @@ extern edict_t *mm_EntitiesInPVS(edict_t *pplayer);
extern void mm_MakeVectors(const float *rgflVector); extern void mm_MakeVectors(const float *rgflVector);
extern void mm_AngleVectors(const float *rgflVector, float *forward, float *right, float *up); extern void mm_AngleVectors(const float *rgflVector, float *forward, float *right, float *up);
extern edict_t *mm_CreateEntity(void); extern edict_t *mm_CreateEntity();
extern void mm_RemoveEntity(edict_t *e); extern void mm_RemoveEntity(edict_t *e);
extern edict_t *mm_CreateNamedEntity(int className); extern edict_t *mm_CreateNamedEntity(int className);
@ -102,12 +63,12 @@ extern void mm_TraceToss(edict_t *pent, edict_t *pentToIgnore, TraceResult *ptr)
extern int mm_TraceMonsterHull(edict_t *pEdict, const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr); extern int mm_TraceMonsterHull(edict_t *pEdict, const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr);
extern void mm_TraceHull(const float *v1, const float *v2, int fNoMonsters, int hullNumber, edict_t *pentToSkip, TraceResult *ptr); extern void mm_TraceHull(const float *v1, const float *v2, int fNoMonsters, int hullNumber, edict_t *pentToSkip, TraceResult *ptr);
extern void mm_TraceModel(const float *v1, const float *v2, int hullNumber, edict_t *pent, TraceResult *ptr); extern void mm_TraceModel(const float *v1, const float *v2, int hullNumber, edict_t *pent, TraceResult *ptr);
extern const char *mm_TraceTexture(edict_t *pTextureEntity, const float *v1, const float *v2 ); extern const char *mm_TraceTexture(edict_t *pTextureEntity, const float *v1, const float *v2);
extern void mm_TraceSphere(const float *v1, const float *v2, int fNoMonsters, float radius, edict_t *pentToSkip, TraceResult *ptr); extern void mm_TraceSphere(const float *v1, const float *v2, int fNoMonsters, float radius, edict_t *pentToSkip, TraceResult *ptr);
extern void mm_GetAimVector(edict_t *ent, float speed, float *rgflReturn); extern void mm_GetAimVector(edict_t *ent, float speed, float *rgflReturn);
extern void mm_ServerCommand(const char *str); extern void mm_ServerCommand(const char *str);
extern void mm_ServerExecute(void); extern void mm_ServerExecute();
extern void ClientCommand(edict_t *pEdict, const char *szFmt, ...); extern void ClientCommand(edict_t *pEdict, const char *szFmt, ...);
extern void mm_ParticleEffect(const float *org, const float *dir, float color, float count); extern void mm_ParticleEffect(const float *org, const float *dir, float color, float count);
@ -116,7 +77,7 @@ extern int mm_DecalIndex(const char *name);
extern int mm_PointContents(const float *rgflVector); extern int mm_PointContents(const float *rgflVector);
extern void mm_MessageBegin(int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); extern void mm_MessageBegin(int msg_dest, int msg_type, const float *pOrigin, edict_t *ed);
extern void mm_MessageEnd(void); extern void mm_MessageEnd();
extern void mm_WriteByte(int iValue); extern void mm_WriteByte(int iValue);
extern void mm_WriteChar(int iValue); extern void mm_WriteChar(int iValue);
@ -129,22 +90,13 @@ extern void mm_WriteEntity(int iValue);
extern void mm_CVarRegister(cvar_t *pCvar); extern void mm_CVarRegister(cvar_t *pCvar);
extern float mm_CVarGetFloat(const char *szVarName); extern float mm_CVarGetFloat(const char *szVarName);
extern const char* mm_CVarGetString(const char *szVarName); extern const char *mm_CVarGetString(const char *szVarName);
extern void mm_CVarSetFloat(const char *szVarName, float flValue); extern void mm_CVarSetFloat(const char *szVarName, float flValue);
extern void mm_CVarSetString(const char *szVarName, const char *szValue); extern void mm_CVarSetString(const char *szVarName, const char *szValue);
extern void mm_AlertMessage(ALERT_TYPE atype, const char *szFmt, ...); extern void mm_AlertMessage(ALERT_TYPE atype, const char *szFmt, ...);
#ifdef HLSDK_3_2_OLD_EIFACE
extern void mm_EngineFprintf(FILE *pfile, const char *szFmt, ...);
#else
extern void mm_EngineFprintf(void *pfile, const char *szFmt, ...); extern void mm_EngineFprintf(void *pfile, const char *szFmt, ...);
#endif
#ifdef HLSDK_3_2_OLD_EIFACE
extern void *mm_PvAllocEntPrivateData(edict_t *pEdict, long cb);
#else
extern void *mm_PvAllocEntPrivateData(edict_t *pEdict, int32 cb); extern void *mm_PvAllocEntPrivateData(edict_t *pEdict, int32 cb);
#endif
extern void *mm_PvEntPrivateData(edict_t *pEdict); extern void *mm_PvEntPrivateData(edict_t *pEdict);
extern void mm_FreeEntPrivateData(edict_t *pEdict); extern void mm_FreeEntPrivateData(edict_t *pEdict);
@ -162,42 +114,33 @@ extern void *mm_GetModelPtr(edict_t *pEdict);
extern int mm_RegUserMsg(const char *pszName, int iSize); extern int mm_RegUserMsg(const char *pszName, int iSize);
extern void mm_AnimationAutomove(const edict_t *pEdict, float flTime); extern void mm_AnimationAutomove(const edict_t *pEdict, float flTime);
extern void mm_GetBonePosition(const edict_t *pEdict, int iBone, float *rgflOrigin, float *rgflAngles ); extern void mm_GetBonePosition(const edict_t *pEdict, int iBone, float *rgflOrigin, float *rgflAngles);
#ifdef HLSDK_3_2_OLD_EIFACE extern uint32 mm_FunctionFromName(const char *pName);
extern unsigned long mm_FunctionFromName( const char *pName ); extern const char *mm_NameForFunction(uint32 function);
extern const char *mm_NameForFunction( unsigned long function );
#else
extern uint32 mm_FunctionFromName( const char *pName );
extern const char *mm_NameForFunction( uint32 function );
#endif
extern void mm_ClientPrintf( edict_t *pEdict, PRINT_TYPE ptype, const char *szMsg ); //! JOHN: engine callbacks so game DLL can print messages to individual clients extern void mm_ClientPrintf(edict_t *pEdict, PRINT_TYPE ptype, const char *szMsg); //! JOHN: engine callbacks so game DLL can print messages to individual clients
extern void mm_ServerPrint( const char *szMsg ); extern void mm_ServerPrint(const char *szMsg);
extern const char *mm_Cmd_Args( void ); //! these 3 added extern const char *mm_Cmd_Args(); //! these 3 added
extern const char *mm_Cmd_Argv( int argc ); //! so game DLL can easily extern const char *mm_Cmd_Argv(int argc); //! so game DLL can easily
extern int mm_Cmd_Argc( void ); //! access client 'cmd' strings extern int mm_Cmd_Argc(); //! access client 'cmd' strings
extern void mm_GetAttachment(const edict_t *pEdict, int iAttachment, float *rgflOrigin, float *rgflAngles ); extern void mm_GetAttachment(const edict_t *pEdict, int iAttachment, float *rgflOrigin, float *rgflAngles);
extern void mm_CRC32_Init(CRC32_t *pulCRC); extern void mm_CRC32_Init(CRC32_t *pulCRC);
extern void mm_CRC32_ProcessBuffer(CRC32_t *pulCRC, void *p, int len); extern void mm_CRC32_ProcessBuffer(CRC32_t *pulCRC, void *p, int len);
extern void mm_CRC32_ProcessByte(CRC32_t *pulCRC, unsigned char ch); extern void mm_CRC32_ProcessByte(CRC32_t *pulCRC, unsigned char ch);
extern CRC32_t mm_CRC32_Final(CRC32_t pulCRC); extern CRC32_t mm_CRC32_Final(CRC32_t pulCRC);
#ifdef HLSDK_3_2_OLD_EIFACE
extern long mm_RandomLong(long lLow, long lHigh);
#else
extern int32 mm_RandomLong(int32 lLow, int32 lHigh); extern int32 mm_RandomLong(int32 lLow, int32 lHigh);
#endif
extern float mm_RandomFloat(float flLow, float flHigh); extern float mm_RandomFloat(float flLow, float flHigh);
extern void mm_SetView(const edict_t *pClient, const edict_t *pViewent ); extern void mm_SetView(const edict_t *pClient, const edict_t *pViewent);
extern float mm_Time( void ); extern float mm_Time();
extern void mm_CrosshairAngle(const edict_t *pClient, float pitch, float yaw); extern void mm_CrosshairAngle(const edict_t *pClient, float pitch, float yaw);
extern byte * mm_LoadFileForMe(const char *filename, int *pLength); extern byte *mm_LoadFileForMe(const char *filename, int *pLength);
extern void mm_FreeFile(void *buffer); extern void mm_FreeFile(void *buffer);
extern void mm_EndSection(const char *pszSectionName); //! trigger_endsection extern void mm_EndSection(const char *pszSectionName); //! trigger_endsection
@ -206,9 +149,9 @@ extern void mm_GetGameDir(char *szGetGameDir);
extern void mm_Cvar_RegisterVariable(cvar_t *variable); extern void mm_Cvar_RegisterVariable(cvar_t *variable);
extern void mm_FadeClientVolume(const edict_t *pEdict, int fadePercent, int fadeOutSeconds, int holdTime, int fadeInSeconds); extern void mm_FadeClientVolume(const edict_t *pEdict, int fadePercent, int fadeOutSeconds, int holdTime, int fadeInSeconds);
extern void mm_SetClientMaxspeed(const edict_t *pEdict, float fNewMaxspeed); extern void mm_SetClientMaxspeed(const edict_t *pEdict, float fNewMaxspeed);
extern edict_t * mm_CreateFakeClient(const char *netname); //! returns NULL if fake client can't be created extern edict_t *mm_CreateFakeClient(const char *netname); //! returns NULL if fake client can't be created
extern void mm_RunPlayerMove(edict_t *fakeclient, const float *viewangles, float forwardmove, float sidemove, float upmove, unsigned short buttons, byte impulse, byte msec ); extern void mm_RunPlayerMove(edict_t *fakeclient, const float *viewangles, float forwardmove, float sidemove, float upmove, unsigned short buttons, byte impulse, byte msec);
extern int mm_NumberOfEntities(void); extern int mm_NumberOfEntities();
extern char *mm_GetInfoKeyBuffer(edict_t *e); //! passing in NULL gets the serverinfo extern char *mm_GetInfoKeyBuffer(edict_t *e); //! passing in NULL gets the serverinfo
extern char *mm_InfoKeyValue(char *infobuffer, const char *key); extern char *mm_InfoKeyValue(char *infobuffer, const char *key);
@ -216,253 +159,218 @@ extern void mm_SetKeyValue(char *infobuffer, const char *key, const char *value)
extern void mm_SetClientKeyValue(int clientIndex, char *infobuffer, const char *key, const char *value); extern void mm_SetClientKeyValue(int clientIndex, char *infobuffer, const char *key, const char *value);
extern int mm_IsMapValid(char *filename); extern int mm_IsMapValid(char *filename);
extern void mm_StaticDecal( const float *origin, int decalIndex, int entityIndex, int modelIndex ); extern void mm_StaticDecal(const float *origin, int decalIndex, int entityIndex, int modelIndex);
extern int mm_PrecacheGeneric(const char *s); extern int mm_PrecacheGeneric(const char *s);
extern int mm_GetPlayerUserId(edict_t *e ); //! returns the server assigned userid for this player. useful for logging frags, etc. returns -1 if the edict couldn't be found in the list of clients extern int mm_GetPlayerUserId(edict_t *e); //! returns the server assigned userid for this player. useful for logging frags, etc. returns -1 if the edict couldn't be found in the list of clients
extern void mm_BuildSoundMsg(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); extern void mm_BuildSoundMsg(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed);
extern int mm_IsDedicatedServer(void);//! is this a dedicated server? extern int mm_IsDedicatedServer();//! is this a dedicated server?
extern cvar_t *mm_CVarGetPointer(const char *szVarName); extern cvar_t *mm_CVarGetPointer(const char *szVarName);
extern unsigned int mm_GetPlayerWONId(edict_t *e); //! returns the server assigned WONid for this player. useful for logging frags, etc. returns -1 if the edict couldn't be found in the list of clients extern unsigned int mm_GetPlayerWONId(edict_t *e); //! returns the server assigned WONid for this player. useful for logging frags, etc. returns -1 if the edict couldn't be found in the list of clients
//! YWB 8/1/99 TFF Physics additions // 8/1/99 TFF Physics additions
extern void mm_Info_RemoveKey( char *s, const char *key ); extern void mm_Info_RemoveKey(char *s, const char *key);
extern const char *mm_GetPhysicsKeyValue( const edict_t *pClient, const char *key ); extern const char *mm_GetPhysicsKeyValue(const edict_t *pClient, const char *key);
extern void mm_SetPhysicsKeyValue( const edict_t *pClient, const char *key, const char *value ); extern void mm_SetPhysicsKeyValue(const edict_t *pClient, const char *key, const char *value);
extern const char *mm_GetPhysicsInfoString( const edict_t *pClient ); extern const char *mm_GetPhysicsInfoString(const edict_t *pClient);
extern unsigned short mm_PrecacheEvent( int type, const char *psz ); extern unsigned short mm_PrecacheEvent(int type, const char *psz);
extern void mm_PlaybackEvent( int flags, const edict_t *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 ); extern void mm_PlaybackEvent(int flags, const edict_t *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2);
extern unsigned char *mm_SetFatPVS(float *org);
extern unsigned char *mm_SetFatPAS(float *org);
extern int mm_CheckVisibility(edict_t *entity, unsigned char *pset);
extern unsigned char *mm_SetFatPVS( float *org ); extern void mm_DeltaSetField(struct delta_s *pFields, const char *fieldname);
extern unsigned char *mm_SetFatPAS( float *org ); extern void mm_DeltaUnsetField(struct delta_s *pFields, const char *fieldname);
extern void mm_DeltaAddEncoder(const char *name, void (*conditionalencode)(struct delta_s *pFields, const unsigned char *from, const unsigned char *to));
extern int mm_GetCurrentPlayer();
extern int mm_CanSkipPlayer(const edict_t *player);
extern int mm_DeltaFindField(struct delta_s *pFields, const char *fieldname);
extern void mm_DeltaSetFieldByIndex(struct delta_s *pFields, int fieldNumber);
extern void mm_DeltaUnsetFieldByIndex(struct delta_s *pFields, int fieldNumber);
extern void mm_SetGroupMask(int mask, int op);
extern int CreateInstancedBaseline(int classname, struct entity_state_s *baseline);
extern void mm_Cvar_DirectSet(struct cvar_s *var, const char *value);
extern int mm_CheckVisibility( edict_t *entity, unsigned char *pset ); // Forces the client and server to be running with the same version of the specified file e.g., a player model).
// Calling this has no effect in single player
extern void mm_ForceUnmodified(FORCE_TYPE type, float *mins, float *maxs, const char *filename);
extern void mm_GetPlayerStats(const edict_t *pClient, int *ping, int *packet_loss);
extern void mm_DeltaSetField( struct delta_s *pFields, const char *fieldname ); extern void mm_AddServerCommand(const char *cmd_name, void (*function)());
extern void mm_DeltaUnsetField( struct delta_s *pFields, const char *fieldname );
extern void mm_DeltaAddEncoder( const char *name, void (*conditionalencode)( struct delta_s *pFields, const unsigned char *from, const unsigned char *to ) );
extern int mm_GetCurrentPlayer( void );
extern int mm_CanSkipPlayer( const edict_t *player );
extern int mm_DeltaFindField( struct delta_s *pFields, const char *fieldname );
extern void mm_DeltaSetFieldByIndex( struct delta_s *pFields, int fieldNumber );
extern void mm_DeltaUnsetFieldByIndex( struct delta_s *pFields, int fieldNumber );
extern void mm_SetGroupMask( int mask, int op );
extern int CreateInstancedBaseline( int classname, struct entity_state_s *baseline );
extern void mm_Cvar_DirectSet( struct cvar_s *var, const char *value );
//! Forces the client and server to be running with the same version of the specified file
//!( e.g., a player model ).
//! Calling this has no effect in single player
extern void mm_ForceUnmodified( FORCE_TYPE type, float *mins, float *maxs, const char *filename );
extern void mm_GetPlayerStats( const edict_t *pClient, int *ping, int *packet_loss );
extern void mm_AddServerCommand( const char *cmd_name, void (*function) (void) );
// Added in SDK 2.2:
extern qboolean mm_Voice_GetClientListening(int iReceiver, int iSender); extern qboolean mm_Voice_GetClientListening(int iReceiver, int iSender);
extern qboolean mm_Voice_SetClientListening(int iReceiver, int iSender, qboolean bListen); extern qboolean mm_Voice_SetClientListening(int iReceiver, int iSender, qboolean bListen);
// Added for HL 1109 (no SDK update):
extern const char *mm_pfnGetPlayerAuthId(edict_t *e); extern const char *mm_pfnGetPlayerAuthId(edict_t *e);
// Added 2003-11-10 (no SDK update): extern sequenceEntry_s *mm_SequenceGet(const char *fileName, const char *entryName);
extern sequenceEntry_s * mm_SequenceGet(const char* fileName, const char* entryName); extern sentenceEntry_s *mm_SequencePickSentence(const char *groupName, int pickMethod, int *picked);
extern sentenceEntry_s * mm_SequencePickSentence(const char* groupName, int pickMethod, int *picked);
extern int mm_GetFileSize(const char *filename); extern int mm_GetFileSize(const char *filename);
extern unsigned int mm_GetApproxWavePlayLen(const char *filepath); extern unsigned int mm_GetApproxWavePlayLen(const char *filepath);
extern int mm_IsCareerMatch(void); extern int mm_IsCareerMatch();
extern int mm_GetLocalizedStringLength(const char *label); extern int mm_GetLocalizedStringLength(const char *label);
extern void mm_RegisterTutorMessageShown(int mid); extern void mm_RegisterTutorMessageShown(int mid);
extern int mm_GetTimesTutorMessageShown(int mid); extern int mm_GetTimesTutorMessageShown(int mid);
extern void mm_ProcessTutorMessageDecayBuffer(int *buffer, int bufferLength); extern void mm_ProcessTutorMessageDecayBuffer(int *buffer, int bufferLength);
extern void mm_ConstructTutorMessageDecayBuffer(int *buffer, int bufferLength); extern void mm_ConstructTutorMessageDecayBuffer(int *buffer, int bufferLength);
extern void mm_ResetTutorMessageDecayData(void); extern void mm_ResetTutorMessageDecayData();
//Added 2005-08-11 (no SDK update)
extern void mm_QueryClientCvarValue(const edict_t *pEdict, const char *cvarName); //! Obsolete! Use mm_QueryClientCvarValue2 instead extern void mm_QueryClientCvarValue(const edict_t *pEdict, const char *cvarName); //! Obsolete! Use mm_QueryClientCvarValue2 instead
//Added 2005-11-22 (no SDK update)
extern void mm_QueryClientCvarValue2(const edict_t *pEdict, const char *cvarName, int requestID); extern void mm_QueryClientCvarValue2(const edict_t *pEdict, const char *cvarName, int requestID);
//Added 2009-06-17 (no SDK update)
extern int mm_EngCheckParm(const char *pchCmdLineToken, char **ppnext); extern int mm_EngCheckParm(const char *pchCmdLineToken, char **ppnext);
// Typedefs for the above functions: // Typedefs for the above functions:
typedef int (*FN_PRECACHEMODEL)(const char *s);
typedef int (*FN_PRECACHEMODEL) (const char* s); typedef int (*FN_PRECACHESOUND)(const char *s);
typedef int (*FN_PRECACHESOUND) (const char* s); typedef void (*FN_SETMODEL)(edict_t *e, const char *m);
typedef void (*FN_SETMODEL) (edict_t *e, const char *m); typedef int (*FN_MODELINDEX)(const char *m);
typedef int (*FN_MODELINDEX) (const char *m); typedef int (*FN_MODELFRAMES)(int modelIndex);
typedef int (*FN_MODELFRAMES) (int modelIndex); typedef void (*FN_SETSIZE)(edict_t *e, const float *rgflMin, const float *rgflMax);
typedef void (*FN_SETSIZE) (edict_t *e, const float *rgflMin, const float *rgflMax); typedef void (*FN_CHANGELEVEL)(const char *s1, const char *s2);
typedef void (*FN_CHANGELEVEL) (const char *s1, const char *s2); typedef void (*FN_GETSPAWNPARMS)(edict_t *ent);
typedef void (*FN_GETSPAWNPARMS) (edict_t *ent); typedef void (*FN_SAVESPAWNPARMS)(edict_t *ent);
typedef void (*FN_SAVESPAWNPARMS) (edict_t *ent); typedef float (*FN_VECTOYAW)(const float *rgflVector);
typedef float (*FN_VECTOYAW) (const float *rgflVector); typedef void (*FN_VECTOANGLES)(const float *rgflVectorIn, float *rgflVectorOut);
typedef void (*FN_VECTOANGLES) (const float *rgflVectorIn, float *rgflVectorOut); typedef void (*FN_MOVETOORIGIN)(edict_t *ent, const float *pflGoal, float dist, int iMoveType);
typedef void (*FN_MOVETOORIGIN) (edict_t *ent, const float *pflGoal, float dist, int iMoveType); typedef void (*FN_CHANGEYAW)(edict_t *ent);
typedef void (*FN_CHANGEYAW) (edict_t *ent); typedef void (*FN_CHANGEPITCH)(edict_t *ent);
typedef void (*FN_CHANGEPITCH) (edict_t *ent); typedef edict_t *(*FN_FINDENTITYBYSTRING)(edict_t *pEdictStartSearchAfter, const char *pszField, const char *pszValue);
typedef edict_t * (*FN_FINDENTITYBYSTRING) (edict_t *pEdictStartSearchAfter, const char *pszField, const char *pszValue); typedef int (*FN_GETENTITYILLUM)(edict_t *pEnt);
typedef int (*FN_GETENTITYILLUM) (edict_t *pEnt); typedef edict_t *(*FN_FINDENTITYINSPHERE)(edict_t *pEdictStartSearchAfter, const float *org, float rad);
typedef edict_t * (*FN_FINDENTITYINSPHERE) (edict_t *pEdictStartSearchAfter, const float *org, float rad); typedef edict_t *(*FN_FINDCLIENTINPVS)(edict_t *pEdict);
typedef edict_t * (*FN_FINDCLIENTINPVS) (edict_t *pEdict); typedef edict_t *(*FN_ENTITIESINPVS)(edict_t *pplayer);
typedef edict_t * (*FN_ENTITIESINPVS) (edict_t *pplayer); typedef void (*FN_MAKEVECTORS)(const float *rgflVector);
typedef void (*FN_MAKEVECTORS) (const float *rgflVector); typedef void (*FN_ANGLEVECTORS)(const float *rgflVector, float *forward, float *right, float *up);
typedef void (*FN_ANGLEVECTORS) (const float *rgflVector, float *forward, float *right, float *up); typedef edict_t *(*FN_CREATEENTITY)();
typedef edict_t * (*FN_CREATEENTITY) (void); typedef void (*FN_REMOVEENTITY)(edict_t *e);
typedef void (*FN_REMOVEENTITY) (edict_t *e); typedef edict_t *(*FN_CREATENAMEDENTITY)(int className);
typedef edict_t * (*FN_CREATENAMEDENTITY) (int className); typedef void (*FN_MAKESTATIC)(edict_t *ent);
typedef void (*FN_MAKESTATIC) (edict_t *ent); typedef int (*FN_ENTISONFLOOR)(edict_t *e);
typedef int (*FN_ENTISONFLOOR) (edict_t *e); typedef int (*FN_DROPTOFLOOR)(edict_t *e);
typedef int (*FN_DROPTOFLOOR) (edict_t *e); typedef int (*FN_WALKMOVE)(edict_t *ent, float yaw, float dist, int iMode);
typedef int (*FN_WALKMOVE) (edict_t *ent, float yaw, float dist, int iMode); typedef void (*FN_SETORIGIN)(edict_t *e, const float *rgflOrigin);
typedef void (*FN_SETORIGIN) (edict_t *e, const float *rgflOrigin); typedef void (*FN_EMITSOUND)(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch);
typedef void (*FN_EMITSOUND) (edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch); typedef void (*FN_EMITAMBIENTSOUND)(edict_t *entity, float *pos, const char *samp, float vol, float attenuation, int fFlags, int pitch);
typedef void (*FN_EMITAMBIENTSOUND) (edict_t *entity, float *pos, const char *samp, float vol, float attenuation, int fFlags, int pitch); typedef void (*FN_TRACELINE)(const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr);
typedef void (*FN_TRACELINE) (const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr); typedef void (*FN_TRACETOSS)(edict_t *pent, edict_t *pentToIgnore, TraceResult *ptr);
typedef void (*FN_TRACETOSS) (edict_t *pent, edict_t *pentToIgnore, TraceResult *ptr); typedef int (*FN_TRACEMONSTERHULL)(edict_t *pEdict, const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr);
typedef int (*FN_TRACEMONSTERHULL) (edict_t *pEdict, const float *v1, const float *v2, int fNoMonsters, edict_t *pentToSkip, TraceResult *ptr); typedef void (*FN_TRACEHULL)(const float *v1, const float *v2, int fNoMonsters, int hullNumber, edict_t *pentToSkip, TraceResult *ptr);
typedef void (*FN_TRACEHULL) (const float *v1, const float *v2, int fNoMonsters, int hullNumber, edict_t *pentToSkip, TraceResult *ptr); typedef void (*FN_TRACEMODEL)(const float *v1, const float *v2, int hullNumber, edict_t *pent, TraceResult *ptr);
typedef void (*FN_TRACEMODEL) (const float *v1, const float *v2, int hullNumber, edict_t *pent, TraceResult *ptr); typedef const char *(*FN_TRACETEXTURE)(edict_t *pTextureEntity, const float *v1, const float *v2);
typedef const char * (*FN_TRACETEXTURE) (edict_t *pTextureEntity, const float *v1, const float *v2 ); typedef void (*FN_TRACESPHERE)(const float *v1, const float *v2, int fNoMonsters, float radius, edict_t *pentToSkip, TraceResult *ptr);
typedef void (*FN_TRACESPHERE) (const float *v1, const float *v2, int fNoMonsters, float radius, edict_t *pentToSkip, TraceResult *ptr); typedef void (*FN_GETAIMVECTOR)(edict_t *ent, float speed, float *rgflReturn);
typedef void (*FN_GETAIMVECTOR) (edict_t *ent, float speed, float *rgflReturn); typedef void (*FN_SERVERCOMMAND)(char *str);
typedef void (*FN_SERVERCOMMAND) (char *str); typedef void (*FN_SERVEREXECUTE)();
typedef void (*FN_SERVEREXECUTE) (void); typedef void (*FN_CLIENTCOMMAND_ENG)(edict_t *pEdict, char *szFmt, ...);
typedef void (*FN_CLIENTCOMMAND_ENG) (edict_t *pEdict, char *szFmt, ...); typedef void (*FN_PARTICLEEFFECT)(const float *org, const float *dir, float color, float count);
typedef void (*FN_PARTICLEEFFECT) (const float *org, const float *dir, float color, float count); typedef void (*FN_LIGHTSTYLE)(int style, char *val);
typedef void (*FN_LIGHTSTYLE) (int style, char *val); typedef int (*FN_DECALINDEX)(const char *name);
typedef int (*FN_DECALINDEX) (const char *name); typedef int (*FN_POINTCONTENTS)(const float *rgflVector);
typedef int (*FN_POINTCONTENTS) (const float *rgflVector); typedef void (*FN_MESSAGEBEGIN)(int msg_dest, int msg_type, const float *pOrigin, edict_t *ed);
typedef void (*FN_MESSAGEBEGIN) (int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); typedef void (*FN_MESSAGEEND)();
typedef void (*FN_MESSAGEEND) (void); typedef void (*FN_WRITEBYTE)(int iValue);
typedef void (*FN_WRITEBYTE) (int iValue); typedef void (*FN_WRITECHAR)(int iValue);
typedef void (*FN_WRITECHAR) (int iValue); typedef void (*FN_WRITESHORT)(int iValue);
typedef void (*FN_WRITESHORT) (int iValue); typedef void (*FN_WRITELONG)(int iValue);
typedef void (*FN_WRITELONG) (int iValue); typedef void (*FN_WRITEANGLE)(float flValue);
typedef void (*FN_WRITEANGLE) (float flValue); typedef void (*FN_WRITECOORD)(float flValue);
typedef void (*FN_WRITECOORD) (float flValue); typedef void (*FN_WRITESTRING)(const char *sz);
typedef void (*FN_WRITESTRING) (const char *sz); typedef void (*FN_WRITEENTITY)(int iValue);
typedef void (*FN_WRITEENTITY) (int iValue); typedef void (*FN_CVARREGISTER)(cvar_t *pCvar);
typedef void (*FN_CVARREGISTER) (cvar_t *pCvar); typedef float (*FN_CVARGETFLOAT)(const char *szVarName);
typedef float (*FN_CVARGETFLOAT) (const char *szVarName); typedef const char *(*FN_CVARGETSTRING)(const char *szVarName);
typedef const char * (*FN_CVARGETSTRING) (const char *szVarName); typedef void (*FN_CVARSETFLOAT)(const char *szVarName, float flValue);
typedef void (*FN_CVARSETFLOAT) (const char *szVarName, float flValue); typedef void (*FN_CVARSETSTRING)(const char *szVarName, const char *szValue);
typedef void (*FN_CVARSETSTRING) (const char *szVarName, const char *szValue); typedef void (*FN_ALERTMESSAGE)(ALERT_TYPE atype, const char *szFmt, ...);
typedef void (*FN_ALERTMESSAGE) (ALERT_TYPE atype, const char *szFmt, ...); typedef void (*FN_ENGINEFPRINTF)(void *pfile, const char *szFmt, ...);
#ifdef HLSDK_3_2_OLD_EIFACE typedef void *(*FN_PVALLOCENTPRIVATEDATA)(edict_t *pEdict, int32 cb);
typedef void (*FN_ENGINEFPRINTF) (FILE *pfile, const char *szFmt, ...); typedef void *(*FN_PVENTPRIVATEDATA)(edict_t *pEdict);
typedef void * (*FN_PVALLOCENTPRIVATEDATA) (edict_t *pEdict, long cb); typedef void (*FN_FREEENTPRIVATEDATA)(edict_t *pEdict);
#else typedef const char *(*FN_SZFROMINDEX)(int iString);
typedef void (*FN_ENGINEFPRINTF) (void *pfile, const char *szFmt, ...); typedef int (*FN_ALLOCSTRING)(const char *szValue);
typedef void * (*FN_PVALLOCENTPRIVATEDATA) (edict_t *pEdict, int32 cb); typedef struct entvars_s *(*FN_GETVARSOFENT)(edict_t *pEdict);
#endif typedef edict_t *(*FN_PENTITYOFENTOFFSET)(int iEntOffset);
typedef void * (*FN_PVENTPRIVATEDATA) (edict_t *pEdict); typedef int (*FN_ENTOFFSETOFPENTITY)(const edict_t *pEdict);
typedef void (*FN_FREEENTPRIVATEDATA) (edict_t *pEdict); typedef int (*FN_INDEXOFEDICT)(const edict_t *pEdict);
typedef const char * (*FN_SZFROMINDEX) (int iString); typedef edict_t *(*FN_PENTITYOFENTINDEX)(int iEntIndex);
typedef int (*FN_ALLOCSTRING) (const char *szValue); typedef edict_t *(*FN_FINDENTITYBYVARS)(struct entvars_s *pvars);
typedef struct entvars_s * (*FN_GETVARSOFENT) (edict_t *pEdict); typedef void *(*FN_GETMODELPTR)(edict_t *pEdict);
typedef edict_t * (*FN_PENTITYOFENTOFFSET) (int iEntOffset); typedef int (*FN_REGUSERMSG)(const char *pszName, int iSize);
typedef int (*FN_ENTOFFSETOFPENTITY) (const edict_t *pEdict); typedef void (*FN_ANIMATIONAUTOMOVE)(const edict_t *pEdict, float flTime);
typedef int (*FN_INDEXOFEDICT) (const edict_t *pEdict); typedef void (*FN_GETBONEPOSITION)(const edict_t *pEdict, int iBone, float *rgflOrigin, float *rgflAngles);
typedef edict_t * (*FN_PENTITYOFENTINDEX) (int iEntIndex); typedef uint32 (*FN_FUNCTIONFROMNAME)(const char *pName);
typedef edict_t * (*FN_FINDENTITYBYVARS) (struct entvars_s *pvars); typedef const char *(*FN_NAMEFORFUNCTION)(uint32 function);
typedef void * (*FN_GETMODELPTR) (edict_t *pEdict); typedef void (*FN_CLIENTPRINTF)(edict_t *pEdict, PRINT_TYPE ptype, const char *szMsg);
typedef int (*FN_REGUSERMSG) (const char *pszName, int iSize); typedef void (*FN_SERVERPRINT)(const char *szMsg);
typedef void (*FN_ANIMATIONAUTOMOVE) (const edict_t *pEdict, float flTime); typedef const char *(*FN_CMD_ARGS)();
typedef void (*FN_GETBONEPOSITION) (const edict_t *pEdict, int iBone, float *rgflOrigin, float *rgflAngles ); typedef const char *(*FN_CMD_ARGV)(int argc);
#ifdef HLSDK_3_2_OLD_EIFACE typedef int (*FN_CMD_ARGC)();
typedef unsigned long (*FN_FUNCTIONFROMNAME) ( const char *pName ); typedef void (*FN_GETATTACHMENT)(const edict_t *pEdict, int iAttachment, float *rgflOrigin, float *rgflAngles);
typedef const char * (*FN_NAMEFORFUNCTION) ( unsigned long function ); typedef void (*FN_CRC32_INIT)(CRC32_t *pulCRC);
#else typedef void (*FN_CRC32_PROCESSBUFFER)(CRC32_t *pulCRC, void *p, int len);
typedef uint32 (*FN_FUNCTIONFROMNAME) ( const char *pName ); typedef void (*FN_CRC32_PROCESSBYTE)(CRC32_t *pulCRC, unsigned char ch);
typedef const char * (*FN_NAMEFORFUNCTION) ( uint32 function ); typedef CRC32_t (*FN_CRC32_FINAL)(CRC32_t pulCRC);
#endif typedef int32 (*FN_RANDOMLONG)(int32 lLow, int32 lHigh);
typedef void (*FN_CLIENTPRINTF) ( edict_t *pEdict, PRINT_TYPE ptype, const char *szMsg ); typedef float (*FN_RANDOMFLOAT)(float flLow, float flHigh);
typedef void (*FN_SERVERPRINT) ( const char *szMsg ); typedef void (*FN_SETVIEW)(const edict_t *pClient, const edict_t *pViewent);
typedef const char * (*FN_CMD_ARGS) ( void ); typedef float (*FN_TIME)();
typedef const char * (*FN_CMD_ARGV) ( int argc ); typedef void (*FN_CROSSHAIRANGLE)(const edict_t *pClient, float pitch, float yaw);
typedef int (*FN_CMD_ARGC) ( void ); typedef byte *(*FN_LOADFILEFORME)(char *filename, int *pLength);
typedef void (*FN_GETATTACHMENT) (const edict_t *pEdict, int iAttachment, float *rgflOrigin, float *rgflAngles ); typedef void (*FN_FREEFILE)(void *buffer);
typedef void (*FN_CRC32_INIT) (CRC32_t *pulCRC); typedef void (*FN_ENDSECTION)(const char *pszSectionName);
typedef void (*FN_CRC32_PROCESSBUFFER) (CRC32_t *pulCRC, void *p, int len); typedef int (*FN_COMPAREFILETIME)(char *filename1, char *filename2, int *iCompare);
typedef void (*FN_CRC32_PROCESSBYTE) (CRC32_t *pulCRC, unsigned char ch); typedef void (*FN_GETGAMEDIR)(char *szGetGameDir);
typedef CRC32_t (*FN_CRC32_FINAL) (CRC32_t pulCRC); typedef void (*FN_CVAR_REGISTERVARIABLE)(cvar_t *variable);
#ifdef HLSDK_3_2_OLD_EIFACE typedef void (*FN_FADECLIENTVOLUME)(const edict_t *pEdict, int fadePercent, int fadeOutSeconds, int holdTime, int fadeInSeconds);
typedef long (*FN_RANDOMLONG) (long lLow, long lHigh); typedef void (*FN_SETCLIENTMAXSPEED)(edict_t *pEdict, float fNewMaxspeed);
#else typedef edict_t *(*FN_CREATEFAKECLIENT)(const char *netname);
typedef int32 (*FN_RANDOMLONG) (int32 lLow, int32 lHigh); typedef void (*FN_RUNPLAYERMOVE)(edict_t *fakeclient, const float *viewangles, float forwardmove, float sidemove, float upmove, unsigned short buttons, byte impulse, byte msec);
#endif typedef int (*FN_NUMBEROFENTITIES)();
typedef float (*FN_RANDOMFLOAT) (float flLow, float flHigh); typedef char *(*FN_GETINFOKEYBUFFER)(edict_t *e);
typedef void (*FN_SETVIEW) (const edict_t *pClient, const edict_t *pViewent ); typedef char *(*FN_INFOKEYVALUE)(char *infobuffer, const char *key);
typedef float (*FN_TIME) ( void ); typedef void (*FN_SETKEYVALUE)(char *infobuffer, const char *key, const char *value);
typedef void (*FN_CROSSHAIRANGLE) (const edict_t *pClient, float pitch, float yaw); typedef void (*FN_SETCLIENTKEYVALUE)(int clientIndex, char *infobuffer, const char *key, const char *value);
typedef byte * (*FN_LOADFILEFORME) (char *filename, int *pLength); typedef int (*FN_ISMAPVALID)(char *filename);
typedef void (*FN_FREEFILE) (void *buffer); typedef void (*FN_STATICDECAL)(const float *origin, int decalIndex, int entityIndex, int modelIndex);
typedef void (*FN_ENDSECTION) (const char *pszSectionName); typedef int (*FN_PRECACHEGENERIC)(char *s);
typedef int (*FN_COMPAREFILETIME) (char *filename1, char *filename2, int *iCompare); typedef int (*FN_GETPLAYERUSERID)(edict_t *e);
typedef void (*FN_GETGAMEDIR) (char *szGetGameDir); typedef void (*FN_BUILDSOUNDMSG)(edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed);
typedef void (*FN_CVAR_REGISTERVARIABLE) (cvar_t *variable); typedef int (*FN_ISDEDICATEDSERVER)();
typedef void (*FN_FADECLIENTVOLUME) (const edict_t *pEdict, int fadePercent, int fadeOutSeconds, int holdTime, int fadeInSeconds); typedef cvar_t *(*FN_CVARGETPOINTER)(const char *szVarName);
typedef void (*FN_SETCLIENTMAXSPEED) (edict_t *pEdict, float fNewMaxspeed); typedef unsigned int (*FN_GETPLAYERWONID)(edict_t *e);
typedef edict_t * (*FN_CREATEFAKECLIENT) (const char *netname); typedef void (*FN_INFO_REMOVEKEY)(char *s, const char *key);
typedef void (*FN_RUNPLAYERMOVE) (edict_t *fakeclient, const float *viewangles, float forwardmove, float sidemove, float upmove, unsigned short buttons, byte impulse, byte msec ); typedef const char *(*FN_GETPHYSICSKEYVALUE)(const edict_t *pClient, const char *key);
typedef int (*FN_NUMBEROFENTITIES) (void); typedef void (*FN_SETPHYSICSKEYVALUE)(const edict_t *pClient, const char *key, const char *value);
typedef char * (*FN_GETINFOKEYBUFFER) (edict_t *e); typedef const char *(*FN_GETPHYSICSINFOSTRING)(const edict_t *pClient);
typedef char * (*FN_INFOKEYVALUE) (char *infobuffer, const char *key); typedef unsigned short (*FN_PRECACHEEVENT)(int type, const char *psz);
typedef void (*FN_SETKEYVALUE) (char *infobuffer, const char *key, const char *value); typedef void (*FN_PLAYBACKEVENT)(int flags, const edict_t *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2);
typedef void (*FN_SETCLIENTKEYVALUE) (int clientIndex, char *infobuffer, const char *key, const char *value); typedef unsigned char *(*FN_SETFATPVS)(float *org);
typedef int (*FN_ISMAPVALID) (char *filename); typedef unsigned char *(*FN_SETFATPAS)(float *org);
typedef void (*FN_STATICDECAL) ( const float *origin, int decalIndex, int entityIndex, int modelIndex ); typedef int (*FN_CHECKVISIBILITY)(edict_t *entity, unsigned char *pset);
typedef int (*FN_PRECACHEGENERIC) (char *s); typedef void (*FN_DELTASETFIELD)(struct delta_s *pFields, const char *fieldname);
typedef int (*FN_GETPLAYERUSERID) (edict_t *e ); typedef void (*FN_DELTAUNSETFIELD)(struct delta_s *pFields, const char *fieldname);
typedef void (*FN_BUILDSOUNDMSG) (edict_t *entity, int channel, const char *sample, /*int*/float volume, float attenuation, int fFlags, int pitch, int msg_dest, int msg_type, const float *pOrigin, edict_t *ed); typedef void (*FN_DELTAADDENCODER)(char *name, void (*conditionalencode)(struct delta_s *pFields, const unsigned char *from, const unsigned char *to));
typedef int (*FN_ISDEDICATEDSERVER) (void); typedef int (*FN_GETCURRENTPLAYER)();
typedef cvar_t * (*FN_CVARGETPOINTER) (const char *szVarName); typedef int (*FN_CANSKIPPLAYER)(const edict_t *player);
typedef unsigned int (*FN_GETPLAYERWONID) (edict_t *e); typedef int (*FN_DELTAFINDFIELD)(struct delta_s *pFields, const char *fieldname);
typedef void (*FN_INFO_REMOVEKEY) ( char *s, const char *key ); typedef void (*FN_DELTASETFIELDBYINDEX)(struct delta_s *pFields, int fieldNumber);
typedef const char * (*FN_GETPHYSICSKEYVALUE) ( const edict_t *pClient, const char *key ); typedef void (*FN_DELTAUNSETFIELDBYINDEX)(struct delta_s *pFields, int fieldNumber);
typedef void (*FN_SETPHYSICSKEYVALUE) ( const edict_t *pClient, const char *key, const char *value ); typedef void (*FN_SETGROUPMASK)(int mask, int op);
typedef const char * (*FN_GETPHYSICSINFOSTRING) ( const edict_t *pClient ); typedef int (*FN_CREATEINSTANCEDBASELINE)(int classname, struct entity_state_s *baseline);
typedef unsigned short (*FN_PRECACHEEVENT) ( int type, const char *psz ); typedef void (*FN_CVAR_DIRECTSET)(struct cvar_s *var, const char *value);
typedef void (*FN_PLAYBACKEVENT) ( int flags, const edict_t *pInvoker, unsigned short eventindex, float delay, float *origin, float *angles, float fparam1, float fparam2, int iparam1, int iparam2, int bparam1, int bparam2 ); typedef void (*FN_FORCEUNMODIFIED)(FORCE_TYPE type, float *mins, float *maxs, const char *filename);
typedef unsigned char * (*FN_SETFATPVS) ( float *org ); typedef void (*FN_GETPLAYERSTATS)(const edict_t *pClient, int *ping, int *packet_loss);
typedef unsigned char * (*FN_SETFATPAS) ( float *org ); typedef void (*FN_ADDSERVERCOMMAND)(char *cmd_name, void (*function)());
typedef int (*FN_CHECKVISIBILITY) ( edict_t *entity, unsigned char *pset ); typedef qboolean (*FN_VOICE_GETCLIENTLISTENING)(int iReceiver, int iSender);
typedef void (*FN_DELTASETFIELD) ( struct delta_s *pFields, const char *fieldname ); typedef qboolean (*FN_VOICE_SETCLIENTLISTENING)(int iReceiver, int iSender, qboolean bListen);
typedef void (*FN_DELTAUNSETFIELD) ( struct delta_s *pFields, const char *fieldname ); typedef const char *(*FN_GETPLAYERAUTHID)(edict_t *e);
typedef void (*FN_DELTAADDENCODER) ( char *name, void (*conditionalencode)( struct delta_s *pFields, const unsigned char *from, const unsigned char *to ) ); typedef sequenceEntry_s *(*FN_SEQUENCEGET)(const char *fileName, const char *entryName);
typedef int (*FN_GETCURRENTPLAYER) ( void ); typedef sentenceEntry_s *(*FN_SEQUENCEPICKSENTENCE)(const char *groupName, int pickMethod, int *picked);
typedef int (*FN_CANSKIPPLAYER) ( const edict_t *player ); typedef int (*FN_GETFILESIZE)(char *filename);
typedef int (*FN_DELTAFINDFIELD) ( struct delta_s *pFields, const char *fieldname ); typedef unsigned int (*FN_GETAPPROXWAVEPLAYLEN)(const char *filepath);
typedef void (*FN_DELTASETFIELDBYINDEX) ( struct delta_s *pFields, int fieldNumber ); typedef int (*FN_ISCAREERMATCH)();
typedef void (*FN_DELTAUNSETFIELDBYINDEX) ( struct delta_s *pFields, int fieldNumber ); typedef int (*FN_GETLOCALIZEDSTRINGLENGTH)(const char *label);
typedef void (*FN_SETGROUPMASK) ( int mask, int op ); typedef void (*FN_REGISTERTUTORMESSAGESHOWN)(int mid);
typedef int (*FN_CREATEINSTANCEDBASELINE) ( int classname, struct entity_state_s *baseline ); typedef int (*FN_GETTIMESTUTORMESSAGESHOWN)(int mid);
typedef void (*FN_CVAR_DIRECTSET) ( struct cvar_s *var, const char *value ); typedef void (*FN_PROCESSTUTORMESSAGEDECAYBUFFER)(int *buffer, int bufferLength);
typedef void (*FN_FORCEUNMODIFIED) ( FORCE_TYPE type, float *mins, float *maxs, const char *filename ); typedef void (*FN_CONSTRUCTTUTORMESSAGEDECAYBUFFER)(int *buffer, int bufferLength);
typedef void (*FN_GETPLAYERSTATS) ( const edict_t *pClient, int *ping, int *packet_loss ); typedef void (*FN_RESETTUTORMESSAGEDECAYDATA)();
typedef void (*FN_ADDSERVERCOMMAND) ( char *cmd_name, void (*function) (void) ); typedef void (*FN_QUERYCLIENTCVARVALUE)(const edict_t *pEdict, const char *cvarName); // Use FN_QUERYCLIENTCVARVALUE2 instead
// Added in SDK 2.2:
typedef qboolean (*FN_VOICE_GETCLIENTLISTENING) (int iReceiver, int iSender);
typedef qboolean (*FN_VOICE_SETCLIENTLISTENING) (int iReceiver, int iSender, qboolean bListen);
// Added for HL 1109 (no SDK update):
typedef const char * (*FN_GETPLAYERAUTHID) (edict_t *e);
// Added 2003-11-10 (no SDK update):
typedef sequenceEntry_s * (*FN_SEQUENCEGET) (const char* fileName, const char* entryName);
typedef sentenceEntry_s * (*FN_SEQUENCEPICKSENTENCE) (const char* groupName, int pickMethod, int *picked);
typedef int (*FN_GETFILESIZE) (char *filename);
typedef unsigned int (*FN_GETAPPROXWAVEPLAYLEN) (const char *filepath);
typedef int (*FN_ISCAREERMATCH) (void);
typedef int (*FN_GETLOCALIZEDSTRINGLENGTH) (const char *label);
typedef void (*FN_REGISTERTUTORMESSAGESHOWN) (int mid);
typedef int (*FN_GETTIMESTUTORMESSAGESHOWN) (int mid);
typedef void (*FN_PROCESSTUTORMESSAGEDECAYBUFFER) (int *buffer, int bufferLength);
typedef void (*FN_CONSTRUCTTUTORMESSAGEDECAYBUFFER) (int *buffer, int bufferLength);
typedef void (*FN_RESETTUTORMESSAGEDECAYDATA) (void);
//Added 2005-08-11 (no SDK update)
typedef void (*FN_QUERYCLIENTCVARVALUE)(const edict_t *pEdict, const char *cvarName); //! Obsolete! Use FN_QUERYCLIENTCVARVALUE2 instead
//Added 2005-11-22 (no SDK update)
typedef void (*FN_QUERYCLIENTCVARVALUE2)(const edict_t *pEdict, const char *cvarName, int requestID); typedef void (*FN_QUERYCLIENTCVARVALUE2)(const edict_t *pEdict, const char *cvarName, int requestID);
//Added 2009-06-17 (no SDK update)
typedef int (*FN_CHECKPARM)(const char *pchCmdLineToken, char **ppnext); typedef int (*FN_CHECKPARM)(const char *pchCmdLineToken, char **ppnext);
#endif /* ENGINE_API_H */

View File

@ -1,54 +1,15 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// engine_t.h - The engine_t type
/*
* Copyright (c) 2001-2006 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef MM_ENGINE_T_H
#define MM_ENGINE_T_H
#include "eiface.h" // engfuncs_t, globalvars_t #include "eiface.h" // engfuncs_t, globalvars_t
// Our structure for storing engine references. // Our structure for storing engine references.
struct engine_t { struct engine_t
engine_t() : funcs(NULL), globals(NULL), pl_funcs(NULL) {} {
engine_t() : funcs(nullptr), globals(nullptr), pl_funcs(nullptr) {}
enginefuncs_t *funcs; // engine funcs enginefuncs_t *funcs; // engine funcs
globalvars_t *globals; // engine globals globalvars_t *globals; // engine globals
enginefuncs_t *pl_funcs; // "modified" eng funcs we give to plugins enginefuncs_t *pl_funcs; // "modified" eng funcs we give to plugins
}; };
extern engine_t g_engine; extern engine_t g_engine;
#endif /* MM_ENGINE_T_H */

View File

@ -1,41 +1,4 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// enginecallbacks.h - wrapper for <enginecallback.h>
/*
* Copyright (c) 2001-2006 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef MM_ENGINECALLBACKS_H
#define MM_ENGINECALLBACKS_H
// This file is a wrapper around the SDK's enginecallback.h file. We need // This file is a wrapper around the SDK's enginecallback.h file. We need
// this because we use a different type for the global object g_engfuncs, // this because we use a different type for the global object g_engfuncs,
@ -48,31 +11,26 @@
// when compiling Metamod proper. // when compiling Metamod proper.
#ifdef METAMOD_CORE #ifdef METAMOD_CORE
# include "meta_eiface.h" // HL_enginefuncs_t #include "meta_eiface.h" // HL_enginefuncs_t
// Use a #define to bend the enginefuncs_t type to our HL_enginefuncs_t // Use a #define to bend the enginefuncs_t type to our HL_enginefuncs_t
// type instead as we now use that for the global object g_engfuncs. // type instead as we now use that for the global object g_engfuncs.
# define enginefuncs_t HL_enginefuncs_t #define enginefuncs_t HL_enginefuncs_t
#endif /* METAMOD_CORE */ #endif
#include <enginecallback.h> // ALERT, etc #include <enginecallback.h> // ALERT, etc
#ifdef METAMOD_CORE #ifdef METAMOD_CORE
# undef enginefuncs_t #undef enginefuncs_t
#endif /* METAMOD_CORE */ #endif
// Also, create some additional macros for engine callback functions, which // Also, create some additional macros for engine callback functions, which
// weren't in SDK dlls/enginecallbacks.h but probably should have been. // weren't in SDK dlls/enginecallbacks.h but probably should have been.
#define GET_INFOKEYBUFFER (*g_engfuncs.pfnGetInfoKeyBuffer)
#define GET_INFOKEYBUFFER (*g_engfuncs.pfnGetInfoKeyBuffer) #define INFOKEY_VALUE (*g_engfuncs.pfnInfoKeyValue)
#define INFOKEY_VALUE (*g_engfuncs.pfnInfoKeyValue) #define SET_CLIENT_KEYVALUE (*g_engfuncs.pfnSetClientKeyValue)
#define SET_CLIENT_KEYVALUE (*g_engfuncs.pfnSetClientKeyValue) #define REG_SVR_COMMAND (*g_engfuncs.pfnAddServerCommand)
#define REG_SVR_COMMAND (*g_engfuncs.pfnAddServerCommand) #define SERVER_PRINT (*g_engfuncs.pfnServerPrint)
#define SERVER_PRINT (*g_engfuncs.pfnServerPrint) #define SET_SERVER_KEYVALUE (*g_engfuncs.pfnSetKeyValue)
#define SET_SERVER_KEYVALUE (*g_engfuncs.pfnSetKeyValue) #define QUERY_CLIENT_CVAR_VALUE (*g_engfuncs.pfnQueryClientCvarValue)
#define QUERY_CLIENT_CVAR_VALUE (*g_engfuncs.pfnQueryClientCvarValue)
#define QUERY_CLIENT_CVAR_VALUE2 (*g_engfuncs.pfnQueryClientCvarValue2) #define QUERY_CLIENT_CVAR_VALUE2 (*g_engfuncs.pfnQueryClientCvarValue2)
#endif /* MM_ENGINECALLBACKS_H */

View File

@ -1,109 +1,81 @@
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// game_support.cpp - info to recognize different HL mod "games"
/*
* Copyright (c) 2001-2013 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#include "precompiled.h" #include "precompiled.h"
// Adapted from adminmod h_export.cpp: // Adapted from adminmod h_export.cpp:
//! this structure contains a list of supported mods and their dlls names //! this structure contains a list of supported mods and their dlls names
//! To add support for another mod add an entry here, and add all the //! To add support for another mod add an entry here, and add all the
//! exported entities to link_func.cpp //! exported entities to link_func.cpp
game_modlist_t known_games = { const game_modinfo_t known_games[] = {
// name/gamedir linux_so win_dll osx_dylib desc // name/gamedir linux_so win_dll desc
// //
// Previously enumerated in this sourcefile, the list is now kept in a // Previously enumerated in this sourcefile, the list is now kept in a
// separate file, generated based on game information stored in a // separate file, generated based on game information stored in a
// convenient db. // convenient db.
// { "cstrike", "cs.so", "mp.dll", "Counter-Strike" },
#include "games.h" { "czero", "cs.so", "mp.dll", "Counter-Strike:Condition Zero" },
// End of list terminator: // End of list terminator:
{NULL, NULL, NULL, NULL, NULL} { NULL, NULL, NULL, NULL }
}; };
// Find a modinfo corresponding to the given game name. // Find a modinfo corresponding to the given game name.
game_modinfo_t* lookup_game(const char* name) inline const game_modinfo_t *lookup_game(const char *name)
{ {
for (int i = 0; known_games[i].name; i++) { for (auto& known : known_games)
auto imod = &known_games[i]; {
if (strcasematch(imod->name, name)) if (known.name && Q_stricmp(known.name, name))
return imod; return &known;
} }
// no match found // no match found
return NULL; return nullptr;
} }
mBOOL install_gamedll(char* from, const char* to) // Installs gamedll from Steam cache
mBOOL install_gamedll(char *from, const char *to)
{ {
int length_in; int length_in;
int length_out; int length_out;
if (NULL == from) return mFALSE; if (!from)
if (NULL == to) to = from; return mFALSE;
byte* cachefile = LOAD_FILE_FOR_ME(from, &length_in); if (!to)
to = from;
byte *cachefile = LOAD_FILE_FOR_ME(from, &length_in);
// If the file seems to exist in the cache. // If the file seems to exist in the cache.
if (NULL != cachefile) { if (cachefile)
{
int fd = open(to, O_WRONLY | O_CREAT | O_EXCL | O_BINARY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); int fd = open(to, O_WRONLY | O_CREAT | O_EXCL | O_BINARY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
if (fd < 0) { if (fd < 0)
META_DEBUG(3, ("Installing gamedll from cache: Failed to create file %s: %s\n", to, strerror(errno)) ); {
META_DEBUG(3, ("Installing gamedll from cache: Failed to create file %s: %s", to, strerror(errno)) );
FREE_FILE(cachefile); FREE_FILE(cachefile);
return mFALSE; return mFALSE;
} }
length_out = write(fd, cachefile, length_in); length_out = Q_write(fd, cachefile, length_in);
FREE_FILE(cachefile); FREE_FILE(cachefile);
close(fd); close(fd);
// Writing the file was not successfull // Writing the file was not successfull
if (length_out != length_in) { if (length_out != length_in)
META_DEBUG(3,("Installing gamedll from cache: Failed to write all %d bytes to file, only %d written: %s\n", {
length_in, length_out, strerror(errno)) ); META_DEBUG(3, ("Installing gamedll from chache: Failed to write all %d bytes to file, only %d written: %s", length_in, length_out, strerror(errno)));
// Let's not leave a mess but clean up nicely. // Let's not leave a mess but clean up nicely.
if (length_out >= 0) _unlink(to); if (length_out >= 0)
_unlink(to);
return mFALSE; return mFALSE;
} }
META_LOG("Installed gamedll %s from cache.\n", to); META_LOG("Installed gamedll %s from cache.", to);
} }
else { else
META_DEBUG(3, ("Failed to install gamedll from cache: file %s not found in cache.\n", from) ); {
META_DEBUG(3, ("Failed to install gamedll from cache: file %s not found in cache.", from));
return mFALSE; return mFALSE;
} }
@ -116,162 +88,58 @@ mBOOL install_gamedll(char* from, const char* to)
// //
// meta_errno values: // meta_errno values:
// - ME_NOTFOUND couldn't recognize game // - ME_NOTFOUND couldn't recognize game
mBOOL setup_gamedll(gamedll_t* gamedll) mBOOL setup_gamedll(gamedll_t *gamedll)
{ {
static char override_desc_buf[256]; const game_modinfo_t *known;
game_modinfo_t* known; const char *knownfn = nullptr;
const char* cp;
const char* knownfn = 0;
const char* usedfn = 0;
char* strippedfn = 0;
bool override = false;
// Check for old-style "metagame.ini" file and complain. // Check for old-style "metagame.ini" file and complain.
if (valid_gamedir_file(OLD_GAMEDLL_TXT)) if (valid_gamedir_file(OLD_GAMEDLL_TXT))
META_ERROR("File '%s' is no longer supported; instead, specify override gamedll in %s or with '+localinfo mm_gamedll <dllfile>'", OLD_GAMEDLL_TXT, CONFIG_INI); {
META_WARNING("File '%s' is no longer supported; instead, specify override gamedll in %s or with '+localinfo mm_gamedll <dllfile>'", OLD_GAMEDLL_TXT, CONFIG_INI);
}
// First, look for a known game, based on gamedir. // First, look for a known game, based on gamedir.
if ((known = lookup_game(gamedll->name))) { if ((known = lookup_game(gamedll->name)))
{
#ifdef _WIN32 #ifdef _WIN32
knownfn = _strdup(known->win_dll); knownfn = known->win_dll;
#elif defined(linux)
knownfn=_strdup(known->linux_so);
#elif defined(__APPLE__)
knownfn=_strdup(known->osx_dylib);
#else #else
#error "OS unrecognized" knownfn = known->linux_so;
#endif /* _WIN32 */ #endif
}
// Neither override nor auto-detect found a gamedll. META_DEBUG(4, ("Checking for old version game DLL name '%s'.\n", knownfn));
if (!known && !g_config->gamedll) Q_snprintf(gamedll->pathname, sizeof(gamedll->pathname), "dlls/%s", knownfn);
RETURN_ERRNO(mFALSE, ME_NOTFOUND);
// Use override-dll if specified. // Check if the gamedll file exists. If not, try to install it from the cache.
if (g_config->gamedll) { if (!valid_gamedir_file(gamedll->pathname))
strncpy(gamedll->pathname, g_config->gamedll, sizeof gamedll->pathname - 1); {
gamedll->pathname[sizeof gamedll->pathname - 1] = '\0'; Q_snprintf(gamedll->real_pathname, sizeof(gamedll->real_pathname), "%s/dlls/%s", gamedll->gamedir, knownfn);
override = true; install_gamedll(gamedll->pathname, gamedll->real_pathname);
// If the path is relative, the gamedll file will be missing and
// it might be found in the cache file.
if (!is_absolute_path(gamedll->pathname)) {
// I abuse the real_pathname member here to pass a full pathname to
// the install_gamedll function. I am somewhat opposed to be pushing
// another MAX_PATH sized array on the stack, that's why.
snprintf(gamedll->real_pathname, sizeof(gamedll->real_pathname), "%s/%s", gamedll->gamedir, gamedll->pathname);
// If we could successfully install the gamedll from the cache we
// rectify the pathname to be a full pathname.
if (install_gamedll(gamedll->pathname, gamedll->real_pathname)) {
strncpy(gamedll->pathname, gamedll->real_pathname, sizeof gamedll->pathname - 1);
gamedll->pathname[sizeof gamedll->pathname - 1] = '\0';
}
} }
} }
// Else use Auto-detect dll. else
else { {
#ifdef linux // Neither known-list found a gamedll.
// The engine changed game dll lookup behaviour in that it strips RETURN_ERRNO(mFALSE, ME_NOTFOUND);
// anything after the last '_' from the name and tries to load the
// resulting name. The DSO names were changed and do not have the
// '_i386' part in them anymore, so cs_i386.so became cs.so. We
// have to adapt to that and try to load the DSO name without the
// '_*' part first, to see if we have a new version file available.
strippedfn = _strdup(knownfn);
char *loc = strrchr(strippedfn, '_');
// A small safety net here: make sure that we are dealing with
// a file name at least four characters long and ending in
// '.so'. This way we can be sure that we can safely overwrite
// anything from the '_' on with '.so'.
int size = 0;
const char *ext;
if(0 != loc) {
size = strlen(strippedfn);
ext = strippedfn + (size - 3);
}
if(0 != loc && size > 3 && 0 == _stricmp(ext, ".so")) {
strcpy(loc, ".so");
META_DEBUG(4, ("Checking for new version game DLL name '%s'.\n", strippedfn) );
// Again, as above, I abuse the real_pathname member to store the full pathname
// and the pathname member to store the relative name to pass it to the
// install_gamedll function to save stack space. They are going
// to get overwritten later on, so that's ok.
snprintf(gamedll->pathname, sizeof(gamedll->pathname), "dlls/%s",
strippedfn);
// Check if the gamedll file exists. If not, try to install it from
// the cache.
mBOOL ok = mTRUE;
if(!valid_gamedir_file(gamedll->pathname)) {
snprintf(gamedll->real_pathname, sizeof(gamedll->real_pathname), "%s/dlls/%s",
gamedll->gamedir, strippedfn);
ok = install_gamedll(gamedll->pathname, gamedll->real_pathname);
}
if(ok) usedfn = strippedfn;
}
else {
META_DEBUG(4, ("Known game DLL name does not qualify for checking for a stripped version, skipping: '%s'.\n",
strippedfn) );
}
#endif /* linux */
// If no file to be used was found, try the old known DLL file
// name.
if (0 == usedfn) {
META_DEBUG(4, ("Checking for old version game DLL name '%s'.\n", knownfn) );
snprintf(gamedll->pathname, sizeof(gamedll->pathname), "dlls/%s", knownfn);
// Check if the gamedll file exists. If not, try to install it from
// the cache.
if (!valid_gamedir_file(gamedll->pathname)) {
snprintf(gamedll->real_pathname, sizeof(gamedll->real_pathname), "%s/dlls/%s",
gamedll->gamedir, knownfn);
install_gamedll(gamedll->pathname, gamedll->real_pathname);
}
usedfn = knownfn;
}
// Now make an absolute path
snprintf(gamedll->pathname, sizeof(gamedll->pathname), "%s/dlls/%s",
gamedll->gamedir, usedfn);
} }
Q_snprintf(gamedll->pathname, sizeof(gamedll->pathname), "%s/dlls/%s", gamedll->gamedir, knownfn);
// get filename from pathname // get filename from pathname
cp = strrchr(gamedll->pathname, '/'); char *cp = Q_strrchr(gamedll->pathname, '/');
if (cp) cp++; if (cp)
else cp = gamedll->pathname; cp++;
else
cp = gamedll->pathname;
gamedll->file = cp; gamedll->file = cp;
// If found, store also the supposed "real" dll path based on the Q_strncpy(gamedll->real_pathname, gamedll->pathname, sizeof(gamedll->real_pathname) - 1);
// gamedir, in case it differs from the "override" dll path. gamedll->real_pathname[sizeof(gamedll->real_pathname) - 1] = '\0';
if (known && override)
snprintf(gamedll->real_pathname, sizeof(gamedll->real_pathname),
"%s/dlls/%s", gamedll->gamedir, usedfn);
else { // !known or !override
strncpy(gamedll->real_pathname, gamedll->pathname, sizeof gamedll->real_pathname - 1);
gamedll->real_pathname[sizeof gamedll->pathname - 1] = '\0';
}
if (override) { gamedll->desc = known->desc;
// generate a desc META_LOG("Recognized game '%s'; using dllfile '%s'", gamedll->name, gamedll->file);
snprintf(override_desc_buf, sizeof(override_desc_buf),
"%s (override)", gamedll->file);
gamedll->desc = override_desc_buf;
// log result
META_LOG("Overriding game '%s' with dllfile '%s'", gamedll->name,
gamedll->file);
}
else {
gamedll->desc = known->desc;
META_LOG("Recognized game '%s'; using dllfile '%s'", gamedll->name,
gamedll->file);
}
if (0 != strippedfn) free(strippedfn); return mTRUE;
return (mTRUE);
} }

View File

@ -1,56 +1,16 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// game_support.h - structures for supporting different HL mod "games" #include "types_meta.h"
#include "metamod.h"
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef GAME_SUPPORT_H
#define GAME_SUPPORT_H
#include "types_meta.h" // mBOOL
#include "metamod.h" // gamedll_t
// Information we have about each game/mod DLL. // Information we have about each game/mod DLL.
typedef struct game_modinfo_s { struct game_modinfo_t
const char *name; // name (the game dir) {
const char *name; // name (the game dir)
const char *linux_so; // filename of linux shared lib const char *linux_so; // filename of linux shared lib
const char *win_dll; // filename of win32 dll const char *win_dll; // filename of win32 dll
const char *osx_dylib; // filename os osx dylib const char *osx_dylib; // filename os osx dylib
const char *desc; // our long-name description const char *desc; // our long-name description
} game_modinfo_t; };
typedef game_modinfo_t game_modlist_t[];
game_modinfo_t *lookup_game(const char *name);
mBOOL setup_gamedll(gamedll_t *gamedll); mBOOL setup_gamedll(gamedll_t *gamedll);
#endif /* GAME_SUPPORT_H */

View File

@ -1,131 +0,0 @@
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// games.h - list of supported game mods and their data
/*
* Copyright (c) 2001-2008 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
// This list is now kept in a separate file to facilitate generating the
// list from game data stored in a convenient db.
#ifdef __amd64__
# define MODARCH "_amd64"
#else
# define MODARCH "_i386"
#endif
{"action", "ahl"MODARCH".so", "ahl.dll", "none", "Action Half-Life"},
{"ag", "ag"MODARCH".so", "ag.dll", "none", "Adrenaline Gamer Steam"},
{"ag3", "hl"MODARCH".so", "hl.dll", "none", "Adrenalinegamer 3.x"},
{"aghl", "ag"MODARCH".so", "ag.dll", "none", "Adrenalinegamer 4.x"},
{"arg", "arg"MODARCH".so", "hl.dll", "none", "Arg!"},
{"asheep", "hl"MODARCH".so", "hl.dll", "none", "Azure Sheep"},
{"bg", "bg"MODARCH".so", "bg.dll", "none", "The Battle Grounds"},
{"bot", "bot"MODARCH".so", "bot.dll", "none", "Bot"},
{"brainbread", "bb"MODARCH".so", "bb.dll", "none", "Brain Bread"},
{"bumpercars", "hl"MODARCH".so", "hl.dll", "none", "Bumper Cars"},
{"buzzybots", "bb"MODARCH".so", "bb.dll", "none", "BuzzyBots"},
{"cs13", "cs"MODARCH".so", "mp.dll", "none", "Counter-Strike 1.3"},
{"cstrike", "cs"MODARCH".so", "mp.dll", "cs.dylib", "Counter-Strike"},
{"csv15", "cs"MODARCH".so", "mp.dll", "none", "CS 1.5 for Steam"},
{"czero", "cs"MODARCH".so", "mp.dll", "cs.dylib", "Counter-Strike:Condition Zero"},
{"dcrisis", "dc"MODARCH".so", "dc.dll", "none", "Desert Crisis"},
{"dmc", "dmc"MODARCH".so", "dmc.dll", "dmc.dylib", "Deathmatch Classic"},
{"dod", "dod"MODARCH".so", "dod.dll", "dod.dylib", "Day of Defeat"},
{"dpb", "pb.i386.so", "pb.dll", "none", "Digital Paintball"},
{"dragonmodz", "hl"MODARCH".so", "mp.dll", "none", "Dragon Mod Z"},
{"esf", "hl"MODARCH".so", "hl.dll", "none", "Earth's Special Forces"},
{"existence", "ex"MODARCH".so", "existence.dll", "none", "Existence"},
{"firearms", "fa"MODARCH".so", "firearms.dll", "none", "Firearms"},
{"firearms25", "fa"MODARCH".so", "firearms.dll", "none", "Retro Firearms"},
{"freeze", "mp"MODARCH".so", "mp.dll", "none", "Freeze"},
{"frontline", "front"MODARCH".so", "frontline.dll", "none", "Frontline Force"},
{"gangstawars", "gangsta"MODARCH".so", "gwars27.dll", "none", "Gangsta Wars"},
{"gangwars", "mp"MODARCH".so", "mp.dll", "none", "Gangwars"},
{"gearbox", "opfor"MODARCH".so", "opfor.dll", "opfor.dylib", "Opposing Force"},
{"globalwarfare", "gw"MODARCH".so", "mp.dll", "none", "Global Warfare"},
{"goldeneye", "golden"MODARCH".so", "mp.dll", "none", "Goldeneye"},
{"hl15we", "hl"MODARCH".so", "hl.dll", "none", "Half-Life 1.5: Weapon Edition"},
{"hlrally", "hlr"MODARCH".so", "hlrally.dll", "none", "HL-Rally"},
{"holywars", "hl"MODARCH".so", "holywars.dll", "none", "Holy Wars"},
{"hostileintent", "hl"MODARCH".so", "hl.dll", "none", "Hostile Intent"},
{"ios", "ios"MODARCH".so", "ios.dll", "none", "International Online Soccer"},
{"judgedm", "judge"MODARCH".so", "mp.dll", "none", "Judgement"},
{"kanonball", "hl"MODARCH".so", "kanonball.dll", "none", "Kanonball"},
{"monkeystrike", "ms"MODARCH".so", "monkey.dll", "none", "Monkeystrike"},
{"MorbidPR", "morbid"MODARCH".so", "morbid.dll", "none", "Morbid Inclination"},
{"movein", "hl"MODARCH".so", "hl.dll", "none", "Move In!"},
{"ns", "ns"MODARCH".so", "ns.dll", "none", "Natural Selection"},
{"nsp", "ns"MODARCH".so", "ns.dll", "none", "Natural Selection Beta"},
{"oel", "hl"MODARCH".so", "hl.dll", "none", "OeL Half-Life"},
{"og", "og"MODARCH".so", "og.dll", "none", "Over Ground"},
{"ol", "ol"MODARCH".so", "hl.dll", "none", "Outlawsmod"},
{"ops1942", "spirit"MODARCH".so", "spirit.dll", "none", "Operations 1942"},
{"osjb", "osjb"MODARCH".so", "jail.dll", "none", "Open-Source Jailbreak"},
{"outbreak", "none", "hl.dll", "none", "Out Break"},
{"oz", "mp"MODARCH".so", "mp.dll", "none", "Oz Deathmatch"},
{"paintball", "pb"MODARCH".so", "mp.dll", "none", "Paintball"},
{"penemy", "pe"MODARCH".so", "pe.dll", "none", "Public Enemy"},
{"phineas", "phineas"MODARCH".so", "phineas.dll", "none", "Phineas Bot"},
{"ponreturn", "ponr"MODARCH".so", "mp.dll", "none", "Point of No Return"},
{"pvk", "hl"MODARCH".so", "hl.dll", "none", "Pirates, Vikings and Knights"},
{"rc2", "rc2"MODARCH".so", "rc2.dll", "none", "Rocket Crowbar 2"},
{"retrocs", "rcs"MODARCH".so", "rcs.dll", "none", "Retro Counter-Strike"},
{"rewolf", "hl"MODARCH".so", "gunman.dll", "none", "Gunman Chronicles"},
{"ricochet", "ricochet"MODARCH".so", "mp.dll", "ricochet.dylib", "Ricochet"},
{"rockcrowbar", "rc"MODARCH".so", "rc.dll", "none", "Rocket Crowbar"},
{"rspecies", "hl"MODARCH".so", "hl.dll", "none", "Rival Species"},
{"scihunt", "shunt.so", "shunt.dll", "none", "Scientist Hunt"},
{"sdmmod", "sdmmod"MODARCH".so", "sdmmod.dll", "none", "Special Death Match"},
{"Ship", "ship"MODARCH".so", "ship.dll", "none", "The Ship"},
{"si", "si"MODARCH".so", "si.dll", "none", "Science & Industry"},
{"snow", "snow"MODARCH".so", "snow.dll", "none", "Snow-War"},
{"stargatetc", "hl"MODARCH".so", "hl.dll", "none", "StargateTC"},
{"svencoop", "hl"MODARCH".so", "hl.dll", "none", "Sven Coop"},
{"swarm", "swarm"MODARCH".so", "swarm.dll", "none", "Swarm"},
{"tfc", "tfc"MODARCH".so", "tfc.dll", "tfc.dylib", "Team Fortress Classic"},
{"thewastes", "thewastes"MODARCH".so", "thewastes.dll", "none", "The Wastes"},
{"timeless", "pt"MODARCH".so", "timeless.dll", "none", "Project Timeless"},
{"tod", "hl"MODARCH".so", "hl.dll", "none", "Tour of Duty"},
{"trainhunters", "th"MODARCH".so", "th.dll", "none", "Train Hunters"},
{"trevenge", "trevenge.so", "trevenge.dll", "none", "The Terrorist Revenge"},
{"TS", "ts"MODARCH".so", "mp.dll", "none", "The Specialists"},
{"tt", "tt"MODARCH".so", "tt.dll", "none", "The Trenches"},
{"underworld", "uw"MODARCH".so", "uw.dll", "none", "Underworld Bloodline"},
{"valve", "hl"MODARCH".so", "hl.dll", "hl.dylib", "Half-Life Deathmatch"},
{"vs", "vs"MODARCH".so", "mp.dll", "none", "VampireSlayer"},
{"wantedhl", "hl"MODARCH".so", "wanted.dll", "none", "Wanted!"},
{"wasteland", "whl_linux.so", "mp.dll", "none", "Wasteland"},
{"weapon_wars", "ww"MODARCH".so", "hl.dll", "none", "Weapon Wars"},
{"wizwars", "mp"MODARCH".so", "hl.dll", "none", "Wizard Wars"},
{"wormshl", "wormshl_i586.so", "wormshl.dll", "none", "WormsHL"},
{"zp", "none", "mp.dll", "none", "Zombie Panic"},

View File

@ -1,37 +1,5 @@
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// h_export.cpp - main exported DLL functionality
// From SDK dlls/h_export.cpp:
/***
*
* Copyright (c) 1999, 2000 Valve LLC. All rights reserved.
*
* This product contains software technology licensed from Id
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
* All Rights Reserved.
*
* Use, distribution, and modification of this source code and/or resulting
* object code is restricted to non-commercial enhancements to products from
* Valve LLC. All other use, distribution, or modification is prohibited
* without written permission from Valve LLC.
*
****/
/*
===== h_export.cpp ========================================================
Entity classes exported by Halflife.
*/
#include "precompiled.h" #include "precompiled.h"
// From SDK dlls/h_export.cpp:
#ifdef _WIN32 #ifdef _WIN32
//! Required DLL entry point //! Required DLL entry point
// The above SDK comment indicates this routine is required, but the MSDN // The above SDK comment indicates this routine is required, but the MSDN
@ -39,10 +7,12 @@
// completeness. // completeness.
BOOL WINAPI DllMain(HINSTANCE /* hinstDLL */, DWORD fdwReason, LPVOID /* lpvReserved */) BOOL WINAPI DllMain(HINSTANCE /* hinstDLL */, DWORD fdwReason, LPVOID /* lpvReserved */)
{ {
if (fdwReason == DLL_PROCESS_ATTACH) { if (fdwReason == DLL_PROCESS_ATTACH)
{
/* nothing */ /* nothing */
} }
else if (fdwReason == DLL_PROCESS_DETACH) { else if (fdwReason == DLL_PROCESS_DETACH)
{
/* nothing */ /* nothing */
} }
return TRUE; return TRUE;
@ -53,11 +23,13 @@ BOOL WINAPI DllMain(HINSTANCE /* hinstDLL */, DWORD fdwReason, LPVOID /* lpvRese
// just in case we come across a need to do something at dll load or // just in case we come across a need to do something at dll load or
// unload. // unload.
// NOTE: These aren't actually called. Needs investigation. // NOTE: These aren't actually called. Needs investigation.
void _init(void) { void _init()
// called before dlopen() returns {
// called before dlopen() returns
} }
void _fini(void) { void _fini()
// called before dlclose() returns {
// called before dlclose() returns
} }
#endif #endif
@ -71,7 +43,7 @@ engine_t g_engine;
// This appears to be the _first_ DLL routine called by the engine, so this // This appears to be the _first_ DLL routine called by the engine, so this
// is where we hook to load all the other DLLs (game, plugins, etc), which // is where we hook to load all the other DLLs (game, plugins, etc), which
// is actually all done in meta_startup(). // is actually all done in meta_startup().
void WINAPI GiveFnptrsToDll(enginefuncs_t* pengfuncsFromEngine, globalvars_t* pGlobals) void WINAPI GiveFnptrsToDll(enginefuncs_t *pengfuncsFromEngine, globalvars_t *pGlobals)
{ {
gpGlobals = pGlobals; gpGlobals = pGlobals;
g_engine.funcs = &g_engfuncs; g_engine.funcs = &g_engfuncs;
@ -94,22 +66,22 @@ extern "C" void __cxa_pure_virtual(void)
void *operator new(size_t size) void *operator new(size_t size)
{ {
return malloc(size); return Q_malloc(size);
} }
void *operator new[](size_t size) void *operator new[](size_t size)
{ {
return malloc(size); return Q_malloc(size);
} }
void operator delete(void *ptr) void operator delete(void *ptr)
{ {
free(ptr); Q_free(ptr);
} }
void operator delete[](void * ptr) void operator delete[](void * ptr)
{ {
free(ptr); Q_free(ptr);
} }
#endif #endif

View File

@ -1,49 +1,7 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// h_export.h - prototypes for h_export.cpp
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef H_EXPORT_H
#define H_EXPORT_H
#include "osdep.h" // DLLEXPORT, WINAPI, etc #include "osdep.h" // DLLEXPORT, WINAPI, etc
// Our GiveFnptrsToDll, called by engine. // Our GiveFnptrsToDll, called by engine.
typedef void (WINAPI *GIVE_ENGINE_FUNCTIONS_FN) (enginefuncs_t typedef void (WINAPI *GIVE_ENGINE_FUNCTIONS_FN)(enginefuncs_t *pengfuncsFromEngine, globalvars_t *pGlobals);
*pengfuncsFromEngine, globalvars_t *pGlobals); C_DLLEXPORT void WINAPI GiveFnptrsToDll(enginefuncs_t *pengfuncsFromEngine, globalvars_t *pGlobals);
C_DLLEXPORT void WINAPI GiveFnptrsToDll(enginefuncs_t *pengfuncsFromEngine,
globalvars_t *pGlobals);
#endif /* H_EXPORT_H */

View File

@ -1,54 +0,0 @@
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// info_name.h - name, desc, author, etc
/*
* Copyright (c) 2001-2013 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game Engine ("HL
* Engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef INFO_NAME_H
#define INFO_NAME_H
#define VNAME "Metamod"
#define VAUTHOR "Will Day <willday@metamod.org>"
#define VURL "http://www.metamod.org/"
#define COPYRIGHT_YEAR "2013"
// Various strings for the Windows DLL Resources in res_meta.rc
#define RC_COMMENTS "Metamod allows running multiple mod-like plugin DLLs, to add functionality or change the behavior of the running HLDS game mod. See " VURL
#define RC_DESC "Metamod Half-Life MOD DLL"
#define RC_FILENAME "METAMOD.DLL"
#define RC_INTERNAL "METAMOD"
#define RC_COPYRIGHT "Copyright© 2001-" COPYRIGHT_YEAR " Will Day; GPL licensed"
#define RC_LICENSE "Licensed under the GNU General Public License"
#endif /* INFO_NAME_H */

View File

@ -1,59 +1,29 @@
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// linkent.cpp - export entities from mod "games" back to the HL engine
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#include "precompiled.h" #include "precompiled.h"
// Function to perform common code of LINK_ENTITY_TO_GAME, rather than // Function to perform common code of LINK_ENTITY_TO_GAME, rather than
// duplicating the code in ~2000 expanded macros. Based on code from Jussi // duplicating the code in ~2000 expanded macros. Based on code from Jussi
// Kivilinna <kijuhe00@students.oamk.fi>. // Kivilinna <kijuhe00@students.oamk.fi>.
void do_link_ent(ENTITY_FN *pfnEntity, int *missing, const char *entStr, entvars_t *pev) void do_link_ent(ENTITY_FN *pfnEntity, int *missing, const char *entStr, entvars_t *pev)
{; {
if(*missing) { if (*missing)
{
META_DEBUG(9, ("Skipping entity '%s'; was previously found missing", entStr)); META_DEBUG(9, ("Skipping entity '%s'; was previously found missing", entStr));
return; return;
} }
if(!*pfnEntity) {
if (!*pfnEntity)
{
META_DEBUG(9, ("Looking up game entity '%s'", entStr)); META_DEBUG(9, ("Looking up game entity '%s'", entStr));
*pfnEntity = (ENTITY_FN) DLSYM(GameDLL.handle, entStr); *pfnEntity = (ENTITY_FN)DLSYM(GameDLL.handle, entStr);
} }
if(!*pfnEntity) {
if (!*pfnEntity)
{
META_ERROR("Couldn't find game entity '%s' in game DLL '%s': %s", entStr, GameDLL.name, DLERROR()); META_ERROR("Couldn't find game entity '%s' in game DLL '%s': %s", entStr, GameDLL.name, DLERROR());
*missing=1; *missing = 1;
return; return;
} }
META_DEBUG(8, ("Linking game entity '%s'", entStr)); META_DEBUG(8, ("Linking game entity '%s'", entStr));
(*pfnEntity)(pev); (*pfnEntity)(pev);
} }

View File

@ -1,49 +1,4 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// linkent.h - export entities from mod "games" back to the HL engine
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef LINK_ENT_H
#define LINK_ENT_H
#include <extdll.h> // always
#include "osdep.h" // DLLEXPORT, etc
#include "metamod.h" // GameDLL, etc
#include "mlist.h" // MPluginList::find_match, etc
#include "mplugin.h" // MPlugin::info, etc
#include "log_meta.h" // META_DEBUG, etc
// Comments from SDK dlls/util.h: // Comments from SDK dlls/util.h:
//! This is the glue that hooks .MAP entity class names to our CPP classes. //! This is the glue that hooks .MAP entity class names to our CPP classes.
@ -51,18 +6,16 @@
//! The function is used to intialize / allocate the object for the entity. //! The function is used to intialize / allocate the object for the entity.
// Adapted from LINK_ENTITY_TO_FUNC in adminmod linkfunc.cpp. // Adapted from LINK_ENTITY_TO_FUNC in adminmod linkfunc.cpp.
typedef void (*ENTITY_FN)(entvars_t *);
typedef void (*ENTITY_FN) (entvars_t *);
// Function to perform common code of LINK_ENTITY_TO_GAME. // Function to perform common code of LINK_ENTITY_TO_GAME.
void do_link_ent(ENTITY_FN *pfnEntity, int *missing, const char *entStr, void do_link_ent(ENTITY_FN *pfnEntity, int *missing, const char *entStr, entvars_t *pev);
entvars_t *pev);
#define LINK_ENTITY_TO_GAME(entityName) \ #define LINK_ENTITY_TO_GAME(entityName) \
C_DLLEXPORT void entityName(entvars_t *pev); \ C_DLLEXPORT void entityName(entvars_t *pev); \
void entityName(entvars_t *pev) { \ void entityName(entvars_t *pev) { \
static ENTITY_FN pfnEntity = NULL; \ static ENTITY_FN pfnEntity = NULL; \
static int missing=0; \ static int missing = 0; \
do_link_ent(&pfnEntity, &missing, STRINGIZE(entityName, 0), pev); \ do_link_ent(&pfnEntity, &missing, STRINGIZE(entityName, 0), pev); \
} }
@ -83,33 +36,31 @@ void do_link_ent(ENTITY_FN *pfnEntity, int *missing, const char *entStr,
C_DLLEXPORT void entityName(entvars_t *pev); \ C_DLLEXPORT void entityName(entvars_t *pev); \
void entityName(entvars_t *pev) { \ void entityName(entvars_t *pev) { \
static ENTITY_FN pfnEntity = NULL; \ static ENTITY_FN pfnEntity = NULL; \
static int missing=0; \ static int missing = 0; \
const char *entStr; \ const char *entStr; \
MPlugin *findp; \ MPlugin *findp; \
entStr = STRINGIZE(entityName, 0); \ entStr = STRINGIZE(entityName, 0); \
if(missing) \ if (missing) \
return; \ return; \
if(!pfnEntity) { \ if (!pfnEntity) { \
if(!(findp=g_plugins->find_match(pluginName))) { \ if (!(findp = g_plugins->find_match(pluginName))) { \
META_ERROR("Couldn't find loaded plugin '%s' for plugin entity '%s'", pluginName, entStr); \ META_ERROR("Couldn't find loaded plugin '%s' for plugin entity '%s'", pluginName, entStr); \
missing=1; \ missing = 1; \
return; \ return; \
} \ } \
if(findp->info && findp->info->loadable != PT_STARTUP) { \ if (findp->info && findp->info->loadable != PT_STARTUP) { \
META_ERROR("Can't link entity '%s' for plugin '%s'; loadable != startup: %s", entStr, pluginName, findp->str_loadable()); \ META_ERROR("Can't link entity '%s' for plugin '%s'; loadable != startup: %s", entStr, pluginName, findp->str_loadable()); \
missing=1; \ missing = 1; \
return; \ return; \
} \ } \
META_DEBUG(9, ("Looking up plugin entity '%s'", entStr)); \ META_DEBUG(9, ("Looking up plugin entity '%s'", entStr)); \
pfnEntity = (ENTITY_FN) DLSYM(findp->handle, entStr); \ pfnEntity = (ENTITY_FN) DLSYM(findp->handle, entStr); \
} \ } \
if(!pfnEntity) { \ if (!pfnEntity) { \
META_ERROR("Couldn't find plugin entity '%s' in plugin DLL '%s'", entStr, findp->file); \ META_ERROR("Couldn't find plugin entity '%s' in plugin DLL '%s'", entStr, findp->file); \
missing=1; \ missing = 1; \
return; \ return; \
} \ } \
META_DEBUG(8, ("Linking plugin entity '%s'", entStr)); \ META_DEBUG(8, ("Linking plugin entity '%s'", entStr)); \
(*pfnEntity)(pev); \ (*pfnEntity)(pev); \
} }
#endif /* LINK_ENT_H */

View File

@ -1,39 +1,3 @@
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// linkgame.cpp - export entities from mod "games" back to the HL engine
/*
* Copyright (c) 2001-2013 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#include "precompiled.h" #include "precompiled.h"
// Entity list for gamedlls adapted from adminmod linkfunc.cpp. // Entity list for gamedlls adapted from adminmod linkfunc.cpp.

View File

@ -1,42 +1,6 @@
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// log_mega.cpp - logging routines
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#include "precompiled.h" #include "precompiled.h"
cvar_t meta_debug = {"meta_debug", "0", FCVAR_EXTDLL , 0, NULL}; cvar_t meta_debug = { "meta_debug", "0", FCVAR_EXTDLL , 0, nullptr };
enum MLOG_SERVICE enum MLOG_SERVICE
{ {
@ -46,17 +10,17 @@ enum MLOG_SERVICE
mlsCLIENT mlsCLIENT
}; };
static void buffered_ALERT(MLOG_SERVICE service, ALERT_TYPE atype, const char* prefix, const char* fmt, va_list ap); static void buffered_ALERT(MLOG_SERVICE service, ALERT_TYPE atype, const char *prefix, const char *fmt, va_list ap);
// Print to console. // Print to console.
void META_CONS(const char* fmt, ...) void META_CONS(const char *fmt, ...)
{ {
va_list ap; va_list ap;
char buf[MAX_LOGMSG_LEN]; char buf[MAX_LOGMSG_LEN];
unsigned int len; unsigned int len;
va_start(ap, fmt); va_start(ap, fmt);
len = vsnprintf(buf, sizeof(buf) - 1, fmt, ap); len = Q_vsnprintf(buf, sizeof(buf) - 1, fmt, ap);
va_end(ap); va_end(ap);
buf[len] = '\n'; buf[len] = '\n';
@ -65,9 +29,10 @@ void META_CONS(const char* fmt, ...)
SERVER_PRINT(buf); SERVER_PRINT(buf);
} }
void META_DEV(const char* fmt, ...) void META_DEV(const char *fmt, ...)
{ {
if (CVAR_GET_FLOAT && CVAR_GET_FLOAT("developer")) { if (CVAR_GET_FLOAT && CVAR_GET_FLOAT("developer"))
{
va_list ap; va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
buffered_ALERT(mlsDEV, at_logged, "[META] dev:", fmt, ap); buffered_ALERT(mlsDEV, at_logged, "[META] dev:", fmt, ap);
@ -75,7 +40,7 @@ void META_DEV(const char* fmt, ...)
} }
} }
void META_INFO(const char* fmt, ...) void META_INFO(const char *fmt, ...)
{ {
va_list ap; va_list ap;
@ -84,7 +49,7 @@ void META_INFO(const char* fmt, ...)
va_end(ap); va_end(ap);
} }
void META_WARNING(const char* fmt, ...) void META_WARNING(const char *fmt, ...)
{ {
va_list ap; va_list ap;
@ -93,7 +58,7 @@ void META_WARNING(const char* fmt, ...)
va_end(ap); va_end(ap);
} }
void META_ERROR(const char* fmt, ...) void META_ERROR(const char *fmt, ...)
{ {
va_list ap; va_list ap;
@ -102,7 +67,7 @@ void META_ERROR(const char* fmt, ...)
va_end(ap); va_end(ap);
} }
void META_LOG(const char* fmt, ...) void META_LOG(const char *fmt, ...)
{ {
va_list ap; va_list ap;
@ -112,14 +77,14 @@ void META_LOG(const char* fmt, ...)
} }
// Print to client. // Print to client.
void META_CLIENT(edict_t* pEntity, const char* fmt, ...) void META_CLIENT(edict_t *pEntity, const char *fmt, ...)
{ {
va_list ap; va_list ap;
char buf[MAX_CLIENTMSG_LEN]; char buf[MAX_CLIENTMSG_LEN];
unsigned int len; unsigned int len;
va_start(ap, fmt); va_start(ap, fmt);
len = vsnprintf(buf, sizeof(buf) - 1, fmt, ap); len = Q_vsnprintf(buf, sizeof(buf) - 1, fmt, ap);
va_end(ap); va_end(ap);
buf[len] = '\n'; buf[len] = '\n';
@ -132,28 +97,29 @@ struct BufferedMessage
{ {
MLOG_SERVICE service; MLOG_SERVICE service;
ALERT_TYPE atype; ALERT_TYPE atype;
const char* prefix; const char *prefix;
char buf[MAX_LOGMSG_LEN]; char buf[MAX_LOGMSG_LEN];
BufferedMessage* next; BufferedMessage *next;
}; };
static BufferedMessage* messageQueueStart = NULL; static BufferedMessage *messageQueueStart = nullptr;
static BufferedMessage* messageQueueEnd = NULL; static BufferedMessage *messageQueueEnd = nullptr;
void buffered_ALERT(MLOG_SERVICE service, ALERT_TYPE atype, const char* prefix, const char* fmt, va_list ap) void buffered_ALERT(MLOG_SERVICE service, ALERT_TYPE atype, const char *prefix, const char *fmt, va_list ap)
{ {
char buf[MAX_LOGMSG_LEN]; char buf[MAX_LOGMSG_LEN];
BufferedMessage* msg;
if (NULL != g_engfuncs.pfnAlertMessage) { if (g_engfuncs.pfnAlertMessage)
vsnprintf(buf, sizeof(buf), fmt, ap); {
Q_vsnprintf(buf, sizeof(buf), fmt, ap);
ALERT(atype, "%s %s\n", prefix, buf); ALERT(atype, "%s %s\n", prefix, buf);
return; return;
} }
// g_engine AlertMessage function not available. Buffer message. // g_engine AlertMessage function not available. Buffer message.
msg = new BufferedMessage; BufferedMessage *msg = new BufferedMessage;
if (NULL == msg) { if (!msg)
{
// though luck, gonna lose this message // though luck, gonna lose this message
return; return;
} }
@ -161,13 +127,15 @@ void buffered_ALERT(MLOG_SERVICE service, ALERT_TYPE atype, const char* prefix,
msg->service = service; msg->service = service;
msg->atype = atype; msg->atype = atype;
msg->prefix = prefix; msg->prefix = prefix;
vsnprintf(msg->buf, sizeof(buf), fmt, ap); Q_vsnprintf(msg->buf, sizeof(buf), fmt, ap);
msg->next = NULL; msg->next = nullptr;
if (NULL == messageQueueEnd) { if (!messageQueueEnd)
{
messageQueueStart = messageQueueEnd = msg; messageQueueStart = messageQueueEnd = msg;
} }
else { else
{
messageQueueEnd->next = msg; messageQueueEnd->next = msg;
messageQueueEnd = msg; messageQueueEnd = msg;
} }
@ -179,21 +147,23 @@ void buffered_ALERT(MLOG_SERVICE service, ALERT_TYPE atype, const char* prefix,
// jumptable is set. Don't call it if it isn't set. // jumptable is set. Don't call it if it isn't set.
void flush_ALERT_buffer(void) void flush_ALERT_buffer(void)
{ {
BufferedMessage* msg = messageQueueStart; BufferedMessage *msg = messageQueueStart;
int dev = (int) CVAR_GET_FLOAT("developer"); int dev = (int)CVAR_GET_FLOAT("developer");
while (NULL != msg) { while (msg)
{
if (msg->service == mlsDEV && dev == 0) { if (msg->service == mlsDEV && dev == 0) {
; ;
} }
else { else
{
ALERT(msg->atype, "b>%s %s\n", msg->prefix, msg->buf); ALERT(msg->atype, "b>%s %s\n", msg->prefix, msg->buf);
} }
messageQueueStart = messageQueueStart->next; messageQueueStart = messageQueueStart->next;
delete msg; delete msg;
msg = messageQueueStart; msg = messageQueueStart;
} }
messageQueueStart = messageQueueEnd = NULL; messageQueueStart = messageQueueEnd = nullptr;
} }

View File

@ -1,43 +1,6 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// log_meta.h - functions & macros for logging #include "enginecallbacks.h" // ALERT, etc
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef LOG_META_H
#define LOG_META_H
#include "enginecallbacks.h" // ALERT, etc
#include "sdk_util.h" // UTIL_VarArgs, etc #include "sdk_util.h" // UTIL_VarArgs, etc
// Debug logging. // Debug logging.
@ -65,7 +28,7 @@
// for times when it might be called as a single-statement result of an // for times when it might be called as a single-statement result of an
// else (or other flow control). // else (or other flow control).
// //
// As suggested by Jussi Kivilinna: Use "if(meta_debug.value < level); else // As suggested by Jussi Kivilinna: Use "if (meta_debug.value < level); else
// DO(something);" style because "meta_debug.value < level" is in most common // DO(something);" style because "meta_debug.value < level" is in most common
// case "false". Check disasm, contitional jumps are predicted not to be // case "false". Check disasm, contitional jumps are predicted not to be
// taken by CPU. // taken by CPU.
@ -73,7 +36,7 @@
// Yes, it's all a bit of a hack. // Yes, it's all a bit of a hack.
#define META_DEBUG(level, args) \ #define META_DEBUG(level, args) \
do { if(meta_debug.value < level) break; else ALERT(at_logged, "[META] (debug:%d) %s\n", level, UTIL_VarArgs args ); } while(0) do { if (meta_debug.value < level) break; else ALERT(at_logged, "[META] (debug:%d) %s\n", level, UTIL_VarArgs args ); } while(0)
// max buffer size for printed messages // max buffer size for printed messages
#define MAX_LOGMSG_LEN 1024 #define MAX_LOGMSG_LEN 1024
@ -98,5 +61,3 @@ void META_LOG(const char *fmt, ...);
void META_CLIENT(edict_t *pEntity, const char *fmt, ...); void META_CLIENT(edict_t *pEntity, const char *fmt, ...);
void flush_ALERT_buffer(void); void flush_ALERT_buffer(void);
#endif /* LOG_META_H */

View File

@ -1,47 +1,10 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// meta_api.h - description of metamod's DLL interface
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef META_API_H
#define META_API_H
#include "dllapi.h" // GETENTITYAPI_FN, etc #include "dllapi.h" // GETENTITYAPI_FN, etc
#include "engine_api.h" // GET_ENGINE_FUNCTIONS_FN, etc #include "engine_api.h" // GET_ENGINE_FUNCTIONS_FN, etc
#include "plinfo.h" // plugin_info_t, etc #include "plinfo.h" // plugin_info_t, etc
#include "mutil.h" // mutil_funcs_t, etc
#include "osdep.h" // DLLEXPORT, etc #include "osdep.h" // DLLEXPORT, etc
#include "mutil.h"
// Version consists of "major:minor", two separate integer numbers. // Version consists of "major:minor", two separate integer numbers.
// Version 1 original // Version 1 original
@ -60,47 +23,48 @@
// Version 5:9 added GetGameInfo [v1.14] // Version 5:9 added GetGameInfo [v1.14]
// Version 5:10 added GINFO_REALDLL_FULLPATH for GetGameInfo [v1.17] // Version 5:10 added GINFO_REALDLL_FULLPATH for GetGameInfo [v1.17]
// Version 5:11 added plugin loading and unloading API [v1.18] // Version 5:11 added plugin loading and unloading API [v1.18]
// Version 5:12 added util code for checking player query status [v1.18] // Version 5:12 added IS_QUERYING_CLIENT_CVAR to mutils [v1.18]
// Version 5:13 added cvarquery2 support and api for calling hook tables [v1.19] // Version 5:13 added MAKE_REQUESTID and GET_HOOK_TABLES to mutils [v1.19]
#define META_INTERFACE_VERSION "5:13" #define META_INTERFACE_VERSION "5:13"
#ifdef UNFINISHED
// Version 5:99 added event hook utility functions [v.???]
#define META_INTERFACE_VERSION "5:99"
#endif /* UNFINISHED */
// Flags returned by a plugin's api function. // Flags returned by a plugin's api function.
// NOTE: order is crucial, as greater/less comparisons are made. // NOTE: order is crucial, as greater/less comparisons are made.
typedef enum { enum META_RES
{
MRES_UNSET = 0, MRES_UNSET = 0,
MRES_IGNORED, // plugin didn't take any action MRES_IGNORED, // plugin didn't take any action
MRES_HANDLED, // plugin did something, but real function should still be called MRES_HANDLED, // plugin did something, but real function should still be called
MRES_OVERRIDE, // call real function, but use my return value MRES_OVERRIDE, // call real function, but use my return value
MRES_SUPERCEDE, // skip real function; use my return value MRES_SUPERCEDE, // skip real function; use my return value
} META_RES; };
// Variables provided to plugins. // Variables provided to plugins.
typedef struct meta_globals_s { struct meta_globals_t
{
META_RES mres; // writable; plugin's return flag META_RES mres; // writable; plugin's return flag
META_RES prev_mres; // readable; return flag of the previous plugin called META_RES prev_mres; // readable; return flag of the previous plugin called
META_RES status; // readable; "highest" return flag so far META_RES status; // readable; "highest" return flag so far
void *orig_ret; // readable; return value from "real" function void *orig_ret; // readable; return value from "real" function
void *override_ret; // readable; return value from overriding/superceding plugin void *override_ret; // readable; return value from overriding/superceding plugin
} meta_globals_t; };
extern meta_globals_t *gpMetaGlobals; extern meta_globals_t *gpMetaGlobals;
#define SET_META_RESULT(result) gpMetaGlobals->mres=result #define SET_META_RESULT(result) gpMetaGlobals->mres = result
#define RETURN_META(result) \ #define RETURN_META(result) \
do { gpMetaGlobals->mres=result; return; } while(0) do { gpMetaGlobals->mres = result; return; } while (0)
#define RETURN_META_VALUE(result, value) \ #define RETURN_META_VALUE(result, value) \
do { gpMetaGlobals->mres=result; return(value); } while(0) do { gpMetaGlobals->mres = result; return value; } while (0)
#define META_RESULT_STATUS gpMetaGlobals->status
#define META_RESULT_STATUS gpMetaGlobals->status
#define META_RESULT_PREVIOUS gpMetaGlobals->prev_mres #define META_RESULT_PREVIOUS gpMetaGlobals->prev_mres
#define META_RESULT_ORIG_RET(type) *(type *)gpMetaGlobals->orig_ret #define META_RESULT_ORIG_RET(type) *(type *)gpMetaGlobals->orig_ret
#define META_RESULT_OVERRIDE_RET(type) *(type *)gpMetaGlobals->override_ret #define META_RESULT_OVERRIDE_RET(type) *(type *)gpMetaGlobals->override_ret
// Table of getapi functions, retrieved from each plugin. // Table of getapi functions, retrieved from each plugin.
typedef struct { struct META_FUNCTIONS
{
GETENTITYAPI_FN pfnGetEntityAPI; GETENTITYAPI_FN pfnGetEntityAPI;
GETENTITYAPI_FN pfnGetEntityAPI_Post; GETENTITYAPI_FN pfnGetEntityAPI_Post;
GETENTITYAPI2_FN pfnGetEntityAPI2; GETENTITYAPI2_FN pfnGetEntityAPI2;
@ -109,13 +73,14 @@ typedef struct {
GETNEWDLLFUNCTIONS_FN pfnGetNewDLLFunctions_Post; GETNEWDLLFUNCTIONS_FN pfnGetNewDLLFunctions_Post;
GET_ENGINE_FUNCTIONS_FN pfnGetEngineFunctions; GET_ENGINE_FUNCTIONS_FN pfnGetEngineFunctions;
GET_ENGINE_FUNCTIONS_FN pfnGetEngineFunctions_Post; GET_ENGINE_FUNCTIONS_FN pfnGetEngineFunctions_Post;
} META_FUNCTIONS; };
// Pair of function tables provided by game DLL. // Pair of function tables provided by game DLL.
typedef struct { struct gamedll_funcs_t
{
DLL_FUNCTIONS *dllapi_table; DLL_FUNCTIONS *dllapi_table;
NEW_DLL_FUNCTIONS *newapi_table; NEW_DLL_FUNCTIONS *newapi_table;
} gamedll_funcs_t; };
// Declared in plugin; referenced in macros. // Declared in plugin; referenced in macros.
extern gamedll_funcs_t *gpGamedllFuncs; extern gamedll_funcs_t *gpGamedllFuncs;
@ -126,112 +91,94 @@ extern mutil_funcs_t *gpMetaUtilFuncs;
// procedure. In particular, this will allow for DLL's that can be used as // procedure. In particular, this will allow for DLL's that can be used as
// both standalone DLL's and metamod plugins. (optional; not required in // both standalone DLL's and metamod plugins. (optional; not required in
// plugin) // plugin)
C_DLLEXPORT void Meta_Init(void); C_DLLEXPORT void Meta_Init();
typedef void (*META_INIT_FN) (void); typedef void (*META_INIT_FN)();
// Get info about plugin, compare meta_interface versions, provide meta // Get info about plugin, compare meta_interface versions, provide meta
// utility callback functions. // utility callback functions.
C_DLLEXPORT int Meta_Query(const char *interfaceVersion, C_DLLEXPORT int Meta_Query(char *interfaceVersion, plugin_info_t **plinfo, mutil_funcs_t *pMetaUtilFuncs);
plugin_info_t **plinfo, typedef int (*META_QUERY_FN) (char *interfaceVersion, plugin_info_t **plinfo, mutil_funcs_t *pMetaUtilFuncs);
mutil_funcs_t *pMetaUtilFuncs);
typedef int (*META_QUERY_FN) (const char *interfaceVersion,
plugin_info_t **plinfo,
mutil_funcs_t *pMetaUtilFuncs);
// Attach the plugin to the API; get the table of getapi functions; give // Attach the plugin to the API; get the table of getapi functions; give
// meta_globals and gamedll_funcs. // meta_globals and gamedll_funcs.
C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, meta_globals_t *pMGlobals, gamedll_funcs_t *pGamedllFuncs);
META_FUNCTIONS *pFunctionTable, typedef int (*META_ATTACH_FN) (PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, meta_globals_t *pMGlobals, gamedll_funcs_t *pGamedllFuncs);
meta_globals_t *pMGlobals,
gamedll_funcs_t *pGamedllFuncs);
typedef int (*META_ATTACH_FN) (PLUG_LOADTIME now,
META_FUNCTIONS *pFunctionTable,
meta_globals_t *pMGlobals,
gamedll_funcs_t *pGamedllFuncs);
// Detach the plugin; tell why and when. // Detach the plugin; tell why and when.
C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason); C_DLLEXPORT int Meta_Detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason);
typedef int (*META_DETACH_FN) (PLUG_LOADTIME now, PL_UNLOAD_REASON reason); typedef int (*META_DETACH_FN) (PLUG_LOADTIME now, PL_UNLOAD_REASON reason);
// Standard HL SDK interface function prototypes. // Standard HL SDK interface function prototypes.
C_DLLEXPORT int GetEntityAPI_Post(DLL_FUNCTIONS *pFunctionTable, C_DLLEXPORT int GetEntityAPI_Post(DLL_FUNCTIONS *pFunctionTable, int interfaceVersion );
int interfaceVersion ); C_DLLEXPORT int GetEntityAPI2_Post(DLL_FUNCTIONS *pFunctionTable, int *interfaceVersion );
C_DLLEXPORT int GetEntityAPI2_Post(DLL_FUNCTIONS *pFunctionTable,
int *interfaceVersion );
// Additional SDK-like interface function prototypes. // Additional SDK-like interface function prototypes.
C_DLLEXPORT int GetNewDLLFunctions_Post(NEW_DLL_FUNCTIONS *pNewFunctionTable, C_DLLEXPORT int GetNewDLLFunctions_Post(NEW_DLL_FUNCTIONS *pNewFunctionTable, int *interfaceVersion );
int *interfaceVersion ); C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *interfaceVersion);
C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, C_DLLEXPORT int GetEngineFunctions_Post(enginefuncs_t *pengfuncsFromEngine, int *interfaceVersion);
int *interfaceVersion);
C_DLLEXPORT int GetEngineFunctions_Post(enginefuncs_t *pengfuncsFromEngine,
int *interfaceVersion);
// Convenience macros for accessing GameDLL functions. Note: these talk // Convenience macros for accessing GameDLL functions. Note: these talk
// _directly_ to the gamedll, and are not multiplexed through Metamod to // _directly_ to the gamedll, and are not multiplexed through Metamod to
// the other plugins. // the other plugins.
// DLL API functions: // DLL API functions:
#define MDLL_FUNC gpGamedllFuncs->dllapi_table #define MDLL_FUNC gpGamedllFuncs->dllapi_table
#define MDLL_GameDLLInit MDLL_FUNC->pfnGameInit #define MDLL_GameDLLInit MDLL_FUNC->pfnGameInit
#define MDLL_Spawn MDLL_FUNC->pfnSpawn #define MDLL_Spawn MDLL_FUNC->pfnSpawn
#define MDLL_Think MDLL_FUNC->pfnThink #define MDLL_Think MDLL_FUNC->pfnThink
#define MDLL_Use MDLL_FUNC->pfnUse #define MDLL_Use MDLL_FUNC->pfnUse
#define MDLL_Touch MDLL_FUNC->pfnTouch #define MDLL_Touch MDLL_FUNC->pfnTouch
#define MDLL_Blocked MDLL_FUNC->pfnBlocked #define MDLL_Blocked MDLL_FUNC->pfnBlocked
#define MDLL_KeyValue MDLL_FUNC->pfnKeyValue #define MDLL_KeyValue MDLL_FUNC->pfnKeyValue
#define MDLL_Save MDLL_FUNC->pfnSave #define MDLL_Save MDLL_FUNC->pfnSave
#define MDLL_Restore MDLL_FUNC->pfnRestore #define MDLL_Restore MDLL_FUNC->pfnRestore
#define MDLL_ObjectCollsionBox MDLL_FUNC->pfnAbsBox #define MDLL_ObjectCollsionBox MDLL_FUNC->pfnAbsBox
#define MDLL_SaveWriteFields MDLL_FUNC->pfnSaveWriteFields #define MDLL_SaveWriteFields MDLL_FUNC->pfnSaveWriteFields
#define MDLL_SaveReadFields MDLL_FUNC->pfnSaveReadFields #define MDLL_SaveReadFields MDLL_FUNC->pfnSaveReadFields
#define MDLL_SaveGlobalState MDLL_FUNC->pfnSaveGlobalState #define MDLL_SaveGlobalState MDLL_FUNC->pfnSaveGlobalState
#define MDLL_RestoreGlobalState MDLL_FUNC->pfnRestoreGlobalState #define MDLL_RestoreGlobalState MDLL_FUNC->pfnRestoreGlobalState
#define MDLL_ResetGlobalState MDLL_FUNC->pfnResetGlobalState #define MDLL_ResetGlobalState MDLL_FUNC->pfnResetGlobalState
#define MDLL_ClientConnect MDLL_FUNC->pfnClientConnect #define MDLL_ClientConnect MDLL_FUNC->pfnClientConnect
#define MDLL_ClientDisconnect MDLL_FUNC->pfnClientDisconnect #define MDLL_ClientDisconnect MDLL_FUNC->pfnClientDisconnect
#define MDLL_ClientKill MDLL_FUNC->pfnClientKill #define MDLL_ClientKill MDLL_FUNC->pfnClientKill
#define MDLL_ClientPutInServer MDLL_FUNC->pfnClientPutInServer #define MDLL_ClientPutInServer MDLL_FUNC->pfnClientPutInServer
#define MDLL_ClientCommand MDLL_FUNC->pfnClientCommand #define MDLL_ClientCommand MDLL_FUNC->pfnClientCommand
#define MDLL_ClientUserInfoChanged MDLL_FUNC->pfnClientUserInfoChanged #define MDLL_ClientUserInfoChanged MDLL_FUNC->pfnClientUserInfoChanged
#define MDLL_ServerActivate MDLL_FUNC->pfnServerActivate #define MDLL_ServerActivate MDLL_FUNC->pfnServerActivate
#define MDLL_ServerDeactivate MDLL_FUNC->pfnServerDeactivate #define MDLL_ServerDeactivate MDLL_FUNC->pfnServerDeactivate
#define MDLL_PlayerPreThink MDLL_FUNC->pfnPlayerPreThink #define MDLL_PlayerPreThink MDLL_FUNC->pfnPlayerPreThink
#define MDLL_PlayerPostThink MDLL_FUNC->pfnPlayerPostThink #define MDLL_PlayerPostThink MDLL_FUNC->pfnPlayerPostThink
#define MDLL_StartFrame MDLL_FUNC->pfnStartFrame #define MDLL_StartFrame MDLL_FUNC->pfnStartFrame
#define MDLL_ParmsNewLevel MDLL_FUNC->pfnParmsNewLevel #define MDLL_ParmsNewLevel MDLL_FUNC->pfnParmsNewLevel
#define MDLL_ParmsChangeLevel MDLL_FUNC->pfnParmsChangeLevel #define MDLL_ParmsChangeLevel MDLL_FUNC->pfnParmsChangeLevel
#define MDLL_GetGameDescription MDLL_FUNC->pfnGetGameDescription #define MDLL_GetGameDescription MDLL_FUNC->pfnGetGameDescription
#define MDLL_PlayerCustomization MDLL_FUNC->pfnPlayerCustomization #define MDLL_PlayerCustomization MDLL_FUNC->pfnPlayerCustomization
#define MDLL_SpectatorConnect MDLL_FUNC->pfnSpectatorConnect #define MDLL_SpectatorConnect MDLL_FUNC->pfnSpectatorConnect
#define MDLL_SpectatorDisconnect MDLL_FUNC->pfnSpectatorDisconnect #define MDLL_SpectatorDisconnect MDLL_FUNC->pfnSpectatorDisconnect
#define MDLL_SpectatorThink MDLL_FUNC->pfnSpectatorThink #define MDLL_SpectatorThink MDLL_FUNC->pfnSpectatorThink
#define MDLL_Sys_Error MDLL_FUNC->pfnSys_Error #define MDLL_Sys_Error MDLL_FUNC->pfnSys_Error
#define MDLL_PM_Move MDLL_FUNC->pfnPM_Move #define MDLL_PM_Move MDLL_FUNC->pfnPM_Move
#define MDLL_PM_Init MDLL_FUNC->pfnPM_Init #define MDLL_PM_Init MDLL_FUNC->pfnPM_Init
#define MDLL_PM_FindTextureType MDLL_FUNC->pfnPM_FindTextureType #define MDLL_PM_FindTextureType MDLL_FUNC->pfnPM_FindTextureType
#define MDLL_SetupVisibility MDLL_FUNC->pfnSetupVisibility #define MDLL_SetupVisibility MDLL_FUNC->pfnSetupVisibility
#define MDLL_UpdateClientData MDLL_FUNC->pfnUpdateClientData #define MDLL_UpdateClientData MDLL_FUNC->pfnUpdateClientData
#define MDLL_AddToFullPack MDLL_FUNC->pfnAddToFullPack #define MDLL_AddToFullPack MDLL_FUNC->pfnAddToFullPack
#define MDLL_CreateBaseline MDLL_FUNC->pfnCreateBaseline #define MDLL_CreateBaseline MDLL_FUNC->pfnCreateBaseline
#define MDLL_RegisterEncoders MDLL_FUNC->pfnRegisterEncoders #define MDLL_RegisterEncoders MDLL_FUNC->pfnRegisterEncoders
#define MDLL_GetWeaponData MDLL_FUNC->pfnGetWeaponData #define MDLL_GetWeaponData MDLL_FUNC->pfnGetWeaponData
#define MDLL_CmdStart MDLL_FUNC->pfnCmdStart #define MDLL_CmdStart MDLL_FUNC->pfnCmdStart
#define MDLL_CmdEnd MDLL_FUNC->pfnCmdEnd #define MDLL_CmdEnd MDLL_FUNC->pfnCmdEnd
#define MDLL_ConnectionlessPacket MDLL_FUNC->pfnConnectionlessPacket #define MDLL_ConnectionlessPacket MDLL_FUNC->pfnConnectionlessPacket
#define MDLL_GetHullBounds MDLL_FUNC->pfnGetHullBounds #define MDLL_GetHullBounds MDLL_FUNC->pfnGetHullBounds
#define MDLL_CreateInstancedBaselines MDLL_FUNC->pfnCreateInstancedBaselines #define MDLL_CreateInstancedBaselines MDLL_FUNC->pfnCreateInstancedBaselines
#define MDLL_InconsistentFile MDLL_FUNC->pfnInconsistentFile #define MDLL_InconsistentFile MDLL_FUNC->pfnInconsistentFile
#define MDLL_AllowLagCompensation MDLL_FUNC->pfnAllowLagCompensation #define MDLL_AllowLagCompensation MDLL_FUNC->pfnAllowLagCompensation
// NEW API functions: // NEW API functions:
#define MNEW_FUNC gpGamedllFuncs->newapi_table #define MNEW_FUNC gpGamedllFuncs->newapi_table
#define MNEW_OnFreeEntPrivateData MNEW_FUNC->pfnOnFreeEntPrivateData #define MNEW_OnFreeEntPrivateData MNEW_FUNC->pfnOnFreeEntPrivateData
#define MNEW_GameShutdown MNEW_FUNC->pfnGameShutdown #define MNEW_GameShutdown MNEW_FUNC->pfnGameShutdown
#define MNEW_ShouldCollide MNEW_FUNC->pfnShouldCollide #define MNEW_ShouldCollide MNEW_FUNC->pfnShouldCollide
#define MNEW_CvarValue MNEW_FUNC->pfnCvarValue #define MNEW_CvarValue MNEW_FUNC->pfnCvarValue
#define MNEW_CvarValue2 MNEW_FUNC->pfnCvarValue2
#endif /* META_API_H */

View File

@ -1,51 +1,5 @@
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// meta_eiface.cpp - wrapper for engine/dll interface
/*
* Copyright (c) 2001-2006 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#include "precompiled.h" #include "precompiled.h"
// ------------------------------------------------------------------------
// meta_new_dll_functions_t
// ------------------------------------------------------------------------
// static member initialisation
int meta_new_dll_functions_t::sm_version = 0;
meta_new_dll_functions_t::meta_new_dll_functions_t( meta_new_dll_functions_t::meta_new_dll_functions_t(
void (*_pfnOnFreeEntPrivateData)(edict_t*), void (*_pfnOnFreeEntPrivateData)(edict_t*),
void (*_pfnGameShutdown)(void), void (*_pfnGameShutdown)(void),
@ -61,104 +15,16 @@ meta_new_dll_functions_t::meta_new_dll_functions_t(
pfnCvarValue2 = _pfnCvarValue2; pfnCvarValue2 = _pfnCvarValue2;
} }
void meta_new_dll_functions_t::copy_to(NEW_DLL_FUNCTIONS *_pFuncs)
void meta_new_dll_functions_t::copy_to(NEW_DLL_FUNCTIONS* _pFuncs)
{ {
// This is where the magic happens. We check what version of the #if 0
// NEW_DLL_FUNCTIONS interface the engine has and calculate the size of // TODO: Implemented check regamedll
// that interface. Then we only copy the function pointers present in // exit
// that version over to the receiver, so that we do not overwrite his
// memory with functions that he doesn't know of in his copy of the
// struct.
size_t size = get_size();
if (0 == size) { #endif
// Ok, this is a real problem and should *not* happen. Q_memcpy(_pFuncs, this, sizeof(NEW_DLL_FUNCTIONS));
// We try to work with NEW_DLL_FUNCTIONS without knowing what
// interface the attached engine uses. This means that the classes
// defined herein are not used in the way they are meant to because
// someone forgot to first create a HL_enginefuncs_t object and
// initialise it with the pointers passed from the engine.
// We treat this as a major developer error and bluntly exit the
// whole process, assuming that this will never happen on a
// production server as it should have been caught by the developer
// during testing.
//
// We use a printf() to complain since we do not know if we have
// already attached to the engine and can use its alerting
// functions. This should be augemnted with a windows version
// popping open a message box.
fprintf(stderr, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
fprintf(stderr, "ERROR: INTERNAL ERROR.\n");
fprintf(stderr, " Attempt to use meta_new_dll_functions_t without"
" initialised engine interface version!\n");
fprintf(stderr, " %s at %d\n", __FILE__, __LINE__);
exit(1);
}
memcpy(_pFuncs, this, size);
} }
int meta_new_dll_functions_t::determine_interface_version(void)
{
// If the meta_enginefuncs_t::version is 0, i.e. has not yet been
// determined, that is a problem and an error. We should probably throw
// a fit here or something.
// For now we just return 0 and leave it to the caller to complain.
if (meta_enginefuncs_t::version() == 0) return 0;
// The default version is 1.
sm_version = 1;
// With the enginefuncs interface version 156 the function
// pfnCvarValue() was added, which we call version 2.
if (meta_enginefuncs_t::version() >= 156) sm_version = 2;
// With the enginefuncs interface version 157 the function
// pfnCvarValue2() was added, which we call version 3.
if (meta_enginefuncs_t::version() >= 157) sm_version = 3;
return sm_version;
}
size_t meta_new_dll_functions_t::get_size(int _version)
{
size_t size = sizeof(NEW_DLL_FUNCTIONS);
if (0 == _version) {
// Use the current engine's interface version
_version = version();
// Error: meta_enginefuncs_t::version probably not yet set up.
if (0 == _version) return 0;
}
switch (_version) {
case 1:
// Version 1 is missing all functions from CvarValue() on.
size -= sizeof(FN_CVARVALUE);
case 2:
// Version 2 is missing all functions from CvarValue2() on.
size -= sizeof(FN_CVARVALUE2);
}
return size;
}
// --------------------------------------------------------------
// meta_enginefuncs_t
// --------------------------------------------------------------
// static member initialisation
int meta_enginefuncs_t::sm_version = 0;
// -----------------------------------------------------------------
// HL_enginefuncs
// -----------------------------------------------------------------
void HL_enginefuncs_t::initialise_interface(enginefuncs_t* _pFuncs) void HL_enginefuncs_t::initialise_interface(enginefuncs_t* _pFuncs)
{ {
set_from(_pFuncs); set_from(_pFuncs);
@ -166,166 +32,4 @@ void HL_enginefuncs_t::initialise_interface(enginefuncs_t* _pFuncs)
// Now the pfnAlertMessage is available and we trust it to be a valid // Now the pfnAlertMessage is available and we trust it to be a valid
// pointer, so flush the message buffer. // pointer, so flush the message buffer.
flush_ALERT_buffer(); flush_ALERT_buffer();
determine_engine_interface_version();
fixup_engine_interface();
}
// The following part (i.e. the end) of the enginefuncs_t struct is
// used to determine the engine interface version since it is the one
// that changed since SDK 212 engines. We call this the "signature" of
// the enginefuncs interface.
//
// Default version is 138. That's what the SDK says.
//
// 144: const char *(*pfnGetPlayerAuthId) ( edict_t *e );
//
// // PSV: Added for CZ training map
// // const char *(*pfnKeyNameForBinding) ( const char* pBinding );
//
// sequenceEntry_s* (*pfnSequenceGet) ( const char* fileName, const char* entryName );
// sentenceEntry_s* (*pfnSequencePickSentence) ( const char* groupName, int pickMethod, int *picked );
//
// // LH: Give access to filesize via filesystem
// 147: int (*pfnGetFileSize) ( const char *filename );
//
// unsigned int (*pfnGetApproxWavePlayLen) (const char *filepath);
// // MDC: Added for CZ career-mode
// int (*pfnIsCareerMatch) ( void );
//
// // BGC: return the number of characters of the localized string referenced by using "label"
// int (*pfnGetLocalizedStringLength) (const char *label);
//
// // BGC: added to facilitate persistent storage of tutor message decay values for
// // different career game profiles. Also needs to persist regardless of mp.dll being
// // destroyed and recreated.
// void (*pfnRegisterTutorMessageShown) (int mid);
// int (*pfnGetTimesTutorMessageShown) (int mid);
// void (*pfnProcessTutorMessageDecayBuffer) (int *buffer, int bufferLength);
// void (*pfnConstructTutorMessageDecayBuffer) (int *buffer, int bufferLength);
// 155: void (*pfnResetTutorMessageDecayData) ( void );
// 156: void (*pfnQueryClientCvarValue) ( const edict_t *player, const char *cvarName );
// 157: void (*pfnQueryClientCvarValue2) ( const edict_t *player, const char *cvarName, int requestID );
// 158: int (*pfnCheckParm) ( const char *pchCmdLineToke, char **ppnext );
void HL_enginefuncs_t::determine_engine_interface_version(void) const
{
// We only need to do this once.
if (0 != sm_version) {
return;
}
// Now begins our heuristic, where we try to determine the engine
// interface version.
// As alluded to above we are currently only interested, and thus
// only detect, versions 144, 147, 156 or 157 (defined by us).
// The minimal default is 138.
sm_version = 138;
// If GetPlayerAuthId() is present, it is at least 144,
// otherwise leave it at the default 138.
// This may give incorrect results for *really* old engine versions,
// i.e. pre 1.1.0.8. We live with that risk. No one uses them anymore.
// Really.
if (pfnGetPlayerAuthId == NULL) {
return;
}
sm_version = 144;
// The two function pointers for pfnSequenceGet() and
// pfnSequencePickSentence() are only valid in a few engine versions
// and are set to NULL in most other version, so they don't get
// checked.
// If pfnGetFileSize() is present, it is at least 147,
// otherwise leave it at the so far determined value.
if (pfnGetFileSize == NULL) {
return;
}
sm_version = 147;
// Now it gets a bit fuzzy. If all of the functions following GetFileSize()
// but before QueryClientCvarValue() are valid, it is at least 155.
// If even one of them is NULL, then our version can't be higher than 147,
// so use 147. Actually, it could be that there exist engine
// versions where one of them is NULL but the interface is still at
// least 155. If such an engine is found in use, adaptions need to be
// made.
// (Yes, I know this could be done with a little hacky for() loop. We
// don't need to do hacky here.)
int cntInvals = 0;
if (pfnGetApproxWavePlayLen == NULL) cntInvals++;
if (pfnIsCareerMatch == NULL) cntInvals++;
if (pfnGetLocalizedStringLength == NULL) cntInvals++;
if (pfnRegisterTutorMessageShown == NULL) cntInvals++;
if (pfnGetTimesTutorMessageShown == NULL) cntInvals++;
if (pfnProcessTutorMessageDecayBuffer == NULL) cntInvals++;
if (pfnConstructTutorMessageDecayBuffer == NULL) cntInvals++;
if (pfnResetTutorMessageDecayData == NULL) cntInvals++;
if (cntInvals > 0) {
return;
}
sm_version = 155;
// All functions up to QueryClientCvarValue() are valid.
// If QueryClientCvarValue() is not valid, leave it at the so far
// determined version. Otherwise the version is at least 156.
if (pfnQueryClientCvarValue == NULL) {
return;
}
sm_version = 156;
// All functions up to QueryClientCvarValue2() are valid.
// If QueryClientCvarValue2() is not valid, leave it at the so far
// determined version. Otherwise the version is at least 157.
if (pfnQueryClientCvarValue2 == NULL) {
return;
}
sm_version = 157;
// All functions up to CheckParm() are valid.
// If CheckParm() is not valid, leave it at the so far determined
// version. Otherwise the version is at least 158.
if (pfnEngCheckParm == NULL) {
return;
}
sm_version = 158;
}
void HL_enginefuncs_t::fixup_engine_interface(void)
{
// This function will make sure that all function pointers that aren't
// valid are set to NULL, depending on the engine interface version.
// Sometimes a pointer has a valid value although the function doesn't
// exist in the interface version.
switch (version()) {
case 138:
pfnGetPlayerAuthId = NULL;
case 144:
pfnSequenceGet = NULL;
pfnSequencePickSentence = NULL;
pfnGetFileSize = NULL;
case 147:
pfnGetApproxWavePlayLen = NULL;
pfnIsCareerMatch = NULL;
pfnGetLocalizedStringLength = NULL;
pfnRegisterTutorMessageShown = NULL;
pfnGetTimesTutorMessageShown = NULL;
pfnProcessTutorMessageDecayBuffer = NULL;
pfnConstructTutorMessageDecayBuffer = NULL;
pfnResetTutorMessageDecayData = NULL;
case 155:
pfnQueryClientCvarValue = NULL;
case 156:
pfnQueryClientCvarValue2 = NULL;
case 157:
pfnEngCheckParm = NULL;
}
} }

View File

@ -1,48 +1,4 @@
#pragma once
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// meta_eiface.h - wrapper for engine/dll interface
/*
* Copyright (c) 2001-2006 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef MM_META_EIFACE_H
#define MM_META_EIFACE_H
#include <extdll.h> // NEW_DLL_FUNCTIONS, enginefuncs_t
#include <string.h> // memset()
// We use our own versions of the engine/dll interface structs. We add a // We use our own versions of the engine/dll interface structs. We add a
// few dummy entries to the end and set them to 0. That way we are // few dummy entries to the end and set them to 0. That way we are
@ -51,19 +7,16 @@
// dll overwriting our memory when using an old Metamod with a new game // dll overwriting our memory when using an old Metamod with a new game
// dll. // dll.
// --------------------------------------------------------------------
// meta_new_dll_functions_t // meta_new_dll_functions_t
// -------------------------------------------------------------------- struct meta_new_dll_functions_t: public NEW_DLL_FUNCTIONS
struct meta_new_dll_functions_t : public NEW_DLL_FUNCTIONS
{ {
meta_new_dll_functions_t(); meta_new_dll_functions_t();
meta_new_dll_functions_t( meta_new_dll_functions_t(
void (*pfnOnFreeEntPrivateData)(edict_t*), void (*pfnOnFreeEntPrivateData)(edict_t *),
void (*pfnGameShutdown)(void), void (*pfnGameShutdown)(),
int (*pfnShouldCollide)(edict_t*, edict_t*), int (*pfnShouldCollide)(edict_t *, edict_t *),
void (*pfnCvarValue)(const edict_t*, const char*), void (*pfnCvarValue)(const edict_t *, const char *),
void (*pfnCvarValue2)(const edict_t*, int, const char*, const char*) void (*pfnCvarValue2)(const edict_t *, int, const char *, const char *)
); );
meta_new_dll_functions_t(const meta_new_dll_functions_t&); meta_new_dll_functions_t(const meta_new_dll_functions_t&);
@ -74,106 +27,33 @@ struct meta_new_dll_functions_t : public NEW_DLL_FUNCTIONS
// Copy the pointers from this object to a NEW_DLL_FUNCTIONS struct. // Copy the pointers from this object to a NEW_DLL_FUNCTIONS struct.
void copy_to(NEW_DLL_FUNCTIONS* pFuncs); void copy_to(NEW_DLL_FUNCTIONS* pFuncs);
// return the engine's version of NEW_DLL_FUNCTIONS
int version(void);
private:
// data :
// The NEW_DLL_FUNCTIONS struct also changed, but the version
// number did not change. That begs the question why to have
// it versioned in the first place, but whaddaya know.
// While the official version is left at 1, we internally
// calculate a different version of the engine's NEW_DLL_FUNCTIONS
// struct since we know that the engine lies to us about the
// version that it uses.
//
// The default version is 1.
//
// With the enginefuncs interface version 156 the function
// pfnCvarValue() was added, which we call version 2.
//
// With the enginefuncs interface version 157 the function
// pfnCvarValue2() was added, which we call version 3.
//
// If Valve ever decides to change the version of the
// NEW_DLL_FUNCTIONS interface in the future (haha),
// we are in trouble and will need to change our
// internal versions.
static int sm_version;
// functions :
// Calculates our idea of the engine's version of the
// NEW_DLL_FUNCTIONS interface. Stores this version for future
// reference in m_version and returns it.
static int determine_interface_version(void);
// Comfort function to determine the size of the NEW_DLL_FUNCTIONS
// struct for the different versions.
// If passed a version number other than 0, the size for that
// specific version is returned.
// If passed 0 as version number (default) the size for the version
// that was determined to be the version of the currently connected
// engine's interface. Should that version have not yet been
// determined (via the enginefuncs_t interface), 0 is returned to
// indicated this error state.
size_t get_size(int version = 0);
}; };
// Inline functions
inline meta_new_dll_functions_t::meta_new_dll_functions_t() inline meta_new_dll_functions_t::meta_new_dll_functions_t()
{ {
memset(this, 0, sizeof(meta_new_dll_functions_t)); Q_memset(this, 0, sizeof(meta_new_dll_functions_t));
} }
inline meta_new_dll_functions_t::meta_new_dll_functions_t(const meta_new_dll_functions_t& _rhs) inline meta_new_dll_functions_t::meta_new_dll_functions_t(const meta_new_dll_functions_t& _rhs)
{ {
memcpy(this, &_rhs, sizeof(NEW_DLL_FUNCTIONS)); Q_memcpy(this, &_rhs, sizeof(NEW_DLL_FUNCTIONS));
} }
inline meta_new_dll_functions_t& meta_new_dll_functions_t::operator=(const meta_new_dll_functions_t& _rhs) inline meta_new_dll_functions_t& meta_new_dll_functions_t::operator=(const meta_new_dll_functions_t& _rhs)
{ {
memcpy(this, &_rhs, sizeof(NEW_DLL_FUNCTIONS)); Q_memcpy(this, &_rhs, sizeof(NEW_DLL_FUNCTIONS));
return *this; return *this;
} }
inline void meta_new_dll_functions_t::set_from(NEW_DLL_FUNCTIONS* _pFuncs) inline void meta_new_dll_functions_t::set_from(NEW_DLL_FUNCTIONS* _pFuncs)
{ {
memcpy(this, _pFuncs, sizeof(NEW_DLL_FUNCTIONS)); Q_memcpy(this, _pFuncs, sizeof(NEW_DLL_FUNCTIONS));
} }
inline int meta_new_dll_functions_t::version(void)
{
return sm_version ? sm_version : determine_interface_version();
}
// No meta version of DLL_FUNCTIONS because that won't be changing anymore.
// --------------------------------------------------------------------
// meta_enginefuncs_t
// --------------------------------------------------------------------
// meta_enginefuncs_t // meta_enginefuncs_t
struct meta_enginefuncs_t : public enginefuncs_t struct meta_enginefuncs_t : public enginefuncs_t
{ {
meta_enginefuncs_t() meta_enginefuncs_t() {};
{
};
meta_enginefuncs_t(enginefuncs_t* pFuncs) meta_enginefuncs_t(enginefuncs_t* pFuncs)
{ {
set_from(pFuncs); set_from(pFuncs);
@ -184,72 +64,26 @@ struct meta_enginefuncs_t : public enginefuncs_t
// Copy the pointers from this object to an enginefuncs_t struct. // Copy the pointers from this object to an enginefuncs_t struct.
void copy_to(enginefuncs_t* pFuncs); void copy_to(enginefuncs_t* pFuncs);
// The version of the engine functions interface. It is frozen at 138. But no one knows
// when that was and what it looked like then. So we simply interprete it as the
// number of functions that the enginefuncs struct contains.
//
// That means we get gaps inbetween versions and right now we can detect only
// about five different versions anyway, but that suffices for the current itches
// to get scratched.
//
// The default is hence 138.
// A value of 0 means "not yet determined".
// Other possible versions currently detectable:
// 144: engine versions after 1.1.0.9 build 1996
// 147: engine versions after build 2384 with pfnGetFileSize()
// 155: all versions between build 2384 and the one
// including pfnQueryClientCvarValue()
// 156: includes pfnQueryClientCvarValue()
// 157: includes pfnQueryClientCvarValue2()
// 158: includes pfnCheckParm()
static int sm_version;
static int version(void);
}; };
//
// Inline functions
//
inline void meta_enginefuncs_t::set_from(enginefuncs_t* _pFuncs) inline void meta_enginefuncs_t::set_from(enginefuncs_t* _pFuncs)
{ {
memcpy(this, _pFuncs, sizeof(enginefuncs_t)); Q_memcpy(this, _pFuncs, sizeof(enginefuncs_t));
} }
inline void meta_enginefuncs_t::copy_to(enginefuncs_t* _pFuncs) inline void meta_enginefuncs_t::copy_to(enginefuncs_t* _pFuncs)
{ {
memcpy(_pFuncs, this, sizeof(enginefuncs_t)); Q_memcpy(_pFuncs, this, sizeof(enginefuncs_t));
} }
inline int meta_enginefuncs_t::version(void)
{
return sm_version;
}
// --------------------------------------------------------------------
// HL_enginefuncs_t
// --------------------------------------------------------------------
//
// This is a specialisation of the meta_enginefuncs_t struct which is only // This is a specialisation of the meta_enginefuncs_t struct which is only
// used for the initial copy of the engine functions, i.e. those we get // used for the initial copy of the engine functions, i.e. those we get
// passed from the HL engine right at the beginning. // passed from the HL engine right at the beginning.
// This specialisation does some extra initialisation when getting set up
// like calculating the engine interface version and fixing up any invalid
// pointers.
// Since there is only one master copy of engine functions this could be // Since there is only one master copy of engine functions this could be
// implemented as a singleton. This is left as an option for later. // implemented as a singleton. This is left as an option for later.
// struct HL_enginefuncs_t: public meta_enginefuncs_t
struct HL_enginefuncs_t : public meta_enginefuncs_t
{ {
// functions : HL_enginefuncs_t() {};
HL_enginefuncs_t()
{
};
// Fill this object with pointers copied from an enginefuncs_t struct // Fill this object with pointers copied from an enginefuncs_t struct
// and fixup the interface. // and fixup the interface.
@ -257,32 +91,15 @@ struct HL_enginefuncs_t : public meta_enginefuncs_t
// with the pointers passed from the HL engine. // with the pointers passed from the HL engine.
void initialise_interface(enginefuncs_t* pFuncs); void initialise_interface(enginefuncs_t* pFuncs);
private: private:
// functions :
// Moving copy_to() and set_from() to the private space. // Moving copy_to() and set_from() to the private space.
void set_from(enginefuncs_t* pFuncs) void set_from(enginefuncs_t* pFuncs)
{ {
meta_enginefuncs_t::set_from(pFuncs); meta_enginefuncs_t::set_from(pFuncs);
}; }
void copy_to(enginefuncs_t* pFuncs) void copy_to(enginefuncs_t* pFuncs)
{ {
meta_enginefuncs_t::copy_to(pFuncs); meta_enginefuncs_t::copy_to(pFuncs);
}; }
// Determine the version of the engine interface from the
// enginefuncs signature.
void determine_engine_interface_version(void) const;
// Fixup the enginefuncs pointers according to the determined
// version as some pointers may be invalid.
void fixup_engine_interface(void);
}; };
#endif /* META_EIFACE_H */

View File

@ -1,52 +1,17 @@
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// metamod.cpp - (main) implementation of metamod operations
/*
* Copyright (c) 2001-2004 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#include "precompiled.h" #include "precompiled.h"
cvar_t meta_version = {"metamod_version", VVERSION, FCVAR_SERVER , 0, NULL}; cvar_t meta_version = { "metamod_version", APP_VERSION_STRD, FCVAR_SERVER, 0, nullptr };
MConfig static_config; MConfig static_config;
MConfig* g_config = &static_config; MConfig *g_config = &static_config;
option_t global_options[] = { option_t global_options[] =
{"debuglevel", CF_INT, &g_config->debuglevel, "0"}, {
{"gamedll", CF_PATH, &g_config->gamedll, NULL}, { "debuglevel", CF_INT, &g_config->debuglevel, "0" },
{"plugins_file", CF_PATH, &g_config->plugins_file, PLUGINS_INI}, { "plugins_file", CF_PATH, &g_config->plugins_file, PLUGINS_INI },
{"exec_cfg", CF_STR, &g_config->exec_cfg, EXEC_CFG}, { "exec_cfg", CF_STR, &g_config->exec_cfg, EXEC_CFG },
// list terminator // list terminator
{NULL, CF_NONE, NULL, NULL} { NULL, CF_NONE, NULL, NULL }
}; };
gamedll_t GameDLL; gamedll_t GameDLL;
@ -56,10 +21,10 @@ meta_globals_t PrivateMetaGlobals;
meta_enginefuncs_t g_plugin_engfuncs; meta_enginefuncs_t g_plugin_engfuncs;
MPluginList* g_plugins; MPluginList *g_plugins;
MRegCmdList* g_regCmds; MRegCmdList *g_regCmds;
MRegCvarList* g_regCvars; MRegCvarList *g_regCvars;
MRegMsgList* g_regMsgs; MRegMsgList *g_regMsgs;
MPlayerList g_Players; MPlayerList g_Players;
@ -69,31 +34,31 @@ int requestid_counter = 0;
#ifdef UNFINISHED #ifdef UNFINISHED
MHookList *Hooks; MHookList *Hooks;
#endif /* UNFINISHED */ #endif // UNFINISHED
// Very first metamod function that's run. // Very first metamod function that's run.
// Do startup operations... // Do startup operations...
void metamod_startup(void) void metamod_startup()
{ {
const char* mmfile = NULL; const char *mmfile = NULL;
const char* cfile = NULL; const char *cfile = NULL;
const char* cp; const char *cp;
META_CONS(" "); META_CONS(" ");
META_CONS(" %s version %s Copyright (c) 2001-%s %s", VNAME, VVERSION, COPYRIGHT_YEAR, VAUTHOR); META_CONS(" Metamod version %s Copyright (c) 2001-2016 Will Day (modification ReHLDS Team)", APP_VERSION_STRD);
META_CONS(" %s comes with ABSOLUTELY NO WARRANTY; for details type `meta gpl'.", VNAME); META_CONS(" Metamod comes with ABSOLUTELY NO WARRANTY; for details type `meta gpl'.");
META_CONS(" This is free software, and you are welcome to redistribute it"); META_CONS(" This is free software, and you are welcome to redistribute it");
META_CONS(" under certain conditions; type `meta gpl' for details."); META_CONS(" under certain conditions; type `meta gpl' for details.");
META_CONS(" "); META_CONS(" ");
META_LOG("%s v%s %s", VNAME, VVERSION, VDATE); META_CONS("Metamod v%s, API (%s)", APP_VERSION_STRD, META_INTERFACE_VERSION);
META_LOG("by %s", VAUTHOR); META_CONS("Metamod build: " __TIME__ " " __DATE__ " (" APP_VERSION_STRD ")");
META_LOG(" %s", VURL); META_CONS("Metamod from: " APP_COMMITS_URL APP_COMMIT_ID " " APP_COMMIT_AUTHOR "");
META_LOG("compiled: %s %s (%s)", COMPILE_TIME, COMPILE_TZONE, OPT_TYPE);
// If running with "+developer", allow an opportunity to break in with // If running with "+developer", allow an opportunity to break in with
// a debugger. // a debugger.
if ((int) CVAR_GET_FLOAT("developer") != 0) { if ((int) CVAR_GET_FLOAT("developer") != 0)
{
//sleep(10); // TODO: WAT?????? //sleep(10); // TODO: WAT??????
} }
@ -102,7 +67,8 @@ void metamod_startup(void)
// Get gamedir, very early on, because it seems we need it all over the // Get gamedir, very early on, because it seems we need it all over the
// place here at the start. // place here at the start.
if (!meta_init_gamedll()) { if (!meta_init_gamedll())
{
META_ERROR("Failure to init game DLL; exiting..."); META_ERROR("Failure to init game DLL; exiting...");
do_exit(1); do_exit(1);
} }
@ -115,49 +81,52 @@ void metamod_startup(void)
// Set a slight debug level for developer mode, if debug level not // Set a slight debug level for developer mode, if debug level not
// already set. // already set.
if ((int) CVAR_GET_FLOAT("developer") != 0 && meta_debug.value == 0) if ((int) CVAR_GET_FLOAT("developer") != 0 && meta_debug.value == 0)
CVAR_SET_FLOAT("meta_debug", 3.0); CVAR_SET_FLOAT("meta_debug", 3.0);
// Init default values // Init default values
g_config->init(global_options); g_config->init(global_options);
// Find config file // Find config file
cfile = CONFIG_INI; cfile = CONFIG_INI;
if ((cp = LOCALINFO("mm_configfile")) && *cp != '\0') { if ((cp = LOCALINFO("mm_configfile")) && *cp != '\0')
{
META_LOG("Configfile specified via localinfo: %s", cp); META_LOG("Configfile specified via localinfo: %s", cp);
if (valid_gamedir_file(cp)) if (valid_gamedir_file(cp))
cfile = cp; cfile = cp;
else else
META_ERROR("Empty/missing config.ini file: %s; falling back to %s", META_ERROR("Empty/missing config.ini file: %s; falling back to %s", cp, cfile);
cp, cfile);
} }
// Load config file // Load config file
if (valid_gamedir_file(cfile)) if (valid_gamedir_file(cfile))
g_config->load(cfile); g_config->load(cfile);
else else
META_DEBUG(2, ("No config.ini file found: %s", CONFIG_INI)); META_DEBUG(2, ("No config.ini file found: %s", CONFIG_INI));
// Now, override config options with localinfo commandline options. // Now, override config options with localinfo commandline options.
if ((cp = LOCALINFO("mm_debug")) && *cp != '\0') { if ((cp = LOCALINFO("mm_debug")) && *cp != '\0')
{
META_LOG("Debuglevel specified via localinfo: %s", cp); META_LOG("Debuglevel specified via localinfo: %s", cp);
g_config->set("debuglevel", cp); g_config->set("debuglevel", cp);
} }
if ((cp = LOCALINFO("mm_gamedll")) && *cp != '\0') { if ((cp = LOCALINFO("mm_gamedll")) && *cp != '\0')
{
META_LOG("Gamedll specified via localinfo: %s", cp); META_LOG("Gamedll specified via localinfo: %s", cp);
g_config->set("gamedll", cp); g_config->set("gamedll", cp);
} }
if ((cp = LOCALINFO("mm_pluginsfile")) && *cp != '\0') { if ((cp = LOCALINFO("mm_pluginsfile")) && *cp != '\0')
{
META_LOG("Pluginsfile specified via localinfo: %s", cp); META_LOG("Pluginsfile specified via localinfo: %s", cp);
g_config->set("plugins_file", cp); g_config->set("plugins_file", cp);
} }
if ((cp = LOCALINFO("mm_execcfg")) && *cp != '\0') { if ((cp = LOCALINFO("mm_execcfg")) && *cp != '\0')
{
META_LOG("Execcfg specified via localinfo: %s", cp); META_LOG("Execcfg specified via localinfo: %s", cp);
g_config->set("exec_cfg", cp); g_config->set("exec_cfg", cp);
} }
// Check for an initial debug level, since cfg files don't get exec'd // Check for an initial debug level, since cfg files don't get exec'd
// until later. // until later.
if (g_config->debuglevel != 0) if (g_config->debuglevel != 0)
CVAR_SET_FLOAT("meta_debug", g_config->debuglevel); CVAR_SET_FLOAT("meta_debug", g_config->debuglevel);
// Prepare for registered commands from plugins. // Prepare for registered commands from plugins.
g_regCmds = new MRegCmdList(); g_regCmds = new MRegCmdList();
@ -176,13 +145,14 @@ void metamod_startup(void)
g_engine.pl_funcs->pfnCVarRegister = meta_CVarRegister; g_engine.pl_funcs->pfnCVarRegister = meta_CVarRegister;
g_engine.pl_funcs->pfnCvar_RegisterVariable = meta_CVarRegister; g_engine.pl_funcs->pfnCvar_RegisterVariable = meta_CVarRegister;
g_engine.pl_funcs->pfnRegUserMsg = meta_RegUserMsg; g_engine.pl_funcs->pfnRegUserMsg = meta_RegUserMsg;
if (g_engine.pl_funcs->pfnQueryClientCvarValue) if (g_engine.pl_funcs->pfnQueryClientCvarValue)
g_engine.pl_funcs->pfnQueryClientCvarValue = meta_QueryClientCvarValue; g_engine.pl_funcs->pfnQueryClientCvarValue = meta_QueryClientCvarValue;
#ifdef UNFINISHED #ifdef UNFINISHED
// Init the list of event/logline hooks. // Init the list of event/logline hooks.
Hooks = new MHookList(); Hooks = new MHookList();
#endif /* UNFINISHED */ #endif
// Before, we loaded plugins before loading the game DLL, so that if no // Before, we loaded plugins before loading the game DLL, so that if no
// plugins caught engine functions, we could pass engine funcs straight // plugins caught engine functions, we could pass engine funcs straight
@ -208,21 +178,24 @@ void metamod_startup(void)
// Fall back to old plugins filename, if configured one isn't found. // Fall back to old plugins filename, if configured one isn't found.
mmfile = PLUGINS_INI; mmfile = PLUGINS_INI;
if (!valid_gamedir_file(PLUGINS_INI) && valid_gamedir_file(OLD_PLUGINS_INI)) if (!valid_gamedir_file(PLUGINS_INI) && valid_gamedir_file(OLD_PLUGINS_INI))
mmfile = OLD_PLUGINS_INI; mmfile = OLD_PLUGINS_INI;
if (valid_gamedir_file(g_config->plugins_file)) if (valid_gamedir_file(g_config->plugins_file))
mmfile = g_config->plugins_file; mmfile = g_config->plugins_file;
else else
META_ERROR("g_plugins file is empty/missing: %s; falling back to %s", META_ERROR("g_plugins file is empty/missing: %s; falling back to %s", g_config->plugins_file, mmfile);
g_config->plugins_file, mmfile);
g_plugins = new MPluginList(mmfile); g_plugins = new MPluginList(mmfile);
if (!meta_load_gamedll()) { if (!meta_load_gamedll())
{
META_ERROR("Failure to load game DLL; exiting..."); META_ERROR("Failure to load game DLL; exiting...");
do_exit(1); do_exit(1);
} }
if (!g_plugins->load()) {
if (!g_plugins->load())
{
META_ERROR("Failure to load plugins..."); META_ERROR("Failure to load plugins...");
// Exit on failure here? Dunno... // Exit on failure here? Dunno...
} }
@ -230,7 +203,7 @@ void metamod_startup(void)
#ifdef UNFINISHED #ifdef UNFINISHED
// Start up the log parsing thread. // Start up the log parsing thread.
startup_logparse_thread(); startup_logparse_thread();
#endif /* UNFINISHED */ #endif
// Allow for commands to metamod plugins at startup. Autoexec.cfg is // Allow for commands to metamod plugins at startup. Autoexec.cfg is
// read too early, and server.cfg is read too late. // read too early, and server.cfg is read too late.
@ -240,18 +213,21 @@ void metamod_startup(void)
// messages. // messages.
if (valid_gamedir_file(g_config->exec_cfg)) if (valid_gamedir_file(g_config->exec_cfg))
mmfile = g_config->exec_cfg; mmfile = g_config->exec_cfg;
else if (valid_gamedir_file(OLD_EXEC_CFG)) else if (valid_gamedir_file(OLD_EXEC_CFG))
mmfile = OLD_EXEC_CFG; mmfile = OLD_EXEC_CFG;
else else
mmfile = NULL; mmfile = NULL;
if (mmfile) { if (mmfile)
{
if (mmfile[0] == '/') if (mmfile[0] == '/')
META_ERROR("Cannot exec absolute pathnames: %s", mmfile); META_ERROR("Cannot exec absolute pathnames: %s", mmfile);
else { else
char cmd[NAME_MAX ]; {
char cmd[NAME_MAX];
META_LOG("Exec'ing metamod exec.cfg: %s...", mmfile); META_LOG("Exec'ing metamod exec.cfg: %s...", mmfile);
snprintf(cmd, sizeof(cmd), "exec %s\n", mmfile); Q_snprintf(cmd, sizeof(cmd), "exec %s\n", mmfile);
SERVER_COMMAND(cmd); SERVER_COMMAND(cmd);
} }
} }
@ -262,10 +238,10 @@ void metamod_startup(void)
// - ME_NULLRESULT _getcwd failed // - ME_NULLRESULT _getcwd failed
mBOOL meta_init_gamedll(void) mBOOL meta_init_gamedll(void)
{ {
char gamedir[PATH_MAX ]; char gamedir[PATH_MAX];
char* cp; char *cp;
memset(&GameDLL, 0, sizeof(GameDLL)); Q_memset(&GameDLL, 0, sizeof(GameDLL));
GET_GAME_DIR(gamedir); GET_GAME_DIR(gamedir);
normalize_pathname(gamedir); normalize_pathname(gamedir);
@ -280,32 +256,37 @@ mBOOL meta_init_gamedll(void)
// Note: the code has always assumed the server op wouldn't do: // Note: the code has always assumed the server op wouldn't do:
// hlds -game other/firearms // hlds -game other/firearms
// //
if (is_absolute_path(gamedir)) { if (is_absolute_path(gamedir))
{
// Old style; GET_GAME_DIR returned full pathname. Copy this into // Old style; GET_GAME_DIR returned full pathname. Copy this into
// our gamedir, and truncate to get the game name. // our gamedir, and truncate to get the game name.
// (note check for both linux and win32 full pathname.) // (note check for both linux and win32 full pathname.)
strncpy(GameDLL.gamedir, gamedir, sizeof GameDLL.gamedir - 1); Q_strncpy(GameDLL.gamedir, gamedir, sizeof(GameDLL.gamedir) - 1);
GameDLL.gamedir[sizeof GameDLL.gamedir - 1] = '\0'; GameDLL.gamedir[sizeof(GameDLL.gamedir) - 1] = '\0';
cp = strrchr(gamedir, '/') + 1;
strncpy(GameDLL.name, cp, sizeof GameDLL.name - 1); cp = Q_strrchr(gamedir, '/') + 1;
GameDLL.name[sizeof GameDLL.name - 1] = '\0';
Q_strncpy(GameDLL.name, cp, sizeof(GameDLL.name) - 1);
GameDLL.name[sizeof(GameDLL.name) - 1] = '\0';
} }
else { else
{
// New style; GET_GAME_DIR returned game name. Copy this into our // New style; GET_GAME_DIR returned game name. Copy this into our
// game name, and prepend the current working directory. // game name, and prepend the current working directory.
char buf[PATH_MAX ]; char buf[PATH_MAX];
if (!_getcwd(buf, sizeof(buf))) { if (!_getcwd(buf, sizeof(buf)))
META_ERROR("dll: Couldn't get cwd; %s", strerror(errno)); {
META_WARNING("dll: Couldn't get cwd; %s", strerror(errno));
RETURN_ERRNO(mFALSE, ME_NULLRESULT); RETURN_ERRNO(mFALSE, ME_NULLRESULT);
} }
snprintf(GameDLL.gamedir, sizeof(GameDLL.gamedir), "%s/%s", buf, gamedir);
strncpy(GameDLL.name, gamedir, sizeof GameDLL.name - 1); Q_snprintf(GameDLL.gamedir, sizeof(GameDLL.gamedir), "%s/%s", buf, gamedir);
GameDLL.name[sizeof GameDLL.name - 1] = '\0'; Q_strncpy(GameDLL.name, gamedir, sizeof(GameDLL.name) - 1);
GameDLL.name[sizeof(GameDLL.name) - 1] = '\0';
} }
META_DEBUG(3, ("Game: %s", GameDLL.name)); META_DEBUG(3, ("Game: %s", GameDLL.name));
return mTRUE;
return (mTRUE);
} }
// Load game DLL. // Load game DLL.
@ -323,16 +304,17 @@ mBOOL meta_load_gamedll(void)
GETENTITYAPI2_FN pfn_getapi2; GETENTITYAPI2_FN pfn_getapi2;
GETENTITYAPI_FN pfn_getapi; GETENTITYAPI_FN pfn_getapi;
if (!setup_gamedll(&GameDLL)) { if (!setup_gamedll(&GameDLL))
{
META_ERROR("dll: Unrecognized game: %s", GameDLL.name); META_ERROR("dll: Unrecognized game: %s", GameDLL.name);
// meta_errno should be already set in lookup_game() // meta_errno should be already set in lookup_game()
return (mFALSE); return mFALSE;
} }
// open the game DLL // open the game DLL
if (!(GameDLL.handle = DLOPEN(GameDLL.pathname))) { if (!(GameDLL.handle = DLOPEN(GameDLL.pathname)))
META_ERROR("dll: Couldn't load game DLL %s: %s", GameDLL.pathname, {
DLERROR()); META_ERROR("dll: Couldn't load game DLL %s: %s", GameDLL.pathname, DLERROR());
RETURN_ERRNO(mFALSE, ME_DLOPEN); RETURN_ERRNO(mFALSE, ME_DLOPEN);
} }
@ -340,40 +322,39 @@ mBOOL meta_load_gamedll(void)
// wanted to catch one of the functions, but now that plugins are // wanted to catch one of the functions, but now that plugins are
// dynamically loadable at any time, we have to always pass our table, // dynamically loadable at any time, we have to always pass our table,
// so that any plugin loaded later can catch what they need to. // so that any plugin loaded later can catch what they need to.
if ((pfn_give_engfuncs = (GIVE_ENGINE_FUNCTIONS_FN) DLSYM(GameDLL.handle, if ((pfn_give_engfuncs = (GIVE_ENGINE_FUNCTIONS_FN) DLSYM(GameDLL.handle, "GiveFnptrsToDll")))
"GiveFnptrsToDll"))) { {
pfn_give_engfuncs(&meta_engfuncs, gpGlobals); pfn_give_engfuncs(&meta_engfuncs, gpGlobals);
META_DEBUG(3, ("dll: Game '%s': Called GiveFnptrsToDll", META_DEBUG(3, ("dll: Game '%s': Called GiveFnptrsToDll", GameDLL.name));
GameDLL.name));
} }
else { else
META_ERROR("dll: Couldn't find GiveFnptrsToDll() in game DLL '%s': %s", {
GameDLL.name, DLERROR()); META_ERROR("dll: Couldn't find GiveFnptrsToDll() in game DLL '%s': %s", GameDLL.name, DLERROR());
RETURN_ERRNO(mFALSE, ME_DLMISSING); RETURN_ERRNO(mFALSE, ME_DLMISSING);
} }
// Yes...another macro. // Yes...another macro.
#define GET_FUNC_TABLE_FROM_GAME(gamedll, pfnGetFuncs, STR_GetFuncs, struct_field, API_TYPE, TABLE_TYPE, vers_pass, vers_int, vers_want, gotit) \ #define GET_FUNC_TABLE_FROM_GAME(gamedll, pfnGetFuncs, STR_GetFuncs, struct_field, API_TYPE, TABLE_TYPE, vers_pass, vers_int, vers_want, gotit) \
if((pfnGetFuncs = (API_TYPE) DLSYM(gamedll.handle, STR_GetFuncs))) { \ if ((pfnGetFuncs = (API_TYPE) DLSYM(gamedll.handle, STR_GetFuncs))) { \
gamedll.funcs.struct_field = (TABLE_TYPE*) calloc(1, sizeof(TABLE_TYPE)); \ gamedll.funcs.struct_field = (TABLE_TYPE *)Q_calloc(1, sizeof(TABLE_TYPE)); \
if(!gamedll.funcs.struct_field) {\ if (!gamedll.funcs.struct_field) {\
META_ERROR("malloc failed for gamedll struct_field: %s", STR_GetFuncs); \ META_ERROR("malloc failed for gamedll struct_field: %s", STR_GetFuncs); \
} \ } \
else if(pfnGetFuncs(gamedll.funcs.struct_field, vers_pass)) { \ else if (pfnGetFuncs(gamedll.funcs.struct_field, vers_pass)) { \
META_DEBUG(3, ("dll: Game '%s': Found %s", gamedll.name, STR_GetFuncs)); \ META_DEBUG(3, ("dll: Game '%s': Found %s", gamedll.name, STR_GetFuncs)); \
gotit=1; \ gotit = 1; \
} \ } \
else { \ else { \
META_ERROR("dll: Failure calling %s in game '%s'", STR_GetFuncs, gamedll.name); \ META_ERROR("dll: Failure calling %s in game '%s'", STR_GetFuncs, gamedll.name); \
free(gamedll.funcs.struct_field); \ Q_free(gamedll.funcs.struct_field); \
gamedll.funcs.struct_field=NULL; \ gamedll.funcs.struct_field = NULL; \
if(vers_int != vers_want) { \ if (vers_int != vers_want) { \
META_ERROR("dll: Interface version didn't match; we wanted %d, they had %d", vers_want, vers_int); \ META_ERROR("dll: Interface version didn't match; we wanted %d, they had %d", vers_want, vers_int); \
/* reproduce error from engine */ \ /* reproduce error from engine */ \
META_CONS("=================="); \ META_CONS("=================="); \
META_CONS("Game DLL version mismatch"); \ META_CONS("Game DLL version mismatch"); \
META_CONS("DLL version is %d, engine version is %d", vers_int, vers_want); \ META_CONS("DLL version is %d, engine version is %d", vers_int, vers_want); \
if(vers_int > vers_want) \ if (vers_int > vers_want) \
META_CONS("g_engine appears to be outdated, check for updates"); \ META_CONS("g_engine appears to be outdated, check for updates"); \
else \ else \
META_CONS("The game DLL for %s appears to be outdated, check for updates", GameDLL.name); \ META_CONS("The game DLL for %s appears to be outdated, check for updates", GameDLL.name); \
@ -384,37 +365,33 @@ mBOOL meta_load_gamedll(void)
} \ } \
else { \ else { \
META_DEBUG(5, ("dll: Game '%s': No %s", gamedll.name, STR_GetFuncs)); \ META_DEBUG(5, ("dll: Game '%s': No %s", gamedll.name, STR_GetFuncs)); \
gamedll.funcs.struct_field=NULL; \ gamedll.funcs.struct_field = NULL; \
} }
// Look for API-NEW interface in Game dll. We do this before API2/API, because // Look for API-NEW interface in Game dll. We do this before API2/API, because
// that's what the engine appears to do.. // that's what the engine appears to do..
iface_vers = NEW_DLL_FUNCTIONS_VERSION; iface_vers = NEW_DLL_FUNCTIONS_VERSION;
GET_FUNC_TABLE_FROM_GAME(GameDLL, pfn_getapinew, "GetNewDLLFunctions", newapi_table, GET_FUNC_TABLE_FROM_GAME(GameDLL, pfn_getapinew, "GetNewDLLFunctions", newapi_table, GETNEWDLLFUNCTIONS_FN, meta_new_dll_functions_t, &iface_vers, iface_vers, NEW_DLL_FUNCTIONS_VERSION, found);
GETNEWDLLFUNCTIONS_FN, meta_new_dll_functions_t,
&iface_vers, iface_vers, NEW_DLL_FUNCTIONS_VERSION, found);
// Look for API2 interface in plugin; preferred over API-1. // Look for API2 interface in plugin; preferred over API-1.
found = 0; found = 0;
iface_vers = INTERFACE_VERSION; iface_vers = INTERFACE_VERSION;
GET_FUNC_TABLE_FROM_GAME(GameDLL, pfn_getapi2, "GetEntityAPI2", dllapi_table, GET_FUNC_TABLE_FROM_GAME(GameDLL, pfn_getapi2, "GetEntityAPI2", dllapi_table, GETENTITYAPI2_FN, DLL_FUNCTIONS, &iface_vers, iface_vers, INTERFACE_VERSION, found);
GETENTITYAPI2_FN, DLL_FUNCTIONS,
&iface_vers, iface_vers, INTERFACE_VERSION, found);
// Look for API-1 in plugin, if API2 interface wasn't found. // Look for API-1 in plugin, if API2 interface wasn't found.
if (!found) { if (!found)
{
found = 0; found = 0;
GET_FUNC_TABLE_FROM_GAME(GameDLL, pfn_getapi, "GetEntityAPI", dllapi_table, GET_FUNC_TABLE_FROM_GAME(GameDLL, pfn_getapi, "GetEntityAPI", dllapi_table, GETENTITYAPI_FN, DLL_FUNCTIONS, INTERFACE_VERSION, INTERFACE_VERSION, INTERFACE_VERSION, found);
GETENTITYAPI_FN, DLL_FUNCTIONS,
INTERFACE_VERSION, INTERFACE_VERSION, INTERFACE_VERSION, found);
} }
// If didn't find either, return failure. // If didn't find either, return failure.
if (!found) { if (!found)
{
META_ERROR("dll: Couldn't find either GetEntityAPI nor GetEntityAPI2 in game DLL '%s'", GameDLL.name); META_ERROR("dll: Couldn't find either GetEntityAPI nor GetEntityAPI2 in game DLL '%s'", GameDLL.name);
RETURN_ERRNO(mFALSE, ME_DLMISSING); RETURN_ERRNO(mFALSE, ME_DLMISSING);
} }
META_LOG("Game DLL for '%s' loaded successfully", GameDLL.desc); META_LOG("Game DLL for '%s' loaded successfully", GameDLL.desc);
return (mTRUE); return mTRUE;
} }

View File

@ -1,86 +1,50 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// metamod.h - (main) description of metamod operations
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef METAMOD_H
#define METAMOD_H
#include "meta_api.h" // META_RES, etc #include "meta_api.h" // META_RES, etc
#include "mlist.h" // MPluginList, etc #include "mlist.h" // MPluginList, etc
#include "mreg.h" // MRegCmdList, etc #include "mreg.h" // MRegCmdList, etc
#include "conf_meta.h" // MConfig #include "conf_meta.h" // MConfig
#include "osdep.h" // NAME_MAX, etc #include "osdep.h" // NAME_MAX, etc
#include "types_meta.h" // mBOOL #include "types_meta.h" // mBOOL
#include "mplayer.h" // MPlayerList #include "mplayer.h" // MPlayerList
#include "meta_eiface.h" // HL_enginefuncs_t, meta_enginefuncs_t #include "meta_eiface.h" // HL_enginefuncs_t, meta_enginefuncs_t
#include "engine_t.h" // engine_t, g_engine #include "engine_t.h" // engine_t, Engine
// file that lists plugins to load at startup // file that lists plugins to load at startup
#define PLUGINS_INI "addons/metamod/plugins.ini" #define PLUGINS_INI "addons/metamod/plugins.ini"
#define OLD_PLUGINS_INI "metamod.ini" #define OLD_PLUGINS_INI "metamod.ini"
// file that contains commands to metamod plugins at startup // file that contains commands to metamod plugins at startup
#define EXEC_CFG "addons/metamod/exec.cfg" #define EXEC_CFG "addons/metamod/exec.cfg"
#define OLD_EXEC_CFG "metaexec.cfg" #define OLD_EXEC_CFG "metaexec.cfg"
// previously, file that contained path for an override-gamedll // previously, file that contained path for an override-gamedll
#define OLD_GAMEDLL_TXT "metagame.ini" #define OLD_GAMEDLL_TXT "metagame.ini"
// generic config file // generic config file
#define CONFIG_INI "addons/metamod/config.ini" #define CONFIG_INI "addons/metamod/config.ini"
// cvar to contain version // cvar to contain version
extern cvar_t meta_version; extern cvar_t meta_version;
// Info about the game dll/mod. // Info about the game dll/mod.
typedef struct gamedll_s { struct gamedll_t
{
char name[NAME_MAX]; // ie "cstrike" (from gamedir) char name[NAME_MAX]; // ie "cstrike" (from gamedir)
const char *desc; // ie "Counter-Strike" const char *desc; // ie "Counter-Strike"
char gamedir[PATH_MAX]; // ie "/home/willday/half-life/cstrike" char gamedir[PATH_MAX]; // ie "/home/willday/half-life/cstrike"
char pathname[PATH_MAX]; // ie "/home/willday/half-life/cstrike/dlls/cs_i386.so" char pathname[PATH_MAX]; // ie "/home/willday/half-life/cstrike/dlls/cs_i386.so"
char const *file; // ie "cs_i386.so" char const *file; // ie "cs_i386.so"
char real_pathname[PATH_MAX]; // in case pathname overridden by bot, etc char real_pathname[PATH_MAX]; // in case pathname overridden by bot, etc
DLHANDLE handle; DLHANDLE handle;
gamedll_funcs_t funcs; // dllapi_table, newapi_table gamedll_funcs_t funcs; // dllapi_table, newapi_table
} gamedll_t; };
extern gamedll_t GameDLL; extern gamedll_t GameDLL;
// SDK variables for storing engine funcs and globals. // SDK variables for storing engine funcs and globals.
extern HL_enginefuncs_t g_engfuncs; extern HL_enginefuncs_t g_engfuncs;
extern globalvars_t *gpGlobals; extern globalvars_t *gpGlobals;
// Our modified version of the engine funcs, to give to plugins. // Our modified version of the engine funcs, to give to plugins.
extern meta_enginefuncs_t g_plugin_engfuncs; extern meta_enginefuncs_t g_plugin_engfuncs;
@ -103,7 +67,7 @@ extern MRegMsgList *g_regMsgs;
#ifdef UNFINISHED #ifdef UNFINISHED
// List of event/logline hooks requested by plugins. // List of event/logline hooks requested by plugins.
extern MHookList *Hooks; extern MHookList *Hooks;
#endif /* UNFINISHED */ #endif
// Data provided to plugins. // Data provided to plugins.
// Separate copies to prevent plugins from modifying "readable" parts. // Separate copies to prevent plugins from modifying "readable" parts.
@ -132,12 +96,12 @@ extern int requestid_counter;
// Max players is always 32, small enough that we can use a static array // Max players is always 32, small enough that we can use a static array
extern MPlayerList g_Players; extern MPlayerList g_Players;
void metamod_startup(void); void metamod_startup();
mBOOL meta_init_gamedll(void); mBOOL meta_init_gamedll();
mBOOL meta_load_gamedll(void); mBOOL meta_load_gamedll();
// ===== lotsa macros... ====================================================== // lotsa macros...
// These are the meat of the metamod processing, and are as ugly as (or // These are the meat of the metamod processing, and are as ugly as (or
// uglier) than they look. This is done via macros, because of the varying // uglier) than they look. This is done via macros, because of the varying
@ -192,16 +156,16 @@ mBOOL meta_load_gamedll(void);
// accept. Thus there are "_void" versions of the 5 macros; these are // accept. Thus there are "_void" versions of the 5 macros; these are
// listed first. // listed first.
// ===== macros for void-returning functions ================================== // macros for void-returning functions
// declare/init some variables // declare/init some variables
#define SETUP_API_CALLS_void(FN_TYPE, pfnName, api_info_table) \ #define SETUP_API_CALLS_void(FN_TYPE, pfnName, api_info_table) \
int i; \ int i; \
META_RES mres=MRES_UNSET, status=MRES_UNSET, prev_mres=MRES_UNSET; \ META_RES mres = MRES_UNSET, status = MRES_UNSET, prev_mres = MRES_UNSET; \
MPlugin *iplug; \ MPlugin *iplug; \
FN_TYPE pfn_routine=NULL; \ FN_TYPE pfn_routine = NULL; \
int loglevel=api_info_table.pfnName.loglevel; \ int loglevel = api_info_table.pfnName.loglevel; \
const char *pfn_string=api_info_table.pfnName.name; \ const char *pfn_string = api_info_table.pfnName.name; \
meta_globals_t backup_meta_globals; \ meta_globals_t backup_meta_globals; \
/* fix bug with metamod-bot-plugins (hullu)*/ \ /* fix bug with metamod-bot-plugins (hullu)*/ \
if (CALL_API_count++>0) \ if (CALL_API_count++>0) \
@ -210,12 +174,12 @@ mBOOL meta_load_gamedll(void);
// call each plugin // call each plugin
#define CALL_PLUGIN_API_void(post, pfnName, pfn_args, api_table) \ #define CALL_PLUGIN_API_void(post, pfnName, pfn_args, api_table) \
prev_mres=MRES_UNSET; \ prev_mres = MRES_UNSET; \
for(i=0; i < g_plugins->endlist; i++) { \ for (i = 0; i < g_plugins->endlist; i++) { \
iplug=&g_plugins->plist[i]; \ iplug = &g_plugins->plist[i]; \
if (iplug->status != PL_RUNNING) \ if (iplug->status != PL_RUNNING) \
continue; \ continue; \
if(iplug->api_table && (pfn_routine=iplug->api_table->pfnName)); \ if (iplug->api_table && (pfn_routine = iplug->api_table->pfnName)); \
else \ else \
/* plugin doesn't provide this function */ \ /* plugin doesn't provide this function */ \
continue; \ continue; \
@ -227,36 +191,36 @@ mBOOL meta_load_gamedll(void);
META_DEBUG(loglevel, ("Calling %s:%s%s()", iplug->file, pfn_string, (post?"_Post":""))); \ META_DEBUG(loglevel, ("Calling %s:%s%s()", iplug->file, pfn_string, (post?"_Post":""))); \
pfn_routine pfn_args; \ pfn_routine pfn_args; \
/* plugin's result code */ \ /* plugin's result code */ \
mres=PublicMetaGlobals.mres; \ mres = PublicMetaGlobals.mres; \
if(mres > status) \ if (mres > status) \
status = mres; \ status = mres; \
/* save this for successive plugins to see */ \ /* save this for successive plugins to see */ \
prev_mres = mres; \ prev_mres = mres; \
if(mres==MRES_UNSET) \ if (mres == MRES_UNSET) \
META_ERROR("Plugin didn't set meta_result: %s:%s%s()", iplug->file, pfn_string, (post?"_Post":"")); \ META_ERROR("Plugin didn't set meta_result: %s:%s%s()", iplug->file, pfn_string, (post?"_Post":"")); \
if(post && mres==MRES_SUPERCEDE) \ if (post && mres == MRES_SUPERCEDE) \
META_ERROR("MRES_SUPERCEDE not valid in Post functions: %s:%s%s()", iplug->file, pfn_string, (post?"_Post":"")); \ META_ERROR("MRES_SUPERCEDE not valid in Post functions: %s:%s%s()", iplug->file, pfn_string, (post?"_Post":"")); \
} }
// call "real" function, from gamedll // call "real" function, from gamedll
#define CALL_GAME_API_void(pfnName, pfn_args, api_table) \ #define CALL_GAME_API_void(pfnName, pfn_args, api_table) \
CALL_API_count--; \ CALL_API_count--; \
if(status==MRES_SUPERCEDE) { \ if (status == MRES_SUPERCEDE) { \
META_DEBUG(loglevel, ("Skipped (supercede) %s:%s()", GameDLL.file, pfn_string)); \ META_DEBUG(loglevel, ("Skipped (supercede) %s:%s()", GameDLL.file, pfn_string)); \
/* don't return here; superceded game routine, but still allow \ /* don't return here; superceded game routine, but still allow \
* _post routines to run. \ * _post routines to run. \
*/ \ */ \
} \ } \
else if(GameDLL.funcs.api_table) { \ else if (GameDLL.funcs.api_table) { \
pfn_routine=GameDLL.funcs.api_table->pfnName; \ pfn_routine = GameDLL.funcs.api_table->pfnName; \
if(pfn_routine) { \ if (pfn_routine) { \
META_DEBUG(loglevel, ("Calling %s:%s()", GameDLL.file, pfn_string)); \ META_DEBUG(loglevel, ("Calling %s:%s()", GameDLL.file, pfn_string)); \
pfn_routine pfn_args; \ pfn_routine pfn_args; \
} \ } \
/* don't complain for NULL routines in NEW_DLL_FUNCTIONS */ \ /* don't complain for NULL routines in NEW_DLL_FUNCTIONS */ \
else if((void*) GameDLL.funcs.api_table != (void*) GameDLL.funcs.newapi_table) { \ else if ((void *)GameDLL.funcs.api_table != (void *)GameDLL.funcs.newapi_table) { \
META_ERROR("Couldn't find api call: %s:%s", GameDLL.file, pfn_string); \ META_ERROR("Couldn't find api call: %s:%s", GameDLL.file, pfn_string); \
status=MRES_UNSET; \ status = MRES_UNSET; \
} \ } \
} \ } \
else { \ else { \
@ -267,21 +231,21 @@ mBOOL meta_load_gamedll(void);
// call "real" function, from engine // call "real" function, from engine
#define CALL_ENGINE_API_void(pfnName, pfn_args) \ #define CALL_ENGINE_API_void(pfnName, pfn_args) \
CALL_API_count--; \ CALL_API_count--; \
if(status==MRES_SUPERCEDE) { \ if (status == MRES_SUPERCEDE) { \
META_DEBUG(loglevel, ("Skipped (supercede) engine:%s()", pfn_string)); \ META_DEBUG(loglevel, ("Skipped (supercede) engine:%s()", pfn_string)); \
/* don't return here; superceded game routine, but still allow \ /* don't return here; superceded game routine, but still allow \
* _post routines to run. \ * _post routines to run. \
*/ \ */ \
} \ } \
else { \ else { \
pfn_routine=g_engine.funcs->pfnName; \ pfn_routine = g_engine.funcs->pfnName; \
if(pfn_routine) { \ if (pfn_routine) { \
META_DEBUG(loglevel, ("Calling engine:%s()", pfn_string)); \ META_DEBUG(loglevel, ("Calling engine:%s()", pfn_string)); \
pfn_routine pfn_args; \ pfn_routine pfn_args; \
} \ } \
else { \ else { \
META_ERROR("Couldn't find api call: engine:%s", pfn_string); \ META_ERROR("Couldn't find api call: engine:%s", pfn_string); \
status=MRES_UNSET; \ status = MRES_UNSET; \
} \ } \
} \ } \
CALL_API_count++; CALL_API_count++;
@ -294,21 +258,21 @@ mBOOL meta_load_gamedll(void);
return; return;
// ===== macros for type-returning functions ================================== // macros for type-returning functions
// declare/init some variables // declare/init some variables
#define SETUP_API_CALLS(ret_t, ret_init, FN_TYPE, pfnName, api_info_table) \ #define SETUP_API_CALLS(ret_t, ret_init, FN_TYPE, pfnName, api_info_table) \
int i; \ int i; \
ret_t dllret=ret_init; \ ret_t dllret = ret_init; \
ret_t override_ret=ret_init; \ ret_t override_ret = ret_init; \
ret_t pub_override_ret=ret_init; \ ret_t pub_override_ret = ret_init; \
ret_t orig_ret=ret_init; \ ret_t orig_ret = ret_init; \
ret_t pub_orig_ret=ret_init; \ ret_t pub_orig_ret = ret_init; \
META_RES mres=MRES_UNSET, status=MRES_UNSET, prev_mres=MRES_UNSET; \ META_RES mres = MRES_UNSET, status = MRES_UNSET, prev_mres = MRES_UNSET; \
MPlugin *iplug; \ MPlugin *iplug; \
FN_TYPE pfn_routine=NULL; \ FN_TYPE pfn_routine = NULL; \
int loglevel=api_info_table.pfnName.loglevel; \ int loglevel = api_info_table.pfnName.loglevel; \
const char *pfn_string=api_info_table.pfnName.name; \ const char *pfn_string = api_info_table.pfnName.name; \
meta_globals_t backup_meta_globals; \ meta_globals_t backup_meta_globals; \
/*Fix bug with metamod-bot-plugins*/ \ /*Fix bug with metamod-bot-plugins*/ \
if (CALL_API_count++>0) \ if (CALL_API_count++>0) \
@ -317,13 +281,13 @@ mBOOL meta_load_gamedll(void);
// call each plugin // call each plugin
#define CALL_PLUGIN_API(post, ret_init, pfnName, pfn_args, MRES_TYPE, api_table) \ #define CALL_PLUGIN_API(post, ret_init, pfnName, pfn_args, MRES_TYPE, api_table) \
override_ret=ret_init; \ override_ret = ret_init; \
prev_mres=MRES_UNSET; \ prev_mres = MRES_UNSET; \
for(i=0; i < g_plugins->endlist; i++) { \ for (i = 0; i < g_plugins->endlist; i++) { \
if (g_plugins->plist[i].status != PL_RUNNING) \ if (g_plugins->plist[i].status != PL_RUNNING) \
continue; \ continue; \
iplug=&g_plugins->plist[i]; \ iplug = &g_plugins->plist[i]; \
if(iplug->api_table && (pfn_routine=iplug->api_table->pfnName)); \ if (iplug->api_table && (pfn_routine = iplug->api_table->pfnName)); \
else \ else \
/* plugin doesn't provide this function */ \ /* plugin doesn't provide this function */ \
continue; \ continue; \
@ -333,31 +297,31 @@ mBOOL meta_load_gamedll(void);
PublicMetaGlobals.status = status; \ PublicMetaGlobals.status = status; \
pub_orig_ret = orig_ret; \ pub_orig_ret = orig_ret; \
PublicMetaGlobals.orig_ret = &pub_orig_ret; \ PublicMetaGlobals.orig_ret = &pub_orig_ret; \
if(status==MRES_TYPE) { \ if (status == MRES_TYPE) { \
pub_override_ret = override_ret; \ pub_override_ret = override_ret; \
PublicMetaGlobals.override_ret = &pub_override_ret; \ PublicMetaGlobals.override_ret = &pub_override_ret; \
} \ } \
/* call plugin */ \ /* call plugin */ \
META_DEBUG(loglevel, ("Calling %s:%s%s()", iplug->file, pfn_string, (post?"_Post":""))); \ META_DEBUG(loglevel, ("Calling %s:%s%s()", iplug->file, pfn_string, (post?"_Post":""))); \
dllret=pfn_routine pfn_args; \ dllret = pfn_routine pfn_args; \
/* plugin's result code */ \ /* plugin's result code */ \
mres=PublicMetaGlobals.mres; \ mres = PublicMetaGlobals.mres; \
if(mres > status) \ if (mres > status) \
status = mres; \ status = mres; \
/* save this for successive plugins to see */ \ /* save this for successive plugins to see */ \
prev_mres = mres; \ prev_mres = mres; \
if(mres==MRES_TYPE) \ if (mres == MRES_TYPE) \
override_ret = pub_override_ret = dllret; \ override_ret = pub_override_ret = dllret; \
else if(mres==MRES_UNSET) \ else if (mres == MRES_UNSET) \
META_ERROR("Plugin didn't set meta_result: %s:%s%s()", iplug->file, pfn_string, (post?"_Post":"")); \ META_ERROR("Plugin didn't set meta_result: %s:%s%s()", iplug->file, pfn_string, (post?"_Post":"")); \
else if(post && mres==MRES_SUPERCEDE) \ else if (post && mres == MRES_SUPERCEDE) \
META_ERROR("MRES_SUPERCEDE not valid in Post functions: %s:%s%s()", iplug->file, pfn_string, (post?"_Post":"")); \ META_ERROR("MRES_SUPERCEDE not valid in Post functions: %s:%s%s()", iplug->file, pfn_string, (post?"_Post":"")); \
} }
// call "real" function, from gamedll // call "real" function, from gamedll
#define CALL_GAME_API(pfnName, pfn_args, api_table) \ #define CALL_GAME_API(pfnName, pfn_args, api_table) \
CALL_API_count--; \ CALL_API_count--; \
if(status==MRES_SUPERCEDE) { \ if (status == MRES_SUPERCEDE) { \
META_DEBUG(loglevel, ("Skipped (supercede) %s:%s()", GameDLL.file, pfn_string)); \ META_DEBUG(loglevel, ("Skipped (supercede) %s:%s()", GameDLL.file, pfn_string)); \
orig_ret = pub_orig_ret = override_ret; \ orig_ret = pub_orig_ret = override_ret; \
PublicMetaGlobals.orig_ret = &pub_orig_ret; \ PublicMetaGlobals.orig_ret = &pub_orig_ret; \
@ -365,17 +329,17 @@ mBOOL meta_load_gamedll(void);
* _post routines to run. \ * _post routines to run. \
*/ \ */ \
} \ } \
else if(GameDLL.funcs.api_table) { \ else if (GameDLL.funcs.api_table) { \
pfn_routine=GameDLL.funcs.api_table->pfnName; \ pfn_routine = GameDLL.funcs.api_table->pfnName; \
if(pfn_routine) { \ if (pfn_routine) { \
META_DEBUG(loglevel, ("Calling %s:%s()", GameDLL.file, pfn_string)); \ META_DEBUG(loglevel, ("Calling %s:%s()", GameDLL.file, pfn_string)); \
dllret=pfn_routine pfn_args; \ dllret = pfn_routine pfn_args; \
orig_ret = dllret; \ orig_ret = dllret; \
} \ } \
/* don't complain for NULL routines in NEW_DLL_FUNCTIONS */ \ /* don't complain for NULL routines in NEW_DLL_FUNCTIONS */ \
else if((void*) GameDLL.funcs.api_table != (void*) GameDLL.funcs.newapi_table) { \ else if ((void *)GameDLL.funcs.api_table != (void *)GameDLL.funcs.newapi_table) { \
META_ERROR("Couldn't find api call: %s:%s", GameDLL.file, pfn_string); \ META_ERROR("Couldn't find api call: %s:%s", GameDLL.file, pfn_string); \
status=MRES_UNSET; \ status = MRES_UNSET; \
} \ } \
} \ } \
else { \ else { \
@ -386,7 +350,7 @@ mBOOL meta_load_gamedll(void);
// call "real" function, from engine // call "real" function, from engine
#define CALL_ENGINE_API(pfnName, pfn_args) \ #define CALL_ENGINE_API(pfnName, pfn_args) \
CALL_API_count--; \ CALL_API_count--; \
if(status==MRES_SUPERCEDE) { \ if (status == MRES_SUPERCEDE) { \
META_DEBUG(loglevel, ("Skipped (supercede) engine:%s()", pfn_string)); \ META_DEBUG(loglevel, ("Skipped (supercede) engine:%s()", pfn_string)); \
orig_ret = pub_orig_ret = override_ret; \ orig_ret = pub_orig_ret = override_ret; \
PublicMetaGlobals.orig_ret = &pub_orig_ret; \ PublicMetaGlobals.orig_ret = &pub_orig_ret; \
@ -395,15 +359,15 @@ mBOOL meta_load_gamedll(void);
*/ \ */ \
} \ } \
else { \ else { \
pfn_routine=g_engine.funcs->pfnName; \ pfn_routine = g_engine.funcs->pfnName; \
if(pfn_routine) { \ if (pfn_routine) { \
META_DEBUG(loglevel, ("Calling engine:%s()", pfn_string)); \ META_DEBUG(loglevel, ("Calling engine:%s()", pfn_string)); \
dllret=pfn_routine pfn_args; \ dllret = pfn_routine pfn_args; \
orig_ret = dllret; \ orig_ret = dllret; \
} \ } \
else { \ else { \
META_ERROR("Couldn't find api call: engine:%s", pfn_string); \ META_ERROR("Couldn't find api call: engine:%s", pfn_string); \
status=MRES_UNSET; \ status = MRES_UNSET; \
} \ } \
} \ } \
CALL_API_count++; CALL_API_count++;
@ -413,14 +377,9 @@ mBOOL meta_load_gamedll(void);
if (--CALL_API_count>0) \ if (--CALL_API_count>0) \
/*Restore backup*/ \ /*Restore backup*/ \
PublicMetaGlobals = backup_meta_globals; \ PublicMetaGlobals = backup_meta_globals; \
if(status==MRES_OVERRIDE) { \ if (status == MRES_OVERRIDE) { \
META_DEBUG(loglevel, ("Returning (override) %s()", pfn_string)); \ META_DEBUG(loglevel, ("Returning (override) %s()", pfn_string)); \
return(override_ret); \ return override_ret; \
} \ } \
else \ else \
return(orig_ret); return orig_ret;
// ===== end macros ===========================================================
#endif /* METAMOD_H */

File diff suppressed because it is too large Load Diff

View File

@ -1,90 +1,49 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// mlist.h - class and constants to describe a list of plugins
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef MLIST_H
#define MLIST_H
#include "types_meta.h" // mBOOL #include "types_meta.h" // mBOOL
#include "mplugin.h" // class MPlugin #include "mplugin.h" // class MPlugin
#include "plinfo.h" // plid_t, etc #include "plinfo.h" // plid_t, etc
// Max number of plugins we can manage. This is an arbitrary, fixed number, // Max number of plugins we can manage. This is an arbitrary, fixed number,
// for convenience. It would probably be better to dynamically grow the // for convenience. It would probably be better to dynamically grow the
// list as needed, but we do this for now. // list as needed, but we do this for now.
#define MAX_PLUGINS 50 #define MAX_PLUGINS 50
// Width required to printf above MAX, for show() functions. // Width required to printf above MAX, for show() functions.
#define WIDTH_MAX_PLUGINS 2 #define WIDTH_MAX_PLUGINS 2
// A list of plugins. // A list of plugins.
class MPluginList { class MPluginList {
public: public:
// data: MPluginList(const char *ifile);
char inifile[PATH_MAX]; // full pathname
MPlugin plist[MAX_PLUGINS]; // array of plugins
int size; // size of list, ie MAX_PLUGINS
int endlist; // index of last used entry
// constructor: MPlugin *find(int pindex); // find by index
MPluginList(const char *ifile); MPlugin *find(const char *findpath); // find by pathname
MPlugin *find(plid_t id); // find by plid_t
MPlugin *find_memloc(void *memptr); // find by memory location
MPlugin *find_match(const char *prefix); // find by partial prefix match
MPlugin *find_match(MPlugin *pmatch); // find by platform_match()
MPlugin *find(DLHANDLE handle); // find by handle
MPlugin *add(MPlugin *padd);
// functions: mBOOL found_child_plugins(int source_index);
MPlugin *find(int pindex); // find by index
MPlugin *find(const char *findpath); // find by pathname
MPlugin *find(plid_t id); // find by plid_t
MPlugin *find_memloc(void *memptr); // find by memory location
MPlugin *find_match(const char *prefix); // find by partial prefix match
MPlugin *find_match(MPlugin *pmatch); // find by platform_match()
MPlugin * find(DLHANDLE handle); // find by handle
MPlugin *add(MPlugin *padd);
mBOOL found_child_plugins(int source_index); mBOOL ini_startup(void); // read inifile at startup
mBOOL ini_refresh(void); // re-read inifile
mBOOL cmd_addload(const char *args); // load from console command
MPlugin *plugin_addload(plid_t plid, const char *fname, PLUG_LOADTIME now); //load from plugin
mBOOL ini_startup(void); // read inifile at startup mBOOL load(void); // load the list, at startup
mBOOL ini_refresh(void); // re-read inifile mBOOL refresh(PLUG_LOADTIME now); // update from re-read inifile
mBOOL cmd_addload(const char *args); // load from console command void unpause_all(void); // unpause any paused plugins
MPlugin *plugin_addload(plid_t plid, const char *fname, PLUG_LOADTIME now); //load from plugin void retry_all(PLUG_LOADTIME now); // retry any pending plugin actions
void show(int source_index = 0); // list plugins to console
void show_client(edict_t *pEntity); // list plugins to player client
void clear_source_plugin_index(int source_index);
mBOOL load(void); // load the list, at startup public:
mBOOL refresh(PLUG_LOADTIME now); // update from re-read inifile char inifile[PATH_MAX]; // full pathname
void unpause_all(void); // unpause any paused plugins MPlugin plist[MAX_PLUGINS]; // array of plugins
void retry_all(PLUG_LOADTIME now); // retry any pending plugin actions int size; // size of list, ie MAX_PLUGINS
void show(int source_index); // list plugins to console int endlist; // index of last used entry
void show_client(edict_t *pEntity); // list plugins to player client
void clear_source_plugin_index(int source_index);
}; };
#endif /* MLIST_H */

View File

@ -1,43 +1,5 @@
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// mplayer.cpp - methods of individual player (class MPlayer) and
// list of players (class MPlayerList).
/*
* Copyright (c) 2005 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#include "precompiled.h" #include "precompiled.h"
// Constructor
MPlayer::MPlayer() : isQueried(mFALSE) MPlayer::MPlayer() : isQueried(mFALSE)
{ {
} }
@ -45,64 +7,64 @@ MPlayer::MPlayer() : isQueried(mFALSE)
// Mark a player as querying a client cvar and stores the cvar name // Mark a player as querying a client cvar and stores the cvar name
// meta_errno values: // meta_errno values:
// - ME_ARGUMENT cvar is NULL // - ME_ARGUMENT cvar is NULL
void MPlayer::set_cvar_query(const char* cvar) void MPlayer::set_cvar_query(const char *cvar)
{ {
// Do not allow NULL as queried cvar since we use this as // Do not allow NULL as queried cvar since we use this as
// return value in is_querying_cvar as indication if a // return value in is_querying_cvar as indication if a
// client cvar is queried. // client cvar is queried.
if (!cvar) { if (!cvar)
{
meta_errno = ME_ARGUMENT; meta_errno = ME_ARGUMENT;
return; return;
} }
isQueried = mTRUE; isQueried = mTRUE;
strncpy(cvarName, cvar, sizeof cvarName - 1); Q_strncpy(cvarName, cvar, sizeof cvarName - 1);
cvarName[sizeof cvarName - 1] = '\0'; cvarName[sizeof cvarName - 1] = '\0';
} }
// Unmark player as querying a client cvar // Unmark player as querying a client cvar
void MPlayer::clear_cvar_query(const char* /*cvar*/) void MPlayer::clear_cvar_query(const char *cvar)
{ {
isQueried = mFALSE; isQueried = mFALSE;
cvarName[0] = '\0'; cvarName[0] = '\0';
} }
// Check if a client cvar is queried for this player // Check if a client cvar is queried for this player
// Returns NULL if not // Returns NULL if not
// or the name of the cvar. // or the name of the cvar.
const char* MPlayer::is_querying_cvar(void) const const char *MPlayer::is_querying_cvar(void) const
{ {
if (isQueried) { if (isQueried)
{
return cvarName; return cvarName;
} }
return NULL; return nullptr;
} }
// Mark a player as querying a client cvar and stores the cvar name // Mark a player as querying a client cvar and stores the cvar name
// meta_errno values: // meta_errno values:
// - ME_ARGUMENT cvar is NULL // - ME_ARGUMENT cvar is NULL
void MPlayerList::set_player_cvar_query(const edict_t* pEntity, const char* cvar) void MPlayerList::set_player_cvar_query(const edict_t *pEntity, const char *cvar)
{ {
int indx = ENTINDEX(pEntity); int indx = ENTINDEX(pEntity);
if (indx >= 1 && indx <= gpGlobals->maxClients)
if (indx >= 1 && indx <= maxplayers)
players[indx].set_cvar_query(cvar); players[indx].set_cvar_query(cvar);
} }
// Unmark player as querying a client cvar // Unmark player as querying a client cvar
void MPlayerList::clear_player_cvar_query(const edict_t* pEntity, const char* cvar) void MPlayerList::clear_player_cvar_query(const edict_t *pEntity, const char *cvar)
{ {
int indx = ENTINDEX(pEntity); int indx = ENTINDEX(pEntity);
if (indx >= 1 && indx <= gpGlobals->maxClients)
if (indx >= 1 && indx <= maxplayers)
players[indx].clear_cvar_query(cvar); players[indx].clear_cvar_query(cvar);
} }
void MPlayerList::clear_all_cvar_queries(void) void MPlayerList::clear_all_cvar_queries(void)
{ {
for (int indx = 1; indx <= maxplayers; indx++) { for (int indx = 1; indx <= gpGlobals->maxClients; indx++)
{
players[indx].clear_cvar_query(); players[indx].clear_cvar_query();
} }
} }
@ -112,11 +74,10 @@ void MPlayerList::clear_all_cvar_queries(void)
// or the name of the cvar. // or the name of the cvar.
// meta_errno values: // meta_errno values:
// - ME_NOTFOUND invalid entity // - ME_NOTFOUND invalid entity
const char* MPlayerList::is_querying_cvar(const edict_t* pEntity) const const char *MPlayerList::is_querying_cvar(const edict_t *pEntity) const
{ {
int indx = ENTINDEX(pEntity); int indx = ENTINDEX(pEntity);
if (indx >= 1 && indx <= gpGlobals->maxClients)
if (indx >= 1 && indx <= maxplayers)
return players[indx].is_querying_cvar(); return players[indx].is_querying_cvar();
RETURN_ERRNO(NULL, ME_NOTFOUND); RETURN_ERRNO(NULL, ME_NOTFOUND);

View File

@ -1,47 +1,6 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// mplayer.h - class to keep info about a player and a class listing all #include "types_meta.h"
// players
/*
* Copyright (c) 2005 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef INCLUDE_METAMOD_PLAYER_H
#define INCLUDE_METAMOD_PLAYER_H
#include "types_meta.h" // mBOOL
// Numbers of players limit set by the engine
#define MAX_PLAYERS 32
// Info on an individual player // Info on an individual player
class MPlayer class MPlayer
@ -49,13 +8,13 @@ class MPlayer
public: public:
MPlayer(); MPlayer();
void set_cvar_query(const char *cvar); // mark this player as querying a client cvar void set_cvar_query(const char *cvar); // mark this player as querying a client cvar
void clear_cvar_query(const char *cvar=NULL); // unmark this player as querying a client cvar void clear_cvar_query(const char *cvar = nullptr); // unmark this player as querying a client cvar
const char *is_querying_cvar(void) const; // check if a player is querying a cvar. returns const char *is_querying_cvar() const; // check if a player is querying a cvar. returns
private: private:
mBOOL isQueried; // is this player currently queried for a cvar value mBOOL isQueried; // is this player currently queried for a cvar value
char cvarName[64]; // name of the cvar if getting queried char cvarName[64]; // name of the cvar if getting queried
}; };
// A list of players. The number of max players is fixed and small enough // A list of players. The number of max players is fixed and small enough
@ -63,14 +22,12 @@ private:
class MPlayerList class MPlayerList
{ {
public: public:
void set_player_cvar_query(const edict_t *pEntity, const char *cvar); void set_player_cvar_query(const edict_t *pEntity, const char *cvar);
void clear_player_cvar_query(const edict_t *pEntity, const char *cvar=NULL); void clear_player_cvar_query(const edict_t *pEntity, const char *cvar = nullptr);
void clear_all_cvar_queries(void); void clear_all_cvar_queries();
const char *is_querying_cvar(const edict_t *pEntity) const; const char *is_querying_cvar(const edict_t *pEntity) const;
private: private:
int maxplayers = 32; int maxplayers = 32;
MPlayer players[MAX_PLAYERS + 1]; // array of players MPlayer players[MAX_CLIENTS + 1]; // array of players
}; };
#endif /* INCLUDE_METAMOD_PLAYER_H */

File diff suppressed because it is too large Load Diff

View File

@ -1,67 +1,24 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// mplugin.h - class and types to describe an individual plugin
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef MPLUGIN_H
#define MPLUGIN_H
#include <time.h> // time_t, etc
#include <eiface.h> // DLL_FUNCTIONS, etc
#include "types_meta.h" // mBOOL
#include "meta_api.h" // GETENTITYAPI_FN, etc
#include "api_info.h" // dllapi_info, etc
#include "support_meta.h" // MAX_DESC_LEN
#include "api_info.h"
#include "support_meta.h"
// Flags to indicate current "load" state of plugin. // Flags to indicate current "load" state of plugin.
// NOTE: order is important, as greater/less comparisons are made. // NOTE: order is important, as greater/less comparisons are made.
typedef enum { enum PLUG_STATUS
PL_EMPTY = 0, // empty slot {
PL_EMPTY = 0, // empty slot
PL_VALID, // has valid info in it PL_VALID, // has valid info in it
PL_BADFILE, // nonexistent file (open failed), PL_BADFILE, // nonexistent file (open failed), or not a valid plugin file (query failed)
// or not a valid plugin file (query failed)
PL_OPENED, // dlopened and queried PL_OPENED, // dlopened and queried
PL_FAILED, // opened, but failed to attach or unattach PL_FAILED, // opened, but failed to attach or unattach
PL_RUNNING, // attached and running PL_RUNNING, // attached and running
PL_PAUSED, // attached but paused PL_PAUSED, // attached but paused
} PLUG_STATUS; };
// Action to take for plugin at next opportunity. // Action to take for plugin at next opportunity.
typedef enum { enum PLUG_ACTION
{
PA_NULL = 0, PA_NULL = 0,
PA_NONE, // no action needed right now PA_NONE, // no action needed right now
PA_KEEP, // keep, after ini refresh PA_KEEP, // keep, after ini refresh
@ -69,138 +26,140 @@ typedef enum {
PA_ATTACH, // attach PA_ATTACH, // attach
PA_UNLOAD, // unload (detach, dlclose) PA_UNLOAD, // unload (detach, dlclose)
PA_RELOAD, // unload and load again PA_RELOAD, // unload and load again
} PLUG_ACTION; };
// Flags to indicate from where the plugin was loaded. // Flags to indicate from where the plugin was loaded.
typedef enum { enum PLOAD_SOURCE
{
PS_INI = 0, // was loaded from the plugins.ini PS_INI = 0, // was loaded from the plugins.ini
PS_CMD, // was loaded via a server command PS_CMD, // was loaded via a server command
PS_PLUGIN, // was loaded via a plugin PS_PLUGIN, // was loaded by other plugin
} PLOAD_SOURCE; };
// Flags for how to word description of plugin loadtime. // Flags for how to word description of plugin loadtime.
typedef enum { enum STR_LOADTIME
SL_SIMPLE = 0, // single word {
SL_SIMPLE = 0, // single word
SL_SHOW, // for "show" output, 5 chars SL_SHOW, // for "show" output, 5 chars
SL_ALLOWED, // when plugin is allowed to load/unload SL_ALLOWED, // when plugin is allowed to load/unload
SL_NOW, // current situation SL_NOW, // current situation
} STR_LOADTIME; };
// Flags for how to format description of status. // Flags for how to format description of status.
typedef enum { enum STR_STATUS
ST_SIMPLE = 0, // single word {
ST_SIMPLE = 0, // single word
ST_SHOW, // for "show" output, 4 chars ST_SHOW, // for "show" output, 4 chars
} STR_STATUS; };
// Flags for how to format description of action. // Flags for how to format description of action.
typedef enum { enum STR_ACTION
SA_SIMPLE = 0, // single word {
SA_SIMPLE = 0, // single word
SA_SHOW, // for "show" output, 4 chars SA_SHOW, // for "show" output, 4 chars
} STR_ACTION; };
// Flags for how to format description of source. // Flags for how to format description of source.
typedef enum { enum STR_SOURCE
SO_SIMPLE = 0, // two words {
SO_SIMPLE = 0, // two words
SO_SHOW, // for "list" output, 3 chars SO_SHOW, // for "list" output, 3 chars
} STR_SOURCE; };
// An individual plugin. // An individual plugin.
class MPlugin { class MPlugin {
private: private:
mBOOL query(void); mBOOL query();
mBOOL attach(PLUG_LOADTIME now); mBOOL attach(PLUG_LOADTIME now);
mBOOL detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason); mBOOL detach(PLUG_LOADTIME now, PL_UNLOAD_REASON reason);
gamedll_funcs_t gamedll_funcs; gamedll_funcs_t gamedll_funcs;
mutil_funcs_t mutil_funcs; mutil_funcs_t mutil_funcs;
public:
// data:
int index; // 1-based
char filename[PATH_MAX]; // ie "dlls/mm_test_i386.so", from inifile
char *file; // ie "mm_test_i386.so", ptr from filename
char desc[MAX_DESC_LEN]; // ie "Test metamod plugin", from inifile
char pathname[PATH_MAX]; // UNIQUE, ie "/home/willday/half-life/cstrike/dlls/mm_test_i386.so", built with GameDLL.gamedir
int pfspecific; // level of specific platform affinity, used during load time
PLUG_STATUS status; // current status of plugin (loaded, etc)
PLUG_ACTION action; // what to do with plugin (load, unload, etc)
PLOAD_SOURCE source; // source of the request to load the plugin
DLHANDLE handle; // handle for dlopen, dlsym, etc public:
plugin_info_t *info; // information plugin provides about itself int index; // 1-based
time_t time_loaded; // when plugin was loaded char filename[PATH_MAX]; // ie "dlls/mm_test_i386.so", from inifile
int source_plugin_index; // who loaded this plugin char *file; // ie "mm_test_i386.so", ptr from filename
int unloader_index; char desc[MAX_DESC_LEN]; // ie "Test metamod plugin", from inifile
mBOOL is_unloader; // fix to prevent other plugins unload active unloader. char pathname[PATH_MAX]; // UNIQUE, ie "/home/willday/half-life/cstrike/dlls/mm_test_i386.so", built with GameDLL.gamedir
int pfspecific; // level of specific platform affinity, used during load time
PLUG_STATUS status; // current status of plugin (loaded, etc)
PLUG_ACTION action; // what to do with plugin (load, unload, etc)
PLOAD_SOURCE source; // source of the request to load the plugin
DLL_FUNCTIONS *dllapi_table; DLHANDLE handle; // handle for dlopen, dlsym, etc
DLL_FUNCTIONS *dllapi_post_table; plugin_info_t *info; // information plugin provides about itself
NEW_DLL_FUNCTIONS *newapi_table; time_t time_loaded; // when plugin was loaded
NEW_DLL_FUNCTIONS *newapi_post_table; int source_plugin_index; // who loaded this plugin
enginefuncs_t *engine_table; int unloader_index;
enginefuncs_t *engine_post_table; mBOOL is_unloader; // fix to prevent other plugins unload active unloader.
// functions: DLL_FUNCTIONS *dllapi_table;
DLL_FUNCTIONS *dllapi_post_table;
NEW_DLL_FUNCTIONS *newapi_table;
NEW_DLL_FUNCTIONS *newapi_post_table;
enginefuncs_t *engine_table;
enginefuncs_t *engine_post_table;
mBOOL ini_parseline(char *line); // parse line from inifile mBOOL ini_parseline(char *line); // parse line from inifile
mBOOL cmd_parseline(const char *line); // parse from console command mBOOL cmd_parseline(const char *line); // parse from console command
mBOOL plugin_parseline(const char *fname, int loader_index); // parse from plugin mBOOL plugin_parseline(const char *fname, int loader_index); // parse from plugin
mBOOL check_input(void); mBOOL check_input();
mBOOL resolve(void); // find a matching file on disk mBOOL resolve(); // find a matching file on disk
char *resolve_dirs(char *path); char *resolve_dirs(char *path);
char *resolve_prefix(char *path); char *resolve_prefix(char *path);
char *resolve_suffix(char *path); char *resolve_suffix(char *path);
mBOOL platform_match(MPlugin* plugin); mBOOL platform_match(MPlugin* plugin);
mBOOL load(PLUG_LOADTIME now); mBOOL load(PLUG_LOADTIME now);
mBOOL unload(PLUG_LOADTIME now, PL_UNLOAD_REASON reason, PL_UNLOAD_REASON real_reason); mBOOL unload(PLUG_LOADTIME now, PL_UNLOAD_REASON reason, PL_UNLOAD_REASON real_reason);
mBOOL reload(PLUG_LOADTIME now, PL_UNLOAD_REASON reason); mBOOL reload(PLUG_LOADTIME now, PL_UNLOAD_REASON reason);
mBOOL pause(void); mBOOL pause();
mBOOL unpause(void); mBOOL unpause();
mBOOL retry(PLUG_LOADTIME now, PL_UNLOAD_REASON reason); // if previously failed mBOOL retry(PLUG_LOADTIME now, PL_UNLOAD_REASON reason); // if previously failed
mBOOL clear(void); mBOOL clear();
mBOOL plugin_unload(plid_t plid, PLUG_LOADTIME now, PL_UNLOAD_REASON reason); // other plugin unloading mBOOL plugin_unload(plid_t plid, PLUG_LOADTIME now, PL_UNLOAD_REASON reason); // other plugin unloading
void show(void); // print info about plugin to console void show(); // print info about plugin to console
mBOOL newer_file(void); // check for newer file on disk mBOOL newer_file(); // check for newer file on disk
// output string functions const char *str_status(STR_STATUS fmt);
const char *str_status(STR_STATUS fmt); const char *str_action(STR_ACTION fmt);
const char *str_action(STR_ACTION fmt); const char *str_source(STR_SOURCE fmt);
const char *str_source(STR_SOURCE fmt);
const char *str_reason(PL_UNLOAD_REASON preason, PL_UNLOAD_REASON preal_reason); const char *str_reason(PL_UNLOAD_REASON preason, PL_UNLOAD_REASON preal_reason);
const char *str_loadtime(PLUG_LOADTIME pallow, STR_LOADTIME fmt); const char *str_loadtime(PLUG_LOADTIME pallow, STR_LOADTIME fmt);
const char *str_status(void) { return(str_status(ST_SIMPLE)); }; const char *str_status() { return str_status(ST_SIMPLE); };
const char *str_action(void) { return(str_action(SA_SIMPLE)); }; const char *str_action() { return str_action(SA_SIMPLE); };
const char *str_source(void) { return(str_source(SO_SIMPLE)); }; const char *str_source() { return str_source(SO_SIMPLE); };
const char *str_loadable(void) { const char *str_loadable() {
if(info) return(str_loadtime(info->loadable, SL_SIMPLE)); if (info) return str_loadtime(info->loadable, SL_SIMPLE);
else return(" -"); else return " -";
}; };
const char *str_unloadable(void) { const char *str_unloadable() {
if(info) return(str_loadtime(info->unloadable, SL_SIMPLE)); if (info) return str_loadtime(info->unloadable, SL_SIMPLE);
else return(" -"); else return " -";
}; };
const char *str_loadable(STR_LOADTIME fmt) { const char *str_loadable(STR_LOADTIME fmt) {
if(info) return(str_loadtime(info->loadable, fmt)); if (info) return str_loadtime(info->loadable, fmt);
else return(" -"); else return " -";
}; };
const char *str_unloadable(STR_LOADTIME fmt) { const char *str_unloadable(STR_LOADTIME fmt) {
if(info) return(str_loadtime(info->unloadable, fmt)); if (info) return str_loadtime(info->unloadable, fmt);
else return(" -"); else return " -";
}; };
}; };
// Macros used by MPlugin::show(), to list the functions that the plugin // Macros used by MPlugin::show(), to list the functions that the plugin
// catches. // catches.
#define SHOW_IFDEF(api_table, info_table, pfnName, pre_str, post_str) \ #define SHOW_IFDEF(api_table, info_table, pfnName, pre_str, post_str) \
if(api_table->pfnName) { META_CONS("%s%s%s", pre_str, info_table.pfnName.name, post_str); n++;} if (api_table->pfnName) { META_CONS("%s%s%s", pre_str, info_table.pfnName.name, post_str); n++;}
#define SHOW_DEF_DLLAPI(api_table, pre_str, post_str) \ #define SHOW_DEF_DLLAPI(api_table, pre_str, post_str) \
n=0; \ n = 0; \
SHOW_IFDEF(api_table, dllapi_info, pfnGameInit, pre_str, post_str); \ SHOW_IFDEF(api_table, dllapi_info, pfnGameInit, pre_str, post_str); \
SHOW_IFDEF(api_table, dllapi_info, pfnSpawn, pre_str, post_str); \ SHOW_IFDEF(api_table, dllapi_info, pfnSpawn, pre_str, post_str); \
SHOW_IFDEF(api_table, dllapi_info, pfnThink, pre_str, post_str); \ SHOW_IFDEF(api_table, dllapi_info, pfnThink, pre_str, post_str); \
@ -253,14 +212,14 @@ class MPlugin {
SHOW_IFDEF(api_table, dllapi_info, pfnAllowLagCompensation, pre_str, post_str); SHOW_IFDEF(api_table, dllapi_info, pfnAllowLagCompensation, pre_str, post_str);
#define SHOW_DEF_NEWAPI(api_table, pre_str, post_str) \ #define SHOW_DEF_NEWAPI(api_table, pre_str, post_str) \
n=0; \ n = 0; \
SHOW_IFDEF(api_table, newapi_info, pfnOnFreeEntPrivateData, pre_str, post_str); \ SHOW_IFDEF(api_table, newapi_info, pfnOnFreeEntPrivateData, pre_str, post_str); \
SHOW_IFDEF(api_table, newapi_info, pfnGameShutdown, pre_str, post_str); \ SHOW_IFDEF(api_table, newapi_info, pfnGameShutdown, pre_str, post_str); \
SHOW_IFDEF(api_table, newapi_info, pfnShouldCollide, pre_str, post_str); \ SHOW_IFDEF(api_table, newapi_info, pfnShouldCollide, pre_str, post_str); \
SHOW_IFDEF(api_table, newapi_info, pfnCvarValue, pre_str, post_str); SHOW_IFDEF(api_table, newapi_info, pfnCvarValue, pre_str, post_str);
#define SHOW_DEF_ENGINE(api_table, pre_str, post_str) \ #define SHOW_DEF_ENGINE(api_table, pre_str, post_str) \
n=0; \ n = 0; \
SHOW_IFDEF(api_table, engine_info, pfnPrecacheModel, pre_str, post_str); \ SHOW_IFDEF(api_table, engine_info, pfnPrecacheModel, pre_str, post_str); \
SHOW_IFDEF(api_table, engine_info, pfnPrecacheSound, pre_str, post_str); \ SHOW_IFDEF(api_table, engine_info, pfnPrecacheSound, pre_str, post_str); \
SHOW_IFDEF(api_table, engine_info, pfnSetModel, pre_str, post_str); \ SHOW_IFDEF(api_table, engine_info, pfnSetModel, pre_str, post_str); \
@ -418,6 +377,3 @@ class MPlugin {
SHOW_IFDEF(api_table, engine_info, pfnResetTutorMessageDecayData, pre_str, post_str); \ SHOW_IFDEF(api_table, engine_info, pfnResetTutorMessageDecayData, pre_str, post_str); \
SHOW_IFDEF(api_table, engine_info, pfnQueryClientCvarValue, pre_str, post_str); \ SHOW_IFDEF(api_table, engine_info, pfnQueryClientCvarValue, pre_str, post_str); \
SHOW_IFDEF(api_table, engine_info, pfnEngCheckParm, pre_str, post_str); SHOW_IFDEF(api_table, engine_info, pfnEngCheckParm, pre_str, post_str);
#endif /* MPLUGIN_H */

View File

@ -1,50 +1,5 @@
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// mreg.cpp - functions for registered items (classes MRegCmd, MRegCmdList)
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#include "precompiled.h" #include "precompiled.h"
#ifdef linux
// enable extra routines in system header files, like strsignal
# ifndef _GNU_SOURCE
# define _GNU_SOURCE
# endif
#endif /* linux */
///// class MRegCmd:
// Init values. It would probably be more "proper" to use containers and // Init values. It would probably be more "proper" to use containers and
// constructors, rather than arrays and init-functions. // constructors, rather than arrays and init-functions.
void MRegCmd::init(int idx) void MRegCmd::init(int idx)
@ -62,54 +17,56 @@ void MRegCmd::init(int idx)
// meta_errno values: // meta_errno values:
// - ME_BADREQ function disabled/invalid // - ME_BADREQ function disabled/invalid
// - ME_ARGUMENT function pointer is null // - ME_ARGUMENT function pointer is null
mBOOL MRegCmd::call(void) mBOOL MRegCmd::call()
{ {
mBOOL ret; mBOOL ret;
// can we expect to call this function? // can we expect to call this function?
if (status != RG_VALID) if (status != RG_VALID)
RETURN_ERRNO(mFALSE, ME_BADREQ); RETURN_ERRNO(mFALSE, ME_BADREQ);
if (!pfnCmd) if (!pfnCmd)
RETURN_ERRNO(mFALSE, ME_ARGUMENT); RETURN_ERRNO(mFALSE, ME_ARGUMENT);
// try to call this function // try to call this function
ret = os_safe_call(pfnCmd); ret = os_safe_call(pfnCmd);
if (!ret) { if (!ret)
{
META_DEBUG(4, ("Plugin reg_cmd '%s' called after unloaded; removed from list", name)); META_DEBUG(4, ("Plugin reg_cmd '%s' called after unloaded; removed from list", name));
status = RG_INVALID; status = RG_INVALID;
pfnCmd = NULL; pfnCmd = NULL;
// NOTE: we can't free the malloc'd space for the name, as that // NOTE: we can't free the malloc'd space for the name, as that
// would just re-introduce the segfault problem.. // would just re-introduce the segfault problem..
} }
// meta_errno (if failed) is set already in os_safe_call() // meta_errno (if failed) is set already in os_safe_call()
return (ret); return ret;
} }
MRegCmdList::MRegCmdList()
///// class MRegCmdList:
// Constructor
MRegCmdList::MRegCmdList(void)
: mlist(0), size(REG_CMD_GROWSIZE), endlist(0) : mlist(0), size(REG_CMD_GROWSIZE), endlist(0)
{ {
int i; int i;
mlist = (MRegCmd *) malloc(size * sizeof(MRegCmd)); mlist = (MRegCmd *)Q_malloc(size * sizeof(MRegCmd));
// initialize array // initialize array
for (i = 0; i < size; i++) for (i = 0; i < size; i++)
mlist[i].init(i + 1); // 1-based index mlist[i].init(i + 1); // 1-based index
endlist = 0; endlist = 0;
} }
// Try to find a registered function with the given name. // Try to find a registered function with the given name.
// meta_errno values: // meta_errno values:
// - ME_NOTFOUND couldn't find a matching function // - ME_NOTFOUND couldn't find a matching function
MRegCmd* MRegCmdList::find(const char* findname) MRegCmd *MRegCmdList::find(const char *findname)
{ {
int i; for (int i = 0; i < endlist; i++)
for (i = 0; i < endlist; i++) { {
if (!_stricmp(mlist[i].name, findname)) if (!Q_stricmp(mlist[i].name, findname))
return (&mlist[i]); return &mlist[i];
} }
RETURN_ERRNO(NULL, ME_NOTFOUND); RETURN_ERRNO(NULL, ME_NOTFOUND);
} }
@ -118,121 +75,128 @@ MRegCmd* MRegCmdList::find(const char* findname)
// (meta_AddServerCommand). // (meta_AddServerCommand).
// meta_errno values: // meta_errno values:
// - ME_NOMEM couldn't realloc or malloc for various parts // - ME_NOMEM couldn't realloc or malloc for various parts
MRegCmd* MRegCmdList::add(const char* addname) MRegCmd *MRegCmdList::add(const char *addname)
{ {
MRegCmd* icmd; if (endlist == size)
{
if (endlist == size) {
// grow array // grow array
MRegCmd* temp; int newsize = size + REG_CMD_GROWSIZE;
int i, newsize;
newsize = size + REG_CMD_GROWSIZE;
META_DEBUG(6, ("Growing reg cmd list from %d to %d", size, newsize)); META_DEBUG(6, ("Growing reg cmd list from %d to %d", size, newsize));
temp = (MRegCmd *) realloc(mlist, newsize * sizeof(MRegCmd));
if (!temp) { MRegCmd *temp = (MRegCmd *) realloc(mlist, newsize * sizeof(MRegCmd));
if (!temp)
{
META_ERROR("Couldn't grow registered command list to %d for '%s': %s", newsize, addname, strerror(errno)); META_ERROR("Couldn't grow registered command list to %d for '%s': %s", newsize, addname, strerror(errno));
RETURN_ERRNO(NULL, ME_NOMEM); RETURN_ERRNO(NULL, ME_NOMEM);
} }
mlist = temp; mlist = temp;
size = newsize; size = newsize;
// initialize new (unused) entries // initialize new (unused) entries
for (i = endlist; i < size; i++) for (int i = endlist; i < size; i++)
mlist[i].init(i + 1); // 1-based mlist[i].init(i + 1); // 1-based
} }
icmd = &mlist[endlist];
MRegCmd *icmd = &mlist[endlist];
// Malloc space separately for the command name, because: // Malloc space separately for the command name, because:
// - Can't point to memory loc in plugin (another segv waiting to // - Can't point to memory loc in plugin (another segv waiting to
// happen). // happen).
// - Can't point to memory in mlist which might get moved later by // - Can't point to memory in mlist which might get moved later by
// realloc (again, segv). // realloc (again, segv).
icmd->name = _strdup(addname); icmd->name = Q_strdup(addname);
if (!icmd->name) { if (!icmd->name)
META_ERROR("Couldn't _strdup for adding reg cmd name '%s': %s", {
addname, strerror(errno)); META_ERROR("Couldn't Q_strdup for adding reg cmd name '%s': %s", addname, strerror(errno));
RETURN_ERRNO(NULL, ME_NOMEM); RETURN_ERRNO(NULL, ME_NOMEM);
} }
endlist++;
return (icmd); endlist++;
return icmd;
} }
// Disable any functions belonging to the given plugin (by index id). // Disable any functions belonging to the given plugin (by index id).
void MRegCmdList::disable(int plugin_id) void MRegCmdList::disable(int plugin_id)
{ {
int i; for (int i = 0; i < size; i++)
for (i = 0; i < size; i++) { {
if (mlist[i].plugid == plugin_id) if (mlist[i].plugid == plugin_id)
mlist[i].status = RG_INVALID; mlist[i].status = RG_INVALID;
} }
} }
// List all the registered commands. // List all the registered commands.
void MRegCmdList::show(void) void MRegCmdList::show()
{ {
int i, n = 0, a = 0; int n = 0, a = 0;
MRegCmd* icmd; MRegCmd *icmd;
MPlugin* iplug; MPlugin *iplug;
char bplug[18 + 1]; // +1 for term null char bplug[18 + 1]; // +1 for term null
META_CONS("Registered plugin commands:"); META_CONS("Registered plugin commands:");
META_CONS(" %*s %-*s %-s", META_CONS(" %*s %-*s %-s", WIDTH_MAX_REG, "", sizeof(bplug) - 1, "plugin", "command");
WIDTH_MAX_REG, "", for (int i = 0; i < endlist; i++)
sizeof(bplug) - 1, "plugin", "command"); {
for (i = 0; i < endlist; i++) {
icmd = &mlist[i]; icmd = &mlist[i];
if (icmd->status == RG_VALID) { if (icmd->status == RG_VALID)
{
iplug = g_plugins->find(icmd->plugid); iplug = g_plugins->find(icmd->plugid);
if (iplug) { if (iplug)
strncpy(bplug, iplug->desc, sizeof bplug - 1); {
Q_strncpy(bplug, iplug->desc, sizeof bplug - 1);
bplug[sizeof bplug - 1] = '\0'; bplug[sizeof bplug - 1] = '\0';
} }
else { else
strncpy(bplug, "(unknown)", sizeof bplug - 1); {
Q_strncpy(bplug, "(unknown)", sizeof bplug - 1);
bplug[sizeof bplug - 1] = '\0'; bplug[sizeof bplug - 1] = '\0';
} }
} }
else { else
strncpy(bplug, "(unloaded)", sizeof bplug - 1); {
Q_strncpy(bplug, "(unloaded)", sizeof bplug - 1);
bplug[sizeof bplug - 1] = '\0'; bplug[sizeof bplug - 1] = '\0';
} }
META_CONS(" [%*d] %-*s %-s",
WIDTH_MAX_REG, icmd->index, META_CONS(" [%*d] %-*s %-s", WIDTH_MAX_REG, icmd->index, sizeof(bplug) - 1, bplug, icmd->name);
sizeof(bplug) - 1, bplug, if (icmd->status == RG_VALID)
icmd->name); a++;
if (icmd->status == RG_VALID) a++;
n++; n++;
} }
META_CONS("%d commands, %d available (%d allocated)", n, a, size); META_CONS("%d commands, %d available (%d allocated)", n, a, size);
} }
// List all the registered commands for the given plugin id. // List all the registered commands for the given plugin id.
void MRegCmdList::show(int plugin_id) void MRegCmdList::show(int plugin_id)
{ {
int i, n = 0; int n = 0;
MRegCmd* icmd; MRegCmd *icmd;
// If OS doesn't support DLFNAME, then we can't know what the plugin's // If OS doesn't support DLFNAME, then we can't know what the plugin's
// registered cvars are. // registered cvars are.
DLFNAME(NULL); DLFNAME(NULL);
if (meta_errno == ME_OSNOTSUP) { if (meta_errno == ME_OSNOTSUP)
{
META_CONS("Registered commands: unknown (can't get info under this OS)"); META_CONS("Registered commands: unknown (can't get info under this OS)");
return; return;
} }
META_CONS("Registered commands:"); META_CONS("Registered commands:");
for (i = 0; i < endlist; i++) { for (int i = 0; i < endlist; i++)
{
icmd = &mlist[i]; icmd = &mlist[i];
if (icmd->plugid != plugin_id) if (icmd->plugid != plugin_id)
continue; continue;
META_CONS(" %s", icmd->name); META_CONS(" %s", icmd->name);
n++; n++;
} }
META_CONS("%d commands", n); META_CONS("%d commands", n);
} }
///// class MRegCvar:
// Init values. It would probably be more "proper" to use containers and // Init values. It would probably be more "proper" to use containers and
// constructors, rather than arrays and init-functions. // constructors, rather than arrays and init-functions.
void MRegCvar::init(int idx) void MRegCvar::init(int idx)
@ -246,34 +210,33 @@ void MRegCvar::init(int idx)
// Set the cvar, copying values from given cvar. // Set the cvar, copying values from given cvar.
// meta_errno values: // meta_errno values:
// - ME_ARGUMENT given cvar doesn't match this cvar // - ME_ARGUMENT given cvar doesn't match this cvar
mBOOL MRegCvar::set(cvar_t* src) mBOOL MRegCvar::set(cvar_t *src)
{ {
if (_stricmp(src->name, data->name)) { if (Q_stricmp(src->name, data->name))
META_ERROR("Tried to set cvar with mismatched name; src=%s dst=%s", {
src->name, data->name); META_ERROR("Tried to set cvar with mismatched name; src=%s dst=%s", src->name, data->name);
RETURN_ERRNO(mFALSE, ME_ARGUMENT); RETURN_ERRNO(mFALSE, ME_ARGUMENT);
} }
// Would like to free() existing string, but can't tell where it was // Would like to free() existing string, but can't tell where it was
// allocated... // allocated...
data->string = _strdup(src->string); data->string = Q_strdup(src->string);
data->flags = src->flags; data->flags = src->flags;
data->value = src->value; data->value = src->value;
data->next = src->next; data->next = src->next;
return (mTRUE); return mTRUE;
} }
///// class MRegCvarList:
// Constructor // Constructor
MRegCvarList::MRegCvarList(void) MRegCvarList::MRegCvarList()
: vlist(0), size(REG_CVAR_GROWSIZE), endlist(0) : vlist(0), size(REG_CVAR_GROWSIZE), endlist(0)
{ {
int i; vlist = (MRegCvar *)Q_malloc(size * sizeof(MRegCvar));
vlist = (MRegCvar *) malloc(size * sizeof(MRegCvar));
// initialize array // initialize array
for (i = 0; i < size; i++) for (int i = 0; i < size; i++)
vlist[i].init(i + 1); // 1-based vlist[i].init(i + 1); // 1 - based
endlist = 0; endlist = 0;
} }
@ -282,25 +245,25 @@ MRegCvarList::MRegCvarList(void)
// cvar::set(). // cvar::set().
// meta_errno values: // meta_errno values:
// - ME_NOMEM couldn't alloc or realloc for various parts // - ME_NOMEM couldn't alloc or realloc for various parts
MRegCvar* MRegCvarList::add(const char* addname) MRegCvar *MRegCvarList::add(const char *addname)
{ {
MRegCvar* icvar; MRegCvar *icvar;
if (endlist == size)
if (endlist == size) { {
// grow array // grow array
MRegCvar* temp; int newsize = size + REG_CVAR_GROWSIZE;
int i, newsize;
newsize = size + REG_CVAR_GROWSIZE;
META_DEBUG(6, ("Growing reg cvar list from %d to %d", size, newsize)); META_DEBUG(6, ("Growing reg cvar list from %d to %d", size, newsize));
temp = (MRegCvar *) realloc(vlist, newsize * sizeof(MRegCvar)); MRegCvar *temp = (MRegCvar *) realloc(vlist, newsize * sizeof(MRegCvar));
if (!temp) { if (!temp)
{
META_ERROR("Couldn't grow registered cvar list to %d for '%s'; %s", newsize, addname, strerror(errno)); META_ERROR("Couldn't grow registered cvar list to %d for '%s'; %s", newsize, addname, strerror(errno));
RETURN_ERRNO(NULL, ME_NOMEM); RETURN_ERRNO(NULL, ME_NOMEM);
} }
vlist = temp; vlist = temp;
size = newsize; size = newsize;
// initialize new (unused) entries // initialize new (unused) entries
for (i = endlist; i < size; i++) for (int i = endlist; i < size; i++)
vlist[i].init(i + 1); // 1-based vlist[i].init(i + 1); // 1-based
} }
@ -311,33 +274,34 @@ MRegCvar* MRegCvarList::add(const char* addname)
// happen). // happen).
// - Can't point to memory in vlist which might get moved later by // - Can't point to memory in vlist which might get moved later by
// realloc (again, segv). // realloc (again, segv).
icvar->data = (cvar_t *) malloc(sizeof(cvar_t)); icvar->data = (cvar_t *)Q_malloc(sizeof(cvar_t));
if (!icvar->data) { if (!icvar->data)
META_ERROR("Couldn't malloc cvar for adding reg cvar name '%s': %s", {
addname, strerror(errno)); META_ERROR("Couldn't malloc cvar for adding reg cvar name '%s': %s", addname, strerror(errno));
RETURN_ERRNO(NULL, ME_NOMEM); RETURN_ERRNO(NULL, ME_NOMEM);
} }
icvar->data->name = _strdup(addname);
if (!icvar->data->name) { icvar->data->name = Q_strdup(addname);
META_ERROR("Couldn't _strdup for adding reg cvar name '%s': %s", if (!icvar->data->name)
addname, strerror(errno)); {
META_ERROR("Couldn't Q_strdup for adding reg cvar name '%s': %s", addname, strerror(errno));
RETURN_ERRNO(NULL, ME_NOMEM); RETURN_ERRNO(NULL, ME_NOMEM);
} }
endlist++; endlist++;
return icvar;
return (icvar);
} }
// Try to find a registered cvar with the given name. // Try to find a registered cvar with the given name.
// meta_errno values: // meta_errno values:
// - ME_NOTFOUND couldn't find a matching cvar // - ME_NOTFOUND couldn't find a matching cvar
MRegCvar* MRegCvarList::find(const char* findname) MRegCvar *MRegCvarList::find(const char *findname)
{ {
int i; for (int i = 0; i < endlist; i++)
for (i = 0; i < endlist; i++) { {
if (!_stricmp(vlist[i].data->name, findname)) if (!_stricmp(vlist[i].data->name, findname))
return (&vlist[i]); return &vlist[i];
} }
RETURN_ERRNO(NULL, ME_NOTFOUND); RETURN_ERRNO(NULL, ME_NOTFOUND);
} }
@ -345,10 +309,12 @@ MRegCvar* MRegCvarList::find(const char* findname)
void MRegCvarList::disable(int plugin_id) void MRegCvarList::disable(int plugin_id)
{ {
int i; int i;
MRegCvar* icvar; MRegCvar *icvar;
for (i = 0; i < size; i++) { for (i = 0; i < size; i++)
{
icvar = &vlist[i]; icvar = &vlist[i];
if (icvar->plugid == plugin_id) { if (icvar->plugid == plugin_id)
{
icvar->status = RG_INVALID; icvar->status = RG_INVALID;
icvar->plugid = 0; icvar->plugid = 0;
// Decided not to do this, in order to keep pre-existing values // Decided not to do this, in order to keep pre-existing values
@ -359,48 +325,46 @@ void MRegCvarList::disable(int plugin_id)
} }
// List all the registered cvars. // List all the registered cvars.
void MRegCvarList::show(void) void MRegCvarList::show()
{ {
int i, n = 0, a = 0; int i, n = 0, a = 0;
MRegCvar* icvar; MRegCvar *icvar;
MPlugin* iplug; MPlugin *iplug;
char bplug[13 + 1], bname[20 + 1], bval[15 + 1]; // +1 for term null char bplug[13 + 1], bname[20 + 1], bval[15 + 1]; // +1 for term null
META_CONS("Registered plugin cvars:"); META_CONS("Registered plugin cvars:");
META_CONS(" %*s %-*s %-*s %*s %s", META_CONS(" %*s %-*s %-*s %*s %s", WIDTH_MAX_REG, "", sizeof(bplug) - 1, "plugin", sizeof(bname) - 1, "cvar", sizeof(bval) - 1, "float value", "string value");
WIDTH_MAX_REG, "", for (i = 0; i < endlist; i++)
sizeof(bplug) - 1, "plugin", {
sizeof(bname) - 1, "cvar",
sizeof(bval) - 1, "float value",
"string value");
for (i = 0; i < endlist; i++) {
icvar = &vlist[i]; icvar = &vlist[i];
if (icvar->status == RG_VALID) { if (icvar->status == RG_VALID)
{
iplug = g_plugins->find(icvar->plugid); iplug = g_plugins->find(icvar->plugid);
if (iplug) { if (iplug)
strncpy(bplug, iplug->desc, sizeof bplug - 1); {
Q_strncpy(bplug, iplug->desc, sizeof bplug - 1);
bplug[sizeof bplug - 1] = '\0'; bplug[sizeof bplug - 1] = '\0';
} }
else { else
strncpy(bplug, "(unknown)", sizeof bplug - 1); {
Q_strncpy(bplug, "(unknown)", sizeof bplug - 1);
bplug[sizeof bplug - 1] = '\0'; bplug[sizeof bplug - 1] = '\0';
} }
} }
else { else
strncpy(bplug, "(unloaded)", sizeof bplug - 1); {
Q_strncpy(bplug, "(unloaded)", sizeof bplug - 1);
bplug[sizeof bplug - 1] = '\0'; bplug[sizeof bplug - 1] = '\0';
} }
strncpy(bname, icvar->data->name, sizeof bname - 1); Q_strncpy(bname, icvar->data->name, sizeof bname - 1);
bname[sizeof bname - 1] = '\0'; bname[sizeof bname - 1] = '\0';
snprintf(bval, sizeof(bval), "%f", icvar->data->value); Q_snprintf(bval, sizeof(bval), "%f", icvar->data->value);
META_CONS(" [%*d] %-*s %-*s %*s %s", META_CONS(" [%*d] %-*s %-*s %*s %s", WIDTH_MAX_REG, icvar->index, sizeof(bplug) - 1, bplug, sizeof(bname) - 1, bname, sizeof(bval) - 1, bval, icvar->data->string);
WIDTH_MAX_REG, icvar->index,
sizeof(bplug) - 1, bplug, if (icvar->status == RG_VALID)
sizeof(bname) - 1, bname, a++;
sizeof(bval) - 1, bval,
icvar->data->string);
if (icvar->status == RG_VALID) a++;
n++; n++;
} }
META_CONS("%d cvars, %d available (%d allocated)", n, a, size); META_CONS("%d cvars, %d available (%d allocated)", n, a, size);
@ -409,68 +373,63 @@ void MRegCvarList::show(void)
// List the registered cvars for the given plugin id. // List the registered cvars for the given plugin id.
void MRegCvarList::show(int plugin_id) void MRegCvarList::show(int plugin_id)
{ {
int i, n = 0; int n = 0;
MRegCvar* icvar; MRegCvar *icvar;
char bname[30 + 1], bval[15 + 1]; // +1 for term null char bname[30 + 1], bval[15 + 1]; // +1 for term null
// If OS doesn't support DLFNAME, then we can't know what the plugin's // If OS doesn't support DLFNAME, then we can't know what the plugin's
// registered cvars are. // registered cvars are.
DLFNAME(NULL); DLFNAME(NULL);
if (meta_errno == ME_OSNOTSUP) { if (meta_errno == ME_OSNOTSUP)
{
META_CONS("Registered cvars: unknown (can't get info under this OS)"); META_CONS("Registered cvars: unknown (can't get info under this OS)");
return; return;
} }
META_CONS("%-*s %*s %s",
sizeof(bname) - 1, "Registered cvars:", META_CONS("%-*s %*s %s", sizeof(bname) - 1, "Registered cvars:", sizeof(bval) - 1, "float value", "string value");
sizeof(bval) - 1, "float value", for (int i = 0; i < endlist; i++)
"string value"); {
for (i = 0; i < endlist; i++) {
icvar = &vlist[i]; icvar = &vlist[i];
if (icvar->plugid != plugin_id) if (icvar->plugid != plugin_id)
continue; continue;
strncpy(bname, icvar->data->name, sizeof bname - 1);
Q_strncpy(bname, icvar->data->name, sizeof bname - 1);
bname[sizeof bname - 1] = '\0'; bname[sizeof bname - 1] = '\0';
snprintf(bval, sizeof(bval), "%f", icvar->data->value); Q_snprintf(bval, sizeof(bval), "%f", icvar->data->value);
META_CONS(" %-*s %*s %s", META_CONS(" %-*s %*s %s", sizeof(bname) - 1, bname, sizeof(bval) - 1, bval, icvar->data->string);
sizeof(bname) - 1, bname,
sizeof(bval) - 1, bval,
icvar->data->string);
n++; n++;
} }
META_CONS("%d cvars", n); META_CONS("%d cvars", n);
} }
///// class MRegMsgList:
// Constructor // Constructor
MRegMsgList::MRegMsgList(void) MRegMsgList::MRegMsgList()
: size(MAX_REG_MSGS), endlist(0) : size(MAX_REG_MSGS), endlist(0)
{ {
int i;
// initialize array // initialize array
memset(mlist, 0, sizeof(mlist)); Q_memset(mlist, 0, sizeof(mlist));
for (i = 0; i < size; i++) { for (int i = 0; i < size; i++)
{
mlist[i].index = i + 1; // 1-based mlist[i].index = i + 1; // 1-based
} }
endlist = 0; endlist = 0;
} }
// Add the given user msg the list and return the instance. // Add the given user msg the list and return the instance.
// meta_errno values: // meta_errno values:
// - ME_MAXREACHED reached max number of msgs allowed // - ME_MAXREACHED reached max number of msgs allowed
MRegMsg* MRegMsgList::add(const char* addname, int addmsgid, int addsize) MRegMsg *MRegMsgList::add(const char *addname, int addmsgid, int addsize)
{ {
MRegMsg* imsg; if (endlist == size)
{
if (endlist == size) {
// all slots used // all slots used
META_ERROR("Couldn't add registered msg '%s' to list; reached max msgs (%d)", META_ERROR("Couldn't add registered msg '%s' to list; reached max msgs (%d)", addname, size);
addname, size);
RETURN_ERRNO(NULL, ME_MAXREACHED); RETURN_ERRNO(NULL, ME_MAXREACHED);
} }
imsg = &mlist[endlist]; MRegMsg *imsg = &mlist[endlist];
endlist++; endlist++;
// Copy msg data into empty slot. // Copy msg data into empty slot.
@ -480,54 +439,54 @@ MRegMsg* MRegMsgList::add(const char* addname, int addmsgid, int addsize)
imsg->msgid = addmsgid; imsg->msgid = addmsgid;
imsg->size = addsize; imsg->size = addsize;
return (imsg); return imsg;
} }
// Try to find a registered msg with the given name. // Try to find a registered msg with the given name.
// meta_errno values: // meta_errno values:
// - ME_NOTFOUND couldn't find a matching cvar // - ME_NOTFOUND couldn't find a matching cvar
MRegMsg* MRegMsgList::find(const char* findname) MRegMsg *MRegMsgList::find(const char *findname)
{ {
int i; for (int i = 0; i < endlist; i++)
for (i = 0; i < endlist; i++) { {
if (!strcmp(mlist[i].name, findname)) if (!Q_strcmp(mlist[i].name, findname))
return (&mlist[i]); return &mlist[i];
} }
RETURN_ERRNO(NULL, ME_NOTFOUND); RETURN_ERRNO(NULL, ME_NOTFOUND);
} }
// Try to find a registered msg with the given msgid. // Try to find a registered msg with the given msgid.
// meta_errno values: // meta_errno values:
// - ME_NOTFOUND couldn't find a matching cvar // - ME_NOTFOUND couldn't find a matching cvar
MRegMsg* MRegMsgList::find(int findmsgid) MRegMsg *MRegMsgList::find(int findmsgid)
{ {
int i; for (int i = 0; i < endlist; i++)
for (i = 0; i < endlist; i++) { {
if (mlist[i].msgid == findmsgid) if (mlist[i].msgid == findmsgid)
return (&mlist[i]); return &mlist[i];
} }
RETURN_ERRNO(NULL, ME_NOTFOUND); RETURN_ERRNO(NULL, ME_NOTFOUND);
} }
// List the registered usermsgs for the gamedll. // List the registered usermsgs for the gamedll.
void MRegMsgList::show(void) void MRegMsgList::show()
{ {
int i, n = 0; int i, n = 0;
MRegMsg* imsg; MRegMsg *imsg;
char bname[25 + 1]; // +1 for term null char bname[25 + 1]; // +1 for term null
META_CONS("%-*s %5s %5s", META_CONS("%-*s %5s %5s", sizeof(bname) - 1, "Game registered user msgs:", "msgid", "size");
sizeof(bname) - 1, "Game registered user msgs:", "msgid", "size"); for (i = 0; i < endlist; i++)
for (i = 0; i < endlist; i++) { {
imsg = &mlist[i]; imsg = &mlist[i];
strncpy(bname, imsg->name, sizeof bname - 1);
Q_strncpy(bname, imsg->name, sizeof bname - 1);
bname[sizeof bname - 1] = '\0'; bname[sizeof bname - 1] = '\0';
META_CONS(" %-*s %3d %3d", META_CONS(" %-*s %3d %3d", sizeof(bname) - 1, bname, imsg->msgid, imsg->size);
sizeof(bname) - 1, bname,
imsg->msgid,
imsg->size);
n++; n++;
} }
META_CONS("%d game user msgs", n); META_CONS("%d game user msgs", n);
} }

View File

@ -1,53 +1,15 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// mreg.h - description of registered items (classes MRegCmd, MRegCmdList)
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef MREG_H
#define MREG_H
#include "types_meta.h" // mBOOL #include "types_meta.h" // mBOOL
// Number of entries to add to reglists when they need to grow. Typically // Number of entries to add to reglists when they need to grow. Typically
// more cvars than commands, so we grow them at different increments. // more cvars than commands, so we grow them at different increments.
#define REG_CMD_GROWSIZE 32 #define REG_CMD_GROWSIZE 32
#define REG_CVAR_GROWSIZE 64 #define REG_CVAR_GROWSIZE 64
// Width required to printf a Reg*List index number, for show() functions. // Width required to printf a Reg*List index number, for show() functions.
// This used to correspond to the number of digits in MAX_REG, which was a // This used to correspond to the number of digits in MAX_REG, which was a
// fixed, compile-time limit. However, now that the reg lists are grown // fixed, compile-time limit. However, now that the reg lists are grown
// dynamically, this has less strong correspondance to list sizes. So for // dynamically, this has less strong correspondance to list sizes. So for
// the moment, it reflects what one might normally expect to be the max // the moment, it reflects what one might normally expect to be the max
// width needed to print an index number; 4 allows 9999 (which is a damn // width needed to print an index number; 4 allows 9999 (which is a damn
// lot, if you ask me). // lot, if you ask me).
@ -57,130 +19,113 @@
#define MAX_REG_MSGS 256 #define MAX_REG_MSGS 256
// Flags to indicate if given cvar or func is part of a loaded plugin. // Flags to indicate if given cvar or func is part of a loaded plugin.
typedef enum { enum REG_STATUS { RG_INVALID, RG_VALID };
RG_INVALID,
RG_VALID,
} REG_STATUS;
// Pointer to function registered by AddServerCommand. // Pointer to function registered by AddServerCommand.
typedef void (*REG_CMD_FN) (void); typedef void (*REG_CMD_FN)();
// An individual registered function/command. // An individual registered function/command.
class MRegCmd { class MRegCmd {
public:
friend class MRegCmdList; friend class MRegCmdList;
private:
// data:
int index; // 1-based
public:
char *name; // space is malloc'd
REG_CMD_FN pfnCmd; // pointer to the function
int plugid; // index id of corresponding plugin
REG_STATUS status; // whether corresponding plugin is loaded
// functions:
void init(int idx); // init values, as not using constructors
mBOOL call(void); // try to call the function
};
char *name; // space is malloc'd
REG_CMD_FN pfnCmd; // pointer to the function
int plugid; // index id of corresponding plugin
REG_STATUS status; // whether corresponding plugin is loaded
void init(int idx); // init values, as not using constructors
mBOOL call(); // try to call the function
private:
int index; // 1-based
};
// A list of registered commands. // A list of registered commands.
class MRegCmdList { class MRegCmdList {
private: public:
// data: MRegCmdList();
MRegCmd *mlist; // malloc'd array of registered commands
int size; // current size of list
int endlist; // index of last used entry
// Private; to satisfy -Weffc++ "has pointer data members but does
// not override" copy/assignment constructor.
void operator=(const MRegCmdList &src);
MRegCmdList(const MRegCmdList &src);
public: MRegCmd *find(const char *findname); // find by MRegCmd->name
// constructor: MRegCmd *add(const char *addname);
MRegCmdList(void); void disable(int plugin_id); // change status to Invalid
void show(); // list all funcs to console
void show(int plugin_id); // list given plugin's funcs to console
// functions: private:
MRegCmd *find(const char *findname); // find by MRegCmd->name MRegCmd *mlist; // malloc'd array of registered commands
MRegCmd *add(const char *addname); int size; // current size of list
void disable(int plugin_id); // change status to Invalid int endlist; // index of last used entry
void show(void); // list all funcs to console
void show(int plugin_id); // list given plugin's funcs to console // Private; to satisfy -Weffc++ "has pointer data members but does
// not override" copy/assignment constructor.
void operator=(const MRegCmdList &src);
MRegCmdList(const MRegCmdList &src);
}; };
// An individual registered cvar. // An individual registered cvar.
class MRegCvar { class MRegCvar {
public:
friend class MRegCvarList; friend class MRegCvarList;
private:
// data:
int index; // 1-based
public:
cvar_t *data; // actual cvar structure, malloc'd
int plugid; // index id of corresponding plugin
REG_STATUS status; // whether corresponding plugin is loaded
// functions:
void init(int idx); // init values, as not using constructors
mBOOL set(cvar_t *src);
};
cvar_t *data; // actual cvar structure, malloc'd
int plugid; // index id of corresponding plugin
REG_STATUS status; // whether corresponding plugin is loaded
void init(int idx); // init values, as not using constructors
mBOOL set(cvar_t *src);
private:
int index; // 1-based
};
// A list of registered cvars. // A list of registered cvars.
class MRegCvarList { class MRegCvarList {
private:
// data:
MRegCvar *vlist; // malloc'd array of registered cvars
int size; // size of list, ie MAX_REG_CVARS
int endlist; // index of last used entry
// Private; to satisfy -Weffc++ "has pointer data members but does
// not override" copy/assignment constructor.
void operator=(const MRegCvarList &src);
MRegCvarList(const MRegCvarList &src);
public: public:
// constructor: MRegCvarList();
MRegCvarList(void);
// functions: MRegCvar *add(const char *addname);
MRegCvar *add(const char *addname); MRegCvar *find(const char *findname); // find by MRegCvar->data.name
MRegCvar *find(const char *findname); // find by MRegCvar->data.name void disable(int plugin_id); // change status to Invalid
void disable(int plugin_id); // change status to Invalid void show(); // list all cvars to console
void show(void); // list all cvars to console void show(int plugin_id); // list given plugin's cvars to console
void show(int plugin_id); // list given plugin's cvars to console
private:
MRegCvar *vlist; // malloc'd array of registered cvars
int size; // size of list, ie MAX_REG_CVARS
int endlist; // index of last used entry
// Private; to satisfy -Weffc++ "has pointer data members but does
// not override" copy/assignment constructor.
void operator=(const MRegCvarList &src);
MRegCvarList(const MRegCvarList &src);
}; };
// An individual registered user msg, from gamedll. // An individual registered user msg, from gamedll.
class MRegMsg { class MRegMsg {
public:
friend class MRegMsgList; friend class MRegMsgList;
private:
// data:
int index; // 1-based
public:
const char *name; // name, assumed constant string in gamedll
int msgid; // msgid, assigned by engine
int size; // size, if given by gamedll
};
const char *name; // name, assumed constant string in gamedll
int msgid; // msgid, assigned by engine
int size; // size, if given by gamedll
private:
int index; // 1-based
};
// A list of registered user msgs. // A list of registered user msgs.
class MRegMsgList { class MRegMsgList {
private: public:
// data: MRegMsgList();
MRegMsg mlist[MAX_REG_MSGS]; // array of registered msgs
int size; // size of list, ie MAX_REG_MSGS
int endlist; // index of last used entry
public: MRegMsg *add(const char *addname, int addmsgid, int addsize);
// constructor: MRegMsg *find(const char *findname);
MRegMsgList(void); MRegMsg *find(int findmsgid);
void show(); // list all msgs to console
// functions: private:
MRegMsg *add(const char *addname, int addmsgid, int addsize); MRegMsg mlist[MAX_REG_MSGS]; // array of registered msgs
MRegMsg *find(const char *findname); int size; // size of list, ie MAX_REG_MSGS
MRegMsg *find(int findmsgid); int endlist; // index of last used entry
void show(void); // list all msgs to console
}; };
#endif /* MREG_H */

View File

@ -1,39 +1,3 @@
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// mutil.cpp - utility functions to provide to plugins
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#include "precompiled.h" #include "precompiled.h"
hudtextparms_t default_csay_tparms = { hudtextparms_t default_csay_tparms = {
@ -46,19 +10,20 @@ hudtextparms_t default_csay_tparms = {
}; };
// Log to console; newline added. // Log to console; newline added.
void mutil_LogConsole(plid_t /* plid */, const char* fmt, ...) void mutil_LogConsole(plid_t plid, const char *fmt, ...)
{ {
va_list ap; va_list ap;
char buf[MAX_LOGMSG_LEN]; char buf[MAX_LOGMSG_LEN];
unsigned int len; unsigned int len;
va_start(ap, fmt); va_start(ap, fmt);
vsnprintf(buf, sizeof(buf), fmt, ap); Q_vsnprintf(buf, sizeof(buf), fmt, ap);
va_end(ap); va_end(ap);
// end msg with newline // end msg with newline
len = strlen(buf); len = Q_strlen(buf);
if (len < sizeof(buf) - 2) // -1 null, -1 for newline if (len < sizeof(buf) - 2) // -1 null, -1 for newline
strcat(buf, "\n"); Q_strcat(buf, "\n");
else else
buf[len - 1] = '\n'; buf[len - 1] = '\n';
@ -66,29 +31,27 @@ void mutil_LogConsole(plid_t /* plid */, const char* fmt, ...)
} }
// Log regular message to logs; newline added. // Log regular message to logs; newline added.
void mutil_LogMessage(plid_t plid, const char* fmt, ...) void mutil_LogMessage(plid_t plid, const char *fmt, ...)
{ {
va_list ap; va_list ap;
char buf[MAX_LOGMSG_LEN]; char buf[MAX_LOGMSG_LEN];
plugin_info_t* plinfo; plugin_info_t *plinfo = (plugin_info_t *)plid;
plinfo = (plugin_info_t *)plid;
va_start(ap, fmt); va_start(ap, fmt);
vsnprintf(buf, sizeof(buf), fmt, ap); Q_vsnprintf(buf, sizeof(buf), fmt, ap);
va_end(ap); va_end(ap);
ALERT(at_logged, "[%s] %s\n", plinfo->logtag, buf); ALERT(at_logged, "[%s] %s\n", plinfo->logtag, buf);
} }
// Log an error message to logs; newline added. // Log an error message to logs; newline added.
void mutil_LogError(plid_t plid, const char* fmt, ...) void mutil_LogError(plid_t plid, const char *fmt, ...)
{ {
va_list ap; va_list ap;
char buf[MAX_LOGMSG_LEN]; char buf[MAX_LOGMSG_LEN];
plugin_info_t* plinfo; plugin_info_t *plinfo = (plugin_info_t *)plid;
plinfo = (plugin_info_t *)plid;
va_start(ap, fmt); va_start(ap, fmt);
vsnprintf(buf, sizeof(buf), fmt, ap); Q_vsnprintf(buf, sizeof(buf), fmt, ap);
va_end(ap); va_end(ap);
ALERT(at_logged, "[%s] ERROR: %s\n", plinfo->logtag, buf); ALERT(at_logged, "[%s] ERROR: %s\n", plinfo->logtag, buf);
} }
@ -105,7 +68,7 @@ void mutil_LogDeveloper(plid_t plid, const char* fmt, ...)
plinfo = (plugin_info_t *)plid; plinfo = (plugin_info_t *)plid;
va_start(ap, fmt); va_start(ap, fmt);
vsnprintf(buf, sizeof(buf), fmt, ap); Q_vsnprintf(buf, sizeof(buf), fmt, ap);
va_end(ap); va_end(ap);
ALERT(at_logged, "[%s] dev: %s\n", plinfo->logtag, buf); ALERT(at_logged, "[%s] dev: %s\n", plinfo->logtag, buf);
} }
@ -131,17 +94,17 @@ void mutil_CenterSayParms(plid_t plid, hudtextparms_t tparms, const char* fmt, .
// Print a center-message, with text parameters and varargs. Provides // Print a center-message, with text parameters and varargs. Provides
// functionality to the above center_say interfaces. // functionality to the above center_say interfaces.
void mutil_CenterSayVarargs(plid_t plid, hudtextparms_t tparms, void mutil_CenterSayVarargs(plid_t plid, hudtextparms_t tparms, const char* fmt, va_list ap)
const char* fmt, va_list ap)
{ {
char buf[MAX_LOGMSG_LEN]; char buf[MAX_LOGMSG_LEN];
int n; int n;
edict_t* pEntity; edict_t *pEntity;
vsnprintf(buf, sizeof(buf), fmt, ap); Q_vsnprintf(buf, sizeof(buf), fmt, ap);
mutil_LogMessage(plid, "(centersay) %s", buf); mutil_LogMessage(plid, "(centersay) %s", buf);
for (n = 1; n <= gpGlobals->maxClients; n++) { for (n = 1; n <= gpGlobals->maxClients; n++)
{
pEntity = INDEXENT(n); pEntity = INDEXENT(n);
if (FNullEnt(pEntity) || pEntity->free) if (FNullEnt(pEntity) || pEntity->free)
continue; continue;
@ -152,104 +115,101 @@ void mutil_CenterSayVarargs(plid_t plid, hudtextparms_t tparms,
// Allow plugins to call the entity functions in the GameDLL. In // Allow plugins to call the entity functions in the GameDLL. In
// particular, calling "player()" as needed by most Bots. Suggested by // particular, calling "player()" as needed by most Bots. Suggested by
// Jussi Kivilinna. // Jussi Kivilinna.
qboolean mutil_CallGameEntity(plid_t plid, const char* entStr, entvars_t* pev) qboolean mutil_CallGameEntity(plid_t plid, const char *entStr, entvars_t *pev)
{ {
plugin_info_t* plinfo; plugin_info_t *plinfo = (plugin_info_t *)plid;
ENTITY_FN pfnEntity; META_DEBUG(8, ("Looking up game entity '%s' for plugin '%s'", entStr, plinfo->name));
ENTITY_FN pfnEntity = (ENTITY_FN) DLSYM(GameDLL.handle, entStr);
plinfo = (plugin_info_t *)plid; if (!pfnEntity)
META_DEBUG(8, ("Looking up game entity '%s' for plugin '%s'", entStr, {
plinfo->name));
pfnEntity = (ENTITY_FN) DLSYM(GameDLL.handle, entStr);
if (!pfnEntity) {
META_ERROR("Couldn't find game entity '%s' in game DLL '%s' for plugin '%s'", entStr, GameDLL.name, plinfo->name); META_ERROR("Couldn't find game entity '%s' in game DLL '%s' for plugin '%s'", entStr, GameDLL.name, plinfo->name);
return (false); return false;
} }
META_DEBUG(7, ("Calling game entity '%s' for plugin '%s'", entStr,
plinfo->name)); META_DEBUG(7, ("Calling game entity '%s' for plugin '%s'", entStr, plinfo->name));
(*pfnEntity)(pev); (*pfnEntity)(pev);
return (true); return true;
} }
// Find a usermsg, registered by the gamedll, with the corresponding // Find a usermsg, registered by the gamedll, with the corresponding
// msgname, and return remaining info about it (msgid, size). // msgname, and return remaining info about it (msgid, size).
int mutil_GetUserMsgID(plid_t plid, const char* msgname, int* size) int mutil_GetUserMsgID(plid_t plid, const char* msgname, int* size)
{ {
plugin_info_t* plinfo; plugin_info_t *plinfo = (plugin_info_t *)plid;
MRegMsg* umsg; META_DEBUG(8, ("Looking up usermsg name '%s' for plugin '%s'", msgname, plinfo->name));
plinfo = (plugin_info_t *)plid; MRegMsg *umsg = g_regMsgs->find(msgname);
META_DEBUG(8, ("Looking up usermsg name '%s' for plugin '%s'", msgname, if (umsg)
plinfo->name)); {
umsg = g_regMsgs->find(msgname);
if (umsg) {
if (size) if (size)
*size = umsg->size; *size = umsg->size;
return (umsg->msgid); return umsg->msgid;
} }
else else
return (0); return 0;
} }
// Find a usermsg, registered by the gamedll, with the corresponding // Find a usermsg, registered by the gamedll, with the corresponding
// msgid, and return remaining info about it (msgname, size). // msgid, and return remaining info about it (msgname, size).
const char* mutil_GetUserMsgName(plid_t plid, int msgid, int* size) const char* mutil_GetUserMsgName(plid_t plid, int msgid, int *size)
{ {
plugin_info_t* plinfo; plugin_info_t *plinfo = (plugin_info_t *)plid;
MRegMsg* umsg; META_DEBUG(8, ("Looking up usermsg id '%d' for plugin '%s'", msgid, plinfo->name));
plinfo = (plugin_info_t *)plid;
META_DEBUG(8, ("Looking up usermsg id '%d' for plugin '%s'", msgid,
plinfo->name));
// Guess names for any built-in g_engine messages mentioned in the SDK; // Guess names for any built-in g_engine messages mentioned in the SDK;
// from dlls/util.h. // from dlls/util.h.
if (msgid < 64) { if (msgid < 64)
switch (msgid) { {
switch (msgid)
{
case SVC_TEMPENTITY: case SVC_TEMPENTITY:
if (size) *size = -1; if (size) *size = -1;
return ("tempentity?"); return "tempentity?";
case SVC_INTERMISSION: case SVC_INTERMISSION:
if (size) *size = -1; if (size) *size = -1;
return ("intermission?"); return "intermission?";
case SVC_CDTRACK: case SVC_CDTRACK:
if (size) *size = -1; if (size) *size = -1;
return ("cdtrack?"); return "cdtrack?";
case SVC_WEAPONANIM: case SVC_WEAPONANIM:
if (size) *size = -1; if (size) *size = -1;
return ("weaponanim?"); return "weaponanim?";
case SVC_ROOMTYPE: case SVC_ROOMTYPE:
if (size) *size = -1; if (size) *size = -1;
return ("roomtype?"); return "roomtype?";
case SVC_DIRECTOR: case SVC_DIRECTOR:
if (size) *size = -1; if (size) *size = -1;
return ("director?"); return "director?";
} }
} }
umsg = g_regMsgs->find(msgid);
if (umsg) { MRegMsg *umsg = g_regMsgs->find(msgid);
if (umsg)
{
if (size) if (size)
*size = umsg->size; *size = umsg->size;
// 'name' is assumed to be a constant string, allocated in the // 'name' is assumed to be a constant string, allocated in the
// gamedll. // gamedll.
return (umsg->name); return umsg->name;
} }
else else
return (NULL); return NULL;
} }
// Return the full path of the plugin's loaded dll/so file. // Return the full path of the plugin's loaded dll/so file.
const char* mutil_GetPluginPath(plid_t plid) const char* mutil_GetPluginPath(plid_t plid)
{ {
static char buf[PATH_MAX ]; static char buf[PATH_MAX ];
MPlugin* plug; MPlugin *plug;
plug = g_plugins->find(plid); plug = g_plugins->find(plid);
if (!plug) { if (!plug)
META_ERROR("GetPluginPath: couldn't find plugin '%s'", {
plid->name); META_ERROR("GetPluginPath: couldn't find plugin '%s'", plid->name);
return (NULL); return NULL;
} }
strncpy(buf, plug->pathname, sizeof buf - 1);
Q_strncpy(buf, plug->pathname, sizeof buf - 1);
buf[sizeof buf - 1] = '\0'; buf[sizeof buf - 1] = '\0';
return buf; return buf;
} }
@ -258,8 +218,9 @@ const char* mutil_GetPluginPath(plid_t plid)
const char* mutil_GetGameInfo(plid_t plid, ginfo_t type) const char* mutil_GetGameInfo(plid_t plid, ginfo_t type)
{ {
static char buf[MAX_STRBUF_LEN]; static char buf[MAX_STRBUF_LEN];
const char* cp; const char *cp;
switch (type) { switch (type)
{
case GINFO_NAME: case GINFO_NAME:
cp = GameDLL.name; cp = GameDLL.name;
break; break;
@ -279,43 +240,47 @@ const char* mutil_GetGameInfo(plid_t plid, ginfo_t type)
cp = GameDLL.real_pathname; cp = GameDLL.real_pathname;
break; break;
default: default:
META_ERROR("GetGameInfo: invalid request '%d' from plugin '%s'", META_ERROR("GetGameInfo: invalid request '%d' from plugin '%s'", type, plid->name);
type, plid->name); return NULL;
return (NULL);
} }
strncpy(buf, cp, sizeof buf - 1);
Q_strncpy(buf, cp, sizeof buf - 1);
buf[sizeof buf - 1] = '\0'; buf[sizeof buf - 1] = '\0';
return buf; return buf;
} }
int mutil_LoadMetaPlugin(plid_t plid, const char* fname, PLUG_LOADTIME now, void** plugin_handle) int mutil_LoadMetaPlugin(plid_t plid, const char* fname, PLUG_LOADTIME now, void **plugin_handle)
{ {
MPlugin* pl_loaded; MPlugin *pl_loaded;
if (!fname)
if (NULL == fname) { {
return ME_ARGUMENT; return ME_ARGUMENT;
} }
meta_errno = ME_NOERROR; meta_errno = ME_NOERROR;
if (! (pl_loaded = g_plugins->plugin_addload(plid, fname, now))) { if (!(pl_loaded = g_plugins->plugin_addload(plid, fname, now)))
{
if (plugin_handle) if (plugin_handle)
*plugin_handle = NULL; *plugin_handle = nullptr;
return meta_errno; return meta_errno;
} }
else { else
{
if (plugin_handle) if (plugin_handle)
*plugin_handle = (void *)pl_loaded->handle; *plugin_handle = (void *)pl_loaded->handle;
return 0; return 0;
} }
} }
int mutil_UnloadMetaPlugin(plid_t plid, const char* fname, PLUG_LOADTIME now, PL_UNLOAD_REASON reason) int mutil_UnloadMetaPlugin(plid_t plid, const char *fname, PLUG_LOADTIME now, PL_UNLOAD_REASON reason)
{ {
MPlugin* findp = NULL; MPlugin *findp = nullptr;
int pindex; int pindex;
char* endptr; char *endptr;
if (NULL == fname) { if (!fname)
{
return ME_ARGUMENT; return ME_ARGUMENT;
} }
@ -336,11 +301,12 @@ int mutil_UnloadMetaPlugin(plid_t plid, const char* fname, PLUG_LOADTIME now, PL
return meta_errno; return meta_errno;
} }
int mutil_UnloadMetaPluginByHandle(plid_t plid, void* plugin_handle, PLUG_LOADTIME now, PL_UNLOAD_REASON reason) int mutil_UnloadMetaPluginByHandle(plid_t plid, void *plugin_handle, PLUG_LOADTIME now, PL_UNLOAD_REASON reason)
{ {
MPlugin* findp; MPlugin *findp;
if (NULL == plugin_handle) { if (!plugin_handle)
{
return ME_ARGUMENT; return ME_ARGUMENT;
} }
@ -355,90 +321,92 @@ int mutil_UnloadMetaPluginByHandle(plid_t plid, void* plugin_handle, PLUG_LOADTI
return meta_errno; return meta_errno;
} }
const char* mutil_IsQueryingClientCvar(plid_t /*plid*/, const edict_t* pEdict) const char* mutil_IsQueryingClientCvar(plid_t plid, const edict_t* pEdict)
{ {
return g_Players.is_querying_cvar(pEdict); return g_Players.is_querying_cvar(pEdict);
} }
int mutil_MakeRequestId(plid_t /*plid*/) int mutil_MakeRequestId(plid_t plid)
{ {
//the offset is to distinguish from gamedll requests, if any //the offset is to distinguish from gamedll requests, if any
return (abs(0xbeef << 16) + (++requestid_counter)); return abs(0xbeef << 16) + (++requestid_counter);
} }
void mutil_GetHookTables(plid_t /*plid*/, enginefuncs_t** peng, DLL_FUNCTIONS** pdll, NEW_DLL_FUNCTIONS** pnewdll) void mutil_GetHookTables(plid_t plid, enginefuncs_t** peng, DLL_FUNCTIONS** pdll, NEW_DLL_FUNCTIONS** pnewdll)
{ {
if (peng) if (peng)
*peng = &meta_engfuncs; *peng = &meta_engfuncs;
if (pdll) if (pdll)
*pdll = pHookedDllFunctions; *pdll = pHookedDllFunctions;
if (pnewdll) if (pnewdll)
*pnewdll = pHookedNewDllFunctions; *pnewdll = pHookedNewDllFunctions;
} }
#ifdef UNFINISHED #ifdef UNFINISHED
int mutil_HookGameEvent(plid_t plid, game_event_t event,
event_func_t pfnHandle) int mutil_HookGameEvent(plid_t plid, game_event_t event, event_func_t pfnHandle)
{ {
return(Hooks->add(plid, event, pfnHandle)); return Hooks->add(plid, event, pfnHandle);
} }
int mutil_HookLogTrigger(plid_t plid, const char *trigger, int mutil_HookLogTrigger(plid_t plid, const char *trigger, logmatch_func_t pfnHandle)
logmatch_func_t pfnHandle)
{ {
return(Hooks->add(plid, H_TRIGGER, trigger, pfnHandle)); return Hooks->add(plid, H_TRIGGER, trigger, pfnHandle);
} }
int mutil_HookLogString(plid_t plid, const char *string, int mutil_HookLogString(plid_t plid, const char *string, logmatch_func_t pfnHandle)
logmatch_func_t pfnHandle)
{ {
return(Hooks->add(plid, H_STRING, string, pfnHandle)); return Hooks->add(plid, H_STRING, string, pfnHandle);
} }
int mutil_HookLogRegex(plid_t plid, const char *pattern, int mutil_HookLogRegex(plid_t plid, const char *pattern, logmatch_func_t pfnHandle)
logmatch_func_t pfnHandle)
{ {
return(Hooks->add(plid, H_STRING, pattern, pfnHandle)); return Hooks->add(plid, H_STRING, pattern, pfnHandle);
} }
qboolean mutil_RemoveHookID(plid_t plid, int hookid) { qboolean mutil_RemoveHookID(plid_t plid, int hookid)
mBOOL ret; {
ret=Hooks->remove(plid, hookid); if (Hooks->remove(plid, hookid))
if(ret==mTRUE) return(true); return true;
else return(false);
return false;
} }
int mutil_RemoveHookAll(plid_t plid) { int mutil_RemoveHookAll(plid_t plid)
return(Hooks->remove_all(plid)); {
return Hooks->remove_all(plid);
} }
#endif /* UNFINISHED */
#endif // UNFINISHED
// Meta Utility Function table. // Meta Utility Function table.
mutil_funcs_t MetaUtilFunctions = { mutil_funcs_t MetaUtilFunctions = {
mutil_LogConsole, // pfnLogConsole mutil_LogConsole, // pfnLogConsole
mutil_LogMessage, // pfnLogMessage mutil_LogMessage, // pfnLogMessage
mutil_LogError, // pfnLogError mutil_LogError, // pfnLogError
mutil_LogDeveloper, // pfnLogDeveloper mutil_LogDeveloper, // pfnLogDeveloper
mutil_CenterSay, // pfnCenterSay mutil_CenterSay, // pfnCenterSay
mutil_CenterSayParms, // pfnCenterSayParms mutil_CenterSayParms, // pfnCenterSayParms
mutil_CenterSayVarargs, // pfnCenterSayVarargs mutil_CenterSayVarargs, // pfnCenterSayVarargs
mutil_CallGameEntity, // pfnCallGameEntity mutil_CallGameEntity, // pfnCallGameEntity
mutil_GetUserMsgID, // pfnGetUserMsgID mutil_GetUserMsgID, // pfnGetUserMsgID
mutil_GetUserMsgName, // pfnGetUserMsgName mutil_GetUserMsgName, // pfnGetUserMsgName
mutil_GetPluginPath, // pfnGetPluginPath mutil_GetPluginPath, // pfnGetPluginPath
mutil_GetGameInfo, // pfnGetGameInfo mutil_GetGameInfo, // pfnGetGameInfo
mutil_LoadMetaPlugin, // pfnLoadPlugin mutil_LoadMetaPlugin, // pfnLoadPlugin
mutil_UnloadMetaPlugin, // pfnUnloadPlugin mutil_UnloadMetaPlugin, // pfnUnloadPlugin
mutil_UnloadMetaPluginByHandle, //pfnUnloadPluginByHandle mutil_UnloadMetaPluginByHandle, // pfnUnloadPluginByHandle
mutil_IsQueryingClientCvar, //pfnIsQueryingClientCvar mutil_IsQueryingClientCvar, // pfnIsQueryingClientCvar
mutil_MakeRequestId, // pfnMakeRequestId mutil_MakeRequestId, // pfnMakeRequestId
mutil_GetHookTables, // pfnGetHookTables mutil_GetHookTables, // pfnGetHookTables
#ifdef UNFINISHED #ifdef UNFINISHED
mutil_HookGameEvent, // pfnGameEvent mutil_HookGameEvent, // pfnGameEvent
mutil_HookLogTrigger, // pfnLogTrigger mutil_HookLogTrigger, // pfnLogTrigger
mutil_HookLogString, // pfnLogString mutil_HookLogString, // pfnLogString
mutil_HookLogRegex, // pfnLogRegex mutil_HookLogRegex, // pfnLogRegex
mutil_RemoveHookID, // pfnRemoveHookID mutil_RemoveHookID, // pfnRemoveHookID
mutil_RemoveHookAll, // pfnRemoveHookAll mutil_RemoveHookAll, // pfnRemoveHookAll
#endif /* UNFINISHED */ #endif // UNFINISHED
}; };

View File

@ -1,94 +1,53 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// mutil.h - prototypes for utility functions to provide to plugins #include "plinfo.h" // plugin_info_t, etc
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef MUTIL_H
#define MUTIL_H
#include "plinfo.h" // plugin_info_t, etc
#include "sdk_util.h" // hudtextparms_t, etc #include "sdk_util.h" // hudtextparms_t, etc
// max buffer size for printed messages // max buffer size for printed messages
#define MAX_LOGMSG_LEN 1024 #define MAX_LOGMSG_LEN 1024
// For GetGameInfo: // For GetGameInfo:
typedef enum { enum ginfo_t
{
GINFO_NAME = 0, GINFO_NAME = 0,
GINFO_DESC, GINFO_DESC,
GINFO_GAMEDIR, GINFO_GAMEDIR,
GINFO_DLL_FULLPATH, GINFO_DLL_FULLPATH,
GINFO_DLL_FILENAME, GINFO_DLL_FILENAME,
GINFO_REALDLL_FULLPATH, GINFO_REALDLL_FULLPATH,
} ginfo_t; };
// Meta Utility Function table type. // Meta Utility Function table type.
typedef struct meta_util_funcs_s { struct mutil_funcs_t
{
void (*pfnLogConsole) (plid_t plid, const char *fmt, ...); void (*pfnLogConsole) (plid_t plid, const char *fmt, ...);
void (*pfnLogMessage) (plid_t plid, const char *fmt, ...); void (*pfnLogMessage) (plid_t plid, const char *fmt, ...);
void (*pfnLogError) (plid_t plid, const char *fmt, ...); void (*pfnLogError) (plid_t plid, const char *fmt, ...);
void (*pfnLogDeveloper) (plid_t plid, const char *fmt, ...); void (*pfnLogDeveloper) (plid_t plid, const char *fmt, ...);
void (*pfnCenterSay) (plid_t plid, const char *fmt, ...); void (*pfnCenterSay) (plid_t plid, const char *fmt, ...);
void (*pfnCenterSayParms) (plid_t plid, hudtextparms_t tparms, void (*pfnCenterSayParms) (plid_t plid, hudtextparms_t tparms, const char *fmt, ...);
const char *fmt, ...); void (*pfnCenterSayVarargs) (plid_t plid, hudtextparms_t tparms, const char *fmt, va_list ap);
void (*pfnCenterSayVarargs) (plid_t plid, hudtextparms_t tparms, qboolean (*pfnCallGameEntity) (plid_t plid, const char *entStr, entvars_t *pev);
const char *fmt, va_list ap); int (*pfnGetUserMsgID) (plid_t plid, const char *msgname, int *size);
qboolean (*pfnCallGameEntity) (plid_t plid, const char *entStr, const char * (*pfnGetUserMsgName) (plid_t plid, int msgid, int *size);
entvars_t *pev); const char * (*pfnGetPluginPath) (plid_t plid);
int (*pfnGetUserMsgID) (plid_t plid, const char *msgname, int *size); const char * (*pfnGetGameInfo) (plid_t plid, ginfo_t tag);
const char *(*pfnGetUserMsgName) (plid_t plid, int msgid, int *size); int (*pfnLoadPlugin) (plid_t plid, const char *cmdline, PLUG_LOADTIME now, void **plugin_handle);
const char *(*pfnGetPluginPath) (plid_t plid); int (*pfnUnloadPlugin) (plid_t plid, const char *cmdline, PLUG_LOADTIME now, PL_UNLOAD_REASON reason);
const char *(*pfnGetGameInfo) (plid_t plid, ginfo_t tag); int (*pfnUnloadPluginByHandle) (plid_t plid, void *plugin_handle, PLUG_LOADTIME now, PL_UNLOAD_REASON reason);
int (*pfnLoadPlugin) (plid_t plid, const char *cmdline, PLUG_LOADTIME now, void **plugin_handle); const char * (*pfnIsQueryingClientCvar) (plid_t plid, const edict_t *pEdict);
int (*pfnUnloadPlugin) (plid_t plid, const char *cmdline, PLUG_LOADTIME now, PL_UNLOAD_REASON reason); int (*pfnMakeRequestId) (plid_t plid);
int (*pfnUnloadPluginByHandle) (plid_t plid, void *plugin_handle, PLUG_LOADTIME now, PL_UNLOAD_REASON reason);
const char *(*pfnIsQueryingClientCvar) (plid_t plid, const edict_t *pEdict);
int (*pfnMakeRequestId) (plid_t plid);
void (*pfnGetHookTables) (plid_t plid, enginefuncs_t **peng, DLL_FUNCTIONS **pdll, NEW_DLL_FUNCTIONS **pnewdll); void (*pfnGetHookTables) (plid_t plid, enginefuncs_t **peng, DLL_FUNCTIONS **pdll, NEW_DLL_FUNCTIONS **pnewdll);
#ifdef UNFINISHED #ifdef UNFINISHED
int (*pfnHookGameEvent) (plid_t plid, game_event_t event, int (*pfnHookGameEvent) (plid_t plid, game_event_t event, event_func_t pfnHandle);
event_func_t pfnHandle); int (*pfnHookLogTrigger) (plid_t plid, const char *trigger, logmatch_func_t pfnHandle);
int (*pfnHookLogTrigger) (plid_t plid, const char *trigger, int (*pfnHookLogString) (plid_t plid, const char *string, logmatch_func_t pfnHandle);
logmatch_func_t pfnHandle); int (*pfnHookLogRegex) (plid_t plid, const char *pattern, logmatch_func_t pfnHandle);
int (*pfnHookLogString) (plid_t plid, const char *string,
logmatch_func_t pfnHandle);
int (*pfnHookLogRegex) (plid_t plid, const char *pattern,
logmatch_func_t pfnHandle);
qboolean (*pfnRemoveHookID) (plid_t plid, int hookid); qboolean (*pfnRemoveHookID) (plid_t plid, int hookid);
int (*pfnRemoveHookAll) (plid_t plid); int (*pfnRemoveHookAll) (plid_t plid);
#endif /* UNFINISHED */ #endif
} mutil_funcs_t; };
extern mutil_funcs_t MetaUtilFunctions; extern mutil_funcs_t MetaUtilFunctions;
// Meta Utility Functions // Meta Utility Functions
@ -98,10 +57,8 @@ void mutil_LogError(plid_t plid, const char *fmt, ...);
void mutil_LogDeveloper(plid_t plid, const char *fmt, ...); void mutil_LogDeveloper(plid_t plid, const char *fmt, ...);
void mutil_CenterSay(plid_t plid, const char *fmt, ...); void mutil_CenterSay(plid_t plid, const char *fmt, ...);
void mutil_CenterSayParms(plid_t plid, hudtextparms_t tparms, void mutil_CenterSayParms(plid_t plid, hudtextparms_t tparms, const char *fmt, ...);
const char *fmt, ...); void mutil_CenterSayVarargs(plid_t plid, hudtextparms_t tparms, const char *fmt, va_list ap);
void mutil_CenterSayVarargs(plid_t plid, hudtextparms_t tparms,
const char *fmt, va_list ap);
qboolean mutil_CallGameEntity(plid_t plid, const char *entStr, entvars_t *pev); qboolean mutil_CallGameEntity(plid_t plid, const char *entStr, entvars_t *pev);
@ -114,18 +71,14 @@ int mutil_MakeRequestId(plid_t plid);
void mutil_GetHookTables(plid_t plid, enginefuncs_t **peng, DLL_FUNCTIONS **pdll, NEW_DLL_FUNCTIONS **pnewdll); void mutil_GetHookTables(plid_t plid, enginefuncs_t **peng, DLL_FUNCTIONS **pdll, NEW_DLL_FUNCTIONS **pnewdll);
#ifdef UNFINISHED #ifdef UNFINISHED
int mutil_HookGameEvent(plid_t plid, game_event_t event, int mutil_HookGameEvent(plid_t plid, game_event_t event, event_func_t pfnHandle);
event_func_t pfnHandle); int mutil_HookLogTrigger(plid_t plid, const char *trigger, logmatch_func_t pfnHandle);
int mutil_HookLogTrigger(plid_t plid, const char *trigger, int mutil_HookLogString(plid_t plid, const char *string, logmatch_func_t pfnHandle);
logmatch_func_t pfnHandle); int mutil_HookLogRegex(plid_t plid, const char *pattern, logmatch_func_t pfnHandle);
int mutil_HookLogString(plid_t plid, const char *string,
logmatch_func_t pfnHandle);
int mutil_HookLogRegex(plid_t plid, const char *pattern,
logmatch_func_t pfnHandle);
qboolean mutil_RemoveHookID(plid_t plid, int hookid); qboolean mutil_RemoveHookID(plid_t plid, int hookid);
int mutil_RemoveHookAll(plid_t plid); int mutil_RemoveHookAll(plid_t plid);
#endif /* UNFINISHED */ #endif
// Convenience macros for MetaUtil functions // Convenience macros for MetaUtil functions
#define LOG_CONSOLE (*gpMetaUtilFuncs->pfnLogConsole) #define LOG_CONSOLE (*gpMetaUtilFuncs->pfnLogConsole)
@ -154,6 +107,4 @@ int mutil_RemoveHookAll(plid_t plid);
#define HOOK_LOG_REGEX (*gpMetaUtilFuncs->pfnHookLogRegex) #define HOOK_LOG_REGEX (*gpMetaUtilFuncs->pfnHookLogRegex)
#define REMOVE_HOOK_ID (*gpMetaUtilFuncs->pfnRemoveHookID) #define REMOVE_HOOK_ID (*gpMetaUtilFuncs->pfnRemoveHookID)
#define REMOVE_HOOK_ALL (*gpMetaUtilFuncs->pfnRemoveHookAll) #define REMOVE_HOOK_ALL (*gpMetaUtilFuncs->pfnRemoveHookAll)
#endif /* UNFINISHED */ #endif
#endif /* MUTIL_H */

View File

@ -1,39 +1,3 @@
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// osdep.cpp - routines for operating system differences
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#include "precompiled.h" #include "precompiled.h"
mBOOL dlclose_handle_invalid; mBOOL dlclose_handle_invalid;
@ -41,12 +5,12 @@ mBOOL dlclose_handle_invalid;
// To keep the rest of the sources clean and keep not only OS but also // To keep the rest of the sources clean and keep not only OS but also
// compiler dependant differences in this file, we define a local function // compiler dependant differences in this file, we define a local function
// to set the new handler. // to set the new handler.
void mm_set_new_handler( void ) void mm_set_new_handler()
{ {
#if defined(_MSC_VER) && (_MSC_VER < 1300) #if defined(_MSC_VER) && (_MSC_VER < 1300)
_set_new_handler(meta_new_handler); _set_new_handler(meta_new_handler);
#else #else
std::set_new_handler(meta_new_handler); std::set_new_handler(meta_new_handler);
#endif #endif
} }
@ -54,56 +18,57 @@ void mm_set_new_handler( void )
// Since windows doesn't provide a verison of strtok_r(), we include one // Since windows doesn't provide a verison of strtok_r(), we include one
// here. This may or may not operate exactly like strtok_r(), but does // here. This may or may not operate exactly like strtok_r(), but does
// what we need it it do. // what we need it it do.
char *my_strtok_r(char *s, const char *delim, char **ptrptr) { char *my_strtok_r(char *s, const char *delim, char **ptrptr)
char *begin=NULL; {
char *end=NULL; char *begin = nullptr;
char *rest=NULL; char *end = nullptr;
if(s) char *rest = nullptr;
begin=s; if (s)
begin = s;
else else
begin=*ptrptr; begin = *ptrptr;
if(!begin) if (!begin)
return(NULL); return nullptr;
end=strpbrk(begin, delim);
if(end) { end = strpbrk(begin, delim);
*end='\0'; if (end)
rest=end+1; {
*ptrptr=rest+strspn(rest, delim); *end = '\0';
rest = end + 1;
*ptrptr = rest + strspn(rest, delim);
} }
else else
*ptrptr=NULL; *ptrptr = nullptr;
return(begin);
}
#endif /* _WIN32 */
return begin;
}
#endif // _WIN32
#ifdef _WIN32 #ifdef _WIN32
// Windows doesn't provide a functon analagous to dlerr() that returns a // Windows doesn't provide a functon analagous to dlerr() that returns a
// string describing the error, so we include one here, as exampled at: // string describing the error, so we include one here, as exampled at:
// http://msdn.microsoft.com/library/en-us/debug/errors_0sdh.asp // http://msdn.microsoft.com/library/en-us/debug/errors_0sdh.asp
// except without FORMAT_MESSAGE_ALLOCATE_BUFFER, since we use a local // except without FORMAT_MESSAGE_ALLOCATE_BUFFER, since we use a local
// static buffer. // static buffer.
const char *str_GetLastError(void) { const char *str_GetLastError()
{
static char buf[MAX_STRBUF_LEN]; static char buf[MAX_STRBUF_LEN];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&buf, MAX_STRBUF_LEN - 1, NULL);
NULL, GetLastError(), return buf;
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //! Default language
(LPTSTR) &buf, MAX_STRBUF_LEN-1, NULL);
return(buf);
} }
#endif /* _WIN32 */ #endif
// Find the filename of the DLL/shared-lib where the given memory location // Find the filename of the DLL/shared-lib where the given memory location
// exists. // exists.
#if defined(linux) || defined(__APPLE__) #if defined(linux) || defined(__APPLE__)
// Errno values: // Errno values:
// - ME_NOTFOUND couldn't find a sharedlib that contains memory location // - ME_NOTFOUND couldn't find a sharedlib that contains memory location
const char *DLFNAME(void *memptr) { const char *DLFNAME(void *memptr)
{
Dl_info dli; Dl_info dli;
memset(&dli, 0, sizeof(dli)); Q_memset(&dli, 0, sizeof(dli));
if(dladdr(memptr, &dli)) if (dladdr(memptr, &dli))
return(dli.dli_fname); return dli.dli_fname;
else else
RETURN_ERRNO(NULL, ME_NOTFOUND); RETURN_ERRNO(NULL, ME_NOTFOUND);
} }
@ -129,31 +94,34 @@ const char *DLFNAME(void *memptr) {
// //
// Errno values: // Errno values:
// - ME_NOTFOUND couldn't find a DLL that contains memory location // - ME_NOTFOUND couldn't find a DLL that contains memory location
const char *DLFNAME(void *memptr) { const char *DLFNAME(void *memptr)
{
MEMORY_BASIC_INFORMATION MBI; MEMORY_BASIC_INFORMATION MBI;
static char fname[PATH_MAX]; static char fname[PATH_MAX];
memset(fname, 0, sizeof(fname)); Q_memset(fname, 0, sizeof(fname));
if (!VirtualQuery(memptr, &MBI, sizeof(MBI))) if (!VirtualQuery(memptr, &MBI, sizeof(MBI)))
RETURN_ERRNO(NULL, ME_NOTFOUND); RETURN_ERRNO(NULL, ME_NOTFOUND);
if (MBI.State != MEM_COMMIT) if (MBI.State != MEM_COMMIT)
RETURN_ERRNO(NULL, ME_NOTFOUND); RETURN_ERRNO(NULL, ME_NOTFOUND);
if(!MBI.AllocationBase)
if (!MBI.AllocationBase)
RETURN_ERRNO(NULL, ME_NOTFOUND); RETURN_ERRNO(NULL, ME_NOTFOUND);
// MSDN indicates that GetModuleFileName will leave string // MSDN indicates that GetModuleFileName will leave string
// null-terminated, even if it's truncated because buffer is too small. // null-terminated, even if it's truncated because buffer is too small.
if(!GetModuleFileName((HMODULE)MBI.AllocationBase, fname, if (!GetModuleFileName((HMODULE)MBI.AllocationBase, fname,
sizeof(fname)-1)) sizeof(fname)-1))
RETURN_ERRNO(NULL, ME_NOTFOUND); RETURN_ERRNO(NULL, ME_NOTFOUND);
if(!fname[0]) if (!fname[0])
RETURN_ERRNO(NULL, ME_NOTFOUND); RETURN_ERRNO(NULL, ME_NOTFOUND);
normalize_pathname(fname); normalize_pathname(fname);
return(fname); return fname;
} }
#endif /* _WIN32 */ #endif // _WIN32
// Determine whether the given memory location is valid (ie whether we // Determine whether the given memory location is valid (ie whether we
@ -165,11 +133,12 @@ const char *DLFNAME(void *memptr) {
// we need it for in this particular situation. // we need it for in this particular situation.
// meta_errno values: // meta_errno values:
// - ME_NOTFOUND couldn't find a matching sharedlib for this ptr // - ME_NOTFOUND couldn't find a matching sharedlib for this ptr
mBOOL IS_VALID_PTR(void *memptr) { mBOOL IS_VALID_PTR(void *memptr)
{
Dl_info dli; Dl_info dli;
memset(&dli, 0, sizeof(dli)); Q_memset(&dli, 0, sizeof(dli));
if(dladdr(memptr, &dli)) if (dladdr(memptr, &dli))
return(mTRUE); return mTRUE;
else else
RETURN_ERRNO(mFALSE, ME_NOTFOUND); RETURN_ERRNO(mFALSE, ME_NOTFOUND);
} }
@ -177,40 +146,47 @@ mBOOL IS_VALID_PTR(void *memptr) {
// Use the native windows routine IsBadCodePtr. // Use the native windows routine IsBadCodePtr.
// meta_errno values: // meta_errno values:
// - ME_BADMEMPTR not a valid memory pointer // - ME_BADMEMPTR not a valid memory pointer
mBOOL IS_VALID_PTR(void *memptr) { mBOOL IS_VALID_PTR(void *memptr)
if(IsBadCodePtr((FARPROC) memptr)) {
if (IsBadCodePtr((FARPROC) memptr))
RETURN_ERRNO(mFALSE, ME_BADMEMPTR); RETURN_ERRNO(mFALSE, ME_BADMEMPTR);
else else
return(mTRUE); return mTRUE;
} }
#endif /* _WIN32 */ #endif // _WIN32
// This used to be OS-dependent, as it used a SEGV signal handler under // This used to be OS-dependent, as it used a SEGV signal handler under
// linux, but that was removed because (a) it masked legitimate segfaults // linux, but that was removed because (a) it masked legitimate segfaults
// in plugin commands and produced confusing output ("plugin has been // in plugin commands and produced confusing output ("plugin has been
// unloaded", when really it segfaultd), and (b) wasn't necessary since // unloaded", when really it segfaultd), and (b) wasn't necessary since
// IS_VALID_PTR() should cover the situation. // IS_VALID_PTR() should cover the situation.
mBOOL os_safe_call(REG_CMD_FN pfn) { mBOOL os_safe_call(REG_CMD_FN pfn)
{
// try and see if this is a valid memory location // try and see if this is a valid memory location
if(!IS_VALID_PTR((void *) pfn)) if (!IS_VALID_PTR((void *)pfn))
// meta_errno should be already set in is_valid_ptr() // meta_errno should be already set in is_valid_ptr()
return(mFALSE); return mFALSE;
pfn(); pfn();
return(mTRUE); return mTRUE;
} }
// See comments in osdep.h. // See comments in osdep.h.
#if defined(__GNUC__) || (defined(_MSC_VER) && (_MSC_VER >= 1300)) #if defined(_MSC_VER) && (_MSC_VER >= 1300)
void MM_CDECL meta_new_handler(void) { void __cdecl meta_new_handler()
// This merely because we don't want the program to exit if new() {
// fails..
return; return;
} }
#elif defined(_MSC_VER) #elif defined(_MSC_VER)
int meta_new_handler(size_t size) { int meta_new_handler(size_t size)
{
// This merely because we don't want the program to exit if new() // This merely because we don't want the program to exit if new()
// fails.. // fails..
return(0); return 0;
} }
#endif /* _MSC_VER */ #else
void meta_new_handler()
{
return;
}
#endif

View File

@ -1,194 +1,108 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// osdep.h - operating system dependencies
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef OSDEP_H
#define OSDEP_H
#include <string.h> // strerror()
#include <ctype.h> // isupper, tolower
#include <errno.h> // errno
// Various differences between WIN32 and Linux. // Various differences between WIN32 and Linux.
#include "types_meta.h" // mBOOL #include "types_meta.h" // mBOOL
#include "mreg.h" // REG_CMD_FN, etc #include "mreg.h" // REG_CMD_FN, etc
#include "log_meta.h" // LOG_ERROR, etc #include "log_meta.h" // LOG_ERROR, etc
// String describing platform/DLL-type, for matching lines in plugins.ini.
#ifdef _WIN32
#define UNUSED /**/
#define PLATFORM "mswin"
#define PLATFORM_SPC "win32"
#define PLATFORM_DLEXT ".dll"
#else
#define UNUSED __attribute__((unused))
#define PLATFORM "linux"
#define PLATFORM_SPC "lin32"
#define PLATFORM_DLEXT ".so"
#endif
extern mBOOL dlclose_handle_invalid; extern mBOOL dlclose_handle_invalid;
// String describing platform/DLL-type, for matching lines in plugins.ini.
#ifdef __linux
#define PLATFORM "linux"
# ifdef __amd64__
#define PLATFORM_SPC "lin64"
# else
#define PLATFORM_SPC "lin32"
# endif
#elif defined(_WIN32)
#define PLATFORM "mswin"
#define PLATFORM_SPC "win32"
#elif defined(__APPLE__)
#define PLATFORM "osx"
#define PLATFORM_SPC "osx32"
#else /* unknown */
#error "OS unrecognized"
#endif /* unknown */
// Macro for function-exporting from DLL..
// from SDK dlls/cbase.h:
//! C functions for external declarations that call the appropriate C++ methods
// Windows uses "__declspec(dllexport)" to mark functions in the DLL that
// should be visible/callable externally.
//
// It also apparently requires WINAPI for GiveFnptrsToDll().
//
// See doc/notes_windows_coding for more information..
// Attributes to specify an "exported" function, visible from outside the
// DLL.
#undef DLLEXPORT
#ifdef _WIN32
#define DLLEXPORT __declspec(dllexport)
// WINAPI should be provided in the windows compiler headers.
// It's usually defined to something like "__stdcall".
#elif defined(__GNUC__)
# if __GNUC__ >= 4
#define DLLEXPORT __attribute__ ((visibility("default")))
# else
#define DLLEXPORT /* */
# endif
#define WINAPI /* */
#endif /* linux */
#ifdef __GNUC__
# define DECLSPEC(kw)
# define ATTRIBUTE(kw) __attribute__((kw))
# define MM_CDECL
#elif defined(_MSC_VER)
# define DECLSPEC(kw) __declspec(kw)
# define ATTRIBUTE(kw)
# define MM_CDECL __cdecl
#endif /* _MSC_VER */
// Simplified macro for declaring/defining exported DLL functions. They
// need to be 'extern "C"' so that the C++ compiler enforces parameter
// type-matching, rather than considering routines with mis-matched
// arguments/types to be overloaded functions...
//
// AFAIK, this is os-independent, but it's included here in osdep.h where
// DLLEXPORT is defined, for convenience.
#define C_DLLEXPORT extern "C" DLLEXPORT
#ifdef _MSC_VER
// Disable MSVC warning:
// 4390 : empty controlled statement found; is this what was intended?
// generated by the RETURN macros.
#pragma warning(disable: 4390)
#endif /* _MSC_VER */
// Functions & types for DLL open/close/etc operations. // Functions & types for DLL open/close/etc operations.
#if defined(__linux) || defined(__APPLE__) #ifdef _WIN32
#include <dlfcn.h>
typedef void* DLHANDLE;
typedef void* DLFUNC;
inline DLHANDLE DLOPEN(const char *filename) {
return(dlopen(filename, RTLD_NOW));
}
inline DLFUNC DLSYM(DLHANDLE handle, const char *string) {
return(dlsym(handle, string));
}
inline int DLCLOSE(DLHANDLE handle) {
if (!handle) {
dlclose_handle_invalid = mTRUE;
return(1);
}
dlclose_handle_invalid = mFALSE;
return(dlclose(handle));
}
inline const char* DLERROR(void) {
if (dlclose_handle_invalid)
return("Invalid handle.");
return(dlerror());
}
#elif defined(_WIN32)
typedef HINSTANCE DLHANDLE; typedef HINSTANCE DLHANDLE;
typedef FARPROC DLFUNC; typedef FARPROC DLFUNC;
inline DLHANDLE DLOPEN(const char *filename) { inline DLHANDLE DLOPEN(const char *filename)
return(LoadLibrary(filename)); {
return LoadLibraryA(filename);
} }
inline DLFUNC DLSYM(DLHANDLE handle, const char *string) { inline DLFUNC DLSYM(DLHANDLE handle, const char *string)
return(GetProcAddress(handle, string)); {
return GetProcAddress(handle, string);
} }
inline int DLCLOSE(DLHANDLE handle) { inline int DLCLOSE(DLHANDLE handle)
if (!handle) { {
if (!handle)
{
dlclose_handle_invalid = mTRUE; dlclose_handle_invalid = mTRUE;
return(1); return 1;
} }
dlclose_handle_invalid = mFALSE; dlclose_handle_invalid = mFALSE;
// NOTE: Windows FreeLibrary returns success=nonzero, fail=zero, // NOTE: Windows FreeLibrary returns success=nonzero, fail=zero,
// which is the opposite of the unix convention, thus the '!'. // which is the opposite of the unix convention, thus the '!'.
return(!FreeLibrary(handle)); return !FreeLibrary(handle);
} }
// Windows doesn't provide a function corresponding to dlerror(), so // Windows doesn't provide a function corresponding to dlerror(), so
// we make our own. // we make our own.
const char *str_GetLastError(void); const char *str_GetLastError();
inline const char* DLERROR(void) { inline const char *DLERROR()
{
if (dlclose_handle_invalid) if (dlclose_handle_invalid)
return("Invalid handle."); return "Invalid handle.";
return(str_GetLastError());
return str_GetLastError();
} }
#endif /* _WIN32 */ #else
typedef void *DLHANDLE;
typedef void *DLFUNC;
inline DLHANDLE DLOPEN(const char *filename)
{
return dlopen(filename, RTLD_NOW);
}
inline DLFUNC DLSYM(DLHANDLE handle, const char *string)
{
return dlsym(handle, string);
}
// dlclose crashes if handle is null.
inline int DLCLOSE(DLHANDLE handle)
{
if (!handle)
{
dlclose_handle_invalid = mTRUE;
return 1;
}
dlclose_handle_invalid = mFALSE;
return dlclose(handle);
}
inline const char *DLERROR()
{
if (dlclose_handle_invalid)
return "Invalid handle.";
return dlerror();
}
#endif
const char *DLFNAME(void *memptr); const char *DLFNAME(void *memptr);
mBOOL IS_VALID_PTR(void *memptr); mBOOL IS_VALID_PTR(void *memptr);
// Attempt to call the given function pointer, without segfaulting. // Attempt to call the given function pointer, without segfaulting.
mBOOL os_safe_call(REG_CMD_FN pfn); mBOOL os_safe_call(REG_CMD_FN pfn);
// Windows doesn't have an strtok_r() routine, so we write our own. // Windows doesn't have an strtok_r() routine, so we write our own.
#ifdef _WIN32 #ifdef _WIN32
#define strtok_r(s, delim, ptrptr) my_strtok_r(s, delim, ptrptr) #define strtok_r(s, delim, ptrptr) my_strtok_r(s, delim, ptrptr)
char *my_strtok_r(char *s, const char *delim, char **ptrptr); char *my_strtok_r(char *s, const char *delim, char **ptrptr);
#endif /* _WIN32 */ #else
// Linux doesn't have an strlwr() routine, so we write our own.
#define strlwr(s) my_strlwr(s)
char *my_strlwr(char *s);
#endif // _WIN32
// Set filename and pathname maximum lengths. Note some windows compilers // Set filename and pathname maximum lengths. Note some windows compilers
@ -204,8 +118,7 @@ mBOOL os_safe_call(REG_CMD_FN pfn);
#include <stdlib.h> #include <stdlib.h>
#define NAME_MAX _MAX_FNAME #define NAME_MAX _MAX_FNAME
#define PATH_MAX _MAX_PATH #define PATH_MAX _MAX_PATH
#endif /* _WIN32 */ #endif // _WIN32
// Various other windows routine differences. // Various other windows routine differences.
#if defined(__linux) || defined(__APPLE__) #if defined(__linux) || defined(__APPLE__)
@ -222,7 +135,7 @@ mBOOL os_safe_call(REG_CMD_FN pfn);
#define read _read #define read _read
#define write _write #define write _write
#define close _close #define close _close
#endif /* _WIN32 */ #endif // _WIN32
#ifdef __GNUC__ #ifdef __GNUC__
#include <unistd.h> // _getcwd #include <unistd.h> // _getcwd
@ -252,8 +165,7 @@ mBOOL os_safe_call(REG_CMD_FN pfn);
#ifndef S_IWGRP #ifndef S_IWGRP
#define S_IWGRP S_IWUSR #define S_IWGRP S_IWUSR
#endif #endif
#endif /* _WIN32 */ #endif // _WIN32
// Our handler for new(). // Our handler for new().
// //
@ -276,77 +188,83 @@ mBOOL os_safe_call(REG_CMD_FN pfn);
// "real" function and uses the "old" semantic; handler-type is: // "real" function and uses the "old" semantic; handler-type is:
// int newhandler(size_t) // int newhandler(size_t)
// //
#if defined(__GNUC__) || (defined(_MSC_VER) && (_MSC_VER >= 1300)) #if defined(_MSC_VER) && (_MSC_VER >= 1300)
void MM_CDECL meta_new_handler(void); void __cdecl meta_new_handler();
#elif defined(_MSC_VER) #elif defined(_MSC_VER)
int meta_new_handler(size_t size); int meta_new_handler(size_t size);
#endif /* _MSC_VER */ #else
void meta_new_handler();
#endif
// To keep the rest of the sources clean and keep not only OS but also // To keep the rest of the sources clean and keep not only OS but also
// compiler dependant differences in this file, we define a local function // compiler dependant differences in this file, we define a local function
// to set the new handler. // to set the new handler.
void mm_set_new_handler( void ); void mm_set_new_handler( void );
// Thread handling... // Thread handling...
#if defined(__linux) || defined(__APPLE__) #if defined(__linux) || defined(__APPLE__)
#include <pthread.h> #include <pthread.h>
typedef pthread_t THREAD_T; typedef pthread_t THREAD_T;
// returns 0==success, non-zero==failure // returns 0==success, non-zero==failure
inline int THREAD_CREATE(THREAD_T *tid, void (*func)(void)) { inline int THREAD_CREATE(THREAD_T *tid, void (*func)())
{
int ret; int ret;
ret=pthread_create(tid, NULL, (void *(*)(void*)) func, NULL); ret = pthread_create(tid, NULL, (void *(*)(void*)) func, NULL);
if(ret != 0) { if (ret != 0)
{
META_ERROR("Failure starting thread: %s", strerror(ret)); META_ERROR("Failure starting thread: %s", strerror(ret));
return(ret); return ret;
} }
ret=pthread_detach(*tid);
if(ret != 0) ret = pthread_detach(*tid);
if (ret != 0)
META_ERROR("Failure detaching thread: %s", strerror(ret)); META_ERROR("Failure detaching thread: %s", strerror(ret));
return(ret); return ret;
} }
#elif defined(_WIN32) #elif defined(_WIN32)
// See: // See:
// http://msdn.microsoft.com/library/en-us/dllproc/prothred_4084.asp // http://msdn.microsoft.com/library/en-us/dllproc/prothred_4084.asp
typedef DWORD THREAD_T; typedef DWORD THREAD_T;
// returns 0==success, non-zero==failure // returns 0==success, non-zero==failure
inline int THREAD_CREATE(THREAD_T *tid, void (*func)(void)) { inline int THREAD_CREATE(THREAD_T *tid, void (*func)())
{
HANDLE ret; HANDLE ret;
// win32 returns NULL==failure, non-NULL==success // win32 returns NULL==failure, non-NULL==success
ret=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) func, NULL, 0, tid); ret = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) func, NULL, 0, tid);
if(ret==NULL) if (ret == NULL)
META_ERROR("Failure starting thread: %s", str_GetLastError()); META_ERROR("Failure starting thread: %s", str_GetLastError());
return(ret==NULL); return ret == NULL;
} }
#endif /* _WIN32 */ #endif // _WIN32
#define THREAD_OK 0 #define THREAD_OK 0
// Mutex handling... // Mutex handling...
#if defined(__linux) || defined(__APPLE__) #if defined(__linux) || defined(__APPLE__)
typedef pthread_mutex_t MUTEX_T; typedef pthread_mutex_t MUTEX_T;
inline int MUTEX_INIT(MUTEX_T *mutex) { inline int MUTEX_INIT(MUTEX_T *mutex)
{
int ret; int ret;
ret=pthread_mutex_init(mutex, NULL); ret = pthread_mutex_init(mutex, NULL);
if(ret!=THREAD_OK) if (ret != THREAD_OK)
META_ERROR("mutex_init failed: %s", strerror(ret)); META_ERROR("mutex_init failed: %s", strerror(ret));
return(ret); return ret;
} }
inline int MUTEX_LOCK(MUTEX_T *mutex) { inline int MUTEX_LOCK(MUTEX_T *mutex)
{
int ret; int ret;
ret=pthread_mutex_lock(mutex); ret = pthread_mutex_lock(mutex);
if(ret!=THREAD_OK) if (ret != THREAD_OK)
META_ERROR("mutex_lock failed: %s", strerror(ret)); META_ERROR("mutex_lock failed: %s", strerror(ret));
return(ret); return ret;
} }
inline int MUTEX_UNLOCK(MUTEX_T *mutex) { inline int MUTEX_UNLOCK(MUTEX_T *mutex)
{
int ret; int ret;
ret=pthread_mutex_unlock(mutex); ret = pthread_mutex_unlock(mutex);
if(ret!=THREAD_OK) if (ret != THREAD_OK)
META_ERROR("mutex_unlock failed: %s", strerror(ret)); META_ERROR("mutex_unlock failed: %s", strerror(ret));
return(ret); return ret;
} }
#elif defined(_WIN32) #elif defined(_WIN32)
// Win32 has "mutexes" as well, but CS's are simpler. // Win32 has "mutexes" as well, but CS's are simpler.
@ -354,44 +272,50 @@ void mm_set_new_handler( void );
// http://msdn.microsoft.com/library/en-us/dllproc/synchro_2a2b.asp // http://msdn.microsoft.com/library/en-us/dllproc/synchro_2a2b.asp
typedef CRITICAL_SECTION MUTEX_T; typedef CRITICAL_SECTION MUTEX_T;
// Note win32 routines don't return any error (return void). // Note win32 routines don't return any error (return void).
inline int MUTEX_INIT(MUTEX_T *mutex) { inline int MUTEX_INIT(MUTEX_T *mutex)
{
InitializeCriticalSection(mutex); InitializeCriticalSection(mutex);
return(THREAD_OK); return THREAD_OK;
} }
inline int MUTEX_LOCK(MUTEX_T *mutex) { inline int MUTEX_LOCK(MUTEX_T *mutex)
{
EnterCriticalSection(mutex); EnterCriticalSection(mutex);
return(THREAD_OK); return THREAD_OK;
} }
inline int MUTEX_UNLOCK(MUTEX_T *mutex) { inline int MUTEX_UNLOCK(MUTEX_T *mutex)
{
LeaveCriticalSection(mutex); LeaveCriticalSection(mutex);
return(THREAD_OK); return THREAD_OK;
} }
#endif /* _WIN32 (mutex) */ #endif // _WIN32
// Condition variables... // Condition variables...
#if defined(__linux) || defined(__APPLE__) #if defined(__linux) || defined(__APPLE__)
typedef pthread_cond_t COND_T; typedef pthread_cond_t COND_T;
inline int COND_INIT(COND_T *cond) { inline int COND_INIT(COND_T *cond)
{
int ret; int ret;
ret=pthread_cond_init(cond, NULL); ret = pthread_cond_init(cond, NULL);
if(ret!=THREAD_OK) if (ret != THREAD_OK)
META_ERROR("cond_init failed: %s", strerror(ret)); META_ERROR("cond_init failed: %s", strerror(ret));
return(ret); return ret;
} }
inline int COND_WAIT(COND_T *cond, MUTEX_T *mutex) { inline int COND_WAIT(COND_T *cond, MUTEX_T *mutex)
{
int ret; int ret;
ret=pthread_cond_wait(cond, mutex); ret = pthread_cond_wait(cond, mutex);
if(ret!=THREAD_OK) if (ret != THREAD_OK)
META_ERROR("cond_wait failed: %s", strerror(ret)); META_ERROR("cond_wait failed: %s", strerror(ret));
return(ret); return ret;
} }
inline int COND_SIGNAL(COND_T *cond) { inline int COND_SIGNAL(COND_T *cond)
{
int ret; int ret;
ret=pthread_cond_signal(cond); ret = pthread_cond_signal(cond);
if(ret!=THREAD_OK) if (ret != THREAD_OK)
META_ERROR("cond_signal failed: %s", strerror(ret)); META_ERROR("cond_signal failed: %s", strerror(ret));
return(ret); return ret;
} }
#elif defined(_WIN32) #elif defined(_WIN32)
// Since win32 doesn't provide condition-variables, we have to model // Since win32 doesn't provide condition-variables, we have to model
@ -408,45 +332,51 @@ void mm_set_new_handler( void );
// See also: // See also:
// http://msdn.microsoft.com/library/en-us/dllproc/synchro_8ann.asp // http://msdn.microsoft.com/library/en-us/dllproc/synchro_8ann.asp
typedef HANDLE COND_T; typedef HANDLE COND_T;
inline int COND_INIT(COND_T *cond) { inline int COND_INIT(COND_T *cond)
{
*cond = CreateEvent(NULL, // security attributes (none) *cond = CreateEvent(NULL, // security attributes (none)
FALSE, // manual-reset type (false==auto-reset) FALSE, // manual-reset type (false==auto-reset)
FALSE, // initial state (unsignaled) FALSE, // initial state (unsignaled)
NULL); // object name (unnamed) NULL); // object name (unnamed)
// returns NULL on error // returns NULL on error
if(*cond==NULL) { if (*cond == NULL)
{
META_ERROR("cond_init failed: %s", str_GetLastError()); META_ERROR("cond_init failed: %s", str_GetLastError());
return(-1); return -1;
} }
else else
return(0); return 0;
} }
inline int COND_WAIT(COND_T *cond, MUTEX_T *mutex) { inline int COND_WAIT(COND_T *cond, MUTEX_T *mutex)
{
DWORD ret; DWORD ret;
LeaveCriticalSection(mutex); LeaveCriticalSection(mutex);
ret=WaitForSingleObject(*cond, INFINITE); ret = WaitForSingleObject(*cond, INFINITE);
EnterCriticalSection(mutex); EnterCriticalSection(mutex);
// returns WAIT_OBJECT_0 if object was signaled; other return // returns WAIT_OBJECT_0 if object was signaled; other return
// values indicate errors. // values indicate errors.
if(ret == WAIT_OBJECT_0) if (ret == WAIT_OBJECT_0)
return(0); return 0;
else { else
{
META_ERROR("cond_wait failed: %s", str_GetLastError()); META_ERROR("cond_wait failed: %s", str_GetLastError());
return(-1); return -1;
} }
} }
inline int COND_SIGNAL(COND_T *cond) { inline int COND_SIGNAL(COND_T *cond)
{
BOOL ret; BOOL ret;
ret=SetEvent(*cond); ret = SetEvent(*cond);
// returns zero on failure // returns zero on failure
if(ret==0) { if (ret == 0)
{
META_ERROR("cond_signal failed: %s", str_GetLastError()); META_ERROR("cond_signal failed: %s", str_GetLastError());
return(-1); return -1;
} }
else else
return(0); return 0;
} }
#endif /* _WIN32 (condition variable) */ #endif // _WIN32
// Normalize/standardize a pathname. // Normalize/standardize a pathname.
// - For win32, this involves: // - For win32, this involves:
@ -459,17 +389,20 @@ void mm_set_new_handler( void );
#if defined(__linux) || defined(__APPLE__) #if defined(__linux) || defined(__APPLE__)
#define normalize_pathname(a) #define normalize_pathname(a)
#elif defined(_WIN32) #elif defined(_WIN32)
inline void normalize_pathname(char *path) { inline void normalize_pathname(char *path)
{
char *cp; char *cp;
META_DEBUG(8, ("normalize: %s", path)); META_DEBUG(8, ("normalize: %s", path));
for(cp=path; *cp; cp++) { for (cp = path; *cp; cp++)
if(isupper(*cp)) *cp=tolower(*cp); {
if(*cp=='\\') *cp='/'; if (isupper(*cp)) *cp = tolower(*cp);
if (*cp == '\\') *cp = '/';
} }
META_DEBUG(8, ("normalized: %s", path)); META_DEBUG(8, ("normalized: %s", path));
} }
#endif /* _WIN32 */ #endif // _WIN32
// Indicate if pathname appears to be an absolute-path. Under linux this // Indicate if pathname appears to be an absolute-path. Under linux this
// is a leading slash (/). Under win32, this can be: // is a leading slash (/). Under win32, this can be:
@ -477,51 +410,55 @@ inline void normalize_pathname(char *path) {
// - a toplevel path (ie "\blah") // - a toplevel path (ie "\blah")
// - a UNC network address (ie "\\srv1\blah"). // - a UNC network address (ie "\\srv1\blah").
// Also, handle both native and normalized pathnames. // Also, handle both native and normalized pathnames.
inline int is_absolute_path(const char *path) { inline int is_absolute_path(const char *path)
if(path[0]=='/') return(TRUE); {
if (path[0] == '/') return TRUE;
#ifdef _WIN32 #ifdef _WIN32
if(path[1]==':') return(TRUE); if (path[1] == ':') return TRUE;
if(path[0]=='\\') return(TRUE); if (path[0] == '\\') return TRUE;
#endif /* _WIN32 */ #endif // _WIN32
return(FALSE); return FALSE;
} }
#ifdef _WIN32 #ifdef _WIN32
// Buffer pointed to by resolved_name is assumed to be able to store a // Buffer pointed to by resolved_name is assumed to be able to store a
// string of PATH_MAX length. // string of PATH_MAX length.
inline char *realpath(const char *file_name, char *resolved_name) { inline char *realpath(const char *file_name, char *resolved_name)
{
int ret; int ret;
ret=GetFullPathName(file_name, PATH_MAX, resolved_name, NULL); ret = GetFullPathName(file_name, PATH_MAX, resolved_name, NULL);
if(ret > PATH_MAX) { if (ret > PATH_MAX)
errno=ENAMETOOLONG; {
return(NULL); errno = ENAMETOOLONG;
return NULL;
} }
else if(ret > 0) { else if (ret > 0)
{
HANDLE handle; HANDLE handle;
WIN32_FIND_DATA find_data; WIN32_FIND_DATA find_data;
handle=FindFirstFile(resolved_name, &find_data); handle = FindFirstFile(resolved_name, &find_data);
if(INVALID_HANDLE_VALUE == handle) { if (INVALID_HANDLE_VALUE == handle)
errno=ENOENT; {
errno = ENOENT;
return NULL; return NULL;
} }
FindClose(handle); FindClose(handle);
normalize_pathname(resolved_name); normalize_pathname(resolved_name);
return(resolved_name); return resolved_name;
} }
else
return(NULL); return NULL;
} }
#endif /* _WIN32 */ #endif // _WIN32
// Generic "error string" from a recent OS call. For linux, this is based // Generic "error string" from a recent OS call. For linux, this is based
// on errno. For win32, it's based on GetLastError. // on errno. For win32, it's based on GetLastError.
inline const char *str_os_error(void) { inline const char *str_os_error()
#if defined(__linux) || defined(__APPLE__) {
return(strerror(errno)); #ifdef _WIN32
#elif defined(_WIN32) return str_GetLastError();
return(str_GetLastError()); #else
#endif /* _WIN32 */ return strerror(errno);
#endif
} }
#endif /* OSDEP_H */

View File

@ -1,82 +1,48 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// plinfo.h - typedefs for plugin info structure
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef PLINFO_H
#define PLINFO_H
// Flags for plugin to indicate when it can be be loaded/unloaded. // Flags for plugin to indicate when it can be be loaded/unloaded.
// NOTE: order is crucial, as greater/less comparisons are made. // NOTE: order is crucial, as greater/less comparisons are made.
typedef enum { enum PLUG_LOADTIME
{
PT_NEVER = 0, PT_NEVER = 0,
PT_STARTUP, // should only be loaded/unloaded at initial hlds execution PT_STARTUP, // should only be loaded/unloaded at initial hlds execution
PT_CHANGELEVEL, // can be loaded/unloaded between maps PT_CHANGELEVEL, // can be loaded/unloaded between maps
PT_ANYTIME, // can be loaded/unloaded at any time PT_ANYTIME, // can be loaded/unloaded at any time
PT_ANYPAUSE, // can be loaded/unloaded at any time, and can be "paused" during a map PT_ANYPAUSE, // can be loaded/unloaded at any time, and can be "paused" during a map
} PLUG_LOADTIME; };
// Flags to indicate why the plugin is being unloaded. // Flags to indicate why the plugin is being unloaded.
typedef enum { enum PL_UNLOAD_REASON
{
PNL_NULL = 0, PNL_NULL = 0,
PNL_INI_DELETED, // was deleted from plugins.ini PNL_INI_DELETED, // was deleted from plugins.ini
PNL_FILE_NEWER, // file on disk is newer than last load PNL_FILE_NEWER, // file on disk is newer than last load
PNL_COMMAND, // requested by server/console command PNL_COMMAND, // requested by server/console command
PNL_CMD_FORCED, // forced by server/console command PNL_CMD_FORCED, // forced by server/console command
PNL_DELAYED, // delayed from previous request; can't tell origin PNL_DELAYED, // delayed from previous request; can't tell origin
//only used for 'real_reason' on MPlugin::unload()
PNL_PLUGIN, // requested by plugin function call // only used for 'real_reason' on MPlugin::unload()
PNL_PLUGIN, // requested by plugin function call
PNL_PLG_FORCED, // forced by plugin function call PNL_PLG_FORCED, // forced by plugin function call
PNL_RELOAD, // forced unload by reload() PNL_RELOAD, // forced unload by reload()
} PL_UNLOAD_REASON; };
// Information plugin provides about itself. // Information plugin provides about itself.
typedef struct { struct plugin_info_t
const char *ifvers; // meta_interface version {
const char *name; // full name of plugin const char *ifvers; // meta_interface version
const char *name; // full name of plugin
const char *version; // version const char *version; // version
const char *date; // date const char *date; // date
const char *author; // author name/email const char *author; // author name/email
const char *url; // URL const char *url; // URL
const char *logtag; // log message prefix (unused right now) const char *logtag; // log message prefix (unused right now)
PLUG_LOADTIME loadable; // when loadable PLUG_LOADTIME loadable; // when loadable
PLUG_LOADTIME unloadable; // when unloadable PLUG_LOADTIME unloadable; // when unloadable
} plugin_info_t; };
extern plugin_info_t Plugin_info; extern plugin_info_t Plugin_info;
// Plugin identifier, passed to all Meta Utility Functions. // Plugin identifier, passed to all Meta Utility Functions.
typedef plugin_info_t* plid_t; typedef plugin_info_t *plid_t;
#define PLID &Plugin_info #define PLID &Plugin_info
#endif /* PLINFO_H */

View File

@ -1,31 +1,20 @@
#pragma once #pragma once
#include "version/appversion.h"
#if defined(linux) || defined(__APPLE__) #if defined(linux) || defined(__APPLE__)
// enable extra routines in system header files, like dladdr // enable extra routines in system header files, like dladdr
# ifndef _GNU_SOURCE #ifndef _GNU_SOURCE
# define _GNU_SOURCE #define _GNU_SOURCE
# endif #endif
#include <dlfcn.h> // dlopen, dladdr, etc
#include <signal.h> // sigaction, etc #include <signal.h> // sigaction, etc
#include <setjmp.h> // sigsetjmp, longjmp, etc
#endif /* linux */
#if defined(_MSC_VER) && (_MSC_VER < 1300)
# include <new.h> // set_new_handler()
#else
# include <new> // set_new_handler()
#endif #endif
#include <fcntl.h> #if defined(_MSC_VER) && (_MSC_VER < 1300)
#include <sys/types.h> #include <new.h> // set_new_handler()
#include <sys/stat.h> #else
#include <new> // set_new_handler()
#include <ctype.h> #endif
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <errno.h>
#include <extdll.h> #include <extdll.h>
#include <studio.h> #include <studio.h>
@ -36,9 +25,6 @@
#include "commands_meta.h" #include "commands_meta.h"
#include "metamod.h" #include "metamod.h"
#include "log_meta.h" #include "log_meta.h"
#include "info_name.h"
#include "vdate.h"
#include "vers_meta.h"
#include "conf_meta.h" #include "conf_meta.h"
#include "support_meta.h" #include "support_meta.h"
#include "dllapi.h" #include "dllapi.h"

View File

@ -1,49 +1,5 @@
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// reg_support.cpp - support for things "registered" by plugins (console
// cmds, cvars, msgs, etc)
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#include "precompiled.h" #include "precompiled.h"
#ifdef linux
// enable extra routines in system header files, like strsignal
# ifndef _GNU_SOURCE
# define _GNU_SOURCE
# endif
#endif /* linux */
// "Register" support. // "Register" support.
// //
// This code is necessary to support the different "register" engine // This code is necessary to support the different "register" engine
@ -86,29 +42,30 @@
// Windows didn't seem to have a similar routine, and I couldn't find // Windows didn't seem to have a similar routine, and I couldn't find
// another way to get the information.. // another way to get the information..
// Generic command handler, passed to the engine for any AddServerCommand // Generic command handler, passed to the engine for any AddServerCommand
// calls made by the plugin. It finds the appropriate plugin function // calls made by the plugin. It finds the appropriate plugin function
// pointer to call based on CMD_ARGV(0). // pointer to call based on CMD_ARGV(0).
void meta_command_handler(void) void meta_command_handler()
{ {
MRegCmd* icmd;
const char* cmd;
META_DEBUG(5, ("called: meta_command_handler; arg0=%s args='%s'", CMD_ARGV(0), CMD_ARGS())); META_DEBUG(5, ("called: meta_command_handler; arg0=%s args='%s'", CMD_ARGV(0), CMD_ARGS()));
cmd = CMD_ARGV(0); const char *cmd = CMD_ARGV(0);
if (!cmd) { if (!cmd)
{
META_ERROR("Null command name in meta_command_handler() ??"); META_ERROR("Null command name in meta_command_handler() ??");
return; return;
} }
icmd = g_regCmds->find(cmd); MRegCmd *icmd = g_regCmds->find(cmd);
if (!icmd) { if (!icmd)
{
META_ERROR("Couldn't find registered plugin command: %s", cmd); META_ERROR("Couldn't find registered plugin command: %s", cmd);
return; return;
} }
if (icmd->call() != mTRUE) if (icmd->call() != mTRUE)
{
META_CONS("[metamod: command '%s' unavailable; plugin unloaded]", cmd); META_CONS("[metamod: command '%s' unavailable; plugin unloaded]", cmd);
}
} }
@ -118,18 +75,19 @@ void meta_command_handler(void)
// engine a command string and function pointer allocated locally (in the // engine a command string and function pointer allocated locally (in the
// metamod DLL). // metamod DLL).
// //
// The string handed to the engine is just a _strdup() of the plugin's // The string handed to the engine is just a Q_strdup() of the plugin's
// string. The function pointer handed to the engine is actually a pointer // string. The function pointer handed to the engine is actually a pointer
// to a generic command-handler function (see above). // to a generic command-handler function (see above).
void meta_AddServerCommand(char* cmd_name, void (*function)(void)) void meta_AddServerCommand(char *cmd_name, void (*function)())
{ {
MPlugin* iplug = NULL; MPlugin *iplug = NULL;
MRegCmd* icmd = NULL; MRegCmd *icmd = NULL;
META_DEBUG(4, ("called: meta_AddServerCommand; cmd_name=%s, function=%d", cmd_name, function)); META_DEBUG(4, ("called: meta_AddServerCommand; cmd_name=%s, function=%d", cmd_name, function));
// try to find which plugin is registering this command // try to find which plugin is registering this command
if (!(iplug = g_plugins->find_memloc((void *)function))) { if (!(iplug = g_plugins->find_memloc((void *)function)))
{
// if this isn't supported on this OS, don't log an error // if this isn't supported on this OS, don't log an error
if (meta_errno != ME_OSNOTSUP) if (meta_errno != ME_OSNOTSUP)
META_ERROR("Failed to find memloc for regcmd '%s'", cmd_name); META_ERROR("Failed to find memloc for regcmd '%s'", cmd_name);
@ -137,13 +95,16 @@ void meta_AddServerCommand(char* cmd_name, void (*function)(void))
// See if this command was previously registered, ie a "reloaded" plugin. // See if this command was previously registered, ie a "reloaded" plugin.
icmd = g_regCmds->find(cmd_name); icmd = g_regCmds->find(cmd_name);
if (!icmd) { if (!icmd)
{
// If not found, add. // If not found, add.
icmd = g_regCmds->add(cmd_name); icmd = g_regCmds->add(cmd_name);
if (!icmd) { if (!icmd)
{
// error details logged in add() // error details logged in add()
return; return;
} }
// Only register if not previously registered.. // Only register if not previously registered..
REG_SVR_COMMAND(icmd->name, meta_command_handler); REG_SVR_COMMAND(icmd->name, meta_command_handler);
} }
@ -165,47 +126,51 @@ void meta_AddServerCommand(char* cmd_name, void (*function)(void))
// locally (in the metamod DLL). // locally (in the metamod DLL).
// //
// The cvar handed to the engine is globally allocated in the metamod.dll; // The cvar handed to the engine is globally allocated in the metamod.dll;
// the "name" and "string" fields are _strdup()'s of the plugin's strings. // the "name" and "string" fields are Q_strdup()'s of the plugin's strings.
// Note that, once this is done, the cvar_t allocated in the plugin is no // Note that, once this is done, the cvar_t allocated in the plugin is no
// longer used for _anything_. As long as everything sets/gets the cvar // longer used for _anything_. As long as everything sets/gets the cvar
// values via the engine functions, this will work fine. If the plugin // values via the engine functions, this will work fine. If the plugin
// code tries to _directly_ read/set the fields of its own cvar structures, // code tries to _directly_ read/set the fields of its own cvar structures,
// it will fail to work properly. // it will fail to work properly.
void meta_CVarRegister(cvar_t* pCvar) void meta_CVarRegister(cvar_t *pCvar)
{ {
MPlugin* iplug = NULL; MPlugin *iplug = nullptr;
MRegCvar* icvar = NULL; MRegCvar *icvar = nullptr;
META_DEBUG(4, ("called: meta_CVarRegister; name=%s", pCvar->name)); META_DEBUG(4, ("called: meta_CVarRegister; name=%s", pCvar->name));
// try to find which plugin is registering this cvar // try to find which plugin is registering this cvar
if (!(iplug = g_plugins->find_memloc((void *)pCvar))) { if (!(iplug = g_plugins->find_memloc((void *)pCvar)))
{
// if this isn't supported on this OS, don't log an error // if this isn't supported on this OS, don't log an error
if (meta_errno != ME_OSNOTSUP) if (meta_errno != ME_OSNOTSUP)
// Note: if cvar_t was malloc'd by the plugin, we can't // Note: if cvar_t was malloc'd by the plugin, we can't
// determine the calling plugin. Thus, this becomes a Debug // determine the calling plugin. Thus, this becomes a Debug
// rather than Error message. // rather than Error message.
META_DEBUG(1, ("Failed to find memloc for regcvar '%s'", META_DEBUG(1, ("Failed to find memloc for regcvar '%s'", pCvar->name));
pCvar->name));
} }
// See if this cvar was previously registered, ie a "reloaded" plugin. // See if this cvar was previously registered, ie a "reloaded" plugin.
icvar = g_regCvars->find(pCvar->name); icvar = g_regCvars->find(pCvar->name);
if (!icvar) { if (!icvar)
{
// If not found, add. // If not found, add.
icvar = g_regCvars->add(pCvar->name); icvar = g_regCvars->add(pCvar->name);
if (!icvar) { if (!icvar)
{
// error details logged in add() // error details logged in add()
return; return;
} }
// Reset to given value // Reset to given value
icvar->set(pCvar); icvar->set(pCvar);
CVAR_REGISTER(icvar->data); CVAR_REGISTER(icvar->data);
} }
// Note: if not a new cvar, then we don't set the values, and just keep // Note: if not a new cvar, then we don't set the values, and just keep
// the pre-existing value. // the pre-existing value.
icvar->status = RG_VALID; icvar->status = RG_VALID;
// Store which plugin this is for, if we know. Use '0' for unknown // Store which plugin this is for, if we know. Use '0' for unknown
// plugin, as plugin index starts at 1. // plugin, as plugin index starts at 1.
if (iplug) if (iplug)
@ -214,7 +179,6 @@ void meta_CVarRegister(cvar_t* pCvar)
icvar->plugid = 0; icvar->plugid = 0;
} }
// Replacement for engine routine RegUserMsg; called by plugins. Rather // Replacement for engine routine RegUserMsg; called by plugins. Rather
// than handing the engine the plugin's string (which is allocated in the // than handing the engine the plugin's string (which is allocated in the
// plugin DLL), this hands the engine a string allocated from the stack. // plugin DLL), this hands the engine a string allocated from the stack.
@ -228,20 +192,15 @@ void meta_CVarRegister(cvar_t* pCvar)
// commands and cvars). This merely provides differently located storage // commands and cvars). This merely provides differently located storage
// for the string. // for the string.
int meta_RegUserMsg(const char* pszName, int iSize) int meta_RegUserMsg(const char *pszName, int iSize)
{ {
char* cp; char *cp = Q_strdup(pszName);
return REG_USER_MSG(cp, iSize);
cp = _strdup(pszName);
return (REG_USER_MSG(cp, iSize));
} }
// Intercept and record queries // Intercept and record queries
void meta_QueryClientCvarValue(const edict_t* player, const char* cvarName) void meta_QueryClientCvarValue(const edict_t *player, const char *cvarName)
{ {
g_Players.set_player_cvar_query(player, cvarName); g_Players.set_player_cvar_query(player, cvarName);
(*g_engfuncs.pfnQueryClientCvarValue)(player, cvarName); (*g_engfuncs.pfnQueryClientCvarValue)(player, cvarName);
} }

View File

@ -1,48 +1,7 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// reg_support.h - functions for "registered" cmd/cvar/msg support void meta_command_handler();
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef REG_SUPPORT_H
#define REG_SUPPORT_H
#include "mreg.h" // REG_CMD_FN, etc
void meta_command_handler(void);
void meta_AddServerCommand(char *cmd_name, REG_CMD_FN function); void meta_AddServerCommand(char *cmd_name, REG_CMD_FN function);
void meta_CVarRegister(cvar_t *pCvar); void meta_CVarRegister(cvar_t *pCvar);
int meta_RegUserMsg(const char *pszName, int iSize); int meta_RegUserMsg(const char *pszName, int iSize);
void meta_QueryClientCvarValue(const edict_t *player, const char *cvarName); void meta_QueryClientCvarValue(const edict_t *player, const char *cvarName);
#endif /* REG_SUPPORT_H */

View File

@ -1,61 +1,26 @@
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// sdk_util.cpp - utility routines from HL SDK util.cpp
// Selected portions of dlls/util.cpp from SDK 2.1.
// Functions copied from there as needed...
// And modified to avoid buffer overflows (argh).
// Also modified to remove dependency on CBaseEntity class.
/***
*
* Copyright (c) 1999, 2000 Valve LLC. All rights reserved.
*
* This product contains software technology licensed from Id
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
* All Rights Reserved.
*
* Use, distribution, and modification of this source code and/or resulting
* object code is restricted to non-commercial enhancements to products from
* Valve LLC. All other use, distribution, or modification is prohibited
* without written permission from Valve LLC.
*
****/
/*
===== util.cpp ========================================================
Utility code. Really not optional after all.
*/
#include "precompiled.h" #include "precompiled.h"
char* UTIL_VarArgs(char *format, ...) char *UTIL_VarArgs(char *format, ...)
{ {
va_list argptr; va_list argptr;
static char string[1024]; static char string[1024];
va_start(argptr, format); va_start(argptr, format);
vsnprintf(string, sizeof(string), format, argptr); Q_vsnprintf(string, sizeof(string), format, argptr);
va_end(argptr); va_end(argptr);
return string; return string;
} }
//=========================================================
// UTIL_LogPrintf - Prints a logged message to console. // UTIL_LogPrintf - Prints a logged message to console.
// Preceded by LOG: ( timestamp ) < message > // Preceded by LOG: ( timestamp ) < message >
//=========================================================
void UTIL_LogPrintf(char *fmt, ...) void UTIL_LogPrintf(char *fmt, ...)
{ {
va_list argptr; va_list argptr;
static char string[1024]; static char string[1024];
va_start(argptr, fmt); va_start(argptr, fmt);
vsnprintf(string, sizeof(string), fmt, argptr); Q_vsnprintf(string, sizeof(string), fmt, argptr);
va_end(argptr); va_end(argptr);
// Print to server console // Print to server console

View File

@ -1,59 +1,14 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// sdk_util.h - wrapper & extension of util.h from HL SDK
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
// Wrap util.h from SDK with ifndef/endif, to avoid problems from multiple
// inclusions. Dunno why Valve didn't do that in util.h themselves..
#ifndef SDK_UTIL_H
#define SDK_UTIL_H
// We're not including the DBG_EntOfVars and DBG_AssertFunction routines // We're not including the DBG_EntOfVars and DBG_AssertFunction routines
// mentioned in the SDK util.h, so we're going to unset DEBUG here so that // mentioned in the SDK util.h, so we're going to unset DEBUG here so that
// we don't get "unresolved symbol" errors. // we don't get "unresolved symbol" errors.
#ifdef DEBUG #ifdef DEBUG
#undef DEBUG #undef DEBUG
#endif /* DEBUG */ #endif
// Inlcude local enginecallbacks wrapper *first* so that the g_engfuncs // Inlcude local enginecallbacks wrapper *first* so that the g_engfuncs
// type is correct and the <enginecallback.h> header protection is already // type is correct and the <enginecallback.h> header protection is already
// defined. // defined.
#include "enginecallbacks.h" #include "enginecallbacks.h"
#include <util.h> #include <util.h>
#endif /* SDK_UTIL_H */

View File

@ -1,39 +1,3 @@
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// studio.cpp - player model blending interfaces
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#include "precompiled.h" #include "precompiled.h"
// Another GET-API routine, another interface version. // Another GET-API routine, another interface version.
@ -56,8 +20,8 @@ C_DLLEXPORT int Server_GetBlendingInterface(int version,
float (*rotationmatrix)[3][4], float (*rotationmatrix)[3][4],
float (*bonetransform)[MAXSTUDIOBONES][3][4]) float (*bonetransform)[MAXSTUDIOBONES][3][4])
{ {
static GETBLENDAPI_FN getblend=NULL; static GETBLENDAPI_FN getblend = NULL;
static int missing=0; static int missing = 0;
// Note that we're not checking if // Note that we're not checking if
// (version==SV_BLENDING_INTERFACE_VERSION) because at this point, we // (version==SV_BLENDING_INTERFACE_VERSION) because at this point, we
@ -72,21 +36,24 @@ C_DLLEXPORT int Server_GetBlendingInterface(int version,
// mismatch?", but this will only show in "developer" (-dev) mode. // mismatch?", but this will only show in "developer" (-dev) mode.
META_DEBUG(6, ("called: Server_GetBlendingInterface; version=%d", version)); META_DEBUG(6, ("called: Server_GetBlendingInterface; version=%d", version));
if(missing) { if (missing)
{
META_DEBUG(6, ("Skipping Server_GetBlendingInterface; was previously found missing")); META_DEBUG(6, ("Skipping Server_GetBlendingInterface; was previously found missing"));
return(0); return 0;
} }
if(!getblend) { if (!getblend)
{
META_DEBUG(6, ("Looking up Server_GetBlendingInterface")); META_DEBUG(6, ("Looking up Server_GetBlendingInterface"));
getblend = (GETBLENDAPI_FN) DLSYM(GameDLL.handle, getblend = (GETBLENDAPI_FN) DLSYM(GameDLL.handle,
"Server_GetBlendingInterface"); "Server_GetBlendingInterface");
} }
if(!getblend) { if (!getblend)
{
META_DEBUG(6, ("Couldn't find Server_GetBlendingInterface in game DLL '%s': %s", GameDLL.name, DLERROR())); META_DEBUG(6, ("Couldn't find Server_GetBlendingInterface in game DLL '%s': %s", GameDLL.name, DLERROR()));
missing=1; missing = 1;
return(0); return 0;
} }
META_DEBUG(6, ("Calling Server_GetBlendingInterface")); META_DEBUG(6, ("Calling Server_GetBlendingInterface"));
return((getblend)(version, ppinterface, pstudio, rotationmatrix, return (getblend)(version, ppinterface, pstudio, rotationmatrix, bonetransform);
bonetransform));
} }

View File

@ -1,47 +1,10 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// studio.cpp - player model blending interfaces #include <studio.h>
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef STUDIOAPI_H
#define STUDIOAPI_H
#include <studio.h> // MAXSTUDIOBONES
// Typedef for Server_GetBlendingInterface() from Eric Smith on the hlcoders // Typedef for Server_GetBlendingInterface() from Eric Smith on the hlcoders
// mailing list. // mailing list.
typedef int (*GETBLENDAPI_FN) (int version, typedef int (*GETBLENDAPI_FN)(int version,
struct sv_blending_interface_s **ppinterface, struct sv_blending_interface_s **ppinterface,
struct engine_studio_api_s *pstudio, struct engine_studio_api_s *pstudio,
float (*rotationmatrix)[3][4], float (*rotationmatrix)[3][4],
@ -52,5 +15,3 @@ extern int mm_Server_GetBlendingInterface(int version,
struct engine_studio_api_s *pstudio, struct engine_studio_api_s *pstudio,
float (*rotationmatrix)[3][4], float (*rotationmatrix)[3][4],
float (*bonetransform)[MAXSTUDIOBONES][3][4]); float (*bonetransform)[MAXSTUDIOBONES][3][4]);
#endif /* STUDIOAPI_H */

View File

@ -1,47 +1,12 @@
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// support_meta.cpp - generic support routines
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#include "precompiled.h" #include "precompiled.h"
META_ERRNO meta_errno; META_ERRNO meta_errno;
void do_exit(int exitval) void __declspec(noreturn) do_exit(int exitval)
{ {
sleep(3); //TerminateProcess(GetCurrentProcess(), 1);
exit(exitval); *((int *)NULL) = 0;
while (true);
} }
// Checks for a non-empty file, relative to the gamedir if necessary. // Checks for a non-empty file, relative to the gamedir if necessary.
@ -58,40 +23,44 @@ int valid_gamedir_file(const char* path)
int ret, reg, size; int ret, reg, size;
if (!path) if (!path)
return (FALSE); return FALSE;
if (!strcmp(path, "/dev/null")) if (!Q_strcmp(path, "/dev/null"))
return (TRUE); return TRUE;
if (is_absolute_path(path)) { if (is_absolute_path(path))
strncpy(buf, path, sizeof(buf)); {
Q_strncpy(buf, path, sizeof(buf));
buf[sizeof buf - 1] = '\0'; buf[sizeof buf - 1] = '\0';
} }
else else
snprintf(buf, sizeof(buf), "%s/%s", GameDLL.gamedir, path); snprintf(buf, sizeof(buf), "%s/%s", GameDLL.gamedir, path);
ret = stat(buf, &st); ret = stat(buf, &st);
if (ret != 0) { if (ret != 0)
{
META_DEBUG(5, ("Unable to stat '%s': %s", buf, strerror(errno))); META_DEBUG(5, ("Unable to stat '%s': %s", buf, strerror(errno)));
return (FALSE); return FALSE;
} }
reg = S_ISREG(st.st_mode); reg = S_ISREG(st.st_mode);
if (!reg) { if (!reg)
{
META_DEBUG(5, ("Not a regular file: %s", buf)); META_DEBUG(5, ("Not a regular file: %s", buf));
return (FALSE); return FALSE;
} }
size = st.st_size; size = st.st_size;
if (!size) { if (!size)
{
META_DEBUG(5, ("Empty file: %s", buf)); META_DEBUG(5, ("Empty file: %s", buf));
return (FALSE); return FALSE;
} }
if (ret == 0 && reg && size) if (ret == 0 && reg && size)
return (TRUE); return TRUE;
else else
return (FALSE); return FALSE;
} }
// Turns path into a full path: // Turns path into a full path:
@ -106,19 +75,22 @@ char* full_gamedir_path(const char* path, char* fullpath)
char buf[PATH_MAX ]; char buf[PATH_MAX ];
// Build pathname from filename, plus gamedir if relative path. // Build pathname from filename, plus gamedir if relative path.
if (is_absolute_path(path)) { if (is_absolute_path(path))
strncpy(buf, path, sizeof buf - 1); {
Q_strncpy(buf, path, sizeof buf - 1);
buf[sizeof buf - 1] = '\0'; buf[sizeof buf - 1] = '\0';
} }
else else snprintf(buf, sizeof(buf), "%s/%s", GameDLL.gamedir, path);
snprintf(buf, sizeof(buf), "%s/%s", GameDLL.gamedir, path);
// Remove relative path components, if possible. // Remove relative path components, if possible.
if (!realpath(buf, fullpath)) { if (!realpath(buf, fullpath))
{
META_DEBUG(4, ("Unable to get realpath for '%s': %s", buf, str_os_error())); META_DEBUG(4, ("Unable to get realpath for '%s': %s", buf, str_os_error()));
strncpy(fullpath, path, PATH_MAX - 1); Q_strncpy(fullpath, path, sizeof(fullpath) - 1);
fullpath[PATH_MAX - 1] = '\0'; fullpath[sizeof(fullpath) - 1] = '\0';
} }
// Replace backslashes, etc. // Replace backslashes, etc.
normalize_pathname(fullpath); normalize_pathname(fullpath);
return (fullpath); return fullpath;
} }

View File

@ -1,120 +1,12 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// support_meta.h - generic support macros #include <sys/types.h> // stat
#include <sys/stat.h> // stat
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef SUPPORT_META_H
#define SUPPORT_META_H
#include <string.h> // strcpy(), strncat()
#include <sys/types.h> // stat
#include <sys/stat.h> // stat
#include "osdep.h" // _stricmp, S_ISREG, #include "osdep.h" // _stricmp, S_ISREG,
void do_exit(int exitval) ATTRIBUTE(__noreturn__); void __declspec(noreturn) do_exit(int exitval);
// Unlike snprintf(), strncpy() doesn't necessarily null-terminate the
// target. It appears the former function reasonably considers the given
// size to be "max size of target string" (including the null-terminator),
// whereas strncpy() strangely considers the given size to be "total number
// of bytes to copy". Note strncpy() _always_ writes n bytes, whereas
// snprintf() writes a _max_ of n bytes (incl the NULL). If strncpy()
// needs to write extra bytes to reach n, it uses NULLs, so the target
// _can_ be null-terminated, but only if the source string would have fit
// anyway - in which case why not just use strcpy() instead?
//
// Thus, it appears strncpy() is not only unsafe, it's also inefficient,
// and seemingly no better than plain strcpy() anyway.
//
// With this logic, strncpy() doesn't appear to be much of a "str" function
// at all, IMHO.
//
// Strncat works better, although it considers the given size to be "number
// of bytes to append", and doesn't include the null-terminator in that
// count. Thus, we can use it for what we want to do, by setting the
// target to zero-length (NULL in first byte), and copying n-1 bytes
// (leaving room for the null-termiator).
//
// Why does it have to be soo haaard...
// Also note, some kind of wrapper is necessary to group the two
// statements into one, for use in situations like non-braced else
// statements.
// Technique 1: use "do..while":
#if 0
#define STRNCPY(dst, src, size) \
do { strcpy(dst, "\0"); strncat(dst, src, size-1); } while(0)
#endif
// Technique 2: use parens and commas:
#if 0
#define STRNCPY(dst, src, size) \
(strcpy(dst, "\0"), strncat(dst, src, size-1))
#endif
inline int strnmatch(const char *s1, const char *s2, size_t n) {
if(!s1 || !s2)
return(0);
else
return(!strncmp(s1, s2, n));
}
inline int strcasematch(const char *s1, const char *s2) {
if(!s1 || !s2)
return(0);
else
return(!_stricmp(s1, s2));
}
inline int strncasematch(const char *s1, const char *s2, size_t n) {
if(!s1 || !s2)
return(0);
else
return(!_strnicmp(s1, s2, n));
}
inline int old_valid_file(char *path) {
char *cp;
int len, ret;
cp = (char *) LOAD_FILE_FOR_ME(path, &len);
if(cp && len)
ret=1;
else
ret=0;
FREE_FILE(cp);
return(ret);
}
int valid_gamedir_file(const char *path); int valid_gamedir_file(const char *path);
char *full_gamedir_path(const char *path, char *fullpath); char *full_gamedir_path(const char *path, char *fullpath);
@ -124,12 +16,8 @@ char *full_gamedir_path(const char *path, char *fullpath);
// specify strings used for all the debugging/log messages. // specify strings used for all the debugging/log messages.
#define STRINGIZE(name, len) #name+len #define STRINGIZE(name, len) #name+len
// Max description length for plugins.ini and other places. // Max description length for plugins.ini and other places.
#define MAX_DESC_LEN 256 #define MAX_DESC_LEN 256
// For various character string buffers. // For various character string buffers.
#define MAX_STRBUF_LEN 1024 #define MAX_STRBUF_LEN 1024
#endif /* SUPPORT_META_H */

View File

@ -1,82 +1,42 @@
// vi: set ts=4 sw=4 : #pragma once
// vim: set tw=75 :
// types_meta.h - common internal type, etc definitions
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef TYPES_META_H
#define TYPES_META_H
// Our own boolean type, for stricter type matching. // Our own boolean type, for stricter type matching.
typedef enum mBOOL { enum mBOOL { mFALSE = 0, mTRUE, };
mFALSE = 0,
mTRUE,
} mBOOL;
// Like C's errno, for our various functions; describes causes of failure // Like C's errno, for our various functions; describes causes of failure
// or mFALSE returns. // or mFALSE returns.
typedef enum { enum META_ERRNO
{
ME_NOERROR = 0, ME_NOERROR = 0,
ME_FORMAT, // invalid format ME_FORMAT, // invalid format
ME_COMMENT, // ignored comment ME_COMMENT, // ignored comment
ME_BLANK, // ignored blank (empty) line ME_BLANK, // ignored blank (empty) line
ME_ALREADY, // request had already been done ME_ALREADY, // request had already been done
ME_DELAYED, // request is delayed ME_DELAYED, // request is delayed
ME_NOTALLOWED, // request not allowed ME_NOTALLOWED, // request not allowed
ME_SKIPPED, // request is being skipped for whatever reason ME_SKIPPED, // request is being skipped for whatever reason
ME_BADREQ, // invalid request for this <whatever> ME_BADREQ, // invalid request for this <whatever>
ME_ARGUMENT, // invalid arguments ME_ARGUMENT, // invalid arguments
ME_NULLRESULT, // resulting data was empty or null ME_NULLRESULT, // resulting data was empty or null
ME_MAXREACHED, // reached max/limit ME_MAXREACHED, // reached max/limit
ME_NOTUNIQ, // not unique (ambigious match) ME_NOTUNIQ, // not unique (ambigious match)
ME_NOTFOUND, // in find operation, match not found ME_NOTFOUND, // in find operation, match not found
ME_NOFILE, // file empty or missing ME_NOFILE, // file empty or missing
ME_NOMEM, // malloc failed ME_NOMEM, // malloc failed
ME_BADMEMPTR, // invalid memory address ME_BADMEMPTR, // invalid memory address
ME_OSNOTSUP, // OS doesn't support this operation ME_OSNOTSUP, // OS doesn't support this operation
ME_DLOPEN, // failed to open shared lib/dll ME_DLOPEN, // failed to open shared lib/dll
ME_DLMISSING, // symbol missing in lib/dll ME_DLMISSING, // symbol missing in lib/dll
ME_DLERROR, // some other error encountered calling functions from dll ME_DLERROR, // some other error encountered calling functions from dll
ME_IFVERSION, // incompatible interface version ME_IFVERSION, // incompatible interface version
ME_UNLOAD_UNLOADER, // tried to unload unloader ME_UNLOAD_UNLOADER, // tried to unload unloader
ME_UNLOAD_SELF, // tried to unload self ME_UNLOAD_SELF, // tried to unload self
} META_ERRNO; };
extern META_ERRNO meta_errno; extern META_ERRNO meta_errno;
#define RETURN_ERRNO(retval, errval) \ #define RETURN_ERRNO(retval, errval) \
do { meta_errno=errval; return(retval); } while(0) do { meta_errno = errval; return retval; } while (0)
#define RETURN_LOGERR_ERRNO(errargs, retval, errval) \ #define RETURN_LOGERR_ERRNO(errargs, retval, errval) \
do { META_ERROR errargs ; meta_errno=errval; return(retval); } while(0) do { META_ERROR errargs; meta_errno = errval; return retval; } while (0)
#endif /* TYPES_META_H */

View File

@ -2,20 +2,20 @@
bool is_yes(const char* str) bool is_yes(const char* str)
{ {
return !strcmp(str, "true") || !strcmp(str, "yes") || !strcmp(str, "1"); return !Q_strcmp(str, "true") || !Q_strcmp(str, "yes") || !Q_strcmp(str, "1");
} }
bool is_no(const char* str) bool is_no(const char* str)
{ {
return !strcmp(str, "false") || !strcmp(str, "no") || !strcmp(str, "0"); return !Q_strcmp(str, "false") || !Q_strcmp(str, "no") || !Q_strcmp(str, "0");
} }
char* ENTITY_KEYVALUE(edict_t* entity, char* key) char* ENTITY_KEYVALUE(edict_t* entity, char* key)
{ {
return (INFOKEY_VALUE(GET_INFOKEYBUFFER(entity), key)); return INFOKEY_VALUE(GET_INFOKEYBUFFER(entity), key);
} }
const char* LOCALINFO(char* key) const char* LOCALINFO(char* key)
{ {
return (ENTITY_KEYVALUE(NULL, key)); return ENTITY_KEYVALUE(NULL, key);
} }

View File

@ -1,56 +0,0 @@
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// vdate.cpp - compile-time version date
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#include "precompiled.h"
// Grab date/time of compile. The Makefile is set up to recompile this
// module before each link, so that this will always indicate the time the
// library was compiled and linked.
// This is in a separate file from vers_*, so it can be generically used by
// multiple projects.
char const *COMPILE_TIME=__DATE__ ", " __TIME__;
#ifndef COMPILE_TZ
# define COMPILE_TZ ""
#endif
char const *COMPILE_TZONE = COMPILE_TZ;
// Include a string for /usr/bin/ident.
char const *vstring="\n$Pg: " VNAME " -- " VVERSION " | " __DATE__ " - " __TIME__ " $\n";

View File

@ -1,44 +0,0 @@
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// vdate.h - compile-time version date
/*
* Copyright (c) 2001-2003 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef VDATE_H
#define VDATE_H
extern char const *COMPILE_TIME;
extern char const *COMPILE_TZONE;
#endif /* VDATE_H */

View File

@ -1,55 +0,0 @@
// vi: set ts=4 sw=4 :
// vim: set tw=75 :
// vers_meta.h - version info, intended to be common among DLLs distributed
// with metamod.
/*
* Copyright (c) 2001-2013 Will Day <willday@hpgx.net>
*
* This file is part of Metamod.
*
* Metamod is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* Metamod 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 Metamod; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* In addition, as a special exception, the author gives permission to
* link the code of this program with the Half-Life Game g_engine ("HL
* g_engine") and Modified Game Libraries ("MODs") developed by Valve,
* L.L.C ("Valve"). You must obey the GNU General Public License in all
* respects for all of the code used other than the HL g_engine and MODs
* from Valve. If you modify this file, you may extend this exception
* to your version of the file, but you are not obligated to do so. If
* you do not wish to do so, delete this exception statement from your
* version.
*
*/
#ifndef VERS_META_H
#define VERS_META_H
#ifndef OPT_TYPE
# if defined(_MSC_VER) && defined(_DEBUG)
# define OPT_TYPE "msc debugging"
# elif defined(_MSC_VER) && defined(NDEBUG)
# define OPT_TYPE "msc optimized"
# else
# define OPT_TYPE "default"
# endif /* _MSC_VER */
#endif /* not OPT_TYPE */
#define VDATE "2013-09-26"
#define VVERSION "1.21.1-am"
#define RC_VERS_DWORD 1,21,1,0 // Version Windows DLL Resources in res_meta.rc
#endif /* VERS_META_H */